summaryrefslogtreecommitdiffstats
path: root/Python/fmod.c
diff options
context:
space:
mode:
authorTim Peters <tim.peters@gmail.com>2002-02-17 03:58:51 (GMT)
committerTim Peters <tim.peters@gmail.com>2002-02-17 03:58:51 (GMT)
commit6f5505aaf9451685336acaba2abff319252f210e (patch)
tree309f18bd49cd017d00536d0669ba10a71eec9883 /Python/fmod.c
parenta5854c24a2319a599e57e40cd759b421f781fccd (diff)
downloadcpython-6f5505aaf9451685336acaba2abff319252f210e.zip
cpython-6f5505aaf9451685336acaba2abff319252f210e.tar.gz
cpython-6f5505aaf9451685336acaba2abff319252f210e.tar.bz2
For readability, switch to tab indents; was using a mix of tab indents,
4-space indents, and ambiguous space+tab indents. Added an XXX comment about a confusing part. Still doesn't build on Windows.
Diffstat (limited to 'Python/fmod.c')
0 files changed, 0 insertions, 0 deletions
'add'>.gitlab/ci/configure_fedora31_sphinx.cmake8
-rw-r--r--.gitlab/ci/configure_fedora31_tidy.cmake3
-rw-r--r--.gitlab/ci/configure_sccache.cmake2
-rw-r--r--.gitlab/ci/ctest_build.cmake30
-rw-r--r--.gitlab/ci/ctest_configure.cmake32
-rw-r--r--.gitlab/ci/ctest_exclusions.cmake6
-rw-r--r--.gitlab/ci/ctest_test.cmake24
-rw-r--r--.gitlab/ci/docker/debian10/Dockerfile15
-rwxr-xr-x.gitlab/ci/docker/debian10/install_deps.sh22
-rwxr-xr-x.gitlab/ci/docker/debian10/install_iwyu.sh32
-rw-r--r--.gitlab/ci/docker/fedora31/Dockerfile5
-rwxr-xr-x.gitlab/ci/docker/fedora31/install_deps.sh19
-rw-r--r--.gitlab/ci/gitlab_ci.cmake49
-rwxr-xr-x.gitlab/ci/ninja.sh15
-rwxr-xr-x.gitlab/ci/sccache.sh16
-rw-r--r--Auxiliary/CMakeLists.txt4
-rw-r--r--Auxiliary/bash-completion/CMakeLists.txt24
-rw-r--r--CMakeLists.txt31
-rw-r--r--CTestConfig.cmake2
-rw-r--r--CTestCustom.cmake.in6
-rw-r--r--Help/command/DEVICE_LINK_OPTIONS.txt10
-rw-r--r--Help/command/FIND_XXX.txt13
-rw-r--r--Help/command/add_compile_options.rst3
-rw-r--r--Help/command/add_link_options.rst2
-rw-r--r--Help/command/add_test.rst5
-rw-r--r--Help/command/cmake_command.rst90
-rw-r--r--Help/command/ctest_test.rst4
-rw-r--r--Help/command/execute_process.rst13
-rw-r--r--Help/command/file.rst136
-rw-r--r--Help/command/find_package.rst34
-rw-r--r--Help/command/function.rst4
-rw-r--r--Help/command/get_property.rst10
-rw-r--r--Help/command/get_source_file_property.rst11
-rw-r--r--Help/command/install.rst76
-rw-r--r--Help/command/list.rst7
-rw-r--r--Help/command/macro.rst4
-rw-r--r--Help/command/option.rst2
-rw-r--r--Help/command/separate_arguments.rst2
-rw-r--r--Help/command/set_property.rst16
-rw-r--r--Help/command/set_source_files_properties.rst13
-rw-r--r--Help/command/source_group.rst6
-rw-r--r--Help/command/string.rst21
-rw-r--r--Help/command/target_compile_options.rst2
-rw-r--r--Help/command/target_link_options.rst2
-rw-r--r--Help/cpack_gen/archive.rst65
-rw-r--r--Help/cpack_gen/cygwin.rst5
-rw-r--r--Help/cpack_gen/freebsd.rst5
-rw-r--r--Help/cpack_gen/ifw.rst177
-rw-r--r--Help/cpack_gen/nsis.rst4
-rw-r--r--Help/cpack_gen/rpm.rst24
-rw-r--r--Help/dev/source.rst162
-rw-r--r--Help/envvar/CCMAKE_COLORS.rst34
-rw-r--r--Help/envvar/CMAKE_PREFIX_PATH.rst17
-rw-r--r--Help/guide/tutorial/Step5/MathFunctions/MakeTable.cxx25
-rw-r--r--Help/guide/tutorial/Step6/MathFunctions/CMakeLists.txt12
-rw-r--r--Help/guide/tutorial/index.rst10
-rw-r--r--Help/guide/user-interaction/index.rst5
-rw-r--r--Help/manual/cmake-commands.7.rst1
-rw-r--r--Help/manual/cmake-env-variables.7.rst15
-rw-r--r--Help/manual/cmake-generator-expressions.7.rst194
-rw-r--r--Help/manual/cmake-policies.7.rst11
-rw-r--r--Help/manual/cmake-properties.7.rst9
-rw-r--r--Help/manual/cmake-variables.7.rst4
-rw-r--r--Help/manual/cmake.1.rst23
-rw-r--r--Help/manual/ctest.1.rst11
-rw-r--r--Help/policy/CMP0103.rst22
-rw-r--r--Help/policy/CMP0104.rst31
-rw-r--r--Help/policy/CMP0105.rst19
-rw-r--r--Help/policy/CMP0106.rst19
-rw-r--r--Help/prop_dir/LINK_OPTIONS.rst2
-rw-r--r--Help/prop_sf/COMPILE_OPTIONS.rst21
-rw-r--r--Help/prop_sf/OBJECT_OUTPUTS.rst3
-rw-r--r--Help/prop_sf/UNITY_GROUP.rst5
-rw-r--r--Help/prop_sf/VS_SETTINGS.rst18
-rw-r--r--Help/prop_tgt/CONFIG_POSTFIX.rst3
-rw-r--r--Help/prop_tgt/CUDA_ARCHITECTURES.rst30
-rw-r--r--Help/prop_tgt/CUDA_STANDARD.rst2
-rw-r--r--Help/prop_tgt/FRAMEWORK_MULTI_CONFIG_POSTFIX_CONFIG.rst25
-rw-r--r--Help/prop_tgt/INSTALL_RPATH.rst4
-rw-r--r--Help/prop_tgt/LINK_OPTIONS.rst12
-rw-r--r--Help/prop_tgt/PCH_WARN_INVALID.rst8
-rw-r--r--Help/prop_tgt/UNITY_BUILD.rst24
-rw-r--r--Help/prop_tgt/UNITY_BUILD_MODE.rst58
-rw-r--r--Help/prop_tgt/VS_PLATFORM_TOOLSET.rst10
-rw-r--r--Help/prop_tgt/VS_SOLUTION_DEPLOY.rst29
-rw-r--r--Help/prop_tgt/VS_SOURCE_SETTINGS_tool.rst19
-rw-r--r--Help/release/dev/0-sample-topic.rst7
-rw-r--r--Help/release/dev/CPackRPM-trans-scripts.rst7
-rw-r--r--Help/release/dev/CTestCoverageCollectGCOV-compress-opts.rst7
-rw-r--r--Help/release/dev/FPHSA-handle_components.rst5
-rw-r--r--Help/release/dev/FindBLAS-import-target.rst4
-rw-r--r--Help/release/dev/FindLAPACK-import-target.rst4
-rw-r--r--Help/release/dev/FindPython-IronPython-support.rst5
-rw-r--r--Help/release/dev/FindPython-artifacts-interactive.rst6
-rw-r--r--Help/release/dev/FindPython-dev-subcomponents.rst6
-rw-r--r--Help/release/dev/FindPython-find-implementations.rst5
-rw-r--r--Help/release/dev/FindPython-pypy.rst5
-rw-r--r--Help/release/dev/FindRuby-variable-case.rst7
-rw-r--r--Help/release/dev/GoogleTest-DISCOVERY_MODE.rst7
-rw-r--r--Help/release/dev/GoogleTest-XML_OUTPUT_DIR.rst6
-rw-r--r--Help/release/dev/ccmake-custom-colors.rst5
-rw-r--r--Help/release/dev/cmake-gui-env-platform-defaults.rst8
-rw-r--r--Help/release/dev/cmake_command-command.rst6
-rw-r--r--Help/release/dev/command-line-cat.rst5
-rw-r--r--Help/release/dev/ctest-log-environment.rst8
-rw-r--r--Help/release/dev/ctest_resource_spec_file-variable.rst6
-rw-r--r--Help/release/dev/ctest_stop_on_failure.rst8
-rw-r--r--Help/release/dev/cuda-architectures-empty.rst7
-rw-r--r--Help/release/dev/cuda-architectures.rst6
-rw-r--r--Help/release/dev/cuda-clang.rst4
-rw-r--r--Help/release/dev/curl-http2.rst8
-rw-r--r--Help/release/dev/deprecate-documentation-module.rst6
-rw-r--r--Help/release/dev/deprecate-policy-old.rst8
-rw-r--r--Help/release/dev/device-link-options.rst5
-rw-r--r--Help/release/dev/execute_process.rst5
-rw-r--r--Help/release/dev/export-multiple-calls.rst5
-rw-r--r--Help/release/dev/fetchcontent-SOURCE_SUBDIR.rst6
-rw-r--r--Help/release/dev/file-upload-tls.rst5
-rw-r--r--Help/release/dev/file_archive.rst7
-rw-r--r--Help/release/dev/file_configure.rst6
-rw-r--r--Help/release/dev/findswig-components.rst5
-rw-r--r--Help/release/dev/framework-multi-config-postfix.rst7
-rw-r--r--Help/release/dev/genex-DEVICE_LINK-HOST_LINK.rst6
-rw-r--r--Help/release/dev/genex-LINK_LANGUAGE.rst5
-rw-r--r--Help/release/dev/genex-OBJECT_OUTPUTS.rst4
-rw-r--r--Help/release/dev/grouped-unity-build-mode.rst6
-rw-r--r--Help/release/dev/libxslt.rst4
-rw-r--r--Help/release/dev/list_natural_sort.rst5
-rw-r--r--Help/release/dev/ninja-compiler-PATH-windows.rst7
-rw-r--r--Help/release/dev/nsis-dpi-aware.rst6
-rw-r--r--Help/release/dev/parallel-lzma-compression.rst6
-rw-r--r--Help/release/dev/pch-warn-invalid.rst6
-rw-r--r--Help/release/dev/profiling.rst9
-rw-r--r--Help/release/dev/required_find_commands.rst6
-rw-r--r--Help/release/dev/sf-property-scopes.rst15
-rw-r--r--Help/release/dev/source_group_forward_slashes.rst5
-rw-r--r--Help/release/dev/string-hex.rst5
-rw-r--r--Help/release/dev/useswig-fortran.rst7
-rw-r--r--Help/release/dev/vs-non-built-file-item-metadata.rst10
-rw-r--r--Help/release/dev/vs-platform-toolset.rst6
-rw-r--r--Help/release/dev/vs-sln-deploy.rst6
-rw-r--r--Help/release/index.rst2
-rw-r--r--Help/variable/CMAKE_CUDA_ARCHITECTURES.rst17
-rw-r--r--Help/variable/CMAKE_FRAMEWORK_MULTI_CONFIG_POSTFIX_CONFIG.rst8
-rw-r--r--Help/variable/CMAKE_PCH_WARN_INVALID.rst5
-rw-r--r--Help/variable/CMAKE_SYSTEM_PREFIX_PATH.rst31
-rw-r--r--Help/variable/CTEST_NIGHTLY_START_TIME.rst8
-rw-r--r--Help/variable/CTEST_RESOURCE_SPEC_FILE.rst5
-rw-r--r--Help/variable/PROJECT_SOURCE_DIR.rst8
-rw-r--r--Modules/CMakeASMCompiler.cmake.in2
-rw-r--r--Modules/CMakeASMInformation.cmake4
-rw-r--r--Modules/CMakeASM_MASMInformation.cmake2
-rw-r--r--Modules/CMakeASM_NASMInformation.cmake12
-rw-r--r--Modules/CMakeCCompiler.cmake.in1
-rw-r--r--Modules/CMakeCInformation.cmake6
-rw-r--r--Modules/CMakeCUDACompiler.cmake.in2
-rw-r--r--Modules/CMakeCUDAInformation.cmake44
-rw-r--r--Modules/CMakeCXXCompiler.cmake.in1
-rw-r--r--Modules/CMakeCXXInformation.cmake6
-rw-r--r--Modules/CMakeCompilerIdDetection.cmake3
-rw-r--r--Modules/CMakeDetermineASMCompiler.cmake18
-rw-r--r--Modules/CMakeDetermineCCompiler.cmake12
-rw-r--r--Modules/CMakeDetermineCUDACompiler.cmake129
-rw-r--r--Modules/CMakeDetermineCXXCompiler.cmake12
-rw-r--r--Modules/CMakeDetermineCompiler.cmake30
-rw-r--r--Modules/CMakeDetermineCompilerId.cmake14
-rw-r--r--Modules/CMakeDetermineFortranCompiler.cmake12
-rw-r--r--Modules/CMakeDetermineOBJCXXCompiler.cmake2
-rw-r--r--Modules/CMakeFindBinUtils.cmake1
-rw-r--r--Modules/CMakeFindFrameworks.cmake26
-rw-r--r--Modules/CMakeFortranCompiler.cmake.in1
-rw-r--r--Modules/CMakeFortranInformation.cmake4
-rw-r--r--Modules/CMakeGenericSystem.cmake8
-rw-r--r--Modules/CMakeOBJCInformation.cmake6
-rw-r--r--Modules/CMakeOBJCXXInformation.cmake6
-rw-r--r--Modules/CMakePrintSystemInformation.cmake2
-rw-r--r--Modules/CMakeTestCUDACompiler.cmake31
-rw-r--r--Modules/CPack.cmake24
-rw-r--r--Modules/CPackComponent.cmake87
-rw-r--r--Modules/CTestCoverageCollectGCOV.cmake72
-rw-r--r--Modules/CheckFortranSourceCompiles.cmake6
-rw-r--r--Modules/CheckFortranSourceRuns.cmake6
-rw-r--r--Modules/CheckLanguage.cmake16
-rw-r--r--Modules/CheckTypeSize.c.in8
-rw-r--r--Modules/Compiler/Clang-CUDA.cmake25
-rw-r--r--Modules/Compiler/Clang-CXX.cmake119
-rw-r--r--Modules/Compiler/Clang-OBJCXX.cmake69
-rw-r--r--Modules/Compiler/Clang.cmake120
-rw-r--r--Modules/Compiler/GNU-ASM.cmake6
-rw-r--r--Modules/Compiler/GNU.cmake8
-rw-r--r--Modules/Compiler/Intel.cmake5
-rw-r--r--Modules/Compiler/NVIDIA-CUDA.cmake20
-rw-r--r--Modules/Compiler/NVIDIA-DetermineCompiler.cmake10
-rw-r--r--Modules/Compiler/OpenWatcom-C.cmake1
-rw-r--r--Modules/Compiler/OpenWatcom-CXX.cmake1
-rw-r--r--Modules/Compiler/OpenWatcom.cmake118
-rw-r--r--Modules/Compiler/QCC-CXX.cmake2
-rw-r--r--Modules/Compiler/TI-C.cmake8
-rw-r--r--Modules/Compiler/TI-CXX.cmake7
-rw-r--r--Modules/Compiler/XL-Fortran.cmake1
-rw-r--r--Modules/Documentation.cmake28
-rw-r--r--Modules/ExternalProject.cmake44
-rw-r--r--Modules/FetchContent.cmake99
-rw-r--r--Modules/FetchContent/CMakeLists.cmake.in2
-rw-r--r--Modules/FindArmadillo.cmake83
-rw-r--r--Modules/FindBLAS.cmake57
-rw-r--r--Modules/FindBoost.cmake19
-rw-r--r--Modules/FindCUDAToolkit.cmake226
-rw-r--r--Modules/FindDoxygen.cmake8
-rw-r--r--Modules/FindHDF5.cmake494
-rw-r--r--Modules/FindLAPACK.cmake59
-rw-r--r--Modules/FindLibXslt.cmake60
-rw-r--r--Modules/FindMPI.cmake8
-rw-r--r--Modules/FindOpenAL.cmake99
-rw-r--r--Modules/FindOpenCL.cmake6
-rw-r--r--Modules/FindOpenSSL.cmake47
-rw-r--r--Modules/FindPackageHandleStandardArgs.cmake21
-rw-r--r--Modules/FindPkgConfig.cmake58
-rw-r--r--Modules/FindPython.cmake118
-rw-r--r--Modules/FindPython/Support.cmake1823
-rw-r--r--Modules/FindPython2.cmake110
-rw-r--r--Modules/FindPython3.cmake118
-rw-r--r--Modules/FindRuby.cmake585
-rw-r--r--Modules/FindSWIG.cmake71
-rw-r--r--Modules/FindSquish.cmake68
-rw-r--r--Modules/FindVulkan.cmake34
-rw-r--r--Modules/FindX11.cmake94
-rw-r--r--Modules/FortranCInterface/CMakeLists.txt4
-rw-r--r--Modules/FortranCInterface/Detect.cmake10
-rw-r--r--Modules/GoogleTest.cmake140
-rw-r--r--Modules/GoogleTestAddTests.cmake254
-rw-r--r--Modules/Internal/CPack/CPackNuGet.cmake16
-rw-r--r--Modules/Internal/CPack/CPackRPM.cmake18
-rw-r--r--Modules/Internal/CPack/NSIS.template.in1
-rw-r--r--Modules/Internal/CUDAToolkit.cmake225
-rw-r--r--Modules/Platform/Android-Common.cmake2
-rw-r--r--Modules/Platform/BlueGeneL.cmake8
-rw-r--r--Modules/Platform/BlueGeneP-base.cmake4
-rw-r--r--Modules/Platform/BlueGeneQ-base.cmake6
-rw-r--r--Modules/Platform/CYGWIN-GNU.cmake2
-rw-r--r--Modules/Platform/DOS-OpenWatcom-C.cmake1
-rw-r--r--Modules/Platform/DOS-OpenWatcom-CXX.cmake1
-rw-r--r--Modules/Platform/DOS-OpenWatcom.cmake28
-rw-r--r--Modules/Platform/DOS.cmake14
-rw-r--r--Modules/Platform/HP-UX-HP-C.cmake2
-rw-r--r--Modules/Platform/Linux-OpenWatcom-C.cmake1
-rw-r--r--Modules/Platform/Linux-OpenWatcom-CXX.cmake1
-rw-r--r--Modules/Platform/Linux-OpenWatcom.cmake25
-rw-r--r--Modules/Platform/Linux-como.cmake2
-rw-r--r--Modules/Platform/OS2-OpenWatcom-C.cmake1
-rw-r--r--Modules/Platform/OS2-OpenWatcom-CXX.cmake1
-rw-r--r--Modules/Platform/OS2-OpenWatcom.cmake35
-rw-r--r--Modules/Platform/OS2.cmake14
-rw-r--r--Modules/Platform/UnixPaths.cmake11
-rw-r--r--Modules/Platform/Windows-Clang.cmake4
-rw-r--r--Modules/Platform/Windows-GNU.cmake10
-rw-r--r--Modules/Platform/Windows-Intel.cmake2
-rw-r--r--Modules/Platform/Windows-MSVC.cmake2
-rw-r--r--Modules/Platform/Windows-NVIDIA-CUDA.cmake16
-rw-r--r--Modules/Platform/Windows-OpenWatcom.cmake115
-rw-r--r--Modules/Platform/Windows-df.cmake4
-rw-r--r--Modules/Platform/WindowsPaths.cmake4
-rw-r--r--Modules/Platform/eCos.cmake4
-rw-r--r--Modules/Platform/gas.cmake2
-rwxr-xr-xModules/Squish4RunTestCase.bat2
-rw-r--r--Modules/UseEcos.cmake6
-rw-r--r--Modules/UseJava.cmake21
-rw-r--r--Modules/UseJava/ClearClassFiles.cmake17
-rw-r--r--Modules/UseSWIG.cmake20
-rw-r--r--Source/CMakeLists.txt11
-rw-r--r--Source/CMakeVersion.cmake2
-rw-r--r--Source/CPack/IFW/cmCPackIFWCommon.cxx2
-rw-r--r--Source/CPack/IFW/cmCPackIFWGenerator.cxx10
-rw-r--r--Source/CPack/IFW/cmCPackIFWPackage.cxx3
-rw-r--r--Source/CPack/IFW/cmCPackIFWRepository.cxx4
-rw-r--r--Source/CPack/OSXScriptLauncher.cxx16
-rw-r--r--Source/CPack/WiX/cmCPackWIXGenerator.cxx32
-rw-r--r--Source/CPack/WiX/cmCPackWIXGenerator.h5
-rw-r--r--Source/CPack/WiX/cmWIXAccessControlList.cxx15
-rw-r--r--Source/CPack/WiX/cmWIXFilesSourceWriter.cxx5
-rw-r--r--Source/CPack/WiX/cmWIXPatch.cxx2
-rw-r--r--Source/CPack/WiX/cmWIXPatchParser.cxx24
-rw-r--r--Source/CPack/WiX/cmWIXPatchParser.h8
-rw-r--r--Source/CPack/cmCPackArchiveGenerator.cxx36
-rw-r--r--Source/CPack/cmCPackArchiveGenerator.h2
-rw-r--r--Source/CPack/cmCPackDebGenerator.cxx29
-rw-r--r--Source/CPack/cmCPackExternalGenerator.cxx6
-rw-r--r--Source/CPack/cmCPackFreeBSDGenerator.cxx5
-rw-r--r--Source/CPack/cmCPackGenerator.cxx4
-rw-r--r--Source/CPack/cmCPackLog.cxx40
-rw-r--r--Source/CPack/cmCPackLog.h21
-rw-r--r--Source/CPack/cmCPackNSISGenerator.cxx25
-rw-r--r--Source/CPack/cmCPackNSISGenerator.h5
-rw-r--r--Source/CPack/cpack.cxx2
-rw-r--r--Source/CTest/cmCTestBZR.cxx4
-rw-r--r--Source/CTest/cmCTestBuildAndTestHandler.cxx32
-rw-r--r--Source/CTest/cmCTestBuildCommand.cxx2
-rw-r--r--Source/CTest/cmCTestBuildHandler.cxx24
-rw-r--r--Source/CTest/cmCTestCVS.cxx6
-rw-r--r--Source/CTest/cmCTestConfigureCommand.cxx2
-rw-r--r--Source/CTest/cmCTestCoverageCommand.cxx6
-rw-r--r--Source/CTest/cmCTestCoverageHandler.cxx44
-rw-r--r--Source/CTest/cmCTestCurl.h2
-rw-r--r--Source/CTest/cmCTestGIT.cxx4
-rw-r--r--Source/CTest/cmCTestHandlerCommand.cxx2
-rw-r--r--Source/CTest/cmCTestMemCheckCommand.cxx2
-rw-r--r--Source/CTest/cmCTestMemCheckHandler.cxx60
-rw-r--r--Source/CTest/cmCTestMultiProcessHandler.cxx78
-rw-r--r--Source/CTest/cmCTestMultiProcessHandler.h8
-rw-r--r--Source/CTest/cmCTestResourceSpec.cxx6
-rw-r--r--Source/CTest/cmCTestRunTest.cxx97
-rw-r--r--Source/CTest/cmCTestRunTest.h15
-rw-r--r--Source/CTest/cmCTestScriptHandler.cxx53
-rw-r--r--Source/CTest/cmCTestScriptHandler.h26
-rw-r--r--Source/CTest/cmCTestSubmitCommand.cxx11
-rw-r--r--Source/CTest/cmCTestSubmitHandler.cxx28
-rw-r--r--Source/CTest/cmCTestTestCommand.cxx13
-rw-r--r--Source/CTest/cmCTestTestCommand.h1
-rw-r--r--Source/CTest/cmCTestTestHandler.cxx196
-rw-r--r--Source/CTest/cmCTestTestHandler.h5
-rw-r--r--Source/CTest/cmCTestUploadCommand.cxx3
-rw-r--r--Source/CTest/cmCTestVC.cxx2
-rw-r--r--Source/CTest/cmCTestVC.h2
-rw-r--r--Source/CTest/cmParseCacheCoverage.cxx34
-rw-r--r--Source/CTest/cmParseCacheCoverage.h5
-rw-r--r--Source/CTest/cmParseCoberturaCoverage.cxx2
-rw-r--r--Source/CTest/cmParseGTMCoverage.cxx2
-rw-r--r--Source/CTest/cmParseGTMCoverage.h2
-rw-r--r--Source/CTest/cmParseMumpsCoverage.cxx9
-rw-r--r--Source/CTest/cmParseMumpsCoverage.h4
-rw-r--r--Source/CTest/cmParsePHPCoverage.cxx10
-rw-r--r--Source/CTest/cmProcess.cxx26
-rw-r--r--Source/CTest/cmProcess.h14
-rw-r--r--Source/Checks/cm_cxx_features.cmake2
-rw-r--r--Source/CursesDialog/ccmake.cxx5
-rw-r--r--Source/CursesDialog/cmCursesCacheEntryComposite.cxx16
-rw-r--r--Source/CursesDialog/cmCursesColor.cxx59
-rw-r--r--Source/CursesDialog/cmCursesColor.h5
-rw-r--r--Source/CursesDialog/cmCursesLongMessageForm.cxx5
-rw-r--r--Source/CursesDialog/cmCursesMainForm.cxx25
-rw-r--r--Source/CursesDialog/cmCursesOptionsWidget.cxx4
-rw-r--r--Source/LexerParser/cmListFileLexer.c14
-rw-r--r--Source/LexerParser/cmListFileLexer.in.l14
-rw-r--r--Source/QtDialog/CMakeSetup.cxx6
-rw-r--r--Source/QtDialog/CMakeSetupDialog.cxx28
-rw-r--r--Source/QtDialog/CMakeSetupDialog.h4
-rw-r--r--Source/QtDialog/FirstConfigure.cxx49
-rw-r--r--Source/QtDialog/FirstConfigure.h5
-rw-r--r--Source/QtDialog/QCMake.cxx45
-rw-r--r--Source/QtDialog/QCMake.h3
-rw-r--r--Source/bindexplib.cxx20
-rw-r--r--Source/cmAddSubDirectoryCommand.cxx5
-rw-r--r--Source/cmAffinity.cxx2
-rw-r--r--Source/cmAlgorithms.h42
-rw-r--r--Source/cmArchiveWrite.cxx23
-rw-r--r--Source/cmArchiveWrite.h5
-rw-r--r--Source/cmArgumentParser.cxx1
-rw-r--r--Source/cmArgumentParser.h3
-rw-r--r--Source/cmAuxSourceDirectoryCommand.cxx7
-rw-r--r--Source/cmBinUtilsLinuxELFLinker.cxx15
-rw-r--r--Source/cmBuildCommand.cxx2
-rw-r--r--Source/cmBuildNameCommand.cxx4
-rw-r--r--Source/cmCMakeCommand.cxx111
-rw-r--r--Source/cmCMakeCommand.h20
-rw-r--r--Source/cmCPluginAPI.cxx45
-rw-r--r--Source/cmCTest.cxx270
-rw-r--r--Source/cmCTest.h12
-rw-r--r--Source/cmCacheManager.cxx328
-rw-r--r--Source/cmCacheManager.h195
-rw-r--r--Source/cmCallVisualStudioMacro.cxx38
-rw-r--r--Source/cmCommandArgumentParserHelper.cxx39
-rw-r--r--Source/cmCommandArgumentParserHelper.h3
-rw-r--r--Source/cmCommands.cxx2
-rw-r--r--Source/cmCommonTargetGenerator.cxx22
-rw-r--r--Source/cmCommonTargetGenerator.h3
-rw-r--r--Source/cmComputeLinkInformation.cxx62
-rw-r--r--Source/cmComputeTargetDepends.cxx27
-rw-r--r--Source/cmConditionEvaluator.cxx7
-rw-r--r--Source/cmConfigureFileCommand.cxx25
-rw-r--r--Source/cmConnection.cxx11
-rw-r--r--Source/cmConnection.h2
-rw-r--r--Source/cmConvertMSBuildXMLToJSON.py9
-rw-r--r--Source/cmCoreTryCompile.cxx50
-rw-r--r--Source/cmCryptoHash.cxx6
-rw-r--r--Source/cmCurl.h2
-rw-r--r--Source/cmCustomCommand.cxx4
-rw-r--r--Source/cmCustomCommand.h7
-rw-r--r--Source/cmCustomCommandGenerator.cxx4
-rw-r--r--Source/cmDefinePropertyCommand.cxx2
-rw-r--r--Source/cmDepends.cxx35
-rw-r--r--Source/cmDepends.h12
-rw-r--r--Source/cmDependsC.cxx37
-rw-r--r--Source/cmDependsC.h4
-rw-r--r--Source/cmDependsFortran.cxx50
-rw-r--r--Source/cmDependsFortran.h7
-rw-r--r--Source/cmDependsJavaParserHelper.cxx11
-rw-r--r--Source/cmDependsJavaParserHelper.h3
-rw-r--r--Source/cmDynamicLoader.cxx22
-rw-r--r--Source/cmELF.cxx6
-rw-r--r--Source/cmExecuteProcessCommand.cxx25
-rw-r--r--Source/cmExportBuildAndroidMKGenerator.cxx13
-rw-r--r--Source/cmExportBuildFileGenerator.cxx5
-rw-r--r--Source/cmExportCommand.cxx30
-rw-r--r--Source/cmExportFileGenerator.cxx84
-rw-r--r--Source/cmExportInstallAndroidMKGenerator.cxx2
-rw-r--r--Source/cmExportLibraryDependenciesCommand.cxx6
-rw-r--r--Source/cmExportTryCompileFileGenerator.cxx14
-rw-r--r--Source/cmExprParserHelper.h2
-rw-r--r--Source/cmExtraCodeBlocksGenerator.cxx8
-rw-r--r--Source/cmExtraCodeLiteGenerator.cxx4
-rw-r--r--Source/cmExtraEclipseCDT4Generator.cxx32
-rw-r--r--Source/cmExtraKateGenerator.cxx13
-rw-r--r--Source/cmExtraSublimeTextGenerator.cxx28
-rw-r--r--Source/cmFileAPI.h6
-rw-r--r--Source/cmFileAPICMakeFiles.cxx2
-rw-r--r--Source/cmFileAPICMakeFiles.h2
-rw-r--r--Source/cmFileAPICache.cxx7
-rw-r--r--Source/cmFileAPICache.h2
-rw-r--r--Source/cmFileAPICodemodel.cxx39
-rw-r--r--Source/cmFileAPICodemodel.h2
-rw-r--r--Source/cmFileCommand.cxx394
-rw-r--r--Source/cmFileMonitor.h2
-rw-r--r--Source/cmFindBase.cxx14
-rw-r--r--Source/cmFindBase.h10
-rw-r--r--Source/cmFindLibraryCommand.cxx12
-rw-r--r--Source/cmFindPackageCommand.cxx26
-rw-r--r--Source/cmFindPackageCommand.h2
-rw-r--r--Source/cmFindPathCommand.cxx12
-rw-r--r--Source/cmFindProgramCommand.cxx14
-rw-r--r--Source/cmForEachCommand.cxx5
-rw-r--r--Source/cmFunctionBlocker.cxx2
-rw-r--r--Source/cmFunctionCommand.cxx3
-rw-r--r--Source/cmGeneratedFileStream.cxx4
-rw-r--r--Source/cmGeneratorExpression.cxx20
-rw-r--r--Source/cmGeneratorExpression.h13
-rw-r--r--Source/cmGeneratorExpressionContext.cxx1
-rw-r--r--Source/cmGeneratorExpressionContext.h1
-rw-r--r--Source/cmGeneratorExpressionDAGChecker.cxx83
-rw-r--r--Source/cmGeneratorExpressionDAGChecker.h12
-rw-r--r--Source/cmGeneratorExpressionNode.cxx262
-rw-r--r--Source/cmGeneratorTarget.cxx1361
-rw-r--r--Source/cmGeneratorTarget.h115
-rw-r--r--Source/cmGetCMakePropertyCommand.cxx12
-rw-r--r--Source/cmGetDirectoryPropertyCommand.cxx15
-rw-r--r--Source/cmGetFilenameComponentCommand.cxx4
-rw-r--r--Source/cmGetPipes.cxx3
-rw-r--r--Source/cmGetPropertyCommand.cxx87
-rw-r--r--Source/cmGetSourceFilePropertyCommand.cxx52
-rw-r--r--Source/cmGetTargetPropertyCommand.cxx4
-rw-r--r--Source/cmGhsMultiTargetGenerator.cxx106
-rw-r--r--Source/cmGlobalBorlandMakefileGenerator.h1
-rw-r--r--Source/cmGlobalCommonGenerator.cxx4
-rw-r--r--Source/cmGlobalGenerator.cxx106
-rw-r--r--Source/cmGlobalGenerator.h7
-rw-r--r--Source/cmGlobalGhsMultiGenerator.cxx114
-rw-r--r--Source/cmGlobalGhsMultiGenerator.h2
-rw-r--r--Source/cmGlobalNinjaGenerator.cxx165
-rw-r--r--Source/cmGlobalUnixMakefileGenerator3.cxx139
-rw-r--r--Source/cmGlobalUnixMakefileGenerator3.h18
-rw-r--r--Source/cmGlobalVisualStudio10Generator.cxx7
-rw-r--r--Source/cmGlobalVisualStudio71Generator.cxx12
-rw-r--r--Source/cmGlobalVisualStudio7Generator.cxx40
-rw-r--r--Source/cmGlobalVisualStudio8Generator.cxx52
-rw-r--r--Source/cmGlobalVisualStudio8Generator.h4
-rw-r--r--Source/cmGlobalVisualStudioGenerator.cxx14
-rw-r--r--Source/cmGlobalWatcomWMakeGenerator.cxx12
-rw-r--r--Source/cmGlobalWatcomWMakeGenerator.h3
-rw-r--r--Source/cmGlobalXCodeGenerator.cxx148
-rw-r--r--Source/cmGlobalXCodeGenerator.h8
-rw-r--r--Source/cmGraphVizWriter.cxx108
-rw-r--r--Source/cmIfCommand.cxx3
-rw-r--r--Source/cmIncludeCommand.cxx35
-rw-r--r--Source/cmInstallCommand.cxx18
-rw-r--r--Source/cmInstallCommandArguments.cxx2
-rw-r--r--Source/cmInstallExportGenerator.cxx11
-rw-r--r--Source/cmInstallExportGenerator.h7
-rw-r--r--Source/cmInstallTargetGenerator.cxx8
-rw-r--r--Source/cmInstalledFile.cxx6
-rw-r--r--Source/cmInstalledFile.h4
-rw-r--r--Source/cmJsonObjects.cxx23
-rw-r--r--Source/cmJsonObjects.h2
-rw-r--r--Source/cmLinkItem.h17
-rw-r--r--Source/cmLinkLineDeviceComputer.cxx13
-rw-r--r--Source/cmListCommand.cxx29
-rw-r--r--Source/cmListFileCache.cxx51
-rw-r--r--Source/cmListFileCache.h3
-rw-r--r--Source/cmLoadCommandCommand.cxx10
-rw-r--r--Source/cmLocalCommonGenerator.cxx9
-rw-r--r--Source/cmLocalGenerator.cxx897
-rw-r--r--Source/cmLocalGenerator.h38
-rw-r--r--Source/cmLocalNinjaGenerator.cxx49
-rw-r--r--Source/cmLocalUnixMakefileGenerator3.cxx143
-rw-r--r--Source/cmLocalUnixMakefileGenerator3.h6
-rw-r--r--Source/cmLocalVisualStudio10Generator.cxx2
-rw-r--r--Source/cmLocalVisualStudio7Generator.cxx131
-rw-r--r--Source/cmLocalVisualStudio7Generator.h7
-rw-r--r--Source/cmLocalVisualStudioGenerator.cxx7
-rw-r--r--Source/cmMachO.cxx31
-rw-r--r--Source/cmMacroCommand.cxx3
-rw-r--r--Source/cmMakefile.cxx330
-rw-r--r--Source/cmMakefile.h30
-rw-r--r--Source/cmMakefileExecutableTargetGenerator.cxx28
-rw-r--r--Source/cmMakefileLibraryTargetGenerator.cxx20
-rw-r--r--Source/cmMakefileProfilingData.cxx114
-rw-r--r--Source/cmMakefileProfilingData.h29
-rw-r--r--Source/cmMakefileTargetGenerator.cxx218
-rw-r--r--Source/cmMakefileTargetGenerator.h2
-rw-r--r--Source/cmMathCommand.cxx2
-rw-r--r--Source/cmMessageCommand.cxx3
-rw-r--r--Source/cmNinjaNormalTargetGenerator.cxx91
-rw-r--r--Source/cmNinjaTargetGenerator.cxx332
-rw-r--r--Source/cmNinjaTargetGenerator.h2
-rw-r--r--Source/cmNinjaUtilityTargetGenerator.cxx4
-rw-r--r--Source/cmOSXBundleGenerator.cxx26
-rw-r--r--Source/cmOSXBundleGenerator.h12
-rw-r--r--Source/cmOptionCommand.cxx4
-rw-r--r--Source/cmOutputConverter.cxx11
-rw-r--r--Source/cmOutputConverter.h1
-rw-r--r--Source/cmOutputRequiredFilesCommand.cxx7
-rw-r--r--Source/cmPipeConnection.h2
-rw-r--r--Source/cmPolicies.cxx2
-rw-r--r--Source/cmPolicies.h17
-rw-r--r--Source/cmProcessOutput.cxx23
-rw-r--r--Source/cmProjectCommand.cxx8
-rw-r--r--Source/cmPropertyDefinition.cxx43
-rw-r--r--Source/cmPropertyDefinition.h41
-rw-r--r--Source/cmPropertyDefinitionMap.cxx35
-rw-r--r--Source/cmPropertyDefinitionMap.h30
-rw-r--r--Source/cmPropertyMap.cxx10
-rw-r--r--Source/cmPropertyMap.h4
-rw-r--r--Source/cmQTWrapCPPCommand.cxx3
-rw-r--r--Source/cmQtAutoGen.cxx3
-rw-r--r--Source/cmQtAutoGenGlobalInitializer.cxx10
-rw-r--r--Source/cmQtAutoGenInitializer.cxx64
-rw-r--r--Source/cmQtAutoGenerator.cxx4
-rw-r--r--Source/cmQtAutoGenerator.h2
-rw-r--r--Source/cmQtAutoMocUic.cxx27
-rw-r--r--Source/cmRST.cxx10
-rw-r--r--Source/cmRulePlaceholderExpander.cxx13
-rw-r--r--Source/cmRuntimeDependencyArchive.cxx5
-rw-r--r--Source/cmSeparateArgumentsCommand.cxx2
-rw-r--r--Source/cmServer.cxx38
-rw-r--r--Source/cmServer.h11
-rw-r--r--Source/cmServerConnection.cxx2
-rw-r--r--Source/cmServerProtocol.cxx20
-rw-r--r--Source/cmServerProtocol.h2
-rw-r--r--Source/cmSetCommand.cxx6
-rw-r--r--Source/cmSetDirectoryPropertiesCommand.cxx40
-rw-r--r--Source/cmSetPropertyCommand.cxx222
-rw-r--r--Source/cmSetPropertyCommand.h29
-rw-r--r--Source/cmSetSourceFilesPropertiesCommand.cxx170
-rw-r--r--Source/cmSetTargetPropertiesCommand.cxx70
-rw-r--r--Source/cmSetTestsPropertiesCommand.cxx75
-rw-r--r--Source/cmSiteNameCommand.cxx3
-rw-r--r--Source/cmSourceFile.cxx31
-rw-r--r--Source/cmSourceFile.h4
-rw-r--r--Source/cmSourceFileLocation.cxx4
-rw-r--r--Source/cmSourceGroup.cxx11
-rw-r--r--Source/cmSourceGroup.h3
-rw-r--r--Source/cmSourceGroupCommand.cxx26
-rw-r--r--Source/cmStandardLexer.h15
-rw-r--r--Source/cmState.cxx172
-rw-r--r--Source/cmState.h27
-rw-r--r--Source/cmStateDirectory.cxx38
-rw-r--r--Source/cmStateDirectory.h6
-rw-r--r--Source/cmStateSnapshot.cxx5
-rw-r--r--Source/cmString.hxx3
-rw-r--r--Source/cmStringAlgorithms.cxx2
-rw-r--r--Source/cmStringAlgorithms.h2
-rw-r--r--Source/cmStringCommand.cxx25
-rw-r--r--Source/cmSubcommandTable.h3
-rw-r--r--Source/cmSystemTools.cxx30
-rw-r--r--Source/cmTarget.cxx193
-rw-r--r--Source/cmTarget.h23
-rw-r--r--Source/cmTargetPropCommandBase.cxx8
-rw-r--r--Source/cmTargetPropertyComputer.h26
-rw-r--r--Source/cmTest.cxx9
-rw-r--r--Source/cmTestGenerator.cxx30
-rw-r--r--Source/cmTimestamp.cxx10
-rw-r--r--Source/cmTryRunCommand.cxx5
-rw-r--r--Source/cmUVHandlePtr.cxx2
-rw-r--r--Source/cmUVHandlePtr.h2
-rw-r--r--Source/cmUVProcessChain.cxx2
-rw-r--r--Source/cmUVProcessChain.h4
-rw-r--r--Source/cmUVSignalHackRAII.h2
-rw-r--r--Source/cmUVStreambuf.h2
-rw-r--r--Source/cmUtilitySourceCommand.cxx12
-rw-r--r--Source/cmVSSetupHelper.h3
-rw-r--r--Source/cmVariableWatchCommand.cxx2
-rw-r--r--Source/cmVersion.h2
-rw-r--r--Source/cmVisualStudio10TargetGenerator.cxx1073
-rw-r--r--Source/cmVisualStudio10TargetGenerator.h27
-rw-r--r--Source/cmVisualStudioGeneratorOptions.cxx5
-rw-r--r--Source/cmVisualStudioSlnParser.cxx10
-rw-r--r--Source/cmVisualStudioSlnParser.h5
-rw-r--r--Source/cmWhileCommand.cxx3
-rw-r--r--Source/cmWorkerPool.cxx2
-rw-r--r--Source/cmWorkingDirectory.h2
-rw-r--r--Source/cmWriteFileCommand.cxx2
-rw-r--r--Source/cmXCode21Object.cxx13
-rw-r--r--Source/cmXCode21Object.h8
-rw-r--r--Source/cmXCodeObject.h9
-rw-r--r--Source/cmXCodeScheme.cxx29
-rw-r--r--Source/cmXMLParser.cxx4
-rw-r--r--Source/cmXMLWriter.h2
-rw-r--r--Source/cm_get_date.c4
-rw-r--r--Source/cmake.cxx289
-rw-r--r--Source/cmake.h30
-rw-r--r--Source/cmakemain.cxx24
-rw-r--r--Source/cmcldeps.cxx58
-rw-r--r--Source/cmcmd.cxx86
-rw-r--r--Source/ctest.cxx1
-rw-r--r--Source/kwsys/Base64.c5
-rw-r--r--Source/kwsys/CMakeLists.txt1332
-rw-r--r--Source/kwsys/CommandLineArguments.cxx44
-rw-r--r--Source/kwsys/Directory.cxx53
-rw-r--r--Source/kwsys/Directory.hxx.in15
-rw-r--r--Source/kwsys/EncodingCXX.cxx4
-rw-r--r--Source/kwsys/ExtraTest.cmake.in2
-rw-r--r--Source/kwsys/Glob.cxx26
-rw-r--r--Source/kwsys/Glob.hxx.in1
-rw-r--r--Source/kwsys/MD5.c30
-rw-r--r--Source/kwsys/Process.h.in4
-rw-r--r--Source/kwsys/ProcessUNIX.c227
-rw-r--r--Source/kwsys/ProcessWin32.c2
-rw-r--r--Source/kwsys/RegularExpression.cxx7
-rw-r--r--Source/kwsys/System.c2
-rw-r--r--Source/kwsys/SystemInformation.cxx235
-rw-r--r--Source/kwsys/SystemTools.cxx373
-rw-r--r--Source/kwsys/SystemTools.hxx.in33
-rw-r--r--Source/kwsys/kwsysPlatformTests.cmake300
-rw-r--r--Source/kwsys/testCommandLineArguments.cxx6
-rw-r--r--Source/kwsys/testCommandLineArguments1.cxx10
-rw-r--r--Source/kwsys/testDirectory.cxx37
-rw-r--r--Source/kwsys/testDynamicLoader.cxx2
-rw-r--r--Source/kwsys/testDynload.c2
-rw-r--r--Source/kwsys/testEncoding.cxx27
-rw-r--r--Source/kwsys/testFStream.cxx2
-rw-r--r--Source/kwsys/testHashSTL.cxx16
-rw-r--r--Source/kwsys/testProcess.c13
-rw-r--r--Source/kwsys/testSystemTools.cxx106
-rw-r--r--Source/kwsys/testSystemTools.h.in2
-rw-r--r--Templates/TestDriver.cxx.in7
-rw-r--r--Tests/BuildDepends/CMakeLists.txt22
-rw-r--r--Tests/BuildDepends/Project/CMakeLists.txt8
-rw-r--r--Tests/CMakeLib/testArgumentParser.cxx3
-rw-r--r--Tests/CMakeLib/testCTestBinPacker.cxx2
-rw-r--r--Tests/CMakeLib/testGccDepfileReader.cxx2
-rw-r--r--Tests/CMakeLib/testString.cxx5
-rw-r--r--Tests/CMakeLib/testUVProcessChain.cxx2
-rw-r--r--Tests/CMakeLib/testUVRAII.cxx2
-rw-r--r--Tests/CMakeLib/testUVStreambuf.cxx3
-rw-r--r--Tests/CMakeLists.txt45
-rw-r--r--Tests/CMakeOnly/AllFindModules/CMakeLists.txt2
-rw-r--r--Tests/CMakeTests/ListTest.cmake.in23
-rw-r--r--Tests/CPackNSISGenerator/CMakeLists.txt1
-rw-r--r--Tests/CPackNSISGenerator/RunCPackVerifyResult.cmake8
-rw-r--r--Tests/CPackWiXGenerator/myotherapp.cpp2
-rw-r--r--Tests/CSharpOnly/CMakeLists.txt4
-rw-r--r--Tests/CSharpOnly/csharponly.cs4
-rw-r--r--Tests/CSharpOnly/nested/lib1.cs13
-rw-r--r--Tests/CTestCoverageCollectGCOV/test.cmake.in146
-rw-r--r--Tests/ConfigSources/CMakeLists.txt59
-rw-r--r--Tests/ConfigSources/main.cpp9
-rw-r--r--Tests/Contracts/VTK/Dashboard.cmake.in4
-rw-r--r--Tests/Cuda/CMakeLists.txt11
-rw-r--r--Tests/Cuda/CXXStandardSetTwice/CMakeLists.txt3
-rw-r--r--Tests/Cuda/Complex/CMakeLists.txt2
-rw-r--r--Tests/Cuda/MixedStandardLevels1/CMakeLists.txt3
-rw-r--r--Tests/Cuda/MixedStandardLevels2/CMakeLists.txt3
-rw-r--r--Tests/Cuda/MixedStandardLevels3/CMakeLists.txt2
-rw-r--r--Tests/Cuda/MixedStandardLevels4/CMakeLists.txt3
-rw-r--r--Tests/Cuda/MixedStandardLevels5/CMakeLists.txt3
-rw-r--r--Tests/Cuda/ProperDeviceLibraries/CMakeLists.txt2
-rw-r--r--Tests/Cuda/ProperLinkFlags/CMakeLists.txt8
-rw-r--r--Tests/Cuda/WithC/CMakeLists.txt2
-rw-r--r--Tests/CudaOnly/Architecture/CMakeLists.txt5
-rw-r--r--Tests/CudaOnly/Architecture/main.cu9
-rw-r--r--Tests/CudaOnly/CMakeLists.txt42
-rw-r--r--Tests/CudaOnly/CircularLinkLine/CMakeLists.txt2
-rw-r--r--Tests/CudaOnly/CompileFlags/CMakeLists.txt15
-rw-r--r--Tests/CudaOnly/CompileFlags/main.cu13
-rw-r--r--Tests/CudaOnly/DontResolveDeviceSymbols/CMakeLists.txt2
-rw-r--r--Tests/CudaOnly/ExportPTX/CMakeLists.txt7
-rw-r--r--Tests/CudaOnly/GPUDebugFlag/CMakeLists.txt15
-rw-r--r--Tests/CudaOnly/ResolveDeviceSymbols/CMakeLists.txt2
-rw-r--r--Tests/CudaOnly/RuntimeControls/CMakeLists.txt3
-rw-r--r--Tests/CudaOnly/SeparateCompilation/CMakeLists.txt4
-rw-r--r--Tests/CudaOnly/Standard98/CMakeLists.txt2
-rw-r--r--Tests/CudaOnly/WithDefs/CMakeLists.txt15
-rw-r--r--Tests/CudaOnly/WithDefs/main.notcu6
-rw-r--r--Tests/FindBLAS/CMakeLists.txt10
-rw-r--r--Tests/FindBLAS/Test/CMakeLists.txt13
-rw-r--r--Tests/FindBLAS/Test/main.c14
-rw-r--r--Tests/FindDoxygen/SimpleTest/CMakeLists.txt2
-rw-r--r--Tests/FindDoxygen/StampFile/CMakeLists.txt29
-rw-r--r--Tests/FindLAPACK/CMakeLists.txt10
-rw-r--r--Tests/FindLAPACK/Test/CMakeLists.txt13
-rw-r--r--Tests/FindLAPACK/Test/main.c20
-rw-r--r--Tests/FindLibXslt/CMakeLists.txt10
-rw-r--r--Tests/FindLibXslt/Test/CMakeLists.txt45
-rw-r--r--Tests/FindLibXslt/Test/libexslt.c16
-rw-r--r--Tests/FindLibXslt/Test/libxslt.c24
-rw-r--r--Tests/FindPython/ArtifactsInteractive/CMakeLists.txt24
-rw-r--r--Tests/FindPython/CMakeLists.txt180
-rw-r--r--Tests/FindPython/Implementation/CMakeLists.txt37
-rw-r--r--Tests/FindPython/IronPython/CMakeLists.txt11
-rw-r--r--Tests/FindPython/IronPython2/CMakeLists.txt11
-rw-r--r--Tests/FindPython/PyPy/CMakeLists.txt37
-rw-r--r--Tests/FindPython/PyPy2/CMakeLists.txt37
-rw-r--r--Tests/FindPython/PyPy3/CMakeLists.txt37
-rw-r--r--Tests/FindPython/Python/CMakeLists.txt6
-rw-r--r--Tests/FindPython/Python2/CMakeLists.txt9
-rw-r--r--Tests/FindPython/Python2Embedded/CMakeLists.txt15
-rw-r--r--Tests/FindPython/Python2Module/CMakeLists.txt37
-rw-r--r--Tests/FindPython/Python3/CMakeLists.txt15
-rw-r--r--Tests/FindPython/Python3Embedded/CMakeLists.txt15
-rw-r--r--Tests/FindPython/Python3Module/CMakeLists.txt37
-rw-r--r--Tests/FindRuby/CMakeLists.txt57
-rw-r--r--Tests/FindRuby/Fail/CMakeLists.txt5
-rw-r--r--Tests/FindRuby/FailExact/CMakeLists.txt8
-rw-r--r--Tests/FindRuby/Rvm/CMakeLists.txt75
-rw-r--r--Tests/FindRuby/Rvm/RvmDefault.cmake17
-rw-r--r--Tests/FindRuby/Rvm/RvmOnly.cmake41
-rw-r--r--Tests/FindRuby/Rvm/RvmStandard.cmake9
-rw-r--r--Tests/FindRuby/Test/CMakeLists.txt14
-rw-r--r--Tests/FindRuby/Test/ruby_version.c7
-rw-r--r--Tests/FindX11/Test/CMakeLists.txt11
-rw-r--r--Tests/FortranModules/CMakeLists.txt2
-rw-r--r--Tests/FortranOnly/CMakeLists.txt50
-rw-r--r--Tests/IncludeDirectories/CMakeLists.txt33
-rw-r--r--Tests/IncludeDirectories/main.cpp14
-rw-r--r--Tests/MSManifest/CMakeLists.txt3
-rw-r--r--Tests/MSManifest/Subdir/CMakeLists.txt7
-rw-r--r--Tests/MSManifest/Subdir2/CMakeLists.txt13
-rw-r--r--Tests/MSManifest/Subdir2/check.cmake22
-rw-r--r--Tests/MSManifest/Subdir2/main.c4
-rw-r--r--Tests/MSManifest/Subdir2/test_manifest1.in5
-rw-r--r--Tests/MSManifest/Subdir2/test_manifest2.in12
-rw-r--r--Tests/MSManifest/Subdir2/test_manifest3.in9
-rw-r--r--Tests/ObjectLibrary/CMakeLists.txt2
-rw-r--r--Tests/ObjectLibrary/Transitive/CMakeLists.txt12
-rw-r--r--Tests/ObjectLibrary/Transitive/FooObject.c4
-rw-r--r--Tests/ObjectLibrary/Transitive/FooStatic.c4
-rw-r--r--Tests/ObjectLibrary/Transitive/Transitive.c7
-rw-r--r--Tests/Preprocess/preprocess.c12
-rw-r--r--Tests/Preprocess/preprocess.cxx15
-rw-r--r--Tests/Properties/CMakeLists.txt139
-rw-r--r--Tests/Properties/SubDir2/CMakeLists.txt25
-rw-r--r--Tests/RunCMake/AndroidTestUtilities/check.cmake2
-rw-r--r--Tests/RunCMake/AutoExportDll/AutoExport.cmake6
-rw-r--r--Tests/RunCMake/AutoExportDll/cppCLI.cxx22
-rw-r--r--Tests/RunCMake/AutoExportDll/say.cxx8
-rw-r--r--Tests/RunCMake/BuildDepends/GNU-AS-stdout.txt4
-rw-r--r--Tests/RunCMake/BuildDepends/GNU-AS.cmake13
-rw-r--r--Tests/RunCMake/BuildDepends/GNU-AS.step1.cmake1
-rw-r--r--Tests/RunCMake/BuildDepends/GNU-AS.step2.cmake1
-rw-r--r--Tests/RunCMake/BuildDepends/RunCMakeTest.cmake5
-rw-r--r--Tests/RunCMake/BuildDepends/gnu_as.s1
-rw-r--r--Tests/RunCMake/CMP0104/CMP0104-Common.cmake2
-rw-r--r--Tests/RunCMake/CMP0104/CMP0104-NEW.cmake6
-rw-r--r--Tests/RunCMake/CMP0104/CMP0104-OLD.cmake12
-rw-r--r--Tests/RunCMake/CMP0104/CMP0104-WARN-stderr.txt8
-rw-r--r--Tests/RunCMake/CMP0104/CMP0104-WARN.cmake2
-rw-r--r--Tests/RunCMake/CMP0104/CMakeLists.txt3
-rw-r--r--Tests/RunCMake/CMP0104/RunCMakeTest.cmake5
-rw-r--r--Tests/RunCMake/CMP0104/main.cu3
-rw-r--r--Tests/RunCMake/CMP0106/CMP0106-Common.cmake10
-rw-r--r--Tests/RunCMake/CMP0106/CMP0106-NEW-result.txt (renamed from Tests/RunCMake/Languages/LINK_LANGUAGE-genex-result.txt)0
-rw-r--r--Tests/RunCMake/CMP0106/CMP0106-NEW-stderr.txt9
-rw-r--r--Tests/RunCMake/CMP0106/CMP0106-NEW.cmake4
-rw-r--r--Tests/RunCMake/CMP0106/CMP0106-OLD.cmake9
-rw-r--r--Tests/RunCMake/CMP0106/CMP0106-WARN-ParaView-stderr.txt8
-rw-r--r--Tests/RunCMake/CMP0106/CMP0106-WARN-ParaView.cmake2
-rw-r--r--Tests/RunCMake/CMP0106/CMP0106-WARN-VTK-stderr.txt9
-rw-r--r--Tests/RunCMake/CMP0106/CMP0106-WARN-VTK.cmake2
-rw-r--r--Tests/RunCMake/CMP0106/CMP0106-WARN-stderr.txt37
-rw-r--r--Tests/RunCMake/CMP0106/CMP0106-WARN.cmake2
-rw-r--r--Tests/RunCMake/CMP0106/CMakeLists.txt7
-rw-r--r--Tests/RunCMake/CMP0106/RunCMakeTest.cmake7
-rw-r--r--Tests/RunCMake/CMP0106/subdir/CMakeLists.txt2
-rw-r--r--Tests/RunCMake/CMakeLists.txt33
-rw-r--r--Tests/RunCMake/CPack/RunCMakeTest.cmake2
-rw-r--r--Tests/RunCMake/CPack/tests/INSTALL_SCRIPTS/VerifyResult.cmake4
-rw-r--r--Tests/RunCMake/CPack/tests/INSTALL_SCRIPTS/test.cmake16
-rw-r--r--Tests/RunCMake/CPack/tests/THREADED/ExpectedFiles.cmake2
-rw-r--r--Tests/RunCMake/CPack/tests/THREADED/test.cmake7
-rw-r--r--Tests/RunCMake/CPack/tests/THREADED_ALL/ExpectedFiles.cmake2
-rw-r--r--Tests/RunCMake/CPack/tests/THREADED_ALL/test.cmake7
-rw-r--r--Tests/RunCMake/CTestCommandLine/MemCheckSan.cmake7
-rw-r--r--Tests/RunCMake/CTestCommandLine/RunCMakeTest.cmake35
-rw-r--r--Tests/RunCMake/CTestCommandLine/stop-on-failure-result.txt1
-rw-r--r--Tests/RunCMake/CTestCommandLine/stop-on-failure-stderr.txt1
-rw-r--r--Tests/RunCMake/CTestCommandLine/stop-on-failure-stdout.txt10
-rw-r--r--Tests/RunCMake/CTestResourceAllocation/RunCMakeTest.cmake35
-rw-r--r--Tests/RunCMake/CTestResourceAllocation/checkfree1-ctest-s-res-cache-check.cmake1
-rw-r--r--Tests/RunCMake/CTestResourceAllocation/checkfree1-ctest-s-res-variable-check.cmake1
-rw-r--r--Tests/RunCMake/CTestResourceAllocation/ctresalloc.cxx2
-rw-r--r--Tests/RunCMake/CTestResourceAllocation/notenough1-ctest-s-res-cache-check.cmake3
-rw-r--r--Tests/RunCMake/CTestResourceAllocation/notenough1-ctest-s-res-cache-result.txt1
-rw-r--r--Tests/RunCMake/CTestResourceAllocation/notenough1-ctest-s-res-cache-stderr.txt14
-rw-r--r--Tests/RunCMake/CTestResourceAllocation/notenough1-ctest-s-res-variable-check.cmake3
-rw-r--r--Tests/RunCMake/CTestResourceAllocation/notenough1-ctest-s-res-variable-result.txt1
-rw-r--r--Tests/RunCMake/CTestResourceAllocation/notenough1-ctest-s-res-variable-stderr.txt14
-rw-r--r--Tests/RunCMake/CTestResourceAllocation/process_count-ctest-s-nores-check.cmake4
-rw-r--r--Tests/RunCMake/CTestResourceAllocation/process_count-ctest-s-res-check.cmake8
-rw-r--r--Tests/RunCMake/CTestResourceAllocation/test.cmake.in14
-rw-r--r--Tests/RunCMake/CommandLine/E_cat_directory-result.txt1
-rw-r--r--Tests/RunCMake/CommandLine/E_cat_directory-stderr.txt1
-rw-r--r--Tests/RunCMake/CommandLine/E_cat_good_cat-stdout.txt3
-rw-r--r--Tests/RunCMake/CommandLine/E_cat_non_existing_file-result.txt1
-rw-r--r--Tests/RunCMake/CommandLine/E_cat_non_existing_file-stderr.txt1
-rw-r--r--Tests/RunCMake/CommandLine/E_cat_non_readable_file-result.txt1
-rw-r--r--Tests/RunCMake/CommandLine/E_cat_non_readable_file-stderr.txt1
-rw-r--r--Tests/RunCMake/CommandLine/E_cat_option_not_handled-result.txt1
-rw-r--r--Tests/RunCMake/CommandLine/E_cat_option_not_handled-stderr.txt1
-rw-r--r--Tests/RunCMake/CommandLine/P_arbitrary_args.cmake3
-rw-r--r--Tests/RunCMake/CommandLine/ProfilingTest-check.cmake18
-rw-r--r--Tests/RunCMake/CommandLine/ProfilingTest.cmake1
-rw-r--r--Tests/RunCMake/CommandLine/RunCMakeTest.cmake61
-rw-r--r--Tests/RunCMake/CommandLine/cmake_depends/test_UTF-16LE.hbin58 -> 59 bytes-rw-r--r--Tests/RunCMake/CommandLine/profiling-all-params-result.txt1
-rw-r--r--Tests/RunCMake/CommandLine/profiling-all-params-stderr.txt1
-rw-r--r--Tests/RunCMake/CommandLine/profiling-invalid-format-result.txt1
-rw-r--r--Tests/RunCMake/CommandLine/profiling-invalid-format-stderr.txt1
-rw-r--r--Tests/RunCMake/CommandLine/profiling-missing-format-result.txt1
-rw-r--r--Tests/RunCMake/CommandLine/profiling-missing-format-stderr.txt1
-rw-r--r--Tests/RunCMake/CommandLine/profiling-missing-output-result.txt1
-rw-r--r--Tests/RunCMake/CommandLine/profiling-missing-output-stderr.txt1
-rw-r--r--Tests/RunCMake/CompilerLauncher/CUDA-common.cmake1
-rw-r--r--Tests/RunCMake/CrosscompilingEmulator/AddTest-check.cmake10
-rw-r--r--Tests/RunCMake/ExportCompileCommands/BeforeProject-check.cmake4
-rw-r--r--Tests/RunCMake/ExportCompileCommands/BeforeProject.cmake3
-rw-r--r--Tests/RunCMake/ExportCompileCommands/BeforeProjectBEFORE.cmake1
-rw-r--r--Tests/RunCMake/ExportCompileCommands/CMakeLists.txt3
-rw-r--r--Tests/RunCMake/ExportCompileCommands/RunCMakeTest.cmake3
-rw-r--r--Tests/RunCMake/ExportCompileCommands/empty.c0
-rw-r--r--Tests/RunCMake/ExternalProject/Add_StepDependencies_iface_step-stderr.txt2
-rw-r--r--Tests/RunCMake/FPHSA/FindUseComponents.cmake15
-rw-r--r--Tests/RunCMake/FPHSA/RunCMakeTest.cmake8
-rw-r--r--Tests/RunCMake/FPHSA/all_optional_components.cmake14
-rw-r--r--Tests/RunCMake/FPHSA/required_and_optional_components.cmake14
-rw-r--r--Tests/RunCMake/FPHSA/required_components.cmake11
-rw-r--r--Tests/RunCMake/FPHSA/required_components_with_vars.cmake1
-rw-r--r--Tests/RunCMake/FetchContent/DownloadFile.cmake9
-rw-r--r--Tests/RunCMake/FetchContent/MakeAvailable-stdout.txt1
-rw-r--r--Tests/RunCMake/FetchContent/MakeAvailable.cmake13
-rw-r--r--Tests/RunCMake/FetchContent/RunCMakeTest.cmake1
-rw-r--r--Tests/RunCMake/FetchContent/WithoutProject/ProjectSubdir/CMakeLists.txt5
-rw-r--r--Tests/RunCMake/FetchContent/dummyFile.txt1
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-check.py4758
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/directories/alias.json15
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/directories/custom.json15
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/directories/cxx.json19
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/directories/dir.json12
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/directories/dir_dir.json10
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/directories/external.json14
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/directories/imported.json18
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/directories/object.json17
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/directories/top.json28
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/projects/alias.json14
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/projects/codemodel-v2.json28
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/projects/custom.json14
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/projects/cxx.json18
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/projects/external.json13
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/projects/imported.json17
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/projects/object.json16
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/all_build_alias.json83
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/all_build_custom.json79
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/all_build_cxx.json99
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/all_build_external.json79
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/all_build_imported.json95
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/all_build_object.json91
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/all_build_top.json179
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/c_alias_exe.json107
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/c_exe.json143
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/c_lib.json108
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/c_object_exe.json154
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/c_object_lib.json82
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/c_shared_exe.json143
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/c_shared_lib.json123
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/c_static_exe.json143
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/c_static_lib.json108
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/custom_exe.json107
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/custom_tgt.json87
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/cxx_alias_exe.json107
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/cxx_exe.json213
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/cxx_lib.json84
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/cxx_object_exe.json154
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/cxx_object_lib.json82
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/cxx_shared_exe.json107
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/cxx_shared_lib.json99
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/cxx_static_exe.json107
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/cxx_static_lib.json84
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/generated_exe.json303
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/interface_exe.json152
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/link_imported_exe.json90
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/link_imported_interface_exe.json90
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/link_imported_object_exe.json90
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/link_imported_shared_exe.json90
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/link_imported_static_exe.json90
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/zero_check_alias.json70
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/zero_check_custom.json70
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/zero_check_cxx.json70
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/zero_check_external.json70
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/zero_check_imported.json70
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/zero_check_object.json70
-rw-r--r--Tests/RunCMake/FileAPI/codemodel-v2-data/targets/zero_check_top.json70
-rw-r--r--Tests/RunCMake/File_Archive/7zip.cmake7
-rw-r--r--Tests/RunCMake/File_Archive/CMakeLists.txt3
-rw-r--r--Tests/RunCMake/File_Archive/RunCMakeTest.cmake17
-rw-r--r--Tests/RunCMake/File_Archive/gnutar-gz.cmake8
-rw-r--r--Tests/RunCMake/File_Archive/gnutar.cmake7
-rw-r--r--Tests/RunCMake/File_Archive/pax-xz.cmake8
-rw-r--r--Tests/RunCMake/File_Archive/pax-zstd.cmake8
-rw-r--r--Tests/RunCMake/File_Archive/pax.cmake7
-rw-r--r--Tests/RunCMake/File_Archive/paxr-bz2.cmake8
-rw-r--r--Tests/RunCMake/File_Archive/paxr.cmake7
-rw-r--r--Tests/RunCMake/File_Archive/roundtrip.cmake92
-rw-r--r--Tests/RunCMake/File_Archive/unsupported-format-result.txt1
-rw-r--r--Tests/RunCMake/File_Archive/unsupported-format-stderr.txt5
-rw-r--r--Tests/RunCMake/File_Archive/unsupported-format.cmake5
-rw-r--r--Tests/RunCMake/File_Archive/zip-filtered.cmake26
-rw-r--r--Tests/RunCMake/File_Archive/zip-with-bad-type-result.txt1
-rw-r--r--Tests/RunCMake/File_Archive/zip-with-bad-type-stderr.txt5
-rw-r--r--Tests/RunCMake/File_Archive/zip-with-bad-type.cmake6
-rw-r--r--Tests/RunCMake/File_Archive/zip.cmake7
-rw-r--r--Tests/RunCMake/File_Configure/BadArg-result.txt1
-rw-r--r--Tests/RunCMake/File_Configure/BadArg-stderr.txt4
-rw-r--r--Tests/RunCMake/File_Configure/BadArg.cmake1
-rw-r--r--Tests/RunCMake/File_Configure/BadArgGeneratorExpressionContent-result.txt1
-rw-r--r--Tests/RunCMake/File_Configure/BadArgGeneratorExpressionContent-stderr.txt5
-rw-r--r--Tests/RunCMake/File_Configure/BadArgGeneratorExpressionContent.cmake4
-rw-r--r--Tests/RunCMake/File_Configure/BadArgGeneratorExpressionOutput-result.txt1
-rw-r--r--Tests/RunCMake/File_Configure/BadArgGeneratorExpressionOutput-stderr.txt5
-rw-r--r--Tests/RunCMake/File_Configure/BadArgGeneratorExpressionOutput.cmake4
-rw-r--r--Tests/RunCMake/File_Configure/CMakeLists.txt3
-rw-r--r--Tests/RunCMake/File_Configure/DirOutput-stderr.txt1
-rw-r--r--Tests/RunCMake/File_Configure/DirOutput.cmake4
-rw-r--r--Tests/RunCMake/File_Configure/DirOutput.txt1
-rw-r--r--Tests/RunCMake/File_Configure/NewLineStyle-NoArg-result.txt1
-rw-r--r--Tests/RunCMake/File_Configure/NewLineStyle-NoArg-stderr.txt5
-rw-r--r--Tests/RunCMake/File_Configure/NewLineStyle-NoArg.cmake6
-rw-r--r--Tests/RunCMake/File_Configure/NewLineStyle-ValidArg.cmake20
-rw-r--r--Tests/RunCMake/File_Configure/NewLineStyle-WrongArg-result.txt1
-rw-r--r--Tests/RunCMake/File_Configure/NewLineStyle-WrongArg-stderr.txt5
-rw-r--r--Tests/RunCMake/File_Configure/NewLineStyle-WrongArg.cmake6
-rw-r--r--Tests/RunCMake/File_Configure/RunCMakeTest.cmake9
-rw-r--r--Tests/RunCMake/File_Generate/CMP0070-OLD-stderr.txt10
-rw-r--r--Tests/RunCMake/FindPkgConfig/FindPkgConfig_CMAKE_APPBUNDLE_PATH.cmake48
-rw-r--r--Tests/RunCMake/FindPkgConfig/FindPkgConfig_CMAKE_FRAMEWORK_PATH.cmake48
-rw-r--r--Tests/RunCMake/FindPkgConfig/FindPkgConfig_extract_frameworks.cmake13
-rw-r--r--Tests/RunCMake/FindPkgConfig/FindPkgConfig_extract_frameworks_target.cmake29
-rw-r--r--Tests/RunCMake/FindPkgConfig/PkgConfigDoesNotExist-stdout.txt6
-rw-r--r--Tests/RunCMake/FindPkgConfig/PkgConfigDoesNotExist.cmake4
-rw-r--r--Tests/RunCMake/FindPkgConfig/RunCMakeTest.cmake4
-rw-r--r--Tests/RunCMake/FindPkgConfig/pc-bletch/lib/pkgconfig/bletch-framework.pc9
-rw-r--r--Tests/RunCMake/FindSWIG/CMakeLists.txt3
-rw-r--r--Tests/RunCMake/FindSWIG/RunCMakeTest.cmake4
-rw-r--r--Tests/RunCMake/FindSWIG/components-stdout.txt6
-rw-r--r--Tests/RunCMake/FindSWIG/components.cmake9
-rw-r--r--Tests/RunCMake/FindSWIG/missing-components-result.txt1
-rw-r--r--Tests/RunCMake/FindSWIG/missing-components-stderr.txt1
-rw-r--r--Tests/RunCMake/FindSWIG/missing-components.cmake3
-rw-r--r--Tests/RunCMake/Framework/FrameworkMultiConfigPostfix-build-final-check.cmake45
-rw-r--r--Tests/RunCMake/Framework/FrameworkMultiConfigPostfix.cmake25
-rw-r--r--Tests/RunCMake/Framework/RunCMakeTest.cmake36
-rw-r--r--Tests/RunCMake/GenerateExportHeader/exportheader_test.cpp6
-rw-r--r--Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_custom_command-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_custom_command-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_custom_command.cmake4
-rw-r--r--Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_custom_target-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_custom_target-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_custom_target.cmake3
-rw-r--r--Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_executable-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_executable-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_executable.cmake1
-rw-r--r--Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_library-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_library-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_library.cmake1
-rw-r--r--Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_test-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_test-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_test.cmake5
-rw-r--r--Tests/RunCMake/GeneratorExpression/DEVICE_LINK-install-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/DEVICE_LINK-install-stderr.txt7
-rw-r--r--Tests/RunCMake/GeneratorExpression/DEVICE_LINK-install.cmake5
-rw-r--r--Tests/RunCMake/GeneratorExpression/DEVICE_LINK-link_depends-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/DEVICE_LINK-link_depends-stderr.txt7
-rw-r--r--Tests/RunCMake/GeneratorExpression/DEVICE_LINK-link_depends.cmake7
-rw-r--r--Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_compile_definitions-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_compile_definitions-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_compile_definitions.cmake4
-rw-r--r--Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_compile_options-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_compile_options-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_compile_options.cmake4
-rw-r--r--Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_include_directories-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_include_directories-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_include_directories.cmake4
-rw-r--r--Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_link_directories-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_link_directories-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_link_directories.cmake7
-rw-r--r--Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_link_libraries-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_link_libraries-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_link_libraries.cmake7
-rw-r--r--Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_sources-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_sources-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_sources.cmake2
-rw-r--r--Tests/RunCMake/GeneratorExpression/HOST_LINK-add_custom_command-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/HOST_LINK-add_custom_command-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/HOST_LINK-add_custom_command.cmake4
-rw-r--r--Tests/RunCMake/GeneratorExpression/HOST_LINK-add_custom_target-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/HOST_LINK-add_custom_target-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/HOST_LINK-add_custom_target.cmake3
-rw-r--r--Tests/RunCMake/GeneratorExpression/HOST_LINK-add_executable-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/HOST_LINK-add_executable-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/HOST_LINK-add_executable.cmake1
-rw-r--r--Tests/RunCMake/GeneratorExpression/HOST_LINK-add_library-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/HOST_LINK-add_library-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/HOST_LINK-add_library.cmake1
-rw-r--r--Tests/RunCMake/GeneratorExpression/HOST_LINK-add_test-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/HOST_LINK-add_test-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/HOST_LINK-add_test.cmake5
-rw-r--r--Tests/RunCMake/GeneratorExpression/HOST_LINK-install-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/HOST_LINK-install-stderr.txt7
-rw-r--r--Tests/RunCMake/GeneratorExpression/HOST_LINK-install.cmake5
-rw-r--r--Tests/RunCMake/GeneratorExpression/HOST_LINK-link_depends-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/HOST_LINK-link_depends-stderr.txt7
-rw-r--r--Tests/RunCMake/GeneratorExpression/HOST_LINK-link_depends.cmake7
-rw-r--r--Tests/RunCMake/GeneratorExpression/HOST_LINK-target_compile_definitions-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/HOST_LINK-target_compile_definitions-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/HOST_LINK-target_compile_definitions.cmake4
-rw-r--r--Tests/RunCMake/GeneratorExpression/HOST_LINK-target_compile_options-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/HOST_LINK-target_compile_options-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/HOST_LINK-target_compile_options.cmake4
-rw-r--r--Tests/RunCMake/GeneratorExpression/HOST_LINK-target_include_directories-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/HOST_LINK-target_include_directories-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/HOST_LINK-target_include_directories.cmake4
-rw-r--r--Tests/RunCMake/GeneratorExpression/HOST_LINK-target_link_directories-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/HOST_LINK-target_link_directories-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/HOST_LINK-target_link_directories.cmake7
-rw-r--r--Tests/RunCMake/GeneratorExpression/HOST_LINK-target_link_libraries-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/HOST_LINK-target_link_libraries-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/HOST_LINK-target_link_libraries.cmake7
-rw-r--r--Tests/RunCMake/GeneratorExpression/HOST_LINK-target_sources-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/HOST_LINK-target_sources-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/HOST_LINK-target_sources.cmake2
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_custom_command-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_custom_command-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_custom_command.cmake4
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_custom_target-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_custom_target-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_custom_target.cmake3
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_executable-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_executable-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_executable.cmake1
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_library-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_library-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_library.cmake1
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_test-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_test-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_test.cmake5
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-file_generate-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-file_generate-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-file_generate.cmake6
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-install-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-install-stderr.txt10
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-install.cmake5
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-target_sources-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-target_sources-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-target_sources.cmake2
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-unknown-lang.cmake4
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage1-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage1-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage1.cmake4
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage2-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage2-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage2.cmake4
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage3-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage3-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage3.cmake4
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage4-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage4-stderr.txt8
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage4.cmake7
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_custom_command-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_custom_command-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_custom_command.cmake4
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_custom_target-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_custom_target-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_custom_target.cmake4
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_executable-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_executable-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_executable.cmake5
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_library-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_library-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_library.cmake2
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_test-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_test-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_test.cmake5
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-file_generate-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-file_generate-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-file_generate.cmake6
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-install-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-install-stderr.txt10
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-install.cmake5
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-target_sources-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-target_sources-stderr.txt8
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-target_sources.cmake2
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-unknown-lang.cmake4
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-wrong-usage1-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-wrong-usage1-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-wrong-usage1.cmake4
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-wrong-usage2-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-wrong-usage2-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-wrong-usage2.cmake4
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-wrong-usage3-result.txt1
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-wrong-usage3-stderr.txt9
-rw-r--r--Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-wrong-usage3.cmake4
-rw-r--r--Tests/RunCMake/GeneratorExpression/RunCMakeTest.cmake55
-rw-r--r--Tests/RunCMake/GoogleTest/GoogleTest-configuration-debug-stdout.txt5
-rw-r--r--Tests/RunCMake/GoogleTest/GoogleTest-configuration-release-stdout.txt5
-rw-r--r--Tests/RunCMake/GoogleTest/GoogleTest-discovery-POST_BUILD-timeout-build-result.txt (renamed from Tests/RunCMake/GoogleTest/GoogleTest-discovery-timeout-result.txt)0
-rw-r--r--Tests/RunCMake/GoogleTest/GoogleTest-discovery-POST_BUILD-timeout-build-stdout.txt (renamed from Tests/RunCMake/GoogleTest/GoogleTest-discovery-timeout-stdout.txt)0
-rw-r--r--Tests/RunCMake/GoogleTest/GoogleTest-discovery-POST_BUILD-timeout-test-result.txt1
-rw-r--r--Tests/RunCMake/GoogleTest/GoogleTest-discovery-POST_BUILD-timeout-test-stderr.txt2
-rw-r--r--Tests/RunCMake/GoogleTest/GoogleTest-discovery-POST_BUILD-timeout-test-stdout.txt18
-rw-r--r--Tests/RunCMake/GoogleTest/GoogleTest-discovery-PRE_TEST-timeout-test-stderr.txt8
-rw-r--r--Tests/RunCMake/GoogleTest/GoogleTest-discovery-PRE_TEST-timeout-test-stdout.txt1
-rw-r--r--Tests/RunCMake/GoogleTest/GoogleTest-skip-timeout-stdout.txt10
-rw-r--r--Tests/RunCMake/GoogleTest/GoogleTest-test1-stdout.txt40
-rw-r--r--Tests/RunCMake/GoogleTest/GoogleTest-test2-stdout.txt44
-rw-r--r--Tests/RunCMake/GoogleTest/GoogleTest.cmake8
-rw-r--r--Tests/RunCMake/GoogleTest/GoogleTestDiscoveryMultiConfig.cmake14
-rw-r--r--Tests/RunCMake/GoogleTest/GoogleTestDiscoveryTimeout.cmake14
-rw-r--r--Tests/RunCMake/GoogleTest/GoogleTestXML-result-check.cmake4
-rw-r--r--Tests/RunCMake/GoogleTest/GoogleTestXML.cmake11
-rw-r--r--Tests/RunCMake/GoogleTest/RunCMakeTest.cmake132
-rw-r--r--Tests/RunCMake/GoogleTest/configuration_gtest.cpp23
-rw-r--r--Tests/RunCMake/GoogleTest/fake_gtest.cpp4
-rw-r--r--Tests/RunCMake/GoogleTest/skip_test.cpp18
-rw-r--r--Tests/RunCMake/GoogleTest/timeout_test.cpp7
-rw-r--r--Tests/RunCMake/GoogleTest/xml_output.cpp26
-rw-r--r--Tests/RunCMake/Languages/LINKER_LANGUAGE-genex-result.txt1
-rw-r--r--Tests/RunCMake/Languages/LINKER_LANGUAGE-genex-stderr.txt (renamed from Tests/RunCMake/Languages/LINK_LANGUAGE-genex-stderr.txt)2
-rw-r--r--Tests/RunCMake/Languages/LINKER_LANGUAGE-genex.cmake (renamed from Tests/RunCMake/Languages/LINK_LANGUAGE-genex.cmake)0
-rw-r--r--Tests/RunCMake/Languages/RunCMakeTest.cmake2
-rw-r--r--Tests/RunCMake/Ninja/RunCMakeTest.cmake6
-rwxr-xr-xTests/RunCMake/Ninja/SelectCompiler/1/gcc2
-rwxr-xr-xTests/RunCMake/Ninja/SelectCompiler/2/cc2
-rw-r--r--Tests/RunCMake/Ninja/SelectCompilerUNIX-result.txt1
-rw-r--r--Tests/RunCMake/Ninja/SelectCompilerUNIX-stderr.txt6
-rw-r--r--Tests/RunCMake/Ninja/SelectCompilerUNIX.cmake3
-rw-r--r--Tests/RunCMake/Ninja/SelectCompilerWindows-result.txt1
-rw-r--r--Tests/RunCMake/Ninja/SelectCompilerWindows-stderr.txt6
-rw-r--r--Tests/RunCMake/Ninja/SelectCompilerWindows.cmake3
-rw-r--r--Tests/RunCMake/NinjaMultiConfig/CudaSimple.cmake1
-rw-r--r--Tests/RunCMake/NinjaMultiConfig/RunCMakeTest.cmake3
-rw-r--r--Tests/RunCMake/ObjectLibrary/b.c2
-rw-r--r--Tests/RunCMake/ObjectLibrary/requires.c2
-rw-r--r--Tests/RunCMake/PrecompileHeaders/PchWarnInvalid-check.cmake22
-rw-r--r--Tests/RunCMake/PrecompileHeaders/PchWarnInvalid.cmake16
-rw-r--r--Tests/RunCMake/PrecompileHeaders/RunCMakeTest.cmake12
-rw-r--r--Tests/RunCMake/PrecompileHeaders/empty.c2
-rw-r--r--Tests/RunCMake/Syntax/CommandEOF-stderr.txt2
-rw-r--r--Tests/RunCMake/TargetPolicies/PolicyList-stderr.txt2
-rw-r--r--Tests/RunCMake/UnityBuild/RunCMakeTest.cmake6
-rw-r--r--Tests/RunCMake/UnityBuild/f.c5
-rw-r--r--Tests/RunCMake/UnityBuild/unitybuild_c_and_cxx_group-check.cmake42
-rw-r--r--Tests/RunCMake/UnityBuild/unitybuild_c_and_cxx_group.cmake39
-rw-r--r--Tests/RunCMake/UnityBuild/unitybuild_c_batch-check.cmake5
-rw-r--r--Tests/RunCMake/UnityBuild/unitybuild_c_batch.cmake15
-rw-r--r--Tests/RunCMake/UnityBuild/unitybuild_c_group-check.cmake11
-rw-r--r--Tests/RunCMake/UnityBuild/unitybuild_c_group.cmake17
-rw-r--r--Tests/RunCMake/UnityBuild/unitybuild_c_no_unity_build_group-check.cmake5
-rw-r--r--Tests/RunCMake/UnityBuild/unitybuild_c_no_unity_build_group.cmake16
-rw-r--r--Tests/RunCMake/UnityBuild/unitybuild_cxx_group-check.cmake27
-rw-r--r--Tests/RunCMake/UnityBuild/unitybuild_cxx_group.cmake27
-rw-r--r--Tests/RunCMake/UnityBuild/unitybuild_invalid_mode-result.txt1
-rw-r--r--Tests/RunCMake/UnityBuild/unitybuild_invalid_mode-stderr.txt5
-rw-r--r--Tests/RunCMake/UnityBuild/unitybuild_invalid_mode.cmake12
-rw-r--r--Tests/RunCMake/VS10Project/CSharpSourceGroup/foo.cs3
-rw-r--r--Tests/RunCMake/VS10Project/CSharpSourceGroup/images/empty.bmp0
-rw-r--r--Tests/RunCMake/VS10Project/CSharpSourceGroup/nested/baz.cs3
-rw-r--r--Tests/RunCMake/VS10Project/RunCMakeTest.cmake7
-rw-r--r--Tests/RunCMake/VS10Project/UnityBuildNativeGrouped-check.cmake56
-rw-r--r--Tests/RunCMake/VS10Project/UnityBuildNativeGrouped.cmake20
-rw-r--r--Tests/RunCMake/VS10Project/UnityBuildPre2017Grouped-check.cmake59
-rw-r--r--Tests/RunCMake/VS10Project/UnityBuildPre2017Grouped.cmake20
-rw-r--r--Tests/RunCMake/VS10Project/VsCsharpSourceGroup-check.cmake22
-rw-r--r--Tests/RunCMake/VS10Project/VsCsharpSourceGroup.cmake16
-rw-r--r--Tests/RunCMake/VS10Project/VsCsharpSourceGroupHelpers.cmake15
-rw-r--r--Tests/RunCMake/VS10Project/VsDeployEnabled-check.cmake58
-rw-r--r--Tests/RunCMake/VS10Project/VsDeployEnabled.cmake12
-rw-r--r--Tests/RunCMake/VS10Project/VsPlatformToolset-check.cmake36
-rw-r--r--Tests/RunCMake/VS10Project/VsPlatformToolset.cmake6
-rw-r--r--Tests/RunCMake/VS10Project/VsSettings-check.cmake23
-rw-r--r--Tests/RunCMake/VS10Project/VsSettings.cmake5
-rw-r--r--Tests/RunCMake/VS10Project/VsSourceSettingsTool-check.cmake34
-rw-r--r--Tests/RunCMake/VS10Project/VsSourceSettingsTool.cmake5
-rw-r--r--Tests/RunCMake/VS10Project/shader.hlsl1
-rw-r--r--Tests/RunCMake/VS10Project/shader2.hlsl1
-rw-r--r--Tests/RunCMake/add_link_options/GENEX_LINK_LANG.cmake16
-rw-r--r--Tests/RunCMake/add_link_options/LINKER_expansion-validation.cmake5
-rw-r--r--Tests/RunCMake/add_link_options/LINK_OPTIONS-exe-check.cmake5
-rw-r--r--Tests/RunCMake/add_link_options/LINK_OPTIONS-mod-check.cmake5
-rw-r--r--Tests/RunCMake/add_link_options/LINK_OPTIONS-shared-check.cmake5
-rw-r--r--Tests/RunCMake/add_link_options/LinkOptionsLib.cxx7
-rw-r--r--Tests/RunCMake/add_link_options/RunCMakeTest.cmake15
-rw-r--r--Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE-exe-check.cmake2
-rw-r--r--Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE-exe-result.txt1
-rw-r--r--Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE-mod-check.cmake2
-rw-r--r--Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE-mod-result.txt1
-rw-r--r--Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE-shared_c-check.cmake5
-rw-r--r--Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE-shared_c-result.txt1
-rw-r--r--Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE-shared_cxx-check.cmake5
-rw-r--r--Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE-shared_cxx-result.txt1
-rw-r--r--Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE-validation.cmake17
-rw-r--r--Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE.cmake17
-rw-r--r--Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID-exe-check.cmake2
-rw-r--r--Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID-exe-result.txt1
-rw-r--r--Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID-mod-check.cmake2
-rw-r--r--Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID-mod-result.txt1
-rw-r--r--Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID-shared_c-check.cmake5
-rw-r--r--Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID-shared_c-result.txt1
-rw-r--r--Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID-shared_cxx-check.cmake5
-rw-r--r--Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID-shared_cxx-result.txt1
-rw-r--r--Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID-validation.cmake23
-rw-r--r--Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID.cmake19
-rw-r--r--Tests/RunCMake/add_test/CMakeLists.txt.in27
-rw-r--r--Tests/RunCMake/add_test/NameContainsBracketArgument1-stdout.txt1
-rw-r--r--Tests/RunCMake/add_test/NameContainsBracketArgument2-stdout.txt1
-rw-r--r--Tests/RunCMake/add_test/NameContainsBracketArgument3-result.txt1
-rw-r--r--Tests/RunCMake/add_test/NameContainsBracketArgument3-stderr.txt2
-rw-r--r--Tests/RunCMake/add_test/NameContainsBracketArgument4-result.txt1
-rw-r--r--Tests/RunCMake/add_test/NameContainsBracketArgument4-stderr.txt2
-rw-r--r--Tests/RunCMake/add_test/NameContainsEscapedQuote1-result.txt1
-rw-r--r--Tests/RunCMake/add_test/NameContainsEscapedQuote1-stderr.txt1
-rw-r--r--Tests/RunCMake/add_test/NameContainsEscapedQuote1-stdout.txt1
-rw-r--r--Tests/RunCMake/add_test/NameContainsEscapedQuote2-result.txt1
-rw-r--r--Tests/RunCMake/add_test/NameContainsEscapedQuote2-stderr.txt1
-rw-r--r--Tests/RunCMake/add_test/NameContainsEscapedQuote2-stdout.txt1
-rw-r--r--Tests/RunCMake/add_test/NameContainsEscapedQuote3-result.txt1
-rw-r--r--Tests/RunCMake/add_test/NameContainsEscapedQuote3-stderr.txt1
-rw-r--r--Tests/RunCMake/add_test/NameContainsEscapedQuote3-stdout.txt1
-rw-r--r--Tests/RunCMake/add_test/NameContainsEscapedQuote4-result.txt1
-rw-r--r--Tests/RunCMake/add_test/NameContainsEscapedQuote4-stderr.txt1
-rw-r--r--Tests/RunCMake/add_test/NameContainsEscapedQuote4-stdout.txt1
-rw-r--r--Tests/RunCMake/add_test/NameContainsEscapedSpecialChars1-stdout.txt1
-rw-r--r--Tests/RunCMake/add_test/NameContainsEscapedSpecialChars2-stdout.txt1
-rw-r--r--Tests/RunCMake/add_test/NameContainsEscapedSpecialChars3-stdout.txt1
-rw-r--r--Tests/RunCMake/add_test/NameContainsEscapedSpecialChars4-stdout.txt1
-rw-r--r--Tests/RunCMake/add_test/NameContainsGeneratorExpressionSyntax1-stdout.txt1
-rw-r--r--Tests/RunCMake/add_test/NameContainsGeneratorExpressionSyntax2-stdout.txt1
-rw-r--r--Tests/RunCMake/add_test/NameContainsGeneratorExpressionSyntax3-stdout.txt1
-rw-r--r--Tests/RunCMake/add_test/NameContainsGeneratorExpressionSyntax4-stdout.txt1
-rw-r--r--Tests/RunCMake/add_test/NameContainsOtherSpecialChars1-stdout.txt1
-rw-r--r--Tests/RunCMake/add_test/NameContainsOtherSpecialChars2-stdout.txt1
-rw-r--r--Tests/RunCMake/add_test/NameContainsOtherSpecialChars3-stdout.txt1
-rw-r--r--Tests/RunCMake/add_test/NameContainsOtherSpecialChars4-stdout.txt1
-rw-r--r--Tests/RunCMake/add_test/NameContainsSemicolon1-stdout.txt1
-rw-r--r--Tests/RunCMake/add_test/NameContainsSemicolon2-result.txt1
-rw-r--r--Tests/RunCMake/add_test/NameContainsSemicolon2-stderr.txt2
-rw-r--r--Tests/RunCMake/add_test/NameContainsSemicolon3-stdout.txt3
-rw-r--r--Tests/RunCMake/add_test/NameContainsSemicolon4-result.txt1
-rw-r--r--Tests/RunCMake/add_test/NameContainsSemicolon4-stderr.txt2
-rw-r--r--Tests/RunCMake/add_test/NameContainsSpaces1-stdout.txt1
-rw-r--r--Tests/RunCMake/add_test/NameContainsSpaces2-result.txt1
-rw-r--r--Tests/RunCMake/add_test/NameContainsSpaces2-stderr.txt2
-rw-r--r--Tests/RunCMake/add_test/NameContainsSpaces3-stdout.txt3
-rw-r--r--Tests/RunCMake/add_test/NameContainsSpaces4-result.txt1
-rw-r--r--Tests/RunCMake/add_test/NameContainsSpaces4-stderr.txt2
-rw-r--r--Tests/RunCMake/add_test/NameContainsValidSpecialChars1-stdout.txt1
-rw-r--r--Tests/RunCMake/add_test/NameContainsValidSpecialChars2-stdout.txt1
-rw-r--r--Tests/RunCMake/add_test/NameContainsValidSpecialChars3-stdout.txt1
-rw-r--r--Tests/RunCMake/add_test/NameContainsValidSpecialChars4-stdout.txt1
-rw-r--r--Tests/RunCMake/add_test/NameIsAlphaNumeric1-stdout.txt1
-rw-r--r--Tests/RunCMake/add_test/NameIsAlphaNumeric2-stdout.txt1
-rw-r--r--Tests/RunCMake/add_test/NameIsAlphaNumeric3-stdout.txt1
-rw-r--r--Tests/RunCMake/add_test/NameIsAlphaNumeric4-stdout.txt1
-rw-r--r--Tests/RunCMake/add_test/RunCMakeTest.cmake263
-rw-r--r--Tests/RunCMake/add_test/test.cmake.in16
-rw-r--r--Tests/RunCMake/cmake_command/CMakeLists.txt3
-rw-r--r--Tests/RunCMake/cmake_command/RunCMakeTest.cmake23
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_eval_expand_command_name-stderr.txt1
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_eval_expand_command_name.cmake2
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_eval_expanded_command_and_arguments-stderr.txt1
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_eval_expanded_command_and_arguments.cmake2
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_eval_extra_parameters_between_eval_and_code-result.txt1
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_eval_extra_parameters_between_eval_and_code-stderr.txt5
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_eval_extra_parameters_between_eval_and_code.cmake1
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_eval_message-stderr.txt1
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_eval_message.cmake1
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_eval_message_fatal_error-result.txt1
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_eval_message_fatal_error-stderr.txt5
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_eval_message_fatal_error.cmake5
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_eval_no_code-result.txt1
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_eval_no_code-stderr.txt2
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_eval_no_code.cmake1
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_eval_no_parameters-result.txt1
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_eval_no_parameters-stderr.txt2
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_eval_no_parameters.cmake1
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_eval_variable_outside_message-stderr.txt1
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_eval_variable_outside_message.cmake2
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_invoke_double_evaluation-stderr.txt1
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_invoke_double_evaluation.cmake2
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_invoke_expand_command_name-stderr.txt1
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_invoke_expand_command_name.cmake2
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_invoke_expand_function_name-stderr.txt1
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_invoke_expand_function_name.cmake11
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_invoke_expanded_command-stderr.txt1
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_invoke_expanded_command.cmake6
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_invoke_expanded_command_and_arguments-result.txt1
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_invoke_expanded_command_and_arguments-stderr.txt4
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_invoke_expanded_command_and_arguments.cmake2
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_invoke_expanded_command_with_explicit_argument-stderr.txt1
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_invoke_expanded_command_with_explicit_argument.cmake2
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_invoke_message-stderr.txt1
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_invoke_message.cmake1
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_invoke_message_fatal_error-result.txt1
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_invoke_message_fatal_error-stderr.txt5
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_invoke_message_fatal_error.cmake1
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_invoke_no_parameters-result.txt1
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_invoke_no_parameters-stderr.txt2
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_invoke_no_parameters.cmake1
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_invoke_preserve_arguments-stderr.txt6
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_invoke_preserve_arguments.cmake12
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_invoke_unknown_function-result.txt1
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_invoke_unknown_function-stderr.txt2
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_invoke_unknown_function.cmake1
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_no_parameters-result.txt1
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_no_parameters-stderr.txt2
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_no_parameters.cmake1
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_unknown_meta_operation-result.txt1
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_unknown_meta_operation-stderr.txt2
-rw-r--r--Tests/RunCMake/cmake_command/cmake_command_unknown_meta_operation.cmake1
-rw-r--r--Tests/RunCMake/configure_file/RerunCMake.cmake6
-rw-r--r--Tests/RunCMake/configure_file/RerunCMake/CMakeLists.txt5
-rw-r--r--Tests/RunCMake/configure_file/RunCMakeTest.cmake4
-rw-r--r--Tests/RunCMake/ctest_memcheck/testAddressLeakSanitizer.cmake2
-rw-r--r--Tests/RunCMake/ctest_memcheck/testAddressSanitizer.cmake2
-rw-r--r--Tests/RunCMake/ctest_memcheck/testLeakSanitizer.cmake2
-rw-r--r--Tests/RunCMake/ctest_memcheck/testMemorySanitizer.cmake2
-rw-r--r--Tests/RunCMake/ctest_memcheck/testThreadSanitizer.cmake2
-rw-r--r--Tests/RunCMake/ctest_memcheck/testUndefinedBehaviorSanitizer.cmake2
-rw-r--r--Tests/RunCMake/ctest_start/NoStartTimeNightly-result.txt1
-rw-r--r--Tests/RunCMake/ctest_start/NoStartTimeNightly-stderr.txt4
-rw-r--r--Tests/RunCMake/ctest_start/RunCMakeTest.cmake2
-rw-r--r--Tests/RunCMake/ctest_start/test.cmake.in4
-rw-r--r--Tests/RunCMake/ctest_test/RunCMakeTest.cmake23
-rw-r--r--Tests/RunCMake/ctest_test/TestEnvironment-check.cmake10
-rw-r--r--Tests/RunCMake/ctest_test/stop-on-failure-stdout.txt13
-rw-r--r--Tests/RunCMake/execute_process/EchoVariable-stderr.txt3
-rw-r--r--Tests/RunCMake/execute_process/EchoVariable-stdout.txt1
-rw-r--r--Tests/RunCMake/execute_process/EchoVariable.cmake23
-rw-r--r--Tests/RunCMake/execute_process/EchoVariableOutput.cmake2
-rw-r--r--Tests/RunCMake/execute_process/RunCMakeTest.cmake2
-rw-r--r--Tests/RunCMake/exit_code.c3
-rw-r--r--Tests/RunCMake/export/Repeat-CMP0103-NEW-result.txt1
-rw-r--r--Tests/RunCMake/export/Repeat-CMP0103-NEW-stderr.txt17
-rw-r--r--Tests/RunCMake/export/Repeat-CMP0103-NEW.cmake2
-rw-r--r--Tests/RunCMake/export/Repeat-CMP0103-OLD.cmake2
-rw-r--r--Tests/RunCMake/export/Repeat-CMP0103-WARN-stderr.txt26
-rw-r--r--Tests/RunCMake/export/Repeat-CMP0103-WARN.cmake1
-rw-r--r--Tests/RunCMake/export/RunCMakeTest.cmake4
-rw-r--r--Tests/RunCMake/file/DOWNLOAD-tls-cainfo-not-set-result.txt1
-rw-r--r--Tests/RunCMake/file/DOWNLOAD-tls-cainfo-not-set-stderr.txt4
-rw-r--r--Tests/RunCMake/file/DOWNLOAD-tls-cainfo-not-set.cmake1
-rw-r--r--Tests/RunCMake/file/DOWNLOAD-tls-verify-not-set-result.txt1
-rw-r--r--Tests/RunCMake/file/DOWNLOAD-tls-verify-not-set-stderr.txt4
-rw-r--r--Tests/RunCMake/file/DOWNLOAD-tls-verify-not-set.cmake1
-rw-r--r--Tests/RunCMake/file/RunCMakeTest.cmake4
-rw-r--r--Tests/RunCMake/file/UPLOAD-tls-cainfo-not-set-result.txt1
-rw-r--r--Tests/RunCMake/file/UPLOAD-tls-cainfo-not-set-stderr.txt4
-rw-r--r--Tests/RunCMake/file/UPLOAD-tls-cainfo-not-set.cmake1
-rw-r--r--Tests/RunCMake/file/UPLOAD-tls-verify-not-set-result.txt1
-rw-r--r--Tests/RunCMake/file/UPLOAD-tls-verify-not-set-stderr.txt4
-rw-r--r--Tests/RunCMake/file/UPLOAD-tls-verify-not-set.cmake1
-rw-r--r--Tests/RunCMake/find_file/Required-result.txt1
-rw-r--r--Tests/RunCMake/find_file/Required-stderr.txt4
-rw-r--r--Tests/RunCMake/find_file/Required-stdout.txt1
-rw-r--r--Tests/RunCMake/find_file/Required.cmake12
-rw-r--r--Tests/RunCMake/find_file/RunCMakeTest.cmake1
-rw-r--r--Tests/RunCMake/find_library/Required-result.txt1
-rw-r--r--Tests/RunCMake/find_library/Required-stderr.txt4
-rw-r--r--Tests/RunCMake/find_library/Required-stdout.txt1
-rw-r--r--Tests/RunCMake/find_library/Required.cmake14
-rw-r--r--Tests/RunCMake/find_library/RunCMakeTest.cmake1
-rw-r--r--Tests/RunCMake/find_path/Required-result.txt1
-rw-r--r--Tests/RunCMake/find_path/Required-stderr.txt4
-rw-r--r--Tests/RunCMake/find_path/Required-stdout.txt1
-rw-r--r--Tests/RunCMake/find_path/Required.cmake12
-rw-r--r--Tests/RunCMake/find_path/RunCMakeTest.cmake1
-rw-r--r--Tests/RunCMake/find_program/ExeNoRead-stdout.txt1
-rw-r--r--Tests/RunCMake/find_program/ExeNoRead.cmake4
-rw-r--r--Tests/RunCMake/find_program/Required-result.txt1
-rw-r--r--Tests/RunCMake/find_program/Required-stderr.txt4
-rw-r--r--Tests/RunCMake/find_program/Required-stdout.txt1
-rw-r--r--Tests/RunCMake/find_program/Required.cmake12
-rw-r--r--Tests/RunCMake/find_program/RunCMakeTest.cmake5
-rw-r--r--Tests/RunCMake/get_filename_component/KnownComponents.cmake8
-rwxr-xr-xTests/RunCMake/get_filename_component/KnownComponents.sh1
-rw-r--r--Tests/RunCMake/get_property/RunCMakeTest.cmake1
-rw-r--r--Tests/RunCMake/get_property/source_properties_failures-result.txt1
-rw-r--r--Tests/RunCMake/get_property/source_properties_failures-stderr.txt66
-rw-r--r--Tests/RunCMake/get_property/source_properties_failures.cmake14
-rw-r--r--Tests/RunCMake/install/RunCMakeTest.cmake1
-rw-r--r--Tests/RunCMake/install/file-GET_RUNTIME_DEPENDENCIES-variable-propagation-all-result.txt1
-rw-r--r--Tests/RunCMake/install/file-GET_RUNTIME_DEPENDENCIES-variable-propagation-all-stderr.txt6
-rw-r--r--Tests/RunCMake/install/file-GET_RUNTIME_DEPENDENCIES-variable-propagation-dev-result.txt1
-rw-r--r--Tests/RunCMake/install/file-GET_RUNTIME_DEPENDENCIES-variable-propagation-dev-stderr.txt6
-rw-r--r--Tests/RunCMake/install/file-GET_RUNTIME_DEPENDENCIES-variable-propagation.cmake17
-rw-r--r--Tests/RunCMake/pseudo_cppcheck.c3
-rw-r--r--Tests/RunCMake/set_property/RunCMakeTest.cmake1
-rw-r--r--Tests/RunCMake/set_property/SOURCE_FILE-result.txt1
-rw-r--r--Tests/RunCMake/set_property/SOURCE_FILE-stderr.txt22
-rw-r--r--Tests/RunCMake/set_property/SOURCE_FILE.cmake4
-rw-r--r--Tests/RunCMake/string/Hex.cmake20
-rw-r--r--Tests/RunCMake/string/HexNotEnoughArgs-result.txt1
-rw-r--r--Tests/RunCMake/string/HexNotEnoughArgs-stderr.txt4
-rw-r--r--Tests/RunCMake/string/HexNotEnoughArgs.cmake1
-rw-r--r--Tests/RunCMake/string/HexTooManyArgs-result.txt1
-rw-r--r--Tests/RunCMake/string/HexTooManyArgs-stderr.txt4
-rw-r--r--Tests/RunCMake/string/HexTooManyArgs.cmake1
-rw-r--r--Tests/RunCMake/string/RunCMakeTest.cmake4
-rw-r--r--Tests/RunCMake/target_link_directories/CMP0099.cmake2
-rw-r--r--Tests/RunCMake/target_link_directories/RunCMakeTest.cmake13
-rw-r--r--Tests/RunCMake/target_link_directories/genex_LINK_LANGUAGE-LINKER_LANGUAGE-check.cmake5
-rw-r--r--Tests/RunCMake/target_link_directories/genex_LINK_LANGUAGE-LINKER_LANGUAGE-result.txt1
-rw-r--r--Tests/RunCMake/target_link_directories/genex_LINK_LANGUAGE-basic-check.cmake2
-rw-r--r--Tests/RunCMake/target_link_directories/genex_LINK_LANGUAGE-basic-result.txt1
-rw-r--r--Tests/RunCMake/target_link_directories/genex_LINK_LANGUAGE-interface-check.cmake4
-rw-r--r--Tests/RunCMake/target_link_directories/genex_LINK_LANGUAGE-interface-result.txt1
-rw-r--r--Tests/RunCMake/target_link_directories/genex_LINK_LANGUAGE-validation.cmake20
-rw-r--r--Tests/RunCMake/target_link_directories/genex_LINK_LANGUAGE.cmake23
-rw-r--r--Tests/RunCMake/target_link_directories/genex_LINK_LANG_AND_ID-LINKER_LANGUAGE-check.cmake5
-rw-r--r--Tests/RunCMake/target_link_directories/genex_LINK_LANG_AND_ID-LINKER_LANGUAGE-result.txt1
-rw-r--r--Tests/RunCMake/target_link_directories/genex_LINK_LANG_AND_ID-basic-check.cmake2
-rw-r--r--Tests/RunCMake/target_link_directories/genex_LINK_LANG_AND_ID-basic-result.txt1
-rw-r--r--Tests/RunCMake/target_link_directories/genex_LINK_LANG_AND_ID-interface-check.cmake4
-rw-r--r--Tests/RunCMake/target_link_directories/genex_LINK_LANG_AND_ID-interface-result.txt1
-rw-r--r--Tests/RunCMake/target_link_directories/genex_LINK_LANG_AND_ID-validation.cmake26
-rw-r--r--Tests/RunCMake/target_link_directories/genex_LINK_LANG_AND_ID.cmake29
-rw-r--r--Tests/RunCMake/target_link_libraries/RunCMakeTest.cmake54
-rw-r--r--Tests/RunCMake/target_link_libraries/func.c7
-rw-r--r--Tests/RunCMake/target_link_libraries/func.cxx7
-rw-r--r--Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-mix-lang-result.txt1
-rw-r--r--Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-mix-lang-stderr.txt2
-rw-r--r--Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-mix-lang.cmake8
-rw-r--r--Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-usage-result.txt1
-rw-r--r--Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-usage-stderr.txt8
-rw-r--r--Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-usage.cmake4
-rw-r--r--Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE.cmake72
-rw-r--r--Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-bad-mix-lang-result.txt1
-rw-r--r--Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-bad-mix-lang-stderr.txt2
-rw-r--r--Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-bad-mix-lang.cmake8
-rw-r--r--Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-basic-result.txt1
-rw-r--r--Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-exe_c-result.txt1
-rw-r--r--Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-exe_cxx-result.txt1
-rw-r--r--Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-interface-result.txt1
-rw-r--r--Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-no_language-result.txt1
-rw-r--r--Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID.cmake73
-rw-r--r--Tests/RunCMake/target_link_libraries/lib.c10
-rw-r--r--Tests/RunCMake/target_link_libraries/main.c12
-rw-r--r--Tests/RunCMake/target_link_libraries/main.cxx12
-rw-r--r--Tests/RunCMake/target_link_options/LinkOptionsDevice.cu14
-rw-r--r--Tests/RunCMake/target_link_options/RunCMakeTest.cmake36
-rw-r--r--Tests/RunCMake/target_link_options/genex_DEVICE_LINK-CMP0105_NEW-check.cmake4
-rw-r--r--Tests/RunCMake/target_link_options/genex_DEVICE_LINK-CMP0105_NEW-result.txt1
-rw-r--r--Tests/RunCMake/target_link_options/genex_DEVICE_LINK-device-check.cmake3
-rw-r--r--Tests/RunCMake/target_link_options/genex_DEVICE_LINK-device-result.txt1
-rw-r--r--Tests/RunCMake/target_link_options/genex_DEVICE_LINK-interface-check.cmake3
-rw-r--r--Tests/RunCMake/target_link_options/genex_DEVICE_LINK-interface-result.txt1
-rw-r--r--Tests/RunCMake/target_link_options/genex_DEVICE_LINK-no_device-check.cmake3
-rw-r--r--Tests/RunCMake/target_link_options/genex_DEVICE_LINK-no_device-result.txt1
-rw-r--r--Tests/RunCMake/target_link_options/genex_DEVICE_LINK-private-check.cmake3
-rw-r--r--Tests/RunCMake/target_link_options/genex_DEVICE_LINK-private-result.txt1
-rw-r--r--Tests/RunCMake/target_link_options/genex_DEVICE_LINK-validation.cmake22
-rw-r--r--Tests/RunCMake/target_link_options/genex_DEVICE_LINK.cmake48
-rw-r--r--Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-LINKER_LANGUAGE-check.cmake5
-rw-r--r--Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-LINKER_LANGUAGE-result.txt1
-rw-r--r--Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-exe-check.cmake2
-rw-r--r--Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-exe-result.txt1
-rw-r--r--Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-interface-check.cmake5
-rw-r--r--Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-interface-result.txt1
-rw-r--r--Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-mod-check.cmake2
-rw-r--r--Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-mod-result.txt1
-rw-r--r--Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-shared_c-check.cmake5
-rw-r--r--Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-shared_c-result.txt1
-rw-r--r--Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-validation.cmake17
-rw-r--r--Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE.cmake32
-rw-r--r--Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-LINKER_LANGUAGE-check.cmake5
-rw-r--r--Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-LINKER_LANGUAGE-result.txt1
-rw-r--r--Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-exe-check.cmake2
-rw-r--r--Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-exe-result.txt1
-rw-r--r--Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-interface-check.cmake5
-rw-r--r--Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-interface-result.txt1
-rw-r--r--Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-mod-check.cmake2
-rw-r--r--Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-mod-result.txt1
-rw-r--r--Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-shared_c-check.cmake5
-rw-r--r--Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-shared_c-result.txt1
-rw-r--r--Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-validation.cmake23
-rw-r--r--Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID.cmake41
-rw-r--r--Tests/SourceGroups/CMakeLists.txt6
-rw-r--r--Tests/SourceGroups/main.c4
-rw-r--r--Tests/SourceGroups/nested.c4
-rw-r--r--Tests/SwiftOnly/CMakeLists.txt24
-rw-r--r--Tests/SwiftOnly/L.swift1
-rw-r--r--Tests/SwiftOnly/M.swift2
-rw-r--r--Tests/SwiftOnly/N.swift2
-rw-r--r--Tests/TryCompile/CMakeLists.txt2
-rw-r--r--Tests/UseSWIG/BasicConfiguration.cmake3
-rw-r--r--Tests/UseSWIG/BasicFortran/CMakeLists.txt23
-rw-r--r--Tests/UseSWIG/CMakeLists.txt15
-rw-r--r--Tests/UseSWIG/runme.f9077
-rw-r--r--Tests/VSWinStorePhone/CMakeLists.txt7
-rw-r--r--Tests/VSWinStorePhone/EnsurePropertiesSet.cmake45
-rw-r--r--Tests/VSWindowsFormsResx/WindowsFormsResx/MyForm.cpp2
-rwxr-xr-xUtilities/GitSetup/setup-user9
-rw-r--r--Utilities/IWYU/mapping.imp63
-rw-r--r--Utilities/KWIML/CMakeLists.txt1
-rw-r--r--Utilities/KWIML/include/kwiml/abi.h6
-rw-r--r--Utilities/Release/.gitattributes1
-rw-r--r--Utilities/Release/README.rst46
-rw-r--r--Utilities/Release/create-cmake-release.cmake4
-rw-r--r--Utilities/Release/linux/x86_64/test/cache-ninja.txt4
-rw-r--r--Utilities/Release/win/x86/Dockerfile23
-rw-r--r--Utilities/Release/win/x86/base/Dockerfile30
-rwxr-xr-xUtilities/Release/win/x86/base/msvc-i386.bat1
-rwxr-xr-xUtilities/Release/win/x86/base/msvc-x86_64.bat1
-rwxr-xr-xUtilities/Release/win/x86/build.bat19
-rw-r--r--Utilities/Release/win/x86/cache-i386.txt45
-rw-r--r--Utilities/Release/win/x86/cache-x86_64.txt45
-rw-r--r--Utilities/Release/win/x86/deps/Dockerfile127
-rwxr-xr-xUtilities/Release/win/x86/deps/qt-build.bat47
-rw-r--r--Utilities/Release/win/x86/deps/qt-install.patch26
-rwxr-xr-xUtilities/Release/win/x86/pack.bat12
-rw-r--r--Utilities/Release/win/x86/test/Dockerfile37
-rwxr-xr-xUtilities/Release/win/x86/test/test-ninja.bat19
-rwxr-xr-xUtilities/Release/win/x86/test/test-nmake.bat19
-rw-r--r--Utilities/Release/win32_release.cmake52
-rw-r--r--Utilities/Release/win64_release.cmake52
-rwxr-xr-xUtilities/Scripts/update-bzip2.bash27
-rwxr-xr-xUtilities/Scripts/update-curl.bash6
-rwxr-xr-xUtilities/Scripts/update-libarchive.bash3
-rwxr-xr-xUtilities/Scripts/update-librhash.bash3
-rwxr-xr-xUtilities/Scripts/update-nghttp2.bash30
-rw-r--r--Utilities/Sphinx/CMakeLists.txt2
-rw-r--r--Utilities/Sphinx/CTestConfig.cmake14
-rw-r--r--Utilities/cm3p/Setup.Configuration.h8
-rw-r--r--Utilities/cm3p/archive.h (renamed from Utilities/cm_libarchive.h)10
-rw-r--r--Utilities/cm3p/archive_entry.h14
-rw-r--r--Utilities/cm3p/bzlib.h (renamed from Utilities/cm_bzlib.h)8
-rw-r--r--Utilities/cm3p/curl/curl.h (renamed from Utilities/cm_curl.h)8
-rw-r--r--Utilities/cm3p/expat.h (renamed from Utilities/cm_expat.h)8
-rw-r--r--Utilities/cm3p/json/reader.h (renamed from Utilities/cm_jsoncpp_writer.h)8
-rw-r--r--Utilities/cm3p/json/value.h (renamed from Utilities/cm_jsoncpp_value.h)8
-rw-r--r--Utilities/cm3p/json/writer.h (renamed from Utilities/cm_jsoncpp_reader.h)8
-rw-r--r--Utilities/cm3p/kwiml/abi.h (renamed from Utilities/cm_kwiml.h)10
-rw-r--r--Utilities/cm3p/kwiml/int.h14
-rw-r--r--Utilities/cm3p/lzma.h (renamed from Utilities/cm_lzma.h)8
-rw-r--r--Utilities/cm3p/rhash.h (renamed from Utilities/cm_rhash.h)8
-rw-r--r--Utilities/cm3p/uv.h (renamed from Utilities/cm_uv.h)8
-rw-r--r--Utilities/cm3p/zlib.h (renamed from Utilities/cm_zlib.h)8
-rw-r--r--Utilities/cm3p/zstd.h (renamed from Utilities/cm_zstd.h)8
-rw-r--r--Utilities/cmbzip2/.gitattributes1
-rw-r--r--Utilities/cmbzip2/CHANGES319
-rw-r--r--Utilities/cmbzip2/CMakeLists.txt9
-rw-r--r--Utilities/cmbzip2/LICENSE6
-rw-r--r--Utilities/cmbzip2/Makefile-libbz2_so59
-rw-r--r--Utilities/cmbzip2/README36
-rw-r--r--Utilities/cmbzip2/README.COMPILATION.PROBLEMS58
-rw-r--r--Utilities/cmbzip2/README.XML.STUFF45
-rw-r--r--Utilities/cmbzip2/blocksort.c12
-rw-r--r--Utilities/cmbzip2/bz-common.xsl39
-rw-r--r--Utilities/cmbzip2/bz-fo.xsl276
-rw-r--r--Utilities/cmbzip2/bz-html.xsl20
-rw-r--r--Utilities/cmbzip2/bzdiff76
-rw-r--r--Utilities/cmbzip2/bzdiff.147
-rw-r--r--Utilities/cmbzip2/bzgrep75
-rw-r--r--Utilities/cmbzip2/bzgrep.156
-rw-r--r--Utilities/cmbzip2/bzip.css74
-rw-r--r--Utilities/cmbzip2/bzip2.1454
-rw-r--r--Utilities/cmbzip2/bzip2.1.preformatted399
-rw-r--r--Utilities/cmbzip2/bzip2.c112
-rw-r--r--Utilities/cmbzip2/bzip2.txt391
-rw-r--r--Utilities/cmbzip2/bzip2recover.c18
-rw-r--r--Utilities/cmbzip2/bzlib.c13
-rw-r--r--Utilities/cmbzip2/bzlib.h4
-rw-r--r--Utilities/cmbzip2/bzlib_private.h23
-rw-r--r--Utilities/cmbzip2/bzmore61
-rw-r--r--Utilities/cmbzip2/bzmore.1152
-rw-r--r--Utilities/cmbzip2/compress.c18
-rw-r--r--Utilities/cmbzip2/crctable.c4
-rw-r--r--Utilities/cmbzip2/decompress.c34
-rw-r--r--Utilities/cmbzip2/dlltest.c350
-rw-r--r--Utilities/cmbzip2/entities.xml9
-rwxr-xr-xUtilities/cmbzip2/format.pl68
-rw-r--r--Utilities/cmbzip2/huffman.c4
-rw-r--r--Utilities/cmbzip2/libbz2.def27
-rw-r--r--Utilities/cmbzip2/libbz2.libbin60774 -> 0 bytes-rw-r--r--Utilities/cmbzip2/makefile.msc63
-rw-r--r--Utilities/cmbzip2/manual.html2540
-rw-r--r--Utilities/cmbzip2/manual.pdfbin289422 -> 0 bytes-rw-r--r--Utilities/cmbzip2/manual.ps82900
-rw-r--r--Utilities/cmbzip2/manual.xml2964
-rw-r--r--Utilities/cmbzip2/mk251.c4
-rw-r--r--Utilities/cmbzip2/randtable.c4
-rw-r--r--Utilities/cmbzip2/sample1.rb2bin32558 -> 0 bytes-rw-r--r--Utilities/cmbzip2/sample1.refbin98869 -> 0 bytes-rw-r--r--Utilities/cmbzip2/sample1.tstbin98869 -> 0 bytes-rw-r--r--Utilities/cmbzip2/sample2.rb2bin74143 -> 0 bytes-rw-r--r--Utilities/cmbzip2/sample2.refbin212610 -> 0 bytes-rw-r--r--Utilities/cmbzip2/sample2.tstbin212610 -> 0 bytes-rw-r--r--Utilities/cmbzip2/sample3.rb2bin237 -> 0 bytes-rw-r--r--Utilities/cmbzip2/sample3.ref30007
-rw-r--r--Utilities/cmbzip2/sample3.tst30007
-rw-r--r--Utilities/cmbzip2/spewG.c6
-rw-r--r--Utilities/cmbzip2/unzcrash.c4
-rw-r--r--Utilities/cmbzip2/words09
-rw-r--r--Utilities/cmbzip2/words14
-rw-r--r--Utilities/cmbzip2/words25
-rw-r--r--Utilities/cmbzip2/words330
-rwxr-xr-xUtilities/cmbzip2/xmlproc.sh114
-rw-r--r--Utilities/cmcurl/CMake/CurlSymbolHiding.cmake10
-rw-r--r--Utilities/cmcurl/CMake/CurlTests.c4
-rw-r--r--Utilities/cmcurl/CMake/FindBearSSL.cmake9
-rw-r--r--Utilities/cmcurl/CMake/FindCARES.cmake26
-rw-r--r--Utilities/cmcurl/CMake/FindGSS.cmake8
-rw-r--r--Utilities/cmcurl/CMake/FindLibSSH2.cmake29
-rw-r--r--Utilities/cmcurl/CMake/FindNGHTTP2.cmake4
-rw-r--r--Utilities/cmcurl/CMake/FindNSS.cmake17
-rw-r--r--Utilities/cmcurl/CMake/OtherTests.cmake4
-rw-r--r--Utilities/cmcurl/CMake/Platforms/WindowsCache.cmake1
-rw-r--r--Utilities/cmcurl/CMake/Utilities.cmake5
-rw-r--r--Utilities/cmcurl/CMakeLists.txt137
-rw-r--r--Utilities/cmcurl/COPYING2
-rw-r--r--Utilities/cmcurl/include/curl/curl.h762
-rw-r--r--Utilities/cmcurl/include/curl/curlver.h16
-rw-r--r--Utilities/cmcurl/include/curl/easy.h6
-rw-r--r--Utilities/cmcurl/include/curl/mprintf.h8
-rw-r--r--Utilities/cmcurl/include/curl/multi.h77
-rw-r--r--Utilities/cmcurl/include/curl/stdcheaders.h8
-rw-r--r--Utilities/cmcurl/include/curl/system.h57
-rw-r--r--Utilities/cmcurl/include/curl/typecheck-gcc.h555
-rw-r--r--Utilities/cmcurl/include/curl/urlapi.h8
-rw-r--r--Utilities/cmcurl/lib/CMakeLists.txt9
-rw-r--r--Utilities/cmcurl/lib/Makefile.inc38
-rw-r--r--Utilities/cmcurl/lib/altsvc.c297
-rw-r--r--Utilities/cmcurl/lib/altsvc.h34
-rw-r--r--Utilities/cmcurl/lib/asyn-ares.c29
-rw-r--r--Utilities/cmcurl/lib/asyn-thread.c136
-rw-r--r--Utilities/cmcurl/lib/asyn.h3
-rw-r--r--Utilities/cmcurl/lib/base64.c4
-rw-r--r--Utilities/cmcurl/lib/conncache.c82
-rw-r--r--Utilities/cmcurl/lib/conncache.h30
-rw-r--r--Utilities/cmcurl/lib/connect.c241
-rw-r--r--Utilities/cmcurl/lib/connect.h3
-rw-r--r--Utilities/cmcurl/lib/cookie.c99
-rw-r--r--Utilities/cmcurl/lib/cookie.h2
-rw-r--r--Utilities/cmcurl/lib/curl_base64.h2
-rw-r--r--Utilities/cmcurl/lib/curl_config.h.cmake56
-rw-r--r--Utilities/cmcurl/lib/curl_des.c2
-rw-r--r--Utilities/cmcurl/lib/curl_des.h2
-rw-r--r--Utilities/cmcurl/lib/curl_endian.c2
-rw-r--r--Utilities/cmcurl/lib/curl_endian.h5
-rw-r--r--Utilities/cmcurl/lib/curl_fnmatch.h2
-rw-r--r--Utilities/cmcurl/lib/curl_gethostname.h2
-rw-r--r--Utilities/cmcurl/lib/curl_hmac.h9
-rw-r--r--Utilities/cmcurl/lib/curl_ldap.h2
-rw-r--r--Utilities/cmcurl/lib/curl_md4.h15
-rw-r--r--Utilities/cmcurl/lib/curl_md5.h6
-rw-r--r--Utilities/cmcurl/lib/curl_memrchr.h2
-rw-r--r--Utilities/cmcurl/lib/curl_multibyte.c2
-rw-r--r--Utilities/cmcurl/lib/curl_multibyte.h13
-rw-r--r--Utilities/cmcurl/lib/curl_ntlm_core.c112
-rw-r--r--Utilities/cmcurl/lib/curl_ntlm_core.h8
-rw-r--r--Utilities/cmcurl/lib/curl_ntlm_wb.c112
-rw-r--r--Utilities/cmcurl/lib/curl_path.c2
-rw-r--r--Utilities/cmcurl/lib/curl_rtmp.c14
-rw-r--r--Utilities/cmcurl/lib/curl_rtmp.h2
-rw-r--r--Utilities/cmcurl/lib/curl_sasl.c26
-rw-r--r--Utilities/cmcurl/lib/curl_setup.h46
-rw-r--r--Utilities/cmcurl/lib/curl_setup_once.h28
-rw-r--r--Utilities/cmcurl/lib/curl_sha256.h9
-rw-r--r--Utilities/cmcurl/lib/curl_sspi.c2
-rw-r--r--Utilities/cmcurl/lib/curl_sspi.h2
-rw-r--r--Utilities/cmcurl/lib/curl_threads.c2
-rw-r--r--Utilities/cmcurl/lib/curl_threads.h2
-rw-r--r--Utilities/cmcurl/lib/dict.h2
-rw-r--r--Utilities/cmcurl/lib/doh.c232
-rw-r--r--Utilities/cmcurl/lib/doh.h9
-rw-r--r--Utilities/cmcurl/lib/dotdot.c2
-rw-r--r--Utilities/cmcurl/lib/dotdot.h2
-rw-r--r--Utilities/cmcurl/lib/easy.c202
-rw-r--r--Utilities/cmcurl/lib/easyif.h2
-rw-r--r--Utilities/cmcurl/lib/file.c8
-rw-r--r--Utilities/cmcurl/lib/file.h2
-rw-r--r--Utilities/cmcurl/lib/formdata.c2
-rw-r--r--Utilities/cmcurl/lib/ftp.c493
-rw-r--r--Utilities/cmcurl/lib/ftp.h10
-rw-r--r--Utilities/cmcurl/lib/ftplistparser.c2
-rw-r--r--Utilities/cmcurl/lib/ftplistparser.h2
-rw-r--r--Utilities/cmcurl/lib/getenv.c47
-rw-r--r--Utilities/cmcurl/lib/getinfo.c8
-rw-r--r--Utilities/cmcurl/lib/getinfo.h2
-rw-r--r--Utilities/cmcurl/lib/gopher.h2
-rw-r--r--Utilities/cmcurl/lib/hash.h4
-rw-r--r--Utilities/cmcurl/lib/hmac.c39
-rw-r--r--Utilities/cmcurl/lib/hostcheck.c2
-rw-r--r--Utilities/cmcurl/lib/hostcheck.h2
-rw-r--r--Utilities/cmcurl/lib/hostip.c94
-rw-r--r--Utilities/cmcurl/lib/hostip.h46
-rw-r--r--Utilities/cmcurl/lib/hostip4.c284
-rw-r--r--Utilities/cmcurl/lib/hostip6.c29
-rw-r--r--Utilities/cmcurl/lib/hostsyn.c2
-rw-r--r--Utilities/cmcurl/lib/http.c302
-rw-r--r--Utilities/cmcurl/lib/http.h50
-rw-r--r--Utilities/cmcurl/lib/http2.c216
-rw-r--r--Utilities/cmcurl/lib/http2.h10
-rw-r--r--Utilities/cmcurl/lib/http_chunks.c28
-rw-r--r--Utilities/cmcurl/lib/http_chunks.h13
-rw-r--r--Utilities/cmcurl/lib/http_negotiate.c4
-rw-r--r--Utilities/cmcurl/lib/http_ntlm.c9
-rw-r--r--Utilities/cmcurl/lib/http_proxy.c15
-rw-r--r--Utilities/cmcurl/lib/imap.c28
-rw-r--r--Utilities/cmcurl/lib/imap.h2
-rw-r--r--Utilities/cmcurl/lib/inet_ntop.c2
-rw-r--r--Utilities/cmcurl/lib/inet_ntop.h2
-rw-r--r--Utilities/cmcurl/lib/inet_pton.c2
-rw-r--r--Utilities/cmcurl/lib/inet_pton.h2
-rw-r--r--Utilities/cmcurl/lib/krb5.c10
-rw-r--r--Utilities/cmcurl/lib/ldap.c26
-rw-r--r--Utilities/cmcurl/lib/llist.c53
-rw-r--r--Utilities/cmcurl/lib/llist.h5
-rw-r--r--Utilities/cmcurl/lib/md4.c247
-rw-r--r--Utilities/cmcurl/lib/md5.c69
-rw-r--r--Utilities/cmcurl/lib/memdebug.h2
-rw-r--r--Utilities/cmcurl/lib/mime.c21
-rw-r--r--Utilities/cmcurl/lib/mime.h8
-rw-r--r--Utilities/cmcurl/lib/mprintf.c4
-rw-r--r--Utilities/cmcurl/lib/multi.c626
-rw-r--r--Utilities/cmcurl/lib/multihandle.h26
-rw-r--r--Utilities/cmcurl/lib/multiif.h15
-rw-r--r--Utilities/cmcurl/lib/netrc.c153
-rw-r--r--Utilities/cmcurl/lib/non-ascii.c2
-rw-r--r--Utilities/cmcurl/lib/nonblock.c2
-rw-r--r--Utilities/cmcurl/lib/nonblock.h2
-rw-r--r--Utilities/cmcurl/lib/openldap.c28
-rw-r--r--Utilities/cmcurl/lib/parsedate.c38
-rw-r--r--Utilities/cmcurl/lib/parsedate.h8
-rw-r--r--Utilities/cmcurl/lib/pingpong.c13
-rw-r--r--Utilities/cmcurl/lib/pingpong.h5
-rw-r--r--Utilities/cmcurl/lib/pop3.c23
-rw-r--r--Utilities/cmcurl/lib/pop3.h2
-rw-r--r--Utilities/cmcurl/lib/progress.c262
-rw-r--r--Utilities/cmcurl/lib/quic.h57
-rw-r--r--Utilities/cmcurl/lib/rand.c5
-rw-r--r--Utilities/cmcurl/lib/rand.h5
-rw-r--r--Utilities/cmcurl/lib/rename.c62
-rw-r--r--Utilities/cmcurl/lib/rename.h27
-rw-r--r--Utilities/cmcurl/lib/rtsp.c11
-rw-r--r--Utilities/cmcurl/lib/rtsp.h2
-rw-r--r--Utilities/cmcurl/lib/security.c12
-rw-r--r--Utilities/cmcurl/lib/select.c215
-rw-r--r--Utilities/cmcurl/lib/select.h16
-rw-r--r--Utilities/cmcurl/lib/sendf.c23
-rw-r--r--Utilities/cmcurl/lib/setopt.c82
-rw-r--r--Utilities/cmcurl/lib/setopt.h5
-rw-r--r--Utilities/cmcurl/lib/setup-os400.h6
-rw-r--r--Utilities/cmcurl/lib/sha256.c193
-rw-r--r--Utilities/cmcurl/lib/slist.c2
-rw-r--r--Utilities/cmcurl/lib/slist.h2
-rw-r--r--Utilities/cmcurl/lib/smb.c21
-rw-r--r--Utilities/cmcurl/lib/smtp.c353
-rw-r--r--Utilities/cmcurl/lib/smtp.h7
-rw-r--r--Utilities/cmcurl/lib/sockaddr.h2
-rw-r--r--Utilities/cmcurl/lib/socketpair.c121
-rw-r--r--Utilities/cmcurl/lib/socketpair.h36
-rw-r--r--Utilities/cmcurl/lib/socks.c1158
-rw-r--r--Utilities/cmcurl/lib/socks.h15
-rw-r--r--Utilities/cmcurl/lib/socks_gssapi.c6
-rw-r--r--Utilities/cmcurl/lib/socks_sspi.c5
-rw-r--r--Utilities/cmcurl/lib/splay.h8
-rw-r--r--Utilities/cmcurl/lib/strcase.c88
-rw-r--r--Utilities/cmcurl/lib/strcase.h3
-rw-r--r--Utilities/cmcurl/lib/strdup.c2
-rw-r--r--Utilities/cmcurl/lib/strerror.c587
-rw-r--r--Utilities/cmcurl/lib/strerror.h7
-rw-r--r--Utilities/cmcurl/lib/strtok.c2
-rw-r--r--Utilities/cmcurl/lib/strtok.h2
-rw-r--r--Utilities/cmcurl/lib/strtoofft.c2
-rw-r--r--Utilities/cmcurl/lib/system_win32.c45
-rw-r--r--Utilities/cmcurl/lib/system_win32.h13
-rw-r--r--Utilities/cmcurl/lib/telnet.c4
-rw-r--r--Utilities/cmcurl/lib/telnet.h2
-rw-r--r--Utilities/cmcurl/lib/tftp.c77
-rw-r--r--Utilities/cmcurl/lib/tftp.h2
-rw-r--r--Utilities/cmcurl/lib/timeval.c27
-rw-r--r--Utilities/cmcurl/lib/timeval.h10
-rw-r--r--Utilities/cmcurl/lib/transfer.c65
-rw-r--r--Utilities/cmcurl/lib/transfer.h7
-rw-r--r--Utilities/cmcurl/lib/url.c656
-rw-r--r--Utilities/cmcurl/lib/url.h25
-rw-r--r--Utilities/cmcurl/lib/urlapi-int.h3
-rw-r--r--Utilities/cmcurl/lib/urlapi.c237
-rw-r--r--Utilities/cmcurl/lib/urldata.h562
-rw-r--r--Utilities/cmcurl/lib/vauth/cram.c2
-rw-r--r--Utilities/cmcurl/lib/vauth/digest.c85
-rw-r--r--Utilities/cmcurl/lib/vauth/digest.h2
-rw-r--r--Utilities/cmcurl/lib/vauth/digest_sspi.c15
-rw-r--r--Utilities/cmcurl/lib/vauth/krb5_gssapi.c10
-rw-r--r--Utilities/cmcurl/lib/vauth/krb5_sspi.c26
-rw-r--r--Utilities/cmcurl/lib/vauth/ntlm.c13
-rw-r--r--Utilities/cmcurl/lib/vauth/ntlm_sspi.c14
-rw-r--r--Utilities/cmcurl/lib/vauth/spnego_gssapi.c6
-rw-r--r--Utilities/cmcurl/lib/vauth/spnego_sspi.c23
-rw-r--r--Utilities/cmcurl/lib/vauth/vauth.h2
-rw-r--r--Utilities/cmcurl/lib/version.c83
-rw-r--r--Utilities/cmcurl/lib/vquic/ngtcp2.c1769
-rw-r--r--Utilities/cmcurl/lib/vquic/ngtcp2.h63
-rw-r--r--Utilities/cmcurl/lib/vquic/quiche.c807
-rw-r--r--Utilities/cmcurl/lib/vquic/quiche.h49
-rw-r--r--Utilities/cmcurl/lib/vssh/libssh.c (renamed from Utilities/cmcurl/lib/ssh-libssh.c)160
-rw-r--r--Utilities/cmcurl/lib/vssh/libssh2.c (renamed from Utilities/cmcurl/lib/ssh.c)314
-rw-r--r--Utilities/cmcurl/lib/vssh/ssh.h (renamed from Utilities/cmcurl/lib/ssh.h)29
-rw-r--r--Utilities/cmcurl/lib/vssh/wolfssh.c1156
-rw-r--r--Utilities/cmcurl/lib/vssh/wolfssh.h27
-rw-r--r--Utilities/cmcurl/lib/vtls/bearssl.c866
-rw-r--r--Utilities/cmcurl/lib/vtls/bearssl.h (renamed from Utilities/cmcurl/lib/vtls/polarssl.h)16
-rw-r--r--Utilities/cmcurl/lib/vtls/gskit.c102
-rw-r--r--Utilities/cmcurl/lib/vtls/gskit.h2
-rw-r--r--Utilities/cmcurl/lib/vtls/gtls.c12
-rw-r--r--Utilities/cmcurl/lib/vtls/mbedtls.c23
-rw-r--r--Utilities/cmcurl/lib/vtls/mbedtls.h2
-rw-r--r--Utilities/cmcurl/lib/vtls/mbedtls_threadlock.c (renamed from Utilities/cmcurl/lib/vtls/polarssl_threadlock.c)38
-rw-r--r--Utilities/cmcurl/lib/vtls/mbedtls_threadlock.h (renamed from Utilities/cmcurl/lib/vtls/polarssl_threadlock.h)28
-rw-r--r--Utilities/cmcurl/lib/vtls/mesalink.c71
-rw-r--r--Utilities/cmcurl/lib/vtls/nss.c51
-rw-r--r--Utilities/cmcurl/lib/vtls/openssl.c451
-rw-r--r--Utilities/cmcurl/lib/vtls/polarssl.c931
-rw-r--r--Utilities/cmcurl/lib/vtls/schannel.c22
-rw-r--r--Utilities/cmcurl/lib/vtls/schannel_verify.c177
-rw-r--r--Utilities/cmcurl/lib/vtls/sectransp.c37
-rw-r--r--Utilities/cmcurl/lib/vtls/vtls.c76
-rw-r--r--Utilities/cmcurl/lib/vtls/vtls.h9
-rw-r--r--Utilities/cmcurl/lib/vtls/wolfssl.c (renamed from Utilities/cmcurl/lib/vtls/cyassl.c)231
-rw-r--r--Utilities/cmcurl/lib/vtls/wolfssl.h (renamed from Utilities/cmcurl/lib/vtls/cyassl.h)14
-rw-r--r--Utilities/cmcurl/lib/x509asn1.c4
-rw-r--r--Utilities/cmcurl/lib/x509asn1.h6
-rw-r--r--Utilities/cmexpat/lib/siphash.h2
-rw-r--r--Utilities/cmlibarchive/CMakeLists.txt488
-rw-r--r--Utilities/cmlibarchive/COPYING9
-rw-r--r--Utilities/cmlibarchive/build/cmake/FindMbedTLS.cmake13
-rw-r--r--Utilities/cmlibarchive/build/cmake/config.h.in15
-rw-r--r--Utilities/cmlibarchive/build/version2
-rw-r--r--Utilities/cmlibarchive/libarchive/CMakeLists.txt40
-rw-r--r--Utilities/cmlibarchive/libarchive/archive.h12
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_acl.c88
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_acl_private.h6
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_blake2.h195
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_blake2_impl.h161
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_blake2s_ref.c367
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_blake2sp_ref.c359
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_cmdline_private.h6
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_crc32.h5
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_cryptor.c69
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_cryptor_private.h24
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_digest.c228
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_digest_private.h43
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_disk_acl_sunos.c6
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_endian.h11
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_entry.37
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_entry.c318
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_entry.h15
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_entry_acl.380
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_entry_locale.h6
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_entry_misc.363
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_entry_paths.310
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_entry_perms.312
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_entry_private.h9
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_entry_stat.36
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_entry_time.36
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_getdate.c151
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_getdate.h6
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_hmac.c51
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_hmac_private.h12
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_match.c33
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_openssl_evp_private.h5
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_openssl_hmac_private.h5
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_options_private.h4
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_pack_dev.h6
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_pathmatch.h6
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_platform.h2
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_platform_acl.h6
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_platform_xattr.h6
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_ppmd7.c2
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_ppmd7_private.h6
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_ppmd8.c1287
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_ppmd8_private.h148
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_ppmd_private.h6
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_private.h11
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_random_private.h6
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_rb.h21
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read.36
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read.c14
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_add_passphrase.310
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_data.34
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_disk.313
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_disk_entry_from_file.c11
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_disk_posix.c113
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_disk_private.h6
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_disk_windows.c182
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_extract.32
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_filter.34
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_format.36
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_free.36
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_header.32
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_new.32
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_open.34
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_open_file.c3
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_private.h9
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_set_format.c3
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_set_options.341
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_support_filter_bzip2.c2
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_support_filter_gzip.c72
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_support_filter_lz4.c10
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_support_filter_lzop.c2
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_support_filter_uu.c30
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_support_filter_xz.c2
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_support_filter_zstd.c2
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_support_format_7zip.c28
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_support_format_all.c1
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_support_format_ar.c9
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_support_format_by_code.c3
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_support_format_cab.c6
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_support_format_cpio.c3
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_support_format_iso9660.c19
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_support_format_lha.c206
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_support_format_mtree.c16
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_support_format_rar.c90
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_support_format_rar5.c4103
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_support_format_raw.c4
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_support_format_tar.c29
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_support_format_warc.c11
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_support_format_xar.c70
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_read_support_format_zip.c1085
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_string.c45
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_string.h6
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_string_composition.h6
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_util.316
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_util.c236
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_version_details.c8
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_windows.c3
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_windows.h13
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write.36
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write.c91
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_add_filter_b64encode.c12
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_add_filter_bzip2.c12
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_add_filter_compress.c22
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_add_filter_gzip.c11
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_add_filter_lz4.c11
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_add_filter_lzop.c10
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_add_filter_program.c12
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_add_filter_uuencode.c12
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_add_filter_xz.c18
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_add_filter_zstd.c14
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_blocksize.32
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_data.32
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_disk.312
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_disk_posix.c423
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_disk_private.h6
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_disk_set_standard_lookup.c6
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_disk_windows.c377
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_filter.34
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_finish_entry.32
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_format.34
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_free.34
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_header.32
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_new.32
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_open.34
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_private.h14
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_set_format.c45
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_set_format_7zip.c12
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_set_format_ar.c6
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_set_format_cpio.c4
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_set_format_cpio_newc.c4
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_set_format_gnutar.c20
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_set_format_iso9660.c34
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_set_format_mtree.c20
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_set_format_pax.c145
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_set_format_private.h42
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_set_format_shar.c11
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_set_format_ustar.c39
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_set_format_v7tar.c40
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_set_format_warc.c18
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_set_format_xar.c86
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_set_format_zip.c49
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_set_options.3285
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_write_set_passphrase.312
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_xxhash.h5
-rw-r--r--Utilities/cmlibarchive/libarchive/config_freebsd.h1
-rw-r--r--Utilities/cmlibarchive/libarchive/filter_fork.h6
-rw-r--r--Utilities/cmlibarchive/libarchive/libarchive_changes.35
-rw-r--r--Utilities/cmlibarchive/libarchive/libarchive_internals.34
-rw-r--r--Utilities/cmlibarchive/libarchive/mtree.57
-rw-r--r--Utilities/cmlibarchive/libarchive/tar.59
-rw-r--r--Utilities/cmlibrhash/CMakeLists.txt2
-rw-r--r--Utilities/cmlibrhash/COPYING22
-rw-r--r--Utilities/cmlibrhash/README7
-rw-r--r--Utilities/cmlibrhash/librhash/algorithms.c146
-rw-r--r--Utilities/cmlibrhash/librhash/algorithms.h49
-rw-r--r--Utilities/cmlibrhash/librhash/byte_order.c53
-rw-r--r--Utilities/cmlibrhash/librhash/byte_order.h147
-rw-r--r--Utilities/cmlibrhash/librhash/hex.c170
-rw-r--r--Utilities/cmlibrhash/librhash/hex.h13
-rw-r--r--Utilities/cmlibrhash/librhash/md5.c26
-rw-r--r--Utilities/cmlibrhash/librhash/md5.h6
-rw-r--r--Utilities/cmlibrhash/librhash/rhash.c320
-rw-r--r--Utilities/cmlibrhash/librhash/rhash.h393
-rw-r--r--Utilities/cmlibrhash/librhash/sha1.c26
-rw-r--r--Utilities/cmlibrhash/librhash/sha1.h6
-rw-r--r--Utilities/cmlibrhash/librhash/sha256.c30
-rw-r--r--Utilities/cmlibrhash/librhash/sha256.h8
-rw-r--r--Utilities/cmlibrhash/librhash/sha3.c108
-rw-r--r--Utilities/cmlibrhash/librhash/sha3.h14
-rw-r--r--Utilities/cmlibrhash/librhash/sha512.c30
-rw-r--r--Utilities/cmlibrhash/librhash/sha512.h8
-rw-r--r--Utilities/cmlibrhash/librhash/ustd.h34
-rw-r--r--Utilities/cmlibrhash/librhash/util.h2
-rw-r--r--Utilities/cmlibuv/include/uv.h139
-rw-r--r--Utilities/cmlibuv/include/uv/errno.h5
-rw-r--r--Utilities/cmlibuv/include/uv/unix.h22
-rw-r--r--Utilities/cmlibuv/include/uv/version.h6
-rw-r--r--Utilities/cmlibuv/include/uv/win.h3
-rw-r--r--Utilities/cmlibuv/src/random.c123
-rw-r--r--Utilities/cmlibuv/src/threadpool.c8
-rw-r--r--Utilities/cmlibuv/src/timer.c11
-rw-r--r--Utilities/cmlibuv/src/unix/aix-common.c142
-rw-r--r--Utilities/cmlibuv/src/unix/aix.c182
-rw-r--r--Utilities/cmlibuv/src/unix/android-ifaddrs.c3
-rw-r--r--Utilities/cmlibuv/src/unix/async.c115
-rw-r--r--Utilities/cmlibuv/src/unix/atomic-ops.h12
-rw-r--r--Utilities/cmlibuv/src/unix/bsd-ifaddrs.c2
-rw-r--r--Utilities/cmlibuv/src/unix/bsd-proctitle.c7
-rw-r--r--Utilities/cmlibuv/src/unix/cmake-bootstrap.c6
-rw-r--r--Utilities/cmlibuv/src/unix/core.c295
-rw-r--r--Utilities/cmlibuv/src/unix/cygwin.c5
-rw-r--r--Utilities/cmlibuv/src/unix/darwin-proctitle.c156
-rw-r--r--Utilities/cmlibuv/src/unix/darwin-stub.h97
-rw-r--r--Utilities/cmlibuv/src/unix/darwin.c17
-rw-r--r--Utilities/cmlibuv/src/unix/freebsd.c34
-rw-r--r--Utilities/cmlibuv/src/unix/fs.c430
-rw-r--r--Utilities/cmlibuv/src/unix/fsevents.c65
-rw-r--r--Utilities/cmlibuv/src/unix/haiku.c9
-rw-r--r--Utilities/cmlibuv/src/unix/ibmi.c264
-rw-r--r--Utilities/cmlibuv/src/unix/internal.h48
-rw-r--r--Utilities/cmlibuv/src/unix/kqueue.c44
-rw-r--r--Utilities/cmlibuv/src/unix/linux-core.c101
-rw-r--r--Utilities/cmlibuv/src/unix/linux-inotify.c67
-rw-r--r--Utilities/cmlibuv/src/unix/linux-syscalls.c214
-rw-r--r--Utilities/cmlibuv/src/unix/linux-syscalls.h80
-rw-r--r--Utilities/cmlibuv/src/unix/netbsd.c30
-rw-r--r--Utilities/cmlibuv/src/unix/no-proctitle.c3
-rw-r--r--Utilities/cmlibuv/src/unix/openbsd.c63
-rw-r--r--Utilities/cmlibuv/src/unix/os390-syscalls.c117
-rw-r--r--Utilities/cmlibuv/src/unix/os390-syscalls.h6
-rw-r--r--Utilities/cmlibuv/src/unix/os390.c9
-rw-r--r--Utilities/cmlibuv/src/unix/pipe.c8
-rw-r--r--Utilities/cmlibuv/src/unix/posix-poll.c2
-rw-r--r--Utilities/cmlibuv/src/unix/process.c80
-rw-r--r--Utilities/cmlibuv/src/unix/proctitle.c71
-rw-r--r--Utilities/cmlibuv/src/unix/random-devurandom.c93
-rw-r--r--Utilities/cmlibuv/src/unix/random-getentropy.c57
-rw-r--r--Utilities/cmlibuv/src/unix/random-getrandom.c88
-rw-r--r--Utilities/cmlibuv/src/unix/random-sysctl-linux.c99
-rw-r--r--Utilities/cmlibuv/src/unix/signal.c25
-rw-r--r--Utilities/cmlibuv/src/unix/stream.c13
-rw-r--r--Utilities/cmlibuv/src/unix/sunos.c10
-rw-r--r--Utilities/cmlibuv/src/unix/tcp.c29
-rw-r--r--Utilities/cmlibuv/src/unix/thread.c18
-rw-r--r--Utilities/cmlibuv/src/unix/tty.c37
-rw-r--r--Utilities/cmlibuv/src/unix/udp.c391
-rw-r--r--Utilities/cmlibuv/src/uv-common.c81
-rw-r--r--Utilities/cmlibuv/src/uv-common.h11
-rw-r--r--Utilities/cmlibuv/src/win/core.c21
-rw-r--r--Utilities/cmlibuv/src/win/error.c2
-rw-r--r--Utilities/cmlibuv/src/win/fs-event.c33
-rw-r--r--Utilities/cmlibuv/src/win/fs-fd-hash-inl.h178
-rw-r--r--Utilities/cmlibuv/src/win/fs.c906
-rw-r--r--Utilities/cmlibuv/src/win/internal.h2
-rw-r--r--Utilities/cmlibuv/src/win/pipe.c151
-rw-r--r--Utilities/cmlibuv/src/win/poll.c183
-rw-r--r--Utilities/cmlibuv/src/win/process.c13
-rw-r--r--Utilities/cmlibuv/src/win/signal.c5
-rw-r--r--Utilities/cmlibuv/src/win/stream.c7
-rw-r--r--Utilities/cmlibuv/src/win/tcp.c38
-rw-r--r--Utilities/cmlibuv/src/win/tty.c502
-rw-r--r--Utilities/cmlibuv/src/win/udp.c170
-rw-r--r--Utilities/cmlibuv/src/win/util.c293
-rw-r--r--Utilities/cmlibuv/src/win/winapi.c9
-rw-r--r--Utilities/cmlibuv/src/win/winapi.h21
-rw-r--r--Utilities/cmlibuv/src/win/winsock.c47
-rw-r--r--Utilities/cmlibuv/src/win/winsock.h8
-rw-r--r--Utilities/cmnghttp2/.gitattributes1
-rw-r--r--Utilities/cmnghttp2/CMakeLists.txt52
-rw-r--r--Utilities/cmnghttp2/COPYING23
-rw-r--r--Utilities/cmnghttp2/cmakeconfig.h.in18
-rw-r--r--Utilities/cmnghttp2/lib/includes/nghttp2/nghttp2.h5487
-rw-r--r--Utilities/cmnghttp2/lib/includes/nghttp2/nghttp2ver.h42
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_buf.c525
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_buf.h412
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_callbacks.c175
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_callbacks.h125
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_debug.c60
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_debug.h43
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_frame.c1134
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_frame.h624
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_hd.c2351
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_hd.h439
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_hd_huffman.c144
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_hd_huffman.h72
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_hd_huffman_data.c4980
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_helper.c629
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_helper.h122
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_http.c530
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_http.h97
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_int.h58
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_map.c189
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_map.h144
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_mem.c74
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_mem.h45
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_net.h91
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_npn.c57
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_npn.h34
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_option.c123
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_option.h131
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_outbound_item.c127
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_outbound_item.h166
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_pq.c184
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_pq.h130
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_priority_spec.c52
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_priority_spec.h42
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_queue.c85
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_queue.h51
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_rcbuf.c102
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_rcbuf.h80
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_session.c7780
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_session.h901
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_stream.c1001
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_stream.h437
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_submit.c814
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_submit.h34
-rw-r--r--Utilities/cmnghttp2/lib/nghttp2_version.c38
-rw-r--r--Utilities/cmzlib/CMakeLists.txt5
-rw-r--r--Utilities/std/CMakeLists.txt7
-rw-r--r--Utilities/std/cm/bits/string_view.cxx2
-rw-r--r--Utilities/std/cm/shared_mutex2
-rw-r--r--Utilities/std/cmext/algorithm92
-rw-r--r--Utilities/std/cmext/iterator20
-rw-r--r--Utilities/std/cmext/string_view (renamed from Source/cm_static_string_view.hxx)9
-rw-r--r--Utilities/std/cmext/type_traits2
-rwxr-xr-xbootstrap149
2167 files changed, 90623 insertions, 176874 deletions
diff --git a/.clang-format b/.clang-format
index 4bfce44..8c015ef 100644
--- a/.clang-format
+++ b/.clang-format
@@ -32,16 +32,18 @@ IncludeCategories:
Priority: 5
- Regex: '^(<|")Qt?[A-Z]'
Priority: 6
- - Regex: '^(<|")cmsys/'
+ - Regex: '^<cmtp/'
Priority: 7
- - Regex: '^(<|")cm_'
+ - Regex: '^(<|")cmsys/'
Priority: 8
- - Regex: '^(<|")cm[A-Z][^.]+\.h'
+ - Regex: '^(<|")cm_'
Priority: 9
+ - Regex: '^(<|")cm[A-Z][^.]+\.h'
+ Priority: 10
- Regex: '^<[^.]+\.h'
Priority: 4
- Regex: '^<'
Priority: 1
- Regex: '.*'
- Priority: 10
+ Priority: 11
...
diff --git a/.clang-tidy b/.clang-tidy
index a520679..10819ef 100644
--- a/.clang-tidy
+++ b/.clang-tidy
@@ -13,9 +13,11 @@ modernize-*,\
-modernize-avoid-c-arrays,\
-modernize-use-nodiscard,\
-modernize-use-noexcept,\
+-modernize-use-trailing-return-type,\
-modernize-use-transparent-functors,\
performance-*,\
readability-*,\
+-readability-convert-member-functions-to-static,\
-readability-function-size,\
-readability-identifier-naming,\
-readability-implicit-bool-conversion,\
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000..0a55ca3
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,125 @@
+.only_settings: &only_settings
+ - merge_requests
+ - branches@cmake/cmake
+ - tags@cmake/cmake
+
+.fedora31: &fedora31
+ image: "kitware/cmake:ci-fedora31-x86_64-2020-05-05"
+
+ variables:
+ GIT_CLONE_PATH: "$CI_BUILDS_DIR/gitlab-kitware-cmake ci"
+
+.debian10: &debian10
+ image: "kitware/cmake:ci-debian10-x86_64-2020-04-27"
+
+ variables:
+ GIT_CLONE_PATH: "$CI_BUILDS_DIR/gitlab-kitware-cmake ci"
+
+.debian10_iwyu: &debian10_iwyu
+ extends: .debian10
+
+ variables:
+ CMAKE_CONFIGURATION: debian10_iwyu
+ CTEST_NO_WARNINGS_ALLOWED: 1
+
+.fedora31_tidy: &fedora31_tidy
+ extends: .fedora31
+
+ variables:
+ CMAKE_CONFIGURATION: fedora31_tidy
+ CTEST_NO_WARNINGS_ALLOWED: 1
+
+.fedora31_sphinx: &fedora31_sphinx
+ extends: .fedora31
+
+ variables:
+ CMAKE_CONFIGURATION: fedora31_sphinx
+ CTEST_NO_WARNINGS_ALLOWED: 1
+ CTEST_SOURCE_SUBDIRECTORY: "Utilities/Sphinx"
+
+before_script:
+ - .gitlab/ci/cmake.sh
+ - .gitlab/ci/ninja.sh
+ - export PATH=$PWD/.gitlab:$PWD/.gitlab/cmake/bin:$PATH
+ - cmake --version
+ - ninja --version
+
+.cmake_build_unix: &cmake_build_unix
+ stage: build
+ only: *only_settings
+ tags:
+ - build
+ - docker
+ - linux
+
+ script:
+ - .gitlab/ci/sccache.sh
+ - sccache --start-server
+ - sccache --show-stats
+ - "$LAUNCHER ctest -VV -S .gitlab/ci/ctest_configure.cmake"
+ - "$LAUNCHER ctest -VV -S .gitlab/ci/ctest_build.cmake"
+ - sccache --show-stats
+
+ interruptible: true
+
+stages:
+ - build
+ - test
+
+build:debian10-iwyu:
+ <<:
+ - *debian10_iwyu
+ stage: build
+ only: *only_settings
+ tags:
+ - build
+ - docker
+ - linux
+
+ script:
+ - .gitlab/ci/sccache.sh
+ - sccache --start-server
+ - sccache --show-stats
+ - "$LAUNCHER ctest -VV -S .gitlab/ci/ctest_configure.cmake"
+ - "$LAUNCHER ctest -VV -S .gitlab/ci/ctest_build.cmake"
+ - sccache --show-stats
+ interruptible: true
+
+build:fedora31-tidy:
+ <<:
+ - *fedora31_tidy
+ stage: build
+ only: *only_settings
+ tags:
+ - build
+ - docker
+ - linux
+
+ script:
+ - .gitlab/ci/sccache.sh
+ - sccache --start-server
+ - sccache --show-stats
+ - "$LAUNCHER ctest -VV -S .gitlab/ci/ctest_configure.cmake"
+ - "$LAUNCHER ctest -VV -S .gitlab/ci/ctest_build.cmake"
+ - sccache --show-stats
+ interruptible: true
+
+build:fedora31-sphinx:
+ <<:
+ - *fedora31_sphinx
+ stage: build
+ only: *only_settings
+ tags:
+ - build
+ - docker
+ - linux
+ - linux-3.17 # Needed to be able to load Fedora's Qt libraries.
+
+ script:
+ - .gitlab/ci/sccache.sh
+ - sccache --start-server
+ - sccache --show-stats
+ - "$LAUNCHER ctest -VV -S .gitlab/ci/ctest_configure.cmake"
+ - "$LAUNCHER ctest -VV -S .gitlab/ci/ctest_build.cmake"
+ - sccache --show-stats
+ interruptible: true
diff --git a/.gitlab/ci/cmake.sh b/.gitlab/ci/cmake.sh
new file mode 100755
index 0000000..4b2f53f
--- /dev/null
+++ b/.gitlab/ci/cmake.sh
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+set -e
+
+readonly version="3.17.2"
+readonly sha256sum="dc57f3cc448ca67fc8776b4ad4c22b087b9c6a8e459938b9622b8c7f4ef6b21e"
+readonly filename="cmake-$version-Linux-x86_64"
+readonly tarball="$filename.tar.gz"
+
+cd .gitlab
+
+echo "$sha256sum $tarball" > cmake.sha256sum
+curl -OL "https://github.com/Kitware/CMake/releases/download/v$version/$tarball"
+sha256sum --check cmake.sha256sum
+tar xf "$tarball"
+mv "$filename" cmake
diff --git a/.gitlab/ci/configure_common.cmake b/.gitlab/ci/configure_common.cmake
new file mode 100644
index 0000000..fc2aaae
--- /dev/null
+++ b/.gitlab/ci/configure_common.cmake
@@ -0,0 +1,3 @@
+set(CTEST_USE_LAUNCHERS "ON" CACHE STRING "")
+
+include("${CMAKE_CURRENT_LIST_DIR}/configure_sccache.cmake")
diff --git a/.gitlab/ci/configure_debian10_iwyu.cmake b/.gitlab/ci/configure_debian10_iwyu.cmake
new file mode 100644
index 0000000..1daa581
--- /dev/null
+++ b/.gitlab/ci/configure_debian10_iwyu.cmake
@@ -0,0 +1,4 @@
+set(CMake_RUN_IWYU ON CACHE BOOL "")
+set(IWYU_COMMAND "/usr/bin/include-what-you-use-6.0" CACHE FILEPATH "")
+
+include("${CMAKE_CURRENT_LIST_DIR}/configure_common.cmake")
diff --git a/.gitlab/ci/configure_fedora31_sphinx.cmake b/.gitlab/ci/configure_fedora31_sphinx.cmake
new file mode 100644
index 0000000..dfc9b8c
--- /dev/null
+++ b/.gitlab/ci/configure_fedora31_sphinx.cmake
@@ -0,0 +1,8 @@
+set(SPHINX_INFO ON CACHE BOOL "")
+set(SPHINX_MAN ON CACHE BOOL "")
+set(SPHINX_HTML ON CACHE BOOL "")
+set(SPHINX_SINGLEHTML ON CACHE BOOL "")
+set(SPHINX_QTHELP ON CACHE BOOL "")
+set(SPHINX_TEXT ON CACHE BOOL "")
+
+include("${CMAKE_CURRENT_LIST_DIR}/configure_common.cmake")
diff --git a/.gitlab/ci/configure_fedora31_tidy.cmake b/.gitlab/ci/configure_fedora31_tidy.cmake
new file mode 100644
index 0000000..f41ad82
--- /dev/null
+++ b/.gitlab/ci/configure_fedora31_tidy.cmake
@@ -0,0 +1,3 @@
+set(CMake_RUN_CLANG_TIDY ON CACHE BOOL "")
+
+include("${CMAKE_CURRENT_LIST_DIR}/configure_common.cmake")
diff --git a/.gitlab/ci/configure_sccache.cmake b/.gitlab/ci/configure_sccache.cmake
new file mode 100644
index 0000000..261bb28
--- /dev/null
+++ b/.gitlab/ci/configure_sccache.cmake
@@ -0,0 +1,2 @@
+set(CMAKE_C_COMPILER_LAUNCHER "sccache" CACHE STRING "")
+set(CMAKE_CXX_COMPILER_LAUNCHER "sccache" CACHE STRING "")
diff --git a/.gitlab/ci/ctest_build.cmake b/.gitlab/ci/ctest_build.cmake
new file mode 100644
index 0000000..28bdb35
--- /dev/null
+++ b/.gitlab/ci/ctest_build.cmake
@@ -0,0 +1,30 @@
+cmake_minimum_required(VERSION 3.8)
+
+include("${CMAKE_CURRENT_LIST_DIR}/gitlab_ci.cmake")
+
+# Read the files from the build directory.
+ctest_read_custom_files("${CTEST_BINARY_DIRECTORY}")
+
+# Pick up from where the configure left off.
+ctest_start(APPEND)
+
+if (CTEST_CMAKE_GENERATOR STREQUAL "Unix Makefiles")
+ include(ProcessorCount)
+ ProcessorCount(nproc)
+ set(CTEST_BUILD_FLAGS "-j${nproc}")
+endif ()
+
+ctest_build(
+ NUMBER_WARNINGS num_warnings
+ RETURN_VALUE build_result)
+ctest_submit(PARTS Build)
+
+if (build_result)
+ message(FATAL_ERROR
+ "Failed to build")
+endif ()
+
+if ("$ENV{CTEST_NO_WARNINGS_ALLOWED}" AND num_warnings GREATER 0)
+ message(FATAL_ERROR
+ "Found ${num_warnings} warnings (treating as fatal).")
+endif ()
diff --git a/.gitlab/ci/ctest_configure.cmake b/.gitlab/ci/ctest_configure.cmake
new file mode 100644
index 0000000..55cad13
--- /dev/null
+++ b/.gitlab/ci/ctest_configure.cmake
@@ -0,0 +1,32 @@
+cmake_minimum_required(VERSION 3.8)
+
+include("${CMAKE_CURRENT_LIST_DIR}/gitlab_ci.cmake")
+
+set(cmake_args
+ -C "${CMAKE_CURRENT_LIST_DIR}/configure_$ENV{CMAKE_CONFIGURATION}.cmake")
+
+# Create an entry in CDash.
+ctest_start(Experimental TRACK "${ctest_track}")
+
+# Gather update information.
+find_package(Git)
+set(CTEST_UPDATE_VERSION_ONLY ON)
+set(CTEST_UPDATE_COMMAND "${GIT_EXECUTABLE}")
+ctest_update()
+
+# Configure the project.
+ctest_configure(
+ OPTIONS "${cmake_args}"
+ RETURN_VALUE configure_result)
+
+# Read the files from the build directory.
+ctest_read_custom_files("${CTEST_BINARY_DIRECTORY}")
+
+# We can now submit because we've configured. This is a cmb-superbuild-ism.
+ctest_submit(PARTS Update)
+ctest_submit(PARTS Configure)
+
+if (configure_result)
+ message(FATAL_ERROR
+ "Failed to configure")
+endif ()
diff --git a/.gitlab/ci/ctest_exclusions.cmake b/.gitlab/ci/ctest_exclusions.cmake
new file mode 100644
index 0000000..5bb03ca
--- /dev/null
+++ b/.gitlab/ci/ctest_exclusions.cmake
@@ -0,0 +1,6 @@
+set(test_exclusions
+)
+string(REPLACE ";" "|" test_exclusions "${test_exclusions}")
+if (test_exclusions)
+ set(test_exclusions "(${test_exclusions})")
+endif ()
diff --git a/.gitlab/ci/ctest_test.cmake b/.gitlab/ci/ctest_test.cmake
new file mode 100644
index 0000000..569139d
--- /dev/null
+++ b/.gitlab/ci/ctest_test.cmake
@@ -0,0 +1,24 @@
+cmake_minimum_required(VERSION 3.8)
+
+include("${CMAKE_CURRENT_LIST_DIR}/gitlab_ci.cmake")
+
+# Read the files from the build directory.
+ctest_read_custom_files("${CTEST_BINARY_DIRECTORY}")
+
+# Pick up from where the configure left off.
+ctest_start(APPEND)
+
+include(ProcessorCount)
+ProcessorCount(nproc)
+
+include("${CMAKE_CURRENT_LIST_DIR}/ctest_exclusions.cmake")
+ctest_test(
+ PARALLEL_LEVEL "${nproc}"
+ RETURN_VALUE test_result
+ EXCLUDE "${test_exclusions}")
+ctest_submit(PARTS Test)
+
+if (test_result)
+ message(FATAL_ERROR
+ "Failed to test")
+endif ()
diff --git a/.gitlab/ci/docker/debian10/Dockerfile b/.gitlab/ci/docker/debian10/Dockerfile
new file mode 100644
index 0000000..e8c3851
--- /dev/null
+++ b/.gitlab/ci/docker/debian10/Dockerfile
@@ -0,0 +1,15 @@
+FROM debian:10 as iwyu-build
+MAINTAINER Ben Boeckel <ben.boeckel@kitware.com>
+
+COPY install_iwyu.sh /root/install_iwyu.sh
+RUN sh /root/install_iwyu.sh
+
+FROM debian:10
+MAINTAINER Ben Boeckel <ben.boeckel@kitware.com>
+
+COPY install_deps.sh /root/install_deps.sh
+RUN sh /root/install_deps.sh
+
+COPY --from=iwyu-build /root/iwyu.tar.gz /root/iwyu.tar.gz
+RUN tar -C / -xf /root/iwyu.tar.gz
+RUN ln -s /usr/lib/llvm-6.0/bin/include-what-you-use /usr/bin/include-what-you-use-6.0
diff --git a/.gitlab/ci/docker/debian10/install_deps.sh b/.gitlab/ci/docker/debian10/install_deps.sh
new file mode 100755
index 0000000..9c32d64
--- /dev/null
+++ b/.gitlab/ci/docker/debian10/install_deps.sh
@@ -0,0 +1,22 @@
+#!/bin/sh
+
+set -e
+
+apt-get update
+
+# Install build requirements.
+apt-get install -y \
+ libssl-dev
+
+# Install development tools.
+apt-get install -y \
+ g++ \
+ curl \
+ git
+
+# Install iwyu runtime deps.
+apt-get install -y \
+ clang-6.0 \
+ libncurses6
+
+apt-get clean
diff --git a/.gitlab/ci/docker/debian10/install_iwyu.sh b/.gitlab/ci/docker/debian10/install_iwyu.sh
new file mode 100755
index 0000000..54d26ef
--- /dev/null
+++ b/.gitlab/ci/docker/debian10/install_iwyu.sh
@@ -0,0 +1,32 @@
+#!/bin/sh
+
+set -e
+
+# Install development tools.
+apt-get update
+apt-get install -y \
+ clang-6.0 \
+ libclang-6.0-dev \
+ llvm-6.0-dev \
+ libz-dev \
+ g++ \
+ cmake \
+ ninja-build \
+ git
+
+cd /root
+git clone "https://github.com/include-what-you-use/include-what-you-use.git"
+cd include-what-you-use
+readonly llvm_version="$( clang-6.0 --version | head -n1 | cut -d' ' -f3 | cut -d. -f-2 )"
+git checkout "clang_$llvm_version"
+mkdir build
+cd build
+
+cmake -GNinja \
+ -DCMAKE_BUILD_TYPE=Release \
+ "-DCMAKE_INSTALL_PREFIX=/usr/lib/llvm-$llvm_version" \
+ "-DIWYU_LLVM_ROOT_PATH=/usr/lib/llvm-$llvm_version" \
+ ..
+ninja
+DESTDIR=/root/iwyu-destdir ninja install
+tar -C /root/iwyu-destdir -cf /root/iwyu.tar.gz .
diff --git a/.gitlab/ci/docker/fedora31/Dockerfile b/.gitlab/ci/docker/fedora31/Dockerfile
new file mode 100644
index 0000000..5588a85
--- /dev/null
+++ b/.gitlab/ci/docker/fedora31/Dockerfile
@@ -0,0 +1,5 @@
+FROM fedora:31
+MAINTAINER Ben Boeckel <ben.boeckel@kitware.com>
+
+COPY install_deps.sh /root/install_deps.sh
+RUN sh /root/install_deps.sh
diff --git a/.gitlab/ci/docker/fedora31/install_deps.sh b/.gitlab/ci/docker/fedora31/install_deps.sh
new file mode 100755
index 0000000..7f8da57
--- /dev/null
+++ b/.gitlab/ci/docker/fedora31/install_deps.sh
@@ -0,0 +1,19 @@
+#!/bin/sh
+
+# Install build requirements.
+dnf install -y \
+ openssl-devel
+
+# Install development tools.
+dnf install --setopt=install_weak_deps=False -y \
+ clang-tools-extra \
+ gcc-c++ \
+ git-core
+
+# Install documentation tools.
+dnf install --setopt=install_weak_deps=False -y \
+ python3-sphinx \
+ texinfo \
+ qt5-qttools-devel
+
+dnf clean all
diff --git a/.gitlab/ci/gitlab_ci.cmake b/.gitlab/ci/gitlab_ci.cmake
new file mode 100644
index 0000000..b49f51d
--- /dev/null
+++ b/.gitlab/ci/gitlab_ci.cmake
@@ -0,0 +1,49 @@
+if (NOT DEFINED "ENV{GITLAB_CI}")
+ message(FATAL_ERROR
+ "This script assumes it is being run inside of GitLab-CI")
+endif ()
+
+# Set up the source and build paths.
+set(CTEST_SOURCE_DIRECTORY "$ENV{CI_PROJECT_DIR}")
+if (NOT "$ENV{CTEST_SOURCE_SUBDIRECTORY}" STREQUAL "")
+ string(APPEND CTEST_SOURCE_DIRECTORY "/$ENV{CTEST_SOURCE_SUBDIRECTORY}")
+endif ()
+set(CTEST_BINARY_DIRECTORY "${CTEST_SOURCE_DIRECTORY}/build")
+
+if ("$ENV{CMAKE_CONFIGURATION}" STREQUAL "")
+ message(FATAL_ERROR
+ "The CMAKE_CONFIGURATION environment variable is required to know what "
+ "cache initialization file to use.")
+endif ()
+
+# Set the build metadata.
+set(CTEST_BUILD_NAME "$ENV{CI_PROJECT_NAME}-$ENV{CMAKE_CONFIGURATION}")
+set(CTEST_SITE "gitlab-ci")
+
+# Default to Release builds.
+if (NOT "$ENV{CMAKE_BUILD_TYPE}" STREQUAL "")
+ set(CTEST_BUILD_CONFIGURATION "$ENV{CMAKE_BUILD_TYPE}")
+endif ()
+if (NOT CTEST_BUILD_CONFIGURATION)
+ set(CTEST_BUILD_CONFIGURATION "Release")
+endif ()
+
+# Default to using Ninja.
+if (NOT "$ENV{CMAKE_GENERATOR}" STREQUAL "")
+ set(CTEST_CMAKE_GENERATOR "$ENV{CMAKE_GENERATOR}")
+endif ()
+if (NOT CTEST_CMAKE_GENERATOR)
+ set(CTEST_CMAKE_GENERATOR "Ninja")
+endif ()
+
+# Determine the track to submit to.
+set(ctest_track "Experimental")
+if (NOT "$ENV{CI_MERGE_REQUEST_ID}" STREQUAL "")
+ set(ctest_track "merge-requests")
+elseif ("$ENV{CI_PROJECT_PATH}" STREQUAL "cmb/smtk")
+ if ("$ENV{CI_COMMIT_REF_NAME}" STREQUAL "master")
+ set(ctest_track "master")
+ elseif ("$ENV{CI_COMMIT_REF_NAME}" STREQUAL "release")
+ set(ctest_track "release")
+ endif ()
+endif ()
diff --git a/.gitlab/ci/ninja.sh b/.gitlab/ci/ninja.sh
new file mode 100755
index 0000000..31da12b
--- /dev/null
+++ b/.gitlab/ci/ninja.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+set -e
+
+readonly version="1.10.0"
+readonly sha256sum="6566836ddf3d72ca06685b34814e0c6fa0f0943542d651d0dab3150f10307c82"
+readonly filename="ninja-linux"
+readonly tarball="$filename.zip"
+
+cd .gitlab
+
+echo "$sha256sum $tarball" > ninja.sha256sum
+curl -OL "https://github.com/ninja-build/ninja/releases/download/v$version/$tarball"
+sha256sum --check ninja.sha256sum
+./cmake/bin/cmake -E tar xf "$tarball"
diff --git a/.gitlab/ci/sccache.sh b/.gitlab/ci/sccache.sh
new file mode 100755
index 0000000..c88cdcc
--- /dev/null
+++ b/.gitlab/ci/sccache.sh
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+set -e
+
+readonly version="0.2.12"
+readonly sha256sum="26fd04c1273952cc2a0f359a71c8a1857137f0ee3634058b3f4a63b69fc8eb7f"
+readonly filename="sccache-$version-x86_64-unknown-linux-musl"
+readonly tarball="$filename.tar.gz"
+
+cd .gitlab
+
+echo "$sha256sum $tarball" > sccache.sha256sum
+curl -OL "https://github.com/mozilla/sccache/releases/download/$version/$tarball"
+sha256sum --check sccache.sha256sum
+tar xf "$tarball"
+mv "$filename/sccache" .
diff --git a/Auxiliary/CMakeLists.txt b/Auxiliary/CMakeLists.txt
index 53cf2c5..a833c79 100644
--- a/Auxiliary/CMakeLists.txt
+++ b/Auxiliary/CMakeLists.txt
@@ -1,4 +1,4 @@
-install(DIRECTORY vim/indent vim/syntax DESTINATION ${CMAKE_DATA_DIR}/editors/vim)
-install(FILES cmake-mode.el DESTINATION ${CMAKE_DATA_DIR}/editors/emacs)
+install(DIRECTORY vim/indent vim/syntax DESTINATION ${CMAKE_XDGDATA_DIR}/vim/vimfiles)
+install(FILES cmake-mode.el DESTINATION ${CMAKE_XDGDATA_DIR}/emacs/site-lisp)
install(FILES cmake.m4 DESTINATION ${CMAKE_XDGDATA_DIR}/aclocal)
add_subdirectory (bash-completion)
diff --git a/Auxiliary/bash-completion/CMakeLists.txt b/Auxiliary/bash-completion/CMakeLists.txt
index c0a8899..06d22c2 100644
--- a/Auxiliary/bash-completion/CMakeLists.txt
+++ b/Auxiliary/bash-completion/CMakeLists.txt
@@ -1,8 +1,16 @@
-# Always install completion file in local dir
-# in order to be sure to always be able to install
-# in a local user directory rooted in a single directory.
-# packager should either patch that out or
-# add symlinks to the files in appropriate places
-# /etc/bash_completion.d/
-# DATADIR/completions (may be /usr/share/<package>/completions
-install(FILES cmake cpack ctest DESTINATION ${CMAKE_DATA_DIR}/completions)
+# We need to integrate into the system install, or this will silently fail to
+# accomplish anything at all, and packagers won't even know it exists. Use the
+# `<sharedir>/bash-completion/completions/` hierarchy by default, rooted in
+# CMake's XDGDATA_DIR definition of the sharedir. This works with installation
+# to `/usr` or `/usr/local` (or any prefix which bash-completion is configured
+# with) as well as a simple installation by a local user into their home
+# directory *if* the prefix is `$HOME/.local` since `.local/share/` is part of
+# the bash-completion search path too.
+# For more complex installations, packagers can set CMAKE_BASH_COMP_DIR to
+# another system location.
+
+set(CMAKE_BASH_COMP_DIR_DEFAULT ${CMAKE_XDGDATA_DIR}/bash-completion/completions)
+if (NOT CMAKE_BASH_COMP_DIR)
+ set(CMAKE_BASH_COMP_DIR "${CMAKE_BASH_COMP_DIR_DEFAULT}")
+endif()
+install(FILES cmake cpack ctest DESTINATION ${CMAKE_BASH_COMP_DIR})
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0d6a38c..e6aaf60 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -154,7 +154,7 @@ macro(CMAKE_HANDLE_SYSTEM_LIBRARIES)
# Allow the user to enable/disable all system utility library options by
# defining CMAKE_USE_SYSTEM_LIBRARIES or CMAKE_USE_SYSTEM_LIBRARY_${util}.
- set(UTILITIES BZIP2 CURL EXPAT FORM JSONCPP LIBARCHIVE LIBLZMA LIBRHASH LIBUV ZLIB ZSTD)
+ set(UTILITIES BZIP2 CURL EXPAT FORM JSONCPP LIBARCHIVE LIBLZMA LIBRHASH LIBUV NGHTTP2 ZLIB ZSTD)
foreach(util ${UTILITIES})
if(NOT DEFINED CMAKE_USE_SYSTEM_LIBRARY_${util}
AND DEFINED CMAKE_USE_SYSTEM_LIBRARIES)
@@ -192,6 +192,8 @@ macro(CMAKE_HANDLE_SYSTEM_LIBRARIES)
"${CMAKE_USE_SYSTEM_LIBRARY_ZSTD}" "NOT CMAKE_USE_SYSTEM_LIBARCHIVE" ON)
CMAKE_DEPENDENT_OPTION(CMAKE_USE_SYSTEM_LIBLZMA "Use system-installed liblzma"
"${CMAKE_USE_SYSTEM_LIBRARY_LIBLZMA}" "NOT CMAKE_USE_SYSTEM_LIBARCHIVE" ON)
+ CMAKE_DEPENDENT_OPTION(CMAKE_USE_SYSTEM_NGHTTP2 "Use system-installed nghttp2"
+ "${CMAKE_USE_SYSTEM_LIBRARY_NGHTTP2}" "NOT CMAKE_USE_SYSTEM_CURL" ON)
option(CMAKE_USE_SYSTEM_FORM "Use system-installed libform" "${CMAKE_USE_SYSTEM_LIBRARY_FORM}")
option(CMAKE_USE_SYSTEM_JSONCPP "Use system-installed jsoncpp" "${CMAKE_USE_SYSTEM_LIBRARY_JSONCPP}")
option(CMAKE_USE_SYSTEM_LIBRHASH "Use system-installed librhash" "${CMAKE_USE_SYSTEM_LIBRARY_LIBRHASH}")
@@ -374,10 +376,13 @@ macro (CMAKE_BUILD_UTILITIES)
include_directories(SYSTEM "${CMake_SOURCE_DIR}/Utilities/std")
endif()
- include_directories(
- ${CMake_BINARY_DIR}/Utilities
- ${CMake_SOURCE_DIR}/Utilities
- )
+ include_directories("${CMake_BINARY_DIR}/Utilities")
+ if ((CMAKE_SYSTEM_NAME STREQUAL "AIX" OR CMAKE_SYSTEM_NAME STREQUAL "OS400") AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+ # using -isystem option generate error "template with C linkage"
+ include_directories("${CMake_SOURCE_DIR}/Utilities")
+ else()
+ include_directories(SYSTEM "${CMake_SOURCE_DIR}/Utilities")
+ endif()
#---------------------------------------------------------------------
# Build CMake std library for CMake and CTest.
@@ -465,9 +470,19 @@ macro (CMAKE_BUILD_UTILITIES)
set(CURL_CA_PATH "" CACHE PATH "Path to SSL CA Certificate Directory")
mark_as_advanced(CURL_CA_BUNDLE CURL_CA_PATH)
endif()
+ if(NOT CMAKE_USE_SYSTEM_NGHTTP2)
+ # Tell curl's FindNGHTTP2 module to use our library.
+ set(NGHTTP2_LIBRARY cmnghttp2)
+ set(NGHTTP2_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/Utilities/cmnghttp2/lib/includes)
+ endif()
add_subdirectory(Utilities/cmcurl)
CMAKE_SET_TARGET_FOLDER(cmcurl "Utilities/3rdParty")
CMAKE_SET_TARGET_FOLDER(LIBCURL "Utilities/3rdParty")
+ if(NOT CMAKE_USE_SYSTEM_NGHTTP2)
+ # Configure after curl to re-use some check results.
+ add_subdirectory(Utilities/cmnghttp2)
+ CMAKE_SET_TARGET_FOLDER(cmnghttp2 "Utilities/3rdParty")
+ endif()
endif()
#---------------------------------------------------------------------
@@ -547,21 +562,25 @@ macro (CMAKE_BUILD_UTILITIES)
set(ZLIB_INCLUDE_DIR ${CMAKE_ZLIB_INCLUDES})
set(ZLIB_LIBRARY ${CMAKE_ZLIB_LIBRARIES})
add_definitions(-DLIBARCHIVE_STATIC)
+ set(ENABLE_MBEDTLS OFF CACHE INTERNAL "Enable use of mbed TLS")
set(ENABLE_NETTLE OFF CACHE INTERNAL "Enable use of Nettle")
set(ENABLE_OPENSSL ${CMAKE_USE_OPENSSL} CACHE INTERNAL "Enable use of OpenSSL")
+ set(ENABLE_LIBB2 OFF CACHE INTERNAL "Enable the use of the system LIBB2 library if found")
set(ENABLE_LZMA ON CACHE INTERNAL "Enable the use of the system LZMA library if found")
set(ENABLE_LZ4 OFF CACHE INTERNAL "Enable the use of the system LZ4 library if found")
set(ENABLE_LZO OFF CACHE INTERNAL "Enable the use of the system LZO library if found")
set(ENABLE_ZLIB ON CACHE INTERNAL "Enable the use of the system ZLIB library if found")
set(ENABLE_BZip2 ON CACHE INTERNAL "Enable the use of the system BZip2 library if found")
+ set(ENABLE_ZSTD ON CACHE INTERNAL "Enable the use of the system zstd library if found")
set(ENABLE_LIBXML2 OFF CACHE INTERNAL "Enable the use of the system libxml2 library if found")
- set(ENABLE_EXPAT ON CACHE INTERNAL "Enable the use of the system EXPAT library if found")
+ set(ENABLE_EXPAT OFF CACHE INTERNAL "Enable the use of the system EXPAT library if found")
set(ENABLE_PCREPOSIX OFF CACHE INTERNAL "Enable the use of the system PCREPOSIX library if found")
set(ENABLE_LibGCC OFF CACHE INTERNAL "Enable the use of the system LibGCC library if found")
set(ENABLE_XATTR OFF CACHE INTERNAL "Enable extended attribute support")
set(ENABLE_ACL OFF CACHE INTERNAL "Enable ACL support")
set(ENABLE_ICONV OFF CACHE INTERNAL "Enable iconv support")
set(ENABLE_CNG OFF CACHE INTERNAL "Enable the use of CNG(Crypto Next Generation)")
+ SET(POSIX_REGEX_LIB "" CACHE INTERNAL "Choose what library should provide POSIX regular expression support")
add_subdirectory(Utilities/cmlibarchive)
CMAKE_SET_TARGET_FOLDER(cmlibarchive "Utilities/3rdParty")
set(CMAKE_TAR_LIBRARIES cmlibarchive ${BZIP2_LIBRARIES})
diff --git a/CTestConfig.cmake b/CTestConfig.cmake
index 020582e..9ec9e8f 100644
--- a/CTestConfig.cmake
+++ b/CTestConfig.cmake
@@ -1,6 +1,8 @@
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.
+# If changing this file, also update Utilities/Sphinx/CTestConfig.cmake
+
set(CTEST_PROJECT_NAME "CMake")
set(CTEST_NIGHTLY_START_TIME "1:00:00 UTC")
diff --git a/CTestCustom.cmake.in b/CTestCustom.cmake.in
index fb8e099..5b78f2e 100644
--- a/CTestCustom.cmake.in
+++ b/CTestCustom.cmake.in
@@ -64,6 +64,7 @@ list(APPEND CTEST_CUSTOM_WARNING_EXCEPTION
"ld: warning .*/libgcc.a archive's cputype"
"ld: warning: ignoring file .*/libgcc.a, file was built for archive which is not the architecture being linked"
"ld: warning: in .*/libgcc.a, file is not of required architecture"
+ "ld: warning: symbol .(deflate|inflate)_copyright. has differing sizes" # system libz and QtCore disagree
"warning.*This version of Mac OS X is unsupported"
"clang.*: warning: argument unused during compilation: .-g"
"note: in expansion of macro" # diagnostic context note
@@ -80,7 +81,7 @@ list(APPEND CTEST_CUSTOM_WARNING_EXCEPTION
"compilation completed with warnings" # PGI
"[0-9]+ Warning\\(s\\) detected" # SunPro
-# scanbuild exceptions
+ # scanbuild exceptions
"char_traits.h:.*: warning: Null pointer argument in call to string length function"
"stl_construct.h:.*: warning: Forming reference to null pointer"
".*stl_uninitialized.h:75:19: warning: Forming reference to null pointer.*"
@@ -99,6 +100,9 @@ list(APPEND CTEST_CUSTOM_WARNING_EXCEPTION
"liblzma/common/index_encoder.c:[0-9]+:[0-9]+: warning: Value stored to .* during its initialization is never read"
"libuv/src/.*:[0-9]+:[0-9]+: warning: Dereference of null pointer"
"libuv/src/.*:[0-9]+:[0-9]+: warning: The left operand of '==' is a garbage value"
+ "libuv/src/.*:[0-9]+:[0-9]+: warning: 1st function call argument is an uninitialized value"
+ "nghttp2/lib/.*:[0-9]+:[0-9]+: warning: Dereference of null pointer"
+ "nghttp2/lib/.*:[0-9]+:[0-9]+: warning: Value stored to .* is never read"
)
if(NOT "@CMAKE_GENERATOR@" MATCHES "Xcode")
diff --git a/Help/command/DEVICE_LINK_OPTIONS.txt b/Help/command/DEVICE_LINK_OPTIONS.txt
new file mode 100644
index 0000000..012e9b1
--- /dev/null
+++ b/Help/command/DEVICE_LINK_OPTIONS.txt
@@ -0,0 +1,10 @@
+
+When a device link step is involved, which is controlled by
+:prop_tgt:`CUDA_SEPARABLE_COMPILATION` and
+:prop_tgt:`CUDA_RESOLVE_DEVICE_SYMBOLS` properties, the raw options will be
+delivered to the host and device link steps (wrapped in ``-Xcompiler`` or
+equivalent for device link). Options wrapped with ``$<DEVICE_LINK:...>``
+:manual:`generator expression <cmake-generator-expressions(7)>` will be used
+only for the device link step. Options wrapped with ``$<HOST_LINK:...>``
+:manual:`generator expression <cmake-generator-expressions(7)>` will be used
+only for the host link step.
diff --git a/Help/command/FIND_XXX.txt b/Help/command/FIND_XXX.txt
index 42bf52b..4a62c5b 100644
--- a/Help/command/FIND_XXX.txt
+++ b/Help/command/FIND_XXX.txt
@@ -15,6 +15,7 @@ The general signature is:
[PATHS path1 [path2 ... ENV var]]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
[DOC "cache documentation string"]
+ [REQUIRED]
[NO_DEFAULT_PATH]
[NO_PACKAGE_ROOT_PATH]
[NO_CMAKE_PATH]
@@ -31,8 +32,9 @@ A cache entry named by ``<VAR>`` is created to store the result
of this command.
If the |SEARCH_XXX| is found the result is stored in the variable
and the search will not be repeated unless the variable is cleared.
-If nothing is found, the result will be
-``<VAR>-NOTFOUND``, and the search will be attempted again the
+If nothing is found, the result will be ``<VAR>-NOTFOUND``.
+The ``REQUIRED`` option stops processing with an error message if nothing
+is found, otherwise the search will be attempted again the
next time |FIND_XXX| is invoked with the same variable.
Options include:
@@ -57,6 +59,9 @@ Options include:
``DOC``
Specify the documentation string for the ``<VAR>`` cache entry.
+``REQUIRED``
+ Stop processing with an error message if nothing is found.
+
If ``NO_DEFAULT_PATH`` is specified, then no additional paths are
added to the search.
If ``NO_DEFAULT_PATH`` is not specified, the search process is as follows:
@@ -138,6 +143,10 @@ If ``NO_DEFAULT_PATH`` is not specified, the search process is as follows:
* |CMAKE_SYSTEM_XXX_PATH|
* |CMAKE_SYSTEM_XXX_MAC_PATH|
+ The platform paths that these variables contain are locations that
+ typically include installed software. An example being ``/usr/local`` for
+ UNIX based platforms.
+
7. Search the paths specified by the PATHS option
or in the short-hand version of the command.
These are typically hard-coded guesses.
diff --git a/Help/command/add_compile_options.rst b/Help/command/add_compile_options.rst
index 43805c3..36f403c 100644
--- a/Help/command/add_compile_options.rst
+++ b/Help/command/add_compile_options.rst
@@ -46,3 +46,6 @@ to use the more specific commands :command:`add_compile_definitions`
and :command:`include_directories`.
The command :command:`target_compile_options` adds target-specific options.
+
+The source file property :prop_sf:`COMPILE_OPTIONS` adds options to one
+source file.
diff --git a/Help/command/add_link_options.rst b/Help/command/add_link_options.rst
index a83005b..faa4afb 100644
--- a/Help/command/add_link_options.rst
+++ b/Help/command/add_link_options.rst
@@ -26,6 +26,8 @@ the syntax ``$<...>``. See the :manual:`cmake-generator-expressions(7)`
manual for available expressions. See the :manual:`cmake-buildsystem(7)`
manual for more on defining buildsystem properties.
+.. include:: DEVICE_LINK_OPTIONS.txt
+
.. include:: OPTIONS_SHELL.txt
.. include:: LINK_OPTIONS_LINKER.txt
diff --git a/Help/command/add_test.rst b/Help/command/add_test.rst
index a77ba37..c0677d2 100644
--- a/Help/command/add_test.rst
+++ b/Help/command/add_test.rst
@@ -10,8 +10,9 @@ Add a test to the project to be run by :manual:`ctest(1)`.
[WORKING_DIRECTORY <dir>]
[COMMAND_EXPAND_LISTS])
-Adds a test called ``<name>``. The test name may not contain spaces,
-quotes, or other characters special in CMake syntax. The options are:
+Adds a test called ``<name>``. The test name may contain arbitrary
+characters except for double-quotes. However, if it contains spaces
+or semicolons it must be enclosed in double-quotes. The options are:
``COMMAND``
Specify the test command-line. If ``<command>`` specifies an
diff --git a/Help/command/cmake_command.rst b/Help/command/cmake_command.rst
new file mode 100644
index 0000000..08b7832
--- /dev/null
+++ b/Help/command/cmake_command.rst
@@ -0,0 +1,90 @@
+cmake_command
+-------------
+
+Call meta-operations on CMake commands.
+
+Synopsis
+^^^^^^^^
+
+.. parsed-literal::
+
+ cmake_command(`INVOKE`_ <command> [<args>...])
+ cmake_command(`EVAL`_ CODE <code>...)
+
+Introduction
+^^^^^^^^^^^^
+
+This command will call meta-operations on built-in CMake commands or
+those created via the :command:`macro` or :command:`function` commands.
+
+``cmake_command`` does not introduce a new variable or policy scope.
+
+Invoking Commands
+^^^^^^^^^^^^^^^^^
+
+.. _INVOKE:
+
+.. code-block:: cmake
+
+ cmake_command(INVOKE <command> [<args>...])
+
+Invokes the named ``<command>`` with the given arguments (if any).
+For example, the code:
+
+.. code-block:: cmake
+
+ set(message_command "message")
+ cmake_command(INVOKE ${message_command} STATUS "Hello World!")
+
+is equivalent to
+
+.. code-block:: cmake
+
+ message(STATUS "Hello World!")
+
+Evaluating Code
+^^^^^^^^^^^^^^^
+
+.. _EVAL:
+
+.. code-block:: cmake
+
+ cmake_command(EVAL CODE <code>...)
+
+Evaluates the ``<code>...`` as CMake code.
+
+For example, the code:
+
+.. code-block:: cmake
+
+ set(A TRUE)
+ set(B TRUE)
+ set(C TRUE)
+ set(condition "(A AND B) OR C")
+
+ cmake_command(EVAL CODE "
+ if (${condition})
+ message(STATUS TRUE)
+ else()
+ message(STATUS FALSE)
+ endif()"
+ )
+
+is equivalent to
+
+.. code-block:: cmake
+
+ set(A TRUE)
+ set(B TRUE)
+ set(C TRUE)
+ set(condition "(A AND B) OR C")
+
+ file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/eval.cmake "
+ if (${condition})
+ message(STATUS TRUE)
+ else()
+ message(STATUS FALSE)
+ endif()"
+ )
+
+ include(${CMAKE_CURRENT_BINARY_DIR}/eval.cmake)
diff --git a/Help/command/ctest_test.rst b/Help/command/ctest_test.rst
index 5c67b2c..3589296 100644
--- a/Help/command/ctest_test.rst
+++ b/Help/command/ctest_test.rst
@@ -20,6 +20,7 @@ Perform the :ref:`CTest Test Step` as a :ref:`Dashboard Client`.
[RESOURCE_SPEC_FILE <file>]
[TEST_LOAD <threshold>]
[SCHEDULE_RANDOM <ON|OFF>]
+ [STOP_ON_FAILURE]
[STOP_TIME <time-of-day>]
[RETURN_VALUE <result-var>]
[CAPTURE_CMAKE_ERROR <result-var>]
@@ -119,6 +120,9 @@ The options are:
Launch tests in a random order. This may be useful for detecting
implicit test dependencies.
+``STOP_ON_FAILURE``
+ Stop the execution of the tests once one has failed.
+
``STOP_TIME <time-of-day>``
Specify a time of day at which the tests should all stop running.
diff --git a/Help/command/execute_process.rst b/Help/command/execute_process.rst
index 14f879d..b32025f 100644
--- a/Help/command/execute_process.rst
+++ b/Help/command/execute_process.rst
@@ -21,7 +21,9 @@ Execute one or more child processes.
[COMMAND_ECHO <where>]
[OUTPUT_STRIP_TRAILING_WHITESPACE]
[ERROR_STRIP_TRAILING_WHITESPACE]
- [ENCODING <name>])
+ [ENCODING <name>]
+ [ECHO_OUTPUT_VARIABLE]
+ [ECHO_ERROR_VARIABLE])
Runs the given sequence of one or more commands.
@@ -105,6 +107,15 @@ Options:
for this encoding. In CMake 3.11.0, ``UTF-8`` was added for consistency with
the `UTF-8 RFC <https://www.ietf.org/rfc/rfc3629>`_ naming convention.
+``ECHO_OUTPUT_VARIABLE``, ``ECHO_ERROR_VARIABLE``
+ The standard output or standard error will not be exclusively redirected to
+ the configured variables.
+
+ The output will be duplicated, it will be sent into the configured variables
+ and also on standard output or standard error.
+
+ This is analogous to the ``tee`` Unix command.
+
If more than one ``OUTPUT_*`` or ``ERROR_*`` option is given for the
same pipe the precedence is not specified.
If no ``OUTPUT_*`` or ``ERROR_*`` options are given the output will
diff --git a/Help/command/file.rst b/Help/command/file.rst
index df7d8ba..bb560a9 100644
--- a/Help/command/file.rst
+++ b/Help/command/file.rst
@@ -19,6 +19,7 @@ Synopsis
file({`WRITE`_ | `APPEND`_} <filename> <content>...)
file({`TOUCH`_ | `TOUCH_NOCREATE`_} [<file>...])
file(`GENERATE`_ OUTPUT <output-file> [...])
+ file(`CONFIGURE`_ OUTPUT <output-file> CONTENT <content> [...])
`Filesystem`_
file({`GLOB`_ | `GLOB_RECURSE`_} <out-var> [...] [<globbing-expr>...])
@@ -41,6 +42,10 @@ Synopsis
`Locking`_
file(`LOCK`_ <path> [...])
+ `Archiving`_
+ file(`ARCHIVE_CREATE`_ OUTPUT <archive> FILES <files> [...])
+ file(`ARCHIVE_EXTRACT`_ INPUT <archive> DESTINATION <dir> [...])
+
Reading
^^^^^^^
@@ -54,7 +59,9 @@ Reading
Read content from a file called ``<filename>`` and store it in a
``<variable>``. Optionally start from the given ``<offset>`` and
read at most ``<max-in>`` bytes. The ``HEX`` option causes data to
-be converted to a hexadecimal representation (useful for binary data).
+be converted to a hexadecimal representation (useful for binary data). If the
+``HEX`` option is specified, letters in the output (``a`` through ``f``) are in
+lowercase.
.. _STRINGS:
@@ -395,8 +402,8 @@ dependency resolution:
Determines the path to the tool to use for dependency resolution. This is the
actual path to ``objdump``, ``dumpbin``, or ``otool``.
- If this variable is not specified, it is determined automatically by system
- introspection.
+ If this variable is not specified, it is determined by the value of
+ ``CMAKE_OBJDUMP`` if set, else by system introspection.
Writing
^^^^^^^
@@ -482,6 +489,45 @@ generation phase. The output file will not yet have been written when the
``file(GENERATE)`` command returns, it is written only after processing all
of a project's ``CMakeLists.txt`` files.
+.. _CONFIGURE:
+
+.. code-block:: cmake
+
+ file(CONFIGURE OUTPUT output-file
+ CONTENT content
+ [ESCAPE_QUOTES] [@ONLY]
+ [NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])
+
+Generate an output file using the input given by ``CONTENT`` and substitute
+variable values referenced as ``@VAR@`` or ``${VAR}`` contained therein. The
+substitution rules behave the same as the :command:`configure_file` command.
+In order to match :command:`configure_file`'s behavior, generator expressions
+are not supported for both ``OUTPUT`` and ``CONTENT``.
+
+The arguments are:
+
+``OUTPUT <output-file>``
+ Specify the output file name to generate. A relative path is treated with
+ respect to the value of :variable:`CMAKE_CURRENT_BINARY_DIR`. See policy
+ :policy:`CMP0070`.
+ ``<output-file>`` does not support generator expressions.
+
+``CONTENT <content>``
+ Use the content given explicitly as input.
+ ``<content>`` does not support generator expressions.
+
+``ESCAPE_QUOTES``
+ Escape any substituted quotes with backslashes (C-style).
+
+``@ONLY``
+ Restrict variable replacement to references of the form ``@VAR@``.
+ This is useful for configuring scripts that use ``${VAR}`` syntax.
+
+``NEWLINE_STYLE <style>``
+ Specify the newline style for the output file. Specify
+ ``UNIX`` or ``LF`` for ``\n`` newlines, or specify
+ ``DOS``, ``WIN32``, or ``CRLF`` for ``\r\n`` newlines.
+
Filesystem
^^^^^^^^^^
@@ -790,6 +836,18 @@ Options to both ``DOWNLOAD`` and ``UPLOAD`` are:
If neither ``NETRC`` option is given CMake will check variables
``CMAKE_NETRC`` and ``CMAKE_NETRC_FILE``, respectively.
+``TLS_VERIFY <ON|OFF>``
+ Specify whether to verify the server certificate for ``https://`` URLs.
+ The default is to *not* verify.
+
+``TLS_CAINFO <file>``
+ Specify a custom Certificate Authority file for ``https://`` URLs.
+
+For ``https://`` URLs CMake must be built with OpenSSL support. ``TLS/SSL``
+certificates are not checked by default. Set ``TLS_VERIFY`` to ``ON`` to
+check certificates. If neither ``TLS`` option is given CMake will check
+variables ``CMAKE_TLS_VERIFY`` and ``CMAKE_TLS_CAINFO``, respectively.
+
Additional options to ``DOWNLOAD`` are:
``EXPECTED_HASH ALGO=<value>``
@@ -801,19 +859,6 @@ Additional options to ``DOWNLOAD`` are:
``EXPECTED_MD5 <value>``
Historical short-hand for ``EXPECTED_HASH MD5=<value>``.
-``TLS_VERIFY <ON|OFF>``
- Specify whether to verify the server certificate for ``https://`` URLs.
- The default is to *not* verify.
-
-``TLS_CAINFO <file>``
- Specify a custom Certificate Authority file for ``https://`` URLs.
-
-For ``https://`` URLs CMake must be built with OpenSSL support. ``TLS/SSL``
-certificates are not checked by default. Set ``TLS_VERIFY`` to ``ON`` to
-check certificates and/or use ``EXPECTED_HASH`` to verify downloaded content.
-If neither ``TLS`` option is given CMake will check variables
-``CMAKE_TLS_VERIFY`` and ``CMAKE_TLS_CAINFO``, respectively.
-
Locking
^^^^^^^
@@ -846,3 +891,62 @@ child directory or file.
Trying to lock file twice is not allowed. Any intermediate directories and
file itself will be created if they not exist. ``GUARD`` and ``TIMEOUT``
options ignored on ``RELEASE`` operation.
+
+Archiving
+^^^^^^^^^
+
+.. _ARCHIVE_CREATE:
+
+.. code-block:: cmake
+
+ file(ARCHIVE_CREATE OUTPUT <archive>
+ [FILES <files>]
+ [DIRECTORY <dirs>]
+ [FORMAT <format>]
+ [TYPE <type>]
+ [MTIME <mtime>]
+ [VERBOSE])
+
+Creates an archive specifed by ``OUTPUT`` with the content of ``FILES`` and
+``DIRECTORY``.
+
+To specify the format of the archive set the ``FORMAT`` option.
+Supported formats are: ``7zip``, ``gnutar``, ``pax``, ``paxr``, ``raw``,
+(restricted pax, default), and ``zip``.
+
+To specify the type of compression set the ``TYPE`` option.
+Supported compression types are: ``None``, ``BZip2``, ``GZip``, ``XZ``,
+and ``Zstd``.
+
+.. note::
+ With ``FORMAT`` set to ``raw`` only one file will be compressed with the
+ compression type specified by ``TYPE``.
+
+With ``VERBOSE`` the command will produce verbose output.
+
+To specify the modification time recorded in tarball entries use
+the ``MTIME`` option.
+
+.. _ARCHIVE_EXTRACT:
+
+.. code-block:: cmake
+
+ file(ARCHIVE_EXTRACT INPUT <archive>
+ [FILES <files>]
+ [DIRECTORY <dirs>]
+ [DESTINATION <dir>]
+ [LIST_ONLY]
+ [VERBOSE])
+
+Extracts or lists the content of an archive specified by ``INPUT``.
+
+The directory where the content of the archive will be extracted can
+be specified via ``DESTINATION``. If the directory does not exit, it
+will be created.
+
+To select which files and directories will be extracted or listed
+use ``FILES`` and ``DIRECTORY`` options.
+
+``LIST_ONLY`` will only list the files in the archive.
+
+With ``VERBOSE`` the command will produce verbose output.
diff --git a/Help/command/find_package.rst b/Help/command/find_package.rst
index 64a16f3..dcc0225 100644
--- a/Help/command/find_package.rst
+++ b/Help/command/find_package.rst
@@ -302,23 +302,23 @@ enabled.
are intended to be used on the command line with a ``-DVAR=value``.
The values are interpreted as :ref:`semicolon-separated lists <CMake Language Lists>`.
This can be skipped if ``NO_CMAKE_PATH`` is passed or by setting the
- :variable:`CMAKE_FIND_USE_CMAKE_PATH` to ``FALSE``::
+ :variable:`CMAKE_FIND_USE_CMAKE_PATH` to ``FALSE``:
- CMAKE_PREFIX_PATH
- CMAKE_FRAMEWORK_PATH
- CMAKE_APPBUNDLE_PATH
+ * :variable:`CMAKE_PREFIX_PATH`
+ * :variable:`CMAKE_FRAMEWORK_PATH`
+ * :variable:`CMAKE_APPBUNDLE_PATH`
3. Search paths specified in cmake-specific environment variables.
These are intended to be set in the user's shell configuration,
and therefore use the host's native path separator
(``;`` on Windows and ``:`` on UNIX).
This can be skipped if ``NO_CMAKE_ENVIRONMENT_PATH`` is passed or by setting
- the :variable:`CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH` to ``FALSE``::
+ the :variable:`CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH` to ``FALSE``:
- <PackageName>_DIR
- CMAKE_PREFIX_PATH
- CMAKE_FRAMEWORK_PATH
- CMAKE_APPBUNDLE_PATH
+ * ``<PackageName>_DIR``
+ * :envvar:`CMAKE_PREFIX_PATH`
+ * ``CMAKE_FRAMEWORK_PATH``
+ * ``CMAKE_APPBUNDLE_PATH``
4. Search paths specified by the ``HINTS`` option. These should be paths
computed by system introspection, such as a hint provided by the
@@ -329,9 +329,9 @@ enabled.
skipped if ``NO_SYSTEM_ENVIRONMENT_PATH`` is passed or by setting the
:variable:`CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH` to ``FALSE``. Path entries
ending in ``/bin`` or ``/sbin`` are automatically converted to their
- parent directories::
+ parent directories:
- PATH
+ * ``PATH``
6. Search paths stored in the CMake :ref:`User Package Registry`.
This can be skipped if ``NO_CMAKE_PACKAGE_REGISTRY`` is passed or by
@@ -345,11 +345,15 @@ enabled.
7. Search cmake variables defined in the Platform files for the
current system. This can be skipped if ``NO_CMAKE_SYSTEM_PATH`` is
passed or by setting the :variable:`CMAKE_FIND_USE_CMAKE_SYSTEM_PATH`
- to ``FALSE``::
+ to ``FALSE``:
- CMAKE_SYSTEM_PREFIX_PATH
- CMAKE_SYSTEM_FRAMEWORK_PATH
- CMAKE_SYSTEM_APPBUNDLE_PATH
+ * :variable:`CMAKE_SYSTEM_PREFIX_PATH`
+ * :variable:`CMAKE_SYSTEM_FRAMEWORK_PATH`
+ * :variable:`CMAKE_SYSTEM_APPBUNDLE_PATH`
+
+ The platform paths that these variables contain are locations that
+ typically include installed software. An example being ``/usr/local`` for
+ UNIX based platforms.
8. Search paths stored in the CMake :ref:`System Package Registry`.
This can be skipped if ``NO_CMAKE_SYSTEM_PACKAGE_REGISTRY`` is passed
diff --git a/Help/command/function.rst b/Help/command/function.rst
index 53ba754..30938b3 100644
--- a/Help/command/function.rst
+++ b/Help/command/function.rst
@@ -44,11 +44,15 @@ can be invoked through any of
foo()
Foo()
FOO()
+ cmake_command(INVOKE foo)
and so on. However, it is strongly recommended to stay with the
case chosen in the function definition. Typically functions use
all-lowercase names.
+The :command:`cmake_command(INVOKE ...)` command can also be used to invoke the
+function.
+
Arguments
^^^^^^^^^
diff --git a/Help/command/get_property.rst b/Help/command/get_property.rst
index c0f9b46..80d97fd 100644
--- a/Help/command/get_property.rst
+++ b/Help/command/get_property.rst
@@ -10,6 +10,7 @@ Get a property.
DIRECTORY [<dir>] |
TARGET <target> |
SOURCE <source> |
+ [<TARGET_DIRECTORY ... | DIRECTORY ...>] |
INSTALL <file> |
TEST <test> |
CACHE <entry> |
@@ -49,6 +50,15 @@ It must be one of the following:
``VARIABLE``
Scope is unique and does not accept a name.
+In the ``SOURCE`` case, the queried source file scope can be changed by
+specifying one of the additional options: ``DIRECTORY`` or ``TARGET_DIRECTORY``.
+
+``DIRECTORY`` takes a path to a processed directory, and the source file property
+will be read from that directory scope.
+
+``TARGET_DIRECTORY`` takes the name of an existing target. The source file
+property will be read from this target's directory scope.
+
The required ``PROPERTY`` option is immediately followed by the name of
the property to get. If the property is not set an empty value is
returned, although some properties support inheriting from a parent scope
diff --git a/Help/command/get_source_file_property.rst b/Help/command/get_source_file_property.rst
index decec19..893a1b6 100644
--- a/Help/command/get_source_file_property.rst
+++ b/Help/command/get_source_file_property.rst
@@ -5,7 +5,7 @@ Get a property for a source file.
.. code-block:: cmake
- get_source_file_property(VAR file property)
+ get_source_file_property(VAR file [<TARGET_DIRECTORY ... | DIRECTORY ...>] property)
Gets a property from a source file. The value of the property is
stored in the variable ``VAR``. If the source property is not found, the
@@ -15,6 +15,15 @@ or not (see :command:`define_property`). Non-inherited properties will set
parent scope as described for the :command:`define_property` command and
if still unable to find the property, ``VAR`` will be set to an empty string.
+The queried source file scope can be changed by specifying one of the
+additional options: ``DIRECTORY`` or ``TARGET_DIRECTORY``.
+
+``DIRECTORY`` takes a path to a processed directory, and the source file property
+will be read from that directory scope.
+
+``TARGET_DIRECTORY`` takes the name of an existing target. The source file
+property will be read from this target's directory scope.
+
Use :command:`set_source_files_properties` to set property values. Source
file properties usually control how the file is built. One property that is
always there is :prop_sf:`LOCATION`.
diff --git a/Help/command/install.rst b/Help/command/install.rst
index 5affc5b..c8df7d9 100644
--- a/Help/command/install.rst
+++ b/Help/command/install.rst
@@ -18,10 +18,12 @@ Synopsis
Introduction
^^^^^^^^^^^^
-This command generates installation rules for a project. Rules
-specified by calls to this command within a source directory are
-executed in order during installation. The order across directories
-is not defined.
+This command generates installation rules for a project. Install rules
+specified by calls to the ``install()`` command within a source directory
+are executed in order during installation. Install rules in subdirectories
+added by calls to the :command:`add_subdirectory` command are interleaved
+with those in the parent directory to run in the order declared (see
+policy :policy:`CMP0082`).
There are multiple signatures for this command. Some of them define
installation options for files and targets. Options common to
@@ -30,13 +32,20 @@ signatures that specify them. The common options are:
``DESTINATION``
Specify the directory on disk to which a file will be installed.
- If a full path (with a leading slash or drive letter) is given
- it is used directly. If a relative path is given it is interpreted
- relative to the value of the :variable:`CMAKE_INSTALL_PREFIX` variable.
+ Arguments can be relative or absolute paths.
+
+ If a relative path is given it is interpreted relative to the value
+ of the :variable:`CMAKE_INSTALL_PREFIX` variable.
The prefix can be relocated at install time using the ``DESTDIR``
mechanism explained in the :variable:`CMAKE_INSTALL_PREFIX` variable
documentation.
+ If an absolute path (with a leading slash or drive letter) is given
+ it is used verbatim.
+
+ As absolute paths are not supported by :manual:`cpack <cpack(1)>` installer
+ generators, it is preferable to use relative paths throughout.
+
``PERMISSIONS``
Specify permissions for installed files. Valid permissions are
``OWNER_READ``, ``OWNER_WRITE``, ``OWNER_EXECUTE``, ``GROUP_READ``,
@@ -119,31 +128,38 @@ Installing Targets
)
The ``TARGETS`` form specifies rules for installing targets from a
-project. There are several kinds of target files that may be installed:
+project. There are several kinds of target :ref:`Output Artifacts`
+that may be installed:
``ARCHIVE``
- Static libraries are treated as ``ARCHIVE`` targets, except those
- marked with the ``FRAMEWORK`` property on macOS (see ``FRAMEWORK``
- below.) For DLL platforms (all Windows-based systems including
- Cygwin), the DLL import library is treated as an ``ARCHIVE`` target.
- On AIX, the linker import file created for executables with
- :prop_tgt:`ENABLE_EXPORTS` is treated as an ``ARCHIVE`` target.
+ Target artifacts of this kind include:
+
+ * *Static libraries*
+ (except on macOS when marked as ``FRAMEWORK``, see below);
+ * *DLL import libraries*
+ (on all Windows-based systems including Cygwin; they have extension
+ ``.lib``, in contrast to the ``.dll`` libraries that go to ``RUNTIME``);
+ * On AIX, the *linker import file* created for executables with
+ :prop_tgt:`ENABLE_EXPORTS` enabled.
``LIBRARY``
- Module libraries are always treated as ``LIBRARY`` targets. For non-
- DLL platforms shared libraries are treated as ``LIBRARY`` targets,
- except those marked with the ``FRAMEWORK`` property on macOS (see
- ``FRAMEWORK`` below.)
+ Target artifacts of this kind include:
+
+ * *Shared libraries*, except
+
+ - DLLs (these go to ``RUNTIME``, see below),
+ - on macOS when marked as ``FRAMEWORK`` (see below).
``RUNTIME``
- Executables are treated as ``RUNTIME`` objects, except those marked
- with the ``MACOSX_BUNDLE`` property on macOS (see ``BUNDLE`` below.)
- For DLL platforms (all Windows-based systems including Cygwin), the
- DLL part of a shared library is treated as a ``RUNTIME`` target.
+ Target artifacts of this kind include:
+
+ * *Executables*
+ (except on macOS when marked as ``MACOSX_BUNDLE``, see ``BUNDLE`` below);
+ * DLLs (on all Windows-based systems including Cygwin; note that the
+ accompanying import libraries are of kind ``ARCHIVE``).
``OBJECTS``
- Object libraries (a simple group of object files) are always treated
- as ``OBJECTS`` targets.
+ Object files associated with *object libraries*.
``FRAMEWORK``
Both static and shared libraries marked with the ``FRAMEWORK``
@@ -630,6 +646,13 @@ present, causes the contents of the properties matching
``(IMPORTED_)?LINK_INTERFACE_LIBRARIES(_<CONFIG>)?`` to be exported, when
policy :policy:`CMP0022` is ``NEW``.
+.. note::
+ The installed ``<export-name>.cmake`` file may come with additional
+ per-configuration ``<export-name>-*.cmake`` files to be loaded by
+ globbing. Do not use an export name that is the same as the package
+ name in combination with installing a ``<package-name>-config.cmake``
+ file or the latter may be incorrectly matched by the glob and loaded.
+
When a ``COMPONENT`` option is given, the listed ``<component>`` implicitly
depends on all components mentioned in the export set. The exported
``<name>.cmake`` file will require each of the exported components to be
@@ -684,6 +707,11 @@ executable from the installation tree using the imported target name
Generated Installation Script
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+.. note::
+
+ Use of this feature is not recommended. Please consider using the
+ ``--install`` argument of :manual:`cmake(1)` instead.
+
The ``install()`` command generates a file, ``cmake_install.cmake``, inside
the build directory, which is used internally by the generated install target
and by CPack. You can also invoke this script manually with ``cmake -P``. This
diff --git a/Help/command/list.rst b/Help/command/list.rst
index 50bf417..4d339a0 100644
--- a/Help/command/list.rst
+++ b/Help/command/list.rst
@@ -308,6 +308,13 @@ The ``<compare>`` option should be one of:
* ``STRING``: Sorts a list of strings alphabetically. This is the
default behavior if the ``COMPARE`` option is not given.
* ``FILE_BASENAME``: Sorts a list of pathnames of files by their basenames.
+* ``NATURAL``: Sorts a list of strings using natural order
+ (see ``strverscmp(3)`` manual), i.e. such that contiguous digits
+ are compared as whole numbers.
+ For example: the following list `10.0 1.1 2.1 8.0 2.0 3.1`
+ will be sorted as `1.1 2.0 2.1 3.1 8.0 10.0` if the ``NATURAL``
+ comparison is selected where it will be sorted as
+ `1.1 10.0 2.0 2.1 3.1 8.0` with the ``STRING`` comparison.
Use the ``CASE`` keyword to select a case sensitive or case insensitive
sort mode. The ``<case>`` option should be one of:
diff --git a/Help/command/macro.rst b/Help/command/macro.rst
index 008d049..65159f4 100644
--- a/Help/command/macro.rst
+++ b/Help/command/macro.rst
@@ -42,11 +42,15 @@ can be invoked through any of
foo()
Foo()
FOO()
+ cmake_command(INVOKE foo)
and so on. However, it is strongly recommended to stay with the
case chosen in the macro definition. Typically macros use
all-lowercase names.
+The :command:`cmake_command(INVOKE ...)` command can also be used to invoke the
+macro.
+
Arguments
^^^^^^^^^
diff --git a/Help/command/option.rst b/Help/command/option.rst
index 8956307..02b8dac 100644
--- a/Help/command/option.rst
+++ b/Help/command/option.rst
@@ -9,7 +9,7 @@ Provide an option that the user can optionally select.
Provides an option for the user to select as ``ON`` or ``OFF``.
If no initial ``<value>`` is provided, ``OFF`` is used.
-If ``<variable>`` is already set as a normal variable
+If ``<variable>`` is already set as a normal or cache variable,
then the command does nothing (see policy :policy:`CMP0077`).
If you have options that depend on the values of other options, see
diff --git a/Help/command/separate_arguments.rst b/Help/command/separate_arguments.rst
index fbca859..ab3d5c1 100644
--- a/Help/command/separate_arguments.rst
+++ b/Help/command/separate_arguments.rst
@@ -19,7 +19,7 @@ They are specified by the ``<mode>`` argument which must
be one of the following keywords:
``UNIX_COMMAND``
- Arguments are separated by by unquoted whitespace.
+ Arguments are separated by unquoted whitespace.
Both single-quote and double-quote pairs are respected.
A backslash escapes the next literal character (``\"`` is ``"``);
there are no special escapes (``\n`` is just ``n``).
diff --git a/Help/command/set_property.rst b/Help/command/set_property.rst
index ec08c8f..de28be3 100644
--- a/Help/command/set_property.rst
+++ b/Help/command/set_property.rst
@@ -8,7 +8,8 @@ Set a named property in a given scope.
set_property(<GLOBAL |
DIRECTORY [<dir>] |
TARGET [<target1> ...] |
- SOURCE [<src1> ...] |
+ SOURCE [<src1> ...]
+ [<TARGET_DIRECTORY ... | DIRECTORY ...>] |
INSTALL [<file1> ...] |
TEST [<test1> ...] |
CACHE [<entry1> ...] >
@@ -34,8 +35,16 @@ It must be one of the following:
``SOURCE``
Scope may name zero or more source files. Note that source
- file properties are visible only to targets added in the same
+ file properties are by default visible only to targets added in the same
directory (``CMakeLists.txt``).
+ The file properties can be made visible in a different directory by specifying
+ one of the additional options: ``TARGET_DIRECTORY`` or ``DIRECTORY``.
+
+ ``DIRECTORY`` takes a list of processed directories paths, and sets the file
+ properties in those directory scopes.
+
+ ``TARGET_DIRECTORY`` takes a list of existing targets. The file
+ properties will be set in these targets' directory scopes.
See also the :command:`set_source_files_properties` command.
``INSTALL``
@@ -66,7 +75,8 @@ the property to set. Remaining arguments are used to compose the
property value in the form of a semicolon-separated list.
If the ``APPEND`` option is given the list is appended to any existing
-property value. If the ``APPEND_STRING`` option is given the string is
+property value (except that empty values are ignored and not appended).
+If the ``APPEND_STRING`` option is given the string is
appended to any existing property value as string, i.e. it results in a
longer string and not a list of strings. When using ``APPEND`` or
``APPEND_STRING`` with a property defined to support ``INHERITED``
diff --git a/Help/command/set_source_files_properties.rst b/Help/command/set_source_files_properties.rst
index ab95d70..8adfb9e 100644
--- a/Help/command/set_source_files_properties.rst
+++ b/Help/command/set_source_files_properties.rst
@@ -6,12 +6,25 @@ Source files can have properties that affect how they are built.
.. code-block:: cmake
set_source_files_properties([file1 [file2 [...]]]
+ [<TARGET_DIRECTORY ... | DIRECTORY ...>]
PROPERTIES prop1 value1
[prop2 value2 [...]])
Sets properties associated with source files using a key/value paired
list.
+Note that source file properties are by default visible only to
+targets added in the same directory (``CMakeLists.txt``).
+
+The file properties can be made visible in a different directory by specifying
+one of the additional options: ``TARGET_DIRECTORY`` or ``DIRECTORY``.
+
+``DIRECTORY`` takes a list of processed directories paths, and sets the file
+properties in those directory scopes.
+
+``TARGET_DIRECTORY`` takes a list of existing targets. The file
+properties will be set in these targets' directory scopes.
+
See also the :command:`set_property(SOURCE)` command.
See :ref:`Source File Properties` for the list of properties known
diff --git a/Help/command/source_group.rst b/Help/command/source_group.rst
index 6623c98..5ae9e51 100644
--- a/Help/command/source_group.rst
+++ b/Help/command/source_group.rst
@@ -37,11 +37,13 @@ explicitly lists the file with ``FILES`` will be favored, if any.
If no group explicitly lists the file, the *last* group whose
regular expression matches the file will be favored.
-The ``<name>`` of the group and ``<prefix>`` argument may contain backslashes
-to specify subgroups:
+The ``<name>`` of the group and ``<prefix>`` argument may contain forward
+slashes or backslashes to specify subgroups. Backslashes need to be escaped
+appropriately:
.. code-block:: cmake
+ source_group(base/subdir ...)
source_group(outer\\inner ...)
source_group(TREE <root> PREFIX sources\\inc ...)
diff --git a/Help/command/string.rst b/Help/command/string.rst
index 81a2061..cfcf914 100644
--- a/Help/command/string.rst
+++ b/Help/command/string.rst
@@ -11,8 +11,6 @@ Synopsis
`Search and Replace`_
string(`FIND`_ <string> <substring> <out-var> [...])
string(`REPLACE`_ <match-string> <replace-string> <out-var> <input>...)
-
- `Regular Expressions`_
string(`REGEX MATCH`_ <match-regex> <out-var> <input>...)
string(`REGEX MATCHALL`_ <match-regex> <out-var> <input>...)
string(`REGEX REPLACE`_ <match-regex> <replace-expr> <out-var> <input>...)
@@ -38,6 +36,7 @@ Synopsis
`Generation`_
string(`ASCII`_ <number>... <out-var>)
+ string(`HEX`_ <string> <out-var>)
string(`CONFIGURE`_ <string> <out-var> [...])
string(`MAKE_C_IDENTIFIER`_ <string> <out-var>)
string(`RANDOM`_ [<option>...] <out-var>)
@@ -47,6 +46,9 @@ Synopsis
Search and Replace
^^^^^^^^^^^^^^^^^^
+Search and Replace With Plain Strings
+"""""""""""""""""""""""""""""""""""""
+
.. _FIND:
.. code-block:: cmake
@@ -74,8 +76,8 @@ so strings containing multi-byte characters may lead to unexpected results.
Replace all occurrences of ``<match_string>`` in the ``<input>``
with ``<replace_string>`` and store the result in the ``<output_variable>``.
-Regular Expressions
-^^^^^^^^^^^^^^^^^^^
+Search and Replace With Regular Expressions
+"""""""""""""""""""""""""""""""""""""""""""
.. _`REGEX MATCH`:
@@ -87,6 +89,7 @@ Regular Expressions
Match the ``<regular_expression>`` once and store the match in the
``<output_variable>``.
All ``<input>`` arguments are concatenated before matching.
+Regular expressions are specified in the subsection just below.
.. _`REGEX MATCHALL`:
@@ -353,6 +356,16 @@ Generation
Convert all numbers into corresponding ASCII characters.
+.. _HEX:
+
+.. code-block:: cmake
+
+ string(HEX <string> <output_variable>)
+
+Convert each byte in the input ``<string>`` to its hexadecimal representation
+and store the concatenated hex digits in the ``<output_variable>``. Letters in
+the output (``a`` through ``f``) are in lowercase.
+
.. _CONFIGURE:
.. code-block:: cmake
diff --git a/Help/command/target_compile_options.rst b/Help/command/target_compile_options.rst
index 47e7d86..3c733c5 100644
--- a/Help/command/target_compile_options.rst
+++ b/Help/command/target_compile_options.rst
@@ -46,3 +46,5 @@ to use the more specific commands :command:`target_compile_definitions`
and :command:`target_include_directories`.
For directory-wide settings, there is the command :command:`add_compile_options`.
+
+For file-specific settings, there is the source file property :prop_sf:`COMPILE_OPTIONS`.
diff --git a/Help/command/target_link_options.rst b/Help/command/target_link_options.rst
index b5abbc4..89038e3 100644
--- a/Help/command/target_link_options.rst
+++ b/Help/command/target_link_options.rst
@@ -43,6 +43,8 @@ with the syntax ``$<...>``. See the :manual:`cmake-generator-expressions(7)`
manual for available expressions. See the :manual:`cmake-buildsystem(7)`
manual for more on defining buildsystem properties.
+.. include:: DEVICE_LINK_OPTIONS.txt
+
.. include:: OPTIONS_SHELL.txt
.. include:: LINK_OPTIONS_LINKER.txt
diff --git a/Help/cpack_gen/archive.rst b/Help/cpack_gen/archive.rst
index d455f4b..3656aa2 100644
--- a/Help/cpack_gen/archive.rst
+++ b/Help/cpack_gen/archive.rst
@@ -1,8 +1,8 @@
CPack Archive Generator
-----------------------
-Archive CPack generator that supports packaging of sources and binaries in
-different formats:
+CPack generator for packaging files into an archive, which can have
+any of the following formats:
- 7Z - 7zip - (.7z)
- TBZ2 (.tar.bz2)
@@ -12,25 +12,64 @@ different formats:
- TZST (.tar.zst)
- ZIP (.zip)
+When this generator is called from ``CPackSourceConfig.cmake`` (or through
+the ``package_source`` target), then the generated archive will contain all
+files in the project directory, except those specified in
+:variable:`CPACK_SOURCE_IGNORE_FILES`. The following is one example of
+packaging all source files of a project:
+
+.. code-block:: cmake
+
+ set(CPACK_SOURCE_GENERATOR "TGZ")
+ set(CPACK_SOURCE_IGNORE_FILES
+ \\.git/
+ build/
+ ".*~$"
+ )
+ set(CPACK_VERBATIM_VARIABLES YES)
+ include(CPack)
+
+When this generator is called from ``CPackConfig.cmake`` (or through the
+``package`` target), then the generated archive will contain all files
+that have been installed via CMake's :command:`install` command (and the
+deprecated commands :command:`install_files`, :command:`install_programs`,
+and :command:`install_targets`).
+
Variables specific to CPack Archive generator
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. variable:: CPACK_ARCHIVE_FILE_NAME
CPACK_ARCHIVE_<component>_FILE_NAME
- Package file name without extension which is added automatically depending
- on the archive format.
-
- * Mandatory : YES
- * Default : ``<CPACK_PACKAGE_FILE_NAME>[-<component>].<extension>`` with
- spaces replaced by '-'
+ Package file name without extension. The extension is determined from the
+ archive format (see list above) and automatically appended to the file name.
+ The default is ``<CPACK_PACKAGE_FILE_NAME>[-<component>]``, with spaces
+ replaced by '-'.
.. variable:: CPACK_ARCHIVE_COMPONENT_INSTALL
- Enable component packaging for CPackArchive
+ Enable component packaging. If enabled (ON), then the archive generator
+ creates multiple packages. The default is OFF, which means that a single
+ package containing files of all components is generated.
+
+Variables used by CPack Archive generator
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+These variables are used by the Archive generator, but are also available to
+CPack generators which are essentially archives at their core. These include:
+
+ - :cpack_gen:`CPack Cygwin Generator`
+ - :cpack_gen:`CPack FreeBSD Generator`
+
+.. variable:: CPACK_ARCHIVE_THREADS
+
+ The number of threads to use when performing the compression. If set to
+ ``0``, the number of available cores on the machine will be used instead.
+ The default is ``1`` which limits compression to a single thread. Note that
+ not all compression modes support threading in all environments. Currently,
+ only the XZ compression may support it.
- * Mandatory : NO
- * Default : OFF
+.. note::
- If enabled (ON) multiple packages are generated. By default a single package
- containing files of all components is generated.
+ Official CMake binaries available on ``cmake.org`` ship with a ``liblzma``
+ that does not support parallel compression.
diff --git a/Help/cpack_gen/cygwin.rst b/Help/cpack_gen/cygwin.rst
index 1c5f7af..c65653e 100644
--- a/Help/cpack_gen/cygwin.rst
+++ b/Help/cpack_gen/cygwin.rst
@@ -3,6 +3,11 @@ CPack Cygwin Generator
Cygwin CPack generator (Cygwin).
+Variables affecting the CPack Cygwin generator
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+ - :variable:`CPACK_ARCHIVE_THREADS`
+
Variables specific to CPack Cygwin generator
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/Help/cpack_gen/freebsd.rst b/Help/cpack_gen/freebsd.rst
index a8dd320..47a7784 100644
--- a/Help/cpack_gen/freebsd.rst
+++ b/Help/cpack_gen/freebsd.rst
@@ -3,6 +3,11 @@ CPack FreeBSD Generator
The built in (binary) CPack FreeBSD (pkg) generator (Unix only)
+Variables affecting the CPack FreeBSD (pkg) generator
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+ - :variable:`CPACK_ARCHIVE_THREADS`
+
Variables specific to CPack FreeBSD (pkg) generator
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/Help/cpack_gen/ifw.rst b/Help/cpack_gen/ifw.rst
index 4a9ab99..776bb46 100644
--- a/Help/cpack_gen/ifw.rst
+++ b/Help/cpack_gen/ifw.rst
@@ -1,73 +1,28 @@
CPack IFW Generator
-------------------
+Configure and run the Qt Installer Framework to generate a Qt installer.
+
+.. only:: html
+
+ .. contents::
+
Overview
^^^^^^^^
This :manual:`cpack generator <cpack-generators(7)>` generates
configuration and meta information for the `Qt Installer Framework
-<http://doc.qt.io/qtinstallerframework/index.html>`_ (QtIFW).
+<http://doc.qt.io/qtinstallerframework/index.html>`_ (QtIFW),
+and runs QtIFW tools to generate a Qt installer.
QtIFW provides tools and utilities to create installers for
the platforms supported by `Qt <https://www.qt.io>`_: Linux,
Microsoft Windows, and macOS.
-To make use of this generator, QtIFW should also be installed.
-The module :module:`CPackIFW` looks for the location of the
-QtIFW command-line utilities.
-
-Hints
-^^^^^
-
-Generally, the CPack ``IFW`` generator automatically finds QtIFW tools,
-but if you don't use a default path for installation of the QtIFW tools,
-the path may be specified in either a CMake or an environment variable:
-
-.. variable:: CPACK_IFW_ROOT
-
- An CMake variable which specifies the location of the QtIFW tool suite.
-
- The variable will be cached in the ``CPackConfig.cmake`` file and used at
- CPack runtime.
-
-.. variable:: QTIFWDIR
-
- An environment variable which specifies the location of the QtIFW tool
- suite.
-
-.. note::
- The specified path should not contain "bin" at the end
- (for example: "D:\\DevTools\\QtIFW2.0.5").
-
-The :variable:`CPACK_IFW_ROOT` variable has a higher priority and overrides
-the value of the :variable:`QTIFWDIR` variable.
-
-Internationalization
-^^^^^^^^^^^^^^^^^^^^
-
-Some variables and command arguments support internationalization via
-CMake script. This is an optional feature.
-
-Installers created by QtIFW tools have built-in support for
-internationalization and many phrases are localized to many languages,
-but this does not apply to the description of the your components and groups
-that will be distributed.
-
-Localization of the description of your components and groups is useful for
-users of your installers.
-
-A localized variable or argument can contain a single default value, and a
-set of pairs the name of the locale and the localized value.
-
-For example:
-
-.. code-block:: cmake
-
- set(LOCALIZABLE_VARIABLE "Default value"
- en "English value"
- en_US "American value"
- en_GB "Great Britain value"
- )
+To make use of this generator, QtIFW needs to be installed.
+The :module:`CPackIFW` module looks for the location of the
+QtIFW command-line utilities, and defines several commands to
+control the behavior of this generator.
Variables
^^^^^^^^^
@@ -157,6 +112,8 @@ Package
Default target directory for installation.
By default used
"@ApplicationsDir@/:variable:`CPACK_PACKAGE_INSTALL_DIRECTORY`"
+ (variables embedded in '@' are expanded by the
+ `QtIFW scripting engine <https://doc.qt.io/qtinstallerframework/scripting.html>`_).
You can use predefined variables.
@@ -263,55 +220,111 @@ Components
repack dependent components. This feature available only
since QtIFW 3.1.
-Tools
-"""""
+QtIFW Tools
+"""""""""""
.. variable:: CPACK_IFW_FRAMEWORK_VERSION
The version of used QtIFW tools.
-.. variable:: CPACK_IFW_BINARYCREATOR_EXECUTABLE
+The following variables provide the locations of the QtIFW
+command-line tools as discovered by the module :module:`CPackIFW`.
+These variables are cached, and may be configured if needed.
- The path to "binarycreator" command line client.
+.. variable:: CPACK_IFW_BINARYCREATOR_EXECUTABLE
- This variable is cached and may be configured if needed.
+ The path to ``binarycreator``.
.. variable:: CPACK_IFW_REPOGEN_EXECUTABLE
- The path to "repogen" command line client.
-
- This variable is cached and may be configured if needed.
+ The path to ``repogen``.
.. variable:: CPACK_IFW_INSTALLERBASE_EXECUTABLE
- The path to "installerbase" installer executable base.
-
- This variable is cached and may be configured if needed.
+ The path to ``installerbase``.
.. variable:: CPACK_IFW_DEVTOOL_EXECUTABLE
- The path to "devtool" command line client.
+ The path to ``devtool``.
+
+Hints for Finding QtIFW
+"""""""""""""""""""""""
+
+Generally, the CPack ``IFW`` generator automatically finds QtIFW tools,
+but if you don't use a default path for installation of the QtIFW tools,
+the path may be specified in either a CMake or an environment variable:
+
+.. variable:: CPACK_IFW_ROOT
- This variable is cached and may be configured if needed.
+ An CMake variable which specifies the location of the QtIFW tool suite.
+
+ The variable will be cached in the ``CPackConfig.cmake`` file and used at
+ CPack runtime.
+
+.. variable:: QTIFWDIR
+
+ An environment variable which specifies the location of the QtIFW tool
+ suite.
+
+.. note::
+ The specified path should not contain "bin" at the end
+ (for example: "D:\\DevTools\\QtIFW2.0.5").
+
+The :variable:`CPACK_IFW_ROOT` variable has a higher priority and overrides
+the value of the :variable:`QTIFWDIR` variable.
+Other Settings
+^^^^^^^^^^^^^^
Online installer
-^^^^^^^^^^^^^^^^
+""""""""""""""""
-By default CPack IFW generator makes offline installer. This means that all
-components will be packaged into a binary file.
+By default, this generator generates an *offline installer*. This means that
+that all packaged files are fully contained in the installer executable.
-To make a component downloaded, you must set the ``DOWNLOADED`` option in
-:command:`cpack_add_component`.
+In contrast, an *online installer* will download some or all components from
+a remote server.
-Then you would use the command :command:`cpack_configure_downloads`.
-If you set ``ALL`` option all components will be downloaded.
+The ``DOWNLOADED`` option in the :command:`cpack_add_component` command
+specifies that a component is to be downloaded. Alternatively, the ``ALL``
+option in the :command:`cpack_configure_downloads` command specifies that
+`all` components are to be be downloaded.
-You also can use command :command:`cpack_ifw_add_repository` and
-variable :variable:`CPACK_IFW_DOWNLOAD_ALL` for more specific configuration.
+The :command:`cpack_ifw_add_repository` command and the
+:variable:`CPACK_IFW_DOWNLOAD_ALL` variable allow for more specific
+configuration.
-CPack IFW generator creates "repository" dir in current binary dir. You
-would copy content of this dir to specified ``site`` (``url``).
+When there are online components, CPack will write them to archive files.
+The help page of the :module:`CPackComponent` module, especially the section
+on the :command:`cpack_configure_downloads` function, explains how to make
+these files accessible from a download URL.
+
+Internationalization
+""""""""""""""""""""
+
+Some variables and command arguments support internationalization via
+CMake script. This is an optional feature.
+
+Installers created by QtIFW tools have built-in support for
+internationalization and many phrases are localized to many languages,
+but this does not apply to the description of the your components and groups
+that will be distributed.
+
+Localization of the description of your components and groups is useful for
+users of your installers.
+
+A localized variable or argument can contain a single default value, and a
+set of pairs the name of the locale and the localized value.
+
+For example:
+
+.. code-block:: cmake
+
+ set(LOCALIZABLE_VARIABLE "Default value"
+ en "English value"
+ en_US "American value"
+ en_GB "Great Britain value"
+ )
See Also
^^^^^^^^
@@ -330,5 +343,5 @@ Qt Installer Framework Manual:
* Promoting Updates:
http://doc.qt.io/qtinstallerframework/ifw-updates.html
-Download Qt Installer Framework for you platform from Qt site:
+Download Qt Installer Framework for your platform from Qt site:
http://download.qt.io/official_releases/qt-installer-framework
diff --git a/Help/cpack_gen/nsis.rst b/Help/cpack_gen/nsis.rst
index d1e495f..0dd876e 100644
--- a/Help/cpack_gen/nsis.rst
+++ b/Help/cpack_gen/nsis.rst
@@ -155,3 +155,7 @@ on Windows Nullsoft Scriptable Install System.
.. variable:: CPACK_NSIS_MUI_HEADERIMAGE
The image to display on the header of installers pages.
+
+.. variable:: CPACK_NSIS_MANIFEST_DPI_AWARE
+
+ If set, declares that the installer is DPI-aware.
diff --git a/Help/cpack_gen/rpm.rst b/Help/cpack_gen/rpm.rst
index 2693c7b..66d5464 100644
--- a/Help/cpack_gen/rpm.rst
+++ b/Help/cpack_gen/rpm.rst
@@ -473,38 +473,42 @@ List of CPack RPM generator specific variables:
.. variable:: CPACK_RPM_PRE_INSTALL_SCRIPT_FILE
CPACK_RPM_PRE_UNINSTALL_SCRIPT_FILE
+ CPACK_RPM_PRE_TRANS_SCRIPT_FILE
- Path to file containing pre (un)install script.
+ Path to file containing pre install/uninstall/transaction script.
* Mandatory : NO
* Default : -
- May be used to embed a pre (un)installation script in the spec file.
+ May be used to embed a pre installation/uninstallation/transaction script in the spec file.
The referred script file (or both) will be read and directly
put after the ``%pre`` or ``%preun`` section
- If :variable:`CPACK_RPM_COMPONENT_INSTALL` is set to ON the (un)install
+ If :variable:`CPACK_RPM_COMPONENT_INSTALL` is set to ON the install/uninstall/transaction
script for each component can be overridden with
- ``CPACK_RPM_<COMPONENT>_PRE_INSTALL_SCRIPT_FILE`` and
- ``CPACK_RPM_<COMPONENT>_PRE_UNINSTALL_SCRIPT_FILE``.
+ ``CPACK_RPM_<COMPONENT>_PRE_INSTALL_SCRIPT_FILE``,
+ ``CPACK_RPM_<COMPONENT>_PRE_UNINSTALL_SCRIPT_FILE``, and
+ ``CPACK_RPM_<COMPONENT>_PRE_TRANS_SCRIPT_FILE``
One may verify which scriptlet has been included with::
rpm -qp --scripts package.rpm
.. variable:: CPACK_RPM_POST_INSTALL_SCRIPT_FILE
CPACK_RPM_POST_UNINSTALL_SCRIPT_FILE
+ CPACK_RPM_POST_TRANS_SCRIPT_FILE
- Path to file containing post (un)install script.
+ Path to file containing post install/uninstall/transaction script.
* Mandatory : NO
* Default : -
- May be used to embed a post (un)installation script in the spec file.
+ May be used to embed a post installation/uninstallation/transaction script in the spec file.
The referred script file (or both) will be read and directly
put after the ``%post`` or ``%postun`` section.
- If :variable:`CPACK_RPM_COMPONENT_INSTALL` is set to ON the (un)install
+ If :variable:`CPACK_RPM_COMPONENT_INSTALL` is set to ON the install/uninstall/transaction
script for each component can be overridden with
- ``CPACK_RPM_<COMPONENT>_POST_INSTALL_SCRIPT_FILE`` and
- ``CPACK_RPM_<COMPONENT>_POST_UNINSTALL_SCRIPT_FILE``.
+ ``CPACK_RPM_<COMPONENT>_POST_INSTALL_SCRIPT_FILE``,
+ ``CPACK_RPM_<COMPONENT>_POST_UNINSTALL_SCRIPT_FILE``, and
+ ``CPACK_RPM_<COMPONENT>_POST_TRANS_SCRIPT_FILE``
One may verify which scriptlet has been included with::
rpm -qp --scripts package.rpm
diff --git a/Help/dev/source.rst b/Help/dev/source.rst
index 0f7488b..0ccb8f4 100644
--- a/Help/dev/source.rst
+++ b/Help/dev/source.rst
@@ -23,12 +23,157 @@ format only a subset of files, such as those that are locally modified.
C++ Subset Permitted
====================
-CMake requires compiling as C++11 or above. However, in order to support
-building on older toolchains some constructs need to be handled with care:
+CMake requires compiling as C++11 in order to support building on older
+toolchains. However, to facilitate development, some standard library
+features from more recent C++ standards are supported through a compatibility
+layer. These features are defined under the namespace ``cm`` and headers
+are accessible under the ``cm/`` directory. The headers under ``cm/`` can
+be used in place of the standard ones when extended features are needed.
+For example ``<cm/memory>`` can be used in place of ``<memory>``.
-* Do not use ``std::auto_ptr``.
+Available features are:
- The ``std::auto_ptr`` template is deprecated in C++11. Use ``std::unique_ptr``.
+* From ``C++14``:
+
+ * ``<cm/iterator>``:
+ ``cm::make_reverse_iterator``, ``cm::cbegin``, ``cm::cend``,
+ ``cm::rbegin``, ``cm::rend``, ``cm::crbegin``, ``cm::crend``
+
+ * ``<cm/memory>``:
+ ``cm::make_unique``
+
+ * ``<cm/shared_mutex>``:
+ ``cm::shared_lock``
+
+ * ``<cm/type_traits>``:
+ ``cm::enable_if_t``
+
+* From ``C++17``:
+
+ * ``<cm/algorithm>``:
+ ``cm::clamp``
+
+ * ``<cm/iterator>``:
+ ``cm::size``, ``cm::empty``, ``cm::data``
+
+ * ``<cm/optional>``:
+ ``cm::nullopt_t``, ``cm::nullopt``, ``cm::optional``,
+ ``cm::make_optional``, ``cm::bad_optional_access``
+
+ * ``<cm/shared_mutex>``:
+ ``cm::shared_mutex``
+
+ * ``<cm/string_view>``:
+ ``cm::string_view``
+
+ * ``<cm/type_traits>``:
+ ``cm::bool_constant``, ``cm::invoke_result_t``, ``cm::invoke_result``,
+ ``cm::void_t``
+
+ * ``<cm/utility>``:
+ ``cm::in_place_t``, ``cm::in_place``
+
+* From ``C++20``:
+
+ * ``<cm/deque>``:
+ ``cm::erase``, ``cm::erase_if``
+
+ * ``<cm/list>``:
+ ``cm::erase``, ``cm::erase_if``
+
+ * ``<cm/map>`` :
+ ``cm::erase_if``
+
+ * ``<cm/set>`` :
+ ``cm::erase_if``
+
+ * ``<cm/string>``:
+ ``cm::erase``, ``cm::erase_if``
+
+ * ``<cm/unordered_map>``:
+ ``cm::erase_if``
+
+ * ``<cm/unordered_set>``:
+ ``cm::erase_if``
+
+ * ``<cm/vector>``:
+ ``cm::erase``, ``cm::erase_if``
+
+Additionally, some useful non-standard extensions to the C++ standard library
+are available in headers under the directory ``cmext/`` in namespace ``cm``.
+These are:
+
+* ``<cmext/algorithm>``:
+
+ * ``cm::append``:
+ Append elements to a sequential container.
+
+ * ``cm::contains``:
+ Checks if element or key is contained in container.
+
+* ``<cmext/iterator>``:
+
+ * ``cm::is_terator``:
+ Checks if a type is an iterator type.
+
+ * ``cm::is_input_iterator``:
+ Checks if a type is an input iterator type.
+
+ * ``cm::is_range``:
+ Checks if a type is a range type: functions ``std::begin()`` and
+ ``std::end()`` apply.
+
+ * ``cm::is_input_range``:
+ Checks if a type is an input range type: functions ``std::begin()`` and
+ ``std::end()`` apply and return an input iterator.
+
+* ``<cmext/memory>``:
+
+ * ``cm::static_reference_cast``:
+ Apply a ``static_cast`` to a smart pointer.
+
+ * ``cm::dynamic_reference_cast``:
+ Apply a ``dynamic_cast`` to a smart pointer.
+
+* ``<cmext/type_traits>``:
+
+ * ``cm::is_container``:
+ Checks if a type is a container type.
+
+ * ``cm::is_associative_container``:
+ Checks if a type is an associative container type.
+
+ * ``cm::is_unordered_associative_container``:
+ Checks if a type is an unordered associative container type.
+
+ * ``cm::is_sequence_container``:
+ Checks if a type is a sequence container type.
+
+ * ``cm::is_unique_ptr``:
+ Checks if a type is a ``std::unique_ptr`` type.
+
+Dynamic Memory Management
+=========================
+
+To ensure efficient memory management, i.e. no memory leaks, it is required
+to use smart pointers. Any dynamic memory allocation must be handled by a
+smart pointer such as ``std::unique_ptr`` or ``std::shared_ptr``.
+
+It is allowed to pass raw pointers between objects to enable objects sharing.
+A raw pointer **must** not be deleted. Only the object(s) owning the smart
+pointer are allowed to delete dynamically allocated memory.
+
+Third Parties
+=============
+
+To build CMake, some third parties are needed. Under ``Utilities``
+directory, are versions of these third parties which can be used as an
+alternate to the ones provided by the system.
+
+To enable the selection of the third parties between the system and CMake ones,
+in CMake sources, third parties headers must be prefixed by ``cm3p/``
+(for example: ``<cm3p/json/reader.h>``). These wrappers are located under
+``Utilities/cm3p`` directory.
Source Tree Layout
==================
@@ -69,6 +214,15 @@ The CMake source tree is organized as follows.
* ``Utilities/``:
Scripts, third-party source code.
+ * ``Utilities/std/cm``:
+ Support files for various C++ standards.
+
+ * ``Utilities/std/cmext``:
+ Extensions to the C++ STL.
+
+ * ``Utilities/cm3p``:
+ Public headers for third parties needed to build CMake.
+
* ``Utilities/Sphinx/``:
Sphinx configuration to build CMake user documentation.
diff --git a/Help/envvar/CCMAKE_COLORS.rst b/Help/envvar/CCMAKE_COLORS.rst
new file mode 100644
index 0000000..d4750c3
--- /dev/null
+++ b/Help/envvar/CCMAKE_COLORS.rst
@@ -0,0 +1,34 @@
+CCMAKE_COLORS
+-------------
+
+Determines what colors are used by the CMake curses interface,
+when run on a terminal that supports colors.
+The syntax follows the same conventions as ``LS_COLORS``;
+that is, a list of key/value pairs separated by ``:``.
+
+Keys are a single letter corresponding to a CMake cache variable type:
+
+- ``s``: A ``STRING``.
+- ``p``: A ``FILEPATH``.
+- ``c``: A value which has an associated list of choices.
+- ``y``: A ``BOOL`` which has a true-like value (e.g. ``ON``, ``YES``).
+- ``n``: A ``BOOL`` which has a false-like value (e.g. ``OFF``, ``NO``).
+
+Values are an integer number that specifies what color to use.
+``0`` is black (you probably don't want to use that).
+Others are determined by your terminal's color support.
+Most (color) terminals will support at least 8 or 16 colors.
+Some will support up to 256 colors. The colors will likely match
+`this chart <https://upload.wikimedia.org/wikipedia/commons/1/15/Xterm_256color_chart.svg>`_,
+although the first 16 colors may match the original
+`CGA color palette <https://en.wikipedia.org/wiki/Color_Graphics_Adapter#Color_palette>`_.
+(Many modern terminal emulators also allow their color palette,
+at least for the first 16 colors, to be configured by the user.)
+
+Note that fairly minimal checking is done for bad colors
+(although a value higher than what curses believes your terminal supports
+will be silently ignored) or bad syntax.
+
+For example::
+
+ CCMAKE_COLORS='s=39:p=220:c=207:n=196:y=46'
diff --git a/Help/envvar/CMAKE_PREFIX_PATH.rst b/Help/envvar/CMAKE_PREFIX_PATH.rst
new file mode 100644
index 0000000..276fdd6
--- /dev/null
+++ b/Help/envvar/CMAKE_PREFIX_PATH.rst
@@ -0,0 +1,17 @@
+CMAKE_PREFIX_PATH
+-----------------
+
+.. include:: ENV_VAR.txt
+
+The ``CMAKE_PREFIX_PATH`` environment variable may be set to a list of
+directories specifying installation *prefixes* to be searched by the
+:command:`find_package`, :command:`find_program`, :command:`find_library`,
+:command:`find_file`, and :command:`find_path` commands. Each command will
+add appropriate subdirectories (like ``bin``, ``lib``, or ``include``)
+as specified in its own documentation.
+
+This variable may hold a single prefix or a list of prefixes separated
+by ``:`` on UNIX or ``;`` on Windows (the same as the ``PATH`` environment
+variable convention on those platforms).
+
+See also the :variable:`CMAKE_PREFIX_PATH` CMake variable.
diff --git a/Help/guide/tutorial/Step5/MathFunctions/MakeTable.cxx b/Help/guide/tutorial/Step5/MathFunctions/MakeTable.cxx
deleted file mode 100644
index ee58556..0000000
--- a/Help/guide/tutorial/Step5/MathFunctions/MakeTable.cxx
+++ /dev/null
@@ -1,25 +0,0 @@
-// A simple program that builds a sqrt table
-#include <cmath>
-#include <fstream>
-#include <iostream>
-
-int main(int argc, char* argv[])
-{
- // make sure we have enough arguments
- if (argc < 2) {
- return 1;
- }
-
- std::ofstream fout(argv[1], std::ios_base::out);
- const bool fileOpen = fout.is_open();
- if (fileOpen) {
- fout << "double sqrtTable[] = {" << std::endl;
- for (int i = 0; i < 10; ++i) {
- fout << sqrt(static_cast<double>(i)) << "," << std::endl;
- }
- // close the table with a zero
- fout << "0};" << std::endl;
- fout.close();
- }
- return fileOpen ? 0 : 1; // return 0 if wrote the file
-}
diff --git a/Help/guide/tutorial/Step6/MathFunctions/CMakeLists.txt b/Help/guide/tutorial/Step6/MathFunctions/CMakeLists.txt
index 4bf6024..f64c6ac 100644
--- a/Help/guide/tutorial/Step6/MathFunctions/CMakeLists.txt
+++ b/Help/guide/tutorial/Step6/MathFunctions/CMakeLists.txt
@@ -8,10 +8,20 @@ target_include_directories(MathFunctions
# does this system provide the log and exp functions?
include(CheckSymbolExists)
-set(CMAKE_REQUIRED_LIBRARIES "m")
check_symbol_exists(log "math.h" HAVE_LOG)
check_symbol_exists(exp "math.h" HAVE_EXP)
+if(NOT (HAVE_LOG AND HAVE_EXP))
+ unset(HAVE_LOG CACHE)
+ unset(HAVE_EXP CACHE)
+ set(CMAKE_REQUIRED_LIBRARIES "m")
+ check_symbol_exists(log "math.h" HAVE_LOG)
+ check_symbol_exists(exp "math.h" HAVE_EXP)
+ if(HAVE_LOG AND HAVE_EXP)
+ target_link_libraries(MathFunctions PRIVATE m)
+ endif()
+endif()
+# add compile definitions
if(HAVE_LOG AND HAVE_EXP)
target_compile_definitions(MathFunctions
PRIVATE "HAVE_LOG" "HAVE_EXP")
diff --git a/Help/guide/tutorial/index.rst b/Help/guide/tutorial/index.rst
index a844cbf..6e26de9 100644
--- a/Help/guide/tutorial/index.rst
+++ b/Help/guide/tutorial/index.rst
@@ -380,13 +380,17 @@ tutorial assume that they are not common.
If the platform has ``log`` and ``exp`` then we will use them to compute the
square root in the ``mysqrt`` function. We first test for the availability of
these functions using the :module:`CheckSymbolExists` module in the top-level
-``CMakeLists.txt``. We're going to use the new defines in
-``TutorialConfig.h.in``, so be sure to set them before that file is configured.
+``CMakeLists.txt``. On some platforms, we will need to link to the m library.
+If ``log`` and ``exp`` are not initially found, require the m library and try
+again.
+
+We're going to use the new defines in ``TutorialConfig.h.in``, so be sure to
+set them before that file is configured.
.. literalinclude:: Step6/MathFunctions/CMakeLists.txt
:language: cmake
:start-after: # does this system provide the log and exp functions?
- :end-before: if(HAVE_LOG AND HAVE_EXP)
+ :end-before: # add compile definitions
Now let's add these defines to ``TutorialConfig.h.in`` so that we can use them
from ``mysqrt.cxx``:
diff --git a/Help/guide/user-interaction/index.rst b/Help/guide/user-interaction/index.rst
index 3a1038f..c724b6f 100644
--- a/Help/guide/user-interaction/index.rst
+++ b/Help/guide/user-interaction/index.rst
@@ -86,6 +86,7 @@ populated. It is always advised to use different
directories for the source and the build.
.. image:: /guide/user-interaction/GUI-Source-Binary.png
+ :alt: Choosing source and binary directories
Generating a Buildsystem
========================
@@ -246,16 +247,19 @@ The "Configure" button triggers a new dialog to
select the CMake generator to use.
.. image:: /guide/user-interaction/GUI-Configure-Dialog.png
+ :alt: Configuring a generator
All generators available on the command line are also
available in :manual:`cmake-gui(1)`.
.. image:: /guide/user-interaction/GUI-Choose-Generator.png
+ :alt: Choosing a generator
When choosing a Visual Studio generator, further options
are available to set an architecture to generate for.
.. image:: /manual/VS-Choose-Arch.png
+ :alt: Choosing an architecture for Visual Studio generators
.. _`Setting Build Variables`:
@@ -356,6 +360,7 @@ button. This triggers a new dialog to set the value of
the variable.
.. image:: /guide/user-interaction/GUI-Add-Entry.png
+ :alt: Editing a cache entry
The main view of the :manual:`cmake-gui(1)` user interface
can be used to edit existing variables.
diff --git a/Help/manual/cmake-commands.7.rst b/Help/manual/cmake-commands.7.rst
index 59ba897..87743b4 100644
--- a/Help/manual/cmake-commands.7.rst
+++ b/Help/manual/cmake-commands.7.rst
@@ -16,6 +16,7 @@ These commands are always available.
:maxdepth: 1
/command/break
+ /command/cmake_command
/command/cmake_host_system_information
/command/cmake_minimum_required
/command/cmake_parse_arguments
diff --git a/Help/manual/cmake-env-variables.7.rst b/Help/manual/cmake-env-variables.7.rst
index f72e414..ce1e360 100644
--- a/Help/manual/cmake-env-variables.7.rst
+++ b/Help/manual/cmake-env-variables.7.rst
@@ -14,6 +14,13 @@ For general information on environment variables, see the
:ref:`Environment Variables <CMake Language Environment Variables>`
section in the cmake-language manual.
+Environment Variables that Change Behavior
+==========================================
+
+.. toctree::
+ :maxdepth: 1
+
+ /envvar/CMAKE_PREFIX_PATH
Environment Variables that Control the Build
============================================
@@ -75,3 +82,11 @@ Environment Variables for CTest
/envvar/CTEST_PROGRESS_OUTPUT
/envvar/CTEST_USE_LAUNCHERS_DEFAULT
/envvar/DASHBOARD_TEST_FROM_CTEST
+
+Environment Variables for the CMake curses interface
+====================================================
+
+.. toctree::
+ :maxdepth: 1
+
+ /envvar/CCMAKE_COLORS
diff --git a/Help/manual/cmake-generator-expressions.7.rst b/Help/manual/cmake-generator-expressions.7.rst
index 691481b..9e411a4 100644
--- a/Help/manual/cmake-generator-expressions.7.rst
+++ b/Help/manual/cmake-generator-expressions.7.rst
@@ -259,6 +259,121 @@ Variable Queries
add_executable(myapp main.cpp)
target_link_libraries(myapp myapp_c myapp_cxx)
+.. _`Boolean LINK_LANGUAGE Generator Expression`:
+
+``$<LINK_LANG_AND_ID:language,compiler_ids>``
+ ``1`` when the language used for link step matches ``language`` and the
+ CMake's compiler id of the language linker matches any one of the entries
+ in ``compiler_ids``, otherwise ``0``. This expression is a short form for the
+ combination of ``$<LINK_LANGUAGE:language>`` and
+ ``$<LANG_COMPILER_ID:compiler_ids>``. This expression may be used to specify
+ link libraries, link options, link directories and link dependencies of a
+ particular language and linker combination in a target. For example:
+
+ .. code-block:: cmake
+
+ add_library(libC_Clang ...)
+ add_library(libCXX_Clang ...)
+ add_library(libC_Intel ...)
+ add_library(libCXX_Intel ...)
+
+ add_executable(myapp main.c)
+ if (CXX_CONFIG)
+ target_sources(myapp PRIVATE file.cxx)
+ endif()
+ target_link_libraries(myapp
+ PRIVATE $<$<LINK_LANG_AND_ID:CXX,Clang,AppleClang>:libCXX_Clang>
+ $<$<LINK_LANG_AND_ID:C,Clang,AppleClang>:libC_Clang>
+ $<$<LINK_LANG_AND_ID:CXX,Intel>:libCXX_Intel>
+ $<$<LINK_LANG_AND_ID:C,Intel>:libC_Intel>)
+
+ This specifies the use of different link libraries based on both the
+ compiler id and link language. This example will have target ``libCXX_Clang``
+ as link dependency when ``Clang`` or ``AppleClang`` is the ``CXX``
+ linker, and ``libCXX_Intel`` when ``Intel`` is the ``CXX`` linker.
+ Likewise when the ``C`` linker is ``Clang`` or ``AppleClang``, target
+ ``libC_Clang`` will be added as link dependency and ``libC_Intel`` when
+ ``Intel`` is the ``C`` linker.
+
+ See :ref:`the note related to
+ <Constraints LINK_LANGUAGE Generator Expression>`
+ ``$<LINK_LANGUAGE:language>`` for constraints about the usage of this
+ generator expression.
+
+``$<LINK_LANGUAGE:languages>``
+ ``1`` when the language used for link step matches any of the entries
+ in ``languages``, otherwise ``0``. This expression may be used to specify
+ link libraries, link options, link directories and link dependencies of a
+ particular language in a target. For example:
+
+ .. code-block:: cmake
+
+ add_library(api_C ...)
+ add_library(api_CXX ...)
+ add_library(api INTERFACE)
+ target_link_options(api INTERFACE $<$<LINK_LANGUAGE:C>:-opt_c>
+ $<$<LINK_LANGUAGE:CXX>:-opt_cxx>)
+ target_link_libraries(api INTERFACE $<$<LINK_LANGUAGE:C>:api_C>
+ $<$<LINK_LANGUAGE:CXX>:api_CXX>)
+
+ add_executable(myapp1 main.c)
+ target_link_options(myapp1 PRIVATE api)
+
+ add_executable(myapp2 main.cpp)
+ target_link_options(myapp2 PRIVATE api)
+
+ This specifies to use the ``api`` target for linking targets ``myapp1`` and
+ ``myapp2``. In practice, ``myapp1`` will link with target ``api_C`` and
+ option ``-opt_c`` because it will use ``C`` as link language. And ``myapp2``
+ will link with ``api_CXX`` and option ``-opt_cxx`` because ``CXX`` will be
+ the link language.
+
+ .. _`Constraints LINK_LANGUAGE Generator Expression`:
+
+ .. note::
+
+ To determine the link language of a target, it is required to collect,
+ transitively, all the targets which will be linked to it. So, for link
+ libraries properties, a double evaluation will be done. During the first
+ evaluation, ``$<LINK_LANGUAGE:..>`` expressions will always return ``0``.
+ The link language computed after this first pass will be used to do the
+ second pass. To avoid inconsistency, it is required that the second pass
+ do not change the link language. Moreover, to avoid unexpected
+ side-effects, it is required to specify complete entities as part of the
+ ``$<LINK_LANGUAGE:..>`` expression. For example:
+
+ .. code-block:: cmake
+
+ add_library(lib STATIC file.cxx)
+ add_library(libother STATIC file.c)
+
+ # bad usage
+ add_executable(myapp1 main.c)
+ target_link_libraries(myapp1 PRIVATE lib$<$<LINK_LANGUAGE:C>:other>)
+
+ # correct usage
+ add_executable(myapp2 main.c)
+ target_link_libraries(myapp2 PRIVATE $<$<LINK_LANGUAGE:C>:libother>)
+
+ In this example, for ``myapp1``, the first pass will, unexpectedly,
+ determine that the link language is ``CXX`` because the evaluation of the
+ generator expression will be an empty string so ``myapp1`` will depends on
+ target ``lib`` which is ``C++``. On the contrary, for ``myapp2``, the first
+ evaluation will give ``C`` as link language, so the second pass will
+ correctly add target ``libother`` as link dependency.
+
+``$<DEVICE_LINK:list>``
+ Returns the list if it is the device link step, an empty list otherwise.
+ The device link step is controlled by :prop_tgt:`CUDA_SEPARABLE_COMPILATION`
+ and :prop_tgt:`CUDA_RESOLVE_DEVICE_SYMBOLS` properties. This expression can
+ only be used to specify link options.
+
+``$<HOST_LINK:list>``
+ Returns the list if it is the normal link step, an empty list otherwise.
+ This expression is mainly useful when a device link step is also involved
+ (see ``$<DEVICE_LINK:list>`` generator expression). This expression can only
+ be used to specify link options.
+
String-Valued Generator Expressions
===================================
@@ -450,22 +565,41 @@ Variable Queries
<Boolean COMPILE_LANGUAGE Generator Expression>`
``$<COMPILE_LANGUAGE:language>``
for notes about the portability of this generator expression.
+``$<LINK_LANGUAGE>``
+ The link language of target when evaluating link options.
+ See :ref:`the related boolean expression
+ <Boolean LINK_LANGUAGE Generator Expression>` ``$<LINK_LANGUAGE:language>``
+ for notes about the portability of this generator expression.
+
+ .. note::
+
+ This generator expression is not supported by the link libraries
+ properties to avoid side-effects due to the double evaluation of
+ these properties.
Target-Dependent Queries
------------------------
+These queries refer to a target ``tgt``. This can be any runtime artifact,
+namely:
+
+* an executable target created by :command:`add_executable`
+* a shared library target (``.so``, ``.dll`` but not their ``.lib`` import library)
+ created by :command:`add_library`
+* a static library target created by :command:`add_library`
+
+In the following, "the ``tgt`` filename" means the name of the ``tgt``
+binary file. This has to be distinguished from "the target name",
+which is just the string ``tgt``.
+
``$<TARGET_NAME_IF_EXISTS:tgt>``
- Expands to the ``tgt`` if the given target exists, an empty string
- otherwise.
+ The target name ``tgt`` if the target exists, an empty string otherwise.
``$<TARGET_FILE:tgt>``
- Full path to main file (.exe, .so.1.2, .a) where ``tgt`` is the name of a
- target.
+ Full path to the ``tgt`` binary file.
``$<TARGET_FILE_BASE_NAME:tgt>``
- Base name of main file where ``tgt`` is the name of a target.
-
- The base name corresponds to the target file name (see
- ``$<TARGET_FILE_NAME:tgt>``) without prefix and suffix. For example, if
- target file name is ``libbase.so``, the base name is ``base``.
+ Base name of ``tgt``, i.e. ``$<TARGET_FILE_NAME:tgt>`` without prefix and
+ suffix.
+ For example, if the ``tgt`` filename is ``libbase.so``, the base name is ``base``.
See also the :prop_tgt:`OUTPUT_NAME`, :prop_tgt:`ARCHIVE_OUTPUT_NAME`,
:prop_tgt:`LIBRARY_OUTPUT_NAME` and :prop_tgt:`RUNTIME_OUTPUT_NAME`
@@ -480,32 +614,31 @@ Target-Dependent Queries
Note that ``tgt`` is not added as a dependency of the target this
expression is evaluated on.
``$<TARGET_FILE_PREFIX:tgt>``
- Prefix of main file where ``tgt`` is the name of a target.
+ Prefix of the ``tgt`` filename (such as ``lib``).
See also the :prop_tgt:`PREFIX` target property.
Note that ``tgt`` is not added as a dependency of the target this
expression is evaluated on.
``$<TARGET_FILE_SUFFIX:tgt>``
- Suffix of main file where ``tgt`` is the name of a target.
-
- The suffix corresponds to the file extension (such as ".so" or ".exe").
+ Suffix of the ``tgt`` filename (extension such as ``.so`` or ``.exe``).
See also the :prop_tgt:`SUFFIX` target property.
Note that ``tgt`` is not added as a dependency of the target this
expression is evaluated on.
``$<TARGET_FILE_NAME:tgt>``
- Name of main file (.exe, .so.1.2, .a).
+ The ``tgt`` filename.
``$<TARGET_FILE_DIR:tgt>``
- Directory of main file (.exe, .so.1.2, .a).
+ Directory of the ``tgt`` binary file.
``$<TARGET_LINKER_FILE:tgt>``
- File used to link (.a, .lib, .so) where ``tgt`` is the name of a target.
+ File used when linking to the ``tgt`` target. This will usually
+ be the library that ``tgt`` represents (``.a``, ``.lib``, ``.so``),
+ but for a shared library on DLL platforms, it would be the ``.lib``
+ import library associated with the DLL.
``$<TARGET_LINKER_FILE_BASE_NAME:tgt>``
- Base name of file used to link where ``tgt`` is the name of a target.
-
- The base name corresponds to the target linker file name (see
- ``$<TARGET_LINKER_FILE_NAME:tgt>``) without prefix and suffix. For example,
+ Base name of file used to link the target ``tgt``, i.e.
+ ``$<TARGET_LINKER_FILE_NAME:tgt>`` without prefix and suffix. For example,
if target file name is ``libbase.a``, the base name is ``base``.
See also the :prop_tgt:`OUTPUT_NAME`, :prop_tgt:`ARCHIVE_OUTPUT_NAME`,
@@ -520,7 +653,7 @@ Target-Dependent Queries
Note that ``tgt`` is not added as a dependency of the target this
expression is evaluated on.
``$<TARGET_LINKER_FILE_PREFIX:tgt>``
- Prefix of file used to link where ``tgt`` is the name of a target.
+ Prefix of file used to link target ``tgt``.
See also the :prop_tgt:`PREFIX` and :prop_tgt:`IMPORT_PREFIX` target
properties.
@@ -538,15 +671,15 @@ Target-Dependent Queries
Note that ``tgt`` is not added as a dependency of the target this
expression is evaluated on.
``$<TARGET_LINKER_FILE_NAME:tgt>``
- Name of file used to link (.a, .lib, .so).
+ Name of file used to link target ``tgt``.
``$<TARGET_LINKER_FILE_DIR:tgt>``
- Directory of file used to link (.a, .lib, .so).
+ Directory of file used to link target ``tgt``.
``$<TARGET_SONAME_FILE:tgt>``
- File with soname (.so.3) where ``tgt`` is the name of a target.
+ File with soname (``.so.3``) where ``tgt`` is the name of a target.
``$<TARGET_SONAME_FILE_NAME:tgt>``
- Name of file with soname (.so.3).
+ Name of file with soname (``.so.3``).
``$<TARGET_SONAME_FILE_DIR:tgt>``
- Directory of with soname (.so.3).
+ Directory of with soname (``.so.3``).
``$<TARGET_PDB_FILE:tgt>``
Full path to the linker generated program database file (.pdb)
where ``tgt`` is the name of a target.
@@ -589,11 +722,10 @@ Target-Dependent Queries
Note that ``tgt`` is not added as a dependency of the target this
expression is evaluated on.
``$<TARGET_PROPERTY:prop>``
- Value of the property ``prop`` on the target on which the generator
- expression is evaluated. Note that for generator expressions in
- :ref:`Target Usage Requirements` this is the value of the property
- on the consuming target rather than the target specifying the
- requirement.
+ Value of the property ``prop`` on the target for which the expression
+ is being evaluated. Note that for generator expressions in
+ :ref:`Target Usage Requirements` this is the consuming target rather
+ than the target specifying the requirement.
``$<INSTALL_PREFIX>``
Content of the install prefix when the target is exported via
:command:`install(EXPORT)`, or when evaluated in
diff --git a/Help/manual/cmake-policies.7.rst b/Help/manual/cmake-policies.7.rst
index c256250..3f3b70d 100644
--- a/Help/manual/cmake-policies.7.rst
+++ b/Help/manual/cmake-policies.7.rst
@@ -51,6 +51,17 @@ The :variable:`CMAKE_MINIMUM_REQUIRED_VERSION` variable may also be used
to determine whether to report an error on use of deprecated macros or
functions.
+Policies Introduced by CMake 3.18
+=================================
+
+.. toctree::
+ :maxdepth: 1
+
+ CMP0106: The Documentation module is removed. </policy/CMP0106>
+ CMP0105: Device link step uses the link options. </policy/CMP0105>
+ CMP0104: CMAKE_CUDA_ARCHITECTURES now detected for NVCC, empty CUDA_ARCHITECTURES not allowed. </policy/CMP0104>
+ CMP0103: Multiple export() with same FILE without APPEND is not allowed. </policy/CMP0103>
+
Policies Introduced by CMake 3.17
=================================
diff --git a/Help/manual/cmake-properties.7.rst b/Help/manual/cmake-properties.7.rst
index 060a072..4103806 100644
--- a/Help/manual/cmake-properties.7.rst
+++ b/Help/manual/cmake-properties.7.rst
@@ -127,6 +127,7 @@ Properties on Targets
/prop_tgt/ARCHIVE_OUTPUT_DIRECTORY
/prop_tgt/ARCHIVE_OUTPUT_NAME_CONFIG
/prop_tgt/ARCHIVE_OUTPUT_NAME
+ /prop_tgt/PCH_WARN_INVALID
/prop_tgt/AUTOGEN_BUILD_DIR
/prop_tgt/AUTOGEN_ORIGIN_DEPENDS
/prop_tgt/AUTOGEN_PARALLEL
@@ -171,6 +172,7 @@ Properties on Targets
/prop_tgt/CONFIG_OUTPUT_NAME
/prop_tgt/CONFIG_POSTFIX
/prop_tgt/CROSSCOMPILING_EMULATOR
+ /prop_tgt/CUDA_ARCHITECTURES
/prop_tgt/CUDA_PTX_COMPILATION
/prop_tgt/CUDA_SEPARABLE_COMPILATION
/prop_tgt/CUDA_RESOLVE_DEVICE_SYMBOLS
@@ -200,6 +202,7 @@ Properties on Targets
/prop_tgt/Fortran_FORMAT
/prop_tgt/Fortran_MODULE_DIRECTORY
/prop_tgt/FRAMEWORK
+ /prop_tgt/FRAMEWORK_MULTI_CONFIG_POSTFIX_CONFIG
/prop_tgt/FRAMEWORK_VERSION
/prop_tgt/GENERATOR_FILE_NAME
/prop_tgt/GHS_INTEGRITY_APP
@@ -343,6 +346,7 @@ Properties on Targets
/prop_tgt/UNITY_BUILD_BATCH_SIZE
/prop_tgt/UNITY_BUILD_CODE_AFTER_INCLUDE
/prop_tgt/UNITY_BUILD_CODE_BEFORE_INCLUDE
+ /prop_tgt/UNITY_BUILD_MODE
/prop_tgt/VERSION
/prop_tgt/VISIBILITY_INLINES_HIDDEN
/prop_tgt/VS_CONFIGURATION_TYPE
@@ -369,12 +373,15 @@ Properties on Targets
/prop_tgt/VS_MOBILE_EXTENSIONS_VERSION
/prop_tgt/VS_NO_SOLUTION_DEPLOY
/prop_tgt/VS_PACKAGE_REFERENCES
+ /prop_tgt/VS_PLATFORM_TOOLSET
/prop_tgt/VS_PROJECT_IMPORT
/prop_tgt/VS_SCC_AUXPATH
/prop_tgt/VS_SCC_LOCALPATH
/prop_tgt/VS_SCC_PROJECTNAME
/prop_tgt/VS_SCC_PROVIDER
/prop_tgt/VS_SDK_REFERENCES
+ /prop_tgt/VS_SOLUTION_DEPLOY
+ /prop_tgt/VS_SOURCE_SETTINGS_tool
/prop_tgt/VS_USER_PROPS
/prop_tgt/VS_WINDOWS_TARGET_PLATFORM_MIN_VERSION
/prop_tgt/VS_WINRT_COMPONENT
@@ -478,12 +485,14 @@ Properties on Source Files
/prop_sf/Swift_DEPENDENCIES_FILE
/prop_sf/Swift_DIAGNOSTICS_FILE
/prop_sf/SYMBOLIC
+ /prop_sf/UNITY_GROUP
/prop_sf/VS_COPY_TO_OUT_DIR
/prop_sf/VS_CSHARP_tagname
/prop_sf/VS_DEPLOYMENT_CONTENT
/prop_sf/VS_DEPLOYMENT_LOCATION
/prop_sf/VS_INCLUDE_IN_VSIX
/prop_sf/VS_RESOURCE_GENERATOR
+ /prop_sf/VS_SETTINGS
/prop_sf/VS_SHADER_DISABLE_OPTIMIZATIONS
/prop_sf/VS_SHADER_ENABLE_DEBUG
/prop_sf/VS_SHADER_ENTRYPOINT
diff --git a/Help/manual/cmake-variables.7.rst b/Help/manual/cmake-variables.7.rst
index fc27739..7d802e1 100644
--- a/Help/manual/cmake-variables.7.rst
+++ b/Help/manual/cmake-variables.7.rst
@@ -388,6 +388,7 @@ Variables that Control the Build
/variable/CMAKE_EXE_LINKER_FLAGS_INIT
/variable/CMAKE_FOLDER
/variable/CMAKE_FRAMEWORK
+ /variable/CMAKE_FRAMEWORK_MULTI_CONFIG_POSTFIX_CONFIG
/variable/CMAKE_Fortran_FORMAT
/variable/CMAKE_Fortran_MODULE_DIRECTORY
/variable/CMAKE_GHS_NO_SOURCE_GROUP_FILE
@@ -437,6 +438,7 @@ Variables that Control the Build
/variable/CMAKE_OSX_ARCHITECTURES
/variable/CMAKE_OSX_DEPLOYMENT_TARGET
/variable/CMAKE_OSX_SYSROOT
+ /variable/CMAKE_PCH_WARN_INVALID
/variable/CMAKE_PDB_OUTPUT_DIRECTORY
/variable/CMAKE_PDB_OUTPUT_DIRECTORY_CONFIG
/variable/CMAKE_POSITION_INDEPENDENT_CODE
@@ -486,6 +488,7 @@ Variables for Languages
/variable/CMAKE_COMPILER_IS_GNUCC
/variable/CMAKE_COMPILER_IS_GNUCXX
/variable/CMAKE_COMPILER_IS_GNUG77
+ /variable/CMAKE_CUDA_ARCHITECTURES
/variable/CMAKE_CUDA_COMPILE_FEATURES
/variable/CMAKE_CUDA_HOST_COMPILER
/variable/CMAKE_CUDA_EXTENSIONS
@@ -621,6 +624,7 @@ Variables for CTest
/variable/CTEST_P4_COMMAND
/variable/CTEST_P4_OPTIONS
/variable/CTEST_P4_UPDATE_OPTIONS
+ /variable/CTEST_RESOURCE_SPEC_FILE
/variable/CTEST_RUN_CURRENT_SCRIPT
/variable/CTEST_SCP_COMMAND
/variable/CTEST_SITE
diff --git a/Help/manual/cmake.1.rst b/Help/manual/cmake.1.rst
index d343874..9becfc6 100644
--- a/Help/manual/cmake.1.rst
+++ b/Help/manual/cmake.1.rst
@@ -358,6 +358,20 @@ Options
in :variable:`CMAKE_SOURCE_DIR` and :variable:`CMAKE_BINARY_DIR`.
This flag tells CMake to warn about other files as well.
+``--profiling-output=<path>``
+ Used in conjuction with ``--profiling-format`` to output to a given path.
+
+``--profiling-format=<file>``
+ Enable the output of profiling data of CMake script in the given format.
+
+ This can aid performance analysis of CMake scripts executed. Third party
+ applications should be used to process the output into human readable format.
+
+ Currently supported values are:
+ ``google-trace`` Outputs in Google Trace Format, which can be parsed by the
+ about:tracing tab of Google Chrome or using a plugin for a tool like Trace
+ Compass.
+
.. _`Build Tool Mode`:
Build a Project
@@ -467,13 +481,17 @@ Run a Script
.. code-block:: shell
- cmake [{-D <var>=<value>}...] -P <cmake-script-file>
+ cmake [{-D <var>=<value>}...] -P <cmake-script-file> [-- <unparsed-options>...]
Process the given cmake file as a script written in the CMake
language. No configure or generate step is performed and the cache
is not modified. If variables are defined using ``-D``, this must be
done before the ``-P`` argument.
+Any options after ``--`` are not parsed by CMake, but they are still included
+in the set of :variable:`CMAKE_ARGV<n> <CMAKE_ARGV0>` variables passed to the
+script (including the ``--`` itself).
+
Run a Command-Line Tool
=======================
@@ -540,6 +558,9 @@ Available commands are:
``serverMode``
``true`` if cmake supports server-mode and ``false`` otherwise.
+``cat <files>...``
+ Concatenate files and print on the standard output.
+
``chdir <dir> <cmd> [<arg>...]``
Change the current working directory and run a command.
diff --git a/Help/manual/ctest.1.rst b/Help/manual/ctest.1.rst
index 6503f0e..5f953b3 100644
--- a/Help/manual/ctest.1.rst
+++ b/Help/manual/ctest.1.rst
@@ -72,6 +72,9 @@ Options
This option can also be enabled by setting the
:envvar:`CTEST_OUTPUT_ON_FAILURE` environment variable
+``--stop-on-failure``
+ Stop running the tests when the first failure happens.
+
``-F``
Enable failover.
@@ -994,8 +997,12 @@ Configuration settings include:
``ResourceSpecFile``
Specify a
- :ref:`resource specification file <ctest-resource-specification-file>`. See
- :ref:`ctest-resource-allocation` for more information.
+ :ref:`resource specification file <ctest-resource-specification-file>`.
+
+ * `CTest Script`_ variable: :variable:`CTEST_RESOURCE_SPEC_FILE`
+ * :module:`CTest` module variable: ``CTEST_RESOURCE_SPEC_FILE``
+
+ See :ref:`ctest-resource-allocation` for more information.
``LabelsForSubprojects``
Specify a semicolon-separated list of labels that will be treated as
diff --git a/Help/policy/CMP0103.rst b/Help/policy/CMP0103.rst
new file mode 100644
index 0000000..223e0cb
--- /dev/null
+++ b/Help/policy/CMP0103.rst
@@ -0,0 +1,22 @@
+CMP0103
+-------
+
+Multiple calls to :command:`export` command with same ``FILE`` without
+``APPEND`` is no longer allowed.
+
+In CMake 3.17 and below, multiple calls to :command:`export` command with the
+same ``FILE`` without ``APPEND`` are accepted silently but only the last
+occurrence is taken into account during the generation.
+
+The ``OLD`` behavior for this policy is to ignore the multiple occurrences of
+ :command:`export` command except the last one.
+
+The ``NEW`` behavior of this policy is to raise an error on second call to
+:command:`export` command with same ``FILE`` without ``APPEND``.
+
+This policy was introduced in CMake version 3.18. CMake version
+|release| warns when the policy is not set and uses ``OLD`` behavior.
+Use the :command:`cmake_policy` command to set it to ``OLD`` or ``NEW``
+explicitly.
+
+.. include:: DEPRECATED.txt
diff --git a/Help/policy/CMP0104.rst b/Help/policy/CMP0104.rst
new file mode 100644
index 0000000..ca2c571
--- /dev/null
+++ b/Help/policy/CMP0104.rst
@@ -0,0 +1,31 @@
+CMP0104
+-------
+
+Initialize :variable:`CMAKE_CUDA_ARCHITECTURES` when
+:variable:`CMAKE_CUDA_COMPILER_ID <CMAKE_<LANG>_COMPILER_ID>` is ``NVIDIA``.
+Raise an error if :prop_tgt:`CUDA_ARCHITECTURES` is empty.
+
+:variable:`CMAKE_CUDA_ARCHITECTURES` introduced in CMake 3.18 is used to
+initialize :prop_tgt:`CUDA_ARCHITECTURES`, which passes correct code generation
+flags to the CUDA compiler.
+
+Previous to this users had to manually specify the code generation flags. This
+policy is for backwards compatibility with manually specifying code generation
+flags.
+
+The ``OLD`` behavior for this policy is to not initialize
+:variable:`CMAKE_CUDA_ARCHITECTURES` when
+:variable:`CMAKE_CUDA_COMPILER_ID <CMAKE_<LANG>_COMPILER_ID>` is ``NVIDIA``.
+Empty :prop_tgt:`CUDA_ARCHITECTURES` is allowed.
+
+The ``NEW`` behavior of this policy is to initialize
+:variable:`CMAKE_CUDA_ARCHITECTURES` when
+:variable:`CMAKE_CUDA_COMPILER_ID <CMAKE_<LANG>_COMPILER_ID>` is ``NVIDIA``
+and raise an error if :prop_tgt:`CUDA_ARCHITECTURES` is empty during generation.
+
+This policy was introduced in CMake version 3.18. CMake version
+|release| warns when the policy is not set and uses ``OLD`` behavior.
+Use the :command:`cmake_policy` command to set it to ``OLD`` or ``NEW``
+explicitly.
+
+.. include:: DEPRECATED.txt
diff --git a/Help/policy/CMP0105.rst b/Help/policy/CMP0105.rst
new file mode 100644
index 0000000..19a1edb
--- /dev/null
+++ b/Help/policy/CMP0105.rst
@@ -0,0 +1,19 @@
+CMP0105
+-------
+
+:prop_tgt:`LINK_OPTIONS` and :prop_tgt:`INTERFACE_LINK_OPTIONS` target
+properties are now used for the device link step.
+
+In CMake 3.17 and below, link options are not used by the device link step.
+
+The ``OLD`` behavior for this policy is to ignore the link options.
+
+The ``NEW`` behavior of this policy is to use the link options during the
+device link step.
+
+This policy was introduced in CMake version 3.17. Use the
+:command:`cmake_policy` command to set it to ``OLD`` or ``NEW`` explicitly.
+Unlike many policies, CMake version |release| does *not* warn
+when this policy is not set and simply uses ``OLD`` behavior.
+
+.. include:: DEPRECATED.txt
diff --git a/Help/policy/CMP0106.rst b/Help/policy/CMP0106.rst
new file mode 100644
index 0000000..e34d15a
--- /dev/null
+++ b/Help/policy/CMP0106.rst
@@ -0,0 +1,19 @@
+CMP0106
+-------
+
+The :module:`Documentation` module is removed.
+
+The :module:`Documentation` was added as a support mechanism for the VTK
+project and was tuned for that project. Instead of CMake providing this module
+with (now old) VTK patterns for cache variables and required packages, the
+module is now deprecated by CMake itself.
+
+The ``OLD`` behavior of this policy is for :module:`Documentation` to add
+cache variables and find VTK documentation dependent packages. The ``NEW``
+behavior is to act as an empty module.
+
+This policy was introduced in CMake version 3.18. CMake version |release|
+warns when the policy is not set and uses ``OLD`` behavior. Use the
+:command:`cmake_policy` command to set it to ``OLD`` or ``NEW`` explicitly.
+
+.. include:: DEPRECATED.txt
diff --git a/Help/prop_dir/LINK_OPTIONS.rst b/Help/prop_dir/LINK_OPTIONS.rst
index 54ac6dd..f229ba6 100644
--- a/Help/prop_dir/LINK_OPTIONS.rst
+++ b/Help/prop_dir/LINK_OPTIONS.rst
@@ -2,7 +2,7 @@ LINK_OPTIONS
------------
List of options to use for the link step of shared library, module
-and executable targets.
+and executable targets as well as the device link step.
This property holds a :ref:`semicolon-separated list <CMake Language Lists>` of options
given so far to the :command:`add_link_options` command.
diff --git a/Help/prop_sf/COMPILE_OPTIONS.rst b/Help/prop_sf/COMPILE_OPTIONS.rst
index 7e48271..537dcec 100644
--- a/Help/prop_sf/COMPILE_OPTIONS.rst
+++ b/Help/prop_sf/COMPILE_OPTIONS.rst
@@ -5,9 +5,7 @@ List of additional options to pass to the compiler.
This property holds a :ref:`semicolon-separated list <CMake Language Lists>` of options
and will be added to the list of compile flags when this
-source file builds. Use :prop_sf:`COMPILE_DEFINITIONS` to pass
-additional preprocessor definitions and :prop_sf:`INCLUDE_DIRECTORIES` to pass
-additional include directories.
+source file builds.
Contents of ``COMPILE_OPTIONS`` may use "generator expressions" with the
syntax ``$<...>``. See the :manual:`cmake-generator-expressions(7)` manual
@@ -16,6 +14,19 @@ does not support per-config per-source settings, so expressions
that depend on the build configuration are not allowed with that
generator.
-.. note::
+Usage example:
- This property should be preferred over the :prop_sf:`COMPILE_FLAGS` property.
+.. code-block:: cmake
+
+ set_source_files_properties(foo.cpp PROPERTIES COMPILE_OPTIONS "-Wno-unused-parameter;-Wno-missing-field-initializer")
+
+Related properties:
+
+* Prefer this property over :prop_sf:`COMPILE_FLAGS`.
+* Use :prop_sf:`COMPILE_DEFINITIONS` to pass additional preprocessor definitions.
+* Use :prop_sf:`INCLUDE_DIRECTORIES` to pass additional include directories.
+
+Related commands:
+
+* :command:`add_compile_options` for directory-wide settings
+* :command:`target_compile_options` for target-specific settings
diff --git a/Help/prop_sf/OBJECT_OUTPUTS.rst b/Help/prop_sf/OBJECT_OUTPUTS.rst
index e7e880b..3e799ed 100644
--- a/Help/prop_sf/OBJECT_OUTPUTS.rst
+++ b/Help/prop_sf/OBJECT_OUTPUTS.rst
@@ -7,3 +7,6 @@ Additional outputs created by compilation of this source file. If any
of these outputs is missing the object will be recompiled. This is
supported only on the :generator:`Ninja` and :ref:`Makefile Generators`
and will be ignored on other generators.
+
+This property supports
+:manual:`generator expressions <cmake-generator-expressions(7)>`.
diff --git a/Help/prop_sf/UNITY_GROUP.rst b/Help/prop_sf/UNITY_GROUP.rst
new file mode 100644
index 0000000..ec6b0f6
--- /dev/null
+++ b/Help/prop_sf/UNITY_GROUP.rst
@@ -0,0 +1,5 @@
+UNITY_GROUP
+-----------
+
+This property controls which *bucket* the source will be part of when
+the :prop_tgt:`UNITY_BUILD_MODE` is set to ``GROUP``.
diff --git a/Help/prop_sf/VS_SETTINGS.rst b/Help/prop_sf/VS_SETTINGS.rst
new file mode 100644
index 0000000..0719406
--- /dev/null
+++ b/Help/prop_sf/VS_SETTINGS.rst
@@ -0,0 +1,18 @@
+VS_SETTINGS
+-----------
+
+Set any item metadata on a non-built file.
+
+Takes a list of ``Key=Value`` pairs. Tells the Visual Studio generator to set
+``Key`` to ``Value`` as item metadata on the file.
+
+For example:
+
+.. code-block:: cmake
+
+ set_property(SOURCE file.hlsl PROPERTY VS_SETTINGS "Key=Value" "Key2=Value2")
+
+will set ``Key`` to ``Value`` and ``Key2`` to ``Value2`` on the
+``file.hlsl`` item as metadata.
+
+Generator expressions are supported.
diff --git a/Help/prop_tgt/CONFIG_POSTFIX.rst b/Help/prop_tgt/CONFIG_POSTFIX.rst
index 11b50b9..5c2fbd7 100644
--- a/Help/prop_tgt/CONFIG_POSTFIX.rst
+++ b/Help/prop_tgt/CONFIG_POSTFIX.rst
@@ -8,3 +8,6 @@ is appended to the target file name built on disk. For non-executable
targets, this property is initialized by the value of the variable
CMAKE_<CONFIG>_POSTFIX if it is set when a target is created. This
property is ignored on the Mac for Frameworks and App Bundles.
+
+For macOS see also the :prop_tgt:`FRAMEWORK_MULTI_CONFIG_POSTFIX_<CONFIG>`
+target property.
diff --git a/Help/prop_tgt/CUDA_ARCHITECTURES.rst b/Help/prop_tgt/CUDA_ARCHITECTURES.rst
new file mode 100644
index 0000000..328f40b
--- /dev/null
+++ b/Help/prop_tgt/CUDA_ARCHITECTURES.rst
@@ -0,0 +1,30 @@
+CUDA_ARCHITECTURES
+------------------
+
+List of architectures to generate device code for.
+
+An architecture can be suffixed by either ``-real`` or ``-virtual`` to specify
+the kind of architecture to generate code for.
+If no suffix is given then code is generated for both real and virtual
+architectures.
+
+This property is initialized by the value of the :variable:`CMAKE_CUDA_ARCHITECTURES`
+variable if it is set when a target is created.
+
+The ``CUDA_ARCHITECTURES`` target property must be set to a non-empty value on targets
+that compile CUDA sources, or it is an error. See policy :policy:`CMP0104`.
+
+Examples
+^^^^^^^^
+
+.. code-block:: cmake
+
+ set_property(TARGET tgt PROPERTY CUDA_ARCHITECTURES 35 50 72)
+
+Generates code for real and virtual architectures ``30``, ``50`` and ``72``.
+
+.. code-block:: cmake
+
+ set_property(TARGET tgt PROPERTY CUDA_ARCHITECTURES 70-real 72-virtual)
+
+Generates code for real architecture ``70`` and virtual architecture ``72``.
diff --git a/Help/prop_tgt/CUDA_STANDARD.rst b/Help/prop_tgt/CUDA_STANDARD.rst
index a3a2f56..6d6774e 100644
--- a/Help/prop_tgt/CUDA_STANDARD.rst
+++ b/Help/prop_tgt/CUDA_STANDARD.rst
@@ -7,7 +7,7 @@ This property specifies the CUDA/C++ standard whose features are requested
to build this target. For some compilers, this results in adding a
flag such as ``-std=gnu++11`` to the compile line.
-Supported values are ``98``, ``11``, ``14``.
+Supported values are ``98``, ``03``, ``11``, ``14``, ``17``, ``20``.
If the value requested does not result in a compile flag being added for
the compiler in use, a previous standard flag will be added instead. This
diff --git a/Help/prop_tgt/FRAMEWORK_MULTI_CONFIG_POSTFIX_CONFIG.rst b/Help/prop_tgt/FRAMEWORK_MULTI_CONFIG_POSTFIX_CONFIG.rst
new file mode 100644
index 0000000..2b20bf9
--- /dev/null
+++ b/Help/prop_tgt/FRAMEWORK_MULTI_CONFIG_POSTFIX_CONFIG.rst
@@ -0,0 +1,25 @@
+FRAMEWORK_MULTI_CONFIG_POSTFIX_<CONFIG>
+---------------------------------------
+
+Postfix to append to the framework file name for configuration <CONFIG>,
+when using a multi-config generator (like Xcode and Ninja Multi-Config).
+
+When building with configuration <CONFIG> the value of this property
+is appended to the framework file name built on disk.
+
+For example given a framework called ``my_fw``, a value of ``_debug``
+for the :prop_tgt:`FRAMEWORK_MULTI_CONFIG_POSTFIX_<CONFIG>` property, and
+``Debug;Release`` in `CMAKE_CONFIGURATION_TYPES`, the following relevant
+files would be created for the ``Debug`` and ``Release`` configurations:
+
+- Release/my_fw.framework/my_fw
+- Release/my_fw.framework/Versions/A/my_fw
+- Debug/my_fw.framework/my_fw_debug
+- Debug/my_fw.framework/Versions/A/my_fw_debug
+
+For framework targets, this property is initialized by the value of the
+variable :variable:`CMAKE_FRAMEWORK_MULTI_CONFIG_POSTFIX_<CONFIG>` if it
+is set when a target is created.
+
+This property is ignored for non-framework targets, and when using single
+config generators.
diff --git a/Help/prop_tgt/INSTALL_RPATH.rst b/Help/prop_tgt/INSTALL_RPATH.rst
index 93b4488..4549b92 100644
--- a/Help/prop_tgt/INSTALL_RPATH.rst
+++ b/Help/prop_tgt/INSTALL_RPATH.rst
@@ -8,5 +8,9 @@ targets (for platforms that support it). This property is initialized
by the value of the variable :variable:`CMAKE_INSTALL_RPATH` if it is set when
a target is created.
+Because the rpath may contain ``${ORIGIN}``, which coincides with CMake syntax,
+the contents of ``INSTALL_RPATH`` are properly escaped in the
+``cmake_install.cmake`` script (see policy :policy:`CMP0095`.)
+
This property supports
:manual:`generator expressions <cmake-generator-expressions(7)>`.
diff --git a/Help/prop_tgt/LINK_OPTIONS.rst b/Help/prop_tgt/LINK_OPTIONS.rst
index 2a05ea7..ff3ee87 100644
--- a/Help/prop_tgt/LINK_OPTIONS.rst
+++ b/Help/prop_tgt/LINK_OPTIONS.rst
@@ -2,12 +2,16 @@ LINK_OPTIONS
------------
List of options to use for the link step of shared library, module
-and executable targets. Targets that are static libraries need to use
-the :prop_tgt:`STATIC_LIBRARY_OPTIONS` target property.
+and executable targets as well as the device link step. Targets that are static
+libraries need to use the :prop_tgt:`STATIC_LIBRARY_OPTIONS` target property.
+These options are used for both normal linking and device linking
+(see policy :policy:`CMP0105`). To control link options for normal and device
+link steps, ``$<HOST_LINK>`` and ``$<DEVICE_LINK>``
+:manual:`generator expressions <cmake-generator-expressions(7)>` can be used.
-This property holds a :ref:`semicolon-separated list <CMake Language Lists>` of options
-specified so far for its target. Use the :command:`target_link_options`
+This property holds a :ref:`semicolon-separated list <CMake Language Lists>` of
+options specified so far for its target. Use the :command:`target_link_options`
command to append more options.
This property is initialized by the :prop_dir:`LINK_OPTIONS` directory
diff --git a/Help/prop_tgt/PCH_WARN_INVALID.rst b/Help/prop_tgt/PCH_WARN_INVALID.rst
new file mode 100644
index 0000000..36ec348
--- /dev/null
+++ b/Help/prop_tgt/PCH_WARN_INVALID.rst
@@ -0,0 +1,8 @@
+PCH_WARN_INVALID
+----------------
+
+When this property is set to true, the precompile header compiler options
+will contain a compiler flag wich should warn about invalid precompiled
+headers e.g. ``-Winvalid-pch`` for GNU compiler.
+
+The defalut value is ``ON``.
diff --git a/Help/prop_tgt/UNITY_BUILD.rst b/Help/prop_tgt/UNITY_BUILD.rst
index 479802e..e140952 100644
--- a/Help/prop_tgt/UNITY_BUILD.rst
+++ b/Help/prop_tgt/UNITY_BUILD.rst
@@ -5,8 +5,28 @@ When this property is set to true, the target source files will be combined
into batches for faster compilation. This is done by creating a (set of)
unity sources which ``#include`` the original sources, then compiling these
unity sources instead of the originals. This is known as a *Unity* or *Jumbo*
-build. The :prop_tgt:`UNITY_BUILD_BATCH_SIZE` property controls the upper
-limit on how many sources can be combined per unity source file.
+build.
+
+CMake provides different algorithms for selecting which sources are grouped
+together into a *bucket*. Algorithm selection is decided by the
+:prop_tgt:`UNITY_BUILD_MODE` target property, which has the following acceptable
+values:
+
+* ``BATCH``
+ When in this mode CMake determines which files are grouped together.
+ The :prop_tgt:`UNITY_BUILD_BATCH_SIZE` property controls the upper limit on
+ how many sources can be combined per unity source file.
+
+* ``GROUP``
+ When in this mode each target explicitly specifies how to group
+ source files. Each source file that has the same
+ :prop_sf:`UNITY_GROUP` value will be grouped together. Any sources
+ that don't have this property will be compiled individually. The
+ :prop_tgt:`UNITY_BUILD_BATCH_SIZE` property is ignored when using
+ this mode.
+
+If no explicit :prop_tgt:`UNITY_BUILD_MODE` has been specified, CMake will
+default to ``BATCH``.
Unity builds are not currently supported for all languages. CMake version
|release| supports combining ``C`` and ``CXX`` source files. For targets that
diff --git a/Help/prop_tgt/UNITY_BUILD_MODE.rst b/Help/prop_tgt/UNITY_BUILD_MODE.rst
new file mode 100644
index 0000000..1ebab23
--- /dev/null
+++ b/Help/prop_tgt/UNITY_BUILD_MODE.rst
@@ -0,0 +1,58 @@
+UNITY_BUILD_MODE
+----------------
+
+CMake provides different algorithms for selecting which sources are grouped
+together into a *bucket*. Selection is decided by this property,
+which has the following acceptable values:
+
+``BATCH``
+ When in this mode CMake determines which files are grouped together.
+ The :prop_tgt:`UNITY_BUILD_BATCH_SIZE` property controls the upper limit on
+ how many sources can be combined per unity source file.
+
+ Example usage:
+
+ .. code-block:: cmake
+
+ add_library(example_library
+ source1.cxx
+ source2.cxx
+ source3.cxx
+ source4.cxx)
+
+ set_target_properties(example_library PROPERTIES
+ UNITY_BUILD_MODE BATCH
+ UNITY_BUILD_BATCH_SIZE 2
+ )
+
+``GROUP``
+ When in this mode each target explicitly specifies how to group
+ source files. Each source file that has the same
+ :prop_sf:`UNITY_GROUP` value will be grouped together. Any sources
+ that don't have this property will be compiled individually. The
+ :prop_tgt:`UNITY_BUILD_BATCH_SIZE` property is ignored when using
+ this mode.
+
+ Example usage:
+
+ .. code-block:: cmake
+
+ add_library(example_library
+ source1.cxx
+ source2.cxx
+ source3.cxx
+ source4.cxx)
+
+ set_target_properties(example_library PROPERTIES
+ UNITY_BUILD_MODE GROUP
+ )
+
+ set_source_files_properties(source1.cxx source2.cxx source3.cxx
+ PROPERTIES UNITY_GROUP "bucket1"
+ )
+ set_source_files_properties(source4.cxx
+ PROPERTIES UNITY_GROUP "bucket2"
+ )
+
+If no explicit :prop_tgt:`UNITY_BUILD_MODE` has been specified, CMake will
+default to ``BATCH``.
diff --git a/Help/prop_tgt/VS_PLATFORM_TOOLSET.rst b/Help/prop_tgt/VS_PLATFORM_TOOLSET.rst
new file mode 100644
index 0000000..f8f2e8e
--- /dev/null
+++ b/Help/prop_tgt/VS_PLATFORM_TOOLSET.rst
@@ -0,0 +1,10 @@
+VS_PLATFORM_TOOLSET
+-------------------
+
+Overrides the platform toolset used to build a target.
+
+Only supported when the compiler used by the given toolset is the
+same as the compiler used to build the whole source tree.
+
+This is especially useful to create driver projects with the toolsets
+"WindowsUserModeDriver10.0" or "WindowsKernelModeDriver10.0".
diff --git a/Help/prop_tgt/VS_SOLUTION_DEPLOY.rst b/Help/prop_tgt/VS_SOLUTION_DEPLOY.rst
new file mode 100644
index 0000000..7906d75
--- /dev/null
+++ b/Help/prop_tgt/VS_SOLUTION_DEPLOY.rst
@@ -0,0 +1,29 @@
+VS_SOLUTION_DEPLOY
+------------------
+
+Specify that the target should be marked for deployment when not targeting
+Windows CE, Windows Phone or a Windows Store application.
+
+If the target platform doesn't support deployment, this property won't have any effect.
+
+Generator expressions are supported.
+
+Example 1
+^^^^^^^^^
+
+This shows setting the variable for the target foo.
+
+.. code-block:: cmake
+
+ add_executable(foo SHARED foo.cpp)
+ set_property(TARGET foo PROPERTY VS_SOLUTION_DEPLOY ON)
+
+Example 2
+^^^^^^^^^
+
+This shows setting the variable for the Release configuration only.
+
+.. code-block:: cmake
+
+ add_executable(foo SHARED foo.cpp)
+ set_property(TARGET foo PROPERTY VS_SOLUTION_DEPLOY "$<NOT:$<CONFIG:Release>>")
diff --git a/Help/prop_tgt/VS_SOURCE_SETTINGS_tool.rst b/Help/prop_tgt/VS_SOURCE_SETTINGS_tool.rst
new file mode 100644
index 0000000..f706888
--- /dev/null
+++ b/Help/prop_tgt/VS_SOURCE_SETTINGS_tool.rst
@@ -0,0 +1,19 @@
+VS_SOURCE_SETTINGS_<tool>
+-------------------------
+
+Set any item metadata on all non-built files that use <tool>.
+
+Takes a list of ``Key=Value`` pairs. Tells the Visual Studio generator
+to set ``Key`` to ``Value`` as item metadata on all non-built files
+that use ``<tool>``.
+
+For example:
+
+.. code-block:: cmake
+
+ set_property(TARGET main PROPERTY VS_SOURCE_SETTINGS_FXCompile "Key=Value" "Key2=Value2")
+
+will set ``Key`` to ``Value`` and ``Key2`` to ``Value2`` for all
+non-built files that use ``FXCompile``.
+
+Generator expressions are supported.
diff --git a/Help/release/dev/0-sample-topic.rst b/Help/release/dev/0-sample-topic.rst
new file mode 100644
index 0000000..e4cc01e
--- /dev/null
+++ b/Help/release/dev/0-sample-topic.rst
@@ -0,0 +1,7 @@
+0-sample-topic
+--------------
+
+* This is a sample release note for the change in a topic.
+ Developers should add similar notes for each topic branch
+ making a noteworthy change. Each document should be named
+ and titled to match the topic name to avoid merge conflicts.
diff --git a/Help/release/dev/CPackRPM-trans-scripts.rst b/Help/release/dev/CPackRPM-trans-scripts.rst
new file mode 100644
index 0000000..57fc099
--- /dev/null
+++ b/Help/release/dev/CPackRPM-trans-scripts.rst
@@ -0,0 +1,7 @@
+CPackRPM-trans-scripts
+----------------------
+
+* The :cpack_gen:`CPack RPM Generator` gained
+ :variable:`CPACK_RPM_PRE_TRANS_SCRIPT_FILE`
+ :variable:`CPACK_RPM_POST_TRANS_SCRIPT_FILE`
+ variables to specify pre- and post-trans scripts.
diff --git a/Help/release/dev/CTestCoverageCollectGCOV-compress-opts.rst b/Help/release/dev/CTestCoverageCollectGCOV-compress-opts.rst
new file mode 100644
index 0000000..eb8532d
--- /dev/null
+++ b/Help/release/dev/CTestCoverageCollectGCOV-compress-opts.rst
@@ -0,0 +1,7 @@
+CTestCoverageCollectGCOV-compress-opts
+--------------------------------------
+
+* The :module:`CTestCoverageCollectGCOV` module
+ :command:`ctest_coverage_collect_gcov` function gained a
+ ``TARBALL_COMPRESSION`` option to control compression of the
+ tarball of collected results.
diff --git a/Help/release/dev/FPHSA-handle_components.rst b/Help/release/dev/FPHSA-handle_components.rst
new file mode 100644
index 0000000..39907c4
--- /dev/null
+++ b/Help/release/dev/FPHSA-handle_components.rst
@@ -0,0 +1,5 @@
+FPHSA-handle_components
+-----------------------
+
+* The :module:`FindPackageHandleStandardArgs` module option ``REQUIRED_VARS``
+ is now optional if ``HANDLE_COMPONENTS`` is specified.
diff --git a/Help/release/dev/FindBLAS-import-target.rst b/Help/release/dev/FindBLAS-import-target.rst
new file mode 100644
index 0000000..29d6f0c
--- /dev/null
+++ b/Help/release/dev/FindBLAS-import-target.rst
@@ -0,0 +1,4 @@
+FindBLAS-import-target
+----------------------
+
+* The :module:`FindBLAS` module now provides an imported target.
diff --git a/Help/release/dev/FindLAPACK-import-target.rst b/Help/release/dev/FindLAPACK-import-target.rst
new file mode 100644
index 0000000..912d642
--- /dev/null
+++ b/Help/release/dev/FindLAPACK-import-target.rst
@@ -0,0 +1,4 @@
+FindLAPACK-import-target
+------------------------
+
+* The :module:`FindLAPACK` module now provides an imported target.
diff --git a/Help/release/dev/FindPython-IronPython-support.rst b/Help/release/dev/FindPython-IronPython-support.rst
new file mode 100644
index 0000000..0ed11e9
--- /dev/null
+++ b/Help/release/dev/FindPython-IronPython-support.rst
@@ -0,0 +1,5 @@
+FindPython-IronPython-support
+-----------------------------
+
+* The :module:`FindPython3`, :module:`FindPython2` and :module:`FindPython`
+ modules support now the ``IronPython`` implementation on all platforms.
diff --git a/Help/release/dev/FindPython-artifacts-interactive.rst b/Help/release/dev/FindPython-artifacts-interactive.rst
new file mode 100644
index 0000000..1aa4b3e
--- /dev/null
+++ b/Help/release/dev/FindPython-artifacts-interactive.rst
@@ -0,0 +1,6 @@
+FindPython-artifacts-interactive
+--------------------------------
+
+* The :module:`FindPython3`, :module:`FindPython2` and :module:`FindPython`
+ modules gained the possibility to create artifacts cache variables for
+ interactive edition.
diff --git a/Help/release/dev/FindPython-dev-subcomponents.rst b/Help/release/dev/FindPython-dev-subcomponents.rst
new file mode 100644
index 0000000..fe76ee8
--- /dev/null
+++ b/Help/release/dev/FindPython-dev-subcomponents.rst
@@ -0,0 +1,6 @@
+FindPython-dev-subcomponents
+----------------------------
+
+* The :module:`FindPython3`, :module:`FindPython2` and :module:`FindPython`
+ modules gained sub-components ``Development.Module`` and
+ ``Development.Embed`` for ``Development`` component.
diff --git a/Help/release/dev/FindPython-find-implementations.rst b/Help/release/dev/FindPython-find-implementations.rst
new file mode 100644
index 0000000..d4f548b
--- /dev/null
+++ b/Help/release/dev/FindPython-find-implementations.rst
@@ -0,0 +1,5 @@
+FindPython-find-implementations
+-------------------------------
+
+* The :module:`FindPython3`, :module:`FindPython2` and :module:`FindPython`
+ modules gained the capability to specify which implementations to search for.
diff --git a/Help/release/dev/FindPython-pypy.rst b/Help/release/dev/FindPython-pypy.rst
new file mode 100644
index 0000000..84f0db1
--- /dev/null
+++ b/Help/release/dev/FindPython-pypy.rst
@@ -0,0 +1,5 @@
+FindPython-pypy
+---------------
+
+* The :module:`FindPython3`, :module:`FindPython2` and :module:`FindPython`
+ modules gained the capability to handle ``PyPy`` product.
diff --git a/Help/release/dev/FindRuby-variable-case.rst b/Help/release/dev/FindRuby-variable-case.rst
new file mode 100644
index 0000000..bd4a2f1
--- /dev/null
+++ b/Help/release/dev/FindRuby-variable-case.rst
@@ -0,0 +1,7 @@
+FindRuby-variable-case
+----------------------
+
+* The :module:`FindRuby` module input and output variables were all renamed
+ from ``RUBY_`` to ``Ruby_`` for consistency with other find modules.
+ Input variables of the old case will be honored if provided, and output
+ variables of the old case are always provided.
diff --git a/Help/release/dev/GoogleTest-DISCOVERY_MODE.rst b/Help/release/dev/GoogleTest-DISCOVERY_MODE.rst
new file mode 100644
index 0000000..7bc2f14
--- /dev/null
+++ b/Help/release/dev/GoogleTest-DISCOVERY_MODE.rst
@@ -0,0 +1,7 @@
+GoogleTest-DISCOVERY_MODE
+-------------------------
+
+* The :module:`GoogleTest` module :command:`gtest_discover_tests` command
+ gained a new ``DISCOVERY_MODE`` option to control when the test
+ discovery step is run. It offers a new ``PRE_TEST`` setting to
+ run the discovery at test time instead of build time.
diff --git a/Help/release/dev/GoogleTest-XML_OUTPUT_DIR.rst b/Help/release/dev/GoogleTest-XML_OUTPUT_DIR.rst
new file mode 100644
index 0000000..e8aba01
--- /dev/null
+++ b/Help/release/dev/GoogleTest-XML_OUTPUT_DIR.rst
@@ -0,0 +1,6 @@
+GoogleTest-XML_OUTPUT_DIR
+-------------------------
+
+* The :module:`GoogleTest` module :command:`gtest_discover_tests` command
+ gained a new optional parameter ``XML_OUTPUT_DIR``. When set the JUnit XML
+ test results are stored in that directory.
diff --git a/Help/release/dev/ccmake-custom-colors.rst b/Help/release/dev/ccmake-custom-colors.rst
new file mode 100644
index 0000000..fcabe56
--- /dev/null
+++ b/Help/release/dev/ccmake-custom-colors.rst
@@ -0,0 +1,5 @@
+ccmake-custom-colors
+--------------------
+
+* :manual:`ccmake(1)` learned to read a :envvar:`CCMAKE_COLORS`
+ environment variable to customize colors.
diff --git a/Help/release/dev/cmake-gui-env-platform-defaults.rst b/Help/release/dev/cmake-gui-env-platform-defaults.rst
new file mode 100644
index 0000000..0960ef1
--- /dev/null
+++ b/Help/release/dev/cmake-gui-env-platform-defaults.rst
@@ -0,0 +1,8 @@
+cmake-gui-env-platform-defaults
+-------------------------------
+
+* :manual:`cmake-gui(1)` now populates its generator selection
+ widget default value from the :envvar:`CMAKE_GENERATOR` environment
+ variable. Additionally, environment variables
+ :envvar:`CMAKE_GENERATOR_PLATFORM` and :envvar:`CMAKE_GENERATOR_TOOLSET`
+ are used to populate their respective widget defaults.
diff --git a/Help/release/dev/cmake_command-command.rst b/Help/release/dev/cmake_command-command.rst
new file mode 100644
index 0000000..6200ae2
--- /dev/null
+++ b/Help/release/dev/cmake_command-command.rst
@@ -0,0 +1,6 @@
+cmake_command
+-------------
+
+* The :command:`cmake_command()` command was added for meta-operations on
+ scripted or built-in commands, starting with a mode to ``INVOKE`` other
+ commands, and ``EVAL CODE`` to inplace evaluate a CMake script.
diff --git a/Help/release/dev/command-line-cat.rst b/Help/release/dev/command-line-cat.rst
new file mode 100644
index 0000000..acde835
--- /dev/null
+++ b/Help/release/dev/command-line-cat.rst
@@ -0,0 +1,5 @@
+Command-Line
+------------
+* :manual:`cmake(1)` gained a ``cat`` command line
+ option that can be used to concatenate files and print them
+ on standard output.
diff --git a/Help/release/dev/ctest-log-environment.rst b/Help/release/dev/ctest-log-environment.rst
new file mode 100644
index 0000000..0636a25
--- /dev/null
+++ b/Help/release/dev/ctest-log-environment.rst
@@ -0,0 +1,8 @@
+ctest-log-environment
+---------------------
+
+* :manual:`ctest(1)` now logs environment variables that it sets for each test,
+ either due to the :prop_test:`ENVIRONMENT` property or the
+ :ref:`resource allocation <ctest-resource-allocation>` feature, and submits
+ this log to CDash. It does not log environment variables that were set
+ outside of CTest.
diff --git a/Help/release/dev/ctest_resource_spec_file-variable.rst b/Help/release/dev/ctest_resource_spec_file-variable.rst
new file mode 100644
index 0000000..2ddf854
--- /dev/null
+++ b/Help/release/dev/ctest_resource_spec_file-variable.rst
@@ -0,0 +1,6 @@
+ctest_resource_spec_file-variable
+---------------------------------
+
+* :manual:`ctest(1)` gained a new :variable:`CTEST_RESOURCE_SPEC_FILE`
+ variable, which can be used to specify a
+ :ref:`resource specification file <ctest-resource-specification-file>`.
diff --git a/Help/release/dev/ctest_stop_on_failure.rst b/Help/release/dev/ctest_stop_on_failure.rst
new file mode 100644
index 0000000..f10c37c
--- /dev/null
+++ b/Help/release/dev/ctest_stop_on_failure.rst
@@ -0,0 +1,8 @@
+ctest_stop_on_failure
+---------------------
+
+* :manual:`ctest(1)` gained a ``--stop-on-failure`` option,
+ which can be used to stop running the tests once one has failed.
+
+* The :command:`ctest_test` command gained a ``STOP_ON_FAILURE`` option
+ which can be used to stop running the tests once one has failed.
diff --git a/Help/release/dev/cuda-architectures-empty.rst b/Help/release/dev/cuda-architectures-empty.rst
new file mode 100644
index 0000000..b0fc327
--- /dev/null
+++ b/Help/release/dev/cuda-architectures-empty.rst
@@ -0,0 +1,7 @@
+cuda-architectures-empty
+------------------------
+
+* :variable:`CMAKE_CUDA_ARCHITECTURES` is now initialized when
+ :variable:`CMAKE_CUDA_COMPILER_ID <CMAKE_<LANG>_COMPILER_ID>` is ``NVIDIA``.
+ Empty :prop_tgt:`CUDA_ARCHITECTURES` raises an error. See policy
+ :policy:`CMP0104`.
diff --git a/Help/release/dev/cuda-architectures.rst b/Help/release/dev/cuda-architectures.rst
new file mode 100644
index 0000000..dc6c55b
--- /dev/null
+++ b/Help/release/dev/cuda-architectures.rst
@@ -0,0 +1,6 @@
+cuda-architectures
+------------------
+
+* Added :prop_tgt:`CUDA_ARCHITECTURES` target property for specifying CUDA
+ output architectures. Users are encouraged to use this instead of specifying
+ options manually, as this approach is compiler-agnostic.
diff --git a/Help/release/dev/cuda-clang.rst b/Help/release/dev/cuda-clang.rst
new file mode 100644
index 0000000..fa5cd5a
--- /dev/null
+++ b/Help/release/dev/cuda-clang.rst
@@ -0,0 +1,4 @@
+cuda-clang
+----------
+
+* The ``CUDA`` language now supports Clang as a compiler.
diff --git a/Help/release/dev/curl-http2.rst b/Help/release/dev/curl-http2.rst
new file mode 100644
index 0000000..8390a42
--- /dev/null
+++ b/Help/release/dev/curl-http2.rst
@@ -0,0 +1,8 @@
+curl-http2
+----------
+
+* When building CMake itself from source and not using a system-provided
+ libcurl, HTTP/2 support is now enabled for commands supporting
+ network communication via ``http(s)``, such as :command:`file(DOWNLOAD)`,
+ :command:`file(UPLOAD)`, and :command:`ctest_submit`.
+ The precompiled binaries provided on ``cmake.org`` now support HTTP/2.
diff --git a/Help/release/dev/deprecate-documentation-module.rst b/Help/release/dev/deprecate-documentation-module.rst
new file mode 100644
index 0000000..5c3157b
--- /dev/null
+++ b/Help/release/dev/deprecate-documentation-module.rst
@@ -0,0 +1,6 @@
+deprecate-documentation-module
+------------------------------
+
+* The :module:`Documentation` module has been deprecated via
+ :policy:`CMP0106`. This module was essentially VTK code that CMake should
+ not be shipping anymore.
diff --git a/Help/release/dev/deprecate-policy-old.rst b/Help/release/dev/deprecate-policy-old.rst
new file mode 100644
index 0000000..cffd206
--- /dev/null
+++ b/Help/release/dev/deprecate-policy-old.rst
@@ -0,0 +1,8 @@
+deprecate-policy-old
+--------------------
+
+* An explicit deprecation diagnostic was added for policy ``CMP0070``
+ and policy ``CMP0071`` (``CMP0069`` and below were already deprecated).
+ The :manual:`cmake-policies(7)` manual explains that the OLD behaviors
+ of all policies are deprecated and that projects should port to the
+ NEW behaviors.
diff --git a/Help/release/dev/device-link-options.rst b/Help/release/dev/device-link-options.rst
new file mode 100644
index 0000000..f58026b
--- /dev/null
+++ b/Help/release/dev/device-link-options.rst
@@ -0,0 +1,5 @@
+device-link-options
+-------------------
+
+* the :prop_tgt:`LINK_OPTIONS` and :prop_tgt:`INTERFACE_LINK_OPTIONS` target
+ properties are now used for the device link step. See policy :policy:`CMP0105`.
diff --git a/Help/release/dev/execute_process.rst b/Help/release/dev/execute_process.rst
new file mode 100644
index 0000000..02e813b
--- /dev/null
+++ b/Help/release/dev/execute_process.rst
@@ -0,0 +1,5 @@
+execute_process
+---------------
+
+* The :command:`execute_process` command gained the ``ECHO_OUTPUT_VARIABLE``
+ and ``ECHO_ERROR_VARIABLE`` options.
diff --git a/Help/release/dev/export-multiple-calls.rst b/Help/release/dev/export-multiple-calls.rst
new file mode 100644
index 0000000..00372ce
--- /dev/null
+++ b/Help/release/dev/export-multiple-calls.rst
@@ -0,0 +1,5 @@
+export-multiple-calls
+---------------------
+
+* The :command:`export` command now raise an error if used multiple times with
+ same ``FILE`` without ``APPEND``. See policy :policy:`CMP0103`.
diff --git a/Help/release/dev/fetchcontent-SOURCE_SUBDIR.rst b/Help/release/dev/fetchcontent-SOURCE_SUBDIR.rst
new file mode 100644
index 0000000..e9e185c
--- /dev/null
+++ b/Help/release/dev/fetchcontent-SOURCE_SUBDIR.rst
@@ -0,0 +1,6 @@
+fetchcontent-SOURCE_SUBDIR
+--------------------------
+
+* The :command:`FetchContent_Declare` command now supports a ``SOURCE_SUBDIR``
+ option. It can be used to direct :command:`FetchContent_MakeAvailable`
+ to look in a different location for the ``CMakeLists.txt`` file.
diff --git a/Help/release/dev/file-upload-tls.rst b/Help/release/dev/file-upload-tls.rst
new file mode 100644
index 0000000..e19be24
--- /dev/null
+++ b/Help/release/dev/file-upload-tls.rst
@@ -0,0 +1,5 @@
+file-upload-tls
+---------------
+
+* The :command:`file(UPLOAD)` command gained ``TLS_VERIFY`` and ``TLS_CAINFO``
+ options to control server certificate verification.
diff --git a/Help/release/dev/file_archive.rst b/Help/release/dev/file_archive.rst
new file mode 100644
index 0000000..e79529c
--- /dev/null
+++ b/Help/release/dev/file_archive.rst
@@ -0,0 +1,7 @@
+file_archive
+------------
+
+* The :command:`file` command gained the ``ARCHIVE_{CREATE|EXTRACT}`` subcommands.
+
+ These subcommands will replicate the :manual:`cmake(1)` ``-E tar`` functionality in
+ CMake scripting code.
diff --git a/Help/release/dev/file_configure.rst b/Help/release/dev/file_configure.rst
new file mode 100644
index 0000000..35e99c4
--- /dev/null
+++ b/Help/release/dev/file_configure.rst
@@ -0,0 +1,6 @@
+file_configure
+--------------
+
+* The :command:`file(CONFIGURE)` subcommand was created in order replicate the
+ :command:`configure_file` functionality without resorting to a pre-existing
+ file on disk as input. The content is instead passed as a string.
diff --git a/Help/release/dev/findswig-components.rst b/Help/release/dev/findswig-components.rst
new file mode 100644
index 0000000..ce569be
--- /dev/null
+++ b/Help/release/dev/findswig-components.rst
@@ -0,0 +1,5 @@
+findswig-components
+-------------------
+
+* The :module:`FindSWIG` module now accepts target languages as ``COMPONENTS``
+ and ``OPTIONAL_COMPONENTS`` arguments to ``find_package``.
diff --git a/Help/release/dev/framework-multi-config-postfix.rst b/Help/release/dev/framework-multi-config-postfix.rst
new file mode 100644
index 0000000..50cf9ce
--- /dev/null
+++ b/Help/release/dev/framework-multi-config-postfix.rst
@@ -0,0 +1,7 @@
+framework-multi-config-postfix
+------------------------------
+
+* The :prop_tgt:`FRAMEWORK_MULTI_CONFIG_POSTFIX_<CONFIG>` target property
+ and associated :variable:`CMAKE_FRAMEWORK_MULTI_CONFIG_POSTFIX_<CONFIG>`
+ variable were created to allow adding a postfix to the name of a
+ framework file name when using a multi-config generator.
diff --git a/Help/release/dev/genex-DEVICE_LINK-HOST_LINK.rst b/Help/release/dev/genex-DEVICE_LINK-HOST_LINK.rst
new file mode 100644
index 0000000..ef275e7
--- /dev/null
+++ b/Help/release/dev/genex-DEVICE_LINK-HOST_LINK.rst
@@ -0,0 +1,6 @@
+genex-DEVICE_LINK-HOST_LINK
+---------------------------
+
+* To manage device and host link steps, the ``$<DEVICE_LINK:...>`` and
+ ``$<HOST_LINK:...>``
+ :manual:`generator expressions <cmake-generator-expressions(7)>` were added.
diff --git a/Help/release/dev/genex-LINK_LANGUAGE.rst b/Help/release/dev/genex-LINK_LANGUAGE.rst
new file mode 100644
index 0000000..05894d6
--- /dev/null
+++ b/Help/release/dev/genex-LINK_LANGUAGE.rst
@@ -0,0 +1,5 @@
+genex-LINK_LANGUAGE
+===================
+
+* The ``$<LINK_LANGUAGE:...>`` and ``$<LINK_LANG_AND_ID:...>``
+ :manual:`generator expressions <cmake-generator-expressions(7)>` were added.
diff --git a/Help/release/dev/genex-OBJECT_OUTPUTS.rst b/Help/release/dev/genex-OBJECT_OUTPUTS.rst
new file mode 100644
index 0000000..738dcbb
--- /dev/null
+++ b/Help/release/dev/genex-OBJECT_OUTPUTS.rst
@@ -0,0 +1,4 @@
+genex-OBJECT_OUTPUTS
+--------------------
+
+* :prop_sf:`OBJECT_OUTPUTS` now support :manual:`generator expressions <cmake-generator-expressions(7)>`.
diff --git a/Help/release/dev/grouped-unity-build-mode.rst b/Help/release/dev/grouped-unity-build-mode.rst
new file mode 100644
index 0000000..802de4a
--- /dev/null
+++ b/Help/release/dev/grouped-unity-build-mode.rst
@@ -0,0 +1,6 @@
+grouped-unity-build-mode
+------------------------
+
+* The :prop_tgt:`UNITY_BUILD_MODE` target property was added to tell
+ generators which algorithm to use for grouping included source
+ files.
diff --git a/Help/release/dev/libxslt.rst b/Help/release/dev/libxslt.rst
new file mode 100644
index 0000000..ce3527e
--- /dev/null
+++ b/Help/release/dev/libxslt.rst
@@ -0,0 +1,4 @@
+libxslt-target
+--------------
+
+* The :module:`FindLibXslt` module now provides imported targets.
diff --git a/Help/release/dev/list_natural_sort.rst b/Help/release/dev/list_natural_sort.rst
new file mode 100644
index 0000000..ff74e5a
--- /dev/null
+++ b/Help/release/dev/list_natural_sort.rst
@@ -0,0 +1,5 @@
+list_natural_sort
+-----------------
+
+* The :command:`list` operation ``SORT`` gained the ``NATURAL`` sort
+ option to sort using natural order (see ``strverscmp(3)`` manual).
diff --git a/Help/release/dev/ninja-compiler-PATH-windows.rst b/Help/release/dev/ninja-compiler-PATH-windows.rst
new file mode 100644
index 0000000..cb33493
--- /dev/null
+++ b/Help/release/dev/ninja-compiler-PATH-windows.rst
@@ -0,0 +1,7 @@
+ninja-compiler-PATH-windows
+---------------------------
+
+* On Windows, the :generator:`Ninja` and :generator:`Ninja Multi-Config`
+ generators, when a compiler is not explicitly specified, now select
+ the first compiler (of any name) found in directories listed by the
+ ``PATH`` environment variable.
diff --git a/Help/release/dev/nsis-dpi-aware.rst b/Help/release/dev/nsis-dpi-aware.rst
new file mode 100644
index 0000000..8b5032e
--- /dev/null
+++ b/Help/release/dev/nsis-dpi-aware.rst
@@ -0,0 +1,6 @@
+nsis-dpi-aware
+--------------
+
+* The :cpack_gen:`CPack NSIS Generator` gained a new variable
+ :variable:`CPACK_NSIS_MANIFEST_DPI_AWARE` to declare that the
+ installer is DPI-aware.
diff --git a/Help/release/dev/parallel-lzma-compression.rst b/Help/release/dev/parallel-lzma-compression.rst
new file mode 100644
index 0000000..12b7102
--- /dev/null
+++ b/Help/release/dev/parallel-lzma-compression.rst
@@ -0,0 +1,6 @@
+parallel-lzma-compression
+-------------------------
+
+* The :cpack_gen:`CPack Archive Generator`'s ``TXZ`` format learned the
+ :variable:`CPACK_ARCHIVE_THREADS` variable to enable parallel compression.
+ Requires support in the ``liblzma`` used by CMake.
diff --git a/Help/release/dev/pch-warn-invalid.rst b/Help/release/dev/pch-warn-invalid.rst
new file mode 100644
index 0000000..5fa3de7
--- /dev/null
+++ b/Help/release/dev/pch-warn-invalid.rst
@@ -0,0 +1,6 @@
+pch-warn-invalid
+----------------
+
+* The :variable:`CMAKE_PCH_WARN_INVALID` variable was added to initialize the
+ :prop_tgt:`PCH_WARN_INVALID` target property to allow the removal of the
+ precompiled header invalid warning.
diff --git a/Help/release/dev/profiling.rst b/Help/release/dev/profiling.rst
new file mode 100644
index 0000000..ab180f0
--- /dev/null
+++ b/Help/release/dev/profiling.rst
@@ -0,0 +1,9 @@
+cmake-profiling
+---------------
+
+* Add support for profiling of CMake scripts through the parameters
+ ``--profiling-output`` and ``--profiling-format``. These options can
+ be used by users to gain insight into the performance of their scripts.
+
+ The first supported output format is ``google-trace`` which is a format
+ supported by Google Chrome's ``about:tracing`` tab.
diff --git a/Help/release/dev/required_find_commands.rst b/Help/release/dev/required_find_commands.rst
new file mode 100644
index 0000000..cc2bf02
--- /dev/null
+++ b/Help/release/dev/required_find_commands.rst
@@ -0,0 +1,6 @@
+required_find_commands
+----------------------
+
+* The :command:`find_program`, :command:`find_library`, :command:`find_path`
+ and :command:`find_file` commands gained a new ``REQUIRED`` option that will
+ stop processing with an error message if nothing is found.
diff --git a/Help/release/dev/sf-property-scopes.rst b/Help/release/dev/sf-property-scopes.rst
new file mode 100644
index 0000000..0b61625
--- /dev/null
+++ b/Help/release/dev/sf-property-scopes.rst
@@ -0,0 +1,15 @@
+sf-property-scopes
+------------------
+
+* The :command:`set_property` with the ``SOURCE`` scope gained the
+ ``DIRECTORY`` and ``TARGET_DIRECTORY`` options to set properties
+ in the provided directory scopes.
+* The :command:`set_source_files_properties` gained the ``DIRECTORY``
+ and ``TARGET_DIRECTORY`` options to set properties in the provided
+ directory scopes.
+* The :command:`get_property` with ``SOURCE`` scope gained the
+ ``DIRECTORY`` and ``TARGET_DIRECTORY`` options to get a property
+ from the provided directory scope.
+* The :command:`get_source_file_property` gained the ``DIRECTORY``
+ and ``TARGET_DIRECTORY`` options to get a property from the
+ provided directory scope.
diff --git a/Help/release/dev/source_group_forward_slashes.rst b/Help/release/dev/source_group_forward_slashes.rst
new file mode 100644
index 0000000..fa0dfa9
--- /dev/null
+++ b/Help/release/dev/source_group_forward_slashes.rst
@@ -0,0 +1,5 @@
+source_group_forward_slashes
+----------------------------
+
+* The :command:`source_group` command now also recognizes forward slashes
+ as subgroup delimiters, not just backslashes.
diff --git a/Help/release/dev/string-hex.rst b/Help/release/dev/string-hex.rst
new file mode 100644
index 0000000..f220aca
--- /dev/null
+++ b/Help/release/dev/string-hex.rst
@@ -0,0 +1,5 @@
+string-hex
+----------
+
+* The :command:`string` command learned a new ``HEX`` sub-command, which
+ converts strings into their hexadecimal representation.
diff --git a/Help/release/dev/useswig-fortran.rst b/Help/release/dev/useswig-fortran.rst
new file mode 100644
index 0000000..17baf96
--- /dev/null
+++ b/Help/release/dev/useswig-fortran.rst
@@ -0,0 +1,7 @@
+useswig-fortran
+---------------
+
+* The :module:`UseSWIG` module now supports Fortran as a target language if
+ the ``SWIG_EXECUTABLE`` is SWIG-Fortran_.
+
+.. _`SWIG-Fortran`: https://github.com/swig-fortran/swig
diff --git a/Help/release/dev/vs-non-built-file-item-metadata.rst b/Help/release/dev/vs-non-built-file-item-metadata.rst
new file mode 100644
index 0000000..26cbad0
--- /dev/null
+++ b/Help/release/dev/vs-non-built-file-item-metadata.rst
@@ -0,0 +1,10 @@
+vs-non-built-file-item-metadata
+-------------------------------
+
+* The :prop_tgt:`VS_SOURCE_SETTINGS_<tool>` target property was added
+ to tell :ref:`Visual Studio Generators` for VS 2010 and above to add
+ metadata to non-built source files using ``<tool>``.
+
+* The :prop_sf:`VS_SETTINGS` source file property was added to tell
+ :ref:`Visual Studio Generators` for VS 2010 and above to add
+ metadata to a non-built source file.
diff --git a/Help/release/dev/vs-platform-toolset.rst b/Help/release/dev/vs-platform-toolset.rst
new file mode 100644
index 0000000..c5062c7
--- /dev/null
+++ b/Help/release/dev/vs-platform-toolset.rst
@@ -0,0 +1,6 @@
+vs-platform-toolset
+-------------------
+
+* The :prop_tgt:`VS_PLATFORM_TOOLSET` target property was added to tell
+ :ref:`Visual Studio Generators` for VS 2010 and above to override
+ the platform toolset.
diff --git a/Help/release/dev/vs-sln-deploy.rst b/Help/release/dev/vs-sln-deploy.rst
new file mode 100644
index 0000000..2e83e52
--- /dev/null
+++ b/Help/release/dev/vs-sln-deploy.rst
@@ -0,0 +1,6 @@
+vs-sln-deploy
+-------------
+
+* The :prop_tgt:`VS_SOLUTION_DEPLOY` target property was added to tell
+ :ref:`Visual Studio Generators` for VS 2010 and above to mark a
+ target for deployment even when not building for Windows Phone/Store/CE.
diff --git a/Help/release/index.rst b/Help/release/index.rst
index 5d1f8a2..22b1a09 100644
--- a/Help/release/index.rst
+++ b/Help/release/index.rst
@@ -7,6 +7,8 @@ CMake Release Notes
This file should include the adjacent "dev.txt" file
in development versions but not in release versions.
+.. include:: dev.txt
+
Releases
========
diff --git a/Help/variable/CMAKE_CUDA_ARCHITECTURES.rst b/Help/variable/CMAKE_CUDA_ARCHITECTURES.rst
new file mode 100644
index 0000000..149bffa
--- /dev/null
+++ b/Help/variable/CMAKE_CUDA_ARCHITECTURES.rst
@@ -0,0 +1,17 @@
+CMAKE_CUDA_ARCHITECTURES
+------------------------
+
+Default value for :prop_tgt:`CUDA_ARCHITECTURES` property of targets.
+
+This is initialized as follows depending on :variable:`CMAKE_CUDA_COMPILER_ID <CMAKE_<LANG>_COMPILER_ID>`:
+
+- For ``Clang``: the oldest architecture that works.
+
+- For ``NVIDIA``: the default architecture chosen by the compiler.
+ See policy :policy:`CMP0104`.
+
+Users are encouraged to override this, as the default varies across compilers
+and compiler versions.
+
+This variable is used to initialize the :prop_tgt:`CUDA_ARCHITECTURES` property
+on all targets. See the target property for additional information.
diff --git a/Help/variable/CMAKE_FRAMEWORK_MULTI_CONFIG_POSTFIX_CONFIG.rst b/Help/variable/CMAKE_FRAMEWORK_MULTI_CONFIG_POSTFIX_CONFIG.rst
new file mode 100644
index 0000000..5c7cd23
--- /dev/null
+++ b/Help/variable/CMAKE_FRAMEWORK_MULTI_CONFIG_POSTFIX_CONFIG.rst
@@ -0,0 +1,8 @@
+CMAKE_FRAMEWORK_MULTI_CONFIG_POSTFIX_<CONFIG>
+---------------------------------------------
+
+Default framework filename postfix under configuration ``<CONFIG>`` when
+using a multi-config generator.
+
+When a framework target is created its :prop_tgt:`FRAMEWORK_MULTI_CONFIG_POSTFIX_<CONFIG>`
+target property is initialized with the value of this variable if it is set.
diff --git a/Help/variable/CMAKE_PCH_WARN_INVALID.rst b/Help/variable/CMAKE_PCH_WARN_INVALID.rst
new file mode 100644
index 0000000..e152abd
--- /dev/null
+++ b/Help/variable/CMAKE_PCH_WARN_INVALID.rst
@@ -0,0 +1,5 @@
+CMAKE_PCH_WARN_INVALID
+----------------------
+
+This variable is used to initialize the :prop_tgt:`PCH_WARN_INVALID`
+property of targets when they are created.
diff --git a/Help/variable/CMAKE_SYSTEM_PREFIX_PATH.rst b/Help/variable/CMAKE_SYSTEM_PREFIX_PATH.rst
index 87a9d06..e0ee979 100644
--- a/Help/variable/CMAKE_SYSTEM_PREFIX_PATH.rst
+++ b/Help/variable/CMAKE_SYSTEM_PREFIX_PATH.rst
@@ -8,11 +8,40 @@ CMAKE_SYSTEM_PREFIX_PATH
subdirectories (like ``bin``, ``lib``, or ``include``) as specified in its own
documentation.
-By default this contains the standard directories for the current system, the
+By default this contains the system directories for the current system, the
:variable:`CMAKE_INSTALL_PREFIX`, and the :variable:`CMAKE_STAGING_PREFIX`.
The installation and staging prefixes may be excluded by setting
the :variable:`CMAKE_FIND_NO_INSTALL_PREFIX` variable.
+The system directories that are contained in ``CMAKE_SYSTEM_PREFIX_PATH`` are
+locations that typically include installed software. An example being
+``/usr/local`` for UNIX based platforms. In addition to standard platform
+locations, CMake will also add values to ``CMAKE_SYSTEM_PREFIX_PATH`` based on
+environment variables. The environment variables and search locations that
+CMake uses may evolve over time, as platforms and their conventions also
+evolve. The following provides an indicative list of environment variables
+and locations that CMake searches, but they are subject to change:
+
+
+CrayLinuxEnvironment:
+ * ``ENV{SYSROOT_DIR}/``
+ * ``ENV{SYSROOT_DIR}/usr``
+ * ``ENV{SYSROOT_DIR}/usr/local``
+
+Darwin:
+ * ``ENV{SDKROOT}/usr`` When ``CMAKE_OSX_SYSROOT`` is not explicitly specified.
+
+OpenBSD:
+ * ``ENV{LOCALBASE}``
+
+Windows:
+ * ``ENV{ProgramW6432}``
+ * ``ENV{ProgramFiles}``
+ * ``ENV{ProgramFiles(x86)}``
+ * ``ENV{SystemDrive}/Program Files``
+ * ``ENV{SystemDrive}/Program Files (x86)``
+
+
``CMAKE_SYSTEM_PREFIX_PATH`` is *not* intended to be modified by the project;
use :variable:`CMAKE_PREFIX_PATH` for this.
diff --git a/Help/variable/CTEST_NIGHTLY_START_TIME.rst b/Help/variable/CTEST_NIGHTLY_START_TIME.rst
index bc80276..90841f9 100644
--- a/Help/variable/CTEST_NIGHTLY_START_TIME.rst
+++ b/Help/variable/CTEST_NIGHTLY_START_TIME.rst
@@ -1,5 +1,9 @@
CTEST_NIGHTLY_START_TIME
------------------------
-Specify the CTest ``NightlyStartTime`` setting
-in a :manual:`ctest(1)` dashboard client script.
+Specify the CTest ``NightlyStartTime`` setting in a :manual:`ctest(1)`
+dashboard client script.
+
+Note that this variable must always be set for a nightly build in a
+dashboard script. It is needed so that nightly builds can be properly grouped
+together in CDash.
diff --git a/Help/variable/CTEST_RESOURCE_SPEC_FILE.rst b/Help/variable/CTEST_RESOURCE_SPEC_FILE.rst
new file mode 100644
index 0000000..59f365f
--- /dev/null
+++ b/Help/variable/CTEST_RESOURCE_SPEC_FILE.rst
@@ -0,0 +1,5 @@
+CTEST_RESOURCE_SPEC_FILE
+------------------------
+
+Specify the CTest ``ResourceSpecFile`` setting in a :manual:`ctest(1)`
+dashboard client script.
diff --git a/Help/variable/PROJECT_SOURCE_DIR.rst b/Help/variable/PROJECT_SOURCE_DIR.rst
index 27f2838..b4601c2 100644
--- a/Help/variable/PROJECT_SOURCE_DIR.rst
+++ b/Help/variable/PROJECT_SOURCE_DIR.rst
@@ -1,6 +1,8 @@
PROJECT_SOURCE_DIR
------------------
-Top level source directory for the current project.
-
-This is the source directory of the most recent :command:`project` command.
+This is the source directory of the last call to the
+:command:`project` command made in the current directory scope or one
+of its parents. Note, it is not affected by calls to
+:command:`project` made within a child directory scope (i.e. from
+within a call to :command:`add_subdirectory` from the current scope).
diff --git a/Modules/CMakeASMCompiler.cmake.in b/Modules/CMakeASMCompiler.cmake.in
index b8e09fe..3953b30 100644
--- a/Modules/CMakeASMCompiler.cmake.in
+++ b/Modules/CMakeASMCompiler.cmake.in
@@ -10,7 +10,9 @@ set(CMAKE_ASM@ASM_DIALECT@_COMPILER_LOADED 1)
set(CMAKE_ASM@ASM_DIALECT@_COMPILER_ID "@_CMAKE_ASM_COMPILER_ID@")
set(CMAKE_ASM@ASM_DIALECT@_COMPILER_VERSION "@_CMAKE_ASM_COMPILER_VERSION@")
set(CMAKE_ASM@ASM_DIALECT@_COMPILER_ENV_VAR "@_CMAKE_ASM_COMPILER_ENV_VAR@")
+@_SET_CMAKE_ASM_COMPILER_ID_VENDOR_MATCH@
@_SET_CMAKE_ASM_COMPILER_ARCHITECTURE_ID@
+@_SET_CMAKE_ASM_COMPILER_SYSROOT@
set(CMAKE_ASM@ASM_DIALECT@_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC)
set(CMAKE_ASM@ASM_DIALECT@_LINKER_PREFERENCE 0)
diff --git a/Modules/CMakeASMInformation.cmake b/Modules/CMakeASMInformation.cmake
index 6b73730..03195cc 100644
--- a/Modules/CMakeASMInformation.cmake
+++ b/Modules/CMakeASMInformation.cmake
@@ -76,12 +76,12 @@ endif()
if(NOT CMAKE_ASM${ASM_DIALECT}_CREATE_STATIC_LIBRARY)
set(CMAKE_ASM${ASM_DIALECT}_CREATE_STATIC_LIBRARY
"<CMAKE_AR> cr <TARGET> <LINK_FLAGS> <OBJECTS> "
- "<CMAKE_RANLIB> <TARGET> ")
+ "<CMAKE_RANLIB> <TARGET>")
endif()
if(NOT CMAKE_ASM${ASM_DIALECT}_LINK_EXECUTABLE)
set(CMAKE_ASM${ASM_DIALECT}_LINK_EXECUTABLE
- "<CMAKE_ASM${ASM_DIALECT}_COMPILER> <FLAGS> <CMAKE_ASM${ASM_DIALECT}_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
+ "<CMAKE_ASM${ASM_DIALECT}_COMPILER> <FLAGS> <CMAKE_ASM${ASM_DIALECT}_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
endif()
if(NOT CMAKE_EXECUTABLE_RUNTIME_ASM${ASM_DIALECT}_FLAG)
diff --git a/Modules/CMakeASM_MASMInformation.cmake b/Modules/CMakeASM_MASMInformation.cmake
index 9f7e934..6d1e174 100644
--- a/Modules/CMakeASM_MASMInformation.cmake
+++ b/Modules/CMakeASM_MASMInformation.cmake
@@ -8,7 +8,7 @@ set(ASM_DIALECT "_MASM")
set(CMAKE_ASM${ASM_DIALECT}_SOURCE_FILE_EXTENSIONS asm)
-set(CMAKE_ASM${ASM_DIALECT}_COMPILE_OBJECT "<CMAKE_ASM${ASM_DIALECT}_COMPILER> <DEFINES> <INCLUDES> <FLAGS> /c /Fo <OBJECT> <SOURCE>")
+set(CMAKE_ASM${ASM_DIALECT}_COMPILE_OBJECT "<CMAKE_ASM${ASM_DIALECT}_COMPILER> <DEFINES> <INCLUDES> <FLAGS> /c /Fo <OBJECT> <SOURCE>")
# The ASM_MASM compiler id for this compiler is "MSVC", so fill out the runtime library table.
set(CMAKE_ASM${ASM_DIALECT}_COMPILE_OPTIONS_MSVC_RUNTIME_LIBRARY_MultiThreaded "")
diff --git a/Modules/CMakeASM_NASMInformation.cmake b/Modules/CMakeASM_NASMInformation.cmake
index cb793e7..97cb488 100644
--- a/Modules/CMakeASM_NASMInformation.cmake
+++ b/Modules/CMakeASM_NASMInformation.cmake
@@ -8,19 +8,25 @@ set(CMAKE_ASM_NASM_SOURCE_FILE_EXTENSIONS nasm asm)
if(NOT CMAKE_ASM_NASM_OBJECT_FORMAT)
if(WIN32)
- if(CMAKE_C_SIZEOF_DATA_PTR EQUAL 8)
+ if(DEFINED CMAKE_C_SIZEOF_DATA_PTR AND CMAKE_C_SIZEOF_DATA_PTR EQUAL 8)
+ set(CMAKE_ASM_NASM_OBJECT_FORMAT win64)
+ elseif(DEFINED CMAKE_CXX_SIZEOF_DATA_PTR AND CMAKE_CXX_SIZEOF_DATA_PTR EQUAL 8)
set(CMAKE_ASM_NASM_OBJECT_FORMAT win64)
else()
set(CMAKE_ASM_NASM_OBJECT_FORMAT win32)
endif()
elseif(APPLE)
- if(CMAKE_C_SIZEOF_DATA_PTR EQUAL 8)
+ if(DEFINED CMAKE_C_SIZEOF_DATA_PTR AND CMAKE_C_SIZEOF_DATA_PTR EQUAL 8)
+ set(CMAKE_ASM_NASM_OBJECT_FORMAT macho64)
+ elseif(DEFINED CMAKE_CXX_SIZEOF_DATA_PTR AND CMAKE_CXX_SIZEOF_DATA_PTR EQUAL 8)
set(CMAKE_ASM_NASM_OBJECT_FORMAT macho64)
else()
set(CMAKE_ASM_NASM_OBJECT_FORMAT macho)
endif()
else()
- if(CMAKE_C_SIZEOF_DATA_PTR EQUAL 8)
+ if(DEFINED CMAKE_C_SIZEOF_DATA_PTR AND CMAKE_C_SIZEOF_DATA_PTR EQUAL 8)
+ set(CMAKE_ASM_NASM_OBJECT_FORMAT elf64)
+ elseif(DEFINED CMAKE_CXX_SIZEOF_DATA_PTR AND CMAKE_CXX_SIZEOF_DATA_PTR EQUAL 8)
set(CMAKE_ASM_NASM_OBJECT_FORMAT elf64)
else()
set(CMAKE_ASM_NASM_OBJECT_FORMAT elf)
diff --git a/Modules/CMakeCCompiler.cmake.in b/Modules/CMakeCCompiler.cmake.in
index 9b8d423..eea3f5d 100644
--- a/Modules/CMakeCCompiler.cmake.in
+++ b/Modules/CMakeCCompiler.cmake.in
@@ -15,6 +15,7 @@ set(CMAKE_C_SIMULATE_ID "@CMAKE_C_SIMULATE_ID@")
set(CMAKE_C_COMPILER_FRONTEND_VARIANT "@CMAKE_C_COMPILER_FRONTEND_VARIANT@")
set(CMAKE_C_SIMULATE_VERSION "@CMAKE_C_SIMULATE_VERSION@")
@_SET_CMAKE_C_COMPILER_ARCHITECTURE_ID@
+@_SET_CMAKE_C_COMPILER_SYSROOT@
@SET_MSVC_C_ARCHITECTURE_ID@
@SET_CMAKE_XCODE_ARCHS@
set(CMAKE_AR "@CMAKE_AR@")
diff --git a/Modules/CMakeCInformation.cmake b/Modules/CMakeCInformation.cmake
index 1e08bb7..f6d620f 100644
--- a/Modules/CMakeCInformation.cmake
+++ b/Modules/CMakeCInformation.cmake
@@ -161,7 +161,7 @@ if(NOT DEFINED CMAKE_C_ARCHIVE_CREATE)
set(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> qc <TARGET> <LINK_FLAGS> <OBJECTS>")
endif()
if(NOT DEFINED CMAKE_C_ARCHIVE_APPEND)
- set(CMAKE_C_ARCHIVE_APPEND "<CMAKE_AR> q <TARGET> <LINK_FLAGS> <OBJECTS>")
+ set(CMAKE_C_ARCHIVE_APPEND "<CMAKE_AR> q <TARGET> <LINK_FLAGS> <OBJECTS>")
endif()
if(NOT DEFINED CMAKE_C_ARCHIVE_FINISH)
set(CMAKE_C_ARCHIVE_FINISH "<CMAKE_RANLIB> <TARGET>")
@@ -170,12 +170,12 @@ endif()
# compile a C file into an object file
if(NOT CMAKE_C_COMPILE_OBJECT)
set(CMAKE_C_COMPILE_OBJECT
- "<CMAKE_C_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -o <OBJECT> -c <SOURCE>")
+ "<CMAKE_C_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -o <OBJECT> -c <SOURCE>")
endif()
if(NOT CMAKE_C_LINK_EXECUTABLE)
set(CMAKE_C_LINK_EXECUTABLE
- "<CMAKE_C_COMPILER> <FLAGS> <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
+ "<CMAKE_C_COMPILER> <FLAGS> <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
endif()
if(NOT CMAKE_EXECUTABLE_RUNTIME_C_FLAG)
diff --git a/Modules/CMakeCUDACompiler.cmake.in b/Modules/CMakeCUDACompiler.cmake.in
index 04a4c42..64fb469 100644
--- a/Modules/CMakeCUDACompiler.cmake.in
+++ b/Modules/CMakeCUDACompiler.cmake.in
@@ -16,6 +16,7 @@ set(CMAKE_CUDA_SIMULATE_ID "@CMAKE_CUDA_SIMULATE_ID@")
set(CMAKE_CUDA_COMPILER_FRONTEND_VARIANT "@CMAKE_CUDA_COMPILER_FRONTEND_VARIANT@")
set(CMAKE_CUDA_SIMULATE_VERSION "@CMAKE_CUDA_SIMULATE_VERSION@")
@SET_MSVC_CUDA_ARCHITECTURE_ID@
+@_SET_CMAKE_CUDA_COMPILER_SYSROOT@
set(CMAKE_CUDA_COMPILER_ENV_VAR "CUDACXX")
set(CMAKE_CUDA_HOST_COMPILER_ENV_VAR "CUDAHOSTCXX")
@@ -56,4 +57,5 @@ set(CMAKE_CUDA_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "@CMAKE_CUDA_IMPLICIT_LINK_FR
@_SET_CMAKE_CUDA_RUNTIME_LIBRARY_DEFAULT@
set(CMAKE_LINKER "@CMAKE_LINKER@")
+set(CMAKE_AR "@CMAKE_AR@")
set(CMAKE_MT "@CMAKE_MT@")
diff --git a/Modules/CMakeCUDAInformation.cmake b/Modules/CMakeCUDAInformation.cmake
index 974f5fa..f9f7574 100644
--- a/Modules/CMakeCUDAInformation.cmake
+++ b/Modules/CMakeCUDAInformation.cmake
@@ -8,6 +8,19 @@ else()
endif()
set(CMAKE_INCLUDE_FLAG_CUDA "-I")
+# Set implicit links early so compiler-specific modules can use them.
+set(__IMPLICT_LINKS )
+foreach(dir ${CMAKE_CUDA_HOST_IMPLICIT_LINK_DIRECTORIES})
+ string(APPEND __IMPLICT_LINKS " -L\"${dir}\"")
+endforeach()
+foreach(lib ${CMAKE_CUDA_HOST_IMPLICIT_LINK_LIBRARIES})
+ if(${lib} MATCHES "/")
+ string(APPEND __IMPLICT_LINKS " \"${lib}\"")
+ else()
+ string(APPEND __IMPLICT_LINKS " -l${lib}")
+ endif()
+endforeach()
+
# Load compiler-specific information.
if(CMAKE_CUDA_COMPILER_ID)
include(Compiler/${CMAKE_CUDA_COMPILER_ID}-CUDA OPTIONAL)
@@ -97,22 +110,10 @@ include(CMakeCommonLanguageInclude)
# CMAKE_CUDA_COMPILE_SEPARABLE_COMPILATION
# CMAKE_CUDA_LINK_EXECUTABLE
-if(CMAKE_CUDA_HOST_COMPILER)
+if(CMAKE_CUDA_HOST_COMPILER AND CMAKE_CUDA_COMPILER_ID STREQUAL "NVIDIA")
string(APPEND _CMAKE_CUDA_EXTRA_FLAGS " -ccbin=<CMAKE_CUDA_HOST_COMPILER>")
endif()
-set(__IMPLICT_LINKS )
-foreach(dir ${CMAKE_CUDA_HOST_IMPLICIT_LINK_DIRECTORIES})
- string(APPEND __IMPLICT_LINKS " -L\"${dir}\"")
-endforeach()
-foreach(lib ${CMAKE_CUDA_HOST_IMPLICIT_LINK_LIBRARIES})
- if(${lib} MATCHES "/")
- string(APPEND __IMPLICT_LINKS " \"${lib}\"")
- else()
- string(APPEND __IMPLICT_LINKS " -l${lib}")
- endif()
-endforeach()
-
# create a shared library
if(NOT CMAKE_CUDA_CREATE_SHARED_LIBRARY)
set(CMAKE_CUDA_CREATE_SHARED_LIBRARY
@@ -129,7 +130,7 @@ if(NOT DEFINED CMAKE_CUDA_ARCHIVE_CREATE)
set(CMAKE_CUDA_ARCHIVE_CREATE "<CMAKE_AR> qc <TARGET> <LINK_FLAGS> <OBJECTS>")
endif()
if(NOT DEFINED CMAKE_CUDA_ARCHIVE_APPEND)
- set(CMAKE_CUDA_ARCHIVE_APPEND "<CMAKE_AR> q <TARGET> <LINK_FLAGS> <OBJECTS>")
+ set(CMAKE_CUDA_ARCHIVE_APPEND "<CMAKE_AR> q <TARGET> <LINK_FLAGS> <OBJECTS>")
endif()
if(NOT DEFINED CMAKE_CUDA_ARCHIVE_FINISH)
set(CMAKE_CUDA_ARCHIVE_FINISH "<CMAKE_RANLIB> <TARGET>")
@@ -138,24 +139,24 @@ endif()
#Specify how to compile when ptx has been requested
if(NOT CMAKE_CUDA_COMPILE_PTX_COMPILATION)
set(CMAKE_CUDA_COMPILE_PTX_COMPILATION
- "<CMAKE_CUDA_COMPILER> ${_CMAKE_CUDA_EXTRA_FLAGS} <DEFINES> <INCLUDES> <FLAGS> -x cu -ptx <SOURCE> -o <OBJECT>")
+ "<CMAKE_CUDA_COMPILER> ${_CMAKE_CUDA_EXTRA_FLAGS} <DEFINES> <INCLUDES> <FLAGS> ${_CMAKE_COMPILE_AS_CUDA_FLAG} ${_CMAKE_CUDA_PTX_FLAG} <SOURCE> -o <OBJECT>")
endif()
#Specify how to compile when separable compilation has been requested
if(NOT CMAKE_CUDA_COMPILE_SEPARABLE_COMPILATION)
set(CMAKE_CUDA_COMPILE_SEPARABLE_COMPILATION
- "<CMAKE_CUDA_COMPILER> ${_CMAKE_CUDA_EXTRA_FLAGS} <DEFINES> <INCLUDES> <FLAGS> -x cu -dc <SOURCE> -o <OBJECT>")
+ "<CMAKE_CUDA_COMPILER> ${_CMAKE_CUDA_EXTRA_FLAGS} <DEFINES> <INCLUDES> <FLAGS> ${_CMAKE_COMPILE_AS_CUDA_FLAG} -dc <SOURCE> -o <OBJECT>")
endif()
#Specify how to compile when whole compilation has been requested
if(NOT CMAKE_CUDA_COMPILE_WHOLE_COMPILATION)
set(CMAKE_CUDA_COMPILE_WHOLE_COMPILATION
- "<CMAKE_CUDA_COMPILER> ${_CMAKE_CUDA_EXTRA_FLAGS} <DEFINES> <INCLUDES> <FLAGS> -x cu -c <SOURCE> -o <OBJECT>")
+ "<CMAKE_CUDA_COMPILER> ${_CMAKE_CUDA_EXTRA_FLAGS} <DEFINES> <INCLUDES> <FLAGS> ${_CMAKE_COMPILE_AS_CUDA_FLAG} -c <SOURCE> -o <OBJECT>")
endif()
-if(CMAKE_GENERATOR STREQUAL "Ninja" AND NOT CMAKE_DEPFILE_FLAGS_CUDA )
+if(CMAKE_GENERATOR STREQUAL "Ninja" AND NOT CMAKE_DEPFILE_FLAGS_CUDA)
set(CMAKE_CUDA_COMPILE_DEPENDENCY_DETECTION
- "<CMAKE_CUDA_COMPILER> ${_CMAKE_CUDA_EXTRA_FLAGS} <DEFINES> <INCLUDES> <FLAGS> -x cu -M <SOURCE> -MT <OBJECT> -o $DEP_FILE")
+ "<CMAKE_CUDA_COMPILER> ${_CMAKE_CUDA_EXTRA_FLAGS} <DEFINES> <INCLUDES> <FLAGS> ${_CMAKE_COMPILE_AS_CUDA_FLAG} -M <SOURCE> -MT <OBJECT> -o $DEP_FILE")
#The Ninja generator uses the make file dependency files to determine what
#files need to be recompiled. Unfortunately, nvcc < 10.2 doesn't support building
#a source file and generating the dependencies of said file in a single
@@ -192,14 +193,13 @@ unset(__IMPLICT_DLINK_DIRS)
#These are used when linking relocatable (dc) cuda code
if(NOT CMAKE_CUDA_DEVICE_LINK_LIBRARY)
set(CMAKE_CUDA_DEVICE_LINK_LIBRARY
- "<CMAKE_CUDA_COMPILER> ${_CMAKE_CUDA_EXTRA_FLAGS} <LANGUAGE_COMPILE_FLAGS> ${CMAKE_CUDA_COMPILE_OPTIONS_PIC} ${_CMAKE_CUDA_EXTRA_DEVICE_LINK_FLAGS} -shared -dlink <OBJECTS> -o <TARGET> <LINK_LIBRARIES>${__IMPLICT_DLINK_FLAGS}")
+ "<CMAKE_CUDA_COMPILER> ${_CMAKE_CUDA_EXTRA_FLAGS} <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> ${CMAKE_CUDA_COMPILE_OPTIONS_PIC} ${_CMAKE_CUDA_EXTRA_DEVICE_LINK_FLAGS} -shared -dlink <OBJECTS> -o <TARGET> <LINK_LIBRARIES>${__IMPLICT_DLINK_FLAGS}")
endif()
if(NOT CMAKE_CUDA_DEVICE_LINK_EXECUTABLE)
set(CMAKE_CUDA_DEVICE_LINK_EXECUTABLE
- "<CMAKE_CUDA_COMPILER> ${_CMAKE_CUDA_EXTRA_FLAGS} <FLAGS> ${CMAKE_CUDA_COMPILE_OPTIONS_PIC} ${_CMAKE_CUDA_EXTRA_DEVICE_LINK_FLAGS} -shared -dlink <OBJECTS> -o <TARGET> <LINK_LIBRARIES>${__IMPLICT_DLINK_FLAGS}")
+ "<CMAKE_CUDA_COMPILER> ${_CMAKE_CUDA_EXTRA_FLAGS} <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> ${CMAKE_CUDA_COMPILE_OPTIONS_PIC} ${_CMAKE_CUDA_EXTRA_DEVICE_LINK_FLAGS} -shared -dlink <OBJECTS> -o <TARGET> <LINK_LIBRARIES>${__IMPLICT_DLINK_FLAGS}")
endif()
-unset(_CMAKE_CUDA_EXTRA_DEVICE_LINK_FLAGS)
unset(__IMPLICT_DLINK_FLAGS)
set(CMAKE_CUDA_INFORMATION_LOADED 1)
diff --git a/Modules/CMakeCXXCompiler.cmake.in b/Modules/CMakeCXXCompiler.cmake.in
index efb8abf..09bdc23 100644
--- a/Modules/CMakeCXXCompiler.cmake.in
+++ b/Modules/CMakeCXXCompiler.cmake.in
@@ -17,6 +17,7 @@ set(CMAKE_CXX_SIMULATE_ID "@CMAKE_CXX_SIMULATE_ID@")
set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT "@CMAKE_CXX_COMPILER_FRONTEND_VARIANT@")
set(CMAKE_CXX_SIMULATE_VERSION "@CMAKE_CXX_SIMULATE_VERSION@")
@_SET_CMAKE_CXX_COMPILER_ARCHITECTURE_ID@
+@_SET_CMAKE_CXX_COMPILER_SYSROOT@
@SET_MSVC_CXX_ARCHITECTURE_ID@
@SET_CMAKE_XCODE_ARCHS@
set(CMAKE_AR "@CMAKE_AR@")
diff --git a/Modules/CMakeCXXInformation.cmake b/Modules/CMakeCXXInformation.cmake
index da7440a..dbb4366 100644
--- a/Modules/CMakeCXXInformation.cmake
+++ b/Modules/CMakeCXXInformation.cmake
@@ -258,7 +258,7 @@ if(NOT DEFINED CMAKE_CXX_ARCHIVE_CREATE)
set(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> qc <TARGET> <LINK_FLAGS> <OBJECTS>")
endif()
if(NOT DEFINED CMAKE_CXX_ARCHIVE_APPEND)
- set(CMAKE_CXX_ARCHIVE_APPEND "<CMAKE_AR> q <TARGET> <LINK_FLAGS> <OBJECTS>")
+ set(CMAKE_CXX_ARCHIVE_APPEND "<CMAKE_AR> q <TARGET> <LINK_FLAGS> <OBJECTS>")
endif()
if(NOT DEFINED CMAKE_CXX_ARCHIVE_FINISH)
set(CMAKE_CXX_ARCHIVE_FINISH "<CMAKE_RANLIB> <TARGET>")
@@ -267,12 +267,12 @@ endif()
# compile a C++ file into an object file
if(NOT CMAKE_CXX_COMPILE_OBJECT)
set(CMAKE_CXX_COMPILE_OBJECT
- "<CMAKE_CXX_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -o <OBJECT> -c <SOURCE>")
+ "<CMAKE_CXX_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -o <OBJECT> -c <SOURCE>")
endif()
if(NOT CMAKE_CXX_LINK_EXECUTABLE)
set(CMAKE_CXX_LINK_EXECUTABLE
- "<CMAKE_CXX_COMPILER> <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
+ "<CMAKE_CXX_COMPILER> <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
endif()
mark_as_advanced(
diff --git a/Modules/CMakeCompilerIdDetection.cmake b/Modules/CMakeCompilerIdDetection.cmake
index bb573b7..acd15df 100644
--- a/Modules/CMakeCompilerIdDetection.cmake
+++ b/Modules/CMakeCompilerIdDetection.cmake
@@ -89,9 +89,8 @@ function(compiler_id_detection outvar lang)
)
endif()
- #Currently the only CUDA compilers are NVIDIA
if(lang STREQUAL CUDA)
- set(ordered_compilers NVIDIA)
+ set(ordered_compilers NVIDIA Clang)
endif()
if(CID_ID_DEFINE)
diff --git a/Modules/CMakeDetermineASMCompiler.cmake b/Modules/CMakeDetermineASMCompiler.cmake
index e47f3a4..bc8b86b 100644
--- a/Modules/CMakeDetermineASMCompiler.cmake
+++ b/Modules/CMakeDetermineASMCompiler.cmake
@@ -134,6 +134,9 @@ if(NOT CMAKE_ASM${ASM_DIALECT}_COMPILER_ID)
list(GET _all_compileid_matches "-1" CMAKE_ASM${ASM_DIALECT}_COMPILER_ARCHITECTURE_ID)
endif()
endif()
+
+ _cmake_find_compiler_sysroot(ASM${ASM_DIALECT})
+
unset(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_OUTPUT)
unset(_all_compileid_matches)
unset(_compileid)
@@ -211,6 +214,21 @@ foreach(_var
set(_CMAKE_ASM_${_var} "${CMAKE_ASM${ASM_DIALECT}_${_var}}")
endforeach()
+if(CMAKE_ASM${ASM_DIALECT}_COMPILER_SYSROOT)
+ string(CONCAT _SET_CMAKE_ASM_COMPILER_SYSROOT
+ "set(CMAKE_ASM${ASM_DIALECT}_COMPILER_SYSROOT \"${CMAKE_ASM${ASM_DIALECT}_COMPILER_SYSROOT}\")\n"
+ "set(CMAKE_COMPILER_SYSROOT \"${CMAKE_ASM${ASM_DIALECT}_COMPILER_SYSROOT}\")")
+else()
+ set(_SET_CMAKE_ASM_COMPILER_SYSROOT "")
+endif()
+
+if(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_MATCH)
+ set(_SET_CMAKE_ASM_COMPILER_ID_VENDOR_MATCH
+ "set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_MATCH [==[${CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_MATCH}]==])")
+else()
+ set(_SET_CMAKE_ASM_COMPILER_ID_VENDOR_MATCH "")
+endif()
+
if(CMAKE_ASM${ASM_DIALECT}_COMPILER_ARCHITECTURE_ID)
set(_SET_CMAKE_ASM_COMPILER_ARCHITECTURE_ID
"set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ARCHITECTURE_ID ${CMAKE_ASM${ASM_DIALECT}_COMPILER_ARCHITECTURE_ID})")
diff --git a/Modules/CMakeDetermineCCompiler.cmake b/Modules/CMakeDetermineCCompiler.cmake
index 037c33b..f870956 100644
--- a/Modules/CMakeDetermineCCompiler.cmake
+++ b/Modules/CMakeDetermineCCompiler.cmake
@@ -115,6 +115,8 @@ if(NOT CMAKE_C_COMPILER_ID_RUN)
include(${CMAKE_ROOT}/Modules/CMakeDetermineCompilerId.cmake)
CMAKE_DETERMINE_COMPILER_ID(C CFLAGS CMakeCCompilerId.c)
+ _cmake_find_compiler_sysroot(C)
+
# Set old compiler and platform id variables.
if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
set(CMAKE_COMPILER_IS_GNUCC 1)
@@ -153,7 +155,7 @@ endif ()
# NAME_WE cannot be used since then this test will fail for names like
# "arm-unknown-nto-qnx6.3.0-gcc.exe", where BASENAME would be
# "arm-unknown-nto-qnx6" instead of the correct "arm-unknown-nto-qnx6.3.0-"
-if (CMAKE_CROSSCOMPILING AND NOT _CMAKE_TOOLCHAIN_PREFIX)
+if (NOT _CMAKE_TOOLCHAIN_PREFIX)
if(CMAKE_C_COMPILER_ID MATCHES "GNU|Clang|QCC")
get_filename_component(COMPILER_BASENAME "${CMAKE_C_COMPILER}" NAME)
@@ -191,6 +193,14 @@ include(CMakeFindBinUtils)
include(Compiler/${CMAKE_C_COMPILER_ID}-FindBinUtils OPTIONAL)
unset(_CMAKE_PROCESSING_LANGUAGE)
+if(CMAKE_C_COMPILER_SYSROOT)
+ string(CONCAT _SET_CMAKE_C_COMPILER_SYSROOT
+ "set(CMAKE_C_COMPILER_SYSROOT \"${CMAKE_C_COMPILER_SYSROOT}\")\n"
+ "set(CMAKE_COMPILER_SYSROOT \"${CMAKE_C_COMPILER_SYSROOT}\")")
+else()
+ set(_SET_CMAKE_C_COMPILER_SYSROOT "")
+endif()
+
if(CMAKE_C_COMPILER_ARCHITECTURE_ID)
set(_SET_CMAKE_C_COMPILER_ARCHITECTURE_ID
"set(CMAKE_C_COMPILER_ARCHITECTURE_ID ${CMAKE_C_COMPILER_ARCHITECTURE_ID})")
diff --git a/Modules/CMakeDetermineCUDACompiler.cmake b/Modules/CMakeDetermineCUDACompiler.cmake
index baf1501..427e5b5 100644
--- a/Modules/CMakeDetermineCUDACompiler.cmake
+++ b/Modules/CMakeDetermineCUDACompiler.cmake
@@ -2,7 +2,7 @@
# file Copyright.txt or https://cmake.org/licensing for details.
include(${CMAKE_ROOT}/Modules/CMakeDetermineCompiler.cmake)
-include(${CMAKE_ROOT}/Modules//CMakeParseImplicitLinkInfo.cmake)
+include(${CMAKE_ROOT}/Modules/CMakeParseImplicitLinkInfo.cmake)
if( NOT ( ("${CMAKE_GENERATOR}" MATCHES "Make") OR
("${CMAKE_GENERATOR}" MATCHES "Ninja") OR
@@ -57,23 +57,49 @@ if(NOT CMAKE_CUDA_COMPILER_ID_RUN)
file(READ ${CMAKE_ROOT}/Modules/CMakePlatformId.h.in
CMAKE_CUDA_COMPILER_ID_PLATFORM_CONTENT)
- list(APPEND CMAKE_CUDA_COMPILER_ID_MATCH_VENDORS NVIDIA)
- set(CMAKE_CUDA_COMPILER_ID_MATCH_VENDOR_REGEX_NVIDIA "nvcc: NVIDIA \(R\) Cuda compiler driver")
+ list(APPEND CMAKE_CUDA_COMPILER_ID_VENDORS NVIDIA Clang)
+ set(CMAKE_CUDA_COMPILER_ID_VENDOR_REGEX_NVIDIA "nvcc: NVIDIA \\(R\\) Cuda compiler driver")
+ set(CMAKE_CUDA_COMPILER_ID_VENDOR_REGEX_Clang "(clang version)")
set(CMAKE_CXX_COMPILER_ID_TOOL_MATCH_REGEX "\nLd[^\n]*(\n[ \t]+[^\n]*)*\n[ \t]+([^ \t\r\n]+)[^\r\n]*-o[^\r\n]*CompilerIdCUDA/(\\./)?(CompilerIdCUDA.xctest/)?CompilerIdCUDA[ \t\n\\\"]")
set(CMAKE_CXX_COMPILER_ID_TOOL_MATCH_INDEX 2)
+ set(CMAKE_CUDA_COMPILER_ID_FLAGS_ALWAYS "-v")
- set(CMAKE_CUDA_COMPILER_ID_FLAGS_ALWAYS -v --keep --keep-dir tmp)
+ # nvcc
+ set(nvcc_test_flags "--keep --keep-dir tmp")
if(CMAKE_CUDA_HOST_COMPILER)
- list(APPEND CMAKE_CUDA_COMPILER_ID_FLAGS_ALWAYS "-ccbin=${CMAKE_CUDA_HOST_COMPILER}")
+ string(APPEND nvcc_test_flags " -ccbin=${CMAKE_CUDA_HOST_COMPILER}")
endif()
+ list(APPEND CMAKE_CUDA_COMPILER_ID_TEST_FLAGS_FIRST ${nvcc_test_flags})
+
+ # Clang
+ if(CMAKE_CROSSCOMPILING)
+ # Need to pass the host target and include directories if we're crosscompiling.
+ set(clang_test_flags "--sysroot=\"${CMAKE_SYSROOT}\" --target=${CMAKE_CUDA_COMPILER_TARGET}")
+ else()
+ set(clang_test_flags)
+ endif()
+
+ # Clang doesn't automatically select an architecture supported by the SDK.
+ # Try in reverse order of deprecation with the most recent at front (i.e. the most likely to work for new setups).
+ foreach(arch ${CMAKE_CUDA_ARCHITECTURES} "20" "30" "52")
+ # Strip specifiers.
+ string(REGEX MATCH "[0-9]+" arch_name "${arch}")
+ list(APPEND CMAKE_CUDA_COMPILER_ID_TEST_FLAGS_FIRST "${clang_test_flags} --cuda-gpu-arch=sm_${arch_name}")
+ endforeach()
+
+ # Finally also try the default.
+ list(APPEND CMAKE_CUDA_COMPILER_ID_TEST_FLAGS_FIRST "${clang_test_flags}")
include(${CMAKE_ROOT}/Modules/CMakeDetermineCompilerId.cmake)
CMAKE_DETERMINE_COMPILER_ID(CUDA CUDAFLAGS CMakeCUDACompilerId.cu)
+
+ _cmake_find_compiler_sysroot(CUDA)
endif()
set(_CMAKE_PROCESSING_LANGUAGE "CUDA")
include(CMakeFindBinUtils)
+include(Compiler/${CMAKE_CUDA_COMPILER_ID}-FindBinUtils OPTIONAL)
unset(_CMAKE_PROCESSING_LANGUAGE)
if(MSVC_CUDA_ARCHITECTURE_ID)
@@ -100,7 +126,34 @@ if(${CMAKE_GENERATOR} MATCHES "Visual Studio")
endif()
set(_SET_CMAKE_CUDA_RUNTIME_LIBRARY_DEFAULT
"set(CMAKE_CUDA_RUNTIME_LIBRARY_DEFAULT \"${CMAKE_CUDA_RUNTIME_LIBRARY_DEFAULT}\")")
-elseif(CMAKE_CUDA_COMPILER_ID STREQUAL NVIDIA)
+elseif(CMAKE_CUDA_COMPILER_ID STREQUAL "Clang")
+ # Parse default CUDA architecture.
+ if(NOT CMAKE_CUDA_ARCHITECTURES)
+ string(REGEX MATCH "-target-cpu sm_([0-9]+)" dont_care "${CMAKE_CUDA_COMPILER_PRODUCED_OUTPUT}")
+ set(CMAKE_CUDA_ARCHITECTURES "${CMAKE_MATCH_1}" CACHE STRING "CUDA architectures")
+
+ if(NOT CMAKE_CUDA_ARCHITECTURES)
+ message(FATAL_ERROR "Failed to find default CUDA architecture.")
+ endif()
+ endif()
+
+ # Parsing implicit host linker info is as simple as for regular Clang.
+ CMAKE_PARSE_IMPLICIT_LINK_INFO("${CMAKE_CUDA_COMPILER_PRODUCED_OUTPUT}"
+ CMAKE_CUDA_HOST_IMPLICIT_LINK_LIBRARIES
+ CMAKE_CUDA_HOST_IMPLICIT_LINK_DIRECTORIES
+ CMAKE_CUDA_HOST_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES
+ log
+ "${CMAKE_CUDA_IMPLICIT_OBJECT_REGEX}")
+
+ # Get SDK directory.
+ string(REGEX MATCH "Found CUDA installation: (.+), version" dont_care "${CMAKE_CUDA_COMPILER_PRODUCED_OUTPUT}")
+ set(__cuda_directory "${CMAKE_MATCH_1}")
+
+ # Clang doesn't add the SDK library directory to the implicit link path. Do it ourselves, so stuff works.
+ include(Internal/CUDAToolkit)
+ set(CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES "${CUDAToolkit_INCLUDE_DIR}")
+ list(APPEND CMAKE_CUDA_HOST_IMPLICIT_LINK_DIRECTORIES "${CUDAToolkit_LIBRARY_DIR}")
+elseif(CMAKE_CUDA_COMPILER_ID STREQUAL "NVIDIA")
set(_nvcc_log "")
string(REPLACE "\r" "" _nvcc_output_orig "${CMAKE_CUDA_COMPILER_PRODUCED_OUTPUT}")
if(_nvcc_output_orig MATCHES "#\\\$ +PATH= *([^\n]*)\n")
@@ -216,30 +269,52 @@ elseif(CMAKE_CUDA_COMPILER_ID STREQUAL NVIDIA)
endif()
endif()
-set(CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES )
-string(REPLACE "\r" "" _nvcc_output_orig "${CMAKE_CUDA_COMPILER_PRODUCED_OUTPUT}")
-if(_nvcc_output_orig MATCHES "#\\\$ +INCLUDES= *([^\n]*)\n")
- set(_nvcc_includes "${CMAKE_MATCH_1}")
- string(APPEND _nvcc_log " found 'INCLUDES=' string: [${_nvcc_includes}]\n")
+if(CMAKE_CUDA_COMPILER_SYSROOT)
+ string(CONCAT _SET_CMAKE_CUDA_COMPILER_SYSROOT
+ "set(CMAKE_CUDA_COMPILER_SYSROOT \"${CMAKE_CUDA_COMPILER_SYSROOT}\")\n"
+ "set(CMAKE_COMPILER_SYSROOT \"${CMAKE_CUDA_COMPILER_SYSROOT}\")")
else()
- set(_nvcc_includes "")
- string(REPLACE "\n" "\n " _nvcc_output_log "\n${_nvcc_output_orig}")
- string(APPEND _nvcc_log " no 'INCLUDES=' string found in nvcc output:${_nvcc_output_log}\n")
+ set(_SET_CMAKE_CUDA_COMPILER_SYSROOT "")
endif()
-if(_nvcc_includes)
- # across all operating system each include directory is prefixed with -I
- separate_arguments(_nvcc_output NATIVE_COMMAND "${_nvcc_includes}")
- foreach(line IN LISTS _nvcc_output)
- string(REGEX REPLACE "^-I" "" line "${line}")
- get_filename_component(line "${line}" ABSOLUTE)
- list(APPEND CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES "${line}")
- endforeach()
- file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
- "Parsed CUDA nvcc include information from above output:\n${_nvcc_log}\n${log}\n\n")
-else()
- file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
- "Failed to detect CUDA nvcc include information:\n${_nvcc_log}\n\n")
+# Determine CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES
+if(CMAKE_CUDA_COMPILER_ID STREQUAL "NVIDIA")
+ set(CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES)
+ string(REPLACE "\r" "" _nvcc_output_orig "${CMAKE_CUDA_COMPILER_PRODUCED_OUTPUT}")
+ if(_nvcc_output_orig MATCHES "#\\\$ +INCLUDES= *([^\n]*)\n")
+ set(_nvcc_includes "${CMAKE_MATCH_1}")
+ string(APPEND _nvcc_log " found 'INCLUDES=' string: [${_nvcc_includes}]\n")
+ else()
+ set(_nvcc_includes "")
+ string(REPLACE "\n" "\n " _nvcc_output_log "\n${_nvcc_output_orig}")
+ string(APPEND _nvcc_log " no 'INCLUDES=' string found in nvcc output:${_nvcc_output_log}\n")
+ endif()
+ if(_nvcc_includes)
+ # across all operating system each include directory is prefixed with -I
+ separate_arguments(_nvcc_output NATIVE_COMMAND "${_nvcc_includes}")
+ foreach(line IN LISTS _nvcc_output)
+ string(REGEX REPLACE "^-I" "" line "${line}")
+ get_filename_component(line "${line}" ABSOLUTE)
+ list(APPEND CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES "${line}")
+ endforeach()
+
+ file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
+ "Parsed CUDA nvcc include information from above output:\n${_nvcc_log}\n${log}\n\n")
+ else()
+ file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
+ "Failed to detect CUDA nvcc include information:\n${_nvcc_log}\n\n")
+ endif()
+
+ # Parse default CUDA architecture.
+ cmake_policy(GET CMP0104 _CUDA_CMP0104)
+ if(NOT CMAKE_CUDA_ARCHITECTURES AND _CUDA_CMP0104 STREQUAL "NEW")
+ string(REGEX MATCH "arch[ =]compute_([0-9]+)" dont_care "${CMAKE_CUDA_COMPILER_PRODUCED_OUTPUT}")
+ set(CMAKE_CUDA_ARCHITECTURES "${CMAKE_MATCH_1}" CACHE STRING "CUDA architectures")
+
+ if(NOT CMAKE_CUDA_ARCHITECTURES)
+ message(FATAL_ERROR "Failed to find default CUDA architecture.")
+ endif()
+ endif()
endif()
# configure all variables set in this file
diff --git a/Modules/CMakeDetermineCXXCompiler.cmake b/Modules/CMakeDetermineCXXCompiler.cmake
index 7274eec..e6b46b8 100644
--- a/Modules/CMakeDetermineCXXCompiler.cmake
+++ b/Modules/CMakeDetermineCXXCompiler.cmake
@@ -110,6 +110,8 @@ if(NOT CMAKE_CXX_COMPILER_ID_RUN)
include(${CMAKE_ROOT}/Modules/CMakeDetermineCompilerId.cmake)
CMAKE_DETERMINE_COMPILER_ID(CXX CXXFLAGS CMakeCXXCompilerId.cpp)
+ _cmake_find_compiler_sysroot(CXX)
+
# Set old compiler and platform id variables.
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
set(CMAKE_COMPILER_IS_GNUCXX 1)
@@ -150,7 +152,7 @@ endif ()
# "arm-unknown-nto-qnx6" instead of the correct "arm-unknown-nto-qnx6.3.0-"
-if (CMAKE_CROSSCOMPILING AND NOT _CMAKE_TOOLCHAIN_PREFIX)
+if (NOT _CMAKE_TOOLCHAIN_PREFIX)
if("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU|Clang|QCC")
get_filename_component(COMPILER_BASENAME "${CMAKE_CXX_COMPILER}" NAME)
@@ -189,6 +191,14 @@ include(CMakeFindBinUtils)
include(Compiler/${CMAKE_CXX_COMPILER_ID}-FindBinUtils OPTIONAL)
unset(_CMAKE_PROCESSING_LANGUAGE)
+if(CMAKE_CXX_COMPILER_SYSROOT)
+ string(CONCAT _SET_CMAKE_CXX_COMPILER_SYSROOT
+ "set(CMAKE_CXX_COMPILER_SYSROOT \"${CMAKE_CXX_COMPILER_SYSROOT}\")\n"
+ "set(CMAKE_COMPILER_SYSROOT \"${CMAKE_CXX_COMPILER_SYSROOT}\")")
+else()
+ set(_SET_CMAKE_CXX_COMPILER_SYSROOT "")
+endif()
+
if(CMAKE_CXX_COMPILER_ARCHITECTURE_ID)
set(_SET_CMAKE_CXX_COMPILER_ARCHITECTURE_ID
"set(CMAKE_CXX_COMPILER_ARCHITECTURE_ID ${CMAKE_CXX_COMPILER_ARCHITECTURE_ID})")
diff --git a/Modules/CMakeDetermineCompiler.cmake b/Modules/CMakeDetermineCompiler.cmake
index c37adae..7cd7c47 100644
--- a/Modules/CMakeDetermineCompiler.cmake
+++ b/Modules/CMakeDetermineCompiler.cmake
@@ -53,6 +53,20 @@ macro(_cmake_find_compiler lang)
NO_DEFAULT_PATH
DOC "${lang} compiler")
endif()
+ if(CMAKE_HOST_WIN32 AND CMAKE_GENERATOR MATCHES "Ninja")
+ # On Windows command-line builds, the Makefile generators each imply
+ # a preferred compiler tool. The Ninja generator does not imply a
+ # compiler tool, so use the compiler that occurs first in PATH.
+ find_program(CMAKE_${lang}_COMPILER
+ NAMES ${CMAKE_${lang}_COMPILER_LIST}
+ NAMES_PER_DIR
+ DOC "${lang} compiler"
+ NO_PACKAGE_ROOT_PATH
+ NO_CMAKE_PATH
+ NO_CMAKE_ENVIRONMENT_PATH
+ NO_CMAKE_SYSTEM_PATH
+ )
+ endif()
find_program(CMAKE_${lang}_COMPILER NAMES ${CMAKE_${lang}_COMPILER_LIST} DOC "${lang} compiler")
if(CMAKE_${lang}_COMPILER_INIT AND NOT CMAKE_${lang}_COMPILER)
set_property(CACHE CMAKE_${lang}_COMPILER PROPERTY VALUE "${CMAKE_${lang}_COMPILER_INIT}")
@@ -118,3 +132,19 @@ macro(_cmake_find_compiler_path lang)
endif()
endif()
endmacro()
+
+function(_cmake_find_compiler_sysroot lang)
+ if(CMAKE_${lang}_COMPILER_ID STREQUAL "GNU")
+ execute_process(COMMAND "${CMAKE_${lang}_COMPILER}" -print-sysroot
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ OUTPUT_VARIABLE _cmake_sysroot_run_out
+ ERROR_VARIABLE _cmake_sysroot_run_err)
+
+ if(_cmake_sysroot_run_out AND NOT _cmake_sysroot_run_err AND IS_DIRECTORY "${_cmake_sysroot_run_out}/usr")
+ file(TO_CMAKE_PATH "${_cmake_sysroot_run_out}/usr" _cmake_sysroot_run_out_usr)
+ set(CMAKE_${lang}_COMPILER_SYSROOT "${_cmake_sysroot_run_out_usr}" PARENT_SCOPE)
+ else()
+ set(CMAKE_${lang}_COMPILER_SYSROOT "" PARENT_SCOPE)
+ endif()
+ endif()
+endfunction()
diff --git a/Modules/CMakeDetermineCompilerId.cmake b/Modules/CMakeDetermineCompilerId.cmake
index 9eeb7a1..df48fa5 100644
--- a/Modules/CMakeDetermineCompilerId.cmake
+++ b/Modules/CMakeDetermineCompilerId.cmake
@@ -874,6 +874,14 @@ function(CMAKE_DETERMINE_COMPILER_ID_VENDOR lang userflags)
file(MAKE_DIRECTORY ${CMAKE_${lang}_COMPILER_ID_DIR})
endif()
+ # Save the current LC_ALL, LC_MESSAGES, and LANG environment variables
+ # and set them to "C" so we get the expected output to match.
+ set(_orig_lc_all $ENV{LC_ALL})
+ set(_orig_lc_messages $ENV{LC_MESSAGES})
+ set(_orig_lang $ENV{LANG})
+ set(ENV{LC_ALL} C)
+ set(ENV{LC_MESSAGES} C)
+ set(ENV{LANG} C)
foreach(vendor ${CMAKE_${lang}_COMPILER_ID_VENDORS})
set(flags ${CMAKE_${lang}_COMPILER_ID_VENDOR_FLAGS_${vendor}})
@@ -895,6 +903,7 @@ function(CMAKE_DETERMINE_COMPILER_ID_VENDOR lang userflags)
"matched \"${regex}\":\n${output}")
set(CMAKE_${lang}_COMPILER_ID "${vendor}" PARENT_SCOPE)
set(CMAKE_${lang}_COMPILER_ID_OUTPUT "${output}" PARENT_SCOPE)
+ set(CMAKE_${lang}_COMPILER_ID_VENDOR_MATCH "${CMAKE_MATCH_1}" PARENT_SCOPE)
break()
else()
if("${result}" MATCHES "timeout")
@@ -908,6 +917,11 @@ function(CMAKE_DETERMINE_COMPILER_ID_VENDOR lang userflags)
endif()
endif()
endforeach()
+
+ # Restore original LC_ALL, LC_MESSAGES, and LANG
+ set(ENV{LC_ALL} ${_orig_lc_all})
+ set(ENV{LC_MESSAGES} ${_orig_lc_messages})
+ set(ENV{LANG} ${_orig_lang})
endfunction()
function(CMAKE_DETERMINE_MSVC_SHOWINCLUDES_PREFIX lang userflags)
diff --git a/Modules/CMakeDetermineFortranCompiler.cmake b/Modules/CMakeDetermineFortranCompiler.cmake
index e850541..5f5a70a 100644
--- a/Modules/CMakeDetermineFortranCompiler.cmake
+++ b/Modules/CMakeDetermineFortranCompiler.cmake
@@ -186,6 +186,8 @@ if(NOT CMAKE_Fortran_COMPILER_ID_RUN)
include(${CMAKE_ROOT}/Modules/CMakeDetermineCompilerId.cmake)
CMAKE_DETERMINE_COMPILER_ID(Fortran FFLAGS CMakeFortranCompilerId.F)
+ _cmake_find_compiler_sysroot(Fortran)
+
# Fall back to old is-GNU test.
if(NOT CMAKE_Fortran_COMPILER_ID)
execute_process(COMMAND ${CMAKE_Fortran_COMPILER} ${CMAKE_Fortran_COMPILER_ID_FLAGS_LIST} -E "${CMAKE_ROOT}/Modules/CMakeTestGNU.c"
@@ -249,7 +251,7 @@ endif ()
# NAME_WE cannot be used since then this test will fail for names like
# "arm-unknown-nto-qnx6.3.0-gcc.exe", where BASENAME would be
# "arm-unknown-nto-qnx6" instead of the correct "arm-unknown-nto-qnx6.3.0-"
-if (CMAKE_CROSSCOMPILING AND NOT _CMAKE_TOOLCHAIN_PREFIX)
+if (NOT _CMAKE_TOOLCHAIN_PREFIX)
if(CMAKE_Fortran_COMPILER_ID MATCHES "GNU")
get_filename_component(COMPILER_BASENAME "${CMAKE_Fortran_COMPILER}" NAME)
@@ -276,6 +278,14 @@ if(CMAKE_Fortran_XL_CPP)
"set(CMAKE_Fortran_XL_CPP \"${CMAKE_Fortran_XL_CPP}\")")
endif()
+if(CMAKE_Fortran_COMPILER_SYSROOT)
+ string(CONCAT _SET_CMAKE_Fortran_COMPILER_SYSROOT
+ "set(CMAKE_Fortran_COMPILER_SYSROOT \"${CMAKE_Fortran_COMPILER_SYSROOT}\")\n"
+ "set(CMAKE_COMPILER_SYSROOT \"${CMAKE_Fortran_COMPILER_SYSROOT}\")")
+else()
+ set(_SET_CMAKE_Fortran_COMPILER_SYSROOT "")
+endif()
+
if(CMAKE_Fortran_COMPILER_ARCHITECTURE_ID)
set(_SET_CMAKE_Fortran_COMPILER_ARCHITECTURE_ID
"set(CMAKE_Fortran_COMPILER_ARCHITECTURE_ID ${CMAKE_Fortran_COMPILER_ARCHITECTURE_ID})")
diff --git a/Modules/CMakeDetermineOBJCXXCompiler.cmake b/Modules/CMakeDetermineOBJCXXCompiler.cmake
index db874d1..99ad6c3 100644
--- a/Modules/CMakeDetermineOBJCXXCompiler.cmake
+++ b/Modules/CMakeDetermineOBJCXXCompiler.cmake
@@ -148,7 +148,7 @@ endif ()
# "arm-unknown-nto-qnx6" instead of the correct "arm-unknown-nto-qnx6.3.0-"
-if (CMAKE_CROSSCOMPILING AND NOT _CMAKE_TOOLCHAIN_PREFIX)
+if (NOT _CMAKE_TOOLCHAIN_PREFIX)
if("${CMAKE_OBJCXX_COMPILER_ID}" MATCHES "GNU|Clang|QCC")
get_filename_component(COMPILER_BASENAME "${CMAKE_OBJCXX_COMPILER}" NAME)
diff --git a/Modules/CMakeFindBinUtils.cmake b/Modules/CMakeFindBinUtils.cmake
index c23e447..de9ef9a 100644
--- a/Modules/CMakeFindBinUtils.cmake
+++ b/Modules/CMakeFindBinUtils.cmake
@@ -75,6 +75,7 @@ if(("x${CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_SIMULATE_ID}" STREQUAL "xMSVC" AND
endif()
find_program(CMAKE_LINKER NAMES ${_CMAKE_ADDITIONAL_LINKER_NAMES} link HINTS ${_CMAKE_TOOLCHAIN_LOCATION})
+ find_program(CMAKE_AR NAMES lib HINTS ${_CMAKE_TOOLCHAIN_LOCATION})
find_program(CMAKE_MT NAMES mt HINTS ${_CMAKE_TOOLCHAIN_LOCATION})
list(APPEND _CMAKE_TOOL_VARS LINKER MT)
diff --git a/Modules/CMakeFindFrameworks.cmake b/Modules/CMakeFindFrameworks.cmake
index 06c05fb..8906f48 100644
--- a/Modules/CMakeFindFrameworks.cmake
+++ b/Modules/CMakeFindFrameworks.cmake
@@ -17,13 +17,25 @@ if(NOT CMAKE_FIND_FRAMEWORKS_INCLUDED)
macro(CMAKE_FIND_FRAMEWORKS fwk)
set(${fwk}_FRAMEWORKS)
if(APPLE)
- foreach(dir
- ~/Library/Frameworks/${fwk}.framework
- /usr/local/Frameworks/${fwk}.framework
- /Library/Frameworks/${fwk}.framework
- /System/Library/Frameworks/${fwk}.framework
- /Network/Library/Frameworks/${fwk}.framework
- ${CMAKE_FIND_FRAMEWORK_EXTRA_LOCATIONS})
+ file(TO_CMAKE_PATH "$ENV{CMAKE_FRAMEWORK_PATH}" _cmff_CMAKE_FRAMEWORK_PATH)
+ set(_cmff_search_paths
+ ${CMAKE_FRAMEWORK_PATH}
+ ${_cmff_CMAKE_FRAMEWORK_PATH}
+ ~/Library/Frameworks
+ /usr/local/Frameworks
+ /Library/Frameworks
+ /System/Library/Frameworks
+ /Network/Library/Frameworks
+ ${CMAKE_SYSTEM_FRAMEWORK_PATH})
+
+ # For backwards compatibility reasons,
+ # CMAKE_FIND_FRAMEWORK_EXTRA_LOCATIONS includes ${fwk}.framework
+ list(TRANSFORM _cmff_search_paths APPEND /${fwk}.framework)
+ list(APPEND _cmff_search_paths ${CMAKE_FIND_FRAMEWORK_EXTRA_LOCATIONS})
+
+ list(REMOVE_DUPLICATES _cmff_search_paths)
+
+ foreach(dir IN LISTS _cmff_search_paths)
if(EXISTS ${dir})
set(${fwk}_FRAMEWORKS ${${fwk}_FRAMEWORKS} ${dir})
endif()
diff --git a/Modules/CMakeFortranCompiler.cmake.in b/Modules/CMakeFortranCompiler.cmake.in
index 34f44aa..06ee528 100644
--- a/Modules/CMakeFortranCompiler.cmake.in
+++ b/Modules/CMakeFortranCompiler.cmake.in
@@ -8,6 +8,7 @@ set(CMAKE_Fortran_SIMULATE_ID "@CMAKE_Fortran_SIMULATE_ID@")
set(CMAKE_Fortran_SIMULATE_VERSION "@CMAKE_Fortran_SIMULATE_VERSION@")
@_SET_CMAKE_Fortran_XL_CPP@
@_SET_CMAKE_Fortran_COMPILER_ARCHITECTURE_ID@
+@_SET_CMAKE_Fortran_COMPILER_SYSROOT@
@SET_MSVC_Fortran_ARCHITECTURE_ID@
set(CMAKE_AR "@CMAKE_AR@")
set(CMAKE_Fortran_COMPILER_AR "@CMAKE_Fortran_COMPILER_AR@")
diff --git a/Modules/CMakeFortranInformation.cmake b/Modules/CMakeFortranInformation.cmake
index e80716b..9a4ce63 100644
--- a/Modules/CMakeFortranInformation.cmake
+++ b/Modules/CMakeFortranInformation.cmake
@@ -193,7 +193,7 @@ if(NOT DEFINED CMAKE_Fortran_ARCHIVE_CREATE)
set(CMAKE_Fortran_ARCHIVE_CREATE "<CMAKE_AR> qc <TARGET> <LINK_FLAGS> <OBJECTS>")
endif()
if(NOT DEFINED CMAKE_Fortran_ARCHIVE_APPEND)
- set(CMAKE_Fortran_ARCHIVE_APPEND "<CMAKE_AR> q <TARGET> <LINK_FLAGS> <OBJECTS>")
+ set(CMAKE_Fortran_ARCHIVE_APPEND "<CMAKE_AR> q <TARGET> <LINK_FLAGS> <OBJECTS>")
endif()
if(NOT DEFINED CMAKE_Fortran_ARCHIVE_FINISH)
set(CMAKE_Fortran_ARCHIVE_FINISH "<CMAKE_RANLIB> <TARGET>")
@@ -209,7 +209,7 @@ endif()
# link a fortran program
if(NOT CMAKE_Fortran_LINK_EXECUTABLE)
set(CMAKE_Fortran_LINK_EXECUTABLE
- "<CMAKE_Fortran_COMPILER> <CMAKE_Fortran_LINK_FLAGS> <LINK_FLAGS> <FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
+ "<CMAKE_Fortran_COMPILER> <CMAKE_Fortran_LINK_FLAGS> <LINK_FLAGS> <FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
endif()
if(CMAKE_Fortran_STANDARD_LIBRARIES_INIT)
diff --git a/Modules/CMakeGenericSystem.cmake b/Modules/CMakeGenericSystem.cmake
index f539b46..000fba1 100644
--- a/Modules/CMakeGenericSystem.cmake
+++ b/Modules/CMakeGenericSystem.cmake
@@ -50,15 +50,9 @@ if(CMAKE_GENERATOR MATCHES "Make")
if(DEFINED CMAKE_TARGET_MESSAGES)
set_property(GLOBAL PROPERTY TARGET_MESSAGES ${CMAKE_TARGET_MESSAGES})
endif()
- if(CMAKE_GENERATOR MATCHES "Unix Makefiles")
- set(CMAKE_EXPORT_COMPILE_COMMANDS "$ENV{CMAKE_EXPORT_COMPILE_COMMANDS}"
- CACHE BOOL "Enable/Disable output of compile commands during generation."
- )
- mark_as_advanced(CMAKE_EXPORT_COMPILE_COMMANDS)
- endif()
endif()
-if(CMAKE_GENERATOR MATCHES "Ninja")
+if(NOT DEFINED CMAKE_EXPORT_COMPILE_COMMANDS AND CMAKE_GENERATOR MATCHES "Ninja|Unix Makefiles")
set(CMAKE_EXPORT_COMPILE_COMMANDS "$ENV{CMAKE_EXPORT_COMPILE_COMMANDS}"
CACHE BOOL "Enable/Disable output of compile commands during generation."
)
diff --git a/Modules/CMakeOBJCInformation.cmake b/Modules/CMakeOBJCInformation.cmake
index 15a3311..b3da82d 100644
--- a/Modules/CMakeOBJCInformation.cmake
+++ b/Modules/CMakeOBJCInformation.cmake
@@ -161,7 +161,7 @@ if(NOT DEFINED CMAKE_OBJC_ARCHIVE_CREATE)
set(CMAKE_OBJC_ARCHIVE_CREATE "<CMAKE_AR> qc <TARGET> <LINK_FLAGS> <OBJECTS>")
endif()
if(NOT DEFINED CMAKE_OBJC_ARCHIVE_APPEND)
- set(CMAKE_OBJC_ARCHIVE_APPEND "<CMAKE_AR> q <TARGET> <LINK_FLAGS> <OBJECTS>")
+ set(CMAKE_OBJC_ARCHIVE_APPEND "<CMAKE_AR> q <TARGET> <LINK_FLAGS> <OBJECTS>")
endif()
if(NOT DEFINED CMAKE_OBJC_ARCHIVE_FINISH)
set(CMAKE_OBJC_ARCHIVE_FINISH "<CMAKE_RANLIB> <TARGET>")
@@ -170,12 +170,12 @@ endif()
# compile an Objective-C file into an object file
if(NOT CMAKE_OBJC_COMPILE_OBJECT)
set(CMAKE_OBJC_COMPILE_OBJECT
- "<CMAKE_OBJC_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -x objective-c -o <OBJECT> -c <SOURCE>")
+ "<CMAKE_OBJC_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -x objective-c -o <OBJECT> -c <SOURCE>")
endif()
if(NOT CMAKE_OBJC_LINK_EXECUTABLE)
set(CMAKE_OBJC_LINK_EXECUTABLE
- "<CMAKE_OBJC_COMPILER> <FLAGS> <CMAKE_OBJC_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
+ "<CMAKE_OBJC_COMPILER> <FLAGS> <CMAKE_OBJC_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
endif()
if(NOT CMAKE_EXECUTABLE_RUNTIME_OBJC_FLAG)
diff --git a/Modules/CMakeOBJCXXInformation.cmake b/Modules/CMakeOBJCXXInformation.cmake
index cb349d7..71beb7f 100644
--- a/Modules/CMakeOBJCXXInformation.cmake
+++ b/Modules/CMakeOBJCXXInformation.cmake
@@ -254,7 +254,7 @@ if(NOT DEFINED CMAKE_OBJCXX_ARCHIVE_CREATE)
set(CMAKE_OBJCXX_ARCHIVE_CREATE "<CMAKE_AR> qc <TARGET> <LINK_FLAGS> <OBJECTS>")
endif()
if(NOT DEFINED CMAKE_OBJCXX_ARCHIVE_APPEND)
- set(CMAKE_OBJCXX_ARCHIVE_APPEND "<CMAKE_AR> q <TARGET> <LINK_FLAGS> <OBJECTS>")
+ set(CMAKE_OBJCXX_ARCHIVE_APPEND "<CMAKE_AR> q <TARGET> <LINK_FLAGS> <OBJECTS>")
endif()
if(NOT DEFINED CMAKE_OBJCXX_ARCHIVE_FINISH)
set(CMAKE_OBJCXX_ARCHIVE_FINISH "<CMAKE_RANLIB> <TARGET>")
@@ -263,12 +263,12 @@ endif()
# compile an Objective-C++ file into an object file
if(NOT CMAKE_OBJCXX_COMPILE_OBJECT)
set(CMAKE_OBJCXX_COMPILE_OBJECT
- "<CMAKE_OBJCXX_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -x objective-c++ -o <OBJECT> -c <SOURCE>")
+ "<CMAKE_OBJCXX_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -x objective-c++ -o <OBJECT> -c <SOURCE>")
endif()
if(NOT CMAKE_OBJCXX_LINK_EXECUTABLE)
set(CMAKE_OBJCXX_LINK_EXECUTABLE
- "<CMAKE_OBJCXX_COMPILER> <FLAGS> <CMAKE_OBJCXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
+ "<CMAKE_OBJCXX_COMPILER> <FLAGS> <CMAKE_OBJCXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
endif()
mark_as_advanced(
diff --git a/Modules/CMakePrintSystemInformation.cmake b/Modules/CMakePrintSystemInformation.cmake
index 8d5cf5c..d44e933 100644
--- a/Modules/CMakePrintSystemInformation.cmake
+++ b/Modules/CMakePrintSystemInformation.cmake
@@ -11,7 +11,7 @@ This module serves diagnostic purposes. Just include it in a
project to see various internal CMake variables.
#]=======================================================================]
-message("CMAKE_SYSTEM is ${CMAKE_SYSTEM} ${CMAKE_SYSTEM_NAME} ${CMAKE_SYSTEM_VERSION}")
+message("CMAKE_SYSTEM is ${CMAKE_SYSTEM} ${CMAKE_SYSTEM_NAME} ${CMAKE_SYSTEM_VERSION} ${CMAKE_SYSTEM_PROCESSOR}")
message("CMAKE_SYSTEM file is ${CMAKE_SYSTEM_INFO_FILE}")
message("CMAKE_C_COMPILER is ${CMAKE_C_COMPILER}")
message("CMAKE_CXX_COMPILER is ${CMAKE_CXX_COMPILER}")
diff --git a/Modules/CMakeTestCUDACompiler.cmake b/Modules/CMakeTestCUDACompiler.cmake
index 05811a8..b3b62bd 100644
--- a/Modules/CMakeTestCUDACompiler.cmake
+++ b/Modules/CMakeTestCUDACompiler.cmake
@@ -74,20 +74,27 @@ else()
# - cudart_static
# - cudadevrt
#
+ # Additionally on Linux:
+ # - rt
+ # - pthread
+ # - dl
+ #
# These are controlled by CMAKE_CUDA_RUNTIME_LIBRARY
- list(REMOVE_ITEM CMAKE_CUDA_IMPLICIT_LINK_LIBRARIES cudart cudart_static cudadevrt)
- list(REMOVE_ITEM CMAKE_CUDA_HOST_IMPLICIT_LINK_LIBRARIES cudart cudart_static cudadevrt)
+ list(REMOVE_ITEM CMAKE_CUDA_IMPLICIT_LINK_LIBRARIES cudart cudart_static cudadevrt rt pthread dl)
+ list(REMOVE_ITEM CMAKE_CUDA_HOST_IMPLICIT_LINK_LIBRARIES cudart cudart_static cudadevrt rt pthread dl)
- # Remove the CUDA Toolkit include directories from the set of
- # implicit system include directories.
- # This resolves the issue that NVCC doesn't specify these
- # includes as SYSTEM includes when compiling device code, and sometimes
- # they contain headers that generate warnings, so let users mark them
- # as SYSTEM explicitly
- if(CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES)
- list(REMOVE_ITEM CMAKE_CUDA_IMPLICIT_INCLUDE_DIRECTORIES
- ${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES}
- )
+ if(CMAKE_CUDA_COMPILER_ID STREQUAL "NVIDIA")
+ # Remove the CUDA Toolkit include directories from the set of
+ # implicit system include directories.
+ # This resolves the issue that NVCC doesn't specify these
+ # includes as SYSTEM includes when compiling device code, and sometimes
+ # they contain headers that generate warnings, so let users mark them
+ # as SYSTEM explicitly
+ if(CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES)
+ list(REMOVE_ITEM CMAKE_CUDA_IMPLICIT_INCLUDE_DIRECTORIES
+ ${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES}
+ )
+ endif()
endif()
# Re-configure to save learned information.
diff --git a/Modules/CPack.cmake b/Modules/CPack.cmake
index baf7e47..6234b9d 100644
--- a/Modules/CPack.cmake
+++ b/Modules/CPack.cmake
@@ -5,7 +5,7 @@
CPack
-----
-Configure the binary and source package installers.
+Configure generators for binary installers and source packages.
Introduction
^^^^^^^^^^^^
@@ -19,13 +19,17 @@ Depending on the CMake generator, the CPack module may also add two new build
targets, ``package`` and ``package_source``. See the `packaging targets`_
section below for details.
-The generated binary installers contain everything installed via CMake's
-:command:`install` command (and the deprecated commands :command:`install_files`,
-:command:`install_programs`, and :command:`install_targets`).
-For certain kinds of binary installers (including the graphical
-installers on macOS and Windows), CPack generates installers that
-allow users to select individual application components to install.
-See :module:`CPackComponent` module for further details.
+The generated binary installers will contain all files that have been installed
+via CMake's :command:`install` command (and the deprecated commands
+:command:`install_files`, :command:`install_programs`, and
+:command:`install_targets`). Certain kinds of binary installers can be
+configured such that users can select individual application components to
+install. See the :module:`CPackComponent` module for further details.
+
+Source packages (configured through ``CPackSourceConfig.cmake`` and generated
+by the :cpack_gen:`CPack Archive Generator`) will contain all source files in
+the project directory except those specified in
+:variable:`CPACK_SOURCE_IGNORE_FILES`.
CPack Generators
^^^^^^^^^^^^^^^^
@@ -38,10 +42,6 @@ generator. In a :variable:`CPACK_PROJECT_CONFIG_FILE`,
:variable:`CPACK_GENERATOR` is a *string naming a single generator*. If you
need per-cpack-generator logic to control *other* cpack settings, then you
need a :variable:`CPACK_PROJECT_CONFIG_FILE`.
-
-The CMake source tree itself contains a :variable:`CPACK_PROJECT_CONFIG_FILE`.
-See the top level file ``CMakeCPackOptions.cmake.in`` for an example.
-
If set, the :variable:`CPACK_PROJECT_CONFIG_FILE` is included automatically
on a per-generator basis. It only need contain overrides.
diff --git a/Modules/CPackComponent.cmake b/Modules/CPackComponent.cmake
index 211d767..1f8c38c 100644
--- a/Modules/CPackComponent.cmake
+++ b/Modules/CPackComponent.cmake
@@ -5,29 +5,34 @@
CPackComponent
--------------
-Build binary and source package installers
+Configure components for binary installers and source packages.
-Variables concerning CPack Components
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+.. only:: html
-The CPackComponent module is the module which handles the component
-part of CPack. See CPack module for general information about CPack.
+ .. contents::
-For certain kinds of binary installers (including the graphical
-installers on macOS and Windows), CPack generates installers that
-allow users to select individual application components to install.
-The contents of each of the components are identified by the COMPONENT
-argument of CMake's INSTALL command. These components can be
+Introduction
+^^^^^^^^^^^^
+
+This module is automatically included by :module:`CPack`.
+
+Certain binary installers (especially the graphical installers) generated
+by CPack allow users to select individual application *components* to install.
+This module allows developers to configure the packaging of such components.
+
+Contents is assigned to components by the ``COMPONENT``
+argument of CMake's :command:`install` command. Components can be
annotated with user-friendly names and descriptions, inter-component
dependencies, etc., and grouped in various ways to customize the
-resulting installer. See the cpack_add_* commands, described below,
-for more information about component-specific installations.
+resulting installer, using the commands described below.
+
+To specify different groupings for different CPack generators use
+a CPACK_PROJECT_CONFIG_FILE.
-Component-specific installation allows users to select specific sets
-of components to install during the install process. Installation
-components are identified by the COMPONENT argument of CMake's INSTALL
-commands, and should be further described by the following CPack
-commands:
+Variables
+^^^^^^^^^
+
+The following variables influence the component-specific packaging:
.. variable:: CPACK_COMPONENTS_ALL
@@ -61,16 +66,14 @@ commands:
Specify how components are grouped for multi-package component-aware CPack
generators.
- Some generators like RPM or ARCHIVE family (TGZ, ZIP, ...) generates
- several packages files when asked for component packaging. They group
- the component differently depending on the value of this variable:
-
- * ONE_PER_GROUP (default): creates one package file per component group
- * ALL_COMPONENTS_IN_ONE : creates a single package with all (requested) components
- * IGNORE : creates one package per component, i.e. IGNORE component group
+ Some generators like RPM or ARCHIVE (TGZ, ZIP, ...) may generate
+ several packages files when there are components, depending
+ on the value of this variable:
- One can specify different grouping for different CPack generator by
- using a CPACK_PROJECT_CONFIG_FILE.
+ * ONE_PER_GROUP (default): create one package per component group
+ * IGNORE : create one package per component (ignore the groups)
+ * ALL_COMPONENTS_IN_ONE : create a single package with all requested
+ components
.. variable:: CPACK_COMPONENT_<compName>_DISPLAY_NAME
@@ -100,10 +103,15 @@ commands:
True if this component is not selected to be installed by default.
+Commands
+^^^^^^^^
+
+Add component
+"""""""""""""
+
.. command:: cpack_add_component
-Describes a CPack installation
-component named by the COMPONENT argument to a CMake INSTALL command.
+Describe an installation component.
::
@@ -118,13 +126,11 @@ component named by the COMPONENT argument to a CMake INSTALL command.
[ARCHIVE_FILE filename]
[PLIST filename])
-
-
-The cmake_add_component command describes an installation component,
-which the user can opt to install or remove as part of the graphical
-installation process. compname is the name of the component, as
-provided to the COMPONENT argument of one or more CMake INSTALL
-commands.
+``compname`` is the name of an installation component, as defined by the
+``COMPONENT`` argument of one or more CMake :command:`install` commands.
+With the ``cpack_add_component`` command one can set a name, a description,
+and other attributes of an installation component.
+One can also assign a component to a component group.
DISPLAY_NAME is the displayed name of the component, used in graphical
installers to display the component name. This value can be any
@@ -177,6 +183,9 @@ the component. See cpack_configure_downloads for more information.
PLIST gives a filename that is passed to pkgbuild with the
``--component-plist`` argument when using the productbuild generator.
+Add component group
+"""""""""""""""""""
+
.. command:: cpack_add_component_group
Describes a group of related CPack installation components.
@@ -225,6 +234,9 @@ single entry.
BOLD_TITLE indicates that the group title should appear in bold, to
call the user's attention to the group.
+Add installation type
+"""""""""""""""""""""
+
.. command:: cpack_add_install_type
Add a new installation type containing
@@ -249,6 +261,9 @@ DISPLAY_NAME is the displayed name of the install type, which will
typically show up in a drop-down box within a graphical installer.
This value can be any string.
+Configure downloads
+"""""""""""""""""""
+
.. command:: cpack_configure_downloads
Configure CPack to download
@@ -281,8 +296,6 @@ requires the ZipDLL plug-in for NSIS, available at:
http://nsis.sourceforge.net/ZipDLL_plug-in
-
-
On macOS, installers that download components on-the-fly can only
be built and installed on system using macOS 10.5 or later.
diff --git a/Modules/CTestCoverageCollectGCOV.cmake b/Modules/CTestCoverageCollectGCOV.cmake
index ff48cc2..b1268be 100644
--- a/Modules/CTestCoverageCollectGCOV.cmake
+++ b/Modules/CTestCoverageCollectGCOV.cmake
@@ -37,6 +37,17 @@ After generating this tar file, it can be sent to CDash for display with the
upload to CDash. Relative paths will be interpreted with respect
to the top-level build directory.
+ ``TARBALL_COMPRESSION <option>`` Specify a compression algorithm for the
+ ``TARBALL`` data file. Using this option reduces the size of the data file
+ before it is submitted to CDash. ``<option>`` must be one of ``GZIP``,
+ ``BZIP2``, ``XZ``, ``ZSTD``, ``FROM_EXT``, or an expression that CMake
+ evaluates as ``FALSE``. The default value is ``BZIP2``.
+
+ If ``FROM_EXT`` is specified, the resulting file will be compressed based on
+ the file extension of the ``<tarfile>`` (i.e. ``.tar.gz`` will use ``GZIP``
+ compression). File extensions that will produce compressed output include
+ ``.tar.gz``, ``.tgz``, ``.tar.bzip2``, ``.tbz``, ``.tar.xz``, and ``.txz``.
+
``SOURCE <source_dir>``
Specify the top-level source directory for the build.
Default is the value of :variable:`CTEST_SOURCE_DIRECTORY`.
@@ -68,7 +79,7 @@ After generating this tar file, it can be sent to CDash for display with the
function(ctest_coverage_collect_gcov)
set(options QUIET GLOB DELETE)
- set(oneValueArgs TARBALL SOURCE BUILD GCOV_COMMAND)
+ set(oneValueArgs TARBALL SOURCE BUILD GCOV_COMMAND TARBALL_COMPRESSION)
set(multiValueArgs GCOV_OPTIONS)
cmake_parse_arguments(GCOV "${options}" "${oneValueArgs}"
"${multiValueArgs}" "" ${ARGN} )
@@ -91,6 +102,13 @@ function(ctest_coverage_collect_gcov)
else()
set(gcov_command "${GCOV_GCOV_COMMAND}")
endif()
+ if(NOT DEFINED GCOV_TARBALL_COMPRESSION)
+ set(GCOV_TARBALL_COMPRESSION "BZIP2")
+ elseif( GCOV_TARBALL_COMPRESSION AND
+ NOT GCOV_TARBALL_COMPRESSION MATCHES "^(GZIP|BZIP2|XZ|ZSTD|FROM_EXT)$")
+ message(FATAL_ERROR "TARBALL_COMPRESSION must be one of OFF, GZIP, "
+ "BZIP2, XZ, ZSTD, or FROM_EXT for ctest_coverage_collect_gcov")
+ endif()
# run gcov on each gcda file in the binary tree
set(gcda_files)
set(label_files)
@@ -137,11 +155,23 @@ function(ctest_coverage_collect_gcov)
if(NOT DEFINED GCOV_GCOV_OPTIONS)
set(GCOV_GCOV_OPTIONS -b -x)
endif()
+ if (GCOV_QUIET)
+ set(coverage_out_opts
+ OUTPUT_QUIET
+ ERROR_QUIET
+ )
+ else()
+ set(coverage_out_opts
+ OUTPUT_FILE "${coverage_dir}/gcov.log"
+ ERROR_FILE "${coverage_dir}/gcov.log"
+ )
+ endif()
execute_process(COMMAND
${gcov_command} ${GCOV_GCOV_OPTIONS} ${gcda_files}
- OUTPUT_VARIABLE out
RESULT_VARIABLE res
- WORKING_DIRECTORY ${coverage_dir})
+ WORKING_DIRECTORY ${coverage_dir}
+ ${coverage_out_opts}
+ )
if (GCOV_DELETE)
file(REMOVE ${gcda_files})
@@ -149,7 +179,7 @@ function(ctest_coverage_collect_gcov)
if(NOT "${res}" EQUAL 0)
if (NOT GCOV_QUIET)
- message(STATUS "Error running gcov: ${res} ${out}")
+ message(STATUS "Error running gcov: ${res}, see\n ${coverage_dir}/gcov.log")
endif()
endif()
# create json file with project information
@@ -258,14 +288,38 @@ ${label_files}
${uncovered_files_for_tar}
")
- if (GCOV_QUIET)
- set(tar_opts "cfj")
- else()
- set(tar_opts "cvfj")
+ # Prepare tar command line arguments
+
+ set(tar_opts "")
+ # Select data compression mode
+ if( GCOV_TARBALL_COMPRESSION STREQUAL "FROM_EXT")
+ if( GCOV_TARBALL MATCHES [[\.(tgz|tar.gz)$]] )
+ string(APPEND tar_opts "z")
+ elseif( GCOV_TARBALL MATCHES [[\.(txz|tar.xz)$]] )
+ string(APPEND tar_opts "J")
+ elseif( GCOV_TARBALL MATCHES [[\.(tbz|tar.bz)$]] )
+ string(APPEND tar_opts "j")
+ endif()
+ elseif(GCOV_TARBALL_COMPRESSION STREQUAL "GZIP")
+ string(APPEND tar_opts "z")
+ elseif(GCOV_TARBALL_COMPRESSION STREQUAL "XZ")
+ string(APPEND tar_opts "J")
+ elseif(GCOV_TARBALL_COMPRESSION STREQUAL "BZIP2")
+ string(APPEND tar_opts "j")
+ elseif(GCOV_TARBALL_COMPRESSION STREQUAL "ZSTD")
+ set(zstd_tar_opt "--zstd")
+ endif()
+ # Verbosity options
+ if(NOT GCOV_QUIET AND NOT tar_opts MATCHES v)
+ string(APPEND tar_opts "v")
endif()
+ # Prepend option 'c' specifying 'create'
+ string(PREPEND tar_opts "c")
+ # Append option 'f' so that the next argument is the filename
+ string(APPEND tar_opts "f")
execute_process(COMMAND
- ${CMAKE_COMMAND} -E tar ${tar_opts} ${GCOV_TARBALL}
+ ${CMAKE_COMMAND} -E tar ${tar_opts} ${GCOV_TARBALL} ${zstd_tar_opt}
"--mtime=1970-01-01 0:0:0 UTC"
"--format=gnutar"
--files-from=${coverage_dir}/coverage_file_list.txt
diff --git a/Modules/CheckFortranSourceCompiles.cmake b/Modules/CheckFortranSourceCompiles.cmake
index f0fde8d..3354bfb 100644
--- a/Modules/CheckFortranSourceCompiles.cmake
+++ b/Modules/CheckFortranSourceCompiles.cmake
@@ -103,8 +103,6 @@ macro(CHECK_Fortran_SOURCE_COMPILES SOURCE VAR)
if(NOT _SRC_EXT)
set(_SRC_EXT F)
endif()
- set(MACRO_CHECK_FUNCTION_DEFINITIONS
- "-D${VAR} ${CMAKE_REQUIRED_FLAGS}")
if(CMAKE_REQUIRED_LINK_OPTIONS)
set(CHECK_Fortran_SOURCE_COMPILES_ADD_LINK_OPTIONS
LINK_OPTIONS ${CMAKE_REQUIRED_LINK_OPTIONS})
@@ -132,10 +130,10 @@ macro(CHECK_Fortran_SOURCE_COMPILES SOURCE VAR)
try_compile(${VAR}
${CMAKE_BINARY_DIR}
${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.${_SRC_EXT}
- COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}
+ COMPILE_DEFINITIONS -D${VAR} ${CMAKE_REQUIRED_DEFINITIONS}
${CHECK_Fortran_SOURCE_COMPILES_ADD_LINK_OPTIONS}
${CHECK_Fortran_SOURCE_COMPILES_ADD_LIBRARIES}
- CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_FUNCTION_DEFINITIONS}
+ CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${CMAKE_REQUIRED_FLAGS}
"${CHECK_Fortran_SOURCE_COMPILES_ADD_INCLUDES}"
OUTPUT_VARIABLE OUTPUT)
diff --git a/Modules/CheckFortranSourceRuns.cmake b/Modules/CheckFortranSourceRuns.cmake
index a3e5d5d..f858b84 100644
--- a/Modules/CheckFortranSourceRuns.cmake
+++ b/Modules/CheckFortranSourceRuns.cmake
@@ -98,8 +98,6 @@ macro(CHECK_Fortran_SOURCE_RUNS SOURCE VAR)
if(NOT _SRC_EXT)
set(_SRC_EXT F90)
endif()
- set(MACRO_CHECK_FUNCTION_DEFINITIONS
- "-D${VAR} ${CMAKE_REQUIRED_FLAGS}")
if(CMAKE_REQUIRED_LINK_OPTIONS)
set(CHECK_Fortran_SOURCE_COMPILES_ADD_LINK_OPTIONS
LINK_OPTIONS ${CMAKE_REQUIRED_LINK_OPTIONS})
@@ -127,10 +125,10 @@ macro(CHECK_Fortran_SOURCE_RUNS SOURCE VAR)
try_run(${VAR}_EXITCODE ${VAR}_COMPILED
${CMAKE_BINARY_DIR}
${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.${_SRC_EXT}
- COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}
+ COMPILE_DEFINITIONS -D${VAR} ${CMAKE_REQUIRED_DEFINITIONS}
${CHECK_Fortran_SOURCE_COMPILES_ADD_LINK_OPTIONS}
${CHECK_Fortran_SOURCE_COMPILES_ADD_LIBRARIES}
- CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_FUNCTION_DEFINITIONS}
+ CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${CMAKE_REQUIRED_FLAGS}
-DCMAKE_SKIP_RPATH:BOOL=${CMAKE_SKIP_RPATH}
"${CHECK_Fortran_SOURCE_COMPILES_ADD_INCLUDES}"
COMPILE_OUTPUT_VARIABLE OUTPUT
diff --git a/Modules/CheckLanguage.cmake b/Modules/CheckLanguage.cmake
index 1c4e7d3..d67d8d3 100644
--- a/Modules/CheckLanguage.cmake
+++ b/Modules/CheckLanguage.cmake
@@ -47,7 +47,7 @@ macro(check_language lang)
set(extra_compiler_variables "set(CMAKE_CUDA_HOST_COMPILER \\\"\${CMAKE_CUDA_HOST_COMPILER}\\\")")
endif()
- set(content
+ set(_cl_content
"cmake_minimum_required(VERSION ${CMAKE_VERSION})
project(Check${lang} ${lang})
file(WRITE \"\${CMAKE_CURRENT_BINARY_DIR}/result.cmake\"
@@ -57,7 +57,7 @@ file(WRITE \"\${CMAKE_CURRENT_BINARY_DIR}/result.cmake\"
)
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/Check${lang}/CMakeLists.txt"
- "${content}")
+ "${_cl_content}")
if(CMAKE_GENERATOR_INSTANCE)
set(_D_CMAKE_GENERATOR_INSTANCE "-DCMAKE_GENERATOR_INSTANCE:INTERNAL=${CMAKE_GENERATOR_INSTANCE}")
else()
@@ -75,22 +75,22 @@ file(WRITE \"\${CMAKE_CURRENT_BINARY_DIR}/result.cmake\"
-T "${CMAKE_GENERATOR_TOOLSET}"
${_D_CMAKE_GENERATOR_INSTANCE}
${_D_CMAKE_MAKE_PROGRAM}
- OUTPUT_VARIABLE output
- ERROR_VARIABLE output
- RESULT_VARIABLE result
+ OUTPUT_VARIABLE _cl_output
+ ERROR_VARIABLE _cl_output
+ RESULT_VARIABLE _cl_result
)
include(${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/Check${lang}/result.cmake OPTIONAL)
- if(CMAKE_${lang}_COMPILER AND "${result}" STREQUAL "0")
+ if(CMAKE_${lang}_COMPILER AND "${_cl_result}" STREQUAL "0")
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
"${_desc} passed with the following output:\n"
- "${output}\n")
+ "${_cl_output}\n")
set(_CHECK_COMPILER_STATUS CHECK_PASS)
else()
set(CMAKE_${lang}_COMPILER NOTFOUND)
set(_CHECK_COMPILER_STATUS CHECK_FAIL)
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
"${_desc} failed with the following output:\n"
- "${output}\n")
+ "${_cl_output}\n")
endif()
message(${_CHECK_COMPILER_STATUS} "${CMAKE_${lang}_COMPILER}")
set(CMAKE_${lang}_COMPILER "${CMAKE_${lang}_COMPILER}" CACHE FILEPATH "${lang} compiler")
diff --git a/Modules/CheckTypeSize.c.in b/Modules/CheckTypeSize.c.in
index 82035a3..fb93073 100644
--- a/Modules/CheckTypeSize.c.in
+++ b/Modules/CheckTypeSize.c.in
@@ -5,10 +5,14 @@
# define KEY '_','_','i','3','8','6'
#elif defined(__x86_64)
# define KEY '_','_','x','8','6','_','6','4'
-#elif defined(__ppc__)
-# define KEY '_','_','p','p','c','_','_'
+#elif defined(__PPC64__)
+# define KEY '_','_','P','P','C','6','4','_','_'
#elif defined(__ppc64__)
# define KEY '_','_','p','p','c','6','4','_','_'
+#elif defined(__PPC__)
+# define KEY '_','_','P','P','C','_','_'
+#elif defined(__ppc__)
+# define KEY '_','_','p','p','c','_','_'
#elif defined(__aarch64__)
# define KEY '_','_','a','a','r','c','h','6','4','_','_'
#elif defined(__ARM_ARCH_7A__)
diff --git a/Modules/Compiler/Clang-CUDA.cmake b/Modules/Compiler/Clang-CUDA.cmake
new file mode 100644
index 0000000..a970985
--- /dev/null
+++ b/Modules/Compiler/Clang-CUDA.cmake
@@ -0,0 +1,25 @@
+include(Compiler/Clang)
+__compiler_clang(CUDA)
+
+# C++03 isn't supported for CXX, but is for CUDA, so we need to set these manually.
+# Do this before __compiler_clang_cxx_standards() since that adds the feature.
+set(CMAKE_CUDA03_STANDARD_COMPILE_OPTION "-std=c++03")
+set(CMAKE_CUDA03_EXTENSION_COMPILE_OPTION "-std=gnu++03")
+__compiler_clang_cxx_standards(CUDA)
+
+set(CMAKE_CUDA_COMPILER_HAS_DEVICE_LINK_PHASE TRUE)
+set(_CMAKE_COMPILE_AS_CUDA_FLAG "-x cuda")
+set(_CMAKE_CUDA_PTX_FLAG "--cuda-device-only -S")
+
+# RulePlaceholderExpander expands crosscompile variables like sysroot and target only for CMAKE_<LANG>_COMPILER. Override the default.
+set(CMAKE_CUDA_LINK_EXECUTABLE "<CMAKE_CUDA_COMPILER> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>${__IMPLICT_LINKS}")
+set(CMAKE_CUDA_CREATE_SHARED_LIBRARY "<CMAKE_CUDA_COMPILER> <CMAKE_SHARED_LIBRARY_CUDA_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CUDA_FLAGS> <SONAME_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>${__IMPLICT_LINKS}")
+
+set(CMAKE_CUDA_RUNTIME_LIBRARY_DEFAULT "STATIC")
+set(CMAKE_CUDA_RUNTIME_LIBRARY_LINK_OPTIONS_STATIC "cudadevrt;cudart_static")
+set(CMAKE_CUDA_RUNTIME_LIBRARY_LINK_OPTIONS_SHARED "cudadevrt;cudart")
+set(CMAKE_CUDA_RUNTIME_LIBRARY_LINK_OPTIONS_NONE "")
+
+if(UNIX)
+ list(APPEND CMAKE_CUDA_RUNTIME_LIBRARY_LINK_OPTIONS_STATIC "rt" "pthread" "dl")
+endif()
diff --git a/Modules/Compiler/Clang-CXX.cmake b/Modules/Compiler/Clang-CXX.cmake
index cb240f9..789e991 100644
--- a/Modules/Compiler/Clang-CXX.cmake
+++ b/Modules/Compiler/Clang-CXX.cmake
@@ -1,5 +1,6 @@
include(Compiler/Clang)
__compiler_clang(CXX)
+__compiler_clang_cxx_standards(CXX)
if("x${CMAKE_CXX_COMPILER_FRONTEND_VARIANT}" STREQUAL "xGNU")
set(CMAKE_CXX_COMPILE_OPTIONS_VISIBILITY_INLINES_HIDDEN "-fvisibility-inlines-hidden")
@@ -13,121 +14,3 @@ endif()
if("x${CMAKE_CXX_COMPILER_FRONTEND_VARIANT}" STREQUAL "xMSVC")
set(CMAKE_CXX_CLANG_TIDY_DRIVER_MODE "cl")
endif()
-
-if("x${CMAKE_CXX_COMPILER_FRONTEND_VARIANT}" STREQUAL "xGNU")
- if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 2.1)
- set(CMAKE_CXX98_STANDARD_COMPILE_OPTION "-std=c++98")
- set(CMAKE_CXX98_EXTENSION_COMPILE_OPTION "-std=gnu++98")
- endif()
-
- if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.1)
- set(CMAKE_CXX98_STANDARD__HAS_FULL_SUPPORT ON)
- set(CMAKE_CXX11_STANDARD_COMPILE_OPTION "-std=c++11")
- set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION "-std=gnu++11")
- set(CMAKE_CXX11_STANDARD__HAS_FULL_SUPPORT ON)
- elseif(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 2.1)
- set(CMAKE_CXX11_STANDARD_COMPILE_OPTION "-std=c++0x")
- set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION "-std=gnu++0x")
- endif()
-
- if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.5)
- set(CMAKE_CXX14_STANDARD_COMPILE_OPTION "-std=c++14")
- set(CMAKE_CXX14_EXTENSION_COMPILE_OPTION "-std=gnu++14")
- set(CMAKE_CXX14_STANDARD__HAS_FULL_SUPPORT ON)
- elseif(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.4)
- set(CMAKE_CXX14_STANDARD_COMPILE_OPTION "-std=c++1y")
- set(CMAKE_CXX14_EXTENSION_COMPILE_OPTION "-std=gnu++1y")
- set(CMAKE_CXX14_STANDARD__HAS_FULL_SUPPORT ON)
- endif()
-
- set(_clang_version_std17 5.0)
- if(CMAKE_SYSTEM_NAME STREQUAL "Android")
- set(_clang_version_std17 6.0)
- endif()
-
- if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "${_clang_version_std17}")
- set(CMAKE_CXX17_STANDARD_COMPILE_OPTION "-std=c++17")
- set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION "-std=gnu++17")
- elseif (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.5)
- set(CMAKE_CXX17_STANDARD_COMPILE_OPTION "-std=c++1z")
- set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION "-std=gnu++1z")
- endif()
-
- if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "${_clang_version_std17}")
- set(CMAKE_CXX20_STANDARD_COMPILE_OPTION "-std=c++2a")
- set(CMAKE_CXX20_EXTENSION_COMPILE_OPTION "-std=gnu++2a")
- endif()
-
- unset(_clang_version_std17)
-
- if("x${CMAKE_CXX_SIMULATE_ID}" STREQUAL "xMSVC")
- # The MSVC standard library requires C++14, and MSVC itself has no
- # notion of operating in a mode not aware of at least that standard.
- set(CMAKE_CXX98_STANDARD_COMPILE_OPTION "-std=c++14")
- set(CMAKE_CXX98_EXTENSION_COMPILE_OPTION "-std=gnu++14")
- set(CMAKE_CXX11_STANDARD_COMPILE_OPTION "-std=c++14")
- set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION "-std=gnu++14")
-
- # This clang++ is missing some features because of MSVC compatibility.
- unset(CMAKE_CXX11_STANDARD__HAS_FULL_SUPPORT)
- unset(CMAKE_CXX14_STANDARD__HAS_FULL_SUPPORT)
- unset(CMAKE_CXX17_STANDARD__HAS_FULL_SUPPORT)
- unset(CMAKE_CXX20_STANDARD__HAS_FULL_SUPPORT)
- endif()
-
- __compiler_check_default_language_standard(CXX 2.1 98)
-elseif(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 3.9
- AND CMAKE_CXX_SIMULATE_VERSION VERSION_GREATER_EQUAL 19.0)
- # This version of clang-cl and the MSVC version it simulates have
- # support for -std: flags.
- set(CMAKE_CXX98_STANDARD_COMPILE_OPTION "")
- set(CMAKE_CXX98_EXTENSION_COMPILE_OPTION "")
- set(CMAKE_CXX98_STANDARD__HAS_FULL_SUPPORT ON)
- set(CMAKE_CXX11_STANDARD_COMPILE_OPTION "")
- set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION "")
- set(CMAKE_CXX14_STANDARD_COMPILE_OPTION "-std:c++14")
- set(CMAKE_CXX14_EXTENSION_COMPILE_OPTION "-std:c++14")
- if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 6.0)
- set(CMAKE_CXX17_STANDARD_COMPILE_OPTION "-std:c++17")
- set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION "-std:c++17")
- set(CMAKE_CXX20_STANDARD_COMPILE_OPTION "-std:c++latest")
- set(CMAKE_CXX20_EXTENSION_COMPILE_OPTION "-std:c++latest")
- else()
- set(CMAKE_CXX17_STANDARD_COMPILE_OPTION "-std:c++latest")
- set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION "-std:c++latest")
- endif()
-
- __compiler_check_default_language_standard(CXX 3.9 14)
-else()
- # This version of clang-cl, or the MSVC version it simulates, does not have
- # language standards. Set these options as empty strings so the feature
- # test infrastructure can at least check to see if they are defined.
- set(CMAKE_CXX98_STANDARD_COMPILE_OPTION "")
- set(CMAKE_CXX98_EXTENSION_COMPILE_OPTION "")
- set(CMAKE_CXX11_STANDARD_COMPILE_OPTION "")
- set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION "")
- set(CMAKE_CXX14_STANDARD_COMPILE_OPTION "")
- set(CMAKE_CXX14_EXTENSION_COMPILE_OPTION "")
- set(CMAKE_CXX17_STANDARD_COMPILE_OPTION "")
- set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION "")
- set(CMAKE_CXX20_STANDARD_COMPILE_OPTION "")
- set(CMAKE_CXX20_EXTENSION_COMPILE_OPTION "")
-
- # There is no meaningful default for this
- set(CMAKE_CXX_STANDARD_DEFAULT "")
-
- # There are no compiler modes so we only need to test features once.
- # Override the default macro for this special case. Pretend that
- # all language standards are available so that at least compilation
- # can be attempted.
- macro(cmake_record_cxx_compile_features)
- list(APPEND CMAKE_CXX_COMPILE_FEATURES
- cxx_std_98
- cxx_std_11
- cxx_std_14
- cxx_std_17
- cxx_std_20
- )
- _record_compiler_features(CXX "" CMAKE_CXX_COMPILE_FEATURES)
- endmacro()
-endif()
diff --git a/Modules/Compiler/Clang-OBJCXX.cmake b/Modules/Compiler/Clang-OBJCXX.cmake
index b01ce64..453b5fd 100644
--- a/Modules/Compiler/Clang-OBJCXX.cmake
+++ b/Modules/Compiler/Clang-OBJCXX.cmake
@@ -1,70 +1,3 @@
include(Compiler/Clang)
__compiler_clang(OBJCXX)
-
-if("x${CMAKE_OBJCXX_COMPILER_FRONTEND_VARIANT}" STREQUAL "xGNU")
- if(NOT CMAKE_OBJCXX_COMPILER_VERSION VERSION_LESS 2.1)
- set(CMAKE_OBJCXX98_STANDARD_COMPILE_OPTION "-std=c++98")
- set(CMAKE_OBJCXX98_EXTENSION_COMPILE_OPTION "-std=gnu++98")
- endif()
-
- if(NOT CMAKE_OBJCXX_COMPILER_VERSION VERSION_LESS 3.1)
- set(CMAKE_OBJCXX98_STANDARD__HAS_FULL_SUPPORT ON)
- set(CMAKE_OBJCXX11_STANDARD_COMPILE_OPTION "-std=c++11")
- set(CMAKE_OBJCXX11_EXTENSION_COMPILE_OPTION "-std=gnu++11")
- set(CMAKE_OBJCXX11_STANDARD__HAS_FULL_SUPPORT ON)
- elseif(NOT CMAKE_OBJCXX_COMPILER_VERSION VERSION_LESS 2.1)
- set(CMAKE_OBJCXX11_STANDARD_COMPILE_OPTION "-std=c++0x")
- set(CMAKE_OBJCXX11_EXTENSION_COMPILE_OPTION "-std=gnu++0x")
- endif()
-
- if(NOT CMAKE_OBJCXX_COMPILER_VERSION VERSION_LESS 3.5)
- set(CMAKE_OBJCXX14_STANDARD_COMPILE_OPTION "-std=c++14")
- set(CMAKE_OBJCXX14_EXTENSION_COMPILE_OPTION "-std=gnu++14")
- set(CMAKE_OBJCXX14_STANDARD__HAS_FULL_SUPPORT ON)
- elseif(NOT CMAKE_OBJCXX_COMPILER_VERSION VERSION_LESS 3.4)
- set(CMAKE_OBJCXX14_STANDARD_COMPILE_OPTION "-std=c++1y")
- set(CMAKE_OBJCXX14_EXTENSION_COMPILE_OPTION "-std=gnu++1y")
- set(CMAKE_OBJCXX14_STANDARD__HAS_FULL_SUPPORT ON)
- endif()
-
- set(_clang_version_std17 5.0)
-
- if (NOT CMAKE_OBJCXX_COMPILER_VERSION VERSION_LESS "${_clang_version_std17}")
- set(CMAKE_OBJCXX17_STANDARD_COMPILE_OPTION "-std=c++17")
- set(CMAKE_OBJCXX17_EXTENSION_COMPILE_OPTION "-std=gnu++17")
- elseif (NOT CMAKE_OBJCXX_COMPILER_VERSION VERSION_LESS 3.5)
- set(CMAKE_OBJCXX17_STANDARD_COMPILE_OPTION "-std=c++1z")
- set(CMAKE_OBJCXX17_EXTENSION_COMPILE_OPTION "-std=gnu++1z")
- endif()
-
- if (NOT CMAKE_OBJCXX_COMPILER_VERSION VERSION_LESS "${_clang_version_std17}")
- set(CMAKE_OBJCXX20_STANDARD_COMPILE_OPTION "-std=c++2a")
- set(CMAKE_OBJCXX20_EXTENSION_COMPILE_OPTION "-std=gnu++2a")
- endif()
-
- unset(_clang_version_std17)
-
- __compiler_check_default_language_standard(OBJCXX 2.1 98)
-elseif(CMAKE_OBJCXX_COMPILER_VERSION VERSION_GREATER_EQUAL 3.9
- AND CMAKE_OBJCXX_SIMULATE_VERSION VERSION_GREATER_EQUAL 19.0)
- # This version of clang-cl and the MSVC version it simulates have
- # support for -std: flags.
- set(CMAKE_OBJCXX98_STANDARD_COMPILE_OPTION "")
- set(CMAKE_OBJCXX98_EXTENSION_COMPILE_OPTION "")
- set(CMAKE_OBJCXX98_STANDARD__HAS_FULL_SUPPORT ON)
- set(CMAKE_OBJCXX11_STANDARD_COMPILE_OPTION "")
- set(CMAKE_OBJCXX11_EXTENSION_COMPILE_OPTION "")
- set(CMAKE_OBJCXX14_STANDARD_COMPILE_OPTION "-std:c++14")
- set(CMAKE_OBJCXX14_EXTENSION_COMPILE_OPTION "-std:c++14")
- if (CMAKE_OBJCXX_COMPILER_VERSION VERSION_GREATER_EQUAL 6.0)
- set(CMAKE_OBJCXX17_STANDARD_COMPILE_OPTION "-std:c++17")
- set(CMAKE_OBJCXX17_EXTENSION_COMPILE_OPTION "-std:c++17")
- set(CMAKE_OBJCXX20_STANDARD_COMPILE_OPTION "-std:c++latest")
- set(CMAKE_OBJCXX20_EXTENSION_COMPILE_OPTION "-std:c++latest")
- else()
- set(CMAKE_OBJCXX17_STANDARD_COMPILE_OPTION "-std:c++latest")
- set(CMAKE_OBJCXX17_EXTENSION_COMPILE_OPTION "-std:c++latest")
- endif()
-
- __compiler_check_default_language_standard(OBJCXX 3.9 14)
-endif()
+__compiler_clang_cxx_standards(OBJCXX)
diff --git a/Modules/Compiler/Clang.cmake b/Modules/Compiler/Clang.cmake
index f65916f..cd47aa6 100644
--- a/Modules/Compiler/Clang.cmake
+++ b/Modules/Compiler/Clang.cmake
@@ -105,3 +105,123 @@ else()
set(CMAKE_${lang}_COMPILE_OPTIONS_CREATE_PCH -Xclang -emit-pch -Xclang -include -Xclang <PCH_HEADER>)
endmacro()
endif()
+
+macro(__compiler_clang_cxx_standards lang)
+ if("x${CMAKE_${lang}_COMPILER_FRONTEND_VARIANT}" STREQUAL "xGNU")
+ if(NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 2.1)
+ set(CMAKE_${lang}98_STANDARD_COMPILE_OPTION "-std=c++98")
+ set(CMAKE_${lang}98_EXTENSION_COMPILE_OPTION "-std=gnu++98")
+ endif()
+
+ if(NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 3.1)
+ set(CMAKE_${lang}98_STANDARD__HAS_FULL_SUPPORT ON)
+ set(CMAKE_${lang}11_STANDARD_COMPILE_OPTION "-std=c++11")
+ set(CMAKE_${lang}11_EXTENSION_COMPILE_OPTION "-std=gnu++11")
+ set(CMAKE_${lang}11_STANDARD__HAS_FULL_SUPPORT ON)
+ elseif(NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 2.1)
+ set(CMAKE_${lang}11_STANDARD_COMPILE_OPTION "-std=c++0x")
+ set(CMAKE_${lang}11_EXTENSION_COMPILE_OPTION "-std=gnu++0x")
+ endif()
+
+ if(NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 3.5)
+ set(CMAKE_${lang}14_STANDARD_COMPILE_OPTION "-std=c++14")
+ set(CMAKE_${lang}14_EXTENSION_COMPILE_OPTION "-std=gnu++14")
+ set(CMAKE_${lang}14_STANDARD__HAS_FULL_SUPPORT ON)
+ elseif(NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 3.4)
+ set(CMAKE_${lang}14_STANDARD_COMPILE_OPTION "-std=c++1y")
+ set(CMAKE_${lang}14_EXTENSION_COMPILE_OPTION "-std=gnu++1y")
+ set(CMAKE_${lang}14_STANDARD__HAS_FULL_SUPPORT ON)
+ endif()
+
+ set(_clang_version_std17 5.0)
+ if(CMAKE_SYSTEM_NAME STREQUAL "Android")
+ set(_clang_version_std17 6.0)
+ endif()
+
+ if (NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS "${_clang_version_std17}")
+ set(CMAKE_${lang}17_STANDARD_COMPILE_OPTION "-std=c++17")
+ set(CMAKE_${lang}17_EXTENSION_COMPILE_OPTION "-std=gnu++17")
+ elseif (NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 3.5)
+ set(CMAKE_${lang}17_STANDARD_COMPILE_OPTION "-std=c++1z")
+ set(CMAKE_${lang}17_EXTENSION_COMPILE_OPTION "-std=gnu++1z")
+ endif()
+
+ if (NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS "${_clang_version_std17}")
+ set(CMAKE_${lang}20_STANDARD_COMPILE_OPTION "-std=c++2a")
+ set(CMAKE_${lang}20_EXTENSION_COMPILE_OPTION "-std=gnu++2a")
+ endif()
+
+ unset(_clang_version_std17)
+
+ if("x${CMAKE_${lang}_SIMULATE_ID}" STREQUAL "xMSVC")
+ # The MSVC standard library requires C++14, and MSVC itself has no
+ # notion of operating in a mode not aware of at least that standard.
+ set(CMAKE_${lang}98_STANDARD_COMPILE_OPTION "-std=c++14")
+ set(CMAKE_${lang}98_EXTENSION_COMPILE_OPTION "-std=gnu++14")
+ set(CMAKE_${lang}11_STANDARD_COMPILE_OPTION "-std=c++14")
+ set(CMAKE_${lang}11_EXTENSION_COMPILE_OPTION "-std=gnu++14")
+
+ # This clang++ is missing some features because of MSVC compatibility.
+ unset(CMAKE_${lang}11_STANDARD__HAS_FULL_SUPPORT)
+ unset(CMAKE_${lang}14_STANDARD__HAS_FULL_SUPPORT)
+ unset(CMAKE_${lang}17_STANDARD__HAS_FULL_SUPPORT)
+ unset(CMAKE_${lang}20_STANDARD__HAS_FULL_SUPPORT)
+ endif()
+
+ __compiler_check_default_language_standard(${lang} 2.1 98)
+ elseif(CMAKE_${lang}_COMPILER_VERSION VERSION_GREATER_EQUAL 3.9
+ AND CMAKE_${lang}_SIMULATE_VERSION VERSION_GREATER_EQUAL 19.0)
+ # This version of clang-cl and the MSVC version it simulates have
+ # support for -std: flags.
+ set(CMAKE_${lang}98_STANDARD_COMPILE_OPTION "")
+ set(CMAKE_${lang}98_EXTENSION_COMPILE_OPTION "")
+ set(CMAKE_${lang}98_STANDARD__HAS_FULL_SUPPORT ON)
+ set(CMAKE_${lang}11_STANDARD_COMPILE_OPTION "")
+ set(CMAKE_${lang}11_EXTENSION_COMPILE_OPTION "")
+ set(CMAKE_${lang}14_STANDARD_COMPILE_OPTION "-std:c++14")
+ set(CMAKE_${lang}14_EXTENSION_COMPILE_OPTION "-std:c++14")
+ if (CMAKE_${lang}_COMPILER_VERSION VERSION_GREATER_EQUAL 6.0)
+ set(CMAKE_${lang}17_STANDARD_COMPILE_OPTION "-std:c++17")
+ set(CMAKE_${lang}17_EXTENSION_COMPILE_OPTION "-std:c++17")
+ set(CMAKE_${lang}20_STANDARD_COMPILE_OPTION "-std:c++latest")
+ set(CMAKE_${lang}20_EXTENSION_COMPILE_OPTION "-std:c++latest")
+ else()
+ set(CMAKE_${lang}17_STANDARD_COMPILE_OPTION "-std:c++latest")
+ set(CMAKE_${lang}17_EXTENSION_COMPILE_OPTION "-std:c++latest")
+ endif()
+
+ __compiler_check_default_language_standard(${lang} 3.9 14)
+ else()
+ # This version of clang-cl, or the MSVC version it simulates, does not have
+ # language standards. Set these options as empty strings so the feature
+ # test infrastructure can at least check to see if they are defined.
+ set(CMAKE_${lang}98_STANDARD_COMPILE_OPTION "")
+ set(CMAKE_${lang}98_EXTENSION_COMPILE_OPTION "")
+ set(CMAKE_${lang}11_STANDARD_COMPILE_OPTION "")
+ set(CMAKE_${lang}11_EXTENSION_COMPILE_OPTION "")
+ set(CMAKE_${lang}14_STANDARD_COMPILE_OPTION "")
+ set(CMAKE_${lang}14_EXTENSION_COMPILE_OPTION "")
+ set(CMAKE_${lang}17_STANDARD_COMPILE_OPTION "")
+ set(CMAKE_${lang}17_EXTENSION_COMPILE_OPTION "")
+ set(CMAKE_${lang}20_STANDARD_COMPILE_OPTION "")
+ set(CMAKE_${lang}20_EXTENSION_COMPILE_OPTION "")
+
+ # There is no meaningful default for this
+ set(CMAKE_${lang}_STANDARD_DEFAULT "")
+
+ # There are no compiler modes so we only need to test features once.
+ # Override the default macro for this special case. Pretend that
+ # all language standards are available so that at least compilation
+ # can be attempted.
+ macro(cmake_record_${lang}_compile_features)
+ list(APPEND CMAKE_${lang}_COMPILE_FEATURES
+ ${lang}_std_98
+ ${lang}_std_11
+ ${lang}_std_14
+ ${lang}_std_17
+ ${lang}_std_20
+ )
+ _record_compiler_features(${lang} "" CMAKE_${lang}_COMPILE_FEATURES)
+ endmacro()
+ endif()
+endmacro()
diff --git a/Modules/Compiler/GNU-ASM.cmake b/Modules/Compiler/GNU-ASM.cmake
index e07401d..3daa57d 100644
--- a/Modules/Compiler/GNU-ASM.cmake
+++ b/Modules/Compiler/GNU-ASM.cmake
@@ -4,3 +4,9 @@ include(Compiler/GNU)
set(CMAKE_ASM_SOURCE_FILE_EXTENSIONS s;S;asm)
__compiler_gnu(ASM)
+
+if(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_MATCH STREQUAL "GNU assembler")
+ set(CMAKE_DEPFILE_FLAGS_ASM${ASM_DIALECT} "--MD <DEPFILE>")
+ set(CMAKE_ASM${ASM_DIALECT}_LINK_EXECUTABLE
+ "<CMAKE_LINKER> <FLAGS> <CMAKE_ASM${ASM_DIALECT}_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
+endif()
diff --git a/Modules/Compiler/GNU.cmake b/Modules/Compiler/GNU.cmake
index 1c050a2..df6d6b8 100644
--- a/Modules/Compiler/GNU.cmake
+++ b/Modules/Compiler/GNU.cmake
@@ -44,7 +44,8 @@ macro(__compiler_gnu lang)
# tests to always succeed. Work around this by disabling dependency tracking
# in try_compile mode.
get_property(_IN_TC GLOBAL PROPERTY IN_TRY_COMPILE)
- if(NOT _IN_TC OR CMAKE_FORCE_DEPFILES)
+ if(CMAKE_${lang}_COMPILER_ID STREQUAL "GNU" AND _IN_TC AND NOT CMAKE_FORCE_DEPFILES)
+ else()
# distcc does not transform -o to -MT when invoking the preprocessor
# internally, as it ought to. Work around this bug by setting -MT here
# even though it isn't strictly necessary.
@@ -114,6 +115,7 @@ macro(__compiler_gnu lang)
if (NOT CMAKE_GENERATOR MATCHES "Xcode")
set(CMAKE_PCH_PROLOGUE "#pragma GCC system_header")
endif()
- set(CMAKE_${lang}_COMPILE_OPTIONS_USE_PCH -Winvalid-pch -include <PCH_HEADER>)
- set(CMAKE_${lang}_COMPILE_OPTIONS_CREATE_PCH -Winvalid-pch -x ${__pch_header_${lang}} -include <PCH_HEADER>)
+ set(CMAKE_${lang}_COMPILE_OPTIONS_INVALID_PCH -Winvalid-pch)
+ set(CMAKE_${lang}_COMPILE_OPTIONS_USE_PCH -include <PCH_HEADER>)
+ set(CMAKE_${lang}_COMPILE_OPTIONS_CREATE_PCH -x ${__pch_header_${lang}} -include <PCH_HEADER>)
endmacro()
diff --git a/Modules/Compiler/Intel.cmake b/Modules/Compiler/Intel.cmake
index d895ed0..63a20af 100644
--- a/Modules/Compiler/Intel.cmake
+++ b/Modules/Compiler/Intel.cmake
@@ -37,7 +37,8 @@ else()
set(CMAKE_PCH_EXTENSION .pchi)
set(CMAKE_LINK_PCH ON)
set(CMAKE_PCH_EPILOGUE "#pragma hdrstop")
- set(CMAKE_${lang}_COMPILE_OPTIONS_USE_PCH -Winvalid-pch -Wno-pch-messages -pch-use <PCH_FILE> -include <PCH_HEADER>)
- set(CMAKE_${lang}_COMPILE_OPTIONS_CREATE_PCH -Winvalid-pch -Wno-pch-messages -pch-create <PCH_FILE> -include <PCH_HEADER>)
+ set(CMAKE_${lang}_COMPILE_OPTIONS_INVALID_PCH -Winvalid-pch)
+ set(CMAKE_${lang}_COMPILE_OPTIONS_USE_PCH -Wno-pch-messages -pch-use <PCH_FILE> -include <PCH_HEADER>)
+ set(CMAKE_${lang}_COMPILE_OPTIONS_CREATE_PCH -Wno-pch-messages -pch-create <PCH_FILE> -include <PCH_HEADER>)
endmacro()
endif()
diff --git a/Modules/Compiler/NVIDIA-CUDA.cmake b/Modules/Compiler/NVIDIA-CUDA.cmake
index 671468d..87607e2 100644
--- a/Modules/Compiler/NVIDIA-CUDA.cmake
+++ b/Modules/Compiler/NVIDIA-CUDA.cmake
@@ -4,6 +4,9 @@ set(CMAKE_CUDA_COMPILER_HAS_DEVICE_LINK_PHASE True)
set(CMAKE_CUDA_VERBOSE_FLAG "-v")
set(CMAKE_CUDA_VERBOSE_COMPILE_FLAG "-Xcompiler=-v")
+set(_CMAKE_COMPILE_AS_CUDA_FLAG "-x cu")
+set(_CMAKE_CUDA_PTX_FLAG "-ptx")
+
if (CMAKE_CUDA_COMPILER_VERSION VERSION_GREATER_EQUAL 10.2.89)
# The -forward-unknown-to-host-compiler flag was only
# added to nvcc in 10.2 so before that we had no good
@@ -43,10 +46,27 @@ endif()
set(CMAKE_SHARED_LIBRARY_CREATE_CUDA_FLAGS -shared)
set(CMAKE_INCLUDE_SYSTEM_FLAG_CUDA -isystem=)
+if (CMAKE_CUDA_SIMULATE_ID STREQUAL "GNU")
+ set(CMAKE_CUDA_LINKER_WRAPPER_FLAG "-Wl,")
+ set(CMAKE_CUDA_LINKER_WRAPPER_FLAG_SEP ",")
+elseif(CMAKE_CUDA_SIMULATE_ID STREQUAL "Clang")
+ set(CMAKE_CUDA_LINKER_WRAPPER_FLAG "-Xlinker" " ")
+ set(CMAKE_CUDA_LINKER_WRAPPER_FLAG_SEP)
+endif()
+
+set(CMAKE_CUDA_DEVICE_COMPILER_WRAPPER_FLAG "-Xcompiler=")
+set(CMAKE_CUDA_DEVICE_COMPILER_WRAPPER_FLAG_SEP ",")
+set(CMAKE_CUDA_DEVICE_LINKER_WRAPPER_FLAG "-Xlinker=")
+set(CMAKE_CUDA_DEVICE_LINKER_WRAPPER_FLAG_SEP ",")
+
set(CMAKE_CUDA_RUNTIME_LIBRARY_LINK_OPTIONS_STATIC "cudadevrt;cudart_static")
set(CMAKE_CUDA_RUNTIME_LIBRARY_LINK_OPTIONS_SHARED "cudadevrt;cudart")
set(CMAKE_CUDA_RUNTIME_LIBRARY_LINK_OPTIONS_NONE "")
+if(UNIX)
+ list(APPEND CMAKE_CUDA_RUNTIME_LIBRARY_LINK_OPTIONS_STATIC "rt" "pthread" "dl")
+endif()
+
if("x${CMAKE_CUDA_SIMULATE_ID}" STREQUAL "xMSVC")
set(CMAKE_CUDA03_STANDARD_COMPILE_OPTION "")
set(CMAKE_CUDA03_EXTENSION_COMPILE_OPTION "")
diff --git a/Modules/Compiler/NVIDIA-DetermineCompiler.cmake b/Modules/Compiler/NVIDIA-DetermineCompiler.cmake
index bf9111a..4f6ddc2 100644
--- a/Modules/Compiler/NVIDIA-DetermineCompiler.cmake
+++ b/Modules/Compiler/NVIDIA-DetermineCompiler.cmake
@@ -11,9 +11,19 @@ set(_compiler_id_version_compute "
/* _MSC_VER = VVRR */
# define @PREFIX@SIMULATE_VERSION_MAJOR @MACRO_DEC@(_MSC_VER / 100)
# define @PREFIX@SIMULATE_VERSION_MINOR @MACRO_DEC@(_MSC_VER % 100)
+# elif defined(__clang__)
+# define @PREFIX@SIMULATE_VERSION_MAJOR @MACRO_DEC@(__clang_major__)
+# define @PREFIX@SIMULATE_VERSION_MINOR @MACRO_DEC@(__clang_minor__)
+# elif defined(__GNUC__)
+# define @PREFIX@SIMULATE_VERSION_MAJOR @MACRO_DEC@(__GNUC__)
+# define @PREFIX@SIMULATE_VERSION_MINOR @MACRO_DEC@(__GNUC_MINOR__)
# endif")
set(_compiler_id_simulate "
# if defined(_MSC_VER)
# define @PREFIX@SIMULATE_ID \"MSVC\"
+# elif defined(__clang__)
+# define @PREFIX@SIMULATE_ID \"Clang\"
+# elif defined(__GNUC__)
+# define @PREFIX@SIMULATE_ID \"GNU\"
# endif")
diff --git a/Modules/Compiler/OpenWatcom-C.cmake b/Modules/Compiler/OpenWatcom-C.cmake
new file mode 100644
index 0000000..19e3359
--- /dev/null
+++ b/Modules/Compiler/OpenWatcom-C.cmake
@@ -0,0 +1 @@
+include(Compiler/OpenWatcom)
diff --git a/Modules/Compiler/OpenWatcom-CXX.cmake b/Modules/Compiler/OpenWatcom-CXX.cmake
new file mode 100644
index 0000000..19e3359
--- /dev/null
+++ b/Modules/Compiler/OpenWatcom-CXX.cmake
@@ -0,0 +1 @@
+include(Compiler/OpenWatcom)
diff --git a/Modules/Compiler/OpenWatcom.cmake b/Modules/Compiler/OpenWatcom.cmake
new file mode 100644
index 0000000..9efbfc2
--- /dev/null
+++ b/Modules/Compiler/OpenWatcom.cmake
@@ -0,0 +1,118 @@
+# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
+# file Copyright.txt or https://cmake.org/licensing for details.
+
+# This module is shared by multiple languages; use include blocker.
+include_guard()
+
+set(CMAKE_LIBRARY_PATH_FLAG "libpath ")
+set(CMAKE_LINK_LIBRARY_FLAG "library ")
+set(CMAKE_LINK_LIBRARY_FILE_FLAG "library ")
+
+if(CMAKE_VERBOSE_MAKEFILE)
+ set(CMAKE_WCL_QUIET)
+ set(CMAKE_WLINK_QUIET)
+ set(CMAKE_LIB_QUIET)
+else()
+ set(CMAKE_WCL_QUIET "-zq")
+ set(CMAKE_WLINK_QUIET "option quiet")
+ set(CMAKE_LIB_QUIET "-q")
+endif()
+
+foreach(type CREATE_SHARED_LIBRARY CREATE_SHARED_MODULE LINK_EXECUTABLE)
+ set(CMAKE_C_${type}_USE_WATCOM_QUOTE 1)
+ set(CMAKE_CXX_${type}_USE_WATCOM_QUOTE 1)
+endforeach()
+
+foreach(type SHARED MODULE EXE)
+ # linker map file creation directives
+ string(APPEND CMAKE_${type}_LINKER_FLAGS_INIT " opt map")
+ # linker debug directives
+ string(APPEND CMAKE_${type}_LINKER_FLAGS_DEBUG_INIT " debug all")
+ string(APPEND CMAKE_${type}_LINKER_FLAGS_RELWITHDEBINFO_INIT " debug all")
+endforeach()
+
+foreach(lang C CXX)
+ # warning level
+ string(APPEND CMAKE_${lang}_FLAGS_INIT " -w3")
+ # debug options
+ string(APPEND CMAKE_${lang}_FLAGS_DEBUG_INIT " -d2")
+ string(APPEND CMAKE_${lang}_FLAGS_MINSIZEREL_INIT " -s -os -d0 -dNDEBUG")
+ string(APPEND CMAKE_${lang}_FLAGS_RELEASE_INIT " -s -ot -d0 -dNDEBUG")
+ string(APPEND CMAKE_${lang}_FLAGS_RELWITHDEBINFO_INIT " -s -ot -d1 -dNDEBUG")
+endforeach()
+
+# C create import library
+set(CMAKE_C_CREATE_IMPORT_LIBRARY
+ "wlib -c -q -n -b <TARGET_IMPLIB> +<TARGET_QUOTED>")
+# C++ create import library
+set(CMAKE_CXX_CREATE_IMPORT_LIBRARY ${CMAKE_C_CREATE_IMPORT_LIBRARY})
+
+# C link a object files into an executable file
+set(CMAKE_C_LINK_EXECUTABLE
+ "wlink ${CMAKE_WLINK_QUIET} name <TARGET> <LINK_FLAGS> file {<OBJECTS>} <LINK_LIBRARIES>")
+# C++ link a object files into an executable file
+set(CMAKE_CXX_LINK_EXECUTABLE ${CMAKE_C_LINK_EXECUTABLE})
+
+# C compile a file into an object file
+set(CMAKE_C_COMPILE_OBJECT
+ "<CMAKE_C_COMPILER> ${CMAKE_WCL_QUIET} -d+ <DEFINES> <INCLUDES> <FLAGS> -fo<OBJECT> -c -cc <SOURCE>")
+# C++ compile a file into an object file
+set(CMAKE_CXX_COMPILE_OBJECT
+ "<CMAKE_CXX_COMPILER> ${CMAKE_WCL_QUIET} -d+ <DEFINES> <INCLUDES> <FLAGS> -fo<OBJECT> -c -cc++ <SOURCE>")
+
+# C preprocess a source file
+set(CMAKE_C_CREATE_PREPROCESSED_SOURCE
+ "<CMAKE_C_COMPILER> ${CMAKE_WCL_QUIET} -d+ <DEFINES> <INCLUDES> <FLAGS> -fo<PREPROCESSED_SOURCE> -pl -cc <SOURCE>")
+# C++ preprocess a source file
+set(CMAKE_CXX_CREATE_PREPROCESSED_SOURCE
+ "<CMAKE_CXX_COMPILER> ${CMAKE_WCL_QUIET} -d+ <DEFINES> <INCLUDES> <FLAGS> -fo<PREPROCESSED_SOURCE> -pl -cc++ <SOURCE>")
+
+# C create a shared library
+set(CMAKE_C_CREATE_SHARED_LIBRARY
+ "wlink ${CMAKE_WLINK_QUIET} name <TARGET> <LINK_FLAGS> option implib=<TARGET_IMPLIB> file {<OBJECTS>} <LINK_LIBRARIES>")
+# C++ create a shared library
+set(CMAKE_CXX_CREATE_SHARED_LIBRARY ${CMAKE_C_CREATE_SHARED_LIBRARY})
+
+# C create a shared module
+set(CMAKE_C_CREATE_SHARED_MODULE
+ "wlink ${CMAKE_WLINK_QUIET} name <TARGET> <LINK_FLAGS> file {<OBJECTS>} <LINK_LIBRARIES>")
+# C++ create a shared module
+set(CMAKE_CXX_CREATE_SHARED_MODULE ${CMAKE_C_CREATE_SHARED_MODULE})
+
+# C create a static library
+set(CMAKE_C_CREATE_STATIC_LIBRARY
+ "wlib ${CMAKE_LIB_QUIET} -c -n -b <TARGET_QUOTED> <LINK_FLAGS> <OBJECTS> ")
+# C++ create a static library
+set(CMAKE_CXX_CREATE_STATIC_LIBRARY ${CMAKE_C_CREATE_STATIC_LIBRARY})
+
+
+# old CMake internaly used OpenWatcom version macros
+# for backward compatibility
+if(NOT _CMAKE_WATCOM_VERSION)
+ set(_CMAKE_WATCOM_VERSION 1)
+ if(CMAKE_C_COMPILER_VERSION)
+ set(_compiler_version ${CMAKE_C_COMPILER_VERSION})
+ set(_compiler_id ${CMAKE_C_COMPILER_ID})
+ else()
+ set(_compiler_version ${CMAKE_CXX_COMPILER_VERSION})
+ set(_compiler_id ${CMAKE_CXX_COMPILER_ID})
+ endif()
+ set(WATCOM16)
+ set(WATCOM17)
+ set(WATCOM18)
+ set(WATCOM19)
+ if("${_compiler_id}" STREQUAL "OpenWatcom")
+ if("${_compiler_version}" VERSION_LESS 1.7)
+ set(WATCOM16 1)
+ endif()
+ if("${_compiler_version}" VERSION_EQUAL 1.7)
+ set(WATCOM17 1)
+ endif()
+ if("${_compiler_version}" VERSION_EQUAL 1.8)
+ set(WATCOM18 1)
+ endif()
+ if("${_compiler_version}" VERSION_EQUAL 1.9)
+ set(WATCOM19 1)
+ endif()
+ endif()
+endif()
diff --git a/Modules/Compiler/QCC-CXX.cmake b/Modules/Compiler/QCC-CXX.cmake
index 0e7314a..42303f4 100644
--- a/Modules/Compiler/QCC-CXX.cmake
+++ b/Modules/Compiler/QCC-CXX.cmake
@@ -10,6 +10,6 @@ set(CMAKE_CXX_COMPILE_OBJECT
"<CMAKE_CXX_COMPILER> -lang-c++ <DEFINES> <INCLUDES> <FLAGS> -o <OBJECT> -c <SOURCE>")
set(CMAKE_CXX_LINK_EXECUTABLE
- "<CMAKE_CXX_COMPILER> -lang-c++ <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
+ "<CMAKE_CXX_COMPILER> -lang-c++ <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
set(CMAKE_CXX_COMPILE_OPTIONS_VISIBILITY_INLINES_HIDDEN "-fvisibility-inlines-hidden")
diff --git a/Modules/Compiler/TI-C.cmake b/Modules/Compiler/TI-C.cmake
index 1c0f4bc..b060ee9 100644
--- a/Modules/Compiler/TI-C.cmake
+++ b/Modules/Compiler/TI-C.cmake
@@ -14,5 +14,9 @@ set(CMAKE_C_CREATE_ASSEMBLY_SOURCE "<CMAKE_C_COMPILER> --compile_only --skip_ass
set(CMAKE_C_CREATE_PREPROCESSED_SOURCE "<CMAKE_C_COMPILER> --preproc_only --c_file=<SOURCE> <DEFINES> <INCLUDES> <FLAGS> --output_file=<PREPROCESSED_SOURCE>")
set(CMAKE_C_COMPILE_OBJECT "<CMAKE_C_COMPILER> --compile_only --c_file=<SOURCE> <DEFINES> <INCLUDES> <FLAGS> --output_file=<OBJECT>")
-set(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> -r <TARGET> <OBJECTS>")
-set(CMAKE_C_LINK_EXECUTABLE "<CMAKE_C_COMPILER> --run_linker --output_file=<TARGET> --map_file=<TARGET>.map <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> <LINK_LIBRARIES>")
+set(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> qr <TARGET> <OBJECTS>")
+set(CMAKE_C_ARCHIVE_APPEND "<CMAKE_AR> qa <TARGET> <OBJECTS>")
+set(CMAKE_C_LINK_EXECUTABLE "<CMAKE_C_COMPILER> --run_linker --output_file=<TARGET> --map_file=<TARGET_NAME>.map <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> <LINK_LIBRARIES>")
+set(CMAKE_ASM_RESPONSE_FILE_FLAG "--cmd_file=")
+set(CMAKE_C_RESPONSE_FILE_FLAG "--cmd_file=")
+set(CMAKE_C_RESPONSE_FILE_LINK_FLAG " ")
diff --git a/Modules/Compiler/TI-CXX.cmake b/Modules/Compiler/TI-CXX.cmake
index 4c6af06..7836543 100644
--- a/Modules/Compiler/TI-CXX.cmake
+++ b/Modules/Compiler/TI-CXX.cmake
@@ -8,5 +8,8 @@ set(CMAKE_CXX_CREATE_ASSEMBLY_SOURCE "<CMAKE_CXX_COMPILER> --compile_only --skip
set(CMAKE_CXX_CREATE_PREPROCESSED_SOURCE "<CMAKE_CXX_COMPILER> --preproc_only --cpp_file=<SOURCE> <DEFINES> <INCLUDES> <FLAGS> --output_file=<PREPROCESSED_SOURCE>")
set(CMAKE_CXX_COMPILE_OBJECT "<CMAKE_CXX_COMPILER> --compile_only --cpp_file=<SOURCE> <DEFINES> <INCLUDES> <FLAGS> --output_file=<OBJECT>")
-set(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> -r <TARGET> <OBJECTS>")
-set(CMAKE_CXX_LINK_EXECUTABLE "<CMAKE_CXX_COMPILER> --run_linker --output_file=<TARGET> --map_file=<TARGET>.map <CMAKE_CXX_LINK_FLAGS> <LINK_LIBRARIES> <LINK_FLAGS> <OBJECTS>")
+set(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> qr <TARGET> <OBJECTS>")
+set(CMAKE_CXX_ARCHIVE_APPEND "<CMAKE_AR> qa <TARGET> <OBJECTS>")
+set(CMAKE_CXX_LINK_EXECUTABLE "<CMAKE_CXX_COMPILER> --run_linker --output_file=<TARGET> --map_file=<TARGET_NAME>.map <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> <LINK_LIBRARIES>")
+set(CMAKE_CXX_RESPONSE_FILE_FLAG "--cmd_file=")
+set(CMAKE_CXX_RESPONSE_FILE_LINK_FLAG " ")
diff --git a/Modules/Compiler/XL-Fortran.cmake b/Modules/Compiler/XL-Fortran.cmake
index 1683dff..e01ec8e 100644
--- a/Modules/Compiler/XL-Fortran.cmake
+++ b/Modules/Compiler/XL-Fortran.cmake
@@ -8,6 +8,7 @@ set(CMAKE_Fortran_FORMAT_FIXED_FLAG "-qfixed") # [=<right_margin>]
set(CMAKE_Fortran_FORMAT_FREE_FLAG "-qfree") # [=f90|ibm]
set(CMAKE_Fortran_MODDIR_FLAG "-qmoddir=")
+set(CMAKE_Fortran_MODDIR_INCLUDE_FLAG "-I") # -qmoddir= does not affect search path
set(CMAKE_Fortran_DEFINE_FLAG "-WF,-D")
diff --git a/Modules/Documentation.cmake b/Modules/Documentation.cmake
index aaf24f6..c297231 100644
--- a/Modules/Documentation.cmake
+++ b/Modules/Documentation.cmake
@@ -9,6 +9,30 @@ This module provides support for the VTK documentation framework. It
relies on several tools (Doxygen, Perl, etc).
#]=======================================================================]
+cmake_policy(GET CMP0106 _Documentation_policy)
+
+if (_Documentation_policy STREQUAL "NEW")
+ message(FATAL_ERROR
+ "Documentation.cmake is VTK-specific code and should not be used in "
+ "non-VTK projects. This logic in this module is best shipped with the "
+ "project using it rather than with CMake. This is now an error according "
+ "to policy CMP0106.")
+else ()
+
+if (_Documentation_policy STREQUAL "")
+ # Ignore the warning if the project is detected as VTK itself.
+ if (NOT CMAKE_PROJECT_NAME STREQUAL "VTK" AND
+ NOT PROJECT_NAME STREQUAL "VTK")
+ cmake_policy(GET_WARNING CMP0106 _Documentation_policy_warning)
+ message(AUTHOR_WARNING
+ "${_Documentation_policy_warning}\n"
+ "Documentation.cmake is VTK-specific code and should not be used in "
+ "non-VTK projects. This logic in this module is best shipped with the "
+ "project using it rather than with CMake.")
+ endif ()
+ unset(_Documentation_policy_warning)
+endif ()
+
#
# Build the documentation ?
#
@@ -44,3 +68,7 @@ if (BUILD_DOCUMENTATION)
#
endif ()
+
+endif ()
+
+unset(_Documentation_policy)
diff --git a/Modules/ExternalProject.cmake b/Modules/ExternalProject.cmake
index 12a91b3..f9f7a4f 100644
--- a/Modules/ExternalProject.cmake
+++ b/Modules/ExternalProject.cmake
@@ -9,8 +9,11 @@ ExternalProject
.. contents::
+Commands
+^^^^^^^^
+
External Project Definition
-^^^^^^^^^^^^^^^^^^^^^^^^^^^
+"""""""""""""""""""""""""""
.. command:: ExternalProject_Add
@@ -665,7 +668,7 @@ External Project Definition
automatic substitutions that are supported for some options.
Obtaining Project Properties
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+""""""""""""""""""""""""""""
.. command:: ExternalProject_Get_Property
@@ -686,7 +689,7 @@ Obtaining Project Properties
message("Source dir of myExtProj = ${SOURCE_DIR}")
Explicit Step Management
-^^^^^^^^^^^^^^^^^^^^^^^^
+""""""""""""""""""""""""
The ``ExternalProject_Add()`` function on its own is often sufficient for
incorporating an external project into the main build. Certain scenarios
@@ -2279,7 +2282,7 @@ function(ExternalProject_Add_StepDependencies name step)
get_property(steps TARGET ${name} PROPERTY _EP_STEPS)
list(FIND steps ${step} is_step)
- if(NOT is_step)
+ if(is_step LESS 0)
message(FATAL_ERROR "External project \"${name}\" does not have a step \"${step}\".")
endif()
@@ -2697,6 +2700,15 @@ function(_ep_add_download_command name)
)
endfunction()
+function(_ep_get_update_disconnected var name)
+ get_property(update_disconnected_set TARGET ${name} PROPERTY _EP_UPDATE_DISCONNECTED SET)
+ if(update_disconnected_set)
+ get_property(update_disconnected TARGET ${name} PROPERTY _EP_UPDATE_DISCONNECTED)
+ else()
+ get_property(update_disconnected DIRECTORY PROPERTY EP_UPDATE_DISCONNECTED)
+ endif()
+ set(${var} "${update_disconnected}" PARENT_SCOPE)
+endfunction()
function(_ep_add_update_command name)
ExternalProject_Get_Property(${name} source_dir tmp_dir)
@@ -2707,12 +2719,8 @@ function(_ep_add_update_command name)
get_property(svn_repository TARGET ${name} PROPERTY _EP_SVN_REPOSITORY)
get_property(git_repository TARGET ${name} PROPERTY _EP_GIT_REPOSITORY)
get_property(hg_repository TARGET ${name} PROPERTY _EP_HG_REPOSITORY )
- get_property(update_disconnected_set TARGET ${name} PROPERTY _EP_UPDATE_DISCONNECTED SET)
- if(update_disconnected_set)
- get_property(update_disconnected TARGET ${name} PROPERTY _EP_UPDATE_DISCONNECTED)
- else()
- get_property(update_disconnected DIRECTORY PROPERTY EP_UPDATE_DISCONNECTED)
- endif()
+
+ _ep_get_update_disconnected(update_disconnected ${name})
set(work_dir)
set(comment)
@@ -2874,10 +2882,17 @@ function(_ep_add_patch_command name)
set(log "")
endif()
+ _ep_get_update_disconnected(update_disconnected ${name})
+ if(update_disconnected)
+ set(update_dep skip-update)
+ else()
+ set(update_dep update)
+ endif()
+
ExternalProject_Add_Step(${name} patch
COMMAND ${cmd}
WORKING_DIRECTORY ${work_dir}
- DEPENDEES download
+ DEPENDEES download ${update_dep}
${log}
)
endfunction()
@@ -3032,12 +3047,7 @@ function(_ep_add_configure_command name)
set(uses_terminal "")
endif()
- get_property(update_disconnected_set TARGET ${name} PROPERTY _EP_UPDATE_DISCONNECTED SET)
- if(update_disconnected_set)
- get_property(update_disconnected TARGET ${name} PROPERTY _EP_UPDATE_DISCONNECTED)
- else()
- get_property(update_disconnected DIRECTORY PROPERTY EP_UPDATE_DISCONNECTED)
- endif()
+ _ep_get_update_disconnected(update_disconnected ${name})
if(update_disconnected)
set(update_dep skip-update)
else()
diff --git a/Modules/FetchContent.cmake b/Modules/FetchContent.cmake
index f3e1b51..45b50d4 100644
--- a/Modules/FetchContent.cmake
+++ b/Modules/FetchContent.cmake
@@ -76,8 +76,11 @@ sometimes useful as part of implementing some higher level feature or to
populate some content in CMake's script mode.
+Commands
+^^^^^^^^
+
Declaring Content Details
-^^^^^^^^^^^^^^^^^^^^^^^^^
+"""""""""""""""""""""""""
.. command:: FetchContent_Declare
@@ -105,9 +108,13 @@ Declaring Content Details
The ``<contentOptions>`` can be any of the download or update/patch options
that the :command:`ExternalProject_Add` command understands. The configure,
build, install and test steps are explicitly disabled and therefore options
- related to them will be ignored. In most cases, ``<contentOptions>`` will
- just be a couple of options defining the download method and method-specific
- details like a commit tag or archive hash. For example:
+ related to them will be ignored. The ``SOURCE_SUBDIR`` option is an
+ exception, see :command:`FetchContent_MakeAvailable` for details on how that
+ affects behavior.
+
+ In most cases, ``<contentOptions>`` will just be a couple of options defining
+ the download method and method-specific details like a commit tag or archive
+ hash. For example:
.. code-block:: cmake
@@ -130,7 +137,7 @@ Declaring Content Details
)
Populating The Content
-^^^^^^^^^^^^^^^^^^^^^^
+""""""""""""""""""""""
For most common scenarios, population means making content available to the
main build according to previously declared details for that dependency.
@@ -161,8 +168,9 @@ approach. The former generally follows this canonical pattern:
The above is such a common pattern that, where no custom steps are needed
between the calls to :command:`FetchContent_Populate` and
:command:`add_subdirectory`, equivalent logic can be obtained by calling
-:command:`FetchContent_MakeAvailable` instead (and should be preferred where
-it meets the needs of the project).
+:command:`FetchContent_MakeAvailable` instead. Where it meets the needs of
+the project, :command:`FetchContent_MakeAvailable` should be preferred, as it
+is simpler and provides additional features over the pattern above.
.. command:: FetchContent_Populate
@@ -332,6 +340,8 @@ it meets the needs of the project).
``${CMAKE_CURRENT_BINARY_DIR}/<lcName>-subbuild`` and it would be unusual
to need to override this default. If a relative path is specified, it will
be interpreted as relative to :variable:`CMAKE_CURRENT_BINARY_DIR`.
+ This option should not be confused with the ``SOURCE_SUBDIR`` option which
+ only affects the :command:`FetchContent_MakeAvailable` command.
``SOURCE_DIR``, ``BINARY_DIR``
The ``SOURCE_DIR`` and ``BINARY_DIR`` arguments are supported by
@@ -406,15 +416,22 @@ it meets the needs of the project).
This command implements the common pattern typically needed for most
dependencies. It iterates over each of the named dependencies in turn
- and for each one it loosely follows the same
+ and for each one it loosely follows the
:ref:`canonical pattern <fetch-content-canonical-pattern>` as
- presented at the beginning of this section. One small difference to
- that pattern is that it will only call :command:`add_subdirectory` on the
+ presented at the beginning of this section. An important difference is
+ that :command:`add_subdirectory` will only be called on the
populated content if there is a ``CMakeLists.txt`` file in its top level
source directory. This allows the command to be used for dependencies
that make downloaded content available at a known location but which do
not need or support being added directly to the build.
+ The ``SOURCE_SUBDIR`` option can be given in the declared details to
+ instruct ``FetchContent_MakeAvailable()`` to look for a ``CMakeLists.txt``
+ file in a subdirectory below the top level (i.e. the same way that
+ ``SOURCE_SUBDIR`` is used by the :command:`ExternalProject_Add` command).
+ ``SOURCE_SUBDIR`` must always be a relative path. See the next section
+ for an example of this option.
+
.. _`fetch-content-examples`:
@@ -442,6 +459,23 @@ frameworks are available to the main build:
# Catch2 will be defined and available to the rest of the build
FetchContent_MakeAvailable(googletest Catch2)
+If the sub-project's ``CMakeLists.txt`` file is not at the top level of its
+source tree, the ``SOURCE_SUBDIR`` option can be used to tell ``FetchContent``
+where to find it. The following example shows how to use that option and
+it also sets a variable which is meaningful to the subproject before pulling
+it into the main build:
+
+.. code-block:: cmake
+
+ include(FetchContent)
+ FetchContent_Declare(
+ protobuf
+ GIT_REPOSITORY https://github.com/protocolbuffers/protobuf.git
+ GIT_TAG v3.12.0
+ SOURCE_SUBDIR cmake
+ )
+ set(protobuf_BUILD_TESTS OFF)
+ FetchContent_MakeAvailable(protobuf)
In more complex project hierarchies, the dependency relationships can be more
complicated. Consider a hierarchy where ``projA`` is the top level project and
@@ -793,6 +827,8 @@ function(__FetchContent_directPopulate contentName)
SUBBUILD_DIR
SOURCE_DIR
BINARY_DIR
+ # We need special processing if DOWNLOAD_NO_EXTRACT is true
+ DOWNLOAD_NO_EXTRACT
# Prevent the following from being passed through
CONFIGURE_COMMAND
BUILD_COMMAND
@@ -843,6 +879,26 @@ function(__FetchContent_directPopulate contentName)
set(ARG_EXTRA "${ARG_EXTRA} \"${arg}\"")
endforeach()
+ if(ARG_DOWNLOAD_NO_EXTRACT)
+ set(ARG_EXTRA "${ARG_EXTRA} DOWNLOAD_NO_EXTRACT YES")
+ set(__FETCHCONTENT_COPY_FILE
+"
+ExternalProject_Get_Property(${contentName}-populate DOWNLOADED_FILE)
+get_filename_component(dlFileName \"\${DOWNLOADED_FILE}\" NAME)
+
+ExternalProject_Add_Step(${contentName}-populate copyfile
+ COMMAND \"${CMAKE_COMMAND}\" -E copy_if_different
+ \"<DOWNLOADED_FILE>\" \"${ARG_SOURCE_DIR}\"
+ DEPENDEES patch
+ DEPENDERS configure
+ BYPRODUCTS \"${ARG_SOURCE_DIR}/\${dlFileName}\"
+ COMMENT \"Copying file to SOURCE_DIR\"
+)
+")
+ else()
+ unset(__FETCHCONTENT_COPY_FILE)
+ endif()
+
# Hide output if requested, but save it to a variable in case there's an
# error so we can show the output upon failure. When not quiet, don't
# capture the output to a variable because the user may want to see the
@@ -1047,11 +1103,26 @@ macro(FetchContent_MakeAvailable)
# can be treated that way. Protecting the call with the check
# allows this function to be used for projects that just want
# to ensure the content exists, such as to provide content at
- # a known location.
- if(EXISTS ${${contentNameLower}_SOURCE_DIR}/CMakeLists.txt)
- add_subdirectory(${${contentNameLower}_SOURCE_DIR}
- ${${contentNameLower}_BINARY_DIR})
+ # a known location. We check the saved details for an optional
+ # SOURCE_SUBDIR which can be used in the same way as its meaning
+ # for ExternalProject. It won't matter if it was passed through
+ # to the ExternalProject sub-build, since it would have been
+ # ignored there.
+ set(__fc_srcdir "${${contentNameLower}_SOURCE_DIR}")
+ __FetchContent_getSavedDetails(${contentName} contentDetails)
+ if("${contentDetails}" STREQUAL "")
+ message(FATAL_ERROR "No details have been set for content: ${contentName}")
endif()
+ cmake_parse_arguments(__fc_arg "" "SOURCE_SUBDIR" "" ${contentDetails})
+ if(NOT "${__fc_arg_SOURCE_SUBDIR}" STREQUAL "")
+ string(APPEND __fc_srcdir "/${__fc_arg_SOURCE_SUBDIR}")
+ endif()
+
+ if(EXISTS ${__fc_srcdir}/CMakeLists.txt)
+ add_subdirectory(${__fc_srcdir} ${${contentNameLower}_BINARY_DIR})
+ endif()
+
+ unset(__fc_srcdir)
endif()
endforeach()
diff --git a/Modules/FetchContent/CMakeLists.cmake.in b/Modules/FetchContent/CMakeLists.cmake.in
index 0095b11..45e4df0 100644
--- a/Modules/FetchContent/CMakeLists.cmake.in
+++ b/Modules/FetchContent/CMakeLists.cmake.in
@@ -21,3 +21,5 @@ ExternalProject_Add(${contentName}-populate
USES_TERMINAL_DOWNLOAD YES
USES_TERMINAL_UPDATE YES
)
+
+@__FETCHCONTENT_COPY_FILE@
diff --git a/Modules/FindArmadillo.cmake b/Modules/FindArmadillo.cmake
index c4e55ce..243b9e0 100644
--- a/Modules/FindArmadillo.cmake
+++ b/Modules/FindArmadillo.cmake
@@ -6,7 +6,7 @@ FindArmadillo
-------------
Find the Armadillo C++ library.
-Armadillo is library for linear algebra & scientific computing.
+Armadillo is a library for linear algebra & scientific computing.
Using Armadillo:
@@ -31,19 +31,13 @@ This module sets the following variables:
ARMADILLO_VERSION_NAME - name of the version (ex: "Antipodean Antileech")
#]=======================================================================]
-# UNIX paths are standard, no need to write.
-find_library(ARMADILLO_LIBRARY
- NAMES armadillo
- PATHS "$ENV{ProgramFiles}/Armadillo/lib" "$ENV{ProgramFiles}/Armadillo/lib64" "$ENV{ProgramFiles}/Armadillo"
- )
find_path(ARMADILLO_INCLUDE_DIR
NAMES armadillo
PATHS "$ENV{ProgramFiles}/Armadillo/include"
)
-
+mark_as_advanced(ARMADILLO_INCLUDE_DIR)
if(ARMADILLO_INCLUDE_DIR)
-
# ------------------------------------------------------------------------
# Extract version information from <armadillo>
# ------------------------------------------------------------------------
@@ -59,32 +53,79 @@ if(ARMADILLO_INCLUDE_DIR)
if(EXISTS "${ARMADILLO_INCLUDE_DIR}/armadillo_bits/arma_version.hpp")
# Read and parse armdillo version header file for version number
- file(STRINGS "${ARMADILLO_INCLUDE_DIR}/armadillo_bits/arma_version.hpp" _armadillo_HEADER_CONTENTS REGEX "#define ARMA_VERSION_[A-Z]+ ")
- string(REGEX REPLACE ".*#define ARMA_VERSION_MAJOR ([0-9]+).*" "\\1" ARMADILLO_VERSION_MAJOR "${_armadillo_HEADER_CONTENTS}")
- string(REGEX REPLACE ".*#define ARMA_VERSION_MINOR ([0-9]+).*" "\\1" ARMADILLO_VERSION_MINOR "${_armadillo_HEADER_CONTENTS}")
- string(REGEX REPLACE ".*#define ARMA_VERSION_PATCH ([0-9]+).*" "\\1" ARMADILLO_VERSION_PATCH "${_armadillo_HEADER_CONTENTS}")
+ file(STRINGS "${ARMADILLO_INCLUDE_DIR}/armadillo_bits/arma_version.hpp" _ARMA_HEADER_CONTENTS REGEX "#define ARMA_VERSION_[A-Z]+ ")
+ string(REGEX REPLACE ".*#define ARMA_VERSION_MAJOR ([0-9]+).*" "\\1" ARMADILLO_VERSION_MAJOR "${_ARMA_HEADER_CONTENTS}")
+ string(REGEX REPLACE ".*#define ARMA_VERSION_MINOR ([0-9]+).*" "\\1" ARMADILLO_VERSION_MINOR "${_ARMA_HEADER_CONTENTS}")
+ string(REGEX REPLACE ".*#define ARMA_VERSION_PATCH ([0-9]+).*" "\\1" ARMADILLO_VERSION_PATCH "${_ARMA_HEADER_CONTENTS}")
# WARNING: The number of spaces before the version name is not one.
- string(REGEX REPLACE ".*#define ARMA_VERSION_NAME +\"([0-9a-zA-Z _-]+)\".*" "\\1" ARMADILLO_VERSION_NAME "${_armadillo_HEADER_CONTENTS}")
+ string(REGEX REPLACE ".*#define ARMA_VERSION_NAME\ +\"([0-9a-zA-Z\ _-]+)\".*" "\\1" ARMADILLO_VERSION_NAME "${_ARMA_HEADER_CONTENTS}")
- unset(_armadillo_HEADER_CONTENTS)
endif()
set(ARMADILLO_VERSION_STRING "${ARMADILLO_VERSION_MAJOR}.${ARMADILLO_VERSION_MINOR}.${ARMADILLO_VERSION_PATCH}")
endif ()
+if(EXISTS "${ARMADILLO_INCLUDE_DIR}/armadillo_bits/config.hpp")
+ file(STRINGS "${ARMADILLO_INCLUDE_DIR}/armadillo_bits/config.hpp" _ARMA_CONFIG_CONTENTS REGEX "^#define ARMA_USE_[A-Z]+")
+ string(REGEX MATCH "ARMA_USE_WRAPPER" _ARMA_USE_WRAPPER "${_ARMA_CONFIG_CONTENTS}")
+ string(REGEX MATCH "ARMA_USE_LAPACK" _ARMA_USE_LAPACK "${_ARMA_CONFIG_CONTENTS}")
+ string(REGEX MATCH "ARMA_USE_BLAS" _ARMA_USE_BLAS "${_ARMA_CONFIG_CONTENTS}")
+ string(REGEX MATCH "ARMA_USE_ARPACK" _ARMA_USE_ARPACK "${_ARMA_CONFIG_CONTENTS}")
+ string(REGEX MATCH "ARMA_USE_HDF5" _ARMA_USE_HDF5 "${_ARMA_CONFIG_CONTENTS}")
+endif()
+
include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
+
+# If _ARMA_USE_WRAPPER is set, then we just link to armadillo, but if it's not then we need support libraries instead
+set(_ARMA_SUPPORT_LIBRARIES)
+
+if(_ARMA_USE_WRAPPER)
+ # Link to the armadillo wrapper library.
+ find_library(ARMADILLO_LIBRARY
+ NAMES armadillo
+ PATHS
+ "$ENV{ProgramFiles}/Armadillo/lib"
+ "$ENV{ProgramFiles}/Armadillo/lib64"
+ "$ENV{ProgramFiles}/Armadillo"
+ )
+ mark_as_advanced(ARMADILLO_LIBRARY)
+ set(_ARMA_REQUIRED_VARS ARMADILLO_LIBRARY)
+else()
+ # Link directly to individual components.
+ set(ARMADILLO_LIBRARY "")
+ foreach(pkg
+ LAPACK
+ BLAS
+ ARPACK
+ HDF5
+ )
+ if(_ARMA_USE_${pkg})
+ find_package(${pkg} QUIET)
+ list(APPEND _ARMA_REQUIRED_VARS "${pkg}_FOUND")
+ if(${pkg}_FOUND)
+ list(APPEND _ARMA_SUPPORT_LIBRARIES ${${pkg}_LIBRARIES})
+ endif()
+ endif()
+ endforeach()
+endif()
+
find_package_handle_standard_args(Armadillo
- REQUIRED_VARS ARMADILLO_LIBRARY ARMADILLO_INCLUDE_DIR
+ REQUIRED_VARS ARMADILLO_INCLUDE_DIR ${_ARMA_REQUIRED_VARS}
VERSION_VAR ARMADILLO_VERSION_STRING)
-# version_var fails with cmake < 2.8.4.
if (ARMADILLO_FOUND)
set(ARMADILLO_INCLUDE_DIRS ${ARMADILLO_INCLUDE_DIR})
- set(ARMADILLO_LIBRARIES ${ARMADILLO_LIBRARY})
+ set(ARMADILLO_LIBRARIES ${ARMADILLO_LIBRARY} ${_ARMA_SUPPORT_LIBRARIES})
endif ()
-# Hide internal variables
-mark_as_advanced(
- ARMADILLO_INCLUDE_DIR
- ARMADILLO_LIBRARY)
+# Clean up internal variables
+unset(_ARMA_REQUIRED_VARS)
+unset(_ARMA_SUPPORT_LIBRARIES)
+unset(_ARMA_USE_WRAPPER)
+unset(_ARMA_USE_LAPACK)
+unset(_ARMA_USE_BLAS)
+unset(_ARMA_USE_ARPACK)
+unset(_ARMA_USE_HDF5)
+unset(_ARMA_CONFIG_CONTENTS)
+unset(_ARMA_HEADER_CONTENTS)
diff --git a/Modules/FindBLAS.cmake b/Modules/FindBLAS.cmake
index 9b6d09c..4c569b3 100644
--- a/Modules/FindBLAS.cmake
+++ b/Modules/FindBLAS.cmake
@@ -48,6 +48,10 @@ The following variables may be set to influence this module's behavior:
* ``ACML_GPU``
* ``Apple``
* ``NAS``
+ * ``Arm``
+ * ``Arm_mp``
+ * ``Arm_ilp64``
+ * ``Arm_ilp64_mp``
* ``Generic``
``BLA_F95``
@@ -57,6 +61,15 @@ The following variables may be set to influence this module's behavior:
if set ``pkg-config`` will be used to search for a BLAS library first
and if one is found that is preferred
+Imported targets
+^^^^^^^^^^^^^^^^
+
+This module defines the following :prop_tgt:`IMPORTED` target:
+
+``BLAS::BLAS``
+ The libraries to use for BLAS, if found.
+
+
Result Variables
^^^^^^^^^^^^^^^^
@@ -107,6 +120,17 @@ if(NOT (CMAKE_C_COMPILER_LOADED OR CMAKE_CXX_COMPILER_LOADED OR CMAKE_Fortran_CO
endif()
endif()
+function(_add_blas_target)
+ if(NOT TARGET BLAS::BLAS)
+ add_library(BLAS::BLAS INTERFACE IMPORTED)
+ if(BLAS_LIBRARIES)
+ set_target_properties(BLAS::BLAS PROPERTIES
+ INTERFACE_LINK_LIBRARIES "${BLAS_LIBRARIES}"
+ )
+ endif()
+ endif()
+endfunction()
+
if(CMAKE_Fortran_COMPILER_LOADED)
include(${CMAKE_CURRENT_LIST_DIR}/CheckFortranFunctionExists.cmake)
else()
@@ -123,6 +147,7 @@ if(BLA_PREFER_PKGCONFIG)
if(PKGC_BLAS_FOUND)
set(BLAS_FOUND ${PKGC_BLAS_FOUND})
set(BLAS_LIBRARIES "${PKGC_BLAS_LINK_LIBRARIES}")
+ _add_blas_target()
return()
endif()
endif()
@@ -550,6 +575,36 @@ if(BLA_VENDOR STREQUAL "OpenBLAS" OR BLA_VENDOR STREQUAL "All")
endif()
endif()
+# ArmPL blas library? (https://developer.arm.com/tools-and-software/server-and-hpc/compile/arm-compiler-for-linux/arm-performance-libraries)
+if(BLA_VENDOR MATCHES "Arm" OR BLA_VENDOR STREQUAL "All")
+
+ # Check for 64bit Integer support
+ if(BLA_VENDOR MATCHES "_ilp64")
+ set(BLAS_armpl_LIB "armpl_ilp64")
+ else()
+ set(BLAS_armpl_LIB "armpl_lp64")
+ endif()
+
+ # Check for OpenMP support, VIA BLA_VENDOR of Arm_mp or Arm_ipl64_mp
+ if(BLA_VENDOR MATCHES "_mp")
+ set(BLAS_armpl_LIB "${BLAS_armpl_LIB}_mp")
+ endif()
+
+ if(NOT BLAS_LIBRARIES)
+ check_blas_libraries(
+ BLAS_LIBRARIES
+ BLAS
+ sgemm
+ ""
+ "${BLAS_armpl_LIB}"
+ ""
+ ""
+ ""
+ )
+ endif()
+
+endif()
+
# FLAME's blis library? (https://github.com/flame/blis)
if(BLA_VENDOR STREQUAL "FLAME" OR BLA_VENDOR STREQUAL "All")
if(NOT BLAS_LIBRARIES)
@@ -892,11 +947,13 @@ if(NOT BLA_F95)
find_package_handle_standard_args(BLAS REQUIRED_VARS BLAS_LIBRARIES)
endif()
+
# On compilers that implicitly link BLAS (such as ftn, cc, and CC on Cray HPC machines)
# we used a placeholder for empty BLAS_LIBRARIES to get through our logic above.
if(BLAS_LIBRARIES STREQUAL "BLAS_LIBRARIES-PLACEHOLDER-FOR-EMPTY-LIBRARIES")
set(BLAS_LIBRARIES "")
endif()
+_add_blas_target()
cmake_pop_check_state()
set(CMAKE_FIND_LIBRARY_SUFFIXES ${_blas_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})
diff --git a/Modules/FindBoost.cmake b/Modules/FindBoost.cmake
index 1e815a0..13981d3 100644
--- a/Modules/FindBoost.cmake
+++ b/Modules/FindBoost.cmake
@@ -155,6 +155,10 @@ setting variables::
used if multiple compatible suffixes should
be tested for, in decreasing order of
preference.
+ Boost_LIB_PREFIX - Set to the platform-specific library name
+ prefix (e.g. "lib") used by Boost static libs.
+ This is needed only on platforms where CMake
+ does not know the prefix by default.
Boost_ARCHITECTURE - Set to the architecture-specific library suffix
(e.g. "-x64"). Default is auto-computed for the
C++ compiler in use.
@@ -1667,10 +1671,17 @@ endif()
# Prefix initialization
# ------------------------------------------------------------------------
-set(Boost_LIB_PREFIX "")
-if ( (GHSMULTI AND Boost_USE_STATIC_LIBS) OR
- (WIN32 AND Boost_USE_STATIC_LIBS AND NOT CYGWIN) )
- set(Boost_LIB_PREFIX "lib")
+if ( NOT DEFINED Boost_LIB_PREFIX )
+ # Boost's static libraries use a "lib" prefix on DLL platforms
+ # to distinguish them from the DLL import libraries.
+ if (Boost_USE_STATIC_LIBS AND (
+ (WIN32 AND NOT CYGWIN)
+ OR GHSMULTI
+ ))
+ set(Boost_LIB_PREFIX "lib")
+ else()
+ set(Boost_LIB_PREFIX "")
+ endif()
endif()
if ( NOT Boost_NAMESPACE )
diff --git a/Modules/FindCUDAToolkit.cmake b/Modules/FindCUDAToolkit.cmake
index de7e785..b28892e 100644
--- a/Modules/FindCUDAToolkit.cmake
+++ b/Modules/FindCUDAToolkit.cmake
@@ -473,168 +473,8 @@ Result variables
#
###############################################################################
-if(CMAKE_CUDA_COMPILER_LOADED AND NOT CUDAToolkit_BIN_DIR)
- get_filename_component(cuda_dir "${CMAKE_CUDA_COMPILER}" DIRECTORY)
- # use the already detected cuda compiler
- set(CUDAToolkit_BIN_DIR "${cuda_dir}" CACHE PATH "")
- mark_as_advanced(CUDAToolkit_BIN_DIR)
- unset(cuda_dir)
-endif()
-
-# Try language- or user-provided path first.
-if(CUDAToolkit_BIN_DIR)
- find_program(CUDAToolkit_NVCC_EXECUTABLE
- NAMES nvcc nvcc.exe
- PATHS ${CUDAToolkit_BIN_DIR}
- NO_DEFAULT_PATH
- )
-endif()
-
-# Search using CUDAToolkit_ROOT
-find_program(CUDAToolkit_NVCC_EXECUTABLE
- NAMES nvcc nvcc.exe
- PATHS ENV CUDA_PATH
- PATH_SUFFIXES bin
-)
-
-# If the user specified CUDAToolkit_ROOT but nvcc could not be found, this is an error.
-if (NOT CUDAToolkit_NVCC_EXECUTABLE AND (DEFINED CUDAToolkit_ROOT OR DEFINED ENV{CUDAToolkit_ROOT}))
- # Declare error messages now, print later depending on find_package args.
- set(fail_base "Could not find nvcc executable in path specified by")
- set(cuda_root_fail "${fail_base} CUDAToolkit_ROOT=${CUDAToolkit_ROOT}")
- set(env_cuda_root_fail "${fail_base} environment variable CUDAToolkit_ROOT=$ENV{CUDAToolkit_ROOT}")
-
- if (CUDAToolkit_FIND_REQUIRED)
- if (DEFINED CUDAToolkit_ROOT)
- message(FATAL_ERROR ${cuda_root_fail})
- elseif (DEFINED ENV{CUDAToolkit_ROOT})
- message(FATAL_ERROR ${env_cuda_root_fail})
- endif()
- else()
- if (NOT CUDAToolkit_FIND_QUIETLY)
- if (DEFINED CUDAToolkit_ROOT)
- message(STATUS ${cuda_root_fail})
- elseif (DEFINED ENV{CUDAToolkit_ROOT})
- message(STATUS ${env_cuda_root_fail})
- endif()
- endif()
- set(CUDAToolkit_FOUND FALSE)
- unset(fail_base)
- unset(cuda_root_fail)
- unset(env_cuda_root_fail)
- return()
- endif()
-endif()
-
-# CUDAToolkit_ROOT cmake / env variable not specified, try platform defaults.
-#
-# - Linux: /usr/local/cuda-X.Y
-# - macOS: /Developer/NVIDIA/CUDA-X.Y
-# - Windows: C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\vX.Y
-#
-# We will also search the default symlink location /usr/local/cuda first since
-# if CUDAToolkit_ROOT is not specified, it is assumed that the symlinked
-# directory is the desired location.
-if (NOT CUDAToolkit_NVCC_EXECUTABLE)
- if (UNIX)
- if (NOT APPLE)
- set(platform_base "/usr/local/cuda-")
- else()
- set(platform_base "/Developer/NVIDIA/CUDA-")
- endif()
- else()
- set(platform_base "C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v")
- endif()
-
- # Build out a descending list of possible cuda installations, e.g.
- file(GLOB possible_paths "${platform_base}*")
- # Iterate the glob results and create a descending list.
- set(possible_versions)
- foreach (p ${possible_paths})
- # Extract version number from end of string
- string(REGEX MATCH "[0-9][0-9]?\\.[0-9]$" p_version ${p})
- if (IS_DIRECTORY ${p} AND p_version)
- list(APPEND possible_versions ${p_version})
- endif()
- endforeach()
-
- # Cannot use list(SORT) because that is alphabetical, we need numerical.
- # NOTE: this is not an efficient sorting strategy. But even if a user had
- # every possible version of CUDA installed, this wouldn't create any
- # significant overhead.
- set(versions)
- foreach (v ${possible_versions})
- list(LENGTH versions num_versions)
- # First version, nothing to compare with so just append.
- if (num_versions EQUAL 0)
- list(APPEND versions ${v})
- else()
- # Loop through list. Insert at an index when comparison is
- # VERSION_GREATER since we want a descending list. Duplicates will not
- # happen since this came from a glob list of directories.
- set(i 0)
- set(early_terminate FALSE)
- while (i LESS num_versions)
- list(GET versions ${i} curr)
- if (v VERSION_GREATER curr)
- list(INSERT versions ${i} ${v})
- set(early_terminate TRUE)
- break()
- endif()
- math(EXPR i "${i} + 1")
- endwhile()
- # If it did not get inserted, place it at the end.
- if (NOT early_terminate)
- list(APPEND versions ${v})
- endif()
- endif()
- endforeach()
-
- # With a descending list of versions, populate possible paths to search.
- set(search_paths)
- foreach (v ${versions})
- list(APPEND search_paths "${platform_base}${v}")
- endforeach()
-
- # Force the global default /usr/local/cuda to the front on Unix.
- if (UNIX)
- list(INSERT search_paths 0 "/usr/local/cuda")
- endif()
-
- # Now search for nvcc again using the platform default search paths.
- find_program(CUDAToolkit_NVCC_EXECUTABLE
- NAMES nvcc nvcc.exe
- PATHS ${search_paths}
- PATH_SUFFIXES bin
- )
-
- # We are done with these variables now, cleanup for caller.
- unset(platform_base)
- unset(possible_paths)
- unset(possible_versions)
- unset(versions)
- unset(i)
- unset(early_terminate)
- unset(search_paths)
-
- if (NOT CUDAToolkit_NVCC_EXECUTABLE)
- if (CUDAToolkit_FIND_REQUIRED)
- message(FATAL_ERROR "Could not find nvcc, please set CUDAToolkit_ROOT.")
- elseif(NOT CUDAToolkit_FIND_QUIETLY)
- message(STATUS "Could not find nvcc, please set CUDAToolkit_ROOT.")
- endif()
-
- set(CUDAToolkit_FOUND FALSE)
- return()
- endif()
-endif()
-
-if(NOT CUDAToolkit_BIN_DIR AND CUDAToolkit_NVCC_EXECUTABLE)
- get_filename_component(cuda_dir "${CUDAToolkit_NVCC_EXECUTABLE}" DIRECTORY)
- set(CUDAToolkit_BIN_DIR "${cuda_dir}" CACHE PATH "" FORCE)
- mark_as_advanced(CUDAToolkit_BIN_DIR)
- unset(cuda_dir)
-endif()
+# Include shared CUDA toolkit location code.
+include(Internal/CUDAToolkit)
if(CUDAToolkit_NVCC_EXECUTABLE AND
CUDAToolkit_NVCC_EXECUTABLE STREQUAL CMAKE_CUDA_COMPILER)
@@ -658,72 +498,22 @@ else()
unset(NVCC_OUT)
endif()
-
-get_filename_component(CUDAToolkit_ROOT_DIR ${CUDAToolkit_BIN_DIR} DIRECTORY ABSOLUTE)
-
-# Handle cross compilation
-if(CMAKE_CROSSCOMPILING)
- if(CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7-a")
- # Support for NVPACK
- set (CUDAToolkit_TARGET_NAME "armv7-linux-androideabi")
- elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "arm")
- # Support for arm cross compilation
- set(CUDAToolkit_TARGET_NAME "armv7-linux-gnueabihf")
- elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")
- # Support for aarch64 cross compilation
- if (ANDROID_ARCH_NAME STREQUAL "arm64")
- set(CUDAToolkit_TARGET_NAME "aarch64-linux-androideabi")
- else()
- set(CUDAToolkit_TARGET_NAME "aarch64-linux")
- endif (ANDROID_ARCH_NAME STREQUAL "arm64")
- elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
- set(CUDAToolkit_TARGET_NAME "x86_64-linux")
- endif()
-
- if (EXISTS "${CUDAToolkit_ROOT_DIR}/targets/${CUDAToolkit_TARGET_NAME}")
- set(CUDAToolkit_TARGET_DIR "${CUDAToolkit_ROOT_DIR}/targets/${CUDAToolkit_TARGET_NAME}")
- # add known CUDA target root path to the set of directories we search for programs, libraries and headers
- list(PREPEND CMAKE_FIND_ROOT_PATH "${CUDAToolkit_TARGET_DIR}")
-
- # Mark that we need to pop the root search path changes after we have
- # found all cuda libraries so that searches for our cross-compilation
- # libraries work when another cuda sdk is in CMAKE_PREFIX_PATH or
- # PATh
- set(_CUDAToolkit_Pop_ROOT_PATH True)
- endif()
-else()
- # Not cross compiling
- set(CUDAToolkit_TARGET_DIR "${CUDAToolkit_ROOT_DIR}")
- # Now that we have the real ROOT_DIR, find components inside it.
- list(APPEND CMAKE_PREFIX_PATH ${CUDAToolkit_ROOT_DIR})
-
- # Mark that we need to pop the prefix path changes after we have
- # found the cudart library.
- set(_CUDAToolkit_Pop_Prefix True)
+if(NOT CUDA_CUDART AND NOT CUDAToolkit_FIND_QUIETLY)
+ message(STATUS "Unable to find cudart library.")
endif()
-
-# Find the include/ directory
-find_path(CUDAToolkit_INCLUDE_DIR
- NAMES cuda_runtime.h
-)
-
-# And find the CUDA Runtime Library libcudart
+# Find the CUDA Runtime Library libcudart
find_library(CUDA_CUDART
NAMES cudart
PATH_SUFFIXES lib64 lib/x64
)
-if (NOT CUDA_CUDART)
+if(NOT CUDA_CUDART)
find_library(CUDA_CUDART
NAMES cudart
PATH_SUFFIXES lib64/stubs lib/x64/stubs
)
endif()
-if (NOT CUDA_CUDART AND NOT CUDAToolkit_FIND_QUIETLY)
- message(STATUS "Unable to find cudart library.")
-endif()
-
unset(CUDAToolkit_ROOT_DIR)
if(_CUDAToolkit_Pop_Prefix)
list(REMOVE_AT CMAKE_PREFIX_PATH -1)
@@ -749,8 +539,8 @@ mark_as_advanced(CUDA_CUDART
#-----------------------------------------------------------------------------
# Construct result variables
if(CUDAToolkit_FOUND)
- set(CUDAToolkit_INCLUDE_DIRS ${CUDAToolkit_INCLUDE_DIR})
- get_filename_component(CUDAToolkit_LIBRARY_DIR ${CUDA_CUDART} DIRECTORY ABSOLUTE)
+ set(CUDAToolkit_INCLUDE_DIRS ${CUDAToolkit_INCLUDE_DIR})
+ get_filename_component(CUDAToolkit_LIBRARY_DIR ${CUDA_CUDART} DIRECTORY ABSOLUTE)
endif()
#-----------------------------------------------------------------------------
diff --git a/Modules/FindDoxygen.cmake b/Modules/FindDoxygen.cmake
index faa03f9..184a9a2 100644
--- a/Modules/FindDoxygen.cmake
+++ b/Modules/FindDoxygen.cmake
@@ -999,9 +999,11 @@ doxygen_add_docs() for target ${targetName}")
foreach(_item IN LISTS DOXYGEN_INPUT)
get_filename_component(_abs_item "${_item}" ABSOLUTE
BASE_DIR "${_args_WORKING_DIRECTORY}")
- if(EXISTS "${_abs_item}" AND
- NOT IS_DIRECTORY "${_abs_item}" AND
- NOT IS_SYMLINK "${_abs_item}")
+ get_source_file_property(_isGenerated "${_abs_item}" GENERATED)
+ if(_isGenerated OR
+ (EXISTS "${_abs_item}" AND
+ NOT IS_DIRECTORY "${_abs_item}" AND
+ NOT IS_SYMLINK "${_abs_item}"))
list(APPEND _sources "${_abs_item}")
elseif(_args_USE_STAMP_FILE)
message(FATAL_ERROR "Source does not exist or is not a file:\n"
diff --git a/Modules/FindHDF5.cmake b/Modules/FindHDF5.cmake
index b488418..8d71d27 100644
--- a/Modules/FindHDF5.cmake
+++ b/Modules/FindHDF5.cmake
@@ -19,9 +19,12 @@ The module will optionally accept the ``COMPONENTS`` argument. If no
``COMPONENTS`` are specified, then the find module will default to finding
only the ``HDF5`` C library. If one or more ``COMPONENTS`` are specified, the
module will attempt to find the language bindings for the specified
-components. The only valid components are ``C``, ``CXX``, ``Fortran``, ``HL``,
-and ``Fortran_HL``. If the ``COMPONENTS`` argument is not given, the module will
+components. The valid components are ``C``, ``CXX``, ``Fortran``, ``HL``.
+``HL`` refers to the "high-level" HDF5 functions for C and Fortran.
+If the ``COMPONENTS`` argument is not given, the module will
attempt to find only the C bindings.
+For example, to use Fortran HDF5 and HDF5-HL functions, do:
+``find_package(HDF5 COMPONENTS Fortran HL)``.
This module will read the variable
``HDF5_USE_STATIC_LIBRARIES`` to determine whether or not to prefer a
@@ -29,16 +32,11 @@ static link to a dynamic link for ``HDF5`` and all of it's dependencies.
To use this feature, make sure that the ``HDF5_USE_STATIC_LIBRARIES``
variable is set before the call to find_package.
-To provide the module with a hint about where to find your ``HDF5``
-installation, you can set the environment variable ``HDF5_ROOT``. The
-Find module will then look in this path when searching for ``HDF5``
-executables, paths, and libraries.
-
Both the serial and parallel ``HDF5`` wrappers are considered and the first
directory to contain either one will be used. In the event that both appear
in the same directory the serial version is preferentially selected. This
behavior can be reversed by setting the variable ``HDF5_PREFER_PARALLEL`` to
-``True``.
+``TRUE``.
In addition to finding the includes and libraries required to compile
an ``HDF5`` client application, this module also makes an effort to find
@@ -115,10 +113,10 @@ also be defined. With all components enabled, the following variables will be d
Hints
^^^^^
-The following variable can be set to guide the search for HDF5 libraries and includes:
+The following variables can be set to guide the search for HDF5 libraries and includes:
-``HDF5_ROOT``
- Specify the path to the HDF5 installation to use.
+``HDF5_PREFER_PARALLEL``
+ set ``true`` to prefer parallel HDF5 (by default, serial is preferred)
``HDF5_FIND_DEBUG``
Set ``true`` to get extra debugging output.
@@ -141,28 +139,30 @@ if(NOT HDF5_FIND_COMPONENTS)
else()
set(HDF5_LANGUAGE_BINDINGS)
# add the extra specified components, ensuring that they are valid.
- set(FIND_HL OFF)
- foreach(component IN LISTS HDF5_FIND_COMPONENTS)
- list(FIND HDF5_VALID_LANGUAGE_BINDINGS ${component} component_location)
- if(NOT component_location EQUAL -1)
- list(APPEND HDF5_LANGUAGE_BINDINGS ${component})
- elseif(component STREQUAL "HL")
- set(FIND_HL ON)
- elseif(component STREQUAL "Fortran_HL") # only for compatibility
+ set(HDF5_FIND_HL OFF)
+ foreach(_component IN LISTS HDF5_FIND_COMPONENTS)
+ list(FIND HDF5_VALID_LANGUAGE_BINDINGS ${_component} _component_location)
+ if(NOT _component_location EQUAL -1)
+ list(APPEND HDF5_LANGUAGE_BINDINGS ${_component})
+ elseif(_component STREQUAL "HL")
+ set(HDF5_FIND_HL ON)
+ elseif(_component STREQUAL "Fortran_HL") # only for compatibility
list(APPEND HDF5_LANGUAGE_BINDINGS Fortran)
- set(FIND_HL ON)
- set(HDF5_FIND_REQUIRED_Fortran_HL False)
- set(HDF5_FIND_REQUIRED_Fortran True)
- set(HDF5_FIND_REQUIRED_HL True)
+ set(HDF5_FIND_HL ON)
+ set(HDF5_FIND_REQUIRED_Fortran_HL FALSE)
+ set(HDF5_FIND_REQUIRED_Fortran TRUE)
+ set(HDF5_FIND_REQUIRED_HL TRUE)
else()
- message(FATAL_ERROR "${component} is not a valid HDF5 component.")
+ message(FATAL_ERROR "${_component} is not a valid HDF5 component.")
endif()
endforeach()
+ unset(_component)
+ unset(_component_location)
if(NOT HDF5_LANGUAGE_BINDINGS)
- get_property(__langs GLOBAL PROPERTY ENABLED_LANGUAGES)
- foreach(__lang IN LISTS __langs)
- if(__lang MATCHES "^(C|CXX|Fortran)$")
- list(APPEND HDF5_LANGUAGE_BINDINGS ${__lang})
+ get_property(_langs GLOBAL PROPERTY ENABLED_LANGUAGES)
+ foreach(_lang IN LISTS _langs)
+ if(_lang MATCHES "^(C|CXX|Fortran)$")
+ list(APPEND HDF5_LANGUAGE_BINDINGS ${_lang})
endif()
endforeach()
endif()
@@ -328,97 +328,109 @@ endfunction()
# Invoke the HDF5 wrapper compiler. The compiler return value is stored to the
# return_value argument, the text output is stored to the output variable.
-macro( _HDF5_invoke_compiler language output return_value version is_parallel)
- set(${version})
- if(HDF5_USE_STATIC_LIBRARIES)
- set(lib_type_args -noshlib)
- else()
- set(lib_type_args -shlib)
- endif()
- set(scratch_dir ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/hdf5)
- if("${language}" STREQUAL "C")
- set(test_file ${scratch_dir}/cmake_hdf5_test.c)
- elseif("${language}" STREQUAL "CXX")
- set(test_file ${scratch_dir}/cmake_hdf5_test.cxx)
- elseif("${language}" STREQUAL "Fortran")
- set(test_file ${scratch_dir}/cmake_hdf5_test.f90)
- endif()
+function( _HDF5_invoke_compiler language output_var return_value_var version_var is_parallel_var)
+ set(is_parallel FALSE)
+ if(HDF5_USE_STATIC_LIBRARIES)
+ set(lib_type_args -noshlib)
+ else()
+ set(lib_type_args -shlib)
+ endif()
+ set(scratch_dir ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/hdf5)
+ if("${language}" STREQUAL "C")
+ set(test_file ${scratch_dir}/cmake_hdf5_test.c)
+ elseif("${language}" STREQUAL "CXX")
+ set(test_file ${scratch_dir}/cmake_hdf5_test.cxx)
+ elseif("${language}" STREQUAL "Fortran")
+ set(test_file ${scratch_dir}/cmake_hdf5_test.f90)
+ endif()
+ # Verify that the compiler wrapper can actually compile: sometimes the compiler
+ # wrapper exists, but not the compiler. E.g. Miniconda / Anaconda Python
+ execute_process(
+ COMMAND ${HDF5_${language}_COMPILER_EXECUTABLE} ${test_file}
+ RESULT_VARIABLE return_value
+ )
+ if(return_value)
+ message(STATUS
+ "HDF5 ${language} compiler wrapper is unable to compile a minimal HDF5 program.")
+ else()
execute_process(
COMMAND ${HDF5_${language}_COMPILER_EXECUTABLE} -show ${lib_type_args} ${test_file}
- OUTPUT_VARIABLE ${output}
- ERROR_VARIABLE ${output}
- RESULT_VARIABLE ${return_value}
+ OUTPUT_VARIABLE output
+ ERROR_VARIABLE output
+ RESULT_VARIABLE return_value
+ OUTPUT_STRIP_TRAILING_WHITESPACE
)
- if(NOT ${${return_value}} EQUAL 0)
- message(STATUS
- "Unable to determine HDF5 ${language} flags from HDF5 wrapper.")
+ if(return_value)
+ message(STATUS
+ "Unable to determine HDF5 ${language} flags from HDF5 wrapper.")
endif()
execute_process(
COMMAND ${HDF5_${language}_COMPILER_EXECUTABLE} -showconfig
OUTPUT_VARIABLE config_output
ERROR_VARIABLE config_output
- RESULT_VARIABLE config_return
+ RESULT_VARIABLE return_value
+ OUTPUT_STRIP_TRAILING_WHITESPACE
)
- if(NOT ${return_value} EQUAL 0)
- message( STATUS
- "Unable to determine HDF5 ${language} version from HDF5 wrapper.")
+ if(return_value)
+ message(STATUS
+ "Unable to determine HDF5 ${language} version_var from HDF5 wrapper.")
endif()
- string(REGEX MATCH "HDF5 Version: ([a-zA-Z0-9\\.\\-]*)" version_match "${config_output}")
- if(version_match)
- string(REPLACE "HDF5 Version: " "" ${version} "${version_match}")
- string(REPLACE "-patch" "." ${version} "${${version}}")
+ string(REGEX MATCH "HDF5 Version: ([a-zA-Z0-9\\.\\-]*)" version "${config_output}")
+ if(version)
+ string(REPLACE "HDF5 Version: " "" version "${version}")
+ string(REPLACE "-patch" "." version "${version}")
endif()
if(config_output MATCHES "Parallel HDF5: yes")
- set(${is_parallel} TRUE)
- else()
- set(${is_parallel} FALSE)
+ set(is_parallel TRUE)
endif()
-endmacro()
+ endif()
+ foreach(var output return_value version is_parallel)
+ set(${${var}_var} ${${var}} PARENT_SCOPE)
+ endforeach()
+endfunction()
# Parse a compile line for definitions, includes, library paths, and libraries.
-macro( _HDF5_parse_compile_line
- compile_line_var
- include_paths
- definitions
- library_paths
- libraries
- libraries_hl)
-
- separate_arguments(_HDF5_COMPILE_ARGS NATIVE_COMMAND "${${compile_line_var}}")
-
- foreach(arg IN LISTS _HDF5_COMPILE_ARGS)
- if("${arg}" MATCHES "^-I(.*)$")
+function(_HDF5_parse_compile_line compile_line_var include_paths definitions
+ library_paths libraries libraries_hl)
+
+ separate_arguments(_compile_args NATIVE_COMMAND "${${compile_line_var}}")
+
+ foreach(_arg IN LISTS _compile_args)
+ if("${_arg}" MATCHES "^-I(.*)$")
# include directory
- list(APPEND ${include_paths} "${CMAKE_MATCH_1}")
- elseif("${arg}" MATCHES "^-D(.*)$")
+ list(APPEND include_paths "${CMAKE_MATCH_1}")
+ elseif("${_arg}" MATCHES "^-D(.*)$")
# compile definition
- list(APPEND ${definitions} "-D${CMAKE_MATCH_1}")
- elseif("${arg}" MATCHES "^-L(.*)$")
+ list(APPEND definitions "-D${CMAKE_MATCH_1}")
+ elseif("${_arg}" MATCHES "^-L(.*)$")
# library search path
- list(APPEND ${library_paths} "${CMAKE_MATCH_1}")
- elseif("${arg}" MATCHES "^-l(hdf5.*hl.*)$")
+ list(APPEND library_paths "${CMAKE_MATCH_1}")
+ elseif("${_arg}" MATCHES "^-l(hdf5.*hl.*)$")
# library name (hl)
- list(APPEND ${libraries_hl} "${CMAKE_MATCH_1}")
- elseif("${arg}" MATCHES "^-l(.*)$")
+ list(APPEND libraries_hl "${CMAKE_MATCH_1}")
+ elseif("${_arg}" MATCHES "^-l(.*)$")
# library name
- list(APPEND ${libraries} "${CMAKE_MATCH_1}")
- elseif("${arg}" MATCHES "^(.:)?[/\\].*\\.(a|so|dylib|sl|lib)$")
+ list(APPEND libraries "${CMAKE_MATCH_1}")
+ elseif("${_arg}" MATCHES "^(.:)?[/\\].*\\.(a|so|dylib|sl|lib)$")
# library file
- if(NOT EXISTS "${arg}")
+ if(NOT EXISTS "${_arg}")
continue()
endif()
- get_filename_component(_HDF5_LPATH "${arg}" DIRECTORY)
- get_filename_component(_HDF5_LNAME "${arg}" NAME_WE)
- string(REGEX REPLACE "^lib" "" _HDF5_LNAME "${_HDF5_LNAME}")
- list(APPEND ${library_paths} "${_HDF5_LPATH}")
- if(_HDF5_LNAME MATCHES "hdf5.*hl")
- list(APPEND ${libraries_hl} "${_HDF5_LNAME}")
+ get_filename_component(_lpath "${_arg}" DIRECTORY)
+ get_filename_component(_lname "${_arg}" NAME_WE)
+ string(REGEX REPLACE "^lib" "" _lname "${_lname}")
+ list(APPEND library_paths "${_lpath}")
+ if(_lname MATCHES "hdf5.*hl")
+ list(APPEND libraries_hl "${_lname}")
else()
- list(APPEND ${libraries} "${_HDF5_LNAME}")
+ list(APPEND libraries "${_lname}")
endif()
endif()
endforeach()
-endmacro()
+ foreach(var include_paths definitions library_paths libraries libraries_hl)
+ set(${${var}_var} ${${var}} PARENT_SCOPE)
+ endforeach()
+endfunction()
# Select a preferred imported configuration from a target
function(_HDF5_select_imported_config target imported_conf)
@@ -528,10 +540,10 @@ if(NOT HDF5_FOUND AND NOT HDF5_NO_FIND_PACKAGE_CONFIG_FILE)
set(HDF5_${_lang}_LIBRARY ${_hdf5_lang_location})
list(APPEND HDF5_LIBRARIES ${HDF5_${_lang}_TARGET}${_suffix})
set(HDF5_${_lang}_LIBRARIES ${HDF5_${_lang}_TARGET}${_suffix})
- set(HDF5_${_lang}_FOUND True)
+ set(HDF5_${_lang}_FOUND TRUE)
endif()
- if(FIND_HL)
- get_target_property(__lang_hl_location ${HDF5_${_lang}_HL_TARGET}${_suffix} IMPORTED_IMPLIB_${_hdf5_imported_conf} )
+ if(HDF5_FIND_HL)
+ get_target_property(_lang_hl_location ${HDF5_${_lang}_HL_TARGET}${_suffix} IMPORTED_IMPLIB_${_hdf5_imported_conf} )
if (NOT _hdf5_lang_hl_location)
get_target_property(_hdf5_lang_hl_location ${HDF5_${_lang}_HL_TARGET}${_suffix} LOCATION_${_hdf5_imported_conf})
if (NOT _hdf5_hl_lang_location)
@@ -542,7 +554,7 @@ if(NOT HDF5_FOUND AND NOT HDF5_NO_FIND_PACKAGE_CONFIG_FILE)
set(HDF5_${_lang}_HL_LIBRARY ${_hdf5_lang_hl_location})
list(APPEND HDF5_HL_LIBRARIES ${HDF5_${_lang}_HL_TARGET}${_suffix})
set(HDF5_${_lang}_HL_LIBRARIES ${HDF5_${_lang}_HL_TARGET}${_suffix})
- set(HDF5_HL_FOUND True)
+ set(HDF5_HL_FOUND TRUE)
endif()
unset(_hdf5_lang_hl_location)
endif()
@@ -553,172 +565,177 @@ if(NOT HDF5_FOUND AND NOT HDF5_NO_FIND_PACKAGE_CONFIG_FILE)
endif()
if(NOT HDF5_FOUND)
- set(_HDF5_NEED_TO_SEARCH False)
- set(HDF5_COMPILER_NO_INTERROGATE True)
+ set(_HDF5_NEED_TO_SEARCH FALSE)
+ set(HDF5_COMPILER_NO_INTERROGATE TRUE)
# Only search for languages we've enabled
- foreach(__lang IN LISTS HDF5_LANGUAGE_BINDINGS)
+ foreach(_lang IN LISTS HDF5_LANGUAGE_BINDINGS)
# First check to see if our regular compiler is one of wrappers
- if(__lang STREQUAL "C")
+ if(_lang STREQUAL "C")
_HDF5_test_regular_compiler_C(
- HDF5_${__lang}_COMPILER_NO_INTERROGATE
- HDF5_${__lang}_VERSION
- HDF5_${__lang}_IS_PARALLEL)
- elseif(__lang STREQUAL "CXX")
+ HDF5_${_lang}_COMPILER_NO_INTERROGATE
+ HDF5_${_lang}_VERSION
+ HDF5_${_lang}_IS_PARALLEL)
+ elseif(_lang STREQUAL "CXX")
_HDF5_test_regular_compiler_CXX(
- HDF5_${__lang}_COMPILER_NO_INTERROGATE
- HDF5_${__lang}_VERSION
- HDF5_${__lang}_IS_PARALLEL)
- elseif(__lang STREQUAL "Fortran")
+ HDF5_${_lang}_COMPILER_NO_INTERROGATE
+ HDF5_${_lang}_VERSION
+ HDF5_${_lang}_IS_PARALLEL)
+ elseif(_lang STREQUAL "Fortran")
_HDF5_test_regular_compiler_Fortran(
- HDF5_${__lang}_COMPILER_NO_INTERROGATE
- HDF5_${__lang}_IS_PARALLEL)
+ HDF5_${_lang}_COMPILER_NO_INTERROGATE
+ HDF5_${_lang}_IS_PARALLEL)
else()
continue()
endif()
- if(HDF5_${__lang}_COMPILER_NO_INTERROGATE)
- message(STATUS "HDF5: Using hdf5 compiler wrapper for all ${__lang} compiling")
- set(HDF5_${__lang}_FOUND True)
- set(HDF5_${__lang}_COMPILER_EXECUTABLE_NO_INTERROGATE
- "${CMAKE_${__lang}_COMPILER}"
- CACHE FILEPATH "HDF5 ${__lang} compiler wrapper")
- set(HDF5_${__lang}_DEFINITIONS)
- set(HDF5_${__lang}_INCLUDE_DIRS)
- set(HDF5_${__lang}_LIBRARIES)
- set(HDF5_${__lang}_HL_LIBRARIES)
-
- mark_as_advanced(HDF5_${__lang}_COMPILER_EXECUTABLE_NO_INTERROGATE)
-
- set(HDF5_${__lang}_FOUND True)
- set(HDF5_HL_FOUND True)
+ if(HDF5_${_lang}_COMPILER_NO_INTERROGATE)
+ if(HDF5_FIND_DEBUG)
+ message(STATUS "HDF5: Using hdf5 compiler wrapper for all ${_lang} compiling")
+ endif()
+ set(HDF5_${_lang}_FOUND TRUE)
+ set(HDF5_${_lang}_COMPILER_EXECUTABLE_NO_INTERROGATE
+ "${CMAKE_${_lang}_COMPILER}"
+ CACHE FILEPATH "HDF5 ${_lang} compiler wrapper")
+ set(HDF5_${_lang}_DEFINITIONS)
+ set(HDF5_${_lang}_INCLUDE_DIRS)
+ set(HDF5_${_lang}_LIBRARIES)
+ set(HDF5_${_lang}_HL_LIBRARIES)
+
+ mark_as_advanced(HDF5_${_lang}_COMPILER_EXECUTABLE_NO_INTERROGATE)
+
+ set(HDF5_${_lang}_FOUND TRUE)
+ set(HDF5_HL_FOUND TRUE)
else()
- set(HDF5_COMPILER_NO_INTERROGATE False)
+ set(HDF5_COMPILER_NO_INTERROGATE FALSE)
# If this language isn't using the wrapper, then try to seed the
# search options with the wrapper
- find_program(HDF5_${__lang}_COMPILER_EXECUTABLE
- NAMES ${HDF5_${__lang}_COMPILER_NAMES} NAMES_PER_DIR
+ find_program(HDF5_${_lang}_COMPILER_EXECUTABLE
+ NAMES ${HDF5_${_lang}_COMPILER_NAMES} NAMES_PER_DIR
HINTS ${HDF5_ROOT}
PATH_SUFFIXES bin Bin
- DOC "HDF5 ${__lang} Wrapper compiler. Used only to detect HDF5 compile flags."
+ DOC "HDF5 ${_lang} Wrapper compiler. Used only to detect HDF5 compile flags."
${_HDF5_SEARCH_OPTS}
)
- mark_as_advanced( HDF5_${__lang}_COMPILER_EXECUTABLE )
- unset(HDF5_${__lang}_COMPILER_NAMES)
-
- if(HDF5_${__lang}_COMPILER_EXECUTABLE)
- _HDF5_invoke_compiler(${__lang} HDF5_${__lang}_COMPILE_LINE
- HDF5_${__lang}_RETURN_VALUE HDF5_${__lang}_VERSION HDF5_${__lang}_IS_PARALLEL)
- if(HDF5_${__lang}_RETURN_VALUE EQUAL 0)
- message(STATUS "HDF5: Using hdf5 compiler wrapper to determine ${__lang} configuration")
- _HDF5_parse_compile_line( HDF5_${__lang}_COMPILE_LINE
- HDF5_${__lang}_INCLUDE_DIRS
- HDF5_${__lang}_DEFINITIONS
- HDF5_${__lang}_LIBRARY_DIRS
- HDF5_${__lang}_LIBRARY_NAMES
- HDF5_${__lang}_HL_LIBRARY_NAMES
+ mark_as_advanced( HDF5_${_lang}_COMPILER_EXECUTABLE )
+ unset(HDF5_${_lang}_COMPILER_NAMES)
+
+ if(HDF5_${_lang}_COMPILER_EXECUTABLE)
+ _HDF5_invoke_compiler(${_lang} HDF5_${_lang}_COMPILE_LINE
+ HDF5_${_lang}_RETURN_VALUE HDF5_${_lang}_VERSION HDF5_${_lang}_IS_PARALLEL)
+ if(HDF5_${_lang}_RETURN_VALUE EQUAL 0)
+ if(HDF5_FIND_DEBUG)
+ message(STATUS "HDF5: Using hdf5 compiler wrapper to determine ${_lang} configuration")
+ endif()
+ _HDF5_parse_compile_line( HDF5_${_lang}_COMPILE_LINE
+ HDF5_${_lang}_INCLUDE_DIRS
+ HDF5_${_lang}_DEFINITIONS
+ HDF5_${_lang}_LIBRARY_DIRS
+ HDF5_${_lang}_LIBRARY_NAMES
+ HDF5_${_lang}_HL_LIBRARY_NAMES
)
- set(HDF5_${__lang}_LIBRARIES)
+ set(HDF5_${_lang}_LIBRARIES)
- foreach(L IN LISTS HDF5_${__lang}_LIBRARY_NAMES)
+ foreach(_lib IN LISTS HDF5_${_lang}_LIBRARY_NAMES)
set(_HDF5_SEARCH_NAMES_LOCAL)
- if("x${L}" MATCHES "hdf5")
+ if("x${_lib}" MATCHES "hdf5")
# hdf5 library
set(_HDF5_SEARCH_OPTS_LOCAL ${_HDF5_SEARCH_OPTS})
if(HDF5_USE_STATIC_LIBRARIES)
if(WIN32)
- set(_HDF5_SEARCH_NAMES_LOCAL lib${L})
+ set(_HDF5_SEARCH_NAMES_LOCAL lib${_lib})
else()
- set(_HDF5_SEARCH_NAMES_LOCAL lib${L}.a)
+ set(_HDF5_SEARCH_NAMES_LOCAL lib${_lib}.a)
endif()
endif()
else()
# external library
set(_HDF5_SEARCH_OPTS_LOCAL)
endif()
- find_library(HDF5_${__lang}_LIBRARY_${L}
- NAMES ${_HDF5_SEARCH_NAMES_LOCAL} ${L} NAMES_PER_DIR
- HINTS ${HDF5_${__lang}_LIBRARY_DIRS}
+ find_library(HDF5_${_lang}_LIBRARY_${_lib}
+ NAMES ${_HDF5_SEARCH_NAMES_LOCAL} ${_lib} NAMES_PER_DIR
+ HINTS ${HDF5_${_lang}_LIBRARY_DIRS}
${HDF5_ROOT}
${_HDF5_SEARCH_OPTS_LOCAL}
)
unset(_HDF5_SEARCH_OPTS_LOCAL)
unset(_HDF5_SEARCH_NAMES_LOCAL)
- if(HDF5_${__lang}_LIBRARY_${L})
- list(APPEND HDF5_${__lang}_LIBRARIES ${HDF5_${__lang}_LIBRARY_${L}})
+ if(HDF5_${_lang}_LIBRARY_${_lib})
+ list(APPEND HDF5_${_lang}_LIBRARIES ${HDF5_${_lang}_LIBRARY_${_lib}})
else()
- list(APPEND HDF5_${__lang}_LIBRARIES ${L})
+ list(APPEND HDF5_${_lang}_LIBRARIES ${_lib})
endif()
endforeach()
- if(FIND_HL)
- set(HDF5_${__lang}_HL_LIBRARIES)
- foreach(L IN LISTS HDF5_${__lang}_HL_LIBRARY_NAMES)
+ if(HDF5_FIND_HL)
+ set(HDF5_${_lang}_HL_LIBRARIES)
+ foreach(_lib IN LISTS HDF5_${_lang}_HL_LIBRARY_NAMES)
set(_HDF5_SEARCH_NAMES_LOCAL)
- if("x${L}" MATCHES "hdf5")
+ if("x${_lib}" MATCHES "hdf5")
# hdf5 library
set(_HDF5_SEARCH_OPTS_LOCAL ${_HDF5_SEARCH_OPTS})
if(HDF5_USE_STATIC_LIBRARIES)
if(WIN32)
- set(_HDF5_SEARCH_NAMES_LOCAL lib${L})
+ set(_HDF5_SEARCH_NAMES_LOCAL lib${_lib})
else()
- set(_HDF5_SEARCH_NAMES_LOCAL lib${L}.a)
+ set(_HDF5_SEARCH_NAMES_LOCAL lib${_lib}.a)
endif()
endif()
else()
# external library
set(_HDF5_SEARCH_OPTS_LOCAL)
endif()
- find_library(HDF5_${__lang}_LIBRARY_${L}
- NAMES ${_HDF5_SEARCH_NAMES_LOCAL} ${L} NAMES_PER_DIR
- HINTS ${HDF5_${__lang}_LIBRARY_DIRS}
+ find_library(HDF5_${_lang}_LIBRARY_${_lib}
+ NAMES ${_HDF5_SEARCH_NAMES_LOCAL} ${_lib} NAMES_PER_DIR
+ HINTS ${HDF5_${_lang}_LIBRARY_DIRS}
${HDF5_ROOT}
${_HDF5_SEARCH_OPTS_LOCAL}
)
unset(_HDF5_SEARCH_OPTS_LOCAL)
unset(_HDF5_SEARCH_NAMES_LOCAL)
- if(HDF5_${__lang}_LIBRARY_${L})
- list(APPEND HDF5_${__lang}_HL_LIBRARIES ${HDF5_${__lang}_LIBRARY_${L}})
+ if(HDF5_${_lang}_LIBRARY_${_lib})
+ list(APPEND HDF5_${_lang}_HL_LIBRARIES ${HDF5_${_lang}_LIBRARY_${_lib}})
else()
- list(APPEND HDF5_${__lang}_HL_LIBRARIES ${L})
+ list(APPEND HDF5_${_lang}_HL_LIBRARIES ${_lib})
endif()
endforeach()
- set(HDF5_HL_FOUND True)
+ set(HDF5_HL_FOUND TRUE)
endif()
- set(HDF5_${__lang}_FOUND True)
- _HDF5_remove_duplicates_from_beginning(HDF5_${__lang}_DEFINITIONS)
- _HDF5_remove_duplicates_from_beginning(HDF5_${__lang}_INCLUDE_DIRS)
- _HDF5_remove_duplicates_from_beginning(HDF5_${__lang}_LIBRARIES)
- _HDF5_remove_duplicates_from_beginning(HDF5_${__lang}_HL_LIBRARIES)
+ set(HDF5_${_lang}_FOUND TRUE)
+ _HDF5_remove_duplicates_from_beginning(HDF5_${_lang}_DEFINITIONS)
+ _HDF5_remove_duplicates_from_beginning(HDF5_${_lang}_INCLUDE_DIRS)
+ _HDF5_remove_duplicates_from_beginning(HDF5_${_lang}_LIBRARIES)
+ _HDF5_remove_duplicates_from_beginning(HDF5_${_lang}_HL_LIBRARIES)
else()
- set(_HDF5_NEED_TO_SEARCH True)
+ set(_HDF5_NEED_TO_SEARCH TRUE)
endif()
else()
- set(_HDF5_NEED_TO_SEARCH True)
+ set(_HDF5_NEED_TO_SEARCH TRUE)
endif()
endif()
- if(HDF5_${__lang}_VERSION)
+ if(HDF5_${_lang}_VERSION)
if(NOT HDF5_VERSION)
- set(HDF5_VERSION ${HDF5_${__lang}_VERSION})
- elseif(NOT HDF5_VERSION VERSION_EQUAL HDF5_${__lang}_VERSION)
- message(WARNING "HDF5 Version found for language ${__lang}, ${HDF5_${__lang}_VERSION} is different than previously found version ${HDF5_VERSION}")
+ set(HDF5_VERSION ${HDF5_${_lang}_VERSION})
+ elseif(NOT HDF5_VERSION VERSION_EQUAL HDF5_${_lang}_VERSION)
+ message(WARNING "HDF5 Version found for language ${_lang}, ${HDF5_${_lang}_VERSION} is different than previously found version ${HDF5_VERSION}")
endif()
endif()
- if(DEFINED HDF5_${__lang}_IS_PARALLEL)
+ if(DEFINED HDF5_${_lang}_IS_PARALLEL)
if(NOT DEFINED HDF5_IS_PARALLEL)
- set(HDF5_IS_PARALLEL ${HDF5_${__lang}_IS_PARALLEL})
- elseif(NOT HDF5_IS_PARALLEL AND HDF5_${__lang}_IS_PARALLEL)
- message(WARNING "HDF5 found for language ${__lang} is parallel but previously found language is not parallel.")
- elseif(HDF5_IS_PARALLEL AND NOT HDF5_${__lang}_IS_PARALLEL)
- message(WARNING "HDF5 found for language ${__lang} is not parallel but previously found language is parallel.")
+ set(HDF5_IS_PARALLEL ${HDF5_${_lang}_IS_PARALLEL})
+ elseif(NOT HDF5_IS_PARALLEL AND HDF5_${_lang}_IS_PARALLEL)
+ message(WARNING "HDF5 found for language ${_lang} is parallel but previously found language is not parallel.")
+ elseif(HDF5_IS_PARALLEL AND NOT HDF5_${_lang}_IS_PARALLEL)
+ message(WARNING "HDF5 found for language ${_lang} is not parallel but previously found language is parallel.")
endif()
endif()
endforeach()
+ unset(_lib)
else()
- set(_HDF5_NEED_TO_SEARCH True)
+ set(_HDF5_NEED_TO_SEARCH TRUE)
endif()
if(NOT HDF5_FOUND AND HDF5_COMPILER_NO_INTERROGATE)
# No arguments necessary, all languages can use the compiler wrappers
- set(HDF5_FOUND True)
+ set(HDF5_FOUND TRUE)
set(HDF5_METHOD "Included by compiler wrappers")
set(HDF5_REQUIRED_VARS HDF5_METHOD)
elseif(NOT HDF5_FOUND AND NOT _HDF5_NEED_TO_SEARCH)
@@ -727,14 +744,14 @@ elseif(NOT HDF5_FOUND AND NOT _HDF5_NEED_TO_SEARCH)
set(HDF5_INCLUDE_DIRS)
set(HDF5_LIBRARIES)
set(HDF5_HL_LIBRARIES)
- foreach(__lang IN LISTS HDF5_LANGUAGE_BINDINGS)
- if(HDF5_${__lang}_FOUND)
- if(NOT HDF5_${__lang}_COMPILER_NO_INTERROGATE)
- list(APPEND HDF5_DEFINITIONS ${HDF5_${__lang}_DEFINITIONS})
- list(APPEND HDF5_INCLUDE_DIRS ${HDF5_${__lang}_INCLUDE_DIRS})
- list(APPEND HDF5_LIBRARIES ${HDF5_${__lang}_LIBRARIES})
- if(FIND_HL)
- list(APPEND HDF5_HL_LIBRARIES ${HDF5_${__lang}_HL_LIBRARIES})
+ foreach(_lang IN LISTS HDF5_LANGUAGE_BINDINGS)
+ if(HDF5_${_lang}_FOUND)
+ if(NOT HDF5_${_lang}_COMPILER_NO_INTERROGATE)
+ list(APPEND HDF5_DEFINITIONS ${HDF5_${_lang}_DEFINITIONS})
+ list(APPEND HDF5_INCLUDE_DIRS ${HDF5_${_lang}_INCLUDE_DIRS})
+ list(APPEND HDF5_LIBRARIES ${HDF5_${_lang}_LIBRARIES})
+ if(HDF5_FIND_HL)
+ list(APPEND HDF5_HL_LIBRARIES ${HDF5_${_lang}_HL_LIBRARIES})
endif()
endif()
endif()
@@ -743,9 +760,9 @@ elseif(NOT HDF5_FOUND AND NOT _HDF5_NEED_TO_SEARCH)
_HDF5_remove_duplicates_from_beginning(HDF5_INCLUDE_DIRS)
_HDF5_remove_duplicates_from_beginning(HDF5_LIBRARIES)
_HDF5_remove_duplicates_from_beginning(HDF5_HL_LIBRARIES)
- set(HDF5_FOUND True)
+ set(HDF5_FOUND TRUE)
set(HDF5_REQUIRED_VARS HDF5_LIBRARIES)
- if(FIND_HL)
+ if(HDF5_FIND_HL)
list(APPEND HDF5_REQUIRED_VARS HDF5_HL_LIBRARIES)
endif()
endif()
@@ -769,29 +786,40 @@ if( NOT HDF5_FOUND )
set(HDF5_Fortran_LIBRARY_NAMES hdf5_fortran ${HDF5_C_LIBRARY_NAMES})
set(HDF5_Fortran_HL_LIBRARY_NAMES hdf5hl_fortran ${HDF5_C_HL_LIBRARY_NAMES} ${HDF5_Fortran_LIBRARY_NAMES})
- foreach(__lang IN LISTS HDF5_LANGUAGE_BINDINGS)
+ # suffixes as seen on Linux, MSYS2, ...
+ set(_lib_suffixes hdf5)
+ if(NOT HDF5_PREFER_PARALLEL)
+ list(APPEND _lib_suffixes hdf5/serial)
+ endif()
+ if(HDF5_USE_STATIC_LIBRARIES)
+ set(_inc_suffixes include/static)
+ else()
+ set(_inc_suffixes include/shared)
+ endif()
+
+ foreach(_lang IN LISTS HDF5_LANGUAGE_BINDINGS)
# find the HDF5 include directories
- if("${__lang}" STREQUAL "Fortran")
+ if("${_lang}" STREQUAL "Fortran")
set(HDF5_INCLUDE_FILENAME hdf5.mod HDF5.mod)
- elseif("${__lang}" STREQUAL "CXX")
+ elseif("${_lang}" STREQUAL "CXX")
set(HDF5_INCLUDE_FILENAME H5Cpp.h)
else()
set(HDF5_INCLUDE_FILENAME hdf5.h)
endif()
- find_path(HDF5_${__lang}_INCLUDE_DIR ${HDF5_INCLUDE_FILENAME}
+ find_path(HDF5_${_lang}_INCLUDE_DIR ${HDF5_INCLUDE_FILENAME}
HINTS ${HDF5_ROOT}
PATHS $ENV{HOME}/.local/include
- PATH_SUFFIXES include Include
+ PATH_SUFFIXES include Include ${_inc_suffixes} ${_lib_suffixes}
${_HDF5_SEARCH_OPTS}
)
- mark_as_advanced(HDF5_${__lang}_INCLUDE_DIR)
+ mark_as_advanced(HDF5_${_lang}_INCLUDE_DIR)
# set the _DIRS variable as this is what the user will normally use
- set(HDF5_${__lang}_INCLUDE_DIRS ${HDF5_${__lang}_INCLUDE_DIR})
- list(APPEND HDF5_INCLUDE_DIRS ${HDF5_${__lang}_INCLUDE_DIR})
+ set(HDF5_${_lang}_INCLUDE_DIRS ${HDF5_${_lang}_INCLUDE_DIR})
+ list(APPEND HDF5_INCLUDE_DIRS ${HDF5_${_lang}_INCLUDE_DIR})
# find the HDF5 libraries
- foreach(LIB IN LISTS HDF5_${__lang}_LIBRARY_NAMES)
+ foreach(LIB IN LISTS HDF5_${_lang}_LIBRARY_NAMES)
if(HDF5_USE_STATIC_LIBRARIES)
# According to bug 1643 on the CMake bug tracker, this is the
# preferred method for searching for a static library.
@@ -811,27 +839,28 @@ if( NOT HDF5_FOUND )
endif()
find_library(HDF5_${LIB}_LIBRARY_DEBUG
NAMES ${THIS_LIBRARY_SEARCH_DEBUG}
- HINTS ${HDF5_ROOT} PATH_SUFFIXES lib Lib
+ HINTS ${HDF5_ROOT} PATH_SUFFIXES lib Lib ${_lib_suffixes}
${_HDF5_SEARCH_OPTS}
)
- find_library( HDF5_${LIB}_LIBRARY_RELEASE
+ find_library(HDF5_${LIB}_LIBRARY_RELEASE
NAMES ${THIS_LIBRARY_SEARCH_RELEASE}
- HINTS ${HDF5_ROOT} PATH_SUFFIXES lib Lib
+ HINTS ${HDF5_ROOT} PATH_SUFFIXES lib Lib ${_lib_suffixes}
${_HDF5_SEARCH_OPTS}
)
+
select_library_configurations( HDF5_${LIB} )
- list(APPEND HDF5_${__lang}_LIBRARIES ${HDF5_${LIB}_LIBRARY})
+ list(APPEND HDF5_${_lang}_LIBRARIES ${HDF5_${LIB}_LIBRARY})
endforeach()
- if(HDF5_${__lang}_LIBRARIES)
- set(HDF5_${__lang}_FOUND True)
+ if(HDF5_${_lang}_LIBRARIES)
+ set(HDF5_${_lang}_FOUND TRUE)
endif()
# Append the libraries for this language binding to the list of all
# required libraries.
- list(APPEND HDF5_LIBRARIES ${HDF5_${__lang}_LIBRARIES})
+ list(APPEND HDF5_LIBRARIES ${HDF5_${_lang}_LIBRARIES})
- if(FIND_HL)
- foreach(LIB IN LISTS HDF5_${__lang}_HL_LIBRARY_NAMES)
+ if(HDF5_FIND_HL)
+ foreach(LIB IN LISTS HDF5_${_lang}_HL_LIBRARY_NAMES)
if(HDF5_USE_STATIC_LIBRARIES)
# According to bug 1643 on the CMake bug tracker, this is the
# preferred method for searching for a static library.
@@ -848,25 +877,26 @@ if( NOT HDF5_FOUND )
endif()
find_library(HDF5_${LIB}_LIBRARY_DEBUG
NAMES ${THIS_LIBRARY_SEARCH_DEBUG}
- HINTS ${HDF5_ROOT} PATH_SUFFIXES lib Lib
+ HINTS ${HDF5_ROOT} PATH_SUFFIXES lib Lib ${_lib_suffixes}
${_HDF5_SEARCH_OPTS}
)
- find_library( HDF5_${LIB}_LIBRARY_RELEASE
+ find_library(HDF5_${LIB}_LIBRARY_RELEASE
NAMES ${THIS_LIBRARY_SEARCH_RELEASE}
- HINTS ${HDF5_ROOT} PATH_SUFFIXES lib Lib
+ HINTS ${HDF5_ROOT} PATH_SUFFIXES lib Lib ${_lib_suffixes}
${_HDF5_SEARCH_OPTS}
)
+
select_library_configurations( HDF5_${LIB} )
- list(APPEND HDF5_${__lang}_HL_LIBRARIES ${HDF5_${LIB}_LIBRARY})
+ list(APPEND HDF5_${_lang}_HL_LIBRARIES ${HDF5_${LIB}_LIBRARY})
endforeach()
# Append the libraries for this language binding to the list of all
# required libraries.
- list(APPEND HDF5_HL_LIBRARIES ${HDF5_${__lang}_HL_LIBRARIES})
+ list(APPEND HDF5_HL_LIBRARIES ${HDF5_${_lang}_HL_LIBRARIES})
endif()
endforeach()
- if(FIND_HL AND HDF5_HL_LIBRARIES)
- set(HDF5_HL_FOUND True)
+ if(HDF5_FIND_HL AND HDF5_HL_LIBRARIES)
+ set(HDF5_HL_FOUND TRUE)
endif()
_HDF5_remove_duplicates_from_beginning(HDF5_DEFINITIONS)
@@ -903,12 +933,14 @@ if( NOT HDF5_FOUND )
endif()
endforeach()
endforeach()
+ unset(_hdr)
+ unset(_dir)
set( HDF5_IS_PARALLEL ${HDF5_IS_PARALLEL} CACHE BOOL
"HDF5 library compiled with parallel IO support" )
mark_as_advanced( HDF5_IS_PARALLEL )
set(HDF5_REQUIRED_VARS HDF5_LIBRARIES HDF5_INCLUDE_DIRS)
- if(FIND_HL)
+ if(HDF5_FIND_HL)
list(APPEND HDF5_REQUIRED_VARS HDF5_HL_LIBRARIES)
endif()
endif()
@@ -946,13 +978,15 @@ if (HDF5_FIND_DEBUG)
message(STATUS "HDF5_INCLUDE_DIRS: ${HDF5_INCLUDE_DIRS}")
message(STATUS "HDF5_LIBRARIES: ${HDF5_LIBRARIES}")
message(STATUS "HDF5_HL_LIBRARIES: ${HDF5_HL_LIBRARIES}")
- foreach(__lang IN LISTS HDF5_LANGUAGE_BINDINGS)
- message(STATUS "HDF5_${__lang}_DEFINITIONS: ${HDF5_${__lang}_DEFINITIONS}")
- message(STATUS "HDF5_${__lang}_INCLUDE_DIR: ${HDF5_${__lang}_INCLUDE_DIR}")
- message(STATUS "HDF5_${__lang}_INCLUDE_DIRS: ${HDF5_${__lang}_INCLUDE_DIRS}")
- message(STATUS "HDF5_${__lang}_LIBRARY: ${HDF5_${__lang}_LIBRARY}")
- message(STATUS "HDF5_${__lang}_LIBRARIES: ${HDF5_${__lang}_LIBRARIES}")
- message(STATUS "HDF5_${__lang}_HL_LIBRARY: ${HDF5_${__lang}_HL_LIBRARY}")
- message(STATUS "HDF5_${__lang}_HL_LIBRARIES: ${HDF5_${__lang}_HL_LIBRARIES}")
+ foreach(_lang IN LISTS HDF5_LANGUAGE_BINDINGS)
+ message(STATUS "HDF5_${_lang}_DEFINITIONS: ${HDF5_${_lang}_DEFINITIONS}")
+ message(STATUS "HDF5_${_lang}_INCLUDE_DIR: ${HDF5_${_lang}_INCLUDE_DIR}")
+ message(STATUS "HDF5_${_lang}_INCLUDE_DIRS: ${HDF5_${_lang}_INCLUDE_DIRS}")
+ message(STATUS "HDF5_${_lang}_LIBRARY: ${HDF5_${_lang}_LIBRARY}")
+ message(STATUS "HDF5_${_lang}_LIBRARIES: ${HDF5_${_lang}_LIBRARIES}")
+ message(STATUS "HDF5_${_lang}_HL_LIBRARY: ${HDF5_${_lang}_HL_LIBRARY}")
+ message(STATUS "HDF5_${_lang}_HL_LIBRARIES: ${HDF5_${_lang}_HL_LIBRARIES}")
endforeach()
endif()
+unset(_lang)
+unset(_HDF5_NEED_TO_SEARCH)
diff --git a/Modules/FindLAPACK.cmake b/Modules/FindLAPACK.cmake
index c962976..e275946 100644
--- a/Modules/FindLAPACK.cmake
+++ b/Modules/FindLAPACK.cmake
@@ -38,11 +38,23 @@ The following variables may be set to influence this module's behavior:
* ``ACML``
* ``Apple``
* ``NAS``
+ * ``Arm``
+ * ``Arm_mp``
+ * ``Arm_ilp64``
+ * ``Arm_ilp64_mp``
* ``Generic``
``BLA_F95``
if ``ON`` tries to find the BLAS95/LAPACK95 interfaces
+Imported targets
+^^^^^^^^^^^^^^^^
+
+This module defines the following :prop_tgt:`IMPORTED` target:
+
+``LAPACK::LAPACK``
+ The libraries to use for LAPACK, if found.
+
Result Variables
^^^^^^^^^^^^^^^^
@@ -359,6 +371,36 @@ if(BLAS_FOUND)
endif()
endif()
+ # ArmPL? (https://developer.arm.com/tools-and-software/server-and-hpc/compile/arm-compiler-for-linux/arm-performance-libraries)
+ if(BLA_VENDOR MATCHES "Arm" OR BLA_VENDOR STREQUAL "All")
+
+ # Check for 64bit Integer support
+ if(BLA_VENDOR MATCHES "_ilp64")
+ set(LAPACK_armpl_LIB "armpl_ilp64")
+ else()
+ set(LAPACK_armpl_LIB "armpl_lp64")
+ endif()
+
+ # Check for OpenMP support, VIA BLA_VENDOR of Arm_mp or Arm_ipl64_mp
+ if(BLA_VENDOR MATCHES "_mp")
+ set(LAPACK_armpl_LIB "${LAPACK_armpl_LIB}_mp")
+ endif()
+
+ if(NOT LAPACK_LIBRARIES)
+ check_lapack_libraries(
+ LAPACK_LIBRARIES
+ LAPACK
+ cheev
+ ""
+ "${LAPACK_armpl_LIB}"
+ ""
+ ""
+ ""
+ "${BLAS_LIBRARIES}"
+ )
+ endif()
+ endif()
+
# FLAME's blis library? (https://github.com/flame/blis)
if(BLA_VENDOR STREQUAL "FLAME" OR BLA_VENDOR STREQUAL "All")
if(NOT LAPACK_LIBRARIES)
@@ -492,5 +534,22 @@ if(LAPACK_LIBRARIES STREQUAL "LAPACK_LIBRARIES-PLACEHOLDER-FOR-EMPTY-LIBRARIES")
set(LAPACK_LIBRARIES "")
endif()
+if(NOT TARGET LAPACK::LAPACK)
+ add_library(LAPACK::LAPACK INTERFACE IMPORTED)
+ set(_lapack_libs "${LAPACK_LIBRARIES}")
+ if(_lapack_libs AND TARGET BLAS::BLAS)
+ # remove the ${BLAS_LIBRARIES} from the interface and replace it
+ # with the BLAS::BLAS target
+ list(REMOVE_ITEM _lapack_libs "${BLAS_LIBRARIES}")
+ endif()
+
+ if(_lapack_libs)
+ set_target_properties(LAPACK::LAPACK PROPERTIES
+ INTERFACE_LINK_LIBRARIES "${_lapack_libs}"
+ )
+ endif()
+ unset(_lapack_libs)
+endif()
+
cmake_pop_check_state()
set(CMAKE_FIND_LIBRARY_SUFFIXES ${_lapack_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})
diff --git a/Modules/FindLibXslt.cmake b/Modules/FindLibXslt.cmake
index 01a9d8b..fc7adeb 100644
--- a/Modules/FindLibXslt.cmake
+++ b/Modules/FindLibXslt.cmake
@@ -8,9 +8,22 @@ FindLibXslt
Find the XSL Transformations, Extensible Stylesheet Language
Transformations (XSLT) library (LibXslt)
-Once done this will define
+IMPORTED Targets
+^^^^^^^^^^^^^^^^
-::
+The following :prop_tgt:`IMPORTED` targets may be defined:
+
+``LibXslt::LibXslt``
+ If the libxslt library has been found
+``LibXslt::LibExslt``
+ If the libexslt library has been found
+``LibXslt::xsltproc``
+ If the xsltproc command-line executable has been found
+
+Result variables
+^^^^^^^^^^^^^^^^
+
+This module will set the following variables in your project:
LIBXSLT_FOUND - system has LibXslt
LIBXSLT_INCLUDE_DIR - the LibXslt include directory
@@ -21,6 +34,8 @@ Once done this will define
Additionally, the following two variables are set (but not required
for using xslt):
+``LIBXSLT_EXSLT_INCLUDE_DIR``
+ The include directory for exslt.
``LIBXSLT_EXSLT_LIBRARIES``
Link to these if you need to link against the exslt library.
``LIBXSLT_XSLTPROC_EXECUTABLE``
@@ -39,16 +54,36 @@ find_path(LIBXSLT_INCLUDE_DIR NAMES libxslt/xslt.h
${PC_LIBXSLT_INCLUDE_DIRS}
)
-find_library(LIBXSLT_LIBRARIES NAMES xslt libxslt
+# CMake 3.17 and below used 'LIBXSLT_LIBRARIES' as the name of
+# the cache entry storing the find_library result. Use the
+# value if it was set by the project or user.
+if(DEFINED LIBXSLT_LIBRARIES AND NOT DEFINED LIBXSLT_LIBRARY)
+ set(LIBXSLT_LIBRARY ${LIBXSLT_LIBRARIES})
+endif()
+
+find_library(LIBXSLT_LIBRARY NAMES xslt libxslt
HINTS
${PC_LIBXSLT_LIBDIR}
${PC_LIBXSLT_LIBRARY_DIRS}
)
+set(LIBXSLT_LIBRARIES ${LIBXSLT_LIBRARY})
+
+PKG_CHECK_MODULES(PC_LIBXSLT_EXSLT QUIET libexslt)
+set(LIBXSLT_EXSLT_DEFINITIONS ${PC_LIBXSLT_EXSLT_CFLAGS_OTHER})
+
+find_path(LIBXSLT_EXSLT_INCLUDE_DIR NAMES libexslt/exslt.h
+ HINTS
+ ${PC_LIBXSLT_EXSLT_INCLUDEDIR}
+ ${PC_LIBXSLT_EXSLT_INCLUDE_DIRS}
+)
+
find_library(LIBXSLT_EXSLT_LIBRARY NAMES exslt libexslt
HINTS
${PC_LIBXSLT_LIBDIR}
${PC_LIBXSLT_LIBRARY_DIRS}
+ ${PC_LIBXSLT_EXSLT_LIBDIR}
+ ${PC_LIBXSLT_EXSLT_LIBRARY_DIRS}
)
set(LIBXSLT_EXSLT_LIBRARIES ${LIBXSLT_EXSLT_LIBRARY} )
@@ -75,3 +110,22 @@ mark_as_advanced(LIBXSLT_INCLUDE_DIR
LIBXSLT_LIBRARIES
LIBXSLT_EXSLT_LIBRARY
LIBXSLT_XSLTPROC_EXECUTABLE)
+
+if(LIBXSLT_FOUND AND NOT TARGET LibXslt::LibXslt)
+ add_library(LibXslt::LibXslt UNKNOWN IMPORTED)
+ set_target_properties(LibXslt::LibXslt PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${LIBXSLT_INCLUDE_DIR}")
+ set_target_properties(LibXslt::LibXslt PROPERTIES INTERFACE_COMPILE_OPTIONS "${LIBXSLT_DEFINITIONS}")
+ set_property(TARGET LibXslt::LibXslt APPEND PROPERTY IMPORTED_LOCATION "${LIBXSLT_LIBRARY}")
+endif()
+
+if(LIBXSLT_FOUND AND NOT TARGET LibXslt::LibExslt)
+ add_library(LibXslt::LibExslt UNKNOWN IMPORTED)
+ set_target_properties(LibXslt::LibExslt PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${LIBXSLT_EXSLT_INCLUDE_DIR}")
+ set_target_properties(LibXslt::LibExslt PROPERTIES INTERFACE_COMPILE_OPTIONS "${LIBXSLT_EXSLT_DEFINITIONS}")
+ set_property(TARGET LibXslt::LibExslt APPEND PROPERTY IMPORTED_LOCATION "${LIBXSLT_EXSLT_LIBRARY}")
+endif()
+
+if(LIBXSLT_XSLTPROC_EXECUTABLE AND NOT TARGET LibXslt::xsltproc)
+ add_executable(LibXslt::xsltproc IMPORTED)
+ set_target_properties(LibXslt::xsltproc PROPERTIES IMPORTED_LOCATION "${LIBXSLT_XSLTPROC_EXECUTABLE}")
+endif()
diff --git a/Modules/FindMPI.cmake b/Modules/FindMPI.cmake
index cdbb927..e9b6bd2 100644
--- a/Modules/FindMPI.cmake
+++ b/Modules/FindMPI.cmake
@@ -867,11 +867,11 @@ function(_MPI_guess_settings LANG)
# We first attempt to locate the msmpi.lib. Should be find it, we'll assume that the MPI present is indeed
# Microsoft MPI.
if("${CMAKE_SIZEOF_VOID_P}" EQUAL 8)
- set(MPI_MSMPI_LIB_PATH "$ENV{MSMPI_LIB64}")
- set(MPI_MSMPI_INC_PATH_EXTRA "$ENV{MSMPI_INC}/x64")
+ file(TO_CMAKE_PATH "$ENV{MSMPI_LIB64}" MPI_MSMPI_LIB_PATH)
+ file(TO_CMAKE_PATH "$ENV{MSMPI_INC}/x64" MPI_MSMPI_INC_PATH_EXTRA)
else()
- set(MPI_MSMPI_LIB_PATH "$ENV{MSMPI_LIB32}")
- set(MPI_MSMPI_INC_PATH_EXTRA "$ENV{MSMPI_INC}/x86")
+ file(TO_CMAKE_PATH "$ENV{MSMPI_LIB32}" MPI_MSMPI_LIB_PATH)
+ file(TO_CMAKE_PATH "$ENV{MSMPI_INC}/x86" MPI_MSMPI_INC_PATH_EXTRA)
endif()
find_library(MPI_msmpi_LIBRARY
diff --git a/Modules/FindOpenAL.cmake b/Modules/FindOpenAL.cmake
index 27dcaf5..b5b92c5 100644
--- a/Modules/FindOpenAL.cmake
+++ b/Modules/FindOpenAL.cmake
@@ -5,27 +5,45 @@
FindOpenAL
----------
-
Finds Open Audio Library (OpenAL).
-This module defines ``OPENAL_LIBRARY OPENAL_FOUND``, if
-false, do not try to link to OpenAL ``OPENAL_INCLUDE_DIR``, where to find
-the headers.
-``$OPENALDIR`` is an environment variable that would correspond to the
-``./configure --prefix=$OPENALDIR`` used in building OpenAL.
+Projects using this module should use ``#include "al.h"`` to include the OpenAL
+header file, **not** ``#include <AL/al.h>``. The reason for this is that the
+latter is not entirely portable. Windows/Creative Labs does not by default put
+their headers in ``AL/`` and macOS uses the convention ``<OpenAL/al.h>``.
+
+Hints
+^^^^^
+
+Environment variable ``$OPENALDIR`` can be used to set the prefix of OpenAL
+installation to be found.
+
+By default on macOS, system framework is search first. In other words,
+OpenAL is searched in the following order:
+
+1. System framework: ``/System/Library/Frameworks``, whose priority can be
+ changed via setting the :variable:`CMAKE_FIND_FRAMEWORK` variable.
+2. Environment variable ``$OPENALDIR``.
+3. System paths.
+4. User-compiled framework: ``~/Library/Frameworks``.
+5. Manually compiled framework: ``/Library/Frameworks``.
+6. Add-on package: ``/opt``.
+
+Result Variables
+^^^^^^^^^^^^^^^^
-Created by Eric Wing. This was influenced by the ``FindSDL.cmake``
-module.
+This module defines the following variables:
+
+``OPENAL_FOUND``
+ If false, do not try to link to OpenAL
+``OPENAL_INCLUDE_DIR``
+ OpenAL include directory
+``OPENAL_LIBRARY``
+ Path to the OpenAL library
+``OPENAL_VERSION_STRING``
+ Human-readable string containing the version of OpenAL
#]=======================================================================]
-# This makes the presumption that you are include al.h like
-# #include "al.h"
-# and not
-# #include <AL/al.h>
-# The reason for this is that the latter is not entirely portable.
-# Windows/Creative Labs does not by default put their headers in AL/ and
-# OS X uses the convention <OpenAL/al.h>.
-#
# For Windows, Creative Labs seems to have added a registry key for their
# OpenAL 1.1 installer. I have added that key to the list of search paths,
# however, the key looks like it could be a little fragile depending on
@@ -36,36 +54,17 @@ module.
# platforms are introduced.
# The OpenAL 1.0 installer doesn't seem to have a useful key I can use.
# I do not know if the Nvidia OpenAL SDK has a registry key.
-#
-# For OS X, remember that OpenAL was added by Apple in 10.4 (Tiger).
-# To support the framework, I originally wrote special framework detection
-# code in this module which I have now removed with CMake's introduction
-# of native support for frameworks.
-# In addition, OpenAL is open source, and it is possible to compile on Panther.
-# Furthermore, due to bugs in the initial OpenAL release, and the
-# transition to OpenAL 1.1, it is common to need to override the built-in
-# framework.
-# Per my request, CMake should search for frameworks first in
-# the following order:
-# ~/Library/Frameworks/OpenAL.framework/Headers
-# /Library/Frameworks/OpenAL.framework/Headers
-# /System/Library/Frameworks/OpenAL.framework/Headers
-#
-# On OS X, this will prefer the Framework version (if found) over others.
-# People will have to manually change the cache values of
-# OPENAL_LIBRARY to override this selection or set the CMake environment
-# CMAKE_INCLUDE_PATH to modify the search paths.
find_path(OPENAL_INCLUDE_DIR al.h
HINTS
ENV OPENALDIR
- PATH_SUFFIXES include/AL include/OpenAL include AL OpenAL
PATHS
- ~/Library/Frameworks
- /Library/Frameworks
- /opt
- [HKEY_LOCAL_MACHINE\\SOFTWARE\\Creative\ Labs\\OpenAL\ 1.1\ Software\ Development\ Kit\\1.00.0000;InstallDir]
-)
+ ~/Library/Frameworks
+ /Library/Frameworks
+ /opt
+ [HKEY_LOCAL_MACHINE\\SOFTWARE\\Creative\ Labs\\OpenAL\ 1.1\ Software\ Development\ Kit\\1.00.0000;InstallDir]
+ PATH_SUFFIXES include/AL include/OpenAL include AL OpenAL
+ )
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set(_OpenAL_ARCH_DIR libs/Win64)
@@ -77,17 +76,21 @@ find_library(OPENAL_LIBRARY
NAMES OpenAL al openal OpenAL32
HINTS
ENV OPENALDIR
- PATH_SUFFIXES libx32 lib64 lib libs64 libs ${_OpenAL_ARCH_DIR}
PATHS
- ~/Library/Frameworks
- /Library/Frameworks
- /opt
- [HKEY_LOCAL_MACHINE\\SOFTWARE\\Creative\ Labs\\OpenAL\ 1.1\ Software\ Development\ Kit\\1.00.0000;InstallDir]
-)
+ ~/Library/Frameworks
+ /Library/Frameworks
+ /opt
+ [HKEY_LOCAL_MACHINE\\SOFTWARE\\Creative\ Labs\\OpenAL\ 1.1\ Software\ Development\ Kit\\1.00.0000;InstallDir]
+ PATH_SUFFIXES libx32 lib64 lib libs64 libs ${_OpenAL_ARCH_DIR}
+ )
unset(_OpenAL_ARCH_DIR)
include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
-FIND_PACKAGE_HANDLE_STANDARD_ARGS(OpenAL DEFAULT_MSG OPENAL_LIBRARY OPENAL_INCLUDE_DIR)
+find_package_handle_standard_args(
+ OpenAL
+ REQUIRED_VARS OPENAL_LIBRARY OPENAL_INCLUDE_DIR
+ VERSION_VAR OPENAL_VERSION_STRING
+ )
mark_as_advanced(OPENAL_LIBRARY OPENAL_INCLUDE_DIR)
diff --git a/Modules/FindOpenCL.cmake b/Modules/FindOpenCL.cmake
index 9891724..34a203e 100644
--- a/Modules/FindOpenCL.cmake
+++ b/Modules/FindOpenCL.cmake
@@ -78,6 +78,8 @@ find_path(OpenCL_INCLUDE_DIR
ENV CUDA_PATH
ENV ATISTREAMSDKROOT
ENV OCL_ROOT
+ /usr/local/cuda
+ /opt/cuda
PATH_SUFFIXES
include
OpenCL/common/inc
@@ -126,6 +128,8 @@ else()
PATHS
ENV AMDAPPSDKROOT
ENV CUDA_PATH
+ /usr/local/cuda
+ /opt/cuda
PATH_SUFFIXES
lib/x86
lib)
@@ -135,6 +139,8 @@ else()
PATHS
ENV AMDAPPSDKROOT
ENV CUDA_PATH
+ /usr/local/cuda
+ /opt/cuda
PATH_SUFFIXES
lib/x86_64
lib/x64
diff --git a/Modules/FindOpenSSL.cmake b/Modules/FindOpenSSL.cmake
index af713d6..a813ab5 100644
--- a/Modules/FindOpenSSL.cmake
+++ b/Modules/FindOpenSSL.cmake
@@ -22,6 +22,27 @@ This module defines the following :prop_tgt:`IMPORTED` targets:
The OpenSSL ``ssl`` library, if found.
``OpenSSL::Crypto``
The OpenSSL ``crypto`` library, if found.
+``OpenSSL::applink``
+ The OpenSSL ``applink`` components that might be need to be compiled into
+ projects under MSVC. This target is available only if found OpenSSL version
+ is not less than 0.9.8. By linking this target the above OpenSSL targets can
+ be linked even if the project has different MSVC runtime configurations with
+ the above OpenSSL targets. This target has no effect on plaforms other than
+ MSVC.
+
+NOTE: Due to how ``INTERFACE_SOURCES`` are consumed by the consuming target,
+unless you certainly know what you are doing, it is always prefered to link
+``OpenSSL::applink`` target as ``PRIVATE`` and to make sure that this target is
+linked at most once for the whole dependency graph of any library or
+executable:
+
+.. code-block:: cmake
+
+ target_link_libraries(myTarget PRIVATE OpenSSL::applink)
+
+Otherwise you would probably encounter unexpected random problems when building
+and linking, as both the ISO C and the ISO C++ standard claims almost nothing
+about what a link process should be.
Result Variables
^^^^^^^^^^^^^^^^
@@ -45,6 +66,10 @@ This module will set the following variables in your project:
All OpenSSL libraries and their dependencies.
``OPENSSL_VERSION``
This is set to ``$major.$minor.$revision$patch`` (e.g. ``0.9.8s``).
+``OPENSSL_APPLINK_SOURCE``
+ The sources in the target ``OpenSSL::applink`` that is mentioned above. This
+ variable shall always be undefined if found openssl version is less than
+ 0.9.8 or if platform is not MSVC.
Hints
^^^^^
@@ -524,6 +549,28 @@ if(OPENSSL_FOUND)
endif()
_OpenSSL_target_add_dependencies(OpenSSL::SSL)
endif()
+
+ if("${OPENSSL_VERSION_MAJOR}.${OPENSSL_VERSION_MAJOR}.${OPENSSL_VERSION_FIX}" VERSION_GREATER_EQUAL "0.9.8")
+ if(MSVC)
+ if(EXISTS "${OPENSSL_INCLUDE_DIR}")
+ set(_OPENSSL_applink_paths PATHS ${OPENSSL_INCLUDE_DIR})
+ endif()
+ find_file(OPENSSL_APPLINK_SOURCE
+ NAMES
+ openssl/applink.c
+ ${_OPENSSL_applink_paths}
+ NO_DEFAULT_PATH)
+ if(OPENSSL_APPLINK_SOURCE)
+ set(_OPENSSL_applink_interface_srcs ${OPENSSL_APPLINK_SOURCE})
+ endif()
+ endif()
+ if(NOT TARGET OpenSSL::applink)
+ add_library(OpenSSL::applink INTERFACE IMPORTED)
+ set_property(TARGET OpenSSL::applink APPEND
+ PROPERTY INTERFACE_SOURCES
+ ${_OPENSSL_applink_interface_srcs})
+ endif()
+ endif()
endif()
# Restore the original find library ordering
diff --git a/Modules/FindPackageHandleStandardArgs.cmake b/Modules/FindPackageHandleStandardArgs.cmake
index a078049..4fb0825 100644
--- a/Modules/FindPackageHandleStandardArgs.cmake
+++ b/Modules/FindPackageHandleStandardArgs.cmake
@@ -57,7 +57,8 @@ valid filepaths.
These may be named in the generated failure message asking the
user to set the missing variable values. Therefore these should
typically be cache entries such as ``FOO_LIBRARY`` and not output
- variables like ``FOO_LIBRARIES``.
+ variables like ``FOO_LIBRARIES``. This option is mandatory if
+ ``HANDLE_COMPONENTS`` is not specified.
``VERSION_VAR <version-var>``
Specify the name of a variable that holds the version of the package
@@ -257,7 +258,7 @@ function(FIND_PACKAGE_HANDLE_STANDARD_ARGS _NAME _FIRST_ARG)
set(FPHSA_VERSION_VAR ${_NAME}_VERSION)
endif()
- if(NOT FPHSA_REQUIRED_VARS)
+ if(NOT FPHSA_REQUIRED_VARS AND NOT FPHSA_HANDLE_COMPONENTS)
message(FATAL_ERROR "No REQUIRED_VARS specified for FIND_PACKAGE_HANDLE_STANDARD_ARGS()")
endif()
endif()
@@ -283,7 +284,9 @@ function(FIND_PACKAGE_HANDLE_STANDARD_ARGS _NAME _FIRST_ARG)
set(FPHSA_FAIL_MESSAGE "Could NOT find ${_NAME}")
endif()
- list(GET FPHSA_REQUIRED_VARS 0 _FIRST_REQUIRED_VAR)
+ if (FPHSA_REQUIRED_VARS)
+ list(GET FPHSA_REQUIRED_VARS 0 _FIRST_REQUIRED_VAR)
+ endif()
string(TOUPPER ${_NAME} _NAME_UPPER)
string(TOLOWER ${_NAME} _NAME_LOWER)
@@ -440,7 +443,17 @@ function(FIND_PACKAGE_HANDLE_STANDARD_ARGS _NAME _FIRST_ARG)
_FPHSA_HANDLE_FAILURE_CONFIG_MODE()
else()
if(NOT VERSION_OK)
- _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE}: ${VERSION_MSG} (found ${${_FIRST_REQUIRED_VAR}})")
+ set(RESULT_MSG)
+ if (_FIRST_REQUIRED_VAR)
+ string (APPEND RESULT_MSG "found ${${_FIRST_REQUIRED_VAR}}")
+ endif()
+ if (COMPONENT_MSG)
+ if (RESULT_MSG)
+ string (APPEND RESULT_MSG ", ")
+ endif()
+ string (APPEND RESULT_MSG "${FOUND_COMPONENTS_MSG}")
+ endif()
+ _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE}: ${VERSION_MSG} (${RESULT_MSG})")
else()
_FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE} (missing:${MISSING_VARS}) ${VERSION_MSG}")
endif()
diff --git a/Modules/FindPkgConfig.cmake b/Modules/FindPkgConfig.cmake
index 28de575..93827d8 100644
--- a/Modules/FindPkgConfig.cmake
+++ b/Modules/FindPkgConfig.cmake
@@ -34,16 +34,31 @@ endif()
find_program(PKG_CONFIG_EXECUTABLE NAMES pkg-config DOC "pkg-config executable")
mark_as_advanced(PKG_CONFIG_EXECUTABLE)
+set(_PKG_CONFIG_FAILURE_MESSAGE "")
if (PKG_CONFIG_EXECUTABLE)
execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} --version
- OUTPUT_VARIABLE PKG_CONFIG_VERSION_STRING
- ERROR_QUIET
- OUTPUT_STRIP_TRAILING_WHITESPACE)
+ OUTPUT_VARIABLE PKG_CONFIG_VERSION_STRING OUTPUT_STRIP_TRAILING_WHITESPACE
+ ERROR_VARIABLE _PKG_CONFIG_VERSION_ERROR ERROR_STRIP_TRAILING_WHITESPACE
+ RESULT_VARIABLE _PKG_CONFIG_VERSION_RESULT
+ )
+
+ if (NOT _PKG_CONFIG_VERSION_RESULT EQUAL 0)
+ string(REPLACE "\n" "\n " _PKG_CONFIG_VERSION_ERROR " ${_PKG_CONFIG_VERSION_ERROR}")
+ string(APPEND _PKG_CONFIG_FAILURE_MESSAGE
+ "The command\n"
+ " \"${PKG_CONFIG_EXECUTABLE}\" --version\n"
+ " failed with output\n${_PKG_CONFIG_VERSION_ERROR}"
+ )
+ set(PKG_CONFIG_EXECUTABLE "")
+ unset(PKG_CONFIG_VERSION_STRING)
+ endif ()
+ unset(_PKG_CONFIG_VERSION_RESULT)
endif ()
include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
find_package_handle_standard_args(PkgConfig
REQUIRED_VARS PKG_CONFIG_EXECUTABLE
+ REASON_FAILURE_MESSAGE "${_PKG_CONFIG_FAILURE_MESSAGE}"
VERSION_VAR PKG_CONFIG_VERSION_STRING)
# This is needed because the module name is "PkgConfig" but the name of
@@ -197,7 +212,13 @@ function(_pkg_find_libs _prefix _no_cmake_path _no_cmake_environment_path)
endif()
unset(_search_paths)
+ unset(_next_is_framework)
foreach (flag IN LISTS ${_prefix}_LDFLAGS)
+ if (_next_is_framework)
+ list(APPEND _libs "-framework ${flag}")
+ unset(_next_is_framework)
+ continue()
+ endif ()
if (flag MATCHES "^-L(.*)")
list(APPEND _search_paths ${CMAKE_MATCH_1})
continue()
@@ -205,6 +226,9 @@ function(_pkg_find_libs _prefix _no_cmake_path _no_cmake_environment_path)
if (flag MATCHES "^-l(.*)")
set(_pkg_search "${CMAKE_MATCH_1}")
else()
+ if (flag STREQUAL "-framework")
+ set(_next_is_framework TRUE)
+ endif ()
continue()
endif()
@@ -364,6 +388,30 @@ macro(_pkg_restore_path_internal)
unset(_pkgconfig_path_old)
endmacro()
+# pkg-config returns frameworks in --libs-only-other
+# they need to be in ${_prefix}_LIBRARIES so "-framework a -framework b" does
+# not incorrectly be combined to "-framework a b"
+function(_pkgconfig_extract_frameworks _prefix)
+ set(ldflags "${${_prefix}_LDFLAGS_OTHER}")
+ list(FIND ldflags "-framework" FR_POS)
+ list(LENGTH ldflags LD_LENGTH)
+
+ # reduce length by 1 as we need "-framework" and the next entry
+ math(EXPR LD_LENGTH "${LD_LENGTH} - 1")
+ while (FR_POS GREATER -1 AND LD_LENGTH GREATER FR_POS)
+ list(REMOVE_AT ldflags ${FR_POS})
+ list(GET ldflags ${FR_POS} HEAD)
+ list(REMOVE_AT ldflags ${FR_POS})
+ math(EXPR LD_LENGTH "${LD_LENGTH} - 2")
+
+ list(APPEND LIBS "-framework ${HEAD}")
+
+ list(FIND ldflags "-framework" FR_POS)
+ endwhile ()
+ set(${_prefix}_LIBRARIES ${${_prefix}_LIBRARIES} ${LIBS} PARENT_SCOPE)
+ set(${_prefix}_LDFLAGS_OTHER "${ldflags}" PARENT_SCOPE)
+endfunction()
+
# pkg-config returns -isystem include directories in --cflags-only-other,
# depending on the version and if there is a space between -isystem and
# the actual path
@@ -532,6 +580,10 @@ macro(_pkg_check_modules_internal _is_required _is_silent _no_cmake_path _no_cma
_pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" LDFLAGS "" --libs )
_pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" LDFLAGS_OTHER "" --libs-only-other )
+ if (APPLE AND "-framework" IN_LIST ${_prefix}_LDFLAGS_OTHER)
+ _pkgconfig_extract_frameworks("${_prefix}")
+ endif()
+
_pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" INCLUDE_DIRS "(^| )(-I|-isystem ?)" --cflags-only-I )
_pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" CFLAGS "" --cflags )
_pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" CFLAGS_OTHER "" --cflags-only-other )
diff --git a/Modules/FindPython.cmake b/Modules/FindPython.cmake
index 32ef120..01b82c4 100644
--- a/Modules/FindPython.cmake
+++ b/Modules/FindPython.cmake
@@ -13,13 +13,24 @@ The following components are supported:
* ``Interpreter``: search for Python interpreter.
* ``Compiler``: search for Python compiler. Only offered by IronPython.
* ``Development``: search for development artifacts (include directories and
- libraries).
+ libraries). This component includes two sub-components which can be specified
+ independently:
+
+ * ``Development.Module``: search for artifacts for Python module
+ developments.
+ * ``Development.Embed``: search for artifacts for Python embedding
+ developments.
+
* ``NumPy``: search for NumPy include directories.
If no ``COMPONENTS`` are specified, ``Interpreter`` is assumed.
+If component ``Development`` is specified, it implies sub-components
+``Development.Module`` and ``Development.Embed``.
+
To ensure consistent versions between components ``Interpreter``, ``Compiler``,
-``Development`` and ``NumPy``, specify all components at the same time::
+``Development`` (or one of its sub-components) and ``NumPy``, specify all
+components at the same time::
find_package (Python COMPONENTS Interpreter Development)
@@ -30,10 +41,11 @@ To manage concurrent versions 3 and 2 of Python, use :module:`FindPython3` and
.. note::
- If components ``Interpreter`` and ``Development`` are both specified, this
- module search only for interpreter with same platform architecture as the one
- defined by ``CMake`` configuration. This contraint does not apply if only
- ``Interpreter`` component is specified.
+ If components ``Interpreter`` and ``Development`` (or one of its
+ sub-components) are both specified, this module search only for interpreter
+ with same platform architecture as the one defined by ``CMake``
+ configuration. This contraint does not apply if only ``Interpreter``
+ component is specified.
Imported Targets
^^^^^^^^^^^^^^^^
@@ -45,12 +57,12 @@ This module defines the following :ref:`Imported Targets <Imported Targets>`
Python interpreter. Target defined if component ``Interpreter`` is found.
``Python::Compiler``
Python compiler. Target defined if component ``Compiler`` is found.
+``Python::Module``
+ Python library for Python module. Target defined if component
+ ``Development.Module`` is found.
``Python::Python``
Python library for Python embedding. Target defined if component
- ``Development`` is found.
-``Python::Module``
- Python library for Python module. Target defined if component ``Development``
- is found.
+ ``Development.Embed`` is found.
``Python::NumPy``
NumPy Python library. Target defined if component ``NumPy`` is found.
@@ -73,33 +85,40 @@ This module will set the following variables in your project
* Anaconda
* Canopy
* IronPython
+ * PyPy
``Python_STDLIB``
Standard platform independent installation directory.
Information returned by
- ``distutils.sysconfig.get_python_lib(plat_specific=False,standard_lib=True)``.
+ ``distutils.sysconfig.get_python_lib(plat_specific=False,standard_lib=True)``
+ or else ``sysconfig.get_path('stdlib')``.
``Python_STDARCH``
Standard platform dependent installation directory.
Information returned by
- ``distutils.sysconfig.get_python_lib(plat_specific=True,standard_lib=True)``.
+ ``distutils.sysconfig.get_python_lib(plat_specific=True,standard_lib=True)``
+ or else ``sysconfig.get_path('platstdlib')``.
``Python_SITELIB``
Third-party platform independent installation directory.
Information returned by
- ``distutils.sysconfig.get_python_lib(plat_specific=False,standard_lib=False)``.
+ ``distutils.sysconfig.get_python_lib(plat_specific=False,standard_lib=False)``
+ or else ``sysconfig.get_path('purelib')``.
``Python_SITEARCH``
Third-party platform dependent installation directory.
Information returned by
- ``distutils.sysconfig.get_python_lib(plat_specific=True,standard_lib=False)``.
+ ``distutils.sysconfig.get_python_lib(plat_specific=True,standard_lib=False)``
+ or else ``sysconfig.get_path('platlib')``.
``Python_SOABI``
Extension suffix for modules.
Information returned by
- ``distutils.sysconfig.get_config_flag('SOABI')`` or computed from
- ``distutils.sysconfig.get_config_flag('EXT_SUFFIX')`` or
- ``python-config --extension-suffix``.
+ ``distutils.sysconfig.get_config_var('SOABI')`` or computed from
+ ``distutils.sysconfig.get_config_var('EXT_SUFFIX')`` or
+ ``python-config --extension-suffix``. If package ``distutils.sysconfig`` is
+ not available, ``sysconfig.get_config_var('SOABI')`` or
+ ``sysconfig.get_config_var('EXT_SUFFIX')`` are used.
``Python_Compiler_FOUND``
System has the Python compiler.
``Python_COMPILER``
@@ -107,8 +126,14 @@ This module will set the following variables in your project
``Python_COMPILER_ID``
A short string unique to the compiler. Possible values include:
* IronPython
+``Python_DOTNET_LAUNCHER``
+ The ``.Net`` interpreter. Only used by ``IronPython`` implementation.
``Python_Development_FOUND``
System has the Python development artifacts.
+``Python_Development.Module_FOUND``
+ System has the Python development artifacts for Python module.
+``Python_Development.Embed_FOUND``
+ System has the Python development artifacts for Python embedding.
``Python_INCLUDE_DIRS``
The Python include directories.
``Python_LIBRARIES``
@@ -125,6 +150,8 @@ This module will set the following variables in your project
Python minor version.
``Python_VERSION_PATCH``
Python patch version.
+``Python_PyPy_VERSION``
+ Python PyPy version.
``Python_NumPy_FOUND``
System has the NumPy.
``Python_NumPy_INCLUDE_DIRS``
@@ -237,8 +264,9 @@ Hints
* ``ONLY``: Only the virtual environment is used to look-up for the
interpreter.
* ``STANDARD``: The virtual environment is not used to look-up for the
- interpreter. In this case, variable ``Python_FIND_REGISTRY`` (Windows)
- or ``CMAKE_FIND_FRAMEWORK`` (macOS) can be set with value ``LAST`` or
+ interpreter but environment variable ``PATH`` is always considered.
+ In this case, variable ``Python_FIND_REGISTRY`` (Windows) or
+ ``CMAKE_FIND_FRAMEWORK`` (macOS) can be set with value ``LAST`` or
``NEVER`` to select preferably the interpreter from the virtual
environment.
@@ -248,6 +276,39 @@ Hints
recommended to also include the component ``Interpreter`` to get expected
result.
+``Python_FIND_IMPLEMENTATIONS``
+ This variable defines, in an ordered list, the different implementations
+ which will be searched. The ``Python_FIND_IMPLEMENTATIONS`` variable can
+ hold the following values:
+
+ * ``CPython``: this is the standard implementation. Various products, like
+ ``Anaconda`` or ``ActivePython``, rely on this implementation.
+ * ``IronPython``: This implementation use the ``CSharp`` language for
+ ``.NET Framework`` on top of the `Dynamic Language Runtime` (``DLR``).
+ See `IronPython <http://ironpython.net>`_.
+ * ``PyPy``: This implementation use ``RPython`` language and
+ ``RPython translation toolchain`` to produce the python interpreter.
+ See `PyPy <https://www.pypy.org>`_.
+
+ The default value is:
+
+ * Windows platform: ``CPython``, ``IronPython``
+ * Other platforms: ``CPython``
+
+ .. note::
+
+ This hint has the lowest priority of all hints, so even if, for example,
+ you specify ``IronPython`` first and ``CPython`` in second, a python
+ product based on ``CPython`` can be selected because, for example with
+ ``Python_FIND_STRATEGY=LOCATION``, each location will be search first for
+ ``IronPython`` and second for ``CPython``.
+
+ .. note::
+
+ When ``IronPython`` is specified, on platforms other than ``Windows``, the
+ ``.Net`` interpreter (i.e. ``mono`` command) is expected to be available
+ through the ``PATH`` variable.
+
Artifacts Specification
^^^^^^^^^^^^^^^^^^^^^^^
@@ -260,6 +321,9 @@ setting the following variables:
``Python_COMPILER``
The path to the compiler.
+``Python_DOTNET_LAUNCHER``
+ The ``.Net`` interpreter. Only used by ``IronPython`` implementation.
+
``Python_LIBRARY``
The path to the library. It will be used to compute the
variables ``Python_LIBRARIES``, ``Python_LIBRAY_DIRS`` and
@@ -286,6 +350,22 @@ setting the following variables:
If more than one artifact is specified, it is the user's responsability to
ensure the consistency of the various artifacts.
+By default, this module supports multiple calls in different directories of a
+project with different version/component requirements while providing correct
+and consistent results for each call. To support this behavior, ``CMake`` cache
+is not used in the traditional way which can be problematic for interactive
+specification. So, to enable also interactive specification, module behavior
+can be controled with the following variable:
+
+``Python_ARTIFACTS_INTERACTIVE``
+ Selects the behavior of the module. This is a boolean variable:
+
+ * If set to ``TRUE``: Create CMake cache entries for the above artifact
+ specification variables so that users can edit them interactively.
+ This disables support for multiple version/component requirements.
+ * If set to ``FALSE`` or undefined: Enable multiple version/component
+ requirements.
+
Commands
^^^^^^^^
diff --git a/Modules/FindPython/Support.cmake b/Modules/FindPython/Support.cmake
index 8aa7b97..1be0625 100644
--- a/Modules/FindPython/Support.cmake
+++ b/Modules/FindPython/Support.cmake
@@ -75,71 +75,135 @@ macro (_PYTHON_SELECT_LIBRARY_CONFIGURATIONS _PYTHON_BASENAME)
(_PYTHON_isMultiConfig OR CMAKE_BUILD_TYPE))
# if the generator is multi-config or if CMAKE_BUILD_TYPE is set for
# single-config generators, set optimized and debug libraries
- set (${_PYTHON_BASENAME}_LIBRARY "")
- foreach (_PYTHON_libname IN LISTS ${_PYTHON_BASENAME}_LIBRARY_RELEASE )
- list( APPEND ${_PYTHON_BASENAME}_LIBRARY optimized "${_PYTHON_libname}" )
+ set (${_PYTHON_BASENAME}_LIBRARIES "")
+ foreach (_PYTHON_libname IN LISTS ${_PYTHON_BASENAME}_LIBRARY_RELEASE)
+ list( APPEND ${_PYTHON_BASENAME}_LIBRARIES optimized "${_PYTHON_libname}")
endforeach()
- foreach (_PYTHON_libname IN LISTS ${_PYTHON_BASENAME}_LIBRARY_DEBUG )
- list( APPEND ${_PYTHON_BASENAME}_LIBRARY debug "${_PYTHON_libname}" )
+ foreach (_PYTHON_libname IN LISTS ${_PYTHON_BASENAME}_LIBRARY_DEBUG)
+ list( APPEND ${_PYTHON_BASENAME}_LIBRARIES debug "${_PYTHON_libname}")
endforeach()
elseif (${_PYTHON_BASENAME}_LIBRARY_RELEASE)
- set (${_PYTHON_BASENAME}_LIBRARY "${${_PYTHON_BASENAME}_LIBRARY_RELEASE}")
+ set (${_PYTHON_BASENAME}_LIBRARIES "${${_PYTHON_BASENAME}_LIBRARY_RELEASE}")
elseif (${_PYTHON_BASENAME}_LIBRARY_DEBUG)
- set (${_PYTHON_BASENAME}_LIBRARY "${${_PYTHON_BASENAME}_LIBRARY_DEBUG}")
+ set (${_PYTHON_BASENAME}_LIBRARIES "${${_PYTHON_BASENAME}_LIBRARY_DEBUG}")
else()
- set (${_PYTHON_BASENAME}_LIBRARY "${_PYTHON_BASENAME}_LIBRARY-NOTFOUND")
+ set (${_PYTHON_BASENAME}_LIBRARIES "${_PYTHON_BASENAME}_LIBRARY-NOTFOUND")
endif()
-
- set (${_PYTHON_BASENAME}_LIBRARIES "${${_PYTHON_BASENAME}_LIBRARY}")
endmacro()
macro (_PYTHON_FIND_FRAMEWORKS)
- set (${_PYTHON_PREFIX}_FRAMEWORKS)
if (CMAKE_HOST_APPLE OR APPLE)
file(TO_CMAKE_PATH "$ENV{CMAKE_FRAMEWORK_PATH}" _pff_CMAKE_FRAMEWORK_PATH)
set (_pff_frameworks ${CMAKE_FRAMEWORK_PATH}
- ${_pff_CMAKE_FRAMEWORK_PATH}
- ~/Library/Frameworks
- /usr/local/Frameworks
- ${CMAKE_SYSTEM_FRAMEWORK_PATH})
+ ${_pff_CMAKE_FRAMEWORK_PATH}
+ ~/Library/Frameworks
+ /usr/local/Frameworks
+ ${CMAKE_SYSTEM_FRAMEWORK_PATH})
list (REMOVE_DUPLICATES _pff_frameworks)
- foreach (_pff_framework IN LISTS _pff_frameworks)
- if (EXISTS ${_pff_framework}/Python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}.framework)
- list (APPEND ${_PYTHON_PREFIX}_FRAMEWORKS ${_pff_framework}/Python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}.framework)
- endif()
- if (EXISTS ${_pff_framework}/Python.framework)
- list (APPEND ${_PYTHON_PREFIX}_FRAMEWORKS ${_pff_framework}/Python.framework)
+ foreach (_pff_implementation IN LISTS _${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS)
+ unset (_${_PYTHON_PREFIX}_${_pff_implementation}_FRAMEWORKS)
+ if (_pff_implementation STREQUAL "CPython")
+ foreach (_pff_framework IN LISTS _pff_frameworks)
+ if (EXISTS ${_pff_framework}/Python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}.framework)
+ list (APPEND _${_PYTHON_PREFIX}_${_pff_implementation}_FRAMEWORKS ${_pff_framework}/Python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}.framework)
+ endif()
+ if (EXISTS ${_pff_framework}/Python.framework)
+ list (APPEND _${_PYTHON_PREFIX}_${_pff_implementation}_FRAMEWORKS ${_pff_framework}/Python.framework)
+ endif()
+ endforeach()
+ elseif (_pff_implementation STREQUAL "IronPython")
+ foreach (_pff_framework IN LISTS _pff_frameworks)
+ if (EXISTS ${_pff_framework}/IronPython.framework)
+ list (APPEND _${_PYTHON_PREFIX}_${_pff_implementation}_FRAMEWORKS ${_pff_framework}/IronPython.framework)
+ endif()
+ endforeach()
endif()
endforeach()
+ unset (_pff_implementation)
unset (_pff_frameworks)
unset (_pff_framework)
endif()
endmacro()
-function (_PYTHON_GET_FRAMEWORKS _PYTHON_PGF_FRAMEWORK_PATHS _PYTHON_VERSION)
- set (_PYTHON_FRAMEWORK_PATHS)
- foreach (_PYTHON_FRAMEWORK IN LISTS ${_PYTHON_PREFIX}_FRAMEWORKS)
- list (APPEND _PYTHON_FRAMEWORK_PATHS
- "${_PYTHON_FRAMEWORK}/Versions/${_PYTHON_VERSION}")
+function (_PYTHON_GET_FRAMEWORKS _PYTHON_PGF_FRAMEWORK_PATHS)
+ cmake_parse_arguments (PARSE_ARGV 1 _PGF "" "" "IMPLEMENTATIONS;VERSION")
+
+ if (NOT _PGF_IMPLEMENTATIONS)
+ set (_PGF_IMPLEMENTATIONS ${_${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS})
+ endif()
+
+ set (framework_paths)
+
+ foreach (implementation IN LISTS _PGF_IMPLEMENTATIONS)
+ if (implementation STREQUAL "CPython")
+ foreach (version IN LISTS _PGF_VERSION)
+ foreach (framework IN LISTS _${_PYTHON_PREFIX}_${implementation}_FRAMEWORKS)
+ if (EXISTS "${framework}/Versions/${version}")
+ list (APPEND framework_paths "${framework}/Versions/${version}")
+ endif()
+ endforeach()
+ endforeach()
+ elseif (implementation STREQUAL "IronPython")
+ foreach (version IN LISTS _PGF_VERSION)
+ foreach (framework IN LISTS _${_PYTHON_PREFIX}_${implementation}_FRAMEWORKS)
+ # pick-up all available versions
+ file (GLOB versions LIST_DIRECTORIES true RELATIVE "${framework}/Versions/"
+ "${framework}/Versions/${version}*")
+ list (SORT versions ORDER DESCENDING)
+ list (TRANSFORM versions PREPEND "${framework}/Versions/")
+ list (APPEND framework_paths ${versions})
+ endforeach()
+ endforeach()
+ endif()
endforeach()
- set (${_PYTHON_PGF_FRAMEWORK_PATHS} ${_PYTHON_FRAMEWORK_PATHS} PARENT_SCOPE)
+
+ set (${_PYTHON_PGF_FRAMEWORK_PATHS} ${framework_paths} PARENT_SCOPE)
endfunction()
-function (_PYTHON_GET_REGISTRIES _PYTHON_PGR_REGISTRY_PATHS _PYTHON_VERSION)
- string (REPLACE "." "" _PYTHON_VERSION_NO_DOTS ${_PYTHON_VERSION})
- set (${_PYTHON_PGR_REGISTRY_PATHS}
- [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_PYTHON_VERSION}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
- [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_PYTHON_VERSION}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
- [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_PYTHON_VERSION}\\InstallPath]
- [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_PYTHON_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
- [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_PYTHON_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
- [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_PYTHON_VERSION}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
- [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_PYTHON_VERSION}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
- [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_PYTHON_VERSION}\\InstallPath]
- [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_PYTHON_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
- [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_PYTHON_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
- PARENT_SCOPE)
+function (_PYTHON_GET_REGISTRIES _PYTHON_PGR_REGISTRY_PATHS)
+ cmake_parse_arguments (PARSE_ARGV 1 _PGR "" "" "IMPLEMENTATIONS;VERSION")
+
+ if (NOT _PGR_IMPLEMENTATIONS)
+ set (_PGR_IMPLEMENTATIONS ${_${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS})
+ endif()
+
+ set (registries)
+
+ foreach (implementation IN LISTS _PGR_IMPLEMENTATIONS)
+ if (implementation STREQUAL "CPython")
+ foreach (version IN LISTS _PGR_VERSION)
+ string (REPLACE "." "" version_no_dots ${version})
+ list (APPEND registries
+ [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${version}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
+ [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${version}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath])
+ if (version VERSION_GREATER_EQUAL "3.5")
+ get_filename_component (arch "[HKEY_CURRENT_USER\\Software\\Python\\PythonCore\\${version};SysArchitecture]" NAME)
+ if (arch MATCHES "(${_${_PYTHON_PREFIX}_ARCH}|${_${_PYTHON_PREFIX}_ARCH2})bit")
+ list (APPEND registries
+ [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${version}\\InstallPath])
+ endif()
+ else()
+ list (APPEND registries
+ [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${version}\\InstallPath])
+ endif()
+ list (APPEND registries
+ [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${version_no_dots}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
+ [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${version_no_dots}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
+ [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${version}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
+ [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${version}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
+ [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${version}\\InstallPath]
+ [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${version_no_dots}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
+ [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${version_no_dots}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath])
+ endforeach()
+ elseif (implementation STREQUAL "IronPython")
+ foreach (version IN LISTS _PGR_VERSION)
+ list (APPEND registries [HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${version}\\InstallPath])
+ endforeach()
+ endif()
+ endforeach()
+
+ set (${_PYTHON_PGR_REGISTRY_PATHS} "${registries}" PARENT_SCOPE)
endfunction()
@@ -187,7 +251,11 @@ function (_PYTHON_GET_ABIFLAGS _PGABIFLAGS)
endfunction()
function (_PYTHON_GET_PATH_SUFFIXES _PYTHON_PGPS_PATH_SUFFIXES)
- cmake_parse_arguments (PARSE_ARGV 1 _PGPS "LIBRARY;INCLUDE" "VERSION" "")
+ cmake_parse_arguments (PARSE_ARGV 1 _PGPS "INTERPRETER;COMPILER;LIBRARY;INCLUDE" "" "IMPLEMENTATIONS;VERSION")
+
+ if (NOT _PGPS_IMPLEMENTATIONS)
+ set (_PGPS_IMPLEMENTATIONS ${_${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS})
+ endif()
if (DEFINED _${_PYTHON_PREFIX}_ABIFLAGS)
set (abi "${_${_PYTHON_PREFIX}_ABIFLAGS}")
@@ -196,93 +264,163 @@ function (_PYTHON_GET_PATH_SUFFIXES _PYTHON_PGPS_PATH_SUFFIXES)
endif()
set (path_suffixes)
- if (_PGPS_LIBRARY)
- if (CMAKE_LIBRARY_ARCHITECTURE)
- list (APPEND path_suffixes lib/${CMAKE_LIBRARY_ARCHITECTURE})
- endif()
- list (APPEND path_suffixes lib libs)
- if (CMAKE_LIBRARY_ARCHITECTURE)
- set (suffixes "${abi}")
- if (suffixes)
- list (TRANSFORM suffixes PREPEND "lib/python${_PGPS_VERSION}/config-${_PGPS_VERSION}")
- list (TRANSFORM suffixes APPEND "-${CMAKE_LIBRARY_ARCHITECTURE}")
+ foreach (implementation IN LISTS _PGPS_IMPLEMENTATIONS)
+ if (implementation STREQUAL "CPython")
+ if (_PGPS_INTERPRETER)
+ list (APPEND path_suffixes bin Scripts)
else()
- set (suffixes "lib/python${_PGPS_VERSION}/config-${_PGPS_VERSION}-${CMAKE_LIBRARY_ARCHITECTURE}")
+ foreach (version IN LISTS _PGPS_VERSION)
+ if (_PGPS_LIBRARY)
+ if (CMAKE_LIBRARY_ARCHITECTURE)
+ list (APPEND path_suffixes lib/${CMAKE_LIBRARY_ARCHITECTURE})
+ endif()
+ list (APPEND path_suffixes lib libs)
+
+ if (CMAKE_LIBRARY_ARCHITECTURE)
+ set (suffixes "${abi}")
+ if (suffixes)
+ list (TRANSFORM suffixes PREPEND "lib/python${_PGPS_VERSION}/config-${_PGPS_VERSION}")
+ list (TRANSFORM suffixes APPEND "-${CMAKE_LIBRARY_ARCHITECTURE}")
+ else()
+ set (suffixes "lib/python${_PGPS_VERSION}/config-${_PGPS_VERSION}-${CMAKE_LIBRARY_ARCHITECTURE}")
+ endif()
+ list (APPEND path_suffixes ${suffixes})
+ endif()
+ set (suffixes "${abi}")
+ if (suffixes)
+ list (TRANSFORM suffixes PREPEND "lib/python${_PGPS_VERSION}/config-${_PGPS_VERSION}")
+ else()
+ set (suffixes "lib/python${_PGPS_VERSION}/config-${_PGPS_VERSION}")
+ endif()
+ list (APPEND path_suffixes ${suffixes})
+ elseif (_PGPS_INCLUDE)
+ set (suffixes "${abi}")
+ if (suffixes)
+ list (TRANSFORM suffixes PREPEND "include/python${_PGPS_VERSION}")
+ else()
+ set (suffixes "include/python${_PGPS_VERSION}")
+ endif()
+ list (APPEND path_suffixes ${suffixes} include)
+ endif()
+ endforeach()
+ endif()
+ elseif (implementation STREQUAL "IronPython")
+ if (_PGPS_INTERPRETER OR _PGPS_COMPILER)
+ foreach (version IN LISTS _PGPS_VERSION)
+ list (APPEND path_suffixes "share/ironpython${version}")
+ endforeach()
+ list (APPEND path_suffixes ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES})
+ endif()
+ elseif (implementation STREQUAL "PyPy")
+ if (_PGPS_INTERPRETER)
+ list (APPEND path_suffixes ${_${_PYTHON_PREFIX}_PYPY_EXECUTABLE_PATH_SUFFIXES})
+ elseif (_PGPS_LIBRARY)
+ list (APPEND path_suffixes ${_${_PYTHON_PREFIX}_PYPY_LIBRARY_PATH_SUFFIXES})
+ elseif (_PGPS_INCLUDE)
+ list (APPEND path_suffixes ${_${_PYTHON_PREFIX}_PYPY_INCLUDE_PATH_SUFFIXES})
endif()
- list (APPEND path_suffixes ${suffixes})
- endif()
- set (suffixes "${abi}")
- if (suffixes)
- list (TRANSFORM suffixes PREPEND "lib/python${_PGPS_VERSION}/config-${_PGPS_VERSION}")
- else()
- set (suffixes "lib/python${_PGPS_VERSION}/config-${_PGPS_VERSION}")
- endif()
- list (APPEND path_suffixes ${suffixes})
- elseif (_PGPS_INCLUDE)
- set (suffixes "${abi}")
- if (suffixes)
- list (TRANSFORM suffixes PREPEND "include/python${_PGPS_VERSION}")
- else()
- set (suffixes "include/python${_PGPS_VERSION}")
endif()
- list (APPEND path_suffixes ${suffixes} include)
- endif()
+ endforeach()
+ list (REMOVE_DUPLICATES path_suffixes)
set (${_PYTHON_PGPS_PATH_SUFFIXES} ${path_suffixes} PARENT_SCOPE)
endfunction()
function (_PYTHON_GET_NAMES _PYTHON_PGN_NAMES)
- cmake_parse_arguments (PARSE_ARGV 1 _PGN "POSIX;EXECUTABLE;CONFIG;LIBRARY;WIN32;DEBUG" "VERSION" "")
+ cmake_parse_arguments (PARSE_ARGV 1 _PGN "POSIX;INTERPRETER;COMPILER;CONFIG;LIBRARY;WIN32;DEBUG" "" "IMPLEMENTATIONS;VERSION")
+
+ if (NOT _PGN_IMPLEMENTATIONS)
+ set (_PGN_IMPLEMENTATIONS ${_${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS})
+ endif()
set (names)
- if (_PGN_WIN32)
- string (REPLACE "." "" _PYTHON_VERSION_NO_DOTS ${_PGN_VERSION})
+ foreach (implementation IN LISTS _PGN_IMPLEMENTATIONS)
+ if (implementation STREQUAL "CPython")
+ foreach (version IN LISTS _PGN_VERSION)
+ if (_PGN_WIN32)
+ string (REPLACE "." "" version_no_dots ${version})
- set (name python${_PYTHON_VERSION_NO_DOTS})
- if (_PGN_DEBUG)
- string (APPEND name "_d")
- endif()
+ set (name python${version_no_dots})
+ if (_PGN_DEBUG)
+ string (APPEND name "_d")
+ endif()
- list (APPEND names "${name}")
- endif()
+ list (APPEND names "${name}")
+ endif()
- if (_PGN_POSIX)
- if (DEFINED _${_PYTHON_PREFIX}_ABIFLAGS)
- set (abi "${_${_PYTHON_PREFIX}_ABIFLAGS}")
- else()
- if (_PGN_EXECUTABLE OR _PGN_CONFIG)
- set (abi "")
- else()
- set (abi "mu" "m" "u" "")
- endif()
- endif()
+ if (_PGN_POSIX)
+ if (DEFINED _${_PYTHON_PREFIX}_ABIFLAGS)
+ set (abi "${_${_PYTHON_PREFIX}_ABIFLAGS}")
+ else()
+ if (_PGN_INTERPRETER OR _PGN_CONFIG)
+ set (abi "")
+ else()
+ set (abi "mu" "m" "u" "")
+ endif()
+ endif()
- if (abi)
- if (_PGN_CONFIG AND DEFINED CMAKE_LIBRARY_ARCHITECTURE)
- set (abinames "${abi}")
- list (TRANSFORM abinames PREPEND "${CMAKE_LIBRARY_ARCHITECTURE}-python${_PGN_VERSION}")
- list (TRANSFORM abinames APPEND "-config")
- list (APPEND names ${abinames})
- endif()
- set (abinames "${abi}")
- list (TRANSFORM abinames PREPEND "python${_PGN_VERSION}")
- if (_PGN_CONFIG)
- list (TRANSFORM abinames APPEND "-config")
+ if (abi)
+ if (_PGN_CONFIG AND DEFINED CMAKE_LIBRARY_ARCHITECTURE)
+ set (abinames "${abi}")
+ list (TRANSFORM abinames PREPEND "${CMAKE_LIBRARY_ARCHITECTURE}-python${version}")
+ list (TRANSFORM abinames APPEND "-config")
+ list (APPEND names ${abinames})
+ endif()
+ set (abinames "${abi}")
+ list (TRANSFORM abinames PREPEND "python${version}")
+ if (_PGN_CONFIG)
+ list (TRANSFORM abinames APPEND "-config")
+ endif()
+ list (APPEND names ${abinames})
+ else()
+ unset (abinames)
+ if (_PGN_CONFIG AND DEFINED CMAKE_LIBRARY_ARCHITECTURE)
+ set (abinames "${CMAKE_LIBRARY_ARCHITECTURE}-python${version}")
+ endif()
+ list (APPEND abinames "python${version}")
+ if (_PGN_CONFIG)
+ list (TRANSFORM abinames APPEND "-config")
+ endif()
+ list (APPEND names ${abinames})
+ endif()
+ endif()
+ endforeach()
+ if (_PGN_INTERPRETER)
+ list (APPEND names python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} python)
endif()
- list (APPEND names ${abinames})
- else()
- if (_PGN_CONFIG AND DEFINED CMAKE_LIBRARY_ARCHITECTURE)
- set (abinames "${CMAKE_LIBRARY_ARCHITECTURE}-python${_PGN_VERSION}")
+ elseif (implementation STREQUAL "IronPython")
+ if (_PGN_INTERPRETER)
+ if (NOT CMAKE_SYSTEM_NAME STREQUAL "Linux")
+ # Do not use wrapper script on Linux because it is buggy: -c interpreter option cannot be used
+ foreach (version IN LISTS _PGN_VERSION)
+ list (APPEND names "ipy${version}")
+ endforeach()
+ endif()
+ list (APPEND names ${_${_PYTHON_PREFIX}_IRON_PYTHON_INTERPRETER_NAMES})
+ elseif (_PGN_COMPILER)
+ list (APPEND names ${_${_PYTHON_PREFIX}_IRON_PYTHON_COMPILER_NAMES})
endif()
- list (APPEND abinames "python${_PGN_VERSION}")
- if (_PGN_CONFIG)
- list (TRANSFORM abinames APPEND "-config")
+ elseif (implementation STREQUAL "PyPy")
+ if (_PGN_INTERPRETER)
+ list (APPEND names ${_${_PYTHON_PREFIX}_PYPY_NAMES})
+ elseif (_PGN_LIBRARY)
+ if (_PGN_WIN32)
+ foreach (version IN LISTS _PGN_VERSION)
+ string (REPLACE "." "" version_no_dots ${version})
+
+ set (name "python${version_no_dots}")
+ if (_PGN_DEBUG)
+ string (APPEND name "_d")
+ endif()
+ list (APPEND names "${name}")
+ endforeach()
+ endif()
+ list (APPEND names ${_${_PYTHON_PREFIX}_PYPY_LIB_NAMES})
endif()
- list (APPEND names ${abinames})
endif()
- endif()
+ endforeach()
set (${_PYTHON_PGN_NAMES} ${names} PARENT_SCOPE)
endfunction()
@@ -323,7 +461,7 @@ function (_PYTHON_GET_CONFIG_VAR _PYTHON_PGCV_VALUE NAME)
if (_${_PYTHON_PREFIX}_EXECUTABLE AND NOT CMAKE_CROSSCOMPILING)
if (NAME STREQUAL "PREFIX")
- execute_process (COMMAND "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c "import sys; from distutils import sysconfig; sys.stdout.write(';'.join([sysconfig.PREFIX,sysconfig.EXEC_PREFIX,sysconfig.BASE_EXEC_PREFIX]))"
+ execute_process (COMMAND ${_${_PYTHON_PREFIX}_INTERPRETER_LAUNCHER} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c "import sys\ntry:\n from distutils import sysconfig\n sys.stdout.write(';'.join([sysconfig.PREFIX,sysconfig.EXEC_PREFIX,sysconfig.BASE_EXEC_PREFIX]))\nexcept Exception:\n import sysconfig\n sys.stdout.write(';'.join([sysconfig.get_config_var('base') or '', sysconfig.get_config_var('installed_base') or '']))"
RESULT_VARIABLE _result
OUTPUT_VARIABLE _values
ERROR_QUIET
@@ -334,16 +472,25 @@ function (_PYTHON_GET_CONFIG_VAR _PYTHON_PGCV_VALUE NAME)
list (REMOVE_DUPLICATES _values)
endif()
elseif (NAME STREQUAL "INCLUDES")
- execute_process (COMMAND "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c "import sys; from distutils import sysconfig; sys.stdout.write(';'.join([sysconfig.get_python_inc(plat_specific=True),sysconfig.get_python_inc(plat_specific=False)]))"
+ if (WIN32)
+ set (_scheme "nt")
+ else()
+ set (_scheme "posix_prefix")
+ endif()
+ execute_process (COMMAND ${_${_PYTHON_PREFIX}_INTERPRETER_LAUNCHER} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
+ "import sys\ntry:\n from distutils import sysconfig\n sys.stdout.write(';'.join([sysconfig.get_python_inc(plat_specific=True),sysconfig.get_python_inc(plat_specific=False)]))\nexcept Exception:\n import sysconfig\n sys.stdout.write(';'.join([sysconfig.get_path('platinclude'),sysconfig.get_path('platinclude','${_scheme}'),sysconfig.get_path('include'),sysconfig.get_path('include','${_scheme}')]))"
RESULT_VARIABLE _result
OUTPUT_VARIABLE _values
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
if (_result)
unset (_values)
+ else()
+ list (REMOVE_DUPLICATES _values)
endif()
elseif (NAME STREQUAL "SOABI")
- execute_process (COMMAND "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c "import sys; from distutils import sysconfig;sys.stdout.write(';'.join([sysconfig.get_config_var('SOABI') or '',sysconfig.get_config_var('EXT_SUFFIX') or '']))"
+ execute_process (COMMAND ${_${_PYTHON_PREFIX}_INTERPRETER_LAUNCHER} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
+ "import sys\ntry:\n from distutils import sysconfig\n sys.stdout.write(';'.join([sysconfig.get_config_var('SOABI') or '',sysconfig.get_config_var('EXT_SUFFIX') or '']))\nexcept Exception:\n import sysconfig;sys.stdout.write(';'.join([sysconfig.get_config_var('SOABI') or '',sysconfig.get_config_var('EXT_SUFFIX') or '']))"
RESULT_VARIABLE _result
OUTPUT_VARIABLE _soabi
ERROR_QUIET
@@ -351,14 +498,15 @@ function (_PYTHON_GET_CONFIG_VAR _PYTHON_PGCV_VALUE NAME)
if (_result)
unset (_values)
else()
- list (GET _soabi 0 _values)
- if (NOT _values)
- # try to compute SOABI from EXT_SUFFIX
- list (GET _soabi 1 _values)
- if (_values)
- # clean-up: remove prefix character and suffix
- string (REGEX REPLACE "^[.-](.+)(${CMAKE_SHARED_LIBRARY_SUFFIX}|\\.(so|pyd))$" "\\1" _values "${_values}")
+ foreach (_item IN LISTS _soabi)
+ if (_item)
+ set (_values "${_item}")
+ break()
endif()
+ endforeach()
+ if (_values)
+ # clean-up: remove prefix character and suffix
+ string (REGEX REPLACE "^[.-](.+)(${CMAKE_SHARED_LIBRARY_SUFFIX}|\\.(so|pyd))$" "\\1" _values "${_values}")
endif()
endif()
else()
@@ -366,7 +514,8 @@ function (_PYTHON_GET_CONFIG_VAR _PYTHON_PGCV_VALUE NAME)
if (NAME STREQUAL "CONFIGDIR")
set (config_flag "LIBPL")
endif()
- execute_process (COMMAND "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_config_var('${config_flag}'))"
+ execute_process (COMMAND ${_${_PYTHON_PREFIX}_INTERPRETER_LAUNCHER} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
+ "import sys\ntry:\n from distutils import sysconfig\n sys.stdout.write(sysconfig.get_config_var('${config_flag}'))\nexcept Exception:\n import sysconfig\n sys.stdout.write(sysconfig.get_config_var('${config_flag}'))"
RESULT_VARIABLE _result
OUTPUT_VARIABLE _values
ERROR_QUIET
@@ -394,6 +543,10 @@ function (_PYTHON_GET_CONFIG_VAR _PYTHON_PGCV_VALUE NAME)
list (REMOVE_DUPLICATES _values)
endif()
+ if (WIN32 AND NAME MATCHES "^(PREFIX|CONFIGDIR|INCLUDES)$")
+ file (TO_CMAKE_PATH "${_values}" _values)
+ endif()
+
set (${_PYTHON_PGCV_VALUE} "${_values}" PARENT_SCOPE)
endfunction()
@@ -420,6 +573,16 @@ function (_PYTHON_GET_VERSION)
set (${_PGV_PREFIX}VERSION_MINOR "${CMAKE_MATCH_2}" PARENT_SCOPE)
set (${_PGV_PREFIX}VERSION "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}" PARENT_SCOPE)
set (${_PGV_PREFIX}ABI "${CMAKE_MATCH_3}" PARENT_SCOPE)
+ elseif (_${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "pypy(3)?")
+ set (version "${CMAKE_MATCH_1}")
+ if (version EQUAL "3")
+ set (${_PGV_PREFIX}VERSION_MAJOR "3" PARENT_SCOPE)
+ set (${_PGV_PREFIX}VERSION "3" PARENT_SCOPE)
+ else()
+ set (${_PGV_PREFIX}VERSION_MAJOR "2" PARENT_SCOPE)
+ set (${_PGV_PREFIX}VERSION "2" PARENT_SCOPE)
+ endif()
+ set (${_PGV_PREFIX}ABI "" PARENT_SCOPE)
endif()
endif()
else()
@@ -466,6 +629,36 @@ function (_PYTHON_GET_VERSION)
endif()
endfunction()
+function (_PYTHON_GET_LAUNCHER _PYTHON_PGL_NAME)
+ cmake_parse_arguments (PARSE_ARGV 1 _PGL "INTERPRETER;COMPILER" "" "")
+
+ unset ({_PYTHON_PGL_NAME} PARENT_SCOPE)
+
+ if ((_PGL_INTERPRETER AND NOT _${_PYTHON_PREFIX}_EXECUTABLE)
+ OR (_PGL_COMPILER AND NOT _${_PYTHON_PREFIX}_COMPILER))
+ return()
+ endif()
+
+ if ("IronPython" IN_LIST _${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS
+ AND NOT SYSTEM_NAME MATCHES "Windows|Linux")
+ if (_PGL_INTERPRETER)
+ get_filename_component (name "${_${_PYTHON_PREFIX}_EXECUTABLE}" NAME)
+ get_filename_component (ext "${_${_PYTHON_PREFIX}_EXECUTABLE}" LAST_EXT)
+ if (name IN_LIST _${_PYTHON_PREFIX}_IRON_PYTHON_INTERPRETER_NAMES
+ AND ext STREQUAL ".exe")
+ set (${_PYTHON_PGL_NAME} "${${_PYTHON_PREFIX}_DOTNET_LAUNCHER}" PARENT_SCOPE)
+ endif()
+ else()
+ get_filename_component (name "${_${_PYTHON_PREFIX}_COMPILER}" NAME)
+ get_filename_component (ext "${_${_PYTHON_PREFIX}_COMPILER}" LAST_EXT)
+ if (name IN_LIST _${_PYTHON_PREFIX}_IRON_PYTHON_COMPILER_NAMES
+ AND ext STREQUAL ".exe")
+ set (${_PYTHON_PGL_NAME} "${${_PYTHON_PREFIX}_DOTNET_LAUNCHER}" PARENT_SCOPE)
+ endif()
+ endif()
+ endif()
+endfunction()
+
function (_PYTHON_VALIDATE_INTERPRETER)
if (NOT _${_PYTHON_PREFIX}_EXECUTABLE)
@@ -486,9 +679,11 @@ function (_PYTHON_VALIDATE_INTERPRETER)
return()
endif()
+ _python_get_launcher (launcher INTERPRETER)
+
# validate ABI compatibility
if (DEFINED _${_PYTHON_PREFIX}_FIND_ABI)
- execute_process (COMMAND "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
+ execute_process (COMMAND ${launcher} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
"import sys; sys.stdout.write(sys.abiflags)"
RESULT_VARIABLE result
OUTPUT_VARIABLE abi
@@ -519,7 +714,7 @@ function (_PYTHON_VALIDATE_INTERPRETER)
endif()
# executable found must have a specific version
- execute_process (COMMAND "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
+ execute_process (COMMAND ${launcher} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
"import sys; sys.stdout.write('.'.join([str(x) for x in sys.version_info[:${count}]]))"
RESULT_VARIABLE result
OUTPUT_VARIABLE version
@@ -553,7 +748,7 @@ function (_PYTHON_VALIDATE_INTERPRETER)
if (NOT python_name STREQUAL "python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}${CMAKE_EXECUTABLE_SUFFIX}")
# executable found do not have version in name
# ensure major version is OK
- execute_process (COMMAND "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
+ execute_process (COMMAND ${launcher} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
"import sys; sys.stdout.write(str(sys.version_info[0]))"
RESULT_VARIABLE result
OUTPUT_VARIABLE version
@@ -572,10 +767,11 @@ function (_PYTHON_VALIDATE_INTERPRETER)
endif()
endif()
- if (CMAKE_SIZEOF_VOID_P AND "Development" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
+ if (CMAKE_SIZEOF_VOID_P AND ("Development.Module" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
+ OR "Development.Embed" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
AND NOT CMAKE_CROSSCOMPILING)
# In this case, interpreter must have same architecture as environment
- execute_process (COMMAND "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
+ execute_process (COMMAND ${launcher} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
"import sys, struct; sys.stdout.write(str(struct.calcsize(\"P\")))"
RESULT_VARIABLE result
OUTPUT_VARIABLE size
@@ -617,6 +813,8 @@ function (_PYTHON_VALIDATE_COMPILER)
return()
endif()
+ _python_get_launcher (launcher COMPILER)
+
# retrieve python environment version from compiler
set (working_dir "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/PythonCompilerVersion.dir")
if (major_version)
@@ -632,12 +830,16 @@ function (_PYTHON_VALIDATE_COMPILER)
endif()
file (WRITE "${working_dir}/version.py" "import sys; sys.stdout.write('.'.join([str(x) for x in sys.version_info[:${count}]]))\n")
endif()
- execute_process (COMMAND "${_${_PYTHON_PREFIX}_COMPILER}" /target:exe /embed "${working_dir}/version.py"
+ execute_process (COMMAND ${launcher} "${_${_PYTHON_PREFIX}_COMPILER}"
+ ${_${_PYTHON_PREFIX}_IRON_PYTHON_COMPILER_ARCH_FLAGS}
+ /target:exe /embed "${working_dir}/version.py"
WORKING_DIRECTORY "${working_dir}"
OUTPUT_QUIET
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
- execute_process (COMMAND "${working_dir}/version"
+ get_filename_component (ir_dir "${_${_PYTHON_PREFIX}_COMPILER}" DIRECTORY)
+ execute_process (COMMAND "${CMAKE_COMMAND}" -E env "MONO_PATH=${ir_dir}"
+ ${${_PYTHON_PREFIX}_DOTNET_LAUNCHER} "${working_dir}/version.exe"
WORKING_DIRECTORY "${working_dir}"
RESULT_VARIABLE result
OUTPUT_VARIABLE version
@@ -658,6 +860,7 @@ endfunction()
function (_PYTHON_VALIDATE_LIBRARY)
if (NOT _${_PYTHON_PREFIX}_LIBRARY_RELEASE)
+ unset (_${_PYTHON_PREFIX}_LIBRARY_DEBUG)
return()
endif()
@@ -784,13 +987,30 @@ function (_PYTHON_SET_LIBRARY_DIRS _PYTHON_SLD_RESULT)
list (APPEND _PYTHON_DIRS "${_PYTHON_DIR}")
endif()
endforeach()
- if (_PYTHON_DIRS)
- list (REMOVE_DUPLICATES _PYTHON_DIRS)
- endif()
+ list (REMOVE_DUPLICATES _PYTHON_DIRS)
set (${_PYTHON_SLD_RESULT} ${_PYTHON_DIRS} PARENT_SCOPE)
endfunction()
+function (_PYTHON_SET_DEVELOPMENT_MODULE_FOUND module)
+ if ("Development.${module}" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
+ string(TOUPPER "${module}" id)
+ set (module_found TRUE)
+
+ if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS
+ AND NOT _${_PYTHON_PREFIX}_LIBRARY_RELEASE)
+ set (module_found FALSE)
+ endif()
+ if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS
+ AND NOT _${_PYTHON_PREFIX}_INCLUDE_DIR)
+ set (module_found FALSE)
+ endif()
+
+ set (${_PYTHON_PREFIX}_Development.${module}_FOUND ${module_found} PARENT_SCOPE)
+ endif()
+endfunction()
+
+
# If major version is specified, it must be the same as internal major version
if (DEFINED ${_PYTHON_PREFIX}_FIND_VERSION_MAJOR
AND NOT ${_PYTHON_PREFIX}_FIND_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
@@ -804,12 +1024,34 @@ if (NOT ${_PYTHON_PREFIX}_FIND_COMPONENTS)
set (${_PYTHON_PREFIX}_FIND_REQUIRED_Interpreter TRUE)
endif()
if ("NumPy" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
- list (APPEND ${_PYTHON_PREFIX}_FIND_COMPONENTS "Interpreter" "Development")
- list (REMOVE_DUPLICATES ${_PYTHON_PREFIX}_FIND_COMPONENTS)
+ list (APPEND ${_PYTHON_PREFIX}_FIND_COMPONENTS "Interpreter" "Development.Module")
endif()
-foreach (_${_PYTHON_PREFIX}_COMPONENT IN ITEMS Interpreter Compiler Development NumPy)
+if ("Development" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
+ list (APPEND ${_PYTHON_PREFIX}_FIND_COMPONENTS "Development.Module" "Development.Embed")
+endif()
+list (REMOVE_DUPLICATES ${_PYTHON_PREFIX}_FIND_COMPONENTS)
+foreach (_${_PYTHON_PREFIX}_COMPONENT IN ITEMS Interpreter Compiler Development Development.Module Development.Embed NumPy)
set (${_PYTHON_PREFIX}_${_${_PYTHON_PREFIX}_COMPONENT}_FOUND FALSE)
endforeach()
+if (${_PYTHON_PREFIX}_FIND_REQUIRED_Development)
+ set (${_PYTHON_PREFIX}_FIND_REQUIRED_Development.Module TRUE)
+ set (${_PYTHON_PREFIX}_FIND_REQUIRED_Development.Embed TRUE)
+endif()
+
+unset (_${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS)
+unset (_${_PYTHON_PREFIX}_FIND_DEVELOPMENT_MODULE_ARTIFACTS)
+unset (_${_PYTHON_PREFIX}_FIND_DEVELOPMENT_EMBED_ARTIFACTS)
+if ("Development.Module" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
+ if (CMAKE_SYSTEM_NAME MATCHES "^(Windows.*|CYGWIN|MSYS)$")
+ list (APPEND _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_MODULE_ARTIFACTS "LIBRARY")
+ endif()
+ list (APPEND _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_MODULE_ARTIFACTS "INCLUDE_DIR")
+endif()
+if ("Development.Embed" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
+ list (APPEND _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_EMBED_ARTIFACTS "LIBRARY" "INCLUDE_DIR")
+endif()
+set (_${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS ${_${_PYTHON_PREFIX}_FIND_DEVELOPMENT_MODULE_ARTIFACTS} ${_${_PYTHON_PREFIX}_FIND_DEVELOPMENT_EMBED_ARTIFACTS})
+list (REMOVE_DUPLICATES _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS)
# Set versions to search
## default: search any version
@@ -819,13 +1061,13 @@ unset (_${_PYTHON_PREFIX}_FIND_VERSION_EXACT)
if (${_PYTHON_PREFIX}_FIND_VERSION_COUNT)
if (${_PYTHON_PREFIX}_FIND_VERSION_EXACT)
set (_${_PYTHON_PREFIX}_FIND_VERSION_EXACT "EXACT")
- set (_${_PYTHON_PREFIX}_FIND_VERSIONS "${${_PYTHON_PREFIX}_FIND_VERSION_MAJOR}.${${_PYTHON_PREFIX}_FIND_VERSION_MINOR}")
+ set (_${_PYTHON_PREFIX}_FIND_VERSIONS ${${_PYTHON_PREFIX}_FIND_VERSION_MAJOR}.${${_PYTHON_PREFIX}_FIND_VERSION_MINOR})
else()
unset (_${_PYTHON_PREFIX}_FIND_VERSIONS)
# add all compatible versions
foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_VERSIONS)
if (_${_PYTHON_PREFIX}_VERSION VERSION_GREATER_EQUAL "${${_PYTHON_PREFIX}_FIND_VERSION_MAJOR}.${${_PYTHON_PREFIX}_FIND_VERSION_MINOR}")
- list (APPEND _${_PYTHON_PREFIX}_FIND_VERSIONS "${_${_PYTHON_PREFIX}_VERSION}")
+ list (APPEND _${_PYTHON_PREFIX}_FIND_VERSIONS ${_${_PYTHON_PREFIX}_VERSION})
endif()
endforeach()
endif()
@@ -881,15 +1123,75 @@ else()
endif()
# IronPython support
+unset (_${_PYTHON_PREFIX}_IRON_PYTHON_INTERPRETER_NAMES)
+unset (_${_PYTHON_PREFIX}_IRON_PYTHON_COMPILER_NAMES)
+unset (_${_PYTHON_PREFIX}_IRON_PYTHON_COMPILER_ARCH_FLAGS)
if (CMAKE_SIZEOF_VOID_P)
- # In this case, search only for 64bit or 32bit
- math (EXPR _${_PYTHON_PREFIX}_ARCH "${CMAKE_SIZEOF_VOID_P} * 8")
- set (_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES ipy${_${_PYTHON_PREFIX}_ARCH} ipy)
+ if (_${_PYTHON_PREFIX}_ARCH EQUAL "32")
+ set (_${_PYTHON_PREFIX}_IRON_PYTHON_COMPILER_ARCH_FLAGS "/platform:x86")
+ else()
+ set (_${_PYTHON_PREFIX}_IRON_PYTHON_COMPILER_ARCH_FLAGS "/platform:x64")
+ endif()
+endif()
+if (NOT CMAKE_SYSTEM_NAME STREQUAL "Linux")
+ # Do not use wrapper script on Linux because it is buggy: -c interpreter option cannot be used
+ list (APPEND _${_PYTHON_PREFIX}_IRON_PYTHON_INTERPRETER_NAMES "ipy${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}" "ipy64" "ipy32" "ipy")
+ list (APPEND _${_PYTHON_PREFIX}_IRON_PYTHON_COMPILER_NAMES "ipyc")
+endif()
+list (APPEND _${_PYTHON_PREFIX}_IRON_PYTHON_INTERPRETER_NAMES "ipy.exe")
+list (APPEND _${_PYTHON_PREFIX}_IRON_PYTHON_COMPILER_NAMES "ipyc.exe")
+set (_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES net45 net40 bin)
+
+# PyPy support
+if (_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR EQUAL "3")
+ set (_${_PYTHON_PREFIX}_PYPY_NAMES pypy3)
+ set (_${_PYTHON_PREFIX}_PYPY_LIB_NAMES pypy3-c)
+ if (WIN32)
+ # special name for runtime part
+ list (APPEND _${_PYTHON_PREFIX}_PYPY_LIB_NAMES libpypy3-c)
+ endif()
+ set (_${_PYTHON_PREFIX}_PYPY_INCLUDE_PATH_SUFFIXES lib/pypy3)
+else()
+ set (_${_PYTHON_PREFIX}_PYPY_NAMES pypy)
+ set (_${_PYTHON_PREFIX}_PYPY_LIB_NAMES pypy-c)
+ if (WIN32)
+ # special name for runtime part
+ list (APPEND _${_PYTHON_PREFIX}_PYPY_LIB_NAMES libpypy-c)
+ endif()
+ set (_${_PYTHON_PREFIX}_PYPY_INCLUDE_PATH_SUFFIXES lib/pypy)
+endif()
+set (_${_PYTHON_PREFIX}_PYPY_EXECUTABLE_PATH_SUFFIXES bin)
+set (_${_PYTHON_PREFIX}_PYPY_LIBRARY_PATH_SUFFIXES lib libs bin)
+list (APPEND _${_PYTHON_PREFIX}_PYPY_INCLUDE_PATH_SUFFIXES include)
+
+# Python Implementations handling
+unset (_${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS)
+if (DEFINED ${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS)
+ foreach (_${_PYTHON_PREFIX}_IMPLEMENTATION IN LISTS ${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS)
+ if (NOT _${_PYTHON_PREFIX}_IMPLEMENTATION MATCHES "^(CPython|IronPython|PyPy)$")
+ message (AUTHOR_WARNING "Find${_PYTHON_PREFIX}: ${_${_PYTHON_PREFIX}_IMPLEMENTATION}: invalid value for '${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS'. 'CPython', 'IronPython' or 'PyPy' expected. Value will be ignored.")
+ else()
+ list (APPEND _${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS ${_${_PYTHON_PREFIX}_IMPLEMENTATION})
+ endif()
+ endforeach()
else()
- # architecture unknown, search for natural interpreter
- set (_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES ipy)
+ if (WIN32)
+ set (_${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS CPython IronPython)
+ else()
+ set (_${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS CPython)
+ endif()
endif()
-set (_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES net45 net40)
+
+# compute list of names for header file
+unset (_${_PYTHON_PREFIX}_INCLUDE_NAMES)
+foreach (_${_PYTHON_PREFIX}_IMPLEMENTATION IN LISTS _${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS)
+ if (_${_PYTHON_PREFIX}_IMPLEMENTATION STREQUAL "CPython")
+ list (APPEND _${_PYTHON_PREFIX}_INCLUDE_NAMES "Python.h")
+ elseif (_${_PYTHON_PREFIX}_IMPLEMENTATION STREQUAL "PyPy")
+ list (APPEND _${_PYTHON_PREFIX}_INCLUDE_NAMES "PyPy.h")
+ endif()
+endforeach()
+
# Apple frameworks handling
_python_find_frameworks ()
@@ -961,7 +1263,7 @@ endif()
# Compute search signature
# This signature will be used to check validity of cached variables on new search
-set (_${_PYTHON_PREFIX}_SIGNATURE "${${_PYTHON_PREFIX}_ROOT_DIR}:${_${_PYTHON_PREFIX}_FIND_STRATEGY}:${${_PYTHON_PREFIX}_FIND_VIRTUALENV}")
+set (_${_PYTHON_PREFIX}_SIGNATURE "${${_PYTHON_PREFIX}_ROOT_DIR}:${_${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS}:${_${_PYTHON_PREFIX}_FIND_STRATEGY}:${${_PYTHON_PREFIX}_FIND_VIRTUALENV}")
if (NOT WIN32)
string (APPEND _${_PYTHON_PREFIX}_SIGNATURE ":${${_PYTHON_PREFIX}_USE_STATIC_LIBS}:")
endif()
@@ -972,6 +1274,64 @@ if (CMAKE_HOST_WIN32)
string (APPEND _${_PYTHON_PREFIX}_SIGNATURE ":${_${_PYTHON_PREFIX}_FIND_REGISTRY}")
endif()
+function (_PYTHON_CHECK_DEVELOPMENT_SIGNATURE module)
+ if ("Development.${module}" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
+ string (TOUPPER "${module}" id)
+ set (signature "${_${_PYTHON_PREFIX}_SIGNATURE}:")
+ if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS)
+ list (APPEND signature "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}:")
+ endif()
+ if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS)
+ list (APPEND signature "${_${_PYTHON_PREFIX}_INCLUDE_DIR}:")
+ endif()
+ string (MD5 signature "${signature}")
+ if (signature STREQUAL _${_PYTHON_PREFIX}_DEVELOPMENT_${id}_SIGNATURE)
+ if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS)
+ _python_validate_library (${${_PYTHON_PREFIX}_FIND_VERSION}
+ ${_${_PYTHON_PREFIX}_FIND_VERSION_EXACT}
+ CHECK_EXISTS)
+ endif()
+ if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS)
+ _python_validate_include_dir (${${_PYTHON_PREFIX}_FIND_VERSION}
+ ${_${_PYTHON_PREFIX}_FIND_VERSION_EXACT}
+ CHECK_EXISTS)
+ endif()
+ else()
+ if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS)
+ unset (_${_PYTHON_PREFIX}_LIBRARY_RELEASE CACHE)
+ unset (_${_PYTHON_PREFIX}_LIBRARY_DEBUG CACHE)
+ endif()
+ if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS)
+ unset (_${_PYTHON_PREFIX}_INCLUDE_DIR CACHE)
+ endif()
+ endif()
+ if (("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS
+ AND NOT _${_PYTHON_PREFIX}_LIBRARY_RELEASE)
+ OR ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS
+ AND NOT _${_PYTHON_PREFIX}_INCLUDE_DIR))
+ unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
+ unset (_${_PYTHON_PREFIX}_DEVELOPMENT_${id}_SIGNATURE CACHE)
+ endif()
+ endif()
+endfunction()
+
+function (_PYTHON_COMPUTE_DEVELOPMENT_SIGNATURE module)
+ string (TOUPPER "${module}" id)
+ if (${_PYTHON_PREFIX}_Development.${module}_FOUND)
+ set (signature "${_${_PYTHON_PREFIX}_SIGNATURE}:")
+ if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS)
+ list (APPEND signature "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}:")
+ endif()
+ if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS)
+ list (APPEND signature "${_${_PYTHON_PREFIX}_INCLUDE_DIR}:")
+ endif()
+ string (MD5 signature "${signature}")
+ set (_${_PYTHON_PREFIX}_DEVELOPMENT_${id}_SIGNATURE "${signature}" CACHE INTERNAL "")
+ else()
+ unset (_${_PYTHON_PREFIX}_DEVELOPMENT_${id}_SIGNATURE CACHE)
+ endif()
+endfunction()
+
unset (_${_PYTHON_PREFIX}_REQUIRED_VARS)
unset (_${_PYTHON_PREFIX}_CACHED_VARS)
@@ -981,6 +1341,15 @@ unset (_${_PYTHON_PREFIX}_Development_REASON_FAILURE)
unset (_${_PYTHON_PREFIX}_NumPy_REASON_FAILURE)
+# preamble
+## For IronPython on platforms other than Windows, search for the .Net interpreter
+if ("IronPython" IN_LIST _${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS
+ AND NOT WIN32)
+ find_program (${_PYTHON_PREFIX}_DOTNET_LAUNCHER
+ NAMES "mono")
+endif()
+
+
# first step, search for the interpreter
if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
list (APPEND _${_PYTHON_PREFIX}_CACHED_VARS _${_PYTHON_PREFIX}_EXECUTABLE
@@ -1019,25 +1388,14 @@ if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
set (_${_PYTHON_PREFIX}_HINTS "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR)
if (_${_PYTHON_PREFIX}_FIND_STRATEGY STREQUAL "LOCATION")
- unset (_${_PYTHON_PREFIX}_NAMES)
- unset (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS)
- unset (_${_PYTHON_PREFIX}_REGISTRY_PATHS)
+ # build all executable names
+ _python_get_names (_${_PYTHON_PREFIX}_NAMES VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS} POSIX INTERPRETER)
+ _python_get_path_suffixes (_${_PYTHON_PREFIX}_PATH_SUFFIXES VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS} INTERPRETER)
- foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS)
- # build all executable names
- _python_get_names (_${_PYTHON_PREFIX}_VERSION_NAMES VERSION ${_${_PYTHON_PREFIX}_VERSION} POSIX EXECUTABLE)
- list (APPEND _${_PYTHON_PREFIX}_NAMES ${_${_PYTHON_PREFIX}_VERSION_NAMES})
-
- # Framework Paths
- _python_get_frameworks (_${_PYTHON_PREFIX}_VERSION_PATHS ${_${_PYTHON_PREFIX}_VERSION})
- list (APPEND _${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_VERSION_PATHS})
-
- # Registry Paths
- _python_get_registries (_${_PYTHON_PREFIX}_VERSION_PATHS ${_${_PYTHON_PREFIX}_VERSION})
- list (APPEND _${_PYTHON_PREFIX}_REGISTRY_PATHS ${_${_PYTHON_PREFIX}_VERSION_PATHS}
- [HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath])
- endforeach()
- list (APPEND _${_PYTHON_PREFIX}_NAMES python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} python)
+ # Framework Paths
+ _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS})
+ # Registry Paths
+ _python_get_registries (_${_PYTHON_PREFIX}_REGISTRY_PATHS VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS})
while (TRUE)
# Virtual environments handling
@@ -1047,7 +1405,7 @@ if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
NAMES_PER_DIR
HINTS ${_${_PYTHON_PREFIX}_HINTS}
PATHS ENV VIRTUAL_ENV ENV CONDA_PREFIX
- PATH_SUFFIXES bin Scripts
+ PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
NO_CMAKE_PATH
NO_CMAKE_ENVIRONMENT_PATH
NO_SYSTEM_ENVIRONMENT_PATH
@@ -1069,7 +1427,7 @@ if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
NAMES_PER_DIR
HINTS ${_${_PYTHON_PREFIX}_HINTS}
PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
- PATH_SUFFIXES bin
+ PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
NO_CMAKE_PATH
NO_CMAKE_ENVIRONMENT_PATH
NO_SYSTEM_ENVIRONMENT_PATH
@@ -1083,11 +1441,10 @@ if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
if (CMAKE_HOST_WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
find_program (_${_PYTHON_PREFIX}_EXECUTABLE
NAMES ${_${_PYTHON_PREFIX}_NAMES}
- ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES}
NAMES_PER_DIR
HINTS ${_${_PYTHON_PREFIX}_HINTS}
PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
- PATH_SUFFIXES bin ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
+ PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
NO_SYSTEM_ENVIRONMENT_PATH
NO_CMAKE_SYSTEM_PATH)
_python_validate_interpreter (${${_PYTHON_PREFIX}_FIND_VERSION} ${_${_PYTHON_PREFIX}_FIND_VERSION_EXACT})
@@ -1099,10 +1456,9 @@ if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
# try using HINTS
find_program (_${_PYTHON_PREFIX}_EXECUTABLE
NAMES ${_${_PYTHON_PREFIX}_NAMES}
- ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES}
NAMES_PER_DIR
HINTS ${_${_PYTHON_PREFIX}_HINTS}
- PATH_SUFFIXES bin ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
+ PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
NO_SYSTEM_ENVIRONMENT_PATH
NO_CMAKE_SYSTEM_PATH)
_python_validate_interpreter (${${_PYTHON_PREFIX}_FIND_VERSION} ${_${_PYTHON_PREFIX}_FIND_VERSION_EXACT})
@@ -1112,9 +1468,8 @@ if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
# try using standard paths
find_program (_${_PYTHON_PREFIX}_EXECUTABLE
NAMES ${_${_PYTHON_PREFIX}_NAMES}
- ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES}
NAMES_PER_DIR
- PATH_SUFFIXES bin ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES})
+ PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES})
_python_validate_interpreter (${${_PYTHON_PREFIX}_FIND_VERSION} ${_${_PYTHON_PREFIX}_FIND_VERSION_EXACT})
if (_${_PYTHON_PREFIX}_EXECUTABLE)
break()
@@ -1126,7 +1481,7 @@ if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
NAMES ${_${_PYTHON_PREFIX}_NAMES}
NAMES_PER_DIR
PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
- PATH_SUFFIXES bin
+ PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
NO_DEFAULT_PATH)
_python_validate_interpreter (${${_PYTHON_PREFIX}_FIND_VERSION} ${_${_PYTHON_PREFIX}_FIND_VERSION_EXACT})
if (_${_PYTHON_PREFIX}_EXECUTABLE)
@@ -1137,10 +1492,9 @@ if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
if (CMAKE_HOST_WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
find_program (_${_PYTHON_PREFIX}_EXECUTABLE
NAMES ${_${_PYTHON_PREFIX}_NAMES}
- ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES}
NAMES_PER_DIR
PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
- PATH_SUFFIXES bin ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
+ PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
NO_DEFAULT_PATH)
_python_validate_interpreter (${${_PYTHON_PREFIX}_FIND_VERSION} ${_${_PYTHON_PREFIX}_FIND_VERSION_EXACT})
if (_${_PYTHON_PREFIX}_EXECUTABLE)
@@ -1153,12 +1507,11 @@ if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
else()
# look-up for various versions and locations
foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS)
- _python_get_names (_${_PYTHON_PREFIX}_NAMES VERSION ${_${_PYTHON_PREFIX}_VERSION} POSIX EXECUTABLE)
- list (APPEND _${_PYTHON_PREFIX}_NAMES python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}
- python)
+ _python_get_names (_${_PYTHON_PREFIX}_NAMES VERSION ${_${_PYTHON_PREFIX}_VERSION} POSIX INTERPRETER)
+ _python_get_path_suffixes (_${_PYTHON_PREFIX}_PATH_SUFFIXES VERSION ${_${_PYTHON_PREFIX}_VERSION} INTERPRETER)
- _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_VERSION})
- _python_get_registries (_${_PYTHON_PREFIX}_REGISTRY_PATHS ${_${_PYTHON_PREFIX}_VERSION})
+ _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS VERSION ${_${_PYTHON_PREFIX}_VERSION})
+ _python_get_registries (_${_PYTHON_PREFIX}_REGISTRY_PATHS VERSION ${_${_PYTHON_PREFIX}_VERSION})
# Virtual environments handling
if (_${_PYTHON_PREFIX}_FIND_VIRTUALENV MATCHES "^(FIRST|ONLY)$")
@@ -1167,7 +1520,7 @@ if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
NAMES_PER_DIR
HINTS ${_${_PYTHON_PREFIX}_HINTS}
PATHS ENV VIRTUAL_ENV ENV CONDA_PREFIX
- PATH_SUFFIXES bin Scripts
+ PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
NO_CMAKE_PATH
NO_CMAKE_ENVIRONMENT_PATH
NO_SYSTEM_ENVIRONMENT_PATH
@@ -1188,7 +1541,7 @@ if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
NAMES_PER_DIR
HINTS ${_${_PYTHON_PREFIX}_HINTS}
PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
- PATH_SUFFIXES bin
+ PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
NO_CMAKE_PATH
NO_CMAKE_ENVIRONMENT_PATH
NO_SYSTEM_ENVIRONMENT_PATH
@@ -1199,12 +1552,10 @@ if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
if (CMAKE_HOST_WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
find_program (_${_PYTHON_PREFIX}_EXECUTABLE
NAMES ${_${_PYTHON_PREFIX}_NAMES}
- ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES}
NAMES_PER_DIR
HINTS ${_${_PYTHON_PREFIX}_HINTS}
PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
- [HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
- PATH_SUFFIXES bin ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
+ PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
NO_SYSTEM_ENVIRONMENT_PATH
NO_CMAKE_SYSTEM_PATH)
endif()
@@ -1217,10 +1568,9 @@ if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
# try using HINTS
find_program (_${_PYTHON_PREFIX}_EXECUTABLE
NAMES ${_${_PYTHON_PREFIX}_NAMES}
- ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES}
NAMES_PER_DIR
HINTS ${_${_PYTHON_PREFIX}_HINTS}
- PATH_SUFFIXES bin ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
+ PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
NO_SYSTEM_ENVIRONMENT_PATH
NO_CMAKE_SYSTEM_PATH)
_python_validate_interpreter (${_${_PYTHON_PREFIX}_VERSION} EXACT)
@@ -1233,15 +1583,9 @@ if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
# For example, typical systems have 'python' for version 2.* and 'python3'
# for version 3.*. So looking for names per dir will find, potentially,
# systematically 'python' (i.e. version 2) even if version 3 is searched.
- if (CMAKE_HOST_WIN32)
- find_program (_${_PYTHON_PREFIX}_EXECUTABLE
- NAMES ${_${_PYTHON_PREFIX}_NAMES}
- python
- ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES})
- else()
- find_program (_${_PYTHON_PREFIX}_EXECUTABLE
- NAMES ${_${_PYTHON_PREFIX}_NAMES})
- endif()
+ find_program (_${_PYTHON_PREFIX}_EXECUTABLE
+ NAMES ${_${_PYTHON_PREFIX}_NAMES}
+ PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES})
_python_validate_interpreter (${_${_PYTHON_PREFIX}_VERSION} EXACT)
if (_${_PYTHON_PREFIX}_EXECUTABLE)
break()
@@ -1253,7 +1597,7 @@ if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
NAMES ${_${_PYTHON_PREFIX}_NAMES}
NAMES_PER_DIR
PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
- PATH_SUFFIXES bin
+ PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
NO_DEFAULT_PATH)
endif()
@@ -1261,11 +1605,9 @@ if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
if (CMAKE_HOST_WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
find_program (_${_PYTHON_PREFIX}_EXECUTABLE
NAMES ${_${_PYTHON_PREFIX}_NAMES}
- ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES}
NAMES_PER_DIR
PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
- [HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
- PATH_SUFFIXES bin ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
+ PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
NO_DEFAULT_PATH)
endif()
@@ -1283,20 +1625,20 @@ if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
# For example, typical systems have 'python' for version 2.* and 'python3'
# for version 3.*. So looking for names per dir will find, potentially,
# systematically 'python' (i.e. version 2) even if version 3 is searched.
+ _python_get_names (_${_PYTHON_PREFIX}_NAMES POSIX INTERPRETER)
find_program (_${_PYTHON_PREFIX}_EXECUTABLE
- NAMES python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}
- python
- ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES})
+ NAMES ${_${_PYTHON_PREFIX}_NAMES})
_python_validate_interpreter ()
endif()
endif()
endif()
set (${_PYTHON_PREFIX}_EXECUTABLE "${_${_PYTHON_PREFIX}_EXECUTABLE}")
+ _python_get_launcher (_${_PYTHON_PREFIX}_INTERPRETER_LAUNCHER INTERPRETER)
# retrieve exact version of executable found
if (_${_PYTHON_PREFIX}_EXECUTABLE)
- execute_process (COMMAND "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
+ execute_process (COMMAND ${_${_PYTHON_PREFIX}_INTERPRETER_LAUNCHER} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
"import sys; sys.stdout.write('.'.join([str(x) for x in sys.version_info[:3]]))"
RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
OUTPUT_VARIABLE ${_PYTHON_PREFIX}_VERSION
@@ -1343,7 +1685,8 @@ if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
# Use interpreter version and ABI for future searches to ensure consistency
set (_${_PYTHON_PREFIX}_FIND_VERSIONS ${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR})
- execute_process (COMMAND "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c "import sys; sys.stdout.write(sys.abiflags)"
+ execute_process (COMMAND ${_${_PYTHON_PREFIX}_INTERPRETR_LAUNCHER} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
+ "import sys; sys.stdout.write(sys.abiflags)"
RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
OUTPUT_VARIABLE _${_PYTHON_PREFIX}_ABIFLAGS
ERROR_QUIET
@@ -1355,13 +1698,16 @@ if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
endif()
if (${_PYTHON_PREFIX}_Interpreter_FOUND)
+ unset (_${_PYTHON_PREFIX}_Interpreter_REASON_FAILURE)
+
# compute and save interpreter signature
string (MD5 __${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE "${_${_PYTHON_PREFIX}_SIGNATURE}:${_${_PYTHON_PREFIX}_EXECUTABLE}")
set (_${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE "${__${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE}" CACHE INTERNAL "")
if (NOT CMAKE_SIZEOF_VOID_P)
# determine interpreter architecture
- execute_process (COMMAND "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c "import sys; print(sys.maxsize > 2**32)"
+ execute_process (COMMAND ${_${_PYTHON_PREFIX}_INTERPRETER_LAUNCHER} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
+ "import sys; sys.stdout.write(str(sys.maxsize > 2**32))"
RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
OUTPUT_VARIABLE ${_PYTHON_PREFIX}_IS64BIT
ERROR_VARIABLE ${_PYTHON_PREFIX}_IS64BIT)
@@ -1377,7 +1723,7 @@ if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
endif()
# retrieve interpreter identity
- execute_process (COMMAND "${_${_PYTHON_PREFIX}_EXECUTABLE}" -V
+ execute_process (COMMAND ${_${_PYTHON_PREFIX}_INTERPRETER_LAUNCHER} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -V
RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
OUTPUT_VARIABLE ${_PYTHON_PREFIX}_INTERPRETER_ID
ERROR_VARIABLE ${_PYTHON_PREFIX}_INTERPRETER_ID)
@@ -1386,11 +1732,15 @@ if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
set (${_PYTHON_PREFIX}_INTERPRETER_ID "Anaconda")
elseif (${_PYTHON_PREFIX}_INTERPRETER_ID MATCHES "Enthought")
set (${_PYTHON_PREFIX}_INTERPRETER_ID "Canopy")
+ elseif (${_PYTHON_PREFIX}_INTERPRETER_ID MATCHES "PyPy ([0-9.]+)")
+ set (${_PYTHON_PREFIX}_INTERPRETER_ID "PyPy")
+ set (${_PYTHON_PREFIX}_PyPy_VERSION "${CMAKE_MATCH_1}")
else()
string (REGEX REPLACE "^([^ ]+).*" "\\1" ${_PYTHON_PREFIX}_INTERPRETER_ID "${${_PYTHON_PREFIX}_INTERPRETER_ID}")
if (${_PYTHON_PREFIX}_INTERPRETER_ID STREQUAL "Python")
# try to get a more precise ID
- execute_process (COMMAND "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c "import sys; print(sys.copyright)"
+ execute_process (COMMAND ${_${_PYTHON_PREFIX}_INTERPRETER_LAUNCHER} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
+ "import sys; sys.stdout.write(sys.copyright)"
RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
OUTPUT_VARIABLE ${_PYTHON_PREFIX}_COPYRIGHT
ERROR_QUIET)
@@ -1404,10 +1754,11 @@ if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
endif()
# retrieve various package installation directories
- execute_process (COMMAND "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c "import sys; from distutils import sysconfig;sys.stdout.write(';'.join([sysconfig.get_python_lib(plat_specific=False,standard_lib=True),sysconfig.get_python_lib(plat_specific=True,standard_lib=True),sysconfig.get_python_lib(plat_specific=False,standard_lib=False),sysconfig.get_python_lib(plat_specific=True,standard_lib=False)]))"
- RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
- OUTPUT_VARIABLE _${_PYTHON_PREFIX}_LIBPATHS
- ERROR_QUIET)
+ execute_process (COMMAND ${_${_PYTHON_PREFIX}_INTERPRETER_LAUNCHER} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
+ "import sys\ntry:\n from distutils import sysconfig\n sys.stdout.write(';'.join([sysconfig.get_python_lib(plat_specific=False,standard_lib=True),sysconfig.get_python_lib(plat_specific=True,standard_lib=True),sysconfig.get_python_lib(plat_specific=False,standard_lib=False),sysconfig.get_python_lib(plat_specific=True,standard_lib=False)]))\nexcept Exception:\n import sysconfig\n sys.stdout.write(';'.join([sysconfig.get_path('stdlib'),sysconfig.get_path('platstdlib'),sysconfig.get_path('purelib'),sysconfig.get_path('platlib')]))"
+ RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
+ OUTPUT_VARIABLE _${_PYTHON_PREFIX}_LIBPATHS
+ ERROR_QUIET)
if (NOT _${_PYTHON_PREFIX}_RESULT)
list (GET _${_PYTHON_PREFIX}_LIBPATHS 0 ${_PYTHON_PREFIX}_STDLIB)
list (GET _${_PYTHON_PREFIX}_LIBPATHS 1 ${_PYTHON_PREFIX}_STDARCH)
@@ -1434,6 +1785,10 @@ if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
endif()
endif()
+ if (${_PYTHON_PREFIX}_ARTIFACTS_INTERACTIVE)
+ set (${_PYTHON_PREFIX}_EXECUTABLE "${_${_PYTHON_PREFIX}_EXECUTABLE}" CACHE FILEPATH "${_PYTHON_PREFIX} Interpreter")
+ endif()
+
_python_mark_as_internal (_${_PYTHON_PREFIX}_EXECUTABLE
_${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES
_${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE)
@@ -1447,7 +1802,10 @@ if ("Compiler" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_COMPILER)
endif()
- if (DEFINED ${_PYTHON_PREFIX}_COMPILER
+ if (NOT "IronPython" IN_LIST _${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS)
+ unset (_${_PYTHON_PREFIX}_COMPILER CACHE)
+ unset (_${_PYTHON_PREFIX}_COMPILER_SIGNATURE CACHE)
+ elseif (DEFINED ${_PYTHON_PREFIX}_COMPILER
AND IS_ABSOLUTE "${${_PYTHON_PREFIX}_COMPILER}")
set (_${_PYTHON_PREFIX}_COMPILER "${${_PYTHON_PREFIX}_COMPILER}" CACHE INTERNAL "")
elseif (DEFINED _${_PYTHON_PREFIX}_COMPILER)
@@ -1466,7 +1824,8 @@ if ("Compiler" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
endif()
endif()
- if (NOT _${_PYTHON_PREFIX}_COMPILER)
+ if ("IronPython" IN_LIST _${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS
+ AND NOT _${_PYTHON_PREFIX}_COMPILER)
# IronPython specific artifacts
# If IronPython interpreter is found, use its path
unset (_${_PYTHON_PREFIX}_IRON_ROOT)
@@ -1475,21 +1834,49 @@ if ("Compiler" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
endif()
if (_${_PYTHON_PREFIX}_FIND_STRATEGY STREQUAL "LOCATION")
- set (_${_PYTHON_PREFIX}_REGISTRY_PATHS)
-
- foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS)
- # Registry Paths
- list (APPEND _${_PYTHON_PREFIX}_REGISTRY_PATHS
- [HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath])
- endforeach()
+ _python_get_names (_${_PYTHON_PREFIX}_COMPILER_NAMES
+ IMPLEMENTATIONS IronPython
+ VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS}
+ COMPILER)
+
+ _python_get_path_suffixes (_${_PYTHON_PREFIX}_PATH_SUFFIXES
+ IMPLEMENTATIONS IronPython
+ VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS}
+ COMPILER)
+
+ _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS
+ IMPLEMENTATIONS IronPython
+ VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS})
+ _python_get_registries (_${_PYTHON_PREFIX}_REGISTRY_PATHS
+ IMPLEMENTATIONS IronPython
+ VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS})
while (TRUE)
- if (_${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
+ # Apple frameworks handling
+ if (CMAKE_HOST_APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
+ find_program (_${_PYTHON_PREFIX}_COMPILER
+ NAMES ${_${_PYTHON_PREFIX}_COMPILER_NAMES}
+ NAMES_PER_DIR
+ HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS}
+ PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
+ PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
+ NO_CMAKE_PATH
+ NO_CMAKE_ENVIRONMENT_PATH
+ NO_SYSTEM_ENVIRONMENT_PATH
+ NO_CMAKE_SYSTEM_PATH)
+ _python_validate_compiler (${${_PYTHON_PREFIX}_FIND_VERSION} ${_${_PYTHON_PREFIX}_FIND_VERSION_EXACT})
+ if (_${_PYTHON_PREFIX}_COMPILER)
+ break()
+ endif()
+ endif()
+ # Windows registry
+ if (CMAKE_HOST_WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
find_program (_${_PYTHON_PREFIX}_COMPILER
- NAMES ipyc
+ NAMES ${_${_PYTHON_PREFIX}_COMPILER_NAMES}
+ NAMES_PER_DIR
HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS}
PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
- PATH_SUFFIXES ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
+ PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
NO_SYSTEM_ENVIRONMENT_PATH
NO_CMAKE_SYSTEM_PATH)
_python_validate_compiler (${${_PYTHON_PREFIX}_FIND_VERSION} ${_${_PYTHON_PREFIX}_FIND_VERSION_EXACT})
@@ -1498,10 +1885,12 @@ if ("Compiler" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
endif()
endif()
+ # try using HINTS
find_program (_${_PYTHON_PREFIX}_COMPILER
- NAMES ipyc
+ NAMES ${_${_PYTHON_PREFIX}_COMPILER_NAMES}
+ NAMES_PER_DIR
HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS}
- PATH_SUFFIXES ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
+ PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
NO_SYSTEM_ENVIRONMENT_PATH
NO_CMAKE_SYSTEM_PATH)
_python_validate_compiler (${${_PYTHON_PREFIX}_FIND_VERSION} ${_${_PYTHON_PREFIX}_FIND_VERSION_EXACT})
@@ -1509,12 +1898,40 @@ if ("Compiler" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
break()
endif()
- if (_${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
+ # try using standard paths
+ find_program (_${_PYTHON_PREFIX}_COMPILER
+ NAMES ${_${_PYTHON_PREFIX}_COMPILER_NAMES}
+ NAMES_PER_DIR
+ PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES})
+ _python_validate_compiler (${${_PYTHON_PREFIX}_FIND_VERSION} ${_${_PYTHON_PREFIX}_FIND_VERSION_EXACT})
+ if (_${_PYTHON_PREFIX}_COMPILER)
+ break()
+ endif()
+
+ # Apple frameworks handling
+ if (CMAKE_HOST_APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
find_program (_${_PYTHON_PREFIX}_COMPILER
- NAMES ipyc
+ NAMES ${_${_PYTHON_PREFIX}_COMPILER_NAMES}
+ NAMES_PER_DIR
+ PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
+ PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
+ NO_DEFAULT_PATH)
+ _python_validate_compiler (${${_PYTHON_PREFIX}_FIND_VERSION} ${_${_PYTHON_PREFIX}_FIND_VERSION_EXACT})
+ if (_${_PYTHON_PREFIX}_COMPILER)
+ break()
+ endif()
+ endif()
+ # Windows registry
+ if (CMAKE_HOST_WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
+ find_program (_${_PYTHON_PREFIX}_COMPILER
+ NAMES ${_${_PYTHON_PREFIX}_COMPILER_NAMES}
+ NAMES_PER_DIR
PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
- PATH_SUFFIXES ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
+ PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
NO_DEFAULT_PATH)
+ if (_${_PYTHON_PREFIX}_COMPILER)
+ break()
+ endif()
endif()
break()
@@ -1522,12 +1939,48 @@ if ("Compiler" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
else()
# try using root dir and registry
foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS)
- if (_${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
+ _python_get_names (_${_PYTHON_PREFIX}_COMPILER_NAMES
+ IMPLEMENTATIONS IronPython
+ VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS}
+ COMPILER)
+
+ _python_get_path_suffixes (_${_PYTHON_PREFIX}_PATH_SUFFIXES
+ IMPLEMENTATIONS IronPython
+ VERSION ${_${_PYTHON_PREFIX}_FIND_VERSION}
+ COMPILER)
+
+ _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS
+ IMPLEMENTATIONS IronPython
+ VERSION ${_${_PYTHON_PREFIX}_VERSION})
+ _python_get_registries (_${_PYTHON_PREFIX}_REGISTRY_PATHS
+ IMPLEMENTATIONS IronPython
+ VERSION ${_${_PYTHON_PREFIX}_VERSION})
+
+ # Apple frameworks handling
+ if (CMAKE_HOST_APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
+ find_program (_${_PYTHON_PREFIX}_COMPILER
+ NAMES ${_${_PYTHON_PREFIX}_COMPILER_NAMES}
+ NAMES_PER_DIR
+ HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS}
+ PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
+ PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
+ NO_CMAKE_PATH
+ NO_CMAKE_ENVIRONMENT_PATH
+ NO_SYSTEM_ENVIRONMENT_PATH
+ NO_CMAKE_SYSTEM_PATH)
+ _python_validate_compiler (${_${_PYTHON_PREFIX}_VERSION} EXACT)
+ if (_${_PYTHON_PREFIX}_COMPILER)
+ break()
+ endif()
+ endif()
+ # Windows registry
+ if (CMAKE_HOST_WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
find_program (_${_PYTHON_PREFIX}_COMPILER
- NAMES ipyc
+ NAMES ${_${_PYTHON_PREFIX}_COMPILER_NAMES}
+ NAMES_PER_DIR
HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS}
- PATHS [HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
- PATH_SUFFIXES ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
+ PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
+ PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
NO_SYSTEM_ENVIRONMENT_PATH
NO_CMAKE_SYSTEM_PATH)
_python_validate_compiler (${_${_PYTHON_PREFIX}_VERSION} EXACT)
@@ -1536,10 +1989,12 @@ if ("Compiler" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
endif()
endif()
+ # try using HINTS
find_program (_${_PYTHON_PREFIX}_COMPILER
- NAMES ipyc
+ NAMES ${_${_PYTHON_PREFIX}_COMPILER_NAMES}
+ NAMES_PER_DIR
HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS}
- PATH_SUFFIXES ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
+ PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
NO_SYSTEM_ENVIRONMENT_PATH
NO_CMAKE_SYSTEM_PATH)
_python_validate_compiler (${_${_PYTHON_PREFIX}_VERSION} EXACT)
@@ -1547,11 +2002,26 @@ if ("Compiler" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
break()
endif()
- if (_${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
+ # Apple frameworks handling
+ if (CMAKE_HOST_APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
+ find_program (_${_PYTHON_PREFIX}_COMPILER
+ NAMES ${_${_PYTHON_PREFIX}_COMPILER_NAMES}
+ NAMES_PER_DIR
+ PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
+ PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
+ NO_DEFAULT_PATH)
+ _python_validate_compiler (${_${_PYTHON_PREFIX}_VERSION} EXACT)
+ if (_${_PYTHON_PREFIX}_COMPILER)
+ break()
+ endif()
+ endif()
+ # Windows registry
+ if (CMAKE_HOST_WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
find_program (_${_PYTHON_PREFIX}_COMPILER
- NAMES ipyc
- PATHS [HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
- PATH_SUFFIXES ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
+ NAMES ${_${_PYTHON_PREFIX}_COMPILER_NAMES}
+ NAMES_PER_DIR
+ PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
+ PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
NO_DEFAULT_PATH)
_python_validate_compiler (${_${_PYTHON_PREFIX}_VERSION} EXACT)
if (_${_PYTHON_PREFIX}_COMPILER)
@@ -1561,10 +2031,18 @@ if ("Compiler" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
endforeach()
# no specific version found, re-try in standard paths
+ _python_get_names (_${_PYTHON_PREFIX}_COMPILER_NAMES
+ IMPLEMENTATIONS IronPython
+ VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS}
+ COMPILER)
+ _python_get_path_suffixes (_${_PYTHON_PREFIX}_PATH_SUFFIXES
+ IMPLEMENTATIONS IronPython
+ VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS}
+ COMPILER)
find_program (_${_PYTHON_PREFIX}_COMPILER
- NAMES ipyc
+ NAMES ${_${_PYTHON_PREFIX}_COMPILER_NAMES}
HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS}
- PATH_SUFFIXES ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES})
+ PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES})
endif()
endif()
@@ -1572,13 +2050,18 @@ if ("Compiler" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
if (_${_PYTHON_PREFIX}_COMPILER)
# retrieve python environment version from compiler
+ _python_get_launcher (_${_PYTHON_PREFIX}_COMPILER_LAUNCHER COMPILER)
set (_${_PYTHON_PREFIX}_VERSION_DIR "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/PythonCompilerVersion.dir")
file (WRITE "${_${_PYTHON_PREFIX}_VERSION_DIR}/version.py" "import sys; sys.stdout.write('.'.join([str(x) for x in sys.version_info[:3]]))\n")
- execute_process (COMMAND "${_${_PYTHON_PREFIX}_COMPILER}" /target:exe /embed "${_${_PYTHON_PREFIX}_VERSION_DIR}/version.py"
+ execute_process (COMMAND ${_${_PYTHON_PREFIX}_COMPILER_LAUNCHER} "${_${_PYTHON_PREFIX}_COMPILER}"
+ ${_${_PYTHON_PREFIX}_IRON_PYTHON_COMPILER_ARCH_FLAGS}
+ /target:exe /embed "${_${_PYTHON_PREFIX}_VERSION_DIR}/version.py"
WORKING_DIRECTORY "${_${_PYTHON_PREFIX}_VERSION_DIR}"
OUTPUT_QUIET
ERROR_QUIET)
- execute_process (COMMAND "${_${_PYTHON_PREFIX}_VERSION_DIR}/version"
+ get_filename_component (_${_PYTHON_PREFIX}_IR_DIR "${_${_PYTHON_PREFIX}_COMPILER}" DIRECTORY)
+ execute_process (COMMAND "${CMAKE_COMMAND}" -E env "MONO_PATH=${_${_PYTHON_PREFIX}_IR_DIR}"
+ ${${_PYTHON_PREFIX}_DOTNET_LAUNCHER} "${_${_PYTHON_PREFIX}_VERSION_DIR}/version.exe"
WORKING_DIRECTORY "${_${_PYTHON_PREFIX}_VERSION_DIR}"
RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
OUTPUT_VARIABLE _${_PYTHON_PREFIX}_VERSION
@@ -1613,12 +2096,14 @@ if ("Compiler" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
endif()
elseif (${_PYTHON_PREFIX}_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
set (${_PYTHON_PREFIX}_Compiler_FOUND TRUE)
- # Use compiler version for future searches to ensure consistency
- set (_${_PYTHON_PREFIX}_FIND_VERSIONS ${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR})
+ # Use compiler version for future searches to ensure consistency
+ set (_${_PYTHON_PREFIX}_FIND_VERSIONS ${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR})
endif()
endif()
if (${_PYTHON_PREFIX}_Compiler_FOUND)
+ unset (_${_PYTHON_PREFIX}_Compiler_REASON_FAILURE)
+
# compute and save compiler signature
string (MD5 __${_PYTHON_PREFIX}_COMPILER_SIGNATURE "${_${_PYTHON_PREFIX}_SIGNATURE}:${_${_PYTHON_PREFIX}_COMPILER}")
set (_${_PYTHON_PREFIX}_COMPILER_SIGNATURE "${__${_PYTHON_PREFIX}_COMPILER_SIGNATURE}" CACHE INTERNAL "")
@@ -1629,54 +2114,61 @@ if ("Compiler" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
unset (${_PYTHON_PREFIX}_COMPILER_ID)
endif()
+ if (${_PYTHON_PREFIX}_ARTIFACTS_INTERACTIVE)
+ set (${_PYTHON_PREFIX}_COMPILER "${_${_PYTHON_PREFIX}_COMPILER}" CACHE FILEPATH "${_PYTHON_PREFIX} Compiler")
+ endif()
+
_python_mark_as_internal (_${_PYTHON_PREFIX}_COMPILER
_${_PYTHON_PREFIX}_COMPILER_SIGNATURE)
endif()
-
# third step, search for the development artifacts
-if (${_PYTHON_PREFIX}_FIND_REQUIRED_Development)
- list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_LIBRARIES
- ${_PYTHON_PREFIX}_INCLUDE_DIRS)
+if (${_PYTHON_PREFIX}_FIND_REQUIRED_Development.Module)
+ if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_MODULE_ARTIFACTS)
+ list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_LIBRARIES)
+ endif()
+ if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_MODULE_ARTIFACTS)
+ list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_INCLUDE_DIRS)
+ endif()
+endif()
+if (${_PYTHON_PREFIX}_FIND_REQUIRED_Development.Embed)
+ if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_EMBED_ARTIFACTS)
+ list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_LIBRARIES)
+ endif()
+ if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_EMBED_ARTIFACTS)
+ list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_INCLUDE_DIRS)
+ endif()
endif()
+list (REMOVE_DUPLICATES _${_PYTHON_PREFIX}_REQUIRED_VARS)
## Development environment is not compatible with IronPython interpreter
-if ("Development" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
- AND NOT ${_PYTHON_PREFIX}_INTERPRETER_ID STREQUAL "IronPython")
+if (("Development.Module" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
+ OR "Development.Embed" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
+ AND ((${_PYTHON_PREFIX}_Interpreter_FOUND
+ AND NOT ${_PYTHON_PREFIX}_INTERPRETER_ID STREQUAL "IronPython")
+ OR NOT ${_PYTHON_PREFIX}_Interpreter_FOUND))
+ if (${_PYTHON_PREFIX}_Interpreter_FOUND)
+ # reduce possible implementations to the interpreter one
+ if (${_PYTHON_PREFIX}_INTERPRETER_ID STREQUAL "PyPy")
+ set (_${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS "PyPy")
+ else()
+ set (_${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS "CPython")
+ endif()
+ else()
+ list (REMOVE_ITEM _${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS "IronPython")
+ endif()
+ if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS)
list (APPEND _${_PYTHON_PREFIX}_CACHED_VARS _${_PYTHON_PREFIX}_LIBRARY_RELEASE
_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE
_${_PYTHON_PREFIX}_LIBRARY_DEBUG
- _${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG
- _${_PYTHON_PREFIX}_INCLUDE_DIR)
-
- if (DEFINED _${_PYTHON_PREFIX}_LIBRARY_RELEASE OR DEFINED _${_PYTHON_PREFIX}_INCLUDE_DIR)
- # compute development signature and check validity of definition
- string (MD5 __${_PYTHON_PREFIX}_DEVELOPMENT_SIGNATURE "${_${_PYTHON_PREFIX}_SIGNATURE}:${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}:${_${_PYTHON_PREFIX}_INCLUDE_DIR}")
- if (WIN32 AND NOT DEFINED _${_PYTHON_PREFIX}_LIBRARY_DEBUG)
- set (_${_PYTHON_PREFIX}_LIBRARY_DEBUG "${_PYTHON_PREFIX}_LIBRARY_DEBUG-NOTFOUND" CACHE INTERNAL "")
- endif()
- if (NOT DEFINED _${_PYTHON_PREFIX}_INCLUDE_DIR)
- set (_${_PYTHON_PREFIX}_INCLUDE_DIR "${_PYTHON_PREFIX}_INCLUDE_DIR-NOTFOUND" CACHE INTERNAL "")
- endif()
- if (__${_PYTHON_PREFIX}_DEVELOPMENT_SIGNATURE STREQUAL _${_PYTHON_PREFIX}_DEVELOPMENT_SIGNATURE)
- # check version validity
- if (${_PYTHON_PREFIX}_FIND_VERSION_EXACT)
- _python_validate_library (${${_PYTHON_PREFIX}_FIND_VERSION} EXACT CHECK_EXISTS)
- _python_validate_include_dir (${${_PYTHON_PREFIX}_FIND_VERSION} EXACT CHECK_EXISTS)
- else()
- _python_validate_library (${${_PYTHON_PREFIX}_FIND_VERSION} CHECK_EXISTS)
- _python_validate_include_dir (${${_PYTHON_PREFIX}_FIND_VERSION} CHECK_EXISTS)
- endif()
- else()
- unset (_${_PYTHON_PREFIX}_LIBRARY_RELEASE CACHE)
- unset (_${_PYTHON_PREFIX}_LIBRARY_DEBUG CACHE)
- unset (_${_PYTHON_PREFIX}_INCLUDE_DIR CACHE)
- endif()
+ _${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG)
endif()
- if (NOT _${_PYTHON_PREFIX}_LIBRARY_RELEASE OR NOT _${_PYTHON_PREFIX}_INCLUDE_DIR)
- unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
- unset (_${_PYTHON_PREFIX}_DEVELOPMENT_SIGNATURE CACHE)
+ if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS)
+ list (APPEND _${_PYTHON_PREFIX}_CACHED_VARS _${_PYTHON_PREFIX}_INCLUDE_DIR)
endif()
+ _python_check_development_signature (Module)
+ _python_check_development_signature (Embed)
+
if (DEFINED ${_PYTHON_PREFIX}_LIBRARY
AND IS_ABSOLUTE "${${_PYTHON_PREFIX}_LIBRARY}")
set (_${_PYTHON_PREFIX}_LIBRARY_RELEASE "${${_PYTHON_PREFIX}_LIBRARY}" CACHE INTERNAL "")
@@ -1703,25 +2195,18 @@ if ("Development" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
# if python interpreter is found, use it to look-up for artifacts
# to ensure consistency between interpreter and development environments.
# If not, try to locate a compatible config tool
- if (NOT ${_PYTHON_PREFIX}_Interpreter_FOUND OR CMAKE_CROSSCOMPILING)
+ if ((NOT ${_PYTHON_PREFIX}_Interpreter_FOUND OR CMAKE_CROSSCOMPILING)
+ AND "CPython" IN_LIST _${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS)
set (_${_PYTHON_PREFIX}_HINTS "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR)
unset (_${_PYTHON_PREFIX}_VIRTUALENV_PATHS)
if (_${_PYTHON_PREFIX}_FIND_VIRTUALENV MATCHES "^(FIRST|ONLY)$")
set (_${_PYTHON_PREFIX}_VIRTUALENV_PATHS ENV VIRTUAL_ENV ENV CONDA_PREFIX)
endif()
- unset (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS)
if (_${_PYTHON_PREFIX}_FIND_STRATEGY STREQUAL "LOCATION")
- set (_${_PYTHON_PREFIX}_CONFIG_NAMES)
-
- foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS)
- _python_get_names (_${_PYTHON_PREFIX}_VERSION_NAMES VERSION ${_${_PYTHON_PREFIX}_VERSION} POSIX CONFIG)
- list (APPEND _${_PYTHON_PREFIX}_CONFIG_NAMES ${_${_PYTHON_PREFIX}_VERSION_NAMES})
-
+ _python_get_names (_${_PYTHON_PREFIX}_CONFIG_NAMES VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS} POSIX CONFIG)
# Framework Paths
- _python_get_frameworks (_${_PYTHON_PREFIX}_VERSION_PATHS ${_${_PYTHON_PREFIX}_VERSION})
- list (APPEND _${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_VERSION_PATHS})
- endforeach()
+ _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS})
# Apple frameworks handling
if (CMAKE_HOST_APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
@@ -1805,7 +2290,7 @@ if ("Development" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
_python_get_names (_${_PYTHON_PREFIX}_CONFIG_NAMES VERSION ${_${_PYTHON_PREFIX}_VERSION} POSIX CONFIG)
# Framework Paths
- _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_VERSION})
+ _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS VERSION ${_${_PYTHON_PREFIX}_VERSION})
# Apple frameworks handling
if (CMAKE_HOST_APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
@@ -1898,140 +2383,61 @@ if ("Development" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
endif()
endif()
- if (NOT _${_PYTHON_PREFIX}_LIBRARY_RELEASE)
- if ((${_PYTHON_PREFIX}_Interpreter_FOUND AND NOT CMAKE_CROSSCOMPILING) OR _${_PYTHON_PREFIX}_CONFIG)
- # retrieve root install directory
- _python_get_config_var (_${_PYTHON_PREFIX}_PREFIX PREFIX)
-
- # enforce current ABI
- _python_get_config_var (_${_PYTHON_PREFIX}_ABIFLAGS ABIFLAGS)
-
- set (_${_PYTHON_PREFIX}_HINTS "${_${_PYTHON_PREFIX}_PREFIX}")
-
- # retrieve library
- ## compute some paths and artifact names
- if (_${_PYTHON_PREFIX}_CONFIG)
- string (REGEX REPLACE "^.+python([0-9.]+)[a-z]*-config" "\\1" _${_PYTHON_PREFIX}_VERSION "${_${_PYTHON_PREFIX}_CONFIG}")
- else()
- set (_${_PYTHON_PREFIX}_VERSION "${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR}")
- endif()
- _python_get_path_suffixes (_${_PYTHON_PREFIX}_PATH_SUFFIXES VERSION ${_${_PYTHON_PREFIX}_VERSION} LIBRARY)
- _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES VERSION ${_${_PYTHON_PREFIX}_VERSION} WIN32 POSIX LIBRARY)
-
- _python_get_config_var (_${_PYTHON_PREFIX}_CONFIGDIR CONFIGDIR)
- list (APPEND _${_PYTHON_PREFIX}_HINTS "${_${_PYTHON_PREFIX}_CONFIGDIR}")
-
- list (APPEND _${_PYTHON_PREFIX}_HINTS "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR)
-
- find_library (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
- NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
- NAMES_PER_DIR
- HINTS ${_${_PYTHON_PREFIX}_HINTS}
- PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
- NO_SYSTEM_ENVIRONMENT_PATH
- NO_CMAKE_SYSTEM_PATH)
- endif()
-
- # Rely on HINTS and standard paths if interpreter or config tool failed to locate artifacts
+ if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS)
if (NOT _${_PYTHON_PREFIX}_LIBRARY_RELEASE)
- set (_${_PYTHON_PREFIX}_HINTS "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR)
-
- unset (_${_PYTHON_PREFIX}_VIRTUALENV_PATHS)
- if (_${_PYTHON_PREFIX}_FIND_VIRTUALENV MATCHES "^(FIRST|ONLY)$")
- set (_${_PYTHON_PREFIX}_VIRTUALENV_PATHS ENV VIRTUAL_ENV ENV CONDA_PREFIX)
- endif()
-
- if (_${_PYTHON_PREFIX}_FIND_STRATEGY STREQUAL "LOCATION")
- unset (_${_PYTHON_PREFIX}_LIB_NAMES)
- unset (_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG)
- unset (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS)
- unset (_${_PYTHON_PREFIX}_REGISTRY_PATHS)
- unset (_${_PYTHON_PREFIX}_PATH_SUFFIXES)
+ if ((${_PYTHON_PREFIX}_Interpreter_FOUND AND NOT CMAKE_CROSSCOMPILING) OR _${_PYTHON_PREFIX}_CONFIG)
+ # retrieve root install directory
+ _python_get_config_var (_${_PYTHON_PREFIX}_PREFIX PREFIX)
- foreach (_${_PYTHON_PREFIX}_LIB_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS)
- # library names
- _python_get_names (_${_PYTHON_PREFIX}_VERSION_NAMES VERSION ${_${_PYTHON_PREFIX}_LIB_VERSION} WIN32 POSIX LIBRARY)
- list (APPEND _${_PYTHON_PREFIX}_LIB_NAMES ${_${_PYTHON_PREFIX}_VERSION_NAMES})
- _python_get_names (_${_PYTHON_PREFIX}_VERSION_NAMES VERSION ${_${_PYTHON_PREFIX}_LIB_VERSION} WIN32 DEBUG)
- list (APPEND _${_PYTHON_PREFIX}_LIB_NAMES_DEBUG ${_${_PYTHON_PREFIX}_VERSION_NAMES})
+ # enforce current ABI
+ _python_get_config_var (_${_PYTHON_PREFIX}_ABIFLAGS ABIFLAGS)
- # Framework Paths
- _python_get_frameworks (_${_PYTHON_PREFIX}_VERSION_PATHS ${_${_PYTHON_PREFIX}_LIB_VERSION})
- list (APPEND _${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_VERSION_PATHS})
+ set (_${_PYTHON_PREFIX}_HINTS "${_${_PYTHON_PREFIX}_PREFIX}")
- # Registry Paths
- _python_get_registries (_${_PYTHON_PREFIX}_VERSION_PATHS ${_${_PYTHON_PREFIX}_LIB_VERSION})
- list (APPEND _${_PYTHON_PREFIX}_REGISTRY_PATHS ${_${_PYTHON_PREFIX}_VERSION_PATHS})
-
- # Paths suffixes
- _python_get_path_suffixes (_${_PYTHON_PREFIX}_VERSION_PATHS VERSION ${_${_PYTHON_PREFIX}_LIB_VERSION} LIBRARY)
- list (APPEND _${_PYTHON_PREFIX}_PATH_SUFFIXES ${_${_PYTHON_PREFIX}_VERSION_PATHS})
- endforeach()
-
- if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
- find_library (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
- NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
- NAMES_PER_DIR
- HINTS ${_${_PYTHON_PREFIX}_HINTS}
- PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
- ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
- PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
- NO_CMAKE_PATH
- NO_CMAKE_ENVIRONMENT_PATH
- NO_SYSTEM_ENVIRONMENT_PATH
- NO_CMAKE_SYSTEM_PATH)
+ # retrieve library
+ ## compute some paths and artifact names
+ if (_${_PYTHON_PREFIX}_CONFIG)
+ string (REGEX REPLACE "^.+python([0-9.]+)[a-z]*-config" "\\1" _${_PYTHON_PREFIX}_VERSION "${_${_PYTHON_PREFIX}_CONFIG}")
+ else()
+ set (_${_PYTHON_PREFIX}_VERSION "${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR}")
endif()
+ _python_get_path_suffixes (_${_PYTHON_PREFIX}_PATH_SUFFIXES VERSION ${_${_PYTHON_PREFIX}_VERSION} LIBRARY)
+ _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES VERSION ${_${_PYTHON_PREFIX}_VERSION} WIN32 POSIX LIBRARY)
- if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
- find_library (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
- NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
- NAMES_PER_DIR
- HINTS ${_${_PYTHON_PREFIX}_HINTS}
- PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
- ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
- PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
- NO_SYSTEM_ENVIRONMENT_PATH
- NO_CMAKE_SYSTEM_PATH)
- endif()
+ _python_get_config_var (_${_PYTHON_PREFIX}_CONFIGDIR CONFIGDIR)
+ list (APPEND _${_PYTHON_PREFIX}_HINTS "${_${_PYTHON_PREFIX}_CONFIGDIR}")
+
+ list (APPEND _${_PYTHON_PREFIX}_HINTS "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR)
- # search in HINTS locations
find_library (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
NAMES_PER_DIR
HINTS ${_${_PYTHON_PREFIX}_HINTS}
- PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
NO_SYSTEM_ENVIRONMENT_PATH
NO_CMAKE_SYSTEM_PATH)
+ endif()
- if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
- set (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS})
- else()
- unset (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS)
- endif()
+ # Rely on HINTS and standard paths if interpreter or config tool failed to locate artifacts
+ if (NOT _${_PYTHON_PREFIX}_LIBRARY_RELEASE)
+ set (_${_PYTHON_PREFIX}_HINTS "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR)
- if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
- set (__${_PYTHON_PREFIX}_REGISTRY_PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS})
- else()
- unset (__${_PYTHON_PREFIX}_REGISTRY_PATHS)
+ unset (_${_PYTHON_PREFIX}_VIRTUALENV_PATHS)
+ if (_${_PYTHON_PREFIX}_FIND_VIRTUALENV MATCHES "^(FIRST|ONLY)$")
+ set (_${_PYTHON_PREFIX}_VIRTUALENV_PATHS ENV VIRTUAL_ENV ENV CONDA_PREFIX)
endif()
- # search in all default paths
- find_library (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
- NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
- NAMES_PER_DIR
- PATHS ${__${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
- ${__${_PYTHON_PREFIX}_REGISTRY_PATHS}
- PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES})
- else()
- foreach (_${_PYTHON_PREFIX}_LIB_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS)
- _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES VERSION ${_${_PYTHON_PREFIX}_LIB_VERSION} WIN32 POSIX LIBRARY)
- _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG VERSION ${_${_PYTHON_PREFIX}_LIB_VERSION} WIN32 DEBUG)
-
- _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_LIB_VERSION})
- _python_get_registries (_${_PYTHON_PREFIX}_REGISTRY_PATHS ${_${_PYTHON_PREFIX}_LIB_VERSION})
+ if (_${_PYTHON_PREFIX}_FIND_STRATEGY STREQUAL "LOCATION")
+ # library names
+ _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS} WIN32 POSIX LIBRARY)
+ _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS} WIN32 DEBUG)
+ # Paths suffixes
+ _python_get_path_suffixes (_${_PYTHON_PREFIX}_PATH_SUFFIXES VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS} LIBRARY)
- _python_get_path_suffixes (_${_PYTHON_PREFIX}_PATH_SUFFIXES VERSION ${_${_PYTHON_PREFIX}_LIB_VERSION} LIBRARY)
+ # Framework Paths
+ _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS VERSION ${_${_PYTHON_PREFIX}_LIB_FIND_VERSIONS})
+ # Registry Paths
+ _python_get_registries (_${_PYTHON_PREFIX}_REGISTRY_PATHS VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS} )
if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
find_library (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
@@ -2069,200 +2475,288 @@ if ("Development" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
NO_SYSTEM_ENVIRONMENT_PATH
NO_CMAKE_SYSTEM_PATH)
- if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
- set (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS})
- else()
- unset (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS)
- endif()
+ if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
+ set (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS})
+ else()
+ unset (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS)
+ endif()
- if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
- set (__${_PYTHON_PREFIX}_REGISTRY_PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS})
- else()
- unset (__${_PYTHON_PREFIX}_REGISTRY_PATHS)
- endif()
+ if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
+ set (__${_PYTHON_PREFIX}_REGISTRY_PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS})
+ else()
+ unset (__${_PYTHON_PREFIX}_REGISTRY_PATHS)
+ endif()
- # search in all default paths
- find_library (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
+ # search in all default paths
+ find_library (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
NAMES_PER_DIR
PATHS ${__${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
${__${_PYTHON_PREFIX}_REGISTRY_PATHS}
PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES})
+ else()
+ foreach (_${_PYTHON_PREFIX}_LIB_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS)
+ _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES VERSION ${_${_PYTHON_PREFIX}_LIB_VERSION} WIN32 POSIX LIBRARY)
+ _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG VERSION ${_${_PYTHON_PREFIX}_LIB_VERSION} WIN32 DEBUG)
+
+ _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS VERSION ${_${_PYTHON_PREFIX}_LIB_VERSION})
+ _python_get_registries (_${_PYTHON_PREFIX}_REGISTRY_PATHS VERSION ${_${_PYTHON_PREFIX}_LIB_VERSION})
+
+ _python_get_path_suffixes (_${_PYTHON_PREFIX}_PATH_SUFFIXES VERSION ${_${_PYTHON_PREFIX}_LIB_VERSION} LIBRARY)
+
+ if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
+ find_library (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
+ NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
+ NAMES_PER_DIR
+ HINTS ${_${_PYTHON_PREFIX}_HINTS}
+ PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
+ ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
+ PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
+ NO_CMAKE_PATH
+ NO_CMAKE_ENVIRONMENT_PATH
+ NO_SYSTEM_ENVIRONMENT_PATH
+ NO_CMAKE_SYSTEM_PATH)
+ endif()
- if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE)
- break()
- endif()
- endforeach()
+ if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
+ find_library (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
+ NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
+ NAMES_PER_DIR
+ HINTS ${_${_PYTHON_PREFIX}_HINTS}
+ PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
+ ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
+ PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
+ NO_SYSTEM_ENVIRONMENT_PATH
+ NO_CMAKE_SYSTEM_PATH)
+ endif()
+
+ # search in HINTS locations
+ find_library (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
+ NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
+ NAMES_PER_DIR
+ HINTS ${_${_PYTHON_PREFIX}_HINTS}
+ PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
+ PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
+ NO_SYSTEM_ENVIRONMENT_PATH
+ NO_CMAKE_SYSTEM_PATH)
+
+ if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
+ set (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS})
+ else()
+ unset (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS)
+ endif()
+
+ if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
+ set (__${_PYTHON_PREFIX}_REGISTRY_PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS})
+ else()
+ unset (__${_PYTHON_PREFIX}_REGISTRY_PATHS)
+ endif()
+
+ # search in all default paths
+ find_library (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
+ NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
+ NAMES_PER_DIR
+ PATHS ${__${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
+ ${__${_PYTHON_PREFIX}_REGISTRY_PATHS}
+ PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES})
+
+ if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE)
+ break()
+ endif()
+ endforeach()
+ endif()
endif()
endif()
- endif()
- # finalize library version information
- _python_get_version (LIBRARY PREFIX _${_PYTHON_PREFIX}_)
+ # finalize library version information
+ _python_get_version (LIBRARY PREFIX _${_PYTHON_PREFIX}_)
+ if (_${_PYTHON_PREFIX}_VERSION EQUAL "${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}")
+ # not able to extract full version from library name
+ if (${_PYTHON_PREFIX}_Interpreter_FOUND)
+ # update from interpreter
+ set (_${_PYTHON_PREFIX}_VERSION ${${_PYTHON_PREFIX}_VERSION})
+ set (_${_PYTHON_PREFIX}_VERSION_MAJOR ${${_PYTHON_PREFIX}_VERSION_MAJOR})
+ set (_${_PYTHON_PREFIX}_VERSION_MINOR ${${_PYTHON_PREFIX}_VERSION_MINOR})
+ set (_${_PYTHON_PREFIX}_VERSION_PATCH ${${_PYTHON_PREFIX}_VERSION_PATCH})
+ endif()
+ endif()
- set (${_PYTHON_PREFIX}_LIBRARY_RELEASE "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}")
+ set (${_PYTHON_PREFIX}_LIBRARY_RELEASE "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}")
- if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE AND NOT EXISTS "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}")
- set (_${_PYTHON_PREFIX}_Development_REASON_FAILURE "Cannot find the library \"${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}\"")
- set_property (CACHE _${_PYTHON_PREFIX}_LIBRARY_RELEASE PROPERTY VALUE "${_PYTHON_PREFIX}_LIBRARY_RELEASE-NOTFOUND")
- endif()
+ if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE AND NOT EXISTS "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}")
+ set (_${_PYTHON_PREFIX}_Development_REASON_FAILURE "Cannot find the library \"${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}\"")
+ set_property (CACHE _${_PYTHON_PREFIX}_LIBRARY_RELEASE PROPERTY VALUE "${_PYTHON_PREFIX}_LIBRARY_RELEASE-NOTFOUND")
+ endif()
- set (_${_PYTHON_PREFIX}_HINTS "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR)
-
- if (WIN32 AND _${_PYTHON_PREFIX}_LIBRARY_RELEASE)
- # search for debug library
- # use release library location as a hint
- _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG VERSION ${_${_PYTHON_PREFIX}_VERSION} WIN32 DEBUG)
- get_filename_component (_${_PYTHON_PREFIX}_PATH "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY)
- find_library (_${_PYTHON_PREFIX}_LIBRARY_DEBUG
- NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG}
- NAMES_PER_DIR
- HINTS "${_${_PYTHON_PREFIX}_PATH}" ${_${_PYTHON_PREFIX}_HINTS}
- NO_DEFAULT_PATH)
- # second try including CMAKE variables to catch-up non conventional layouts
- find_library (_${_PYTHON_PREFIX}_LIBRARY_DEBUG
- NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG}
- NAMES_PER_DIR
- NO_SYSTEM_ENVIRONMENT_PATH
- NO_CMAKE_SYSTEM_PATH)
- endif()
-
- # retrieve runtime libraries
- if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE)
- _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES VERSION ${_${_PYTHON_PREFIX}_VERSION} WIN32 POSIX LIBRARY)
- get_filename_component (_${_PYTHON_PREFIX}_PATH "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY)
- get_filename_component (_${_PYTHON_PREFIX}_PATH2 "${_${_PYTHON_PREFIX}_PATH}" DIRECTORY)
- _python_find_runtime_library (_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE
- NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
- NAMES_PER_DIR
- HINTS "${_${_PYTHON_PREFIX}_PATH}" "${_${_PYTHON_PREFIX}_PATH2}" ${_${_PYTHON_PREFIX}_HINTS}
- PATH_SUFFIXES bin)
- endif()
- if (_${_PYTHON_PREFIX}_LIBRARY_DEBUG)
- _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG VERSION ${_${_PYTHON_PREFIX}_VERSION} WIN32 DEBUG)
- get_filename_component (_${_PYTHON_PREFIX}_PATH "${_${_PYTHON_PREFIX}_LIBRARY_DEBUG}" DIRECTORY)
- get_filename_component (_${_PYTHON_PREFIX}_PATH2 "${_${_PYTHON_PREFIX}_PATH}" DIRECTORY)
- _python_find_runtime_library (_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG
- NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG}
- NAMES_PER_DIR
- HINTS "${_${_PYTHON_PREFIX}_PATH}" "${_${_PYTHON_PREFIX}_PATH2}" ${_${_PYTHON_PREFIX}_HINTS}
- PATH_SUFFIXES bin)
- endif()
-
- # Don't search for include dir if no library was founded
- if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE AND NOT _${_PYTHON_PREFIX}_INCLUDE_DIR)
- if ((${_PYTHON_PREFIX}_Interpreter_FOUND AND NOT CMAKE_CROSSCOMPILING) OR _${_PYTHON_PREFIX}_CONFIG)
- _python_get_config_var (_${_PYTHON_PREFIX}_INCLUDE_DIRS INCLUDES)
+ set (_${_PYTHON_PREFIX}_HINTS "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR)
- find_path (_${_PYTHON_PREFIX}_INCLUDE_DIR
- NAMES Python.h
- HINTS ${_${_PYTHON_PREFIX}_INCLUDE_DIRS}
- NO_SYSTEM_ENVIRONMENT_PATH
- NO_CMAKE_SYSTEM_PATH)
+ if (WIN32 AND _${_PYTHON_PREFIX}_LIBRARY_RELEASE)
+ # search for debug library
+ # use release library location as a hint
+ _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG VERSION ${_${_PYTHON_PREFIX}_VERSION} WIN32 DEBUG)
+ get_filename_component (_${_PYTHON_PREFIX}_PATH "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY)
+ find_library (_${_PYTHON_PREFIX}_LIBRARY_DEBUG
+ NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG}
+ NAMES_PER_DIR
+ HINTS "${_${_PYTHON_PREFIX}_PATH}" ${_${_PYTHON_PREFIX}_HINTS}
+ NO_DEFAULT_PATH)
+ # second try including CMAKE variables to catch-up non conventional layouts
+ find_library (_${_PYTHON_PREFIX}_LIBRARY_DEBUG
+ NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG}
+ NAMES_PER_DIR
+ NO_SYSTEM_ENVIRONMENT_PATH
+ NO_CMAKE_SYSTEM_PATH)
endif()
- # Rely on HINTS and standard paths if interpreter or config tool failed to locate artifacts
- if (NOT _${_PYTHON_PREFIX}_INCLUDE_DIR)
- unset (_${_PYTHON_PREFIX}_VIRTUALENV_PATHS)
- if (_${_PYTHON_PREFIX}_FIND_VIRTUALENV MATCHES "^(FIRST|ONLY)$")
- set (_${_PYTHON_PREFIX}_VIRTUALENV_PATHS ENV VIRTUAL_ENV ENV CONDA_PREFIX)
- endif()
- unset (_${_PYTHON_PREFIX}_INCLUDE_HINTS)
-
- # Use the library's install prefix as a hint
- if (${_${_PYTHON_PREFIX}_LIBRARY_RELEASE} MATCHES "^(.+/Frameworks/Python.framework/Versions/[0-9.]+)")
- list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${CMAKE_MATCH_1}")
- elseif (${_${_PYTHON_PREFIX}_LIBRARY_RELEASE} MATCHES "^(.+)/lib(64|32)?/python[0-9.]+/config")
- list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${CMAKE_MATCH_1}")
- elseif (DEFINED CMAKE_LIBRARY_ARCHITECTURE AND ${_${_PYTHON_PREFIX}_LIBRARY_RELEASE} MATCHES "^(.+)/lib/${CMAKE_LIBRARY_ARCHITECTURE}")
- list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${CMAKE_MATCH_1}")
- else()
- # assume library is in a directory under root
- get_filename_component (_${_PYTHON_PREFIX}_PREFIX "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY)
- get_filename_component (_${_PYTHON_PREFIX}_PREFIX "${_${_PYTHON_PREFIX}_PREFIX}" DIRECTORY)
- list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${_${_PYTHON_PREFIX}_PREFIX}")
+ # retrieve runtime libraries
+ if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE)
+ _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES VERSION ${_${_PYTHON_PREFIX}_VERSION} WIN32 POSIX LIBRARY)
+ get_filename_component (_${_PYTHON_PREFIX}_PATH "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY)
+ get_filename_component (_${_PYTHON_PREFIX}_PATH2 "${_${_PYTHON_PREFIX}_PATH}" DIRECTORY)
+ _python_find_runtime_library (_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE
+ NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
+ NAMES_PER_DIR
+ HINTS "${_${_PYTHON_PREFIX}_PATH}"
+ "${_${_PYTHON_PREFIX}_PATH2}" ${_${_PYTHON_PREFIX}_HINTS}
+ PATH_SUFFIXES bin)
+ endif()
+ if (_${_PYTHON_PREFIX}_LIBRARY_DEBUG)
+ _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG VERSION ${_${_PYTHON_PREFIX}_VERSION} WIN32 DEBUG)
+ get_filename_component (_${_PYTHON_PREFIX}_PATH "${_${_PYTHON_PREFIX}_LIBRARY_DEBUG}" DIRECTORY)
+ get_filename_component (_${_PYTHON_PREFIX}_PATH2 "${_${_PYTHON_PREFIX}_PATH}" DIRECTORY)
+ _python_find_runtime_library (_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG
+ NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG}
+ NAMES_PER_DIR
+ HINTS "${_${_PYTHON_PREFIX}_PATH}"
+ "${_${_PYTHON_PREFIX}_PATH2}" ${_${_PYTHON_PREFIX}_HINTS}
+ PATH_SUFFIXES bin)
+ endif()
+ endif()
+
+ if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS)
+ while (NOT _${_PYTHON_PREFIX}_INCLUDE_DIR)
+ if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS
+ AND NOT _${_PYTHON_PREFIX}_LIBRARY_RELEASE)
+ # Don't search for include dir if no library was founded
+ break()
endif()
- _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_VERSION})
- _python_get_registries (_${_PYTHON_PREFIX}_REGISTRY_PATHS ${_${_PYTHON_PREFIX}_VERSION})
- _python_get_path_suffixes (_${_PYTHON_PREFIX}_PATH_SUFFIXES VERSION ${_${_PYTHON_PREFIX}_VERSION} INCLUDE)
+ if ((${_PYTHON_PREFIX}_Interpreter_FOUND AND NOT CMAKE_CROSSCOMPILING) OR _${_PYTHON_PREFIX}_CONFIG)
+ _python_get_config_var (_${_PYTHON_PREFIX}_INCLUDE_DIRS INCLUDES)
- if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
find_path (_${_PYTHON_PREFIX}_INCLUDE_DIR
- NAMES Python.h
- HINTS ${_${_PYTHON_PREFIX}_INCLUDE_HINTS} ${_${_PYTHON_PREFIX}_HINTS}
- PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
- ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
- PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
- NO_CMAKE_PATH
- NO_CMAKE_ENVIRONMENT_PATH
+ NAMES ${_${_PYTHON_PREFIX}_INCLUDE_NAMES}
+ HINTS ${_${_PYTHON_PREFIX}_INCLUDE_DIRS}
NO_SYSTEM_ENVIRONMENT_PATH
NO_CMAKE_SYSTEM_PATH)
endif()
- if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
+ # Rely on HINTS and standard paths if interpreter or config tool failed to locate artifacts
+ if (NOT _${_PYTHON_PREFIX}_INCLUDE_DIR)
+ unset (_${_PYTHON_PREFIX}_VIRTUALENV_PATHS)
+ if (_${_PYTHON_PREFIX}_FIND_VIRTUALENV MATCHES "^(FIRST|ONLY)$")
+ set (_${_PYTHON_PREFIX}_VIRTUALENV_PATHS ENV VIRTUAL_ENV ENV CONDA_PREFIX)
+ endif()
+ unset (_${_PYTHON_PREFIX}_INCLUDE_HINTS)
+
+ if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE)
+ # Use the library's install prefix as a hint
+ if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "^(.+/Frameworks/Python.framework/Versions/[0-9.]+)")
+ list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${CMAKE_MATCH_1}")
+ elseif (_${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "^(.+)/lib(64|32)?/python[0-9.]+/config")
+ list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${CMAKE_MATCH_1}")
+ elseif (DEFINED CMAKE_LIBRARY_ARCHITECTURE AND ${_${_PYTHON_PREFIX}_LIBRARY_RELEASE} MATCHES "^(.+)/lib/${CMAKE_LIBRARY_ARCHITECTURE}")
+ list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${CMAKE_MATCH_1}")
+ else()
+ # assume library is in a directory under root
+ get_filename_component (_${_PYTHON_PREFIX}_PREFIX "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY)
+ get_filename_component (_${_PYTHON_PREFIX}_PREFIX "${_${_PYTHON_PREFIX}_PREFIX}" DIRECTORY)
+ list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${_${_PYTHON_PREFIX}_PREFIX}")
+ endif()
+ endif()
+
+ _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS VERSION ${_${_PYTHON_PREFIX}_VERSION})
+ _python_get_registries (_${_PYTHON_PREFIX}_REGISTRY_PATHS VERSION ${_${_PYTHON_PREFIX}_VERSION})
+ _python_get_path_suffixes (_${_PYTHON_PREFIX}_PATH_SUFFIXES VERSION ${_${_PYTHON_PREFIX}_VERSION} INCLUDE)
+
+ if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
+ find_path (_${_PYTHON_PREFIX}_INCLUDE_DIR
+ NAMES ${_${_PYTHON_PREFIX}_INCLUDE_NAMES}
+ HINTS ${_${_PYTHON_PREFIX}_INCLUDE_HINTS} ${_${_PYTHON_PREFIX}_HINTS}
+ PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
+ ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
+ PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
+ NO_CMAKE_PATH
+ NO_CMAKE_ENVIRONMENT_PATH
+ NO_SYSTEM_ENVIRONMENT_PATH
+ NO_CMAKE_SYSTEM_PATH)
+ endif()
+
+ if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
+ find_path (_${_PYTHON_PREFIX}_INCLUDE_DIR
+ NAMES ${_${_PYTHON_PREFIX}_INCLUDE_NAMES}
+ HINTS ${_${_PYTHON_PREFIX}_INCLUDE_HINTS} ${_${_PYTHON_PREFIX}_HINTS}
+ PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
+ ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
+ PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
+ NO_SYSTEM_ENVIRONMENT_PATH
+ NO_CMAKE_SYSTEM_PATH)
+ endif()
+
+ if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
+ set (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS})
+ else()
+ unset (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS)
+ endif()
+
+ if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
+ set (__${_PYTHON_PREFIX}_REGISTRY_PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS})
+ else()
+ unset (__${_PYTHON_PREFIX}_REGISTRY_PATHS)
+ endif()
+
find_path (_${_PYTHON_PREFIX}_INCLUDE_DIR
- NAMES Python.h
+ NAMES ${_${_PYTHON_PREFIX}_INCLUDE_NAMES}
HINTS ${_${_PYTHON_PREFIX}_INCLUDE_HINTS} ${_${_PYTHON_PREFIX}_HINTS}
PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
- ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
+ ${__${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
+ ${__${_PYTHON_PREFIX}_REGISTRY_PATHS}
PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
NO_SYSTEM_ENVIRONMENT_PATH
NO_CMAKE_SYSTEM_PATH)
endif()
- if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
- set (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS})
- else()
- unset (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS)
- endif()
-
- if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
- set (__${_PYTHON_PREFIX}_REGISTRY_PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS})
- else()
- unset (__${_PYTHON_PREFIX}_REGISTRY_PATHS)
- endif()
-
+ # search header file in standard locations
find_path (_${_PYTHON_PREFIX}_INCLUDE_DIR
- NAMES Python.h
- HINTS ${_${_PYTHON_PREFIX}_INCLUDE_HINTS} ${_${_PYTHON_PREFIX}_HINTS}
- PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
- ${__${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
- ${__${_PYTHON_PREFIX}_REGISTRY_PATHS}
- PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
- NO_SYSTEM_ENVIRONMENT_PATH
- NO_CMAKE_SYSTEM_PATH)
- endif()
+ NAMES ${_${_PYTHON_PREFIX}_INCLUDE_NAMES})
- # search header file in standard locations
- find_path (_${_PYTHON_PREFIX}_INCLUDE_DIR
- NAMES Python.h)
- endif()
-
- set (${_PYTHON_PREFIX}_INCLUDE_DIRS "${_${_PYTHON_PREFIX}_INCLUDE_DIR}")
+ break()
+ endwhile()
- if (_${_PYTHON_PREFIX}_INCLUDE_DIR AND NOT EXISTS "${_${_PYTHON_PREFIX}_INCLUDE_DIR}")
- set (_${_PYTHON_PREFIX}_Development_REASON_FAILURE "Cannot find the directory \"${_${_PYTHON_PREFIX}_INCLUDE_DIR}\"")
- set_property (CACHE _${_PYTHON_PREFIX}_INCLUDE_DIR PROPERTY VALUE "${_PYTHON_PREFIX}_INCLUDE_DIR-NOTFOUND")
- endif()
+ set (${_PYTHON_PREFIX}_INCLUDE_DIRS "${_${_PYTHON_PREFIX}_INCLUDE_DIR}")
- if (_${_PYTHON_PREFIX}_INCLUDE_DIR)
- # retrieve version from header file
- _python_get_version (INCLUDE PREFIX _${_PYTHON_PREFIX}_INC_)
+ if (_${_PYTHON_PREFIX}_INCLUDE_DIR AND NOT EXISTS "${_${_PYTHON_PREFIX}_INCLUDE_DIR}")
+ set (_${_PYTHON_PREFIX}_Development_REASON_FAILURE "Cannot find the directory \"${_${_PYTHON_PREFIX}_INCLUDE_DIR}\"")
+ set_property (CACHE _${_PYTHON_PREFIX}_INCLUDE_DIR PROPERTY VALUE "${_PYTHON_PREFIX}_INCLUDE_DIR-NOTFOUND")
+ endif()
- if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE)
- if ("${_${_PYTHON_PREFIX}_INC_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_INC_VERSION_MINOR}"
- VERSION_EQUAL _${_PYTHON_PREFIX}_VERSION)
- # update versioning
+ if (_${_PYTHON_PREFIX}_INCLUDE_DIR)
+ # retrieve version from header file
+ _python_get_version (INCLUDE PREFIX _${_PYTHON_PREFIX}_INC_)
+
+ if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE)
+ if ("${_${_PYTHON_PREFIX}_INC_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_INC_VERSION_MINOR}"
+ VERSION_EQUAL _${_PYTHON_PREFIX}_VERSION)
+ # update versioning
+ set (_${_PYTHON_PREFIX}_VERSION ${_${_PYTHON_PREFIX}_INC_VERSION})
+ set (_${_PYTHON_PREFIX}_VERSION_PATCH ${_${_PYTHON_PREFIX}_INC_VERSION_PATCH})
+ endif()
+ else()
set (_${_PYTHON_PREFIX}_VERSION ${_${_PYTHON_PREFIX}_INC_VERSION})
+ set (_${_PYTHON_PREFIX}_VERSION_MAJOR ${_${_PYTHON_PREFIX}_INC_VERSION_MAJOR})
+ set (_${_PYTHON_PREFIX}_VERSION_MINOR ${_${_PYTHON_PREFIX}_INC_VERSION_MINOR})
set (_${_PYTHON_PREFIX}_VERSION_PATCH ${_${_PYTHON_PREFIX}_INC_VERSION_PATCH})
endif()
- else()
- # library is not defined, rely on header for version
- set (_${_PYTHON_PREFIX}_VERSION ${_${_PYTHON_PREFIX}_INC_VERSION})
- set (_${_PYTHON_PREFIX}_VERSION_MAJOR ${_${_PYTHON_PREFIX}_INC_VERSION_MAJOR})
- set (_${_PYTHON_PREFIX}_VERSION_MINOR ${_${_PYTHON_PREFIX}_INC_VERSION_MINOR})
- set (_${_PYTHON_PREFIX}_VERSION_PATCH ${_${_PYTHON_PREFIX}_INC_VERSION_PATCH})
endif()
endif()
@@ -2275,74 +2769,111 @@ if ("Development" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
endif()
# define public variables
- set (${_PYTHON_PREFIX}_LIBRARY_DEBUG "${_${_PYTHON_PREFIX}_LIBRARY_DEBUG}")
- _python_select_library_configurations (${_PYTHON_PREFIX})
+ if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS)
+ set (${_PYTHON_PREFIX}_LIBRARY_DEBUG "${_${_PYTHON_PREFIX}_LIBRARY_DEBUG}")
+ _python_select_library_configurations (${_PYTHON_PREFIX})
- set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE "${_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE}")
- set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG "${_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG}")
+ set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE "${_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE}")
+ set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG "${_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG}")
- if (_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE)
- set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY "${_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE}")
- elseif (_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG)
- set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY "${_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG}")
- else()
- set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY "${_PYTHON_PREFIX}_RUNTIME_LIBRARY-NOTFOUND")
- endif()
-
- _python_set_library_dirs (${_PYTHON_PREFIX}_LIBRARY_DIRS
- _${_PYTHON_PREFIX}_LIBRARY_RELEASE _${_PYTHON_PREFIX}_LIBRARY_DEBUG)
- if (UNIX)
- if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "${CMAKE_SHARED_LIBRARY_SUFFIX}$")
- set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DIRS ${${_PYTHON_PREFIX}_LIBRARY_DIRS})
+ if (_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE)
+ set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY "${_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE}")
+ elseif (_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG)
+ set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY "${_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG}")
+ else()
+ set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY "${_PYTHON_PREFIX}_RUNTIME_LIBRARY-NOTFOUND")
endif()
- else()
+
+ _python_set_library_dirs (${_PYTHON_PREFIX}_LIBRARY_DIRS
+ _${_PYTHON_PREFIX}_LIBRARY_RELEASE
+ _${_PYTHON_PREFIX}_LIBRARY_DEBUG)
+ if (UNIX)
+ if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "${CMAKE_SHARED_LIBRARY_SUFFIX}$")
+ set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DIRS ${${_PYTHON_PREFIX}_LIBRARY_DIRS})
+ endif()
+ else()
_python_set_library_dirs (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DIRS
- _${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE _${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG)
+ _${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE
+ _${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG)
+ endif()
endif()
- if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE AND _${_PYTHON_PREFIX}_INCLUDE_DIR)
+ if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE OR _${_PYTHON_PREFIX}_INCLUDE_DIR)
if (${_PYTHON_PREFIX}_Interpreter_FOUND OR ${_PYTHON_PREFIX}_Compiler_FOUND)
# development environment must be compatible with interpreter/compiler
if ("${_${_PYTHON_PREFIX}_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_VERSION_MINOR}" VERSION_EQUAL "${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR}"
AND "${_${_PYTHON_PREFIX}_INC_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_INC_VERSION_MINOR}" VERSION_EQUAL "${_${_PYTHON_PREFIX}_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_VERSION_MINOR}")
- set (${_PYTHON_PREFIX}_Development_FOUND TRUE)
+ _python_set_development_module_found (Module)
+ _python_set_development_module_found (Embed)
endif()
elseif (${_PYTHON_PREFIX}_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR
- AND "${_${_PYTHON_PREFIX}_INC_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_INC_VERSION_MINOR}" VERSION_EQUAL "${_${_PYTHON_PREFIX}_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_VERSION_MINOR}")
- set (${_PYTHON_PREFIX}_Development_FOUND TRUE)
+ AND "${_${_PYTHON_PREFIX}_INC_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_INC_VERSION_MINOR}" VERSION_EQUAL "${_${_PYTHON_PREFIX}_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_VERSION_MINOR}")
+ _python_set_development_module_found (Module)
+ _python_set_development_module_found (Embed)
endif()
if (DEFINED _${_PYTHON_PREFIX}_FIND_ABI AND
(NOT _${_PYTHON_PREFIX}_ABI IN_LIST _${_PYTHON_PREFIX}_ABIFLAGS
OR NOT _${_PYTHON_PREFIX}_INC_ABI IN_LIST _${_PYTHON_PREFIX}_ABIFLAGS))
- set (${_PYTHON_PREFIX}_Development_FOUND FALSE)
+ set (${_PYTHON_PREFIX}_Development.Module_FOUND FALSE)
+ set (${_PYTHON_PREFIX}_Development.Embed_FOUND FALSE)
endif()
endif()
+ if (( ${_PYTHON_PREFIX}_Development.Module_FOUND
+ AND ${_PYTHON_PREFIX}_Development.Embed_FOUND)
+ OR (NOT "Development.Module" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
+ AND ${_PYTHON_PREFIX}_Development.Embed_FOUND)
+ OR (NOT "Development.Embed" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
+ AND ${_PYTHON_PREFIX}_Development.Module_FOUND))
+ unset (_${_PYTHON_PREFIX}_Development_REASON_FAILURE)
+ endif()
+
+ if ("Development" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
+ AND ${_PYTHON_PREFIX}_Development.Module_FOUND
+ AND ${_PYTHON_PREFIX}_Development.Embed_FOUND)
+ set (${_PYTHON_PREFIX}_Development_FOUND TRUE)
+ endif()
+
+ if ((${_PYTHON_PREFIX}_Development.Module_FOUND
+ OR ${_PYTHON_PREFIX}_Development.Embed_FOUND)
+ AND EXISTS "${_${_PYTHON_PREFIX}_INCLUDE_DIR}/PyPy.h")
+ # retrieve PyPy version
+ file (STRINGS "${_${_PYTHON_PREFIX}_INCLUDE_DIR}/patchlevel.h" ${_PYTHON_PREFIX}_PyPy_VERSION
+ REGEX "^#define[ \t]+PYPY_VERSION[ \t]+\"[^\"]+\"")
+ string (REGEX REPLACE "^#define[ \t]+PYPY_VERSION[ \t]+\"([^\"]+)\".*" "\\1"
+ ${_PYTHON_PREFIX}_PyPy_VERSION "${${_PYTHON_PREFIX}_PyPy_VERSION}")
+ endif()
+
if (_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR VERSION_GREATER_EQUAL "3"
AND NOT DEFINED ${_PYTHON_PREFIX}_SOABI)
_python_get_config_var (${_PYTHON_PREFIX}_SOABI SOABI)
endif()
- if (${_PYTHON_PREFIX}_Development_FOUND)
- # compute and save development signature
- string (MD5 __${_PYTHON_PREFIX}_DEVELOPMENT_SIGNATURE "${_${_PYTHON_PREFIX}_SIGNATURE}:${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}:${_${_PYTHON_PREFIX}_INCLUDE_DIR}")
- set (_${_PYTHON_PREFIX}_DEVELOPMENT_SIGNATURE "${__${_PYTHON_PREFIX}_DEVELOPMENT_SIGNATURE}" CACHE INTERNAL "")
- else()
- unset (_${_PYTHON_PREFIX}_DEVELOPMENT_SIGNATURE CACHE)
- endif()
+ _python_compute_development_signature (Module)
+ _python_compute_development_signature (Embed)
# Restore the original find library ordering
if (DEFINED _${_PYTHON_PREFIX}_CMAKE_FIND_LIBRARY_SUFFIXES)
set (CMAKE_FIND_LIBRARY_SUFFIXES ${_${_PYTHON_PREFIX}_CMAKE_FIND_LIBRARY_SUFFIXES})
endif()
+ if (${_PYTHON_PREFIX}_ARTIFACTS_INTERACTIVE)
+ if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS)
+ set (${_PYTHON_PREFIX}_LIBRARY "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}" CACHE FILEPATH "${_PYTHON_PREFIX} Library")
+ endif()
+ if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS)
+ set (${_PYTHON_PREFIX}_INCLUDE_DIR "${_${_PYTHON_PREFIX}_INCLUDE_DIR}" CACHE FILEPATH "${_PYTHON_PREFIX} Include Directory")
+ endif()
+ endif()
+
_python_mark_as_internal (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
_${_PYTHON_PREFIX}_LIBRARY_DEBUG
_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE
_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG
_${_PYTHON_PREFIX}_INCLUDE_DIR
_${_PYTHON_PREFIX}_CONFIG
- _${_PYTHON_PREFIX}_DEVELOPMENT_SIGNATURE)
+ _${_PYTHON_PREFIX}_DEVELOPMENT_MODULE_SIGNATURE
+ _${_PYTHON_PREFIX}_DEVELOPMENT_EMBED_SIGNATURE)
endif()
if (${_PYTHON_PREFIX}_FIND_REQUIRED_NumPy)
@@ -2356,7 +2887,7 @@ if ("NumPy" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS AND ${_PYTHON_PREFIX}_Inte
set (_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR "${${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR}" CACHE INTERNAL "")
elseif (DEFINED _${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR)
# compute numpy signature. Depends on interpreter and development signatures
- string (MD5 __${_PYTHON_PREFIX}_NUMPY_SIGNATURE "${_${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE}:${_${_PYTHON_PREFIX}_DEVELOPMENT_SIGNATURE}:${_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR}")
+ string (MD5 __${_PYTHON_PREFIX}_NUMPY_SIGNATURE "${_${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE}:${_${_PYTHON_PREFIX}_DEVELOPMENT_MODULE_SIGNATURE}:${_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR}")
if (NOT __${_PYTHON_PREFIX}_NUMPY_SIGNATURE STREQUAL _${_PYTHON_PREFIX}_NUMPY_SIGNATURE
OR NOT EXISTS "${_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR}")
unset (_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR CACHE)
@@ -2365,13 +2896,12 @@ if ("NumPy" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS AND ${_PYTHON_PREFIX}_Inte
endif()
if (NOT _${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR)
- execute_process(
- COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c
- "from __future__ import print_function\ntry: import numpy; print(numpy.get_include(), end='')\nexcept:pass\n"
- RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
- OUTPUT_VARIABLE _${_PYTHON_PREFIX}_NumPy_PATH
- ERROR_QUIET
- OUTPUT_STRIP_TRAILING_WHITESPACE)
+ execute_process(COMMAND ${${_PYTHON_PREFIX}_INTERPRETER_LAUNCHER} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
+ "import sys\ntry: import numpy; sys.stdout.write(numpy.get_include())\nexcept:pass\n"
+ RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
+ OUTPUT_VARIABLE _${_PYTHON_PREFIX}_NumPy_PATH
+ ERROR_QUIET
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
if (NOT _${_PYTHON_PREFIX}_RESULT)
find_path (_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR
@@ -2389,31 +2919,36 @@ if ("NumPy" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS AND ${_PYTHON_PREFIX}_Inte
endif()
if (_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR)
- execute_process (
- COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c
- "from __future__ import print_function\ntry: import numpy; print(numpy.__version__, end='')\nexcept:pass\n"
- RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
- OUTPUT_VARIABLE _${_PYTHON_PREFIX}_NumPy_VERSION)
+ execute_process (COMMAND ${${_PYTHON_PREFIX}_INTERPRETER_LAUNCHER} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
+ "import sys\ntry: import numpy; sys.stdout.write(numpy.__version__)\nexcept:pass\n"
+ RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
+ OUTPUT_VARIABLE _${_PYTHON_PREFIX}_NumPy_VERSION)
if (NOT _${_PYTHON_PREFIX}_RESULT)
set (${_PYTHON_PREFIX}_NumPy_VERSION "${_${_PYTHON_PREFIX}_NumPy_VERSION}")
else()
unset (${_PYTHON_PREFIX}_NumPy_VERSION)
endif()
- # final step: set NumPy founded only if Development component is founded as well
- set(${_PYTHON_PREFIX}_NumPy_FOUND ${${_PYTHON_PREFIX}_Development_FOUND})
+ # final step: set NumPy founded only if Development.Module component is founded as well
+ set(${_PYTHON_PREFIX}_NumPy_FOUND ${${_PYTHON_PREFIX}_Development.Module_FOUND})
else()
set (${_PYTHON_PREFIX}_NumPy_FOUND FALSE)
endif()
if (${_PYTHON_PREFIX}_NumPy_FOUND)
+ unset (_${_PYTHON_PREFIX}_NumPy_REASON_FAILURE)
+
# compute and save numpy signature
- string (MD5 __${_PYTHON_PREFIX}_NUMPY_SIGNATURE "${_${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE}:${_${_PYTHON_PREFIX}_DEVELOPMENT_SIGNATURE}:${${_PYTHON_PREFIX}_NumPyINCLUDE_DIR}")
+ string (MD5 __${_PYTHON_PREFIX}_NUMPY_SIGNATURE "${_${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE}:${_${_PYTHON_PREFIX}_DEVELOPMENT_MODULE_SIGNATURE}:${${_PYTHON_PREFIX}_NumPyINCLUDE_DIR}")
set (_${_PYTHON_PREFIX}_NUMPY_SIGNATURE "${__${_PYTHON_PREFIX}_NUMPY_SIGNATURE}" CACHE INTERNAL "")
else()
unset (_${_PYTHON_PREFIX}_NUMPY_SIGNATURE CACHE)
endif()
+ if (${_PYTHON_PREFIX}_ARTIFACTS_INTERACTIVE)
+ set (${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR "${_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR}" CACHE FILEPATH "${_PYTHON_PREFIX} NumPy Include Directory")
+ endif()
+
_python_mark_as_internal (_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR
_${_PYTHON_PREFIX}_NUMPY_SIGNATURE)
endif()
@@ -2426,11 +2961,10 @@ endif()
unset (_${_PYTHON_PREFIX}_REASON_FAILURE)
foreach (_${_PYTHON_PREFIX}_COMPONENT IN ITEMS Interpreter Compiler Development NumPy)
- if (NOT ${_PYTHON_PREFIX}_${_${_PYTHON_PREFIX}_COMPONENT}_FOUND
- AND _${_PYTHON_PREFIX}_${_${_PYTHON_PREFIX}_COMPONENT}_REASON_FAILURE)
+ if (_${_PYTHON_PREFIX}_${_${_PYTHON_PREFIX}_COMPONENT}_REASON_FAILURE)
string (APPEND _${_PYTHON_PREFIX}_REASON_FAILURE "\n ${_${_PYTHON_PREFIX}_COMPONENT}: ${_${_PYTHON_PREFIX}_${_${_PYTHON_PREFIX}_COMPONENT}_REASON_FAILURE}")
+ unset (_${_PYTHON_PREFIX}_${_${_PYTHON_PREFIX}_COMPONENT}_REASON_FAILURE)
endif()
- unset (_${_PYTHON_PREFIX}_${_${_PYTHON_PREFIX}_COMPONENT}_REASON_FAILURE)
endforeach()
include (${CMAKE_CURRENT_LIST_DIR}/../FindPackageHandleStandardArgs.cmake)
@@ -2458,8 +2992,10 @@ if(_${_PYTHON_PREFIX}_CMAKE_ROLE STREQUAL "PROJECT")
PROPERTY IMPORTED_LOCATION "${${_PYTHON_PREFIX}_COMPILER}")
endif()
- if ("Development" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
- AND ${_PYTHON_PREFIX}_Development_FOUND)
+ if (("Development.Module" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
+ AND ${_PYTHON_PREFIX}_Development.Module_FOUND)
+ OR ("Development.Embed" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
+ AND ${_PYTHON_PREFIX}_Development.Embed_FOUND))
macro (__PYTHON_IMPORT_LIBRARY __name)
if (${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "${CMAKE_SHARED_LIBRARY_SUFFIX}$"
@@ -2491,8 +3027,8 @@ if(_${_PYTHON_PREFIX}_CMAKE_ROLE STREQUAL "PROJECT")
else()
set_target_properties (${__name}
PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C"
- IMPORTED_IMPLIB "${${_PYTHON_PREFIX}_LIBRARY}"
- IMPORTED_LOCATION "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY}")
+ IMPORTED_IMPLIB "${${_PYTHON_PREFIX}_LIBRARIES}"
+ IMPORTED_LOCATION "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE}")
endif()
else()
if (${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_LIBRARY_DEBUG)
@@ -2506,7 +3042,7 @@ if(_${_PYTHON_PREFIX}_CMAKE_ROLE STREQUAL "PROJECT")
else()
set_target_properties (${__name}
PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C"
- IMPORTED_LOCATION "${${_PYTHON_PREFIX}_LIBRARY}")
+ IMPORTED_LOCATION "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}")
endif()
endif()
@@ -2520,31 +3056,35 @@ if(_${_PYTHON_PREFIX}_CMAKE_ROLE STREQUAL "PROJECT")
endif()
endmacro()
- __python_import_library (${_PYTHON_PREFIX}::Python)
-
- if (CMAKE_SYSTEM_NAME MATCHES "^(Windows.*|CYGWIN|MSYS)$")
- # On Windows/CYGWIN/MSYS, Python::Module is the same as Python::Python
- # but ALIAS cannot be used because the imported library is not GLOBAL.
- __python_import_library (${_PYTHON_PREFIX}::Module)
- else()
- if (NOT TARGET ${_PYTHON_PREFIX}::Module )
- add_library (${_PYTHON_PREFIX}::Module INTERFACE IMPORTED)
- endif()
- set_property (TARGET ${_PYTHON_PREFIX}::Module
- PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${${_PYTHON_PREFIX}_INCLUDE_DIRS}")
+ if (${_PYTHON_PREFIX}_Development.Embed_FOUND)
+ __python_import_library (${_PYTHON_PREFIX}::Python)
+ endif()
- # When available, enforce shared library generation with undefined symbols
- if (APPLE)
- set_property (TARGET ${_PYTHON_PREFIX}::Module
- PROPERTY INTERFACE_LINK_OPTIONS "LINKER:-undefined,dynamic_lookup")
- endif()
- if (CMAKE_SYSTEM_NAME STREQUAL "SunOS")
- set_property (TARGET ${_PYTHON_PREFIX}::Module
- PROPERTY INTERFACE_LINK_OPTIONS "LINKER:-z,nodefs")
- endif()
- if (CMAKE_SYSTEM_NAME STREQUAL "AIX")
+ if (${_PYTHON_PREFIX}_Development.Module_FOUND)
+ if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_MODULE_ARTIFACTS)
+ # On Windows/CYGWIN/MSYS, Python::Module is the same as Python::Python
+ # but ALIAS cannot be used because the imported library is not GLOBAL.
+ __python_import_library (${_PYTHON_PREFIX}::Module)
+ else()
+ if (NOT TARGET ${_PYTHON_PREFIX}::Module)
+ add_library (${_PYTHON_PREFIX}::Module INTERFACE IMPORTED)
+ endif()
set_property (TARGET ${_PYTHON_PREFIX}::Module
- PROPERTY INTERFACE_LINK_OPTIONS "LINKER:-b,erok")
+ PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${${_PYTHON_PREFIX}_INCLUDE_DIRS}")
+
+ # When available, enforce shared library generation with undefined symbols
+ if (APPLE)
+ set_property (TARGET ${_PYTHON_PREFIX}::Module
+ PROPERTY INTERFACE_LINK_OPTIONS "LINKER:-undefined,dynamic_lookup")
+ endif()
+ if (CMAKE_SYSTEM_NAME STREQUAL "SunOS")
+ set_property (TARGET ${_PYTHON_PREFIX}::Module
+ PROPERTY INTERFACE_LINK_OPTIONS "LINKER:-z,nodefs")
+ endif()
+ if (CMAKE_SYSTEM_NAME STREQUAL "AIX")
+ set_property (TARGET ${_PYTHON_PREFIX}::Module
+ PROPERTY INTERFACE_LINK_OPTIONS "LINKER:-b,erok")
+ endif()
endif()
endif()
@@ -2553,8 +3093,7 @@ if(_${_PYTHON_PREFIX}_CMAKE_ROLE STREQUAL "PROJECT")
# It is used to build modules for python.
#
function (__${_PYTHON_PREFIX}_ADD_LIBRARY prefix name)
- cmake_parse_arguments (PARSE_ARGV 2 PYTHON_ADD_LIBRARY
- "STATIC;SHARED;MODULE;WITH_SOABI" "" "")
+ cmake_parse_arguments (PARSE_ARGV 2 PYTHON_ADD_LIBRARY "STATIC;SHARED;MODULE;WITH_SOABI" "" "")
if (prefix STREQUAL "Python2" AND PYTHON_ADD_LIBRARY_WITH_SOABI)
message (AUTHOR_WARNING "FindPython2: Option `WITH_SOABI` is not supported for Python2 and will be ignored.")
@@ -2568,6 +3107,16 @@ if(_${_PYTHON_PREFIX}_CMAKE_ROLE STREQUAL "PROJECT")
else()
set (type MODULE)
endif()
+
+ if (type STREQUAL "MODULE" AND NOT TARGET ${prefix}::Module)
+ message (SEND_ERROR "${prefix}_ADD_LIBRARY: dependent target '${prefix}::Module' is not defined.\n Did you miss to request COMPONENT 'Development.Module'?")
+ return()
+ endif()
+ if (NOT type STREQUAL "MODULE" AND NOT TARGET ${prefix}::Python)
+ message (SEND_ERROR "${prefix}_ADD_LIBRARY: dependent target '${prefix}::Python' is not defined.\n Did you miss to request COMPONENT 'Development.Embed'?")
+ return()
+ endif()
+
add_library (${name} ${type} ${PYTHON_ADD_LIBRARY_UNPARSED_ARGUMENTS})
get_property (type TARGET ${name} PROPERTY TYPE)
diff --git a/Modules/FindPython2.cmake b/Modules/FindPython2.cmake
index 3d0e6b9..84c0c73 100644
--- a/Modules/FindPython2.cmake
+++ b/Modules/FindPython2.cmake
@@ -13,13 +13,24 @@ The following components are supported:
* ``Interpreter``: search for Python 2 interpreter
* ``Compiler``: search for Python 2 compiler. Only offered by IronPython.
* ``Development``: search for development artifacts (include directories and
- libraries)
+ libraries). This component includes two sub-components which can be specified
+ independently:
+
+ * ``Development.Module``: search for artifacts for Python 2 module
+ developments.
+ * ``Development.Embed``: search for artifacts for Python 2 embedding
+ developments.
+
* ``NumPy``: search for NumPy include directories.
If no ``COMPONENTS`` are specified, ``Interpreter`` is assumed.
+If component ``Development`` is specified, it implies sub-components
+``Development.Module`` and ``Development.Embed``.
+
To ensure consistent versions between components ``Interpreter``, ``Compiler``,
-``Development`` and ``NumPy``, specify all components at the same time::
+``Development`` (or one of its sub-components) and ``NumPy``, specify all
+components at the same time::
find_package (Python2 COMPONENTS Interpreter Development)
@@ -31,10 +42,11 @@ for you.
.. note::
- If components ``Interpreter`` and ``Development`` are both specified, this
- module search only for interpreter with same platform architecture as the one
- defined by ``CMake`` configuration. This contraint does not apply if only
- ``Interpreter`` component is specified.
+ If components ``Interpreter`` and ``Development`` (or one of its
+ sub-components) are both specified, this module search only for interpreter
+ with same platform architecture as the one defined by ``CMake``
+ configuration. This contraint does not apply if only ``Interpreter``
+ component is specified.
Imported Targets
^^^^^^^^^^^^^^^^
@@ -46,12 +58,12 @@ This module defines the following :ref:`Imported Targets <Imported Targets>`
Python 2 interpreter. Target defined if component ``Interpreter`` is found.
``Python2::Compiler``
Python 2 compiler. Target defined if component ``Compiler`` is found.
-``Python2::Python``
- Python 2 library for Python embedding. Target defined if component
- ``Development`` is found.
``Python2::Module``
Python 2 library for Python module. Target defined if component
- ``Development`` is found.
+ ``Development.Module`` is found.
+``Python2::Python``
+ Python 2 library for Python embedding. Target defined if component
+ ``Development.Embed`` is found.
``Python2::NumPy``
NumPy library for Python 2. Target defined if component ``NumPy`` is found.
@@ -74,26 +86,31 @@ This module will set the following variables in your project
* Anaconda
* Canopy
* IronPython
+ * PyPy
``Python2_STDLIB``
Standard platform independent installation directory.
Information returned by
- ``distutils.sysconfig.get_python_lib(plat_specific=False,standard_lib=True)``.
+ ``distutils.sysconfig.get_python_lib(plat_specific=False,standard_lib=True)``
+ or else ``sysconfig.get_path('stdlib')``.
``Python2_STDARCH``
Standard platform dependent installation directory.
Information returned by
- ``distutils.sysconfig.get_python_lib(plat_specific=True,standard_lib=True)``.
+ ``distutils.sysconfig.get_python_lib(plat_specific=True,standard_lib=True)``
+ or else ``sysconfig.get_path('platstdlib')``.
``Python2_SITELIB``
Third-party platform independent installation directory.
Information returned by
- ``distutils.sysconfig.get_python_lib(plat_specific=False,standard_lib=False)``.
+ ``distutils.sysconfig.get_python_lib(plat_specific=False,standard_lib=False)``
+ or else ``sysconfig.get_path('purelib')``.
``Python2_SITEARCH``
Third-party platform dependent installation directory.
Information returned by
- ``distutils.sysconfig.get_python_lib(plat_specific=True,standard_lib=False)``.
+ ``distutils.sysconfig.get_python_lib(plat_specific=True,standard_lib=False)``
+ or else ``sysconfig.get_path('platlib')``.
``Python2_Compiler_FOUND``
System has the Python 2 compiler.
``Python2_COMPILER``
@@ -101,8 +118,14 @@ This module will set the following variables in your project
``Python2_COMPILER_ID``
A short string unique to the compiler. Possible values include:
* IronPython
+``Python2_DOTNET_LAUNCHER``
+ The ``.Net`` interpreter. Only used by ``IronPython`` implementation.
``Python2_Development_FOUND``
System has the Python 2 development artifacts.
+``Python2_Development.Module_FOUND``
+ System has the Python 2 development artifacts for Python module.
+``Python2_Development.Embed_FOUND``
+ System has the Python 2 development artifacts for Python embedding.
``Python2_INCLUDE_DIRS``
The Python 2 include directories.
``Python2_LIBRARIES``
@@ -119,6 +142,8 @@ This module will set the following variables in your project
Python 2 minor version.
``Python2_VERSION_PATCH``
Python 2 patch version.
+``Python2_PyPy_VERSION``
+ Python 2 PyPy version.
``Python2_NumPy_FOUND``
System has the NumPy.
``Python2_NumPy_INCLUDE_DIRS``
@@ -186,8 +211,9 @@ Hints
* ``ONLY``: Only the virtual environment is used to look-up for the
interpreter.
* ``STANDARD``: The virtual environment is not used to look-up for the
- interpreter. In this case, variable ``Python2_FIND_REGISTRY`` (Windows)
- or ``CMAKE_FIND_FRAMEWORK`` (macOS) can be set with value ``LAST`` or
+ interpreter but environment variable ``PATH`` is always considered.
+ In this case, variable ``Python2_FIND_REGISTRY`` (Windows) or
+ ``CMAKE_FIND_FRAMEWORK`` (macOS) can be set with value ``LAST`` or
``NEVER`` to select preferably the interpreter from the virtual
environment.
@@ -197,6 +223,39 @@ Hints
recommended to also include the component ``Interpreter`` to get expected
result.
+``Python2_FIND_IMPLEMENTATIONS``
+ This variable defines, in an ordered list, the different implementations
+ which will be searched. The ``Python2_FIND_IMPLEMENTATIONS`` variable can
+ hold the following values:
+
+ * ``CPython``: this is the standard implementation. Various products, like
+ ``Anaconda`` or ``ActivePython``, rely on this implementation.
+ * ``IronPython``: This implementation use the ``CSharp`` language for
+ ``.NET Framework`` on top of the `Dynamic Language Runtime` (``DLR``).
+ See `IronPython <http://ironpython.net>`_.
+ * ``PyPy``: This implementation use ``RPython`` language and
+ ``RPython translation toolchain`` to produce the python interpreter.
+ See `PyPy <https://www.pypy.org>`_.
+
+ The default value is:
+
+ * Windows platform: ``CPython``, ``IronPython``
+ * Other platforms: ``CPython``
+
+ .. note::
+
+ This hint has the lowest priority of all hints, so even if, for example,
+ you specify ``IronPython`` first and ``CPython`` in second, a python
+ product based on ``CPython`` can be selected because, for example with
+ ``Python2_FIND_STRATEGY=LOCATION``, each location will be search first for
+ ``IronPython`` and second for ``CPython``.
+
+ .. note::
+
+ When ``IronPython`` is specified, on platforms other than ``Windows``, the
+ ``.Net`` interpreter (i.e. ``mono`` command) is expected to be available
+ through the ``PATH`` variable.
+
Artifacts Specification
^^^^^^^^^^^^^^^^^^^^^^^
@@ -209,6 +268,9 @@ setting the following variables:
``Python2_COMPILER``
The path to the compiler.
+``Python2_DOTNET_LAUNCHER``
+ The ``.Net`` interpreter. Only used by ``IronPython`` implementation.
+
``Python2_LIBRARY``
The path to the library. It will be used to compute the
variables ``Python2_LIBRARIES``, ``Python2_LIBRAY_DIRS`` and
@@ -235,6 +297,22 @@ setting the following variables:
If more than one artifact is specified, it is the user's responsability to
ensure the consistency of the various artifacts.
+By default, this module supports multiple calls in different directories of a
+project with different version/component requirements while providing correct
+and consistent results for each call. To support this behavior, ``CMake`` cache
+is not used in the traditional way which can be problematic for interactive
+specification. So, to enable also interactive specification, module behavior
+can be controled with the following variable:
+
+``Python2_ARTIFACTS_INTERACTIVE``
+ Selects the behavior of the module. This is a boolean variable:
+
+ * If set to ``TRUE``: Create CMake cache entries for the above artifact
+ specification variables so that users can edit them interactively.
+ This disables support for multiple version/component requirements.
+ * If set to ``FALSE`` or undefined: Enable multiple version/component
+ requirements.
+
Commands
^^^^^^^^
diff --git a/Modules/FindPython3.cmake b/Modules/FindPython3.cmake
index c9a5d09..f142c07 100644
--- a/Modules/FindPython3.cmake
+++ b/Modules/FindPython3.cmake
@@ -13,13 +13,24 @@ The following components are supported:
* ``Interpreter``: search for Python 3 interpreter
* ``Compiler``: search for Python 3 compiler. Only offered by IronPython.
* ``Development``: search for development artifacts (include directories and
- libraries)
+ libraries). This component includes two sub-components which can be specified
+ independently:
+
+ * ``Development.Module``: search for artifacts for Python 3 module
+ developments.
+ * ``Development.Embed``: search for artifacts for Python 3 embedding
+ developments.
+
* ``NumPy``: search for NumPy include directories.
If no ``COMPONENTS`` are specified, ``Interpreter`` is assumed.
+If component ``Development`` is specified, it implies sub-components
+``Development.Module`` and ``Development.Embed``.
+
To ensure consistent versions between components ``Interpreter``, ``Compiler``,
-``Development`` and ``NumPy``, specify all components at the same time::
+``Development`` (or one of its sub-components) and ``NumPy``, specify all
+components at the same time::
find_package (Python3 COMPONENTS Interpreter Development)
@@ -31,10 +42,11 @@ for you.
.. note::
- If components ``Interpreter`` and ``Development`` are both specified, this
- module search only for interpreter with same platform architecture as the one
- defined by ``CMake`` configuration. This contraint does not apply if only
- ``Interpreter`` component is specified.
+ If components ``Interpreter`` and ``Development`` (or one of its
+ sub-components) are both specified, this module search only for interpreter
+ with same platform architecture as the one defined by ``CMake``
+ configuration. This contraint does not apply if only ``Interpreter``
+ component is specified.
Imported Targets
^^^^^^^^^^^^^^^^
@@ -46,12 +58,12 @@ This module defines the following :ref:`Imported Targets <Imported Targets>`
Python 3 interpreter. Target defined if component ``Interpreter`` is found.
``Python3::Compiler``
Python 3 compiler. Target defined if component ``Compiler`` is found.
-``Python3::Python``
- Python 3 library for Python embedding. Target defined if component
- ``Development`` is found.
``Python3::Module``
Python 3 library for Python module. Target defined if component
- ``Development`` is found.
+ ``Development.Module`` is found.
+``Python3::Python``
+ Python 3 library for Python embedding. Target defined if component
+ ``Development.Embed`` is found.
``Python3::NumPy``
NumPy library for Python 3. Target defined if component ``NumPy`` is found.
@@ -74,33 +86,40 @@ This module will set the following variables in your project
* Anaconda
* Canopy
* IronPython
+ * PyPy
``Python3_STDLIB``
Standard platform independent installation directory.
Information returned by
- ``distutils.sysconfig.get_python_lib(plat_specific=False,standard_lib=True)``.
+ ``distutils.sysconfig.get_python_lib(plat_specific=False,standard_lib=True)``
+ or else ``sysconfig.get_path('stdlib')``.
``Python3_STDARCH``
Standard platform dependent installation directory.
Information returned by
- ``distutils.sysconfig.get_python_lib(plat_specific=True,standard_lib=True)``.
+ ``distutils.sysconfig.get_python_lib(plat_specific=True,standard_lib=True)``
+ or else ``sysconfig.get_path('platstdlib')``.
``Python3_SITELIB``
Third-party platform independent installation directory.
Information returned by
- ``distutils.sysconfig.get_python_lib(plat_specific=False,standard_lib=False)``.
+ ``distutils.sysconfig.get_python_lib(plat_specific=False,standard_lib=False)``
+ or else ``sysconfig.get_path('purelib')``.
``Python3_SITEARCH``
Third-party platform dependent installation directory.
Information returned by
- ``distutils.sysconfig.get_python_lib(plat_specific=True,standard_lib=False)``.
+ ``distutils.sysconfig.get_python_lib(plat_specific=True,standard_lib=False)``
+ or else ``sysconfig.get_path('platlib')``.
``Python3_SOABI``
Extension suffix for modules.
Information returned by
- ``distutils.sysconfig.get_config_flag('SOABI')`` or computed from
- ``distutils.sysconfig.get_config_flag('EXT_SUFFIX')`` or
- ``python3-config --extension-suffix``.
+ ``distutils.sysconfig.get_config_var('SOABI')`` or computed from
+ ``distutils.sysconfig.get_config_var('EXT_SUFFIX')`` or
+ ``python3-config --extension-suffix``. If package ``distutils.sysconfig`` is
+ not available, ``sysconfig.get_config_var('SOABI')`` or
+ ``sysconfig.get_config_var('EXT_SUFFIX')`` are used.
``Python3_Compiler_FOUND``
System has the Python 3 compiler.
``Python3_COMPILER``
@@ -108,8 +127,14 @@ This module will set the following variables in your project
``Python3_COMPILER_ID``
A short string unique to the compiler. Possible values include:
* IronPython
+``Python3_DOTNET_LAUNCHER``
+ The ``.Net`` interpreter. Only used by ``IronPython`` implementation.
``Python3_Development_FOUND``
System has the Python 3 development artifacts.
+``Python3_Development.Module_FOUND``
+ System has the Python 3 development artifacts for Python module.
+``Python3_Development.Embed_FOUND``
+ System has the Python 3 development artifacts for Python embedding.
``Python3_INCLUDE_DIRS``
The Python 3 include directories.
``Python3_LIBRARIES``
@@ -126,6 +151,8 @@ This module will set the following variables in your project
Python 3 minor version.
``Python3_VERSION_PATCH``
Python 3 patch version.
+``Python3_PyPy_VERSION``
+ Python 3 PyPy version.
``Python3_NumPy_FOUND``
System has the NumPy.
``Python3_NumPy_INCLUDE_DIRS``
@@ -234,8 +261,9 @@ Hints
* ``ONLY``: Only the virtual environment is used to look-up for the
interpreter.
* ``STANDARD``: The virtual environment is not used to look-up for the
- interpreter. In this case, variable ``Python3_FIND_REGISTRY`` (Windows)
- or ``CMAKE_FIND_FRAMEWORK`` (macOS) can be set with value ``LAST`` or
+ interpreter but environment variable ``PATH`` is always considered.
+ In this case, variable ``Python3_FIND_REGISTRY`` (Windows) or
+ ``CMAKE_FIND_FRAMEWORK`` (macOS) can be set with value ``LAST`` or
``NEVER`` to select preferably the interpreter from the virtual
environment.
@@ -245,6 +273,39 @@ Hints
recommended to also include the component ``Interpreter`` to get expected
result.
+``Python3_FIND_IMPLEMENTATIONS``
+ This variable defines, in an ordered list, the different implementations
+ which will be searched. The ``Python3_FIND_IMPLEMENTATIONS`` variable can
+ hold the following values:
+
+ * ``CPython``: this is the standard implementation. Various products, like
+ ``Anaconda`` or ``ActivePython``, rely on this implementation.
+ * ``IronPython``: This implementation use the ``CSharp`` language for
+ ``.NET Framework`` on top of the `Dynamic Language Runtime` (``DLR``).
+ See `IronPython <http://ironpython.net>`_.
+ * ``PyPy``: This implementation use ``RPython`` language and
+ ``RPython translation toolchain`` to produce the python interpreter.
+ See `PyPy <https://www.pypy.org>`_.
+
+ The default value is:
+
+ * Windows platform: ``CPython``, ``IronPython``
+ * Other platforms: ``CPython``
+
+ .. note::
+
+ This hint has the lowest priority of all hints, so even if, for example,
+ you specify ``IronPython`` first and ``CPython`` in second, a python
+ product based on ``CPython`` can be selected because, for example with
+ ``Python3_FIND_STRATEGY=LOCATION``, each location will be search first for
+ ``IronPython`` and second for ``CPython``.
+
+ .. note::
+
+ When ``IronPython`` is specified, on platforms other than ``Windows``, the
+ ``.Net`` interpreter (i.e. ``mono`` command) is expected to be available
+ through the ``PATH`` variable.
+
Artifacts Specification
^^^^^^^^^^^^^^^^^^^^^^^
@@ -257,6 +318,9 @@ setting the following variables:
``Python3_COMPILER``
The path to the compiler.
+``Python3_DOTNET_LAUNCHER``
+ The ``.Net`` interpreter. Only used by ``IronPython`` implementation.
+
``Python3_LIBRARY``
The path to the library. It will be used to compute the
variables ``Python3_LIBRARIES``, ``Python3_LIBRAY_DIRS`` and
@@ -283,6 +347,22 @@ setting the following variables:
If more than one artifact is specified, it is the user's responsability to
ensure the consistency of the various artifacts.
+By default, this module supports multiple calls in different directories of a
+project with different version/component requirements while providing correct
+and consistent results for each call. To support this behavior, ``CMake`` cache
+is not used in the traditional way which can be problematic for interactive
+specification. So, to enable also interactive specification, module behavior
+can be controled with the following variable:
+
+``Python3_ARTIFACTS_INTERACTIVE``
+ Selects the behavior of the module. This is a boolean variable:
+
+ * If set to ``TRUE``: Create CMake cache entries for the above artifact
+ specification variables so that users can edit them interactively.
+ This disables support for multiple version/component requirements.
+ * If set to ``FALSE`` or undefined: Enable multiple version/component
+ requirements.
+
Commands
^^^^^^^^
diff --git a/Modules/FindRuby.cmake b/Modules/FindRuby.cmake
index 7e01fbc..1bdee60 100644
--- a/Modules/FindRuby.cmake
+++ b/Modules/FindRuby.cmake
@@ -8,288 +8,505 @@ FindRuby
Find Ruby
This module finds if Ruby is installed and determines where the
-include files and libraries are. Ruby 1.8, 1.9, 2.0 and 2.1 are
+include files and libraries are. Ruby 1.8 through 2.7 are
supported.
The minimum required version of Ruby can be specified using the
-standard syntax, e.g. find_package(Ruby 1.8)
+standard syntax, e.g.
-It also determines what the name of the library is. This code sets
-the following variables:
+.. code-block:: cmake
-``RUBY_EXECUTABLE``
+ find_package(Ruby 2.5.1 EXACT REQUIRED)
+ # OR
+ find_package(Ruby 2.4)
+
+It also determines what the name of the library is.
+
+Virtual environments such as RVM are handled as well, by passing
+the argument ``Ruby_FIND_VIRTUALENV``
+
+Result Variables
+^^^^^^^^^^^^^^^^
+
+This module will set the following variables in your project:
+
+``Ruby_FOUND``
+ set to true if ruby was found successfully
+``Ruby_EXECUTABLE``
full path to the ruby binary
-``RUBY_INCLUDE_DIRS``
+``Ruby_INCLUDE_DIRS``
include dirs to be used when using the ruby library
-``RUBY_LIBRARY``
- full path to the ruby library
-``RUBY_VERSION``
+``Ruby_LIBRARIES``
+ libraries needed to use ruby from C.
+``Ruby_VERSION``
the version of ruby which was found, e.g. "1.8.7"
-``RUBY_FOUND``
- set to true if ruby ws found successfully
+``Ruby_VERSION_MAJOR``
+ Ruby major version.
+``Ruby_VERSION_MINOR``
+ Ruby minor version.
+``Ruby_VERSION_PATCH``
+ Ruby patch version.
+
Also:
-``RUBY_INCLUDE_PATH``
- same as RUBY_INCLUDE_DIRS, only provided for compatibility reasons, don't use it
+``Ruby_INCLUDE_PATH``
+ same as Ruby_INCLUDE_DIRS, only provided for compatibility reasons, don't use it
+
+Hints
+^^^^^
+
+``Ruby_ROOT_DIR``
+ Define the root directory of a Ruby installation.
+
+``Ruby_FIND_VIRTUALENV``
+ This variable defines the handling of virtual environments managed by
+ ``rvm``. It is meaningful only when a virtual environment
+ is active (i.e. the ``rvm`` script has been evaluated or at least the
+ ``MY_RUBY_HOME`` environment variable is set).
+ The ``Ruby_FIND_VIRTUALENV`` variable can be set to empty or
+ one of the following:
+
+ * ``FIRST``: The virtual environment is used before any other standard
+ paths to look-up for the interpreter. This is the default.
+ * ``ONLY``: Only the virtual environment is used to look-up for the
+ interpreter.
+ * ``STANDARD``: The virtual environment is not used to look-up for the
+ interpreter (assuming it isn't still in the PATH...)
+
#]=======================================================================]
-# RUBY_ARCHDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"archdir"@:>@)'`
-# RUBY_SITEARCHDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"sitearchdir"@:>@)'`
-# RUBY_SITEDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"sitelibdir"@:>@)'`
-# RUBY_LIBDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"libdir"@:>@)'`
-# RUBY_LIBRUBYARG=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"LIBRUBYARG_SHARED"@:>@)'`
+# Backwards compatibility
+# Define camel case versions of input variables
+foreach(UPPER
+ RUBY_EXECUTABLE
+ RUBY_LIBRARY
+ RUBY_INCLUDE_DIR
+ RUBY_CONFIG_INCLUDE_DIR
+ )
+ if (DEFINED ${UPPER})
+ string(REPLACE "RUBY_" "Ruby_" Camel ${UPPER})
+ if (NOT DEFINED ${Camel})
+ set(${Camel} ${${UPPER}})
+ endif()
+ endif()
+endforeach()
+
+# Ruby_ARCHDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"archdir"@:>@)'`
+# Ruby_SITEARCHDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"sitearchdir"@:>@)'`
+# Ruby_SITEDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"sitelibdir"@:>@)'`
+# Ruby_LIBDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"libdir"@:>@)'`
+# Ruby_LIBRUBYARG=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"LIBRUBYARG_SHARED"@:>@)'`
# uncomment the following line to get debug output for this file
-# set(_RUBY_DEBUG_OUTPUT TRUE)
+# set(_Ruby_DEBUG_OUTPUT TRUE)
# Determine the list of possible names of the ruby executable depending
# on which version of ruby is required
-set(_RUBY_POSSIBLE_EXECUTABLE_NAMES ruby)
-
-# if 1.9 is required, don't look for ruby18 and ruby1.8, default to version 1.8
-if(DEFINED Ruby_FIND_VERSION_MAJOR AND DEFINED Ruby_FIND_VERSION_MINOR)
- set(Ruby_FIND_VERSION_SHORT_NODOT "${Ruby_FIND_VERSION_MAJOR}${RUBY_FIND_VERSION_MINOR}")
- # we can't construct that if only major version is given
- set(_RUBY_POSSIBLE_EXECUTABLE_NAMES
- ruby${Ruby_FIND_VERSION_MAJOR}.${Ruby_FIND_VERSION_MINOR}
- ruby${Ruby_FIND_VERSION_MAJOR}${Ruby_FIND_VERSION_MINOR}
- ${_RUBY_POSSIBLE_EXECUTABLE_NAMES})
-else()
- set(Ruby_FIND_VERSION_SHORT_NODOT "18")
+set(_Ruby_POSSIBLE_EXECUTABLE_NAMES ruby)
+
+# If not specified, allow everything as far back as 1.8.0
+if(NOT DEFINED Ruby_FIND_VERSION_MAJOR)
+ set(Ruby_FIND_VERSION "1.8.0")
+ set(Ruby_FIND_VERSION_MAJOR 1)
+ set(Ruby_FIND_VERSION_MINOR 8)
+ set(Ruby_FIND_VERSION_PATCH 0)
+endif()
+
+if(_Ruby_DEBUG_OUTPUT)
+ message("Ruby_FIND_VERSION=${Ruby_FIND_VERSION}")
+ message("Ruby_FIND_VERSION_MAJOR=${Ruby_FIND_VERSION_MAJOR}")
+ message("Ruby_FIND_VERSION_MINOR=${Ruby_FIND_VERSION_MINOR}")
+ message("Ruby_FIND_VERSION_PATCH=${Ruby_FIND_VERSION_PATCH}")
endif()
+set(Ruby_FIND_VERSION_SHORT_NODOT "${Ruby_FIND_VERSION_MAJOR}${Ruby_FIND_VERSION_MINOR}")
+
+# Set name of possible executables, ignoring the minor
+# Eg:
+# 2.1.1 => from ruby27 to ruby21 included
+# 2.1 => from ruby27 to ruby21 included
+# 2 => from ruby26 to ruby20 included
+# empty => from ruby27 to ruby18 included
if(NOT Ruby_FIND_VERSION_EXACT)
- list(APPEND _RUBY_POSSIBLE_EXECUTABLE_NAMES ruby2.4 ruby24)
- list(APPEND _RUBY_POSSIBLE_EXECUTABLE_NAMES ruby2.3 ruby23)
- list(APPEND _RUBY_POSSIBLE_EXECUTABLE_NAMES ruby2.2 ruby22)
- list(APPEND _RUBY_POSSIBLE_EXECUTABLE_NAMES ruby2.1 ruby21)
- list(APPEND _RUBY_POSSIBLE_EXECUTABLE_NAMES ruby2.0 ruby20)
- list(APPEND _RUBY_POSSIBLE_EXECUTABLE_NAMES ruby1.9 ruby19)
-
- # if we want a version below 1.9, also look for ruby 1.8
- if("${Ruby_FIND_VERSION_SHORT_NODOT}" VERSION_LESS "19")
- list(APPEND _RUBY_POSSIBLE_EXECUTABLE_NAMES ruby1.8 ruby18)
+
+ foreach(_ruby_version RANGE 27 18 -1)
+ string(SUBSTRING "${_ruby_version}" 0 1 _ruby_major_version)
+ string(SUBSTRING "${_ruby_version}" 1 1 _ruby_minor_version)
+
+ if(NOT "${_ruby_major_version}${_ruby_minor_version}" VERSION_LESS ${Ruby_FIND_VERSION_SHORT_NODOT})
+ # Append both rubyX.Y and rubyXY (eg: ruby2.7 ruby27)
+ list(APPEND _Ruby_POSSIBLE_EXECUTABLE_NAMES ruby${_ruby_major_version}.${_ruby_minor_version} ruby${_ruby_major_version}${_ruby_minor_version})
+ else()
+ break()
+ endif()
+
+ endforeach()
+
+ list(REMOVE_DUPLICATES _Ruby_POSSIBLE_EXECUTABLE_NAMES)
+endif()
+
+# virtual environments handling (eg RVM)
+if (DEFINED ENV{MY_RUBY_HOME})
+ if(_Ruby_DEBUG_OUTPUT)
+ message("My ruby home is defined: $ENV{MY_RUBY_HOME}")
+ endif()
+
+ if (DEFINED Ruby_FIND_VIRTUALENV)
+ if (NOT Ruby_FIND_VIRTUALENV MATCHES "^(FIRST|ONLY|STANDARD)$")
+ message (AUTHOR_WARNING "FindRuby: ${Ruby_FIND_VIRTUALENV}: invalid value for 'Ruby_FIND_VIRTUALENV'. 'FIRST', 'ONLY' or 'STANDARD' expected. 'FIRST' will be used instead.")
+ set (_Ruby_FIND_VIRTUALENV "FIRST")
+ else()
+ set (_Ruby_FIND_VIRTUALENV ${Ruby_FIND_VIRTUALENV})
+ endif()
+ else()
+ set (_Ruby_FIND_VIRTUALENV FIRST)
endif()
+else()
+ if (DEFINED Ruby_FIND_VIRTUALENV)
+ message("Environment variable MY_RUBY_HOME isn't set, defaulting back to Ruby_FIND_VIRTUALENV=STANDARD")
+ endif()
+ set (_Ruby_FIND_VIRTUALENV STANDARD)
+endif()
- list(REMOVE_DUPLICATES _RUBY_POSSIBLE_EXECUTABLE_NAMES)
+if(_Ruby_DEBUG_OUTPUT)
+ message("_Ruby_POSSIBLE_EXECUTABLE_NAMES=${_Ruby_POSSIBLE_EXECUTABLE_NAMES}")
+ message("_Ruby_FIND_VIRTUALENV=${_Ruby_FIND_VIRTUALENV}")
endif()
-find_program(RUBY_EXECUTABLE NAMES ${_RUBY_POSSIBLE_EXECUTABLE_NAMES})
+function (_RUBY_VALIDATE_INTERPRETER)
+ if (NOT Ruby_EXECUTABLE)
+ return()
+ endif()
-if(RUBY_EXECUTABLE AND NOT RUBY_VERSION_MAJOR)
+ cmake_parse_arguments (PARSE_ARGV 0 _RVI "EXACT;CHECK_EXISTS" "" "")
+ if (_RVI_UNPARSED_ARGUMENTS)
+ set (expected_version ${_RVI_UNPARSED_ARGUMENTS})
+ else()
+ unset (expected_version)
+ endif()
+
+ if (_RVI_CHECK_EXISTS AND NOT EXISTS "${Ruby_EXECUTABLE}")
+ # interpreter does not exist anymore
+ set (_Ruby_Interpreter_REASON_FAILURE "Cannot find the interpreter \"${Ruby_EXECUTABLE}\"")
+ set_property (CACHE Ruby_EXECUTABLE PROPERTY VALUE "Ruby_EXECUTABLE-NOTFOUND")
+ return()
+ endif()
+
+ # Check the version it returns
+ # executable found must have a specific version
+ execute_process (COMMAND "${Ruby_EXECUTABLE}" -e "puts RUBY_VERSION"
+ RESULT_VARIABLE result
+ OUTPUT_VARIABLE version
+ ERROR_QUIET
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+ if (result OR (_RVI_EXACT AND NOT version VERSION_EQUAL expected_version) OR (version VERSION_LESS expected_version))
+ # interpreter not usable or has wrong major version
+ if (result)
+ set (_Ruby_Interpreter_REASON_FAILURE "Cannot use the interpreter \"${Ruby_EXECUTABLE}\"")
+ else()
+ set (_Ruby_Interpreter_REASON_FAILURE "Wrong major version for the interpreter \"${Ruby_EXECUTABLE}\"")
+ endif()
+ set_property (CACHE Ruby_EXECUTABLE PROPERTY VALUE "Ruby_EXECUTABLE-NOTFOUND")
+ return()
+ endif()
+
+endfunction()
+
+while(1)
+ # Virtual environments handling
+ if(_Ruby_FIND_VIRTUALENV MATCHES "^(FIRST|ONLY)$")
+ if(_Ruby_DEBUG_OUTPUT)
+ message("Inside Matches")
+ endif()
+ find_program (Ruby_EXECUTABLE
+ NAMES ${_Ruby_POSSIBLE_EXECUTABLE_NAMES}
+ NAMES_PER_DIR
+ PATHS ENV MY_RUBY_HOME
+ PATH_SUFFIXES bin Scripts
+ NO_CMAKE_PATH
+ NO_CMAKE_ENVIRONMENT_PATH
+ NO_SYSTEM_ENVIRONMENT_PATH
+ NO_CMAKE_SYSTEM_PATH)
+
+ if(_Ruby_DEBUG_OUTPUT)
+ message("Ruby_EXECUTABLE=${Ruby_EXECUTABLE}")
+ endif()
+
+ _RUBY_VALIDATE_INTERPRETER (${Ruby_FIND_VERSION}})
+ if(Ruby_EXECUTABLE)
+ break()
+ endif()
+ if(NOT _Ruby_FIND_VIRTUALENV STREQUAL "ONLY")
+ break()
+ endif()
+ elseif(_Ruby_DEBUG_OUTPUT)
+ message("_Ruby_FIND_VIRTUALENV doesn't match: ${_Ruby_FIND_VIRTUALENV}")
+ endif()
+
+ # try using standard paths
+ find_program (Ruby_EXECUTABLE
+ NAMES ${_Ruby_POSSIBLE_EXECUTABLE_NAMES}
+ NAMES_PER_DIR)
+ _RUBY_VALIDATE_INTERPRETER (${Ruby_FIND_VERSION})
+ if (Ruby_EXECUTABLE)
+ break()
+ endif()
+
+ break()
+endwhile()
+
+if(Ruby_EXECUTABLE AND NOT Ruby_VERSION_MAJOR)
function(_RUBY_CONFIG_VAR RBVAR OUTVAR)
- execute_process(COMMAND ${RUBY_EXECUTABLE} -r rbconfig -e "print RbConfig::CONFIG['${RBVAR}']"
- RESULT_VARIABLE _RUBY_SUCCESS
- OUTPUT_VARIABLE _RUBY_OUTPUT
+ execute_process(COMMAND ${Ruby_EXECUTABLE} -r rbconfig -e "print RbConfig::CONFIG['${RBVAR}']"
+ RESULT_VARIABLE _Ruby_SUCCESS
+ OUTPUT_VARIABLE _Ruby_OUTPUT
ERROR_QUIET)
- if(_RUBY_SUCCESS OR _RUBY_OUTPUT STREQUAL "")
- execute_process(COMMAND ${RUBY_EXECUTABLE} -r rbconfig -e "print Config::CONFIG['${RBVAR}']"
- RESULT_VARIABLE _RUBY_SUCCESS
- OUTPUT_VARIABLE _RUBY_OUTPUT
+ if(_Ruby_SUCCESS OR _Ruby_OUTPUT STREQUAL "")
+ execute_process(COMMAND ${Ruby_EXECUTABLE} -r rbconfig -e "print Config::CONFIG['${RBVAR}']"
+ RESULT_VARIABLE _Ruby_SUCCESS
+ OUTPUT_VARIABLE _Ruby_OUTPUT
ERROR_QUIET)
endif()
- set(${OUTVAR} "${_RUBY_OUTPUT}" PARENT_SCOPE)
+ set(${OUTVAR} "${_Ruby_OUTPUT}" PARENT_SCOPE)
endfunction()
# query the ruby version
- _RUBY_CONFIG_VAR("MAJOR" RUBY_VERSION_MAJOR)
- _RUBY_CONFIG_VAR("MINOR" RUBY_VERSION_MINOR)
- _RUBY_CONFIG_VAR("TEENY" RUBY_VERSION_PATCH)
+ _RUBY_CONFIG_VAR("MAJOR" Ruby_VERSION_MAJOR)
+ _RUBY_CONFIG_VAR("MINOR" Ruby_VERSION_MINOR)
+ _RUBY_CONFIG_VAR("TEENY" Ruby_VERSION_PATCH)
# query the different directories
- _RUBY_CONFIG_VAR("archdir" RUBY_ARCH_DIR)
- _RUBY_CONFIG_VAR("arch" RUBY_ARCH)
- _RUBY_CONFIG_VAR("rubyhdrdir" RUBY_HDR_DIR)
- _RUBY_CONFIG_VAR("rubyarchhdrdir" RUBY_ARCHHDR_DIR)
- _RUBY_CONFIG_VAR("libdir" RUBY_POSSIBLE_LIB_DIR)
- _RUBY_CONFIG_VAR("rubylibdir" RUBY_RUBY_LIB_DIR)
+ _RUBY_CONFIG_VAR("archdir" Ruby_ARCH_DIR)
+ _RUBY_CONFIG_VAR("arch" Ruby_ARCH)
+ _RUBY_CONFIG_VAR("rubyhdrdir" Ruby_HDR_DIR)
+ _RUBY_CONFIG_VAR("rubyarchhdrdir" Ruby_ARCHHDR_DIR)
+ _RUBY_CONFIG_VAR("libdir" Ruby_POSSIBLE_LIB_DIR)
+ _RUBY_CONFIG_VAR("rubylibdir" Ruby_RUBY_LIB_DIR)
# site_ruby
- _RUBY_CONFIG_VAR("sitearchdir" RUBY_SITEARCH_DIR)
- _RUBY_CONFIG_VAR("sitelibdir" RUBY_SITELIB_DIR)
+ _RUBY_CONFIG_VAR("sitearchdir" Ruby_SITEARCH_DIR)
+ _RUBY_CONFIG_VAR("sitelibdir" Ruby_SITELIB_DIR)
# vendor_ruby available ?
- execute_process(COMMAND ${RUBY_EXECUTABLE} -r vendor-specific -e "print 'true'"
- OUTPUT_VARIABLE RUBY_HAS_VENDOR_RUBY ERROR_QUIET)
+ execute_process(COMMAND ${Ruby_EXECUTABLE} -r vendor-specific -e "print 'true'"
+ OUTPUT_VARIABLE Ruby_HAS_VENDOR_RUBY ERROR_QUIET)
- if(RUBY_HAS_VENDOR_RUBY)
- _RUBY_CONFIG_VAR("vendorlibdir" RUBY_VENDORLIB_DIR)
- _RUBY_CONFIG_VAR("vendorarchdir" RUBY_VENDORARCH_DIR)
+ if(Ruby_HAS_VENDOR_RUBY)
+ _RUBY_CONFIG_VAR("vendorlibdir" Ruby_VENDORLIB_DIR)
+ _RUBY_CONFIG_VAR("vendorarchdir" Ruby_VENDORARCH_DIR)
endif()
# save the results in the cache so we don't have to run ruby the next time again
- set(RUBY_VERSION_MAJOR ${RUBY_VERSION_MAJOR} CACHE PATH "The Ruby major version" FORCE)
- set(RUBY_VERSION_MINOR ${RUBY_VERSION_MINOR} CACHE PATH "The Ruby minor version" FORCE)
- set(RUBY_VERSION_PATCH ${RUBY_VERSION_PATCH} CACHE PATH "The Ruby patch version" FORCE)
- set(RUBY_ARCH_DIR ${RUBY_ARCH_DIR} CACHE PATH "The Ruby arch dir" FORCE)
- set(RUBY_HDR_DIR ${RUBY_HDR_DIR} CACHE PATH "The Ruby header dir (1.9+)" FORCE)
- set(RUBY_ARCHHDR_DIR ${RUBY_ARCHHDR_DIR} CACHE PATH "The Ruby arch header dir (2.0+)" FORCE)
- set(RUBY_POSSIBLE_LIB_DIR ${RUBY_POSSIBLE_LIB_DIR} CACHE PATH "The Ruby lib dir" FORCE)
- set(RUBY_RUBY_LIB_DIR ${RUBY_RUBY_LIB_DIR} CACHE PATH "The Ruby ruby-lib dir" FORCE)
- set(RUBY_SITEARCH_DIR ${RUBY_SITEARCH_DIR} CACHE PATH "The Ruby site arch dir" FORCE)
- set(RUBY_SITELIB_DIR ${RUBY_SITELIB_DIR} CACHE PATH "The Ruby site lib dir" FORCE)
- set(RUBY_HAS_VENDOR_RUBY ${RUBY_HAS_VENDOR_RUBY} CACHE BOOL "Vendor Ruby is available" FORCE)
- set(RUBY_VENDORARCH_DIR ${RUBY_VENDORARCH_DIR} CACHE PATH "The Ruby vendor arch dir" FORCE)
- set(RUBY_VENDORLIB_DIR ${RUBY_VENDORLIB_DIR} CACHE PATH "The Ruby vendor lib dir" FORCE)
+ set(Ruby_VERSION_MAJOR ${Ruby_VERSION_MAJOR} CACHE PATH "The Ruby major version" FORCE)
+ set(Ruby_VERSION_MINOR ${Ruby_VERSION_MINOR} CACHE PATH "The Ruby minor version" FORCE)
+ set(Ruby_VERSION_PATCH ${Ruby_VERSION_PATCH} CACHE PATH "The Ruby patch version" FORCE)
+ set(Ruby_ARCH_DIR ${Ruby_ARCH_DIR} CACHE PATH "The Ruby arch dir" FORCE)
+ set(Ruby_HDR_DIR ${Ruby_HDR_DIR} CACHE PATH "The Ruby header dir (1.9+)" FORCE)
+ set(Ruby_ARCHHDR_DIR ${Ruby_ARCHHDR_DIR} CACHE PATH "The Ruby arch header dir (2.0+)" FORCE)
+ set(Ruby_POSSIBLE_LIB_DIR ${Ruby_POSSIBLE_LIB_DIR} CACHE PATH "The Ruby lib dir" FORCE)
+ set(Ruby_RUBY_LIB_DIR ${Ruby_RUBY_LIB_DIR} CACHE PATH "The Ruby ruby-lib dir" FORCE)
+ set(Ruby_SITEARCH_DIR ${Ruby_SITEARCH_DIR} CACHE PATH "The Ruby site arch dir" FORCE)
+ set(Ruby_SITELIB_DIR ${Ruby_SITELIB_DIR} CACHE PATH "The Ruby site lib dir" FORCE)
+ set(Ruby_HAS_VENDOR_RUBY ${Ruby_HAS_VENDOR_RUBY} CACHE BOOL "Vendor Ruby is available" FORCE)
+ set(Ruby_VENDORARCH_DIR ${Ruby_VENDORARCH_DIR} CACHE PATH "The Ruby vendor arch dir" FORCE)
+ set(Ruby_VENDORLIB_DIR ${Ruby_VENDORLIB_DIR} CACHE PATH "The Ruby vendor lib dir" FORCE)
mark_as_advanced(
- RUBY_ARCH_DIR
- RUBY_ARCH
- RUBY_HDR_DIR
- RUBY_ARCHHDR_DIR
- RUBY_POSSIBLE_LIB_DIR
- RUBY_RUBY_LIB_DIR
- RUBY_SITEARCH_DIR
- RUBY_SITELIB_DIR
- RUBY_HAS_VENDOR_RUBY
- RUBY_VENDORARCH_DIR
- RUBY_VENDORLIB_DIR
- RUBY_VERSION_MAJOR
- RUBY_VERSION_MINOR
- RUBY_VERSION_PATCH
+ Ruby_ARCH_DIR
+ Ruby_ARCH
+ Ruby_HDR_DIR
+ Ruby_ARCHHDR_DIR
+ Ruby_POSSIBLE_LIB_DIR
+ Ruby_RUBY_LIB_DIR
+ Ruby_SITEARCH_DIR
+ Ruby_SITELIB_DIR
+ Ruby_HAS_VENDOR_RUBY
+ Ruby_VENDORARCH_DIR
+ Ruby_VENDORLIB_DIR
+ Ruby_VERSION_MAJOR
+ Ruby_VERSION_MINOR
+ Ruby_VERSION_PATCH
)
endif()
-# In case RUBY_EXECUTABLE could not be executed (e.g. cross compiling)
+# In case Ruby_EXECUTABLE could not be executed (e.g. cross compiling)
# try to detect which version we found. This is not too good.
-if(RUBY_EXECUTABLE AND NOT RUBY_VERSION_MAJOR)
+if(Ruby_EXECUTABLE AND NOT Ruby_VERSION_MAJOR)
# by default assume 1.8.0
- set(RUBY_VERSION_MAJOR 1)
- set(RUBY_VERSION_MINOR 8)
- set(RUBY_VERSION_PATCH 0)
+ set(Ruby_VERSION_MAJOR 1)
+ set(Ruby_VERSION_MINOR 8)
+ set(Ruby_VERSION_PATCH 0)
# check whether we found 1.9.x
- if(${RUBY_EXECUTABLE} MATCHES "ruby1\\.?9")
- set(RUBY_VERSION_MAJOR 1)
- set(RUBY_VERSION_MINOR 9)
+ if(${Ruby_EXECUTABLE} MATCHES "ruby1\\.?9")
+ set(Ruby_VERSION_MAJOR 1)
+ set(Ruby_VERSION_MINOR 9)
endif()
# check whether we found 2.0.x
- if(${RUBY_EXECUTABLE} MATCHES "ruby2\\.?0")
- set(RUBY_VERSION_MAJOR 2)
- set(RUBY_VERSION_MINOR 0)
+ if(${Ruby_EXECUTABLE} MATCHES "ruby2\\.?0")
+ set(Ruby_VERSION_MAJOR 2)
+ set(Ruby_VERSION_MINOR 0)
endif()
# check whether we found 2.1.x
- if(${RUBY_EXECUTABLE} MATCHES "ruby2\\.?1")
- set(RUBY_VERSION_MAJOR 2)
- set(RUBY_VERSION_MINOR 1)
+ if(${Ruby_EXECUTABLE} MATCHES "ruby2\\.?1")
+ set(Ruby_VERSION_MAJOR 2)
+ set(Ruby_VERSION_MINOR 1)
endif()
# check whether we found 2.2.x
- if(${RUBY_EXECUTABLE} MATCHES "ruby2\\.?2")
- set(RUBY_VERSION_MAJOR 2)
- set(RUBY_VERSION_MINOR 2)
+ if(${Ruby_EXECUTABLE} MATCHES "ruby2\\.?2")
+ set(Ruby_VERSION_MAJOR 2)
+ set(Ruby_VERSION_MINOR 2)
endif()
# check whether we found 2.3.x
- if(${RUBY_EXECUTABLE} MATCHES "ruby2\\.?3")
- set(RUBY_VERSION_MAJOR 2)
- set(RUBY_VERSION_MINOR 3)
+ if(${Ruby_EXECUTABLE} MATCHES "ruby2\\.?3")
+ set(Ruby_VERSION_MAJOR 2)
+ set(Ruby_VERSION_MINOR 3)
endif()
# check whether we found 2.4.x
- if(${RUBY_EXECUTABLE} MATCHES "ruby2\\.?4")
- set(RUBY_VERSION_MAJOR 2)
- set(RUBY_VERSION_MINOR 4)
+ if(${Ruby_EXECUTABLE} MATCHES "ruby2\\.?4")
+ set(Ruby_VERSION_MAJOR 2)
+ set(Ruby_VERSION_MINOR 4)
+ endif()
+ # check whether we found 2.5.x
+ if(${Ruby_EXECUTABLE} MATCHES "ruby2\\.?5")
+ set(Ruby_VERSION_MAJOR 2)
+ set(Ruby_VERSION_MINOR 5)
+ endif()
+ # check whether we found 2.6.x
+ if(${Ruby_EXECUTABLE} MATCHES "ruby2\\.?6")
+ set(Ruby_VERSION_MAJOR 2)
+ set(Ruby_VERSION_MINOR 6)
+ endif()
+ # check whether we found 2.7.x
+ if(${Ruby_EXECUTABLE} MATCHES "ruby2\\.?7")
+ set(Ruby_VERSION_MAJOR 2)
+ set(Ruby_VERSION_MINOR 7)
endif()
endif()
-if(RUBY_VERSION_MAJOR)
- set(RUBY_VERSION "${RUBY_VERSION_MAJOR}.${RUBY_VERSION_MINOR}.${RUBY_VERSION_PATCH}")
- set(_RUBY_VERSION_SHORT "${RUBY_VERSION_MAJOR}.${RUBY_VERSION_MINOR}")
- set(_RUBY_VERSION_SHORT_NODOT "${RUBY_VERSION_MAJOR}${RUBY_VERSION_MINOR}")
- set(_RUBY_NODOT_VERSION "${RUBY_VERSION_MAJOR}${RUBY_VERSION_MINOR}${RUBY_VERSION_PATCH}")
+if(Ruby_VERSION_MAJOR)
+ set(Ruby_VERSION "${Ruby_VERSION_MAJOR}.${Ruby_VERSION_MINOR}.${Ruby_VERSION_PATCH}")
+ set(_Ruby_VERSION_SHORT "${Ruby_VERSION_MAJOR}.${Ruby_VERSION_MINOR}")
+ set(_Ruby_VERSION_SHORT_NODOT "${Ruby_VERSION_MAJOR}${Ruby_VERSION_MINOR}")
+ set(_Ruby_NODOT_VERSION "${Ruby_VERSION_MAJOR}${Ruby_VERSION_MINOR}${Ruby_VERSION_PATCH}")
endif()
-find_path(RUBY_INCLUDE_DIR
+# FIXME: Currently we require both the interpreter and development components to be found
+# in order to use either. See issue #20474.
+find_path(Ruby_INCLUDE_DIR
NAMES ruby.h
HINTS
- ${RUBY_HDR_DIR}
- ${RUBY_ARCH_DIR}
- /usr/lib/ruby/${_RUBY_VERSION_SHORT}/i586-linux-gnu/
+ ${Ruby_HDR_DIR}
+ ${Ruby_ARCH_DIR}
+ /usr/lib/ruby/${_Ruby_VERSION_SHORT}/i586-linux-gnu/
)
-set(RUBY_INCLUDE_DIRS ${RUBY_INCLUDE_DIR} )
+set(Ruby_INCLUDE_DIRS ${Ruby_INCLUDE_DIR})
# if ruby > 1.8 is required or if ruby > 1.8 was found, search for the config.h dir
-if( "${Ruby_FIND_VERSION_SHORT_NODOT}" GREATER 18 OR "${_RUBY_VERSION_SHORT_NODOT}" GREATER 18 OR RUBY_HDR_DIR)
- find_path(RUBY_CONFIG_INCLUDE_DIR
+if( Ruby_FIND_VERSION VERSION_GREATER_EQUAL "1.9" OR Ruby_VERSION VERSION_GREATER_EQUAL "1.9" OR Ruby_HDR_DIR)
+ find_path(Ruby_CONFIG_INCLUDE_DIR
NAMES ruby/config.h config.h
HINTS
- ${RUBY_HDR_DIR}/${RUBY_ARCH}
- ${RUBY_ARCH_DIR}
- ${RUBY_ARCHHDR_DIR}
+ ${Ruby_HDR_DIR}/${Ruby_ARCH}
+ ${Ruby_ARCH_DIR}
+ ${Ruby_ARCHHDR_DIR}
)
- set(RUBY_INCLUDE_DIRS ${RUBY_INCLUDE_DIRS} ${RUBY_CONFIG_INCLUDE_DIR} )
+ set(Ruby_INCLUDE_DIRS ${Ruby_INCLUDE_DIRS} ${Ruby_CONFIG_INCLUDE_DIR} )
endif()
# Determine the list of possible names for the ruby library
-set(_RUBY_POSSIBLE_LIB_NAMES ruby ruby-static ruby${_RUBY_VERSION_SHORT} ruby${_RUBY_VERSION_SHORT_NODOT} ruby-${_RUBY_VERSION_SHORT} ruby-${RUBY_VERSION})
+set(_Ruby_POSSIBLE_LIB_NAMES ruby ruby-static ruby${_Ruby_VERSION_SHORT} ruby${_Ruby_VERSION_SHORT_NODOT} ruby-${_Ruby_VERSION_SHORT} ruby-${Ruby_VERSION})
if(WIN32)
- set( _RUBY_MSVC_RUNTIME "" )
- if( MSVC_VERSION EQUAL 1200 )
- set( _RUBY_MSVC_RUNTIME "60" )
- endif()
- if( MSVC_VERSION EQUAL 1300 )
- set( _RUBY_MSVC_RUNTIME "70" )
- endif()
- if( MSVC_VERSION EQUAL 1310 )
- set( _RUBY_MSVC_RUNTIME "71" )
- endif()
- if( MSVC_VERSION EQUAL 1400 )
- set( _RUBY_MSVC_RUNTIME "80" )
- endif()
- if( MSVC_VERSION EQUAL 1500 )
- set( _RUBY_MSVC_RUNTIME "90" )
+ if(MSVC_TOOLSET_VERSION)
+ set(_Ruby_MSVC_RUNTIME "${MSVC_TOOLSET_VERSION}")
+ else()
+ set(_Ruby_MSVC_RUNTIME "")
endif()
- set(_RUBY_ARCH_PREFIX "")
+ set(_Ruby_ARCH_PREFIX "")
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
- set(_RUBY_ARCH_PREFIX "x64-")
+ set(_Ruby_ARCH_PREFIX "x64-")
endif()
- list(APPEND _RUBY_POSSIBLE_LIB_NAMES
- "${_RUBY_ARCH_PREFIX}msvcr${_RUBY_MSVC_RUNTIME}-ruby${_RUBY_NODOT_VERSION}"
- "${_RUBY_ARCH_PREFIX}msvcr${_RUBY_MSVC_RUNTIME}-ruby${_RUBY_NODOT_VERSION}-static"
- "${_RUBY_ARCH_PREFIX}msvcrt-ruby${_RUBY_NODOT_VERSION}"
- "${_RUBY_ARCH_PREFIX}msvcrt-ruby${_RUBY_NODOT_VERSION}-static" )
+ list(APPEND _Ruby_POSSIBLE_LIB_NAMES
+ "${_Ruby_ARCH_PREFIX}msvcr${_Ruby_MSVC_RUNTIME}-ruby${_Ruby_NODOT_VERSION}"
+ "${_Ruby_ARCH_PREFIX}msvcr${_Ruby_MSVC_RUNTIME}-ruby${_Ruby_NODOT_VERSION}-static"
+ "${_Ruby_ARCH_PREFIX}msvcrt-ruby${_Ruby_NODOT_VERSION}"
+ "${_Ruby_ARCH_PREFIX}msvcrt-ruby${_Ruby_NODOT_VERSION}-static" )
endif()
-find_library(RUBY_LIBRARY NAMES ${_RUBY_POSSIBLE_LIB_NAMES} HINTS ${RUBY_POSSIBLE_LIB_DIR} )
+find_library(Ruby_LIBRARY NAMES ${_Ruby_POSSIBLE_LIB_NAMES} HINTS ${Ruby_POSSIBLE_LIB_DIR} )
-include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
-set(_RUBY_REQUIRED_VARS RUBY_EXECUTABLE RUBY_INCLUDE_DIR RUBY_LIBRARY)
-if(_RUBY_VERSION_SHORT_NODOT GREATER 18)
- list(APPEND _RUBY_REQUIRED_VARS RUBY_CONFIG_INCLUDE_DIR)
+set(_Ruby_REQUIRED_VARS Ruby_EXECUTABLE Ruby_INCLUDE_DIR Ruby_LIBRARY)
+if(_Ruby_VERSION_SHORT_NODOT GREATER 18)
+ list(APPEND _Ruby_REQUIRED_VARS Ruby_CONFIG_INCLUDE_DIR)
endif()
-if(_RUBY_DEBUG_OUTPUT)
+if(_Ruby_DEBUG_OUTPUT)
message(STATUS "--------FindRuby.cmake debug------------")
- message(STATUS "_RUBY_POSSIBLE_EXECUTABLE_NAMES: ${_RUBY_POSSIBLE_EXECUTABLE_NAMES}")
- message(STATUS "_RUBY_POSSIBLE_LIB_NAMES: ${_RUBY_POSSIBLE_LIB_NAMES}")
- message(STATUS "RUBY_ARCH_DIR: ${RUBY_ARCH_DIR}")
- message(STATUS "RUBY_HDR_DIR: ${RUBY_HDR_DIR}")
- message(STATUS "RUBY_POSSIBLE_LIB_DIR: ${RUBY_POSSIBLE_LIB_DIR}")
- message(STATUS "Found RUBY_VERSION: \"${RUBY_VERSION}\" , short: \"${_RUBY_VERSION_SHORT}\", nodot: \"${_RUBY_VERSION_SHORT_NODOT}\"")
- message(STATUS "_RUBY_REQUIRED_VARS: ${_RUBY_REQUIRED_VARS}")
- message(STATUS "RUBY_EXECUTABLE: ${RUBY_EXECUTABLE}")
- message(STATUS "RUBY_LIBRARY: ${RUBY_LIBRARY}")
- message(STATUS "RUBY_INCLUDE_DIR: ${RUBY_INCLUDE_DIR}")
- message(STATUS "RUBY_CONFIG_INCLUDE_DIR: ${RUBY_CONFIG_INCLUDE_DIR}")
+ message(STATUS "_Ruby_POSSIBLE_EXECUTABLE_NAMES: ${_Ruby_POSSIBLE_EXECUTABLE_NAMES}")
+ message(STATUS "_Ruby_POSSIBLE_LIB_NAMES: ${_Ruby_POSSIBLE_LIB_NAMES}")
+ message(STATUS "Ruby_ARCH_DIR: ${Ruby_ARCH_DIR}")
+ message(STATUS "Ruby_HDR_DIR: ${Ruby_HDR_DIR}")
+ message(STATUS "Ruby_POSSIBLE_LIB_DIR: ${Ruby_POSSIBLE_LIB_DIR}")
+ message(STATUS "Found Ruby_VERSION: \"${Ruby_VERSION}\" , short: \"${_Ruby_VERSION_SHORT}\", nodot: \"${_Ruby_VERSION_SHORT_NODOT}\"")
+ message(STATUS "_Ruby_REQUIRED_VARS: ${_Ruby_REQUIRED_VARS}")
+ message(STATUS "Ruby_EXECUTABLE: ${Ruby_EXECUTABLE}")
+ message(STATUS "Ruby_LIBRARY: ${Ruby_LIBRARY}")
+ message(STATUS "Ruby_INCLUDE_DIR: ${Ruby_INCLUDE_DIR}")
+ message(STATUS "Ruby_CONFIG_INCLUDE_DIR: ${Ruby_CONFIG_INCLUDE_DIR}")
message(STATUS "--------------------")
endif()
-FIND_PACKAGE_HANDLE_STANDARD_ARGS(Ruby REQUIRED_VARS ${_RUBY_REQUIRED_VARS}
- VERSION_VAR RUBY_VERSION )
+include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(Ruby REQUIRED_VARS ${_Ruby_REQUIRED_VARS}
+ VERSION_VAR Ruby_VERSION )
+
+if(Ruby_FOUND)
+ set(Ruby_LIBRARIES ${Ruby_LIBRARY})
+endif()
mark_as_advanced(
- RUBY_EXECUTABLE
- RUBY_LIBRARY
- RUBY_INCLUDE_DIR
- RUBY_CONFIG_INCLUDE_DIR
+ Ruby_EXECUTABLE
+ Ruby_LIBRARY
+ Ruby_INCLUDE_DIR
+ Ruby_CONFIG_INCLUDE_DIR
)
-# Set some variables for compatibility with previous version of this file
-set(RUBY_POSSIBLE_LIB_PATH ${RUBY_POSSIBLE_LIB_DIR})
-set(RUBY_RUBY_LIB_PATH ${RUBY_RUBY_LIB_DIR})
-set(RUBY_INCLUDE_PATH ${RUBY_INCLUDE_DIRS})
+# Set some variables for compatibility with previous version of this file (no need to provide a CamelCase version of that...)
+set(RUBY_POSSIBLE_LIB_PATH ${Ruby_POSSIBLE_LIB_DIR})
+set(RUBY_RUBY_LIB_PATH ${Ruby_RUBY_LIB_DIR})
+set(RUBY_INCLUDE_PATH ${Ruby_INCLUDE_DIRS})
+
+# Backwards compatibility
+# Define upper case versions of output variables
+foreach(Camel
+ Ruby_EXECUTABLE
+ Ruby_INCLUDE_DIRS
+ Ruby_LIBRARY
+ Ruby_VERSION
+ Ruby_VERSION_MAJOR
+ Ruby_VERSION_MINOR
+ Ruby_VERSION_PATCH
+ Ruby_INCLUDE_PATH
+
+ Ruby_ARCH_DIR
+ Ruby_ARCH
+ Ruby_HDR_DIR
+ Ruby_ARCHHDR_DIR
+ Ruby_POSSIBLE_LIB_DIR
+ Ruby_RUBY_LIB_DIR
+ Ruby_SITEARCH_DIR
+ Ruby_SITELIB_DIR
+ Ruby_HAS_VENDOR_RUBY
+ Ruby_VENDORARCH_DIR
+
+ )
+ string(TOUPPER ${Camel} UPPER)
+ set(${UPPER} ${${Camel}})
+endforeach()
diff --git a/Modules/FindSWIG.cmake b/Modules/FindSWIG.cmake
index ae6ae56..2fded49 100644
--- a/Modules/FindSWIG.cmake
+++ b/Modules/FindSWIG.cmake
@@ -5,25 +5,49 @@
FindSWIG
--------
-Find Simplified Wrapper and Interface Generator (SWIG)
+Find the Simplified Wrapper and Interface Generator (SWIG_) executable.
-This module finds an installed SWIG. It sets the following variables:
-
-::
-
- SWIG_FOUND - set to "True" if SWIG is found
- SWIG_DIR - the directory where swig is installed
- SWIG_EXECUTABLE - the path to the swig executable
- SWIG_VERSION - the version number of the swig executable
+This module finds an installed SWIG and determines its version. If a
+``COMPONENTS`` or ``OPTIONAL_COMPONENTS`` argument is given to ``find_package``,
+it will also determine supported target languages. The module sents the
+following variables:
+``SWIG_FOUND``
+ Whether SWIG and any required components were found on the system.
+``SWIG_EXECUTABLE``
+ Path to the SWIG executable.
+``SWIG_DIR``
+ Path to the installed SWIG ``Lib`` directory (result of ``swig -swiglib``).
+``SWIG_VERSION``
+ SWIG executable version (result of ``swig -version``).
+``SWIG_<lang>_FOUND``
+ If ``COMPONENTS`` or ``OPTIONAL_COMPONENTS`` are requested, each available
+ target language ``<lang>`` (lowercase) will be set to TRUE.
-The minimum required version of SWIG can be specified using the
-standard syntax, e.g. :command:`find_package(SWIG 1.1)`
+Any ``COMPONENTS`` given to ``find_package`` should be the names of supported
+target languages as provided to the LANGUAGE argument of ``swig_add_library``,
+such as ``python`` or ``perl5``. Language names *must* be lowercase.
All information is collected from the ``SWIG_EXECUTABLE``, so the version
to be found can be changed from the command line by means of setting
-``SWIG_EXECUTABLE``
+``SWIG_EXECUTABLE``.
+
+Example usage requiring SWIG 4.0 or higher and Python language support, with
+optional Fortran support:
+
+.. code-block:: cmake
+
+ find_package(SWIG 4.0 COMPONENTS python OPTIONAL_COMPONENTS fortran)
+ if(SWIG_FOUND)
+ message("SWIG found: ${SWIG_EXECUTABLE}")
+ if(NOT SWIG_fortran_FOUND)
+ message(WARNING "SWIG Fortran bindings cannot be generated")
+ endif()
+ endif()
+
+.. _`SWIG`: http://swig.org
+
#]=======================================================================]
find_program(SWIG_EXECUTABLE NAMES swig4.0 swig3.0 swig2.0 swig)
@@ -58,10 +82,29 @@ if(SWIG_EXECUTABLE)
endif()
endif()
endif()
+
+ if(SWIG_FIND_COMPONENTS)
+ execute_process(COMMAND ${SWIG_EXECUTABLE} -help
+ OUTPUT_VARIABLE SWIG_swighelp_output
+ ERROR_VARIABLE SWIG_swighelp_error
+ RESULT_VARIABLE SWIG_swighelp_result)
+ if(SWIG_swighelp_result)
+ message(SEND_ERROR "Command \"${SWIG_EXECUTABLE} -help\" failed with output:\n${SWIG_swiglib_error}")
+ else()
+ string(REPLACE "\n" ";" SWIG_swighelp_output "${SWIG_swighelp_output}")
+ foreach(SWIG_line IN LISTS SWIG_swighelp_output)
+ if(SWIG_line MATCHES "-([A-Za-z0-9_]+) +- *Generate.*wrappers")
+ set(SWIG_${CMAKE_MATCH_1}_FOUND TRUE)
+ endif()
+ endforeach()
+ endif()
+ endif()
endif()
include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
-FIND_PACKAGE_HANDLE_STANDARD_ARGS(SWIG REQUIRED_VARS SWIG_EXECUTABLE SWIG_DIR
- VERSION_VAR SWIG_VERSION )
+find_package_handle_standard_args(
+ SWIG HANDLE_COMPONENTS
+ REQUIRED_VARS SWIG_EXECUTABLE SWIG_DIR
+ VERSION_VAR SWIG_VERSION)
mark_as_advanced(SWIG_DIR SWIG_VERSION SWIG_EXECUTABLE)
diff --git a/Modules/FindSquish.cmake b/Modules/FindSquish.cmake
index 7d49505..16f5ab8 100644
--- a/Modules/FindSquish.cmake
+++ b/Modules/FindSquish.cmake
@@ -9,8 +9,7 @@ FindSquish
-This module can be used to find Squish. Currently Squish versions 3
-and 4 are supported.
+This module can be used to find Squish.
::
@@ -39,12 +38,12 @@ and 4 are supported.
-It provides the function squish_v4_add_test() for adding a squish test
-to cmake using Squish 4.x:
+It provides the function squish_add_test() for adding a squish test
+to cmake using Squish >= 4.x:
::
- squish_v4_add_test(cmakeTestName
+ squish_add_test(cmakeTestName
AUT targetName SUITE suiteName TEST squishTestName
[SETTINGSGROUP group] [PRE_COMMAND command] [POST_COMMAND command] )
@@ -78,9 +77,9 @@ The arguments have the following meaning:
::
enable_testing()
- find_package(Squish 4.0)
+ find_package(Squish 6.5)
if (SQUISH_FOUND)
- squish_v4_add_test(myTestName
+ squish_add_test(myTestName
AUT myApp
SUITE ${CMAKE_SOURCE_DIR}/tests/mySuite
TEST someSquishTest
@@ -105,19 +104,12 @@ provided:
::
enable_testing()
- find_package(Squish)
+ find_package(Squish 3.0)
if (SQUISH_FOUND)
squish_v3_add_test(myTestName myApplication testCase envVars testWrapper)
endif ()
-
-macro SQUISH_ADD_TEST(testName applicationUnderTest testCase envVars
-testWrapper)
-
-::
-
- This is deprecated. Use SQUISH_V3_ADD_TEST() if you are using Squish 3.x instead.
#]=======================================================================]
set(SQUISH_INSTALL_DIR_STRING "Directory containing the bin, doc, and lib directories for Squish; this should be the root of the installation directory.")
@@ -137,7 +129,8 @@ if(NOT SQUISH_INSTALL_DIR)
string(REPLACE "//" "/" SQUISH_INSTALL_DIR_SEARCH "${SQUISH_INSTALL_DIR_SEARCH}")
# Look for an installation
- find_path(SQUISH_INSTALL_DIR bin/squishrunner
+ find_path(SQUISH_INSTALL_DIR
+ NAMES bin/squishrunner bin/squishrunner.exe
HINTS
# Look for an environment variable SQUISH_INSTALL_DIR.
ENV SQUISH_INSTALL_DIR
@@ -169,9 +162,9 @@ endif()
set(SQUISH_VERSION)
-set(SQUISH_VERSION_MAJOR )
-set(SQUISH_VERSION_MINOR )
-set(SQUISH_VERSION_PATCH )
+set(SQUISH_VERSION_MAJOR)
+set(SQUISH_VERSION_MINOR)
+set(SQUISH_VERSION_PATCH)
# record if executables are set
if(SQUISH_CLIENT_EXECUTABLE)
@@ -203,8 +196,8 @@ find_package_handle_standard_args(Squish REQUIRED_VARS SQUISH_INSTALL_DIR SQUI
set(_SQUISH_MODULE_DIR "${CMAKE_CURRENT_LIST_DIR}")
-macro(SQUISH_V3_ADD_TEST testName testAUT testCase envVars testWraper)
- if("${SQUISH_VERSION_MAJOR}" STREQUAL "4")
+macro(squish_v3_add_test testName testAUT testCase envVars testWraper)
+ if("${SQUISH_VERSION_MAJOR}" STRGREATER "3")
message(STATUS "Using squish_v3_add_test(), but SQUISH_VERSION_MAJOR is ${SQUISH_VERSION_MAJOR}.\nThis may not work.")
endif()
@@ -227,16 +220,9 @@ macro(SQUISH_V3_ADD_TEST testName testAUT testCase envVars testWraper)
endmacro()
-macro(SQUISH_ADD_TEST)
- message(STATUS "Using squish_add_test() is deprecated, use squish_v3_add_test() instead.")
- squish_v3_add_test(${ARGV})
-endmacro()
-
-
-function(SQUISH_V4_ADD_TEST testName)
-
- if(NOT "${SQUISH_VERSION_MAJOR}" STREQUAL "4")
- message(STATUS "Using squish_v4_add_test(), but SQUISH_VERSION_MAJOR is ${SQUISH_VERSION_MAJOR}.\nThis may not work.")
+function(squish_v4_add_test testName)
+ if(NOT "${SQUISH_VERSION_MAJOR}" STRGREATER "3")
+ message(STATUS "Using squish_add_test(), but SQUISH_VERSION_MAJOR is ${SQUISH_VERSION_MAJOR}.\nThis may not work.")
endif()
set(oneValueArgs AUT SUITE TEST SETTINGSGROUP PRE_COMMAND POST_COMMAND)
@@ -259,10 +245,6 @@ function(SQUISH_V4_ADD_TEST testName)
message(FATAL_ERROR "Required argument TEST not given for SQUISH_ADD_TEST()")
endif()
- get_target_property(testAUTLocation ${_SQUISH_AUT} LOCATION)
- get_filename_component(testAUTDir ${testAUTLocation} PATH)
- get_filename_component(testAUTName ${testAUTLocation} NAME)
-
get_filename_component(absTestSuite "${_SQUISH_SUITE}" ABSOLUTE)
if(NOT EXISTS "${absTestSuite}")
message(FATAL_ERROR "Could not find squish test suite ${_SQUISH_SUITE} (checked ${absTestSuite})")
@@ -277,11 +259,11 @@ function(SQUISH_V4_ADD_TEST testName)
set(_SQUISH_SETTINGSGROUP "CTest_$ENV{LOGNAME}")
endif()
- add_test(${testName}
- ${CMAKE_COMMAND} -V -VV
+ add_test(NAME ${testName}
+ COMMAND ${CMAKE_COMMAND} -V -VV
"-Dsquish_version:STRING=4"
- "-Dsquish_aut:STRING=${testAUTName}"
- "-Dsquish_aut_dir:STRING=${testAUTDir}"
+ "-Dsquish_aut:STRING=$<TARGET_FILE_BASE_NAME:${_SQUISH_AUT}>"
+ "-Dsquish_aut_dir:STRING=$<TARGET_FILE_DIR:${_SQUISH_AUT}>"
"-Dsquish_server_executable:STRING=${SQUISH_SERVER_EXECUTABLE}"
"-Dsquish_client_executable:STRING=${SQUISH_CLIENT_EXECUTABLE}"
"-Dsquish_libqtdir:STRING=${QT_LIBRARY_DIR}"
@@ -299,3 +281,11 @@ function(SQUISH_V4_ADD_TEST testName)
PROPERTIES FAIL_REGULAR_EXPRESSION "FAIL;FAILED;ERROR;FATAL"
)
endfunction()
+
+macro(squish_add_test)
+ if("${SQUISH_VERSION_MAJOR}" STRGREATER "3")
+ squish_v4_add_test(${ARGV})
+ else()
+ squish_v3_add_test(${ARGV})
+ endif()
+endmacro()
diff --git a/Modules/FindVulkan.cmake b/Modules/FindVulkan.cmake
index 55da55f..4b999b6 100644
--- a/Modules/FindVulkan.cmake
+++ b/Modules/FindVulkan.cmake
@@ -28,40 +28,46 @@ The module will also define two cache variables::
Vulkan_INCLUDE_DIR - the Vulkan include directory
Vulkan_LIBRARY - the path to the Vulkan library
+Hints
+^^^^^
+
+The ``VULKAN_SDK`` environment variable optionally specifies the
+location of the Vulkan SDK root directory for the given
+architecture. It is typically set by sourcing the toplevel
+``setup-env.sh`` script of the Vulkan SDK directory into the shell
+environment.
+
#]=======================================================================]
if(WIN32)
find_path(Vulkan_INCLUDE_DIR
NAMES vulkan/vulkan.h
- PATHS
+ HINTS
"$ENV{VULKAN_SDK}/Include"
)
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
find_library(Vulkan_LIBRARY
NAMES vulkan-1
- PATHS
+ HINTS
"$ENV{VULKAN_SDK}/Lib"
"$ENV{VULKAN_SDK}/Bin"
- )
+ )
elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
find_library(Vulkan_LIBRARY
NAMES vulkan-1
- PATHS
+ HINTS
"$ENV{VULKAN_SDK}/Lib32"
"$ENV{VULKAN_SDK}/Bin32"
- NO_SYSTEM_ENVIRONMENT_PATH
- )
+ )
endif()
else()
- find_path(Vulkan_INCLUDE_DIR
- NAMES vulkan/vulkan.h
- PATHS
- "$ENV{VULKAN_SDK}/include")
- find_library(Vulkan_LIBRARY
- NAMES vulkan
- PATHS
- "$ENV{VULKAN_SDK}/lib")
+ find_path(Vulkan_INCLUDE_DIR
+ NAMES vulkan/vulkan.h
+ HINTS "$ENV{VULKAN_SDK}/include")
+ find_library(Vulkan_LIBRARY
+ NAMES vulkan
+ HINTS "$ENV{VULKAN_SDK}/lib")
endif()
set(Vulkan_LIBRARIES ${Vulkan_LIBRARY})
diff --git a/Modules/FindX11.cmake b/Modules/FindX11.cmake
index b28dd12..aa83575 100644
--- a/Modules/FindX11.cmake
+++ b/Modules/FindX11.cmake
@@ -25,6 +25,10 @@ and also the following more fine grained variables and targets:
X11_Xaccessrules_INCLUDE_PATH,
X11_Xaccessstr_INCLUDE_PATH, X11_Xaccess_FOUND
X11_Xau_INCLUDE_PATH, X11_Xau_LIB, X11_Xau_FOUND, X11::Xau
+ X11_xcb_INCLUDE_PATH, X11_xcb_LIB, X11_xcb_FOUND, X11::xcb
+ X11_X11_xcb_INCLUDE_PATH, X11_X11_xcb_LIB, X11_X11_xcb_FOUND, X11::X11_xcb
+ X11_xcb_icccm_INCLUDE_PATH, X11_xcb_icccm_LIB, X11_xcb_icccm_FOUND, X11::xcb_icccm
+ X11_xcb_xkb_INCLUDE_PATH, X11_xcb_xkb_LIB, X11_xcb_xkb_FOUND, X11::xcb_xkb
X11_Xcomposite_INCLUDE_PATH, X11_Xcomposite_LIB, X11_Xcomposite_FOUND, X11::Xcomposite
X11_Xcursor_INCLUDE_PATH, X11_Xcursor_LIB, X11_Xcursor_FOUND, X11::Xcursor
X11_Xdamage_INCLUDE_PATH, X11_Xdamage_LIB, X11_Xdamage_FOUND, X11::Xdamage
@@ -38,6 +42,8 @@ and also the following more fine grained variables and targets:
X11_Xinerama_INCLUDE_PATH, X11_Xinerama_LIB, X11_Xinerama_FOUND, X11::Xinerama
X11_Xkb_INCLUDE_PATH,
X11_Xkblib_INCLUDE_PATH, X11_Xkb_FOUND, X11::Xkb
+ X11_xkbcommon_INCLUDE_PATH, X11_xkbcommon_LIB, X11_xkbcommon_FOUND, X11::xkbcommon
+ X11_xkbcommon_X11_INCLUDE_PATH,X11_xkbcommon_X11_LIB,X11_xkbcommon_X11_FOUND,X11::xkbcommon_X11
X11_xkbfile_INCLUDE_PATH, X11_xkbfile_LIB, X11_xkbfile_FOUND, X11::xkbfile
X11_Xmu_INCLUDE_PATH, X11_Xmu_LIB, X11_Xmu_FOUND, X11::Xmu
X11_Xpm_INCLUDE_PATH, X11_Xpm_LIB, X11_Xpm_FOUND, X11::Xpm
@@ -94,6 +100,9 @@ if (UNIX)
find_path(X11_Xaccessrules_INCLUDE_PATH X11/extensions/XKBrules.h ${X11_INC_SEARCH_PATH})
find_path(X11_Xaccessstr_INCLUDE_PATH X11/extensions/XKBstr.h ${X11_INC_SEARCH_PATH})
find_path(X11_Xau_INCLUDE_PATH X11/Xauth.h ${X11_INC_SEARCH_PATH})
+ find_path(X11_xcb_INCLUDE_PATH xcb/xcb.h ${X11_INC_SEARCH_PATH})
+ find_path(X11_X11_xcb_INCLUDE_PATH X11/Xlib-xcb.h ${X11_INC_SEARCH_PATH})
+ find_path(X11_xcb_icccm_INCLUDE_PATH xcb/xcb_icccm.h ${X11_INC_SEARCH_PATH})
find_path(X11_Xcomposite_INCLUDE_PATH X11/extensions/Xcomposite.h ${X11_INC_SEARCH_PATH})
find_path(X11_Xcursor_INCLUDE_PATH X11/Xcursor/Xcursor.h ${X11_INC_SEARCH_PATH})
find_path(X11_Xdamage_INCLUDE_PATH X11/extensions/Xdamage.h ${X11_INC_SEARCH_PATH})
@@ -107,6 +116,8 @@ if (UNIX)
find_path(X11_Xi_INCLUDE_PATH X11/extensions/XInput.h ${X11_INC_SEARCH_PATH})
find_path(X11_Xinerama_INCLUDE_PATH X11/extensions/Xinerama.h ${X11_INC_SEARCH_PATH})
find_path(X11_Xkb_INCLUDE_PATH X11/extensions/XKB.h ${X11_INC_SEARCH_PATH})
+ find_path(X11_xkbcommon_INCLUDE_PATH xkbcommon/xkbcommon.h ${X11_INC_SEARCH_PATH})
+ find_path(X11_xkbcommon_X11_INCLUDE_PATH xkbcommon/xkbcommon-x11.h ${X11_INC_SEARCH_PATH})
find_path(X11_Xkblib_INCLUDE_PATH X11/XKBlib.h ${X11_INC_SEARCH_PATH})
find_path(X11_xkbfile_INCLUDE_PATH X11/extensions/XKBfile.h ${X11_INC_SEARCH_PATH})
find_path(X11_Xmu_INCLUDE_PATH X11/Xmu/Xmu.h ${X11_INC_SEARCH_PATH})
@@ -137,6 +148,10 @@ if (UNIX)
find_library(X11_ICE_LIB ICE ${X11_LIB_SEARCH_PATH})
find_library(X11_SM_LIB SM ${X11_LIB_SEARCH_PATH})
find_library(X11_Xau_LIB Xau ${X11_LIB_SEARCH_PATH})
+ find_library(X11_xcb_LIB xcb ${X11_LIB_SEARCH_PATH})
+ find_library(X11_X11_xcb_LIB X11-xcb ${X11_LIB_SEARCH_PATH})
+ find_library(X11_xcb_icccm_LIB xcb-icccm ${X11_LIB_SEARCH_PATH})
+ find_library(X11_xcb_xkb_LIB xcb-xkb ${X11_LIB_SEARCH_PATH})
find_library(X11_Xcomposite_LIB Xcomposite ${X11_LIB_SEARCH_PATH})
find_library(X11_Xcursor_LIB Xcursor ${X11_LIB_SEARCH_PATH})
find_library(X11_Xdamage_LIB Xdamage ${X11_LIB_SEARCH_PATH})
@@ -146,6 +161,8 @@ if (UNIX)
find_library(X11_Xft_LIB Xft ${X11_LIB_SEARCH_PATH})
find_library(X11_Xi_LIB Xi ${X11_LIB_SEARCH_PATH})
find_library(X11_Xinerama_LIB Xinerama ${X11_LIB_SEARCH_PATH})
+ find_library(X11_xkbcommon_LIB xkbcommon ${X11_LIB_SEARCH_PATH})
+ find_library(X11_xkbcommon_X11_LIB xkbcommon-x11 ${X11_LIB_SEARCH_PATH})
find_library(X11_xkbfile_LIB xkbfile ${X11_LIB_SEARCH_PATH})
find_library(X11_Xmu_LIB Xmu ${X11_LIB_SEARCH_PATH})
find_library(X11_Xpm_LIB Xpm ${X11_LIB_SEARCH_PATH})
@@ -221,6 +238,22 @@ if (UNIX)
set(X11_Xau_FOUND TRUE)
endif ()
+ if (X11_xcb_LIB AND X11_xcb_INCLUDE_PATH)
+ set(X11_xcb_FOUND TRUE)
+ endif ()
+
+ if (X11_X11_xcb_LIB AND X11_X11_xcb_INCLUDE_PATH)
+ set(X11_X11_xcb_FOUND TRUE)
+ endif ()
+
+ if (X11_xcb_icccm_LIB AND X11_xcb_icccm_INCLUDE_PATH)
+ set(X11_xcb_icccm_FOUND TRUE)
+ endif ()
+
+ if (X11_xcb_xkb_LIB)
+ set(X11_xcb_xkb_FOUND TRUE)
+ endif ()
+
if (X11_Xdmcp_INCLUDE_PATH AND X11_Xdmcp_LIB)
set(X11_Xdmcp_FOUND TRUE)
list(APPEND X11_INCLUDE_DIR ${X11_Xdmcp_INCLUDE_PATH})
@@ -326,6 +359,14 @@ if (UNIX)
list(APPEND X11_INCLUDE_DIR ${X11_Xkb_INCLUDE_PATH} )
endif ()
+ if (X11_xkbcommon_INCLUDE_PATH AND X11_xkbcommon_LIB)
+ set(X11_xkbcommon_FOUND TRUE)
+ endif ()
+
+ if (X11_xkbcommon_X11_INCLUDE_PATH AND X11_xkbcommon_X11_LIB)
+ set(X11_xkbcommon_X11_FOUND TRUE)
+ endif ()
+
if (X11_xkbfile_INCLUDE_PATH AND X11_xkbfile_LIB AND X11_Xlib_INCLUDE_PATH)
set(X11_xkbfile_FOUND TRUE)
# Backwards compatibility.
@@ -478,6 +519,35 @@ if (UNIX)
INTERFACE_INCLUDE_DIRECTORIES "${X11_Xau_INCLUDE_PATH}")
endif ()
+ if (X11_xcb_FOUND AND NOT TARGET X11::xcb)
+ add_library(X11::xcb UNKNOWN IMPORTED)
+ set_target_properties(X11::xcb PROPERTIES
+ IMPORTED_LOCATION "${X11_xcb_LIB}"
+ INTERFACE_INCLUDE_DIRECTORIES "${X11_xcb_INCLUDE_PATH}")
+ endif ()
+
+ if (X11_X11_xcb_FOUND AND NOT TARGET X11::X11_xcb)
+ add_library(X11::X11_xcb UNKNOWN IMPORTED)
+ set_target_properties(X11::X11_xcb PROPERTIES
+ IMPORTED_LOCATION "${X11_X11_xcb_LIB}"
+ INTERFACE_INCLUDE_DIRECTORIES "${X11_X11_xcb_INCLUDE_PATH}"
+ INTERFACE_LINK_LIBRARIES "X11::xcb;X11::X11")
+ endif ()
+
+ if (X11_xcb_icccm_FOUND AND NOT TARGET X11::xcb_icccm)
+ add_library(X11::xcb_icccm UNKNOWN IMPORTED)
+ set_target_properties(X11::xcb_icccm PROPERTIES
+ IMPORTED_LOCATION "${X11_xcb_icccm_LIB}"
+ INTERFACE_LINK_LIBRARIES "X11::xcb")
+ endif ()
+
+ if (X11_xcb_xkb_FOUND AND NOT TARGET X11::xcb_xkb)
+ add_library(X11::xcb_xkb UNKNOWN IMPORTED)
+ set_target_properties(X11::xcb_xkb PROPERTIES
+ IMPORTED_LOCATION "${X11_xcb_xkb_LIB}"
+ INTERFACE_LINK_LIBRARIES "X11::xcb")
+ endif ()
+
if (X11_Xcomposite_FOUND AND NOT TARGET X11::Xcomposite)
add_library(X11::Xcomposite UNKNOWN IMPORTED)
set_target_properties(X11::Xcomposite PROPERTIES
@@ -572,6 +642,21 @@ if (UNIX)
INTERFACE_LINK_LIBRARIES "X11::X11")
endif ()
+ if (X11_xkbcommon_FOUND AND NOT TARGET X11::xkbcommon)
+ add_library(X11::xkbcommon UNKNOWN IMPORTED)
+ set_target_properties(X11::xkbcommon PROPERTIES
+ IMPORTED_LOCATION "${X11_xkbcommon_LIB}"
+ INTERFACE_INCLUDE_DIRECTORIES "${X11_xkbcommon_INCLUDE_PATH}")
+ endif ()
+
+ if (X11_xkbcommon_X11_FOUND AND NOT TARGET X11::xkbcommon_X11)
+ add_library(X11::xkbcommon_X11 UNKNOWN IMPORTED)
+ set_target_properties(X11::xkbcommon_X11 PROPERTIES
+ IMPORTED_LOCATION "${X11_xkbcommon_X11_LIB}"
+ INTERFACE_INCLUDE_DIRECTORIES "${X11_xkbcommon_X11_INCLUDE_PATH}"
+ INTERFACE_LINK_LIBRARIES "X11::X11;X11::xkbcommon")
+ endif ()
+
if (X11_xkbfile_FOUND AND NOT TARGET X11::xkbfile)
add_library(X11::xkbfile UNKNOWN IMPORTED)
set_target_properties(X11::xkbfile PROPERTIES
@@ -668,6 +753,11 @@ if (UNIX)
X11_Xext_LIB
X11_Xau_LIB
X11_Xau_INCLUDE_PATH
+ X11_xcb_LIB
+ X11_xcb_INCLUDE_PATH
+ X11_xcb_xkb_LIB
+ X11_X11_xcb_LIB
+ X11_X11_xcb_INCLUDE_PATH
X11_Xlib_INCLUDE_PATH
X11_Xutil_INCLUDE_PATH
X11_Xcomposite_INCLUDE_PATH
@@ -704,6 +794,10 @@ if (UNIX)
X11_Xdmcp_INCLUDE_PATH
X11_Xkb_INCLUDE_PATH
X11_Xkblib_INCLUDE_PATH
+ X11_xkbcommon_INCLUDE_PATH
+ X11_xkbcommon_LIB
+ X11_xkbcommon_X11_INCLUDE_PATH
+ X11_xkbcommon_X11_LIB
X11_xkbfile_INCLUDE_PATH
X11_xkbfile_LIB
X11_Xmu_INCLUDE_PATH
diff --git a/Modules/FortranCInterface/CMakeLists.txt b/Modules/FortranCInterface/CMakeLists.txt
index 381080b..13e4498 100644
--- a/Modules/FortranCInterface/CMakeLists.txt
+++ b/Modules/FortranCInterface/CMakeLists.txt
@@ -101,3 +101,7 @@ set_property(TARGET symbols PROPERTY POSITION_INDEPENDENT_CODE 1)
# Require symbols through Fortran.
add_executable(FortranCInterface main.F call_sub.f ${call_mod})
target_link_libraries(FortranCInterface PUBLIC symbols)
+
+file(GENERATE OUTPUT exe-$<CONFIG>.cmake CONTENT [[
+set(FortranCInterface_EXE "$<TARGET_FILE:FortranCInterface>")
+]])
diff --git a/Modules/FortranCInterface/Detect.cmake b/Modules/FortranCInterface/Detect.cmake
index 33de6c6..c75067b 100644
--- a/Modules/FortranCInterface/Detect.cmake
+++ b/Modules/FortranCInterface/Detect.cmake
@@ -43,17 +43,11 @@ set(FortranCInterface_COMPILED ${FortranCInterface_COMPILED})
unset(FortranCInterface_COMPILED CACHE)
# Locate the sample project executable.
+set(FortranCInterface_EXE)
if(FortranCInterface_COMPILED)
- find_program(FortranCInterface_EXE
- NAMES FortranCInterface${CMAKE_EXECUTABLE_SUFFIX}
- PATHS ${FortranCInterface_BINARY_DIR} ${FortranCInterface_BINARY_DIR}/Release
- NO_DEFAULT_PATH
- )
- set(FortranCInterface_EXE ${FortranCInterface_EXE})
- unset(FortranCInterface_EXE CACHE)
+ include(${FortranCInterface_BINARY_DIR}/exe-Release.cmake OPTIONAL)
else()
set(_result "Failed to compile")
- set(FortranCInterface_EXE)
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
"Fortran/C interface test project failed with the following output:\n"
"${FortranCInterface_OUTPUT}\n")
diff --git a/Modules/GoogleTest.cmake b/Modules/GoogleTest.cmake
index a5bb863..975ce6c 100644
--- a/Modules/GoogleTest.cmake
+++ b/Modules/GoogleTest.cmake
@@ -151,6 +151,8 @@ same as the Google Test name (i.e. ``suite.testcase``); see also
[PROPERTIES name1 value1...]
[TEST_LIST var]
[DISCOVERY_TIMEOUT seconds]
+ [XML_OUTPUT_DIR dir]
+ [DISCOVERY_MODE <POST_BUILD|PRE_TEST>]
)
``gtest_discover_tests`` sets up a post-build command on the test executable
@@ -236,6 +238,29 @@ same as the Google Test name (i.e. ``suite.testcase``); see also
problem. The ambiguous behavior of the ``TIMEOUT`` keyword in 3.10.1
and 3.10.2 has not been preserved.
+ ``XML_OUTPUT_DIR dir``
+ If specified, the parameter is passed along with ``--gtest_output=xml:``
+ to test executable. The actual file name is the same as the test target,
+ including prefix and suffix. This should be used instead of
+ ``EXTRA_ARGS --gtest_output=xml`` to avoid race conditions writing the
+ XML result output when using parallel test execution.
+
+ ``DISCOVERY_MODE``
+ Provides greater control over when ``gtest_discover_tests``performs test
+ discovery. By default, ``POST_BUILD`` sets up a post-build command
+ to perform test discovery at build time. In certain scenarios, like
+ cross-compiling, this ``POST_BUILD`` behavior is not desirable.
+ By contrast, ``PRE_TEST`` delays test discovery until just prior to test
+ execution. This way test discovery occurs in the target environment
+ where the test has a better chance at finding appropriate runtime
+ dependencies.
+
+ ``DISCOVERY_MODE`` defaults to the value of the
+ ``CMAKE_GTEST_DISCOVER_TESTS_DISCOVERY_MODE`` variable if it is not
+ passed when calling ``gtest_discover_tests``. This provides a mechanism
+ for globally selecting a preferred test discovery behavior without having
+ to modify each call site.
+
#]=======================================================================]
# Save project's policies
@@ -368,11 +393,12 @@ function(gtest_add_tests)
endfunction()
#------------------------------------------------------------------------------
+
function(gtest_discover_tests TARGET)
cmake_parse_arguments(
""
"NO_PRETTY_TYPES;NO_PRETTY_VALUES"
- "TEST_PREFIX;TEST_SUFFIX;WORKING_DIRECTORY;TEST_LIST;DISCOVERY_TIMEOUT"
+ "TEST_PREFIX;TEST_SUFFIX;WORKING_DIRECTORY;TEST_LIST;DISCOVERY_TIMEOUT;XML_OUTPUT_DIR;DISCOVERY_MODE"
"EXTRA_ARGS;PROPERTIES"
${ARGN}
)
@@ -386,6 +412,12 @@ function(gtest_discover_tests TARGET)
if(NOT _DISCOVERY_TIMEOUT)
set(_DISCOVERY_TIMEOUT 5)
endif()
+ if(NOT _DISCOVERY_MODE)
+ if(NOT CMAKE_GTEST_DISCOVER_TESTS_DISCOVERY_MODE)
+ set(CMAKE_GTEST_DISCOVER_TESTS_DISCOVERY_MODE "POST_BUILD")
+ endif()
+ set(_DISCOVERY_MODE ${CMAKE_GTEST_DISCOVER_TESTS_DISCOVERY_MODE})
+ endif()
get_property(
has_counter
@@ -417,34 +449,86 @@ function(gtest_discover_tests TARGET)
TARGET ${TARGET}
PROPERTY CROSSCOMPILING_EMULATOR
)
- add_custom_command(
- TARGET ${TARGET} POST_BUILD
- BYPRODUCTS "${ctest_tests_file}"
- COMMAND "${CMAKE_COMMAND}"
- -D "TEST_TARGET=${TARGET}"
- -D "TEST_EXECUTABLE=$<TARGET_FILE:${TARGET}>"
- -D "TEST_EXECUTOR=${crosscompiling_emulator}"
- -D "TEST_WORKING_DIR=${_WORKING_DIRECTORY}"
- -D "TEST_EXTRA_ARGS=${_EXTRA_ARGS}"
- -D "TEST_PROPERTIES=${_PROPERTIES}"
- -D "TEST_PREFIX=${_TEST_PREFIX}"
- -D "TEST_SUFFIX=${_TEST_SUFFIX}"
- -D "NO_PRETTY_TYPES=${_NO_PRETTY_TYPES}"
- -D "NO_PRETTY_VALUES=${_NO_PRETTY_VALUES}"
- -D "TEST_LIST=${_TEST_LIST}"
- -D "CTEST_FILE=${ctest_tests_file}"
- -D "TEST_DISCOVERY_TIMEOUT=${_DISCOVERY_TIMEOUT}"
- -P "${_GOOGLETEST_DISCOVER_TESTS_SCRIPT}"
- VERBATIM
- )
- file(WRITE "${ctest_include_file}"
- "if(EXISTS \"${ctest_tests_file}\")\n"
- " include(\"${ctest_tests_file}\")\n"
- "else()\n"
- " add_test(${TARGET}_NOT_BUILT ${TARGET}_NOT_BUILT)\n"
- "endif()\n"
- )
+ if(_DISCOVERY_MODE STREQUAL "POST_BUILD")
+ add_custom_command(
+ TARGET ${TARGET} POST_BUILD
+ BYPRODUCTS "${ctest_tests_file}"
+ COMMAND "${CMAKE_COMMAND}"
+ -D "TEST_TARGET=${TARGET}"
+ -D "TEST_EXECUTABLE=$<TARGET_FILE:${TARGET}>"
+ -D "TEST_EXECUTOR=${crosscompiling_emulator}"
+ -D "TEST_WORKING_DIR=${_WORKING_DIRECTORY}"
+ -D "TEST_EXTRA_ARGS=${_EXTRA_ARGS}"
+ -D "TEST_PROPERTIES=${_PROPERTIES}"
+ -D "TEST_PREFIX=${_TEST_PREFIX}"
+ -D "TEST_SUFFIX=${_TEST_SUFFIX}"
+ -D "NO_PRETTY_TYPES=${_NO_PRETTY_TYPES}"
+ -D "NO_PRETTY_VALUES=${_NO_PRETTY_VALUES}"
+ -D "TEST_LIST=${_TEST_LIST}"
+ -D "CTEST_FILE=${ctest_tests_file}"
+ -D "TEST_DISCOVERY_TIMEOUT=${_DISCOVERY_TIMEOUT}"
+ -D "TEST_XML_OUTPUT_DIR=${_XML_OUTPUT_DIR}"
+ -P "${_GOOGLETEST_DISCOVER_TESTS_SCRIPT}"
+ VERBATIM
+ )
+
+ file(WRITE "${ctest_include_file}"
+ "if(EXISTS \"${ctest_tests_file}\")\n"
+ " include(\"${ctest_tests_file}\")\n"
+ "else()\n"
+ " add_test(${TARGET}_NOT_BUILT ${TARGET}_NOT_BUILT)\n"
+ "endif()\n"
+ )
+ elseif(_DISCOVERY_MODE STREQUAL "PRE_TEST")
+
+ get_property(GENERATOR_IS_MULTI_CONFIG GLOBAL
+ PROPERTY GENERATOR_IS_MULTI_CONFIG
+ )
+
+ if(GENERATOR_IS_MULTI_CONFIG)
+ set(ctest_tests_file "${ctest_file_base}_tests-$<CONFIG>.cmake")
+ endif()
+
+ string(CONCAT ctest_include_content
+ "if(EXISTS \"$<TARGET_FILE:${TARGET}>\")" "\n"
+ " if(\"$<TARGET_FILE:${TARGET}>\" IS_NEWER_THAN \"${ctest_tests_file}\")" "\n"
+ " include(GoogleTestAddTests)" "\n"
+ " gtest_discover_tests_impl(" "\n"
+ " TEST_EXECUTABLE" " [==[" "$<TARGET_FILE:${TARGET}>" "]==]" "\n"
+ " TEST_EXECUTOR" " [==[" "${crosscompiling_emulator}" "]==]" "\n"
+ " TEST_WORKING_DIR" " [==[" "${_WORKING_DIRECTORY}" "]==]" "\n"
+ " TEST_EXTRA_ARGS" " [==[" "${_EXTRA_ARGS}" "]==]" "\n"
+ " TEST_PROPERTIES" " [==[" "${_PROPERTIES}" "]==]" "\n"
+ " TEST_PREFIX" " [==[" "${_TEST_PREFIX}" "]==]" "\n"
+ " TEST_SUFFIX" " [==[" "${_TEST_SUFFIX}" "]==]" "\n"
+ " NO_PRETTY_TYPES" " [==[" "${_NO_PRETTY_TYPES}" "]==]" "\n"
+ " NO_PRETTY_VALUES" " [==[" "${_NO_PRETTY_VALUES}" "]==]" "\n"
+ " TEST_LIST" " [==[" "${_TEST_LIST}" "]==]" "\n"
+ " CTEST_FILE" " [==[" "${ctest_tests_file}" "]==]" "\n"
+ " TEST_DISCOVERY_TIMEOUT" " [==[" "${_DISCOVERY_TIMEOUT}" "]==]" "\n"
+ " TEST_XML_OUTPUT_DIR" " [==[" "${_XML_OUTPUT_DIR}" "]==]" "\n"
+ " )" "\n"
+ " endif()" "\n"
+ " include(\"${ctest_tests_file}\")" "\n"
+ "else()" "\n"
+ " add_test(${TARGET}_NOT_BUILT ${TARGET}_NOT_BUILT)" "\n"
+ "endif()" "\n"
+ )
+
+ if(GENERATOR_IS_MULTI_CONFIG)
+ foreach(_config ${CMAKE_CONFIGURATION_TYPES})
+ file(GENERATE OUTPUT "${ctest_file_base}_include-${_config}.cmake" CONTENT "${ctest_include_content}" CONDITION $<CONFIG:${_config}>)
+ endforeach()
+ file(WRITE "${ctest_include_file}" "include(\"${ctest_file_base}_include-\${CTEST_CONFIGURATION_TYPE}.cmake\")")
+ else()
+ file(GENERATE OUTPUT "${ctest_file_base}_include.cmake" CONTENT "${ctest_include_content}")
+ file(WRITE "${ctest_include_file}" "include(\"${ctest_file_base}_include.cmake\")")
+ endif()
+
+ else()
+ message(SEND_ERROR "Unknown DISCOVERY_MODE: ${_DISCOVERY_MODE}")
+ endif()
# Add discovered tests to directory TEST_INCLUDE_FILES
set_property(DIRECTORY
diff --git a/Modules/GoogleTestAddTests.cmake b/Modules/GoogleTestAddTests.cmake
index 4abbbec..4af62ed 100644
--- a/Modules/GoogleTestAddTests.cmake
+++ b/Modules/GoogleTestAddTests.cmake
@@ -1,106 +1,188 @@
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.
-set(prefix "${TEST_PREFIX}")
-set(suffix "${TEST_SUFFIX}")
-set(extra_args ${TEST_EXTRA_ARGS})
-set(properties ${TEST_PROPERTIES})
-set(script)
-set(suite)
-set(tests)
-
-function(add_command NAME)
+cmake_minimum_required(VERSION ${CMAKE_VERSION})
+
+# Overwrite possibly existing ${_CTEST_FILE} with empty file
+set(flush_tests_MODE WRITE)
+
+# Flushes script to ${_CTEST_FILE}
+macro(flush_script)
+ file(${flush_tests_MODE} "${_CTEST_FILE}" "${script}")
+ set(flush_tests_MODE APPEND)
+
+ set(script "")
+endmacro()
+
+# Flushes tests_buffer to tests
+macro(flush_tests_buffer)
+ list(APPEND tests "${tests_buffer}")
+ set(tests_buffer "")
+endmacro()
+
+macro(add_command NAME)
set(_args "")
foreach(_arg ${ARGN})
if(_arg MATCHES "[^-./:a-zA-Z0-9_]")
- set(_args "${_args} [==[${_arg}]==]")
+ string(APPEND _args " [==[${_arg}]==]")
else()
- set(_args "${_args} ${_arg}")
+ string(APPEND _args " ${_arg}")
endif()
endforeach()
- set(script "${script}${NAME}(${_args})\n" PARENT_SCOPE)
-endfunction()
+ string(APPEND script "${NAME}(${_args})\n")
+ string(LENGTH "${script}" _script_len)
+ if(${_script_len} GREATER "50000")
+ flush_script()
+ endif()
+ # Unsets macro local variables to prevent leakage outside of this macro.
+ unset(_args)
+ unset(_script_len)
+endmacro()
+
+function(gtest_discover_tests_impl)
-# Run test executable to get list of available tests
-if(NOT EXISTS "${TEST_EXECUTABLE}")
- message(FATAL_ERROR
- "Specified test executable does not exist.\n"
- " Path: '${TEST_EXECUTABLE}'"
+ cmake_parse_arguments(
+ ""
+ ""
+ "NO_PRETTY_TYPES;NO_PRETTY_VALUES;TEST_EXECUTABLE;TEST_EXECUTOR;TEST_WORKING_DIR;TEST_PREFIX;TEST_SUFFIX;TEST_LIST;CTEST_FILE;TEST_DISCOVERY_TIMEOUT;TEST_XML_OUTPUT_DIR"
+ "TEST_EXTRA_ARGS;TEST_PROPERTIES"
+ ${ARGN}
)
-endif()
-execute_process(
- COMMAND ${TEST_EXECUTOR} "${TEST_EXECUTABLE}" --gtest_list_tests
- WORKING_DIRECTORY "${TEST_WORKING_DIR}"
- TIMEOUT ${TEST_DISCOVERY_TIMEOUT}
- OUTPUT_VARIABLE output
- RESULT_VARIABLE result
-)
-if(NOT ${result} EQUAL 0)
- string(REPLACE "\n" "\n " output "${output}")
- message(FATAL_ERROR
- "Error running test executable.\n"
- " Path: '${TEST_EXECUTABLE}'\n"
- " Result: ${result}\n"
- " Output:\n"
- " ${output}\n"
+
+ set(prefix "${_TEST_PREFIX}")
+ set(suffix "${_TEST_SUFFIX}")
+ set(extra_args ${_TEST_EXTRA_ARGS})
+ set(properties ${_TEST_PROPERTIES})
+ set(script)
+ set(suite)
+ set(tests)
+ set(tests_buffer)
+
+ # Run test executable to get list of available tests
+ if(NOT EXISTS "${_TEST_EXECUTABLE}")
+ message(FATAL_ERROR
+ "Specified test executable does not exist.\n"
+ " Path: '${_TEST_EXECUTABLE}'"
+ )
+ endif()
+ execute_process(
+ COMMAND ${_TEST_EXECUTOR} "${_TEST_EXECUTABLE}" --gtest_list_tests
+ WORKING_DIRECTORY "${_TEST_WORKING_DIR}"
+ TIMEOUT ${_TEST_DISCOVERY_TIMEOUT}
+ OUTPUT_VARIABLE output
+ RESULT_VARIABLE result
)
-endif()
+ if(NOT ${result} EQUAL 0)
+ string(REPLACE "\n" "\n " output "${output}")
+ message(FATAL_ERROR
+ "Error running test executable.\n"
+ " Path: '${_TEST_EXECUTABLE}'\n"
+ " Result: ${result}\n"
+ " Output:\n"
+ " ${output}\n"
+ )
+ endif()
-string(REPLACE "\n" ";" output "${output}")
-
-# Parse output
-foreach(line ${output})
- # Skip header
- if(NOT line MATCHES "gtest_main\\.cc")
- # Do we have a module name or a test name?
- if(NOT line MATCHES "^ ")
- # Module; remove trailing '.' to get just the name...
- string(REGEX REPLACE "\\.( *#.*)?" "" suite "${line}")
- if(line MATCHES "#" AND NOT NO_PRETTY_TYPES)
- string(REGEX REPLACE "/[0-9]\\.+ +#.*= +" "/" pretty_suite "${line}")
- else()
- set(pretty_suite "${suite}")
- endif()
- string(REGEX REPLACE "^DISABLED_" "" pretty_suite "${pretty_suite}")
- else()
- # Test name; strip spaces and comments to get just the name...
- string(REGEX REPLACE " +" "" test "${line}")
- if(test MATCHES "#" AND NOT NO_PRETTY_VALUES)
- string(REGEX REPLACE "/[0-9]+#GetParam..=" "/" pretty_test "${test}")
+ # Preserve semicolon in test-parameters
+ string(REPLACE [[;]] [[\;]] output "${output}")
+ string(REPLACE "\n" ";" output "${output}")
+
+ # Parse output
+ foreach(line ${output})
+ # Skip header
+ if(NOT line MATCHES "gtest_main\\.cc")
+ # Do we have a module name or a test name?
+ if(NOT line MATCHES "^ ")
+ # Module; remove trailing '.' to get just the name...
+ string(REGEX REPLACE "\\.( *#.*)?" "" suite "${line}")
+ if(line MATCHES "#" AND NOT _NO_PRETTY_TYPES)
+ string(REGEX REPLACE "/[0-9]\\.+ +#.*= +" "/" pretty_suite "${line}")
+ else()
+ set(pretty_suite "${suite}")
+ endif()
+ string(REGEX REPLACE "^DISABLED_" "" pretty_suite "${pretty_suite}")
else()
- string(REGEX REPLACE "#.*" "" pretty_test "${test}")
- endif()
- string(REGEX REPLACE "^DISABLED_" "" pretty_test "${pretty_test}")
- string(REGEX REPLACE "#.*" "" test "${test}")
- # ...and add to script
- add_command(add_test
- "${prefix}${pretty_suite}.${pretty_test}${suffix}"
- ${TEST_EXECUTOR}
- "${TEST_EXECUTABLE}"
- "--gtest_filter=${suite}.${test}"
- "--gtest_also_run_disabled_tests"
- ${extra_args}
- )
- if(suite MATCHES "^DISABLED" OR test MATCHES "^DISABLED")
+ # Test name; strip spaces and comments to get just the name...
+ string(REGEX REPLACE " +" "" test "${line}")
+ if(test MATCHES "#" AND NOT _NO_PRETTY_VALUES)
+ string(REGEX REPLACE "/[0-9]+#GetParam..=" "/" pretty_test "${test}")
+ else()
+ string(REGEX REPLACE "#.*" "" pretty_test "${test}")
+ endif()
+ string(REGEX REPLACE "^DISABLED_" "" pretty_test "${pretty_test}")
+ string(REGEX REPLACE "#.*" "" test "${test}")
+ if(NOT "${_TEST_XML_OUTPUT_DIR}" STREQUAL "")
+ set(TEST_XML_OUTPUT_PARAM "--gtest_output=xml:${_TEST_XML_OUTPUT_DIR}/${prefix}${pretty_suite}.${pretty_test}${suffix}.xml")
+ else()
+ unset(TEST_XML_OUTPUT_PARAM)
+ endif()
+
+ # sanitize test name for further processing downstream
+ set(testname "${prefix}${pretty_suite}.${pretty_test}${suffix}")
+ # escape \
+ string(REPLACE [[\]] [[\\]] testname "${testname}")
+ # escape ;
+ string(REPLACE [[;]] [[\;]] testname "${testname}")
+ # escape $
+ string(REPLACE [[$]] [[\$]] testname "${testname}")
+
+ # ...and add to script
+ add_command(add_test
+ "${testname}"
+ ${_TEST_EXECUTOR}
+ "${_TEST_EXECUTABLE}"
+ "--gtest_filter=${suite}.${test}"
+ "--gtest_also_run_disabled_tests"
+ ${TEST_XML_OUTPUT_PARAM}
+ ${extra_args}
+ )
+ if(suite MATCHES "^DISABLED" OR test MATCHES "^DISABLED")
+ add_command(set_tests_properties
+ "${testname}"
+ PROPERTIES DISABLED TRUE
+ )
+ endif()
add_command(set_tests_properties
- "${prefix}${pretty_suite}.${pretty_test}${suffix}"
- PROPERTIES DISABLED TRUE
+ "${testname}"
+ PROPERTIES
+ WORKING_DIRECTORY "${_TEST_WORKING_DIR}"
+ SKIP_REGULAR_EXPRESSION "\\\\[ SKIPPED \\\\]"
+ ${properties}
)
+ list(APPEND tests_buffer "${testname}")
+ list(LENGTH tests_buffer tests_buffer_length)
+ if(${tests_buffer_length} GREATER "250")
+ flush_tests_buffer()
+ endif()
endif()
- add_command(set_tests_properties
- "${prefix}${pretty_suite}.${pretty_test}${suffix}"
- PROPERTIES
- WORKING_DIRECTORY "${TEST_WORKING_DIR}"
- ${properties}
- )
- list(APPEND tests "${prefix}${pretty_suite}.${pretty_test}${suffix}")
endif()
- endif()
-endforeach()
+ endforeach()
+
-# Create a list of all discovered tests, which users may use to e.g. set
-# properties on the tests
-add_command(set ${TEST_LIST} ${tests})
+ # Create a list of all discovered tests, which users may use to e.g. set
+ # properties on the tests
+ flush_tests_buffer()
+ add_command(set ${_TEST_LIST} ${tests})
-# Write CTest script
-file(WRITE "${CTEST_FILE}" "${script}")
+ # Write CTest script
+ flush_script()
+
+endfunction()
+
+if(CMAKE_SCRIPT_MODE_FILE)
+ gtest_discover_tests_impl(
+ NO_PRETTY_TYPES ${NO_PRETTY_TYPES}
+ NO_PRETTY_VALUES ${NO_PRETTY_VALUES}
+ TEST_EXECUTABLE ${TEST_EXECUTABLE}
+ TEST_EXECUTOR ${TEST_EXECUTOR}
+ TEST_WORKING_DIR ${TEST_WORKING_DIR}
+ TEST_PREFIX ${TEST_PREFIX}
+ TEST_SUFFIX ${TEST_SUFFIX}
+ TEST_LIST ${TEST_LIST}
+ CTEST_FILE ${CTEST_FILE}
+ TEST_DISCOVERY_TIMEOUT ${TEST_DISCOVERY_TIMEOUT}
+ TEST_XML_OUTPUT_DIR ${TEST_XML_OUTPUT_DIR}
+ TEST_EXTRA_ARGS ${TEST_EXTRA_ARGS}
+ TEST_PROPERTIES ${TEST_PROPERTIES}
+ )
+endif()
diff --git a/Modules/Internal/CPack/CPackNuGet.cmake b/Modules/Internal/CPack/CPackNuGet.cmake
index 1f4bcfd..20eed2e 100644
--- a/Modules/Internal/CPack/CPackNuGet.cmake
+++ b/Modules/Internal/CPack/CPackNuGet.cmake
@@ -287,7 +287,11 @@ if(CPACK_NUGET_ORDINAL_MONOLITIC)
execute_process(
COMMAND "${NUGET_EXECUTABLE}" pack ${CPACK_NUGET_PACK_ADDITIONAL_OPTIONS}
WORKING_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}"
+ RESULT_VARIABLE _nuget_result
)
+ if(NOT _nuget_result EQUAL 0)
+ message(FATAL_ERROR "Nuget pack failed")
+ endif()
elseif(CPACK_NUGET_ALL_IN_ONE)
# This variable `CPACK_NUGET_ALL_IN_ONE` set by C++ code:
@@ -300,7 +304,11 @@ elseif(CPACK_NUGET_ALL_IN_ONE)
execute_process(
COMMAND "${NUGET_EXECUTABLE}" pack ${CPACK_NUGET_PACK_ADDITIONAL_OPTIONS}
WORKING_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}"
+ RESULT_VARIABLE _nuget_result
)
+ if(NOT _nuget_result EQUAL 0)
+ message(FATAL_ERROR "Nuget pack failed")
+ endif()
else()
# Is there any grouped component?
@@ -322,7 +330,11 @@ else()
execute_process(
COMMAND "${NUGET_EXECUTABLE}" pack ${CPACK_NUGET_PACK_ADDITIONAL_OPTIONS}
WORKING_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}"
+ RESULT_VARIABLE _nuget_result
)
+ if(NOT _nuget_result EQUAL 0)
+ message(FATAL_ERROR "Nuget pack failed")
+ endif()
endforeach()
endif()
# Is there any single component package needed?
@@ -341,7 +353,11 @@ else()
execute_process(
COMMAND "${NUGET_EXECUTABLE}" pack ${CPACK_NUGET_PACK_ADDITIONAL_OPTIONS}
WORKING_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}"
+ RESULT_VARIABLE _nuget_result
)
+ if(NOT _nuget_result EQUAL 0)
+ message(FATAL_ERROR "Nuget pack failed")
+ endif()
endforeach()
endif()
endif()
diff --git a/Modules/Internal/CPack/CPackRPM.cmake b/Modules/Internal/CPack/CPackRPM.cmake
index 3485e7d..08bbc68 100644
--- a/Modules/Internal/CPack/CPackRPM.cmake
+++ b/Modules/Internal/CPack/CPackRPM.cmake
@@ -1099,16 +1099,18 @@ function(cpack_rpm_generate_package)
# CPACK_RPM_POST_INSTALL_SCRIPT_FILE (or CPACK_RPM_<COMPONENT>_POST_INSTALL_SCRIPT_FILE)
# CPACK_RPM_POST_UNINSTALL_SCRIPT_FILE (or CPACK_RPM_<COMPONENT>_POST_UNINSTALL_SCRIPT_FILE)
- # May be used to embed a post (un)installation script in the spec file.
+ # CPACK_RPM_POST_TRANS_SCRIPT_FILE (or CPACK_RPM_<COMPONENT>_POST_TRANS_SCRIPT_FILE)
+ # May be used to embed a post installation/uninstallation/transaction script in the spec file.
# The referred script file(s) will be read and directly
- # put after the %post or %postun section
+ # put after the %post or %postun or %posttrans section
# ----------------------------------------------------------------
# CPACK_RPM_PRE_INSTALL_SCRIPT_FILE (or CPACK_RPM_<COMPONENT>_PRE_INSTALL_SCRIPT_FILE)
# CPACK_RPM_PRE_UNINSTALL_SCRIPT_FILE (or CPACK_RPM_<COMPONENT>_PRE_UNINSTALL_SCRIPT_FILE)
- # May be used to embed a pre (un)installation script in the spec file.
+ # CPACK_RPM_PRE_TRANS_SCRIPT_FILE (or CPACK_RPM_<COMPONENT>_PRE_TRANS_SCRIPT_FILE)
+ # May be used to embed a pre installation/uninstallation/transaction script in the spec file.
# The referred script file(s) will be read and directly
- # put after the %pre or %preun section
- foreach(RPM_SCRIPT_FILE_TYPE_ "INSTALL" "UNINSTALL")
+ # put after the %pre or %preun or %pretrans section
+ foreach(RPM_SCRIPT_FILE_TYPE_ "INSTALL" "UNINSTALL" "TRANS")
foreach(RPM_SCRIPT_FILE_TIME_ "PRE" "POST")
set("CPACK_RPM_${RPM_SCRIPT_FILE_TIME_}_${RPM_SCRIPT_FILE_TYPE_}_READ_FILE"
"${CPACK_RPM_${RPM_SCRIPT_FILE_TIME_}_${RPM_SCRIPT_FILE_TYPE_}_SCRIPT_FILE}")
@@ -1727,12 +1729,18 @@ mv %_topdir/tmpBBroot $RPM_BUILD_ROOT
\@RPM_SYMLINK_POSTINSTALL\@
\@CPACK_RPM_SPEC_POSTINSTALL\@
+%posttrans
+\@CPACK_RPM_SPEC_POSTTRANS\@
+
%postun
\@CPACK_RPM_SPEC_POSTUNINSTALL\@
%pre
\@CPACK_RPM_SPEC_PREINSTALL\@
+%pretrans
+\@CPACK_RPM_SPEC_PRETRANS\@
+
%preun
\@CPACK_RPM_SPEC_PREUNINSTALL\@
diff --git a/Modules/Internal/CPack/NSIS.template.in b/Modules/Internal/CPack/NSIS.template.in
index 660bfa3..6009ce0 100644
--- a/Modules/Internal/CPack/NSIS.template.in
+++ b/Modules/Internal/CPack/NSIS.template.in
@@ -41,6 +41,7 @@
RequestExecutionLevel admin
@CPACK_NSIS_DEFINES@
+@CPACK_NSIS_MANIFEST_DPI_AWARE_CODE@
!include Sections.nsh
diff --git a/Modules/Internal/CUDAToolkit.cmake b/Modules/Internal/CUDAToolkit.cmake
new file mode 100644
index 0000000..ab1e568
--- /dev/null
+++ b/Modules/Internal/CUDAToolkit.cmake
@@ -0,0 +1,225 @@
+# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
+# file Copyright.txt or https://cmake.org/licensing for details.
+
+# This file is for sharing code for finding basic CUDA toolkit information between
+# CMakeDetermineCUDACompiler.cmake and FindCUDAToolkit.cmake.
+
+# For NVCC we can easily deduce the SDK binary directory from the compiler path.
+if(CMAKE_CUDA_COMPILER_LOADED AND NOT CUDAToolkit_BIN_DIR AND CMAKE_CUDA_COMPILER_ID STREQUAL "NVIDIA")
+ get_filename_component(cuda_dir "${CMAKE_CUDA_COMPILER}" DIRECTORY)
+ set(CUDAToolkit_BIN_DIR "${cuda_dir}" CACHE PATH "")
+ mark_as_advanced(CUDAToolkit_BIN_DIR)
+ unset(cuda_dir)
+endif()
+
+# Try language- or user-provided path first.
+if(CUDAToolkit_BIN_DIR)
+ find_program(CUDAToolkit_NVCC_EXECUTABLE
+ NAMES nvcc nvcc.exe
+ PATHS ${CUDAToolkit_BIN_DIR}
+ NO_DEFAULT_PATH
+ )
+endif()
+
+# Search using CUDAToolkit_ROOT
+find_program(CUDAToolkit_NVCC_EXECUTABLE
+ NAMES nvcc nvcc.exe
+ PATHS ENV CUDA_PATH
+ PATH_SUFFIXES bin
+)
+
+# If the user specified CUDAToolkit_ROOT but nvcc could not be found, this is an error.
+if(NOT CUDAToolkit_NVCC_EXECUTABLE AND (DEFINED CUDAToolkit_ROOT OR DEFINED ENV{CUDAToolkit_ROOT}))
+ # Declare error messages now, print later depending on find_package args.
+ set(fail_base "Could not find nvcc executable in path specified by")
+ set(cuda_root_fail "${fail_base} CUDAToolkit_ROOT=${CUDAToolkit_ROOT}")
+ set(env_cuda_root_fail "${fail_base} environment variable CUDAToolkit_ROOT=$ENV{CUDAToolkit_ROOT}")
+
+ if(CUDAToolkit_FIND_REQUIRED)
+ if(DEFINED CUDAToolkit_ROOT)
+ message(FATAL_ERROR ${cuda_root_fail})
+ elseif(DEFINED ENV{CUDAToolkit_ROOT})
+ message(FATAL_ERROR ${env_cuda_root_fail})
+ endif()
+ else()
+ if(NOT CUDAToolkit_FIND_QUIETLY)
+ if(DEFINED CUDAToolkit_ROOT)
+ message(STATUS ${cuda_root_fail})
+ elseif(DEFINED ENV{CUDAToolkit_ROOT})
+ message(STATUS ${env_cuda_root_fail})
+ endif()
+ endif()
+ set(CUDAToolkit_FOUND FALSE)
+ unset(fail_base)
+ unset(cuda_root_fail)
+ unset(env_cuda_root_fail)
+ return()
+ endif()
+endif()
+
+# CUDAToolkit_ROOT cmake / env variable not specified, try platform defaults.
+#
+# - Linux: /usr/local/cuda-X.Y
+# - macOS: /Developer/NVIDIA/CUDA-X.Y
+# - Windows: C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\vX.Y
+#
+# We will also search the default symlink location /usr/local/cuda first since
+# if CUDAToolkit_ROOT is not specified, it is assumed that the symlinked
+# directory is the desired location.
+if(NOT CUDAToolkit_NVCC_EXECUTABLE)
+ if(UNIX)
+ if(NOT APPLE)
+ set(platform_base "/usr/local/cuda-")
+ else()
+ set(platform_base "/Developer/NVIDIA/CUDA-")
+ endif()
+ else()
+ set(platform_base "C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v")
+ endif()
+
+ # Build out a descending list of possible cuda installations, e.g.
+ file(GLOB possible_paths "${platform_base}*")
+ # Iterate the glob results and create a descending list.
+ set(possible_versions)
+ foreach (p ${possible_paths})
+ # Extract version number from end of string
+ string(REGEX MATCH "[0-9][0-9]?\\.[0-9]$" p_version ${p})
+ if(IS_DIRECTORY ${p} AND p_version)
+ list(APPEND possible_versions ${p_version})
+ endif()
+ endforeach()
+
+ # Cannot use list(SORT) because that is alphabetical, we need numerical.
+ # NOTE: this is not an efficient sorting strategy. But even if a user had
+ # every possible version of CUDA installed, this wouldn't create any
+ # significant overhead.
+ set(versions)
+ foreach (v ${possible_versions})
+ list(LENGTH versions num_versions)
+ # First version, nothing to compare with so just append.
+ if(num_versions EQUAL 0)
+ list(APPEND versions ${v})
+ else()
+ # Loop through list. Insert at an index when comparison is
+ # VERSION_GREATER since we want a descending list. Duplicates will not
+ # happen since this came from a glob list of directories.
+ set(i 0)
+ set(early_terminate FALSE)
+ while (i LESS num_versions)
+ list(GET versions ${i} curr)
+ if(v VERSION_GREATER curr)
+ list(INSERT versions ${i} ${v})
+ set(early_terminate TRUE)
+ break()
+ endif()
+ math(EXPR i "${i} + 1")
+ endwhile()
+ # If it did not get inserted, place it at the end.
+ if(NOT early_terminate)
+ list(APPEND versions ${v})
+ endif()
+ endif()
+ endforeach()
+
+ # With a descending list of versions, populate possible paths to search.
+ set(search_paths)
+ foreach (v ${versions})
+ list(APPEND search_paths "${platform_base}${v}")
+ endforeach()
+
+ # Force the global default /usr/local/cuda to the front on Unix.
+ if(UNIX)
+ list(INSERT search_paths 0 "/usr/local/cuda")
+ endif()
+
+ # Now search for nvcc again using the platform default search paths.
+ find_program(CUDAToolkit_NVCC_EXECUTABLE
+ NAMES nvcc nvcc.exe
+ PATHS ${search_paths}
+ PATH_SUFFIXES bin
+ )
+
+ # We are done with these variables now, cleanup for caller.
+ unset(platform_base)
+ unset(possible_paths)
+ unset(possible_versions)
+ unset(versions)
+ unset(i)
+ unset(early_terminate)
+ unset(search_paths)
+
+ if(NOT CUDAToolkit_NVCC_EXECUTABLE)
+ if(CUDAToolkit_FIND_REQUIRED)
+ message(FATAL_ERROR "Could not find nvcc, please set CUDAToolkit_ROOT.")
+ elseif(NOT CUDAToolkit_FIND_QUIETLY)
+ message(STATUS "Could not find nvcc, please set CUDAToolkit_ROOT.")
+ endif()
+
+ set(CUDAToolkit_FOUND FALSE)
+ return()
+ endif()
+endif()
+
+if(NOT CUDAToolkit_BIN_DIR AND CUDAToolkit_NVCC_EXECUTABLE)
+ get_filename_component(cuda_dir "${CUDAToolkit_NVCC_EXECUTABLE}" DIRECTORY)
+ set(CUDAToolkit_BIN_DIR "${cuda_dir}" CACHE PATH "" FORCE)
+ mark_as_advanced(CUDAToolkit_BIN_DIR)
+ unset(cuda_dir)
+endif()
+
+get_filename_component(CUDAToolkit_ROOT_DIR ${CUDAToolkit_BIN_DIR} DIRECTORY ABSOLUTE)
+
+# Handle cross compilation
+if(CMAKE_CROSSCOMPILING)
+ if(CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7-a")
+ # Support for NVPACK
+ set(CUDAToolkit_TARGET_NAME "armv7-linux-androideabi")
+ elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "arm")
+ # Support for arm cross compilation
+ set(CUDAToolkit_TARGET_NAME "armv7-linux-gnueabihf")
+ elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")
+ # Support for aarch64 cross compilation
+ if(ANDROID_ARCH_NAME STREQUAL "arm64")
+ set(CUDAToolkit_TARGET_NAME "aarch64-linux-androideabi")
+ else()
+ set(CUDAToolkit_TARGET_NAME "aarch64-linux")
+ endif(ANDROID_ARCH_NAME STREQUAL "arm64")
+ elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
+ set(CUDAToolkit_TARGET_NAME "x86_64-linux")
+ endif()
+
+ if(EXISTS "${CUDAToolkit_ROOT_DIR}/targets/${CUDAToolkit_TARGET_NAME}")
+ set(CUDAToolkit_TARGET_DIR "${CUDAToolkit_ROOT_DIR}/targets/${CUDAToolkit_TARGET_NAME}")
+ # add known CUDA target root path to the set of directories we search for programs, libraries and headers
+ list(PREPEND CMAKE_FIND_ROOT_PATH "${CUDAToolkit_TARGET_DIR}")
+
+ # Mark that we need to pop the root search path changes after we have
+ # found all cuda libraries so that searches for our cross-compilation
+ # libraries work when another cuda sdk is in CMAKE_PREFIX_PATH or
+ # PATh
+ set(_CUDAToolkit_Pop_ROOT_PATH True)
+ endif()
+else()
+ # Not cross compiling
+ set(CUDAToolkit_TARGET_DIR "${CUDAToolkit_ROOT_DIR}")
+ # Now that we have the real ROOT_DIR, find components inside it.
+ list(APPEND CMAKE_PREFIX_PATH ${CUDAToolkit_ROOT_DIR})
+
+ # Mark that we need to pop the prefix path changes after we have
+ # found the cudart library.
+ set(_CUDAToolkit_Pop_Prefix True)
+endif()
+
+# Find the include/ directory
+find_path(CUDAToolkit_INCLUDE_DIR
+ NAMES cuda_runtime.h
+)
+
+# Find a tentative CUDAToolkit_LIBRARY_DIR. FindCUDAToolkit overrides it by searching for the CUDA runtime,
+# but we can't do that here, as CMakeDetermineCUDACompiler wants to use it before the variables necessary
+# for find_library() have been initialized.
+if(EXISTS "${CUDAToolkit_TARGET_DIR}/lib64")
+ set(CUDAToolkit_LIBRARY_DIR "${CUDAToolkit_TARGET_DIR}/lib64")
+elseif(EXISTS "${CUDAToolkit_TARGET_DIR}/lib")
+ set(CUDAToolkit_LIBRARY_DIR "${CUDAToolkit_TARGET_DIR}/lib")
+endif()
diff --git a/Modules/Platform/Android-Common.cmake b/Modules/Platform/Android-Common.cmake
index 1affcd0..581fde4 100644
--- a/Modules/Platform/Android-Common.cmake
+++ b/Modules/Platform/Android-Common.cmake
@@ -73,7 +73,7 @@ if(CMAKE_ANDROID_STL_TYPE)
macro(__android_stl lang)
# FIXME: Add a way to add project-wide language-specific compile-only flags.
set(CMAKE_CXX_COMPILE_OBJECT
- "<CMAKE_CXX_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -o <OBJECT> -c <SOURCE> -nostdinc++")
+ "<CMAKE_CXX_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -o <OBJECT> -c <SOURCE> -nostdinc++")
string(APPEND CMAKE_${lang}_STANDARD_LIBRARIES " -nostdlib++")
endmacro()
else()
diff --git a/Modules/Platform/BlueGeneL.cmake b/Modules/Platform/BlueGeneL.cmake
index 082e46c..0ed9975 100644
--- a/Modules/Platform/BlueGeneL.cmake
+++ b/Modules/Platform/BlueGeneL.cmake
@@ -23,18 +23,18 @@ include(Platform/UnixPaths)
if(CMAKE_COMPILER_IS_GNUCC)
set(CMAKE_C_LINK_EXECUTABLE
- "<CMAKE_C_COMPILER> -Wl,-relax <FLAGS> <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES> -Wl,-lgcc,-lc -lnss_files -lnss_dns -lresolv")
+ "<CMAKE_C_COMPILER> -Wl,-relax <FLAGS> <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES> -Wl,-lgcc,-lc -lnss_files -lnss_dns -lresolv")
else()
# when using IBM xlc we probably don't want to link to -lgcc
set(CMAKE_C_LINK_EXECUTABLE
- "<CMAKE_C_COMPILER> -Wl,-relax <FLAGS> <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES> -Wl,-lc -lnss_files -lnss_dns -lresolv")
+ "<CMAKE_C_COMPILER> -Wl,-relax <FLAGS> <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES> -Wl,-lc -lnss_files -lnss_dns -lresolv")
endif()
if(CMAKE_COMPILER_IS_GNUCXX)
set(CMAKE_CXX_LINK_EXECUTABLE
- "<CMAKE_CXX_COMPILER> -Wl,-relax <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES> -Wl,-lstdc++,-lgcc,-lc -lnss_files -lnss_dns -lresolv")
+ "<CMAKE_CXX_COMPILER> -Wl,-relax <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES> -Wl,-lstdc++,-lgcc,-lc -lnss_files -lnss_dns -lresolv")
else()
# when using the IBM xlC we probably don't want to link to -lgcc
set(CMAKE_CXX_LINK_EXECUTABLE
- "<CMAKE_CXX_COMPILER> -Wl,-relax <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES> -Wl,-lstdc++,-lc -lnss_files -lnss_dns -lresolv")
+ "<CMAKE_CXX_COMPILER> -Wl,-relax <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES> -Wl,-lstdc++,-lc -lnss_files -lnss_dns -lresolv")
endif()
diff --git a/Modules/Platform/BlueGeneP-base.cmake b/Modules/Platform/BlueGeneP-base.cmake
index fe95b42..7095dd8 100644
--- a/Modules/Platform/BlueGeneP-base.cmake
+++ b/Modules/Platform/BlueGeneP-base.cmake
@@ -97,7 +97,7 @@ macro(__BlueGeneP_set_dynamic_flags compiler_id lang)
set(CMAKE_SHARED_LIBRARY_RUNTIME_${lang}_FLAG_SEP ":") # : or empty
set(BGP_${lang}_DEFAULT_EXE_FLAGS
- "<FLAGS> <CMAKE_${lang}_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
+ "<FLAGS> <CMAKE_${lang}_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
set(CMAKE_${lang}_LINK_EXECUTABLE
"<CMAKE_${lang}_COMPILER> -Wl,-relax ${BGP_${lang}_DYNAMIC_EXE_FLAGS} ${BGP_${lang}_DEFAULT_EXE_FLAGS}")
endmacro()
@@ -108,7 +108,7 @@ endmacro()
#
macro(__BlueGeneP_set_static_flags compiler_id lang)
set(BGP_${lang}_DEFAULT_EXE_FLAGS
- "<FLAGS> <CMAKE_${lang}_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
+ "<FLAGS> <CMAKE_${lang}_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
set(CMAKE_${lang}_LINK_EXECUTABLE
"<CMAKE_${lang}_COMPILER> -Wl,-relax ${BGP_${lang}_DEFAULT_EXE_FLAGS}")
endmacro()
diff --git a/Modules/Platform/BlueGeneQ-base.cmake b/Modules/Platform/BlueGeneQ-base.cmake
index 5e56d8e..94cb0a8 100644
--- a/Modules/Platform/BlueGeneQ-base.cmake
+++ b/Modules/Platform/BlueGeneQ-base.cmake
@@ -101,7 +101,7 @@ macro(__BlueGeneQ_common_setup compiler_id lang)
foreach(dir ${CMAKE_SYSTEM_INCLUDE_PATH})
string(APPEND BGQ_SYSTEM_INCLUDES " -I${dir}")
endforeach()
- set(CMAKE_C_COMPILE_OBJECT "<CMAKE_C_COMPILER> <DEFINES> ${BGQ_SYSTEM_INCLUDES} <INCLUDES> <FLAGS> -o <OBJECT> -c <SOURCE>")
+ set(CMAKE_C_COMPILE_OBJECT "<CMAKE_C_COMPILER> <DEFINES> ${BGQ_SYSTEM_INCLUDES} <INCLUDES> <FLAGS> -o <OBJECT> -c <SOURCE>")
set(CMAKE_CXX_COMPILE_OBJECT "<CMAKE_CXX_COMPILER> <DEFINES> ${BGQ_SYSTEM_INCLUDES} <INCLUDES> <FLAGS> -o <OBJECT> -c <SOURCE>")
#
@@ -146,7 +146,7 @@ macro(__BlueGeneQ_setup_dynamic compiler_id lang)
# For dynamic executables, need to provide special BG/Q arguments.
set(BGQ_${lang}_DEFAULT_EXE_FLAGS
- "<FLAGS> <CMAKE_${lang}_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
+ "<FLAGS> <CMAKE_${lang}_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
set(CMAKE_${lang}_LINK_EXECUTABLE
"<CMAKE_${lang}_COMPILER> -Wl,-relax ${BGQ_${lang}_DYNAMIC_EXE_FLAGS} ${BGQ_${lang}_DEFAULT_EXE_FLAGS}")
endmacro()
@@ -160,7 +160,7 @@ macro(__BlueGeneQ_setup_static compiler_id lang)
# For static executables, use default link settings.
set(BGQ_${lang}_DEFAULT_EXE_FLAGS
- "<FLAGS> <CMAKE_${lang}_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
+ "<FLAGS> <CMAKE_${lang}_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
set(CMAKE_${lang}_LINK_EXECUTABLE
"<CMAKE_${lang}_COMPILER> -Wl,-relax ${BGQ_${lang}_DEFAULT_EXE_FLAGS}")
endmacro()
diff --git a/Modules/Platform/CYGWIN-GNU.cmake b/Modules/Platform/CYGWIN-GNU.cmake
index ca90712..4fa14ce 100644
--- a/Modules/Platform/CYGWIN-GNU.cmake
+++ b/Modules/Platform/CYGWIN-GNU.cmake
@@ -22,7 +22,7 @@ macro(__cygwin_compiler_gnu lang)
set(CMAKE_${lang}_CREATE_SHARED_LIBRARY
"<CMAKE_${lang}_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_${lang}_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS> -o <TARGET> -Wl,--out-implib,<TARGET_IMPLIB> ${CMAKE_GNULD_IMAGE_VERSION} <OBJECTS> <LINK_LIBRARIES>")
set(CMAKE_${lang}_LINK_EXECUTABLE
- "<CMAKE_${lang}_COMPILER> <FLAGS> <CMAKE_${lang}_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> -Wl,--out-implib,<TARGET_IMPLIB> ${CMAKE_GNULD_IMAGE_VERSION} <LINK_LIBRARIES>")
+ "<CMAKE_${lang}_COMPILER> <FLAGS> <CMAKE_${lang}_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> -Wl,--out-implib,<TARGET_IMPLIB> ${CMAKE_GNULD_IMAGE_VERSION} <LINK_LIBRARIES>")
# No -fPIC on cygwin
set(CMAKE_${lang}_COMPILE_OPTIONS_PIC "")
diff --git a/Modules/Platform/DOS-OpenWatcom-C.cmake b/Modules/Platform/DOS-OpenWatcom-C.cmake
new file mode 100644
index 0000000..cf71c84
--- /dev/null
+++ b/Modules/Platform/DOS-OpenWatcom-C.cmake
@@ -0,0 +1 @@
+include(Platform/DOS-OpenWatcom)
diff --git a/Modules/Platform/DOS-OpenWatcom-CXX.cmake b/Modules/Platform/DOS-OpenWatcom-CXX.cmake
new file mode 100644
index 0000000..cf71c84
--- /dev/null
+++ b/Modules/Platform/DOS-OpenWatcom-CXX.cmake
@@ -0,0 +1 @@
+include(Platform/DOS-OpenWatcom)
diff --git a/Modules/Platform/DOS-OpenWatcom.cmake b/Modules/Platform/DOS-OpenWatcom.cmake
new file mode 100644
index 0000000..54c452e
--- /dev/null
+++ b/Modules/Platform/DOS-OpenWatcom.cmake
@@ -0,0 +1,28 @@
+
+# This module is shared by multiple languages; use include blocker.
+include_guard()
+
+set(CMAKE_BUILD_TYPE_INIT Debug)
+
+if(DEFINED CMAKE_SYSTEM_PROCESSOR AND CMAKE_SYSTEM_PROCESSOR STREQUAL "I86")
+ string(APPEND CMAKE_EXE_LINKER_FLAGS_INIT " system dos")
+ string(APPEND CMAKE_SHARED_LINKER_FLAGS_INIT " system dos")
+ string(APPEND CMAKE_MODULE_LINKER_FLAGS_INIT " system dos")
+else()
+ string(APPEND CMAKE_EXE_LINKER_FLAGS_INIT " system dos4g")
+ string(APPEND CMAKE_SHARED_LINKER_FLAGS_INIT " system dos4g")
+ string(APPEND CMAKE_MODULE_LINKER_FLAGS_INIT " system dos4g")
+endif()
+
+set(CMAKE_C_COMPILE_OPTIONS_DLL "-bd") # Note: This variable is a ';' separated list
+set(CMAKE_SHARED_LIBRARY_C_FLAGS "-bd") # ... while this is a space separated string.
+
+string(APPEND CMAKE_C_FLAGS_INIT " -bt=dos")
+string(APPEND CMAKE_CXX_FLAGS_INIT " -bt=dos -xs")
+
+if(NOT CMAKE_C_STANDARD_INCLUDE_DIRECTORIES)
+ set(CMAKE_C_STANDARD_INCLUDE_DIRECTORIES $ENV{WATCOM}/h)
+endif()
+if(NOT CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES)
+ set(CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES $ENV{WATCOM}/h)
+endif()
diff --git a/Modules/Platform/DOS.cmake b/Modules/Platform/DOS.cmake
new file mode 100644
index 0000000..fc95936
--- /dev/null
+++ b/Modules/Platform/DOS.cmake
@@ -0,0 +1,14 @@
+set(DOS 1)
+
+set(CMAKE_STATIC_LIBRARY_PREFIX "")
+set(CMAKE_STATIC_LIBRARY_SUFFIX ".lib")
+set(CMAKE_SHARED_LIBRARY_PREFIX "")
+set(CMAKE_SHARED_LIBRARY_SUFFIX ".dll")
+set(CMAKE_IMPORT_LIBRARY_PREFIX "")
+set(CMAKE_IMPORT_LIBRARY_SUFFIX ".lib")
+set(CMAKE_EXECUTABLE_SUFFIX ".exe")
+set(CMAKE_LINK_LIBRARY_SUFFIX ".lib")
+set(CMAKE_DL_LIBS "")
+
+set(CMAKE_FIND_LIBRARY_PREFIXES "")
+set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib")
diff --git a/Modules/Platform/HP-UX-HP-C.cmake b/Modules/Platform/HP-UX-HP-C.cmake
index 7610383..57ba2eb 100644
--- a/Modules/Platform/HP-UX-HP-C.cmake
+++ b/Modules/Platform/HP-UX-HP-C.cmake
@@ -3,4 +3,4 @@ __hpux_compiler_hp(C)
set(CMAKE_C_CREATE_PREPROCESSED_SOURCE "<CMAKE_C_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -E <SOURCE> > <PREPROCESSED_SOURCE>")
set(CMAKE_C_CREATE_ASSEMBLY_SOURCE "<CMAKE_C_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -S <SOURCE> -o <ASSEMBLY_SOURCE>")
-set(CMAKE_C_COMPILE_OBJECT "<CMAKE_C_COMPILER> <DEFINES> -Aa -Ae <INCLUDES> <FLAGS> -o <OBJECT> -c <SOURCE>")
+set(CMAKE_C_COMPILE_OBJECT "<CMAKE_C_COMPILER> <DEFINES> -Aa -Ae <INCLUDES> <FLAGS> -o <OBJECT> -c <SOURCE>")
diff --git a/Modules/Platform/Linux-OpenWatcom-C.cmake b/Modules/Platform/Linux-OpenWatcom-C.cmake
new file mode 100644
index 0000000..383349a
--- /dev/null
+++ b/Modules/Platform/Linux-OpenWatcom-C.cmake
@@ -0,0 +1 @@
+include(Platform/Linux-OpenWatcom)
diff --git a/Modules/Platform/Linux-OpenWatcom-CXX.cmake b/Modules/Platform/Linux-OpenWatcom-CXX.cmake
new file mode 100644
index 0000000..383349a
--- /dev/null
+++ b/Modules/Platform/Linux-OpenWatcom-CXX.cmake
@@ -0,0 +1 @@
+include(Platform/Linux-OpenWatcom)
diff --git a/Modules/Platform/Linux-OpenWatcom.cmake b/Modules/Platform/Linux-OpenWatcom.cmake
new file mode 100644
index 0000000..5b4e995
--- /dev/null
+++ b/Modules/Platform/Linux-OpenWatcom.cmake
@@ -0,0 +1,25 @@
+# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
+# file Copyright.txt or https://cmake.org/licensing for details.
+
+# This module is shared by multiple languages; use include blocker.
+include_guard()
+
+set(CMAKE_BUILD_TYPE_INIT Debug)
+
+string(APPEND CMAKE_EXE_LINKER_FLAGS_INIT " system linux opt noextension")
+string(APPEND CMAKE_MODULE_LINKER_FLAGS_INIT " system linux")
+string(APPEND CMAKE_SHARED_LINKER_FLAGS_INIT " system linux")
+
+# single/multi-threaded /-bm
+# default is setup for single-threaded libraries
+string(APPEND CMAKE_C_FLAGS_INIT " -bt=linux")
+string(APPEND CMAKE_CXX_FLAGS_INIT " -bt=linux -xs")
+
+if(CMAKE_CROSSCOMPILING)
+ if(NOT CMAKE_C_STANDARD_INCLUDE_DIRECTORIES)
+ set(CMAKE_C_STANDARD_INCLUDE_DIRECTORIES $ENV{WATCOM}/lh)
+ endif()
+ if(NOT CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES)
+ set(CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES $ENV{WATCOM}/lh)
+ endif()
+endif()
diff --git a/Modules/Platform/Linux-como.cmake b/Modules/Platform/Linux-como.cmake
index d1550d2..f6db34c 100644
--- a/Modules/Platform/Linux-como.cmake
+++ b/Modules/Platform/Linux-como.cmake
@@ -11,7 +11,7 @@ set(CMAKE_CXX_CREATE_STATIC_LIBRARY
set(CMAKE_CXX_LINK_EXECUTABLE
"<CMAKE_CXX_COMPILER> --prelink_objects <OBJECTS>"
- "<CMAKE_CXX_COMPILER> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
+ "<CMAKE_CXX_COMPILER> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
set(CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG "")
set(CMAKE_SHARED_LIBRARY_C_FLAGS "")
diff --git a/Modules/Platform/OS2-OpenWatcom-C.cmake b/Modules/Platform/OS2-OpenWatcom-C.cmake
new file mode 100644
index 0000000..21a4d9e
--- /dev/null
+++ b/Modules/Platform/OS2-OpenWatcom-C.cmake
@@ -0,0 +1 @@
+include(Platform/OS2-OpenWatcom)
diff --git a/Modules/Platform/OS2-OpenWatcom-CXX.cmake b/Modules/Platform/OS2-OpenWatcom-CXX.cmake
new file mode 100644
index 0000000..21a4d9e
--- /dev/null
+++ b/Modules/Platform/OS2-OpenWatcom-CXX.cmake
@@ -0,0 +1 @@
+include(Platform/OS2-OpenWatcom)
diff --git a/Modules/Platform/OS2-OpenWatcom.cmake b/Modules/Platform/OS2-OpenWatcom.cmake
new file mode 100644
index 0000000..998fb9f
--- /dev/null
+++ b/Modules/Platform/OS2-OpenWatcom.cmake
@@ -0,0 +1,35 @@
+# This module is shared by multiple languages; use include blocker.
+include_guard()
+
+set(CMAKE_BUILD_TYPE_INIT Debug)
+
+if(DEFINED CMAKE_SYSTEM_PROCESSOR AND CMAKE_SYSTEM_PROCESSOR STREQUAL "I86")
+ string(APPEND CMAKE_EXE_LINKER_FLAGS_INIT " system os2")
+ string(APPEND CMAKE_SHARED_LINKER_FLAGS_INIT " system os2_dll")
+ string(APPEND CMAKE_MODULE_LINKER_FLAGS_INIT " system os2_dll")
+else()
+ string(APPEND CMAKE_EXE_LINKER_FLAGS_INIT " system os2v2")
+ string(APPEND CMAKE_SHARED_LINKER_FLAGS_INIT " system os2v2_dll")
+ string(APPEND CMAKE_MODULE_LINKER_FLAGS_INIT " system os2v2_dll")
+endif()
+
+set(CMAKE_C_COMPILE_OPTIONS_DLL "-bd") # Note: This variable is a ';' separated list
+set(CMAKE_SHARED_LIBRARY_C_FLAGS "-bd") # ... while this is a space separated string.
+
+string(APPEND CMAKE_C_FLAGS_INIT " -bt=os2")
+string(APPEND CMAKE_CXX_FLAGS_INIT " -bt=os2 -xs")
+
+if(NOT CMAKE_C_STANDARD_INCLUDE_DIRECTORIES)
+ if(DEFINED CMAKE_SYSTEM_PROCESSOR AND CMAKE_SYSTEM_PROCESSOR STREQUAL "I86")
+ set(CMAKE_C_STANDARD_INCLUDE_DIRECTORIES $ENV{WATCOM}/h $ENV{WATCOM}/h/os21x)
+ else()
+ set(CMAKE_C_STANDARD_INCLUDE_DIRECTORIES $ENV{WATCOM}/h $ENV{WATCOM}/h/os2)
+ endif()
+endif()
+if(NOT CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES)
+ if(DEFINED CMAKE_SYSTEM_PROCESSOR AND CMAKE_SYSTEM_PROCESSOR STREQUAL "I86")
+ set(CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES $ENV{WATCOM}/h $ENV{WATCOM}/h/os21x)
+ else()
+ set(CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES $ENV{WATCOM}/h $ENV{WATCOM}/h/os2)
+ endif()
+endif()
diff --git a/Modules/Platform/OS2.cmake b/Modules/Platform/OS2.cmake
new file mode 100644
index 0000000..a9df66d
--- /dev/null
+++ b/Modules/Platform/OS2.cmake
@@ -0,0 +1,14 @@
+set(OS2 1)
+
+set(CMAKE_STATIC_LIBRARY_PREFIX "")
+set(CMAKE_STATIC_LIBRARY_SUFFIX ".lib")
+set(CMAKE_SHARED_LIBRARY_PREFIX "")
+set(CMAKE_SHARED_LIBRARY_SUFFIX ".dll")
+set(CMAKE_IMPORT_LIBRARY_PREFIX "")
+set(CMAKE_IMPORT_LIBRARY_SUFFIX ".lib")
+set(CMAKE_EXECUTABLE_SUFFIX ".exe")
+set(CMAKE_LINK_LIBRARY_SUFFIX ".lib")
+set(CMAKE_DL_LIBS "")
+
+set(CMAKE_FIND_LIBRARY_PREFIXES "")
+set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib")
diff --git a/Modules/Platform/UnixPaths.cmake b/Modules/Platform/UnixPaths.cmake
index 97f744d..7fe64cb 100644
--- a/Modules/Platform/UnixPaths.cmake
+++ b/Modules/Platform/UnixPaths.cmake
@@ -21,6 +21,10 @@ get_filename_component(_CMAKE_INSTALL_DIR "${_CMAKE_INSTALL_DIR}" PATH)
# List common installation prefixes. These will be used for all
# search types.
+#
+# Reminder when adding new locations computed from environment variables
+# please make sure to keep Help/variable/CMAKE_SYSTEM_PREFIX_PATH.rst
+# synchronized
list(APPEND CMAKE_SYSTEM_PREFIX_PATH
# Standard
/usr/local /usr /
@@ -86,6 +90,13 @@ set(_CMAKE_CUDA_IMPLICIT_INCLUDE_DIRECTORIES_INIT
unset(_cmake_sysroot_compile)
+# Reminder when adding new locations computed from environment variables
+# please make sure to keep Help/variable/CMAKE_SYSTEM_PREFIX_PATH.rst
+# synchronized
+if(CMAKE_COMPILER_SYSROOT)
+ list(PREPEND CMAKE_SYSTEM_PREFIX_PATH "${CMAKE_COMPILER_SYSROOT}")
+endif()
+
# Enable use of lib32 and lib64 search path variants by default.
set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB32_PATHS TRUE)
set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS TRUE)
diff --git a/Modules/Platform/Windows-Clang.cmake b/Modules/Platform/Windows-Clang.cmake
index a048698..dff8166 100644
--- a/Modules/Platform/Windows-Clang.cmake
+++ b/Modules/Platform/Windows-Clang.cmake
@@ -55,13 +55,13 @@ macro(__windows_compiler_clang_gnu lang)
# Create archiving rules to support large object file lists for static libraries.
set(CMAKE_${lang}_ARCHIVE_CREATE "<CMAKE_AR> qc <TARGET> <LINK_FLAGS> <OBJECTS>")
- set(CMAKE_${lang}_ARCHIVE_APPEND "<CMAKE_AR> q <TARGET> <LINK_FLAGS> <OBJECTS>")
+ set(CMAKE_${lang}_ARCHIVE_APPEND "<CMAKE_AR> q <TARGET> <LINK_FLAGS> <OBJECTS>")
set(CMAKE_${lang}_ARCHIVE_FINISH "<CMAKE_RANLIB> <TARGET>")
set(CMAKE_${lang}_CREATE_SHARED_LIBRARY
"<CMAKE_${lang}_COMPILER> -fuse-ld=lld-link -nostartfiles -nostdlib <CMAKE_SHARED_LIBRARY_${lang}_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS> -o <TARGET> ${CMAKE_GNULD_IMAGE_VERSION} -Xlinker /implib:<TARGET_IMPLIB> -Xlinker /pdb:<TARGET_PDB> -Xlinker /version:<TARGET_VERSION_MAJOR>.<TARGET_VERSION_MINOR> <OBJECTS> <LINK_LIBRARIES>")
set(CMAKE_${lang}_CREATE_SHARED_MODULE ${CMAKE_${lang}_CREATE_SHARED_LIBRARY})
set(CMAKE_${lang}_LINK_EXECUTABLE
- "<CMAKE_${lang}_COMPILER> -fuse-ld=lld-link -nostartfiles -nostdlib <FLAGS> <CMAKE_${lang}_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> -Xlinker /implib:<TARGET_IMPLIB> -Xlinker /pdb:<TARGET_PDB> -Xlinker /version:<TARGET_VERSION_MAJOR>.<TARGET_VERSION_MINOR> ${CMAKE_GNULD_IMAGE_VERSION} <LINK_LIBRARIES>")
+ "<CMAKE_${lang}_COMPILER> -fuse-ld=lld-link -nostartfiles -nostdlib <FLAGS> <CMAKE_${lang}_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> -Xlinker /implib:<TARGET_IMPLIB> -Xlinker /pdb:<TARGET_PDB> -Xlinker /version:<TARGET_VERSION_MAJOR>.<TARGET_VERSION_MINOR> ${CMAKE_GNULD_IMAGE_VERSION} <LINK_LIBRARIES>")
if(NOT "${lang}" STREQUAL "ASM")
set(CMAKE_${lang}_COMPILE_OPTIONS_MSVC_RUNTIME_LIBRARY_MultiThreaded -Xclang -flto-visibility-public-std -D_MT -Xclang --dependent-lib=libcmt)
diff --git a/Modules/Platform/Windows-GNU.cmake b/Modules/Platform/Windows-GNU.cmake
index 38a8cf4..a2e3811 100644
--- a/Modules/Platform/Windows-GNU.cmake
+++ b/Modules/Platform/Windows-GNU.cmake
@@ -47,16 +47,12 @@ if("${_help}" MATCHES "GNU ld .* 2\\.1[1-6]")
set(__WINDOWS_GNU_LD_RESPONSE 0)
endif()
-if(NOT CMAKE_GENERATOR_RC AND CMAKE_GENERATOR MATCHES "Unix Makefiles")
- set(CMAKE_GENERATOR_RC windres)
-endif()
-
macro(__windows_compiler_gnu lang)
if(MSYS OR MINGW)
# Create archiving rules to support large object file lists for static libraries.
set(CMAKE_${lang}_ARCHIVE_CREATE "<CMAKE_AR> qc <TARGET> <LINK_FLAGS> <OBJECTS>")
- set(CMAKE_${lang}_ARCHIVE_APPEND "<CMAKE_AR> q <TARGET> <LINK_FLAGS> <OBJECTS>")
+ set(CMAKE_${lang}_ARCHIVE_APPEND "<CMAKE_AR> q <TARGET> <LINK_FLAGS> <OBJECTS>")
set(CMAKE_${lang}_ARCHIVE_FINISH "<CMAKE_RANLIB> <TARGET>")
# Initialize C link type selection flags. These flags are used when
@@ -108,7 +104,7 @@ macro(__windows_compiler_gnu lang)
set(CMAKE_${lang}_CREATE_SHARED_LIBRARY
"<CMAKE_${lang}_COMPILER> <CMAKE_SHARED_LIBRARY_${lang}_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS> -o <TARGET> -Wl,--out-implib,<TARGET_IMPLIB> ${CMAKE_GNULD_IMAGE_VERSION} <OBJECTS> <LINK_LIBRARIES>")
set(CMAKE_${lang}_LINK_EXECUTABLE
- "<CMAKE_${lang}_COMPILER> <FLAGS> <CMAKE_${lang}_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> -Wl,--out-implib,<TARGET_IMPLIB> ${CMAKE_GNULD_IMAGE_VERSION} <LINK_LIBRARIES>")
+ "<CMAKE_${lang}_COMPILER> <FLAGS> <CMAKE_${lang}_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> -Wl,--out-implib,<TARGET_IMPLIB> ${CMAKE_GNULD_IMAGE_VERSION} <LINK_LIBRARIES>")
list(APPEND CMAKE_${lang}_ABI_FILES "Platform/Windows-GNU-${lang}-ABI")
@@ -132,7 +128,7 @@ macro(__windows_compiler_gnu lang)
endif()
if(NOT CMAKE_RC_COMPILER_INIT AND NOT CMAKE_GENERATOR_RC)
- set(CMAKE_RC_COMPILER_INIT windres)
+ set(CMAKE_RC_COMPILER_INIT ${_CMAKE_TOOLCHAIN_PREFIX}windres)
endif()
enable_language(RC)
diff --git a/Modules/Platform/Windows-Intel.cmake b/Modules/Platform/Windows-Intel.cmake
index 96b1760..5d8f7fc 100644
--- a/Modules/Platform/Windows-Intel.cmake
+++ b/Modules/Platform/Windows-Intel.cmake
@@ -11,7 +11,7 @@ set(__WINDOWS_INTEL 1)
include(Platform/Windows-MSVC)
macro(__windows_compiler_intel lang)
__windows_compiler_msvc(${lang})
- string(REPLACE "<CMAKE_LINKER> /lib" "xilib" CMAKE_${lang}_CREATE_STATIC_LIBRARY "${CMAKE_${lang}_CREATE_STATIC_LIBRARY}")
+ string(REPLACE "<CMAKE_AR>" "xilib" CMAKE_${lang}_CREATE_STATIC_LIBRARY "${CMAKE_${lang}_CREATE_STATIC_LIBRARY}")
foreach(rule CREATE_SHARED_LIBRARY CREATE_SHARED_MODULE LINK_EXECUTABLE)
string(REPLACE "<CMAKE_LINKER>" "xilink" CMAKE_${lang}_${rule} "${CMAKE_${lang}_${rule}}")
endforeach()
diff --git a/Modules/Platform/Windows-MSVC.cmake b/Modules/Platform/Windows-MSVC.cmake
index fb23058..2476a33 100644
--- a/Modules/Platform/Windows-MSVC.cmake
+++ b/Modules/Platform/Windows-MSVC.cmake
@@ -316,7 +316,7 @@ macro(__windows_compiler_msvc lang)
"${_CMAKE_VS_LINK_DLL}<CMAKE_LINKER> ${CMAKE_CL_NOLOGO} <OBJECTS> ${CMAKE_START_TEMP_FILE} /out:<TARGET> /implib:<TARGET_IMPLIB> /pdb:<TARGET_PDB> /dll /version:<TARGET_VERSION_MAJOR>.<TARGET_VERSION_MINOR>${_PLATFORM_LINK_FLAGS} <LINK_FLAGS> <LINK_LIBRARIES> ${CMAKE_END_TEMP_FILE}")
set(CMAKE_${lang}_CREATE_SHARED_MODULE ${CMAKE_${lang}_CREATE_SHARED_LIBRARY})
- set(CMAKE_${lang}_CREATE_STATIC_LIBRARY "<CMAKE_LINKER> /lib ${CMAKE_CL_NOLOGO} <LINK_FLAGS> /out:<TARGET> <OBJECTS> ")
+ set(CMAKE_${lang}_CREATE_STATIC_LIBRARY "<CMAKE_AR> ${CMAKE_CL_NOLOGO} <LINK_FLAGS> /out:<TARGET> <OBJECTS> ")
set(CMAKE_${lang}_COMPILE_OBJECT
"<CMAKE_${lang}_COMPILER> ${CMAKE_START_TEMP_FILE} ${CMAKE_CL_NOLOGO}${_COMPILE_${lang}} <DEFINES> <INCLUDES> <FLAGS> /Fo<OBJECT> /Fd<TARGET_COMPILE_PDB>${_FS_${lang}} -c <SOURCE>${CMAKE_END_TEMP_FILE}")
diff --git a/Modules/Platform/Windows-NVIDIA-CUDA.cmake b/Modules/Platform/Windows-NVIDIA-CUDA.cmake
index 98cd5ef..a88f4bc 100644
--- a/Modules/Platform/Windows-NVIDIA-CUDA.cmake
+++ b/Modules/Platform/Windows-NVIDIA-CUDA.cmake
@@ -1,11 +1,11 @@
include(Platform/Windows-MSVC)
set(CMAKE_CUDA_COMPILE_PTX_COMPILATION
- "<CMAKE_CUDA_COMPILER> ${_CMAKE_CUDA_EXTRA_FLAGS} <DEFINES> <INCLUDES> <FLAGS> -x cu -ptx <SOURCE> -o <OBJECT> -Xcompiler=-Fd<TARGET_COMPILE_PDB>,-FS")
+ "<CMAKE_CUDA_COMPILER> ${_CMAKE_CUDA_EXTRA_FLAGS} <DEFINES> <INCLUDES> <FLAGS> ${_CMAKE_COMPILE_AS_CUDA_FLAG} -ptx <SOURCE> -o <OBJECT> -Xcompiler=-Fd<TARGET_COMPILE_PDB>,-FS")
set(CMAKE_CUDA_COMPILE_SEPARABLE_COMPILATION
- "<CMAKE_CUDA_COMPILER> ${_CMAKE_CUDA_EXTRA_FLAGS} <DEFINES> <INCLUDES> <FLAGS> -x cu -dc <SOURCE> -o <OBJECT> -Xcompiler=-Fd<TARGET_COMPILE_PDB>,-FS")
+ "<CMAKE_CUDA_COMPILER> ${_CMAKE_CUDA_EXTRA_FLAGS} <DEFINES> <INCLUDES> <FLAGS> ${_CMAKE_COMPILE_AS_CUDA_FLAG} -dc <SOURCE> -o <OBJECT> -Xcompiler=-Fd<TARGET_COMPILE_PDB>,-FS")
set(CMAKE_CUDA_COMPILE_WHOLE_COMPILATION
- "<CMAKE_CUDA_COMPILER> ${_CMAKE_CUDA_EXTRA_FLAGS} <DEFINES> <INCLUDES> <FLAGS> -x cu -c <SOURCE> -o <OBJECT> -Xcompiler=-Fd<TARGET_COMPILE_PDB>,-FS")
+ "<CMAKE_CUDA_COMPILER> ${_CMAKE_CUDA_EXTRA_FLAGS} <DEFINES> <INCLUDES> <FLAGS> ${_CMAKE_COMPILE_AS_CUDA_FLAG} -c <SOURCE> -o <OBJECT> -Xcompiler=-Fd<TARGET_COMPILE_PDB>,-FS")
set(__IMPLICT_LINKS )
foreach(dir ${CMAKE_CUDA_HOST_IMPLICIT_LINK_DIRECTORIES})
@@ -23,7 +23,7 @@ set(CMAKE_CUDA_CREATE_SHARED_LIBRARY
"${_CMAKE_VS_LINK_DLL}<CMAKE_LINKER> ${CMAKE_CL_NOLOGO} <OBJECTS> ${CMAKE_START_TEMP_FILE} /out:<TARGET> /implib:<TARGET_IMPLIB> /pdb:<TARGET_PDB> /dll /version:<TARGET_VERSION_MAJOR>.<TARGET_VERSION_MINOR>${_PLATFORM_LINK_FLAGS} <LINK_FLAGS> <LINK_LIBRARIES>${__IMPLICT_LINKS} ${CMAKE_END_TEMP_FILE}")
set(CMAKE_CUDA_CREATE_SHARED_MODULE ${CMAKE_CUDA_CREATE_SHARED_LIBRARY})
-set(CMAKE_CUDA_CREATE_STATIC_LIBRARY "<CMAKE_LINKER> /lib ${CMAKE_CL_NOLOGO} <LINK_FLAGS> /out:<TARGET> <OBJECTS> ")
+set(CMAKE_CUDA_CREATE_STATIC_LIBRARY "<CMAKE_AR> ${CMAKE_CL_NOLOGO} <LINK_FLAGS> /out:<TARGET> <OBJECTS> ")
set(CMAKE_CUDA_LINKER_SUPPORTS_PDB ON)
set(CMAKE_CUDA_LINK_EXECUTABLE
"${_CMAKE_VS_LINK_EXE}<CMAKE_LINKER> ${CMAKE_CL_NOLOGO} <OBJECTS> ${CMAKE_START_TEMP_FILE} /out:<TARGET> /implib:<TARGET_IMPLIB> /pdb:<TARGET_PDB> /version:<TARGET_VERSION_MAJOR>.<TARGET_VERSION_MINOR>${_PLATFORM_LINK_FLAGS} <LINK_FLAGS> <LINK_LIBRARIES>${__IMPLICT_LINKS} ${CMAKE_END_TEMP_FILE}")
@@ -46,9 +46,9 @@ endforeach()
unset(__IMPLICT_DLINK_DIRS)
set(CMAKE_CUDA_DEVICE_LINK_LIBRARY
- "<CMAKE_CUDA_COMPILER> ${_CMAKE_CUDA_EXTRA_FLAGS} <LANGUAGE_COMPILE_FLAGS> ${_CMAKE_CUDA_EXTRA_DEVICE_LINK_FLAGS} -shared -dlink <OBJECTS> -o <TARGET> <LINK_LIBRARIES> -Xcompiler=-Fd<TARGET_COMPILE_PDB>,-FS${__IMPLICT_DLINK_FLAGS}")
+ "<CMAKE_CUDA_COMPILER> ${_CMAKE_CUDA_EXTRA_FLAGS} <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> ${_CMAKE_CUDA_EXTRA_DEVICE_LINK_FLAGS} -shared -dlink <OBJECTS> -o <TARGET> <LINK_LIBRARIES> -Xcompiler=-Fd<TARGET_COMPILE_PDB>,-FS${__IMPLICT_DLINK_FLAGS}")
set(CMAKE_CUDA_DEVICE_LINK_EXECUTABLE
- "<CMAKE_CUDA_COMPILER> ${_CMAKE_CUDA_EXTRA_FLAGS} <FLAGS> ${_CMAKE_CUDA_EXTRA_DEVICE_LINK_FLAGS} -shared -dlink <OBJECTS> -o <TARGET> <LINK_LIBRARIES> -Xcompiler=-Fd<TARGET_COMPILE_PDB>,-FS${__IMPLICT_DLINK_FLAGS}")
+ "<CMAKE_CUDA_COMPILER> ${_CMAKE_CUDA_EXTRA_FLAGS} <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> ${_CMAKE_CUDA_EXTRA_DEVICE_LINK_FLAGS} -shared -dlink <OBJECTS> -o <TARGET> <LINK_LIBRARIES> -Xcompiler=-Fd<TARGET_COMPILE_PDB>,-FS${__IMPLICT_DLINK_FLAGS}")
unset(__IMPLICT_DLINK_FLAGS)
string(REPLACE "/D" "-D" _PLATFORM_DEFINES_CUDA "${_PLATFORM_DEFINES}${_PLATFORM_DEFINES_CXX}")
@@ -73,6 +73,10 @@ set(CMAKE_CUDA_RUNTIME_LIBRARY_LINK_OPTIONS_STATIC "cudadevrt;cudart_static")
set(CMAKE_CUDA_RUNTIME_LIBRARY_LINK_OPTIONS_SHARED "cudadevrt;cudart")
set(CMAKE_CUDA_RUNTIME_LIBRARY_LINK_OPTIONS_NONE "")
+if(UNIX)
+ list(APPEND CMAKE_CUDA_RUNTIME_LIBRARY_LINK_OPTIONS_STATIC "rt" "pthread" "dl")
+endif()
+
string(APPEND CMAKE_CUDA_FLAGS_INIT " ${PLATFORM_DEFINES_CUDA} -D_WINDOWS -Xcompiler=\"${_W3}${_FLAGS_CXX}\"")
string(APPEND CMAKE_CUDA_FLAGS_DEBUG_INIT " -Xcompiler=\"${_MDd}-Zi -Ob0 -Od ${_RTC1}\"")
string(APPEND CMAKE_CUDA_FLAGS_RELEASE_INIT " -Xcompiler=\"${_MD}-O2 -Ob2\" -DNDEBUG")
diff --git a/Modules/Platform/Windows-OpenWatcom.cmake b/Modules/Platform/Windows-OpenWatcom.cmake
index 76cd28b..70055da 100644
--- a/Modules/Platform/Windows-OpenWatcom.cmake
+++ b/Modules/Platform/Windows-OpenWatcom.cmake
@@ -1,129 +1,32 @@
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.
-
# This module is shared by multiple languages; use include blocker.
-if(__WINDOWS_OPENWATCOM)
- return()
-endif()
-set(__WINDOWS_OPENWATCOM 1)
-
-set(CMAKE_LIBRARY_PATH_FLAG "libpath ")
-set(CMAKE_LINK_LIBRARY_FLAG "library ")
-set(CMAKE_LINK_LIBRARY_FILE_FLAG "library ")
+include_guard()
-if(CMAKE_VERBOSE_MAKEFILE)
- set(CMAKE_WCL_QUIET)
- set(CMAKE_WLINK_QUIET)
- set(CMAKE_LIB_QUIET)
-else()
- set(CMAKE_WCL_QUIET "-zq")
- set(CMAKE_WLINK_QUIET "option quiet")
- set(CMAKE_LIB_QUIET "-q")
-endif()
+set(CMAKE_BUILD_TYPE_INIT Debug)
-string(APPEND CMAKE_EXE_LINKER_FLAGS_INIT " ")
set(CMAKE_CREATE_WIN32_EXE "system nt_win" )
set(CMAKE_CREATE_CONSOLE_EXE "system nt" )
string(APPEND CMAKE_SHARED_LINKER_FLAGS_INIT " system nt_dll")
string(APPEND CMAKE_MODULE_LINKER_FLAGS_INIT " system nt_dll")
-foreach(type SHARED MODULE EXE)
- string(APPEND CMAKE_${type}_LINKER_FLAGS_DEBUG_INIT " debug all opt map")
- string(APPEND CMAKE_${type}_LINKER_FLAGS_RELWITHDEBINFO_INIT " debug all opt map")
-endforeach()
set(CMAKE_C_COMPILE_OPTIONS_DLL "-bd") # Note: This variable is a ';' separated list
set(CMAKE_SHARED_LIBRARY_C_FLAGS "-bd") # ... while this is a space separated string.
set(CMAKE_RC_COMPILER "rc" )
-set(CMAKE_BUILD_TYPE_INIT Debug)
-
# single/multi-threaded /-bm
# static/DLL run-time libraries /-br
# default is setup for multi-threaded + DLL run-time libraries
-string(APPEND CMAKE_C_FLAGS_INIT " -bt=nt -w3 -dWIN32 -br -bm")
-string(APPEND CMAKE_CXX_FLAGS_INIT " -bt=nt -xs -w3 -dWIN32 -br -bm")
-foreach(lang C CXX)
- string(APPEND CMAKE_${lang}_FLAGS_DEBUG_INIT " -d2")
- string(APPEND CMAKE_${lang}_FLAGS_MINSIZEREL_INIT " -s -os -d0 -dNDEBUG")
- string(APPEND CMAKE_${lang}_FLAGS_RELEASE_INIT " -s -ot -d0 -dNDEBUG")
- string(APPEND CMAKE_${lang}_FLAGS_RELWITHDEBINFO_INIT " -s -ot -d1 -dNDEBUG")
-endforeach()
-
-foreach(type CREATE_SHARED_LIBRARY CREATE_SHARED_MODULE LINK_EXECUTABLE)
- set(CMAKE_C_${type}_USE_WATCOM_QUOTE 1)
- set(CMAKE_CXX_${type}_USE_WATCOM_QUOTE 1)
-endforeach()
-
-set(CMAKE_C_CREATE_IMPORT_LIBRARY
- "wlib -c -q -n -b <TARGET_IMPLIB> +<TARGET_QUOTED>")
-set(CMAKE_CXX_CREATE_IMPORT_LIBRARY ${CMAKE_C_CREATE_IMPORT_LIBRARY})
-
-set(CMAKE_C_LINK_EXECUTABLE
- "wlink ${CMAKE_START_TEMP_FILE} ${CMAKE_WLINK_QUIET} name <TARGET> <LINK_FLAGS> file {<OBJECTS>} <LINK_LIBRARIES> ${CMAKE_END_TEMP_FILE}")
-
-
-set(CMAKE_CXX_LINK_EXECUTABLE ${CMAKE_C_LINK_EXECUTABLE})
-
-# compile a C++ file into an object file
-set(CMAKE_CXX_COMPILE_OBJECT
- "<CMAKE_CXX_COMPILER> ${CMAKE_START_TEMP_FILE} ${CMAKE_WCL_QUIET} -d+ <DEFINES> <INCLUDES> <FLAGS> -fo<OBJECT> -c -cc++ <SOURCE>${CMAKE_END_TEMP_FILE}")
-
-# compile a C file into an object file
-set(CMAKE_C_COMPILE_OBJECT
- "<CMAKE_C_COMPILER> ${CMAKE_START_TEMP_FILE} ${CMAKE_WCL_QUIET} -d+ <DEFINES> <INCLUDES> <FLAGS> -fo<OBJECT> -c -cc <SOURCE>${CMAKE_END_TEMP_FILE}")
-
-# preprocess a C source file
-set(CMAKE_C_CREATE_PREPROCESSED_SOURCE
- "<CMAKE_C_COMPILER> ${CMAKE_START_TEMP_FILE} ${CMAKE_WCL_QUIET} -d+ <DEFINES> <INCLUDES> <FLAGS> -fo<PREPROCESSED_SOURCE> -pl -cc <SOURCE>${CMAKE_END_TEMP_FILE}")
-
-# preprocess a C++ source file
-set(CMAKE_CXX_CREATE_PREPROCESSED_SOURCE
- "<CMAKE_CXX_COMPILER> ${CMAKE_START_TEMP_FILE} ${CMAKE_WCL_QUIET} -d+ <DEFINES> <INCLUDES> <FLAGS> -fo<PREPROCESSED_SOURCE> -pl -cc++ <SOURCE>${CMAKE_END_TEMP_FILE}")
-
-set(CMAKE_CXX_CREATE_SHARED_LIBRARY
- "wlink ${CMAKE_START_TEMP_FILE} ${CMAKE_WLINK_QUIET} name <TARGET> <LINK_FLAGS> option implib=<TARGET_IMPLIB> file {<OBJECTS>} <LINK_LIBRARIES> ${CMAKE_END_TEMP_FILE}")
-string(REPLACE " option implib=<TARGET_IMPLIB>" ""
- CMAKE_CXX_CREATE_SHARED_MODULE "${CMAKE_CXX_CREATE_SHARED_LIBRARY}")
-
-# create a C shared library
-set(CMAKE_C_CREATE_SHARED_LIBRARY ${CMAKE_CXX_CREATE_SHARED_LIBRARY})
-
-# create a C shared module
-set(CMAKE_C_CREATE_SHARED_MODULE ${CMAKE_CXX_CREATE_SHARED_MODULE})
-
-# create a C++ static library
-set(CMAKE_CXX_CREATE_STATIC_LIBRARY "wlib ${CMAKE_LIB_QUIET} -c -n -b <TARGET_QUOTED> <LINK_FLAGS> <OBJECTS> ")
-
-# create a C static library
-set(CMAKE_C_CREATE_STATIC_LIBRARY ${CMAKE_CXX_CREATE_STATIC_LIBRARY})
+string(APPEND CMAKE_C_FLAGS_INIT " -bt=nt -dWIN32 -br -bm")
+string(APPEND CMAKE_CXX_FLAGS_INIT " -bt=nt -xs -dWIN32 -br -bm")
-if(NOT _CMAKE_WATCOM_VERSION)
- set(_CMAKE_WATCOM_VERSION 1)
- if(CMAKE_C_COMPILER_VERSION)
- set(_compiler_version ${CMAKE_C_COMPILER_VERSION})
- set(_compiler_id ${CMAKE_C_COMPILER_ID})
- else()
- set(_compiler_version ${CMAKE_CXX_COMPILER_VERSION})
- set(_compiler_id ${CMAKE_CXX_COMPILER_ID})
+if(CMAKE_CROSSCOMPILING)
+ if(NOT CMAKE_C_STANDARD_INCLUDE_DIRECTORIES)
+ set(CMAKE_C_STANDARD_INCLUDE_DIRECTORIES $ENV{WATCOM}/h $ENV{WATCOM}/h/nt)
endif()
- set(WATCOM16)
- set(WATCOM17)
- set(WATCOM18)
- set(WATCOM19)
- if("${_compiler_id}" STREQUAL "OpenWatcom")
- if("${_compiler_version}" VERSION_LESS 1.7)
- set(WATCOM16 1)
- endif()
- if("${_compiler_version}" VERSION_EQUAL 1.7)
- set(WATCOM17 1)
- endif()
- if("${_compiler_version}" VERSION_EQUAL 1.8)
- set(WATCOM18 1)
- endif()
- if("${_compiler_version}" VERSION_EQUAL 1.9)
- set(WATCOM19 1)
- endif()
+ if(NOT CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES)
+ set(CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES $ENV{WATCOM}/h $ENV{WATCOM}/h/nt)
endif()
endif()
diff --git a/Modules/Platform/Windows-df.cmake b/Modules/Platform/Windows-df.cmake
index f948914..8b824bc 100644
--- a/Modules/Platform/Windows-df.cmake
+++ b/Modules/Platform/Windows-df.cmake
@@ -13,7 +13,7 @@ endif()
set(CMAKE_Fortran_MODDIR_FLAG "-module:")
set(CMAKE_Fortran_CREATE_SHARED_LIBRARY
- "link ${CMAKE_CL_NOLOGO} ${CMAKE_START_TEMP_FILE} /out:<TARGET> /dll <LINK_FLAGS> <OBJECTS> <LINK_LIBRARIES> ${CMAKE_END_TEMP_FILE}")
+ "link ${CMAKE_CL_NOLOGO} ${CMAKE_START_TEMP_FILE} /out:<TARGET> /dll <LINK_FLAGS> <OBJECTS> <LINK_LIBRARIES> ${CMAKE_END_TEMP_FILE}")
set(CMAKE_Fortran_CREATE_SHARED_MODULE ${CMAKE_Fortran_CREATE_SHARED_LIBRARY})
@@ -22,7 +22,7 @@ set(CMAKE_Fortran_CREATE_STATIC_LIBRARY "lib ${CMAKE_CL_NOLOGO} <LINK_FLAGS> /o
# compile a C++ file into an object file
set(CMAKE_Fortran_COMPILE_OBJECT
- "<CMAKE_Fortran_COMPILER> ${CMAKE_START_TEMP_FILE} ${CMAKE_CL_NOLOGO} /object:<OBJECT> <FLAGS> /compile_only <SOURCE>${CMAKE_END_TEMP_FILE}")
+ "<CMAKE_Fortran_COMPILER> ${CMAKE_START_TEMP_FILE} ${CMAKE_CL_NOLOGO} /object:<OBJECT> <FLAGS> /compile_only <SOURCE>${CMAKE_END_TEMP_FILE}")
set(CMAKE_Fortran_LINK_EXECUTABLE
"<CMAKE_Fortran_COMPILER> ${CMAKE_CL_NOLOGO} ${CMAKE_START_TEMP_FILE} <FLAGS> /exe:<TARGET> <OBJECTS> /link <CMAKE_Fortran_LINK_FLAGS> <LINK_FLAGS> <LINK_LIBRARIES>${CMAKE_END_TEMP_FILE}")
diff --git a/Modules/Platform/WindowsPaths.cmake b/Modules/Platform/WindowsPaths.cmake
index 71cc609..b9e2f17 100644
--- a/Modules/Platform/WindowsPaths.cmake
+++ b/Modules/Platform/WindowsPaths.cmake
@@ -24,6 +24,10 @@ set(__WINDOWS_PATHS_INCLUDED 1)
# ENV{ProgramFiles(x86)} = [C:\Program Files (x86)]
# ENV{ProgramFiles} = [C:\Program Files (x86)]
# ENV{ProgramW6432} = [C:\Program Files]
+#
+# Reminder when adding new locations computed from environment variables
+# please make sure to keep Help/variable/CMAKE_SYSTEM_PREFIX_PATH.rst
+# synchronized
set(_programfiles "")
foreach(v "ProgramW6432" "ProgramFiles" "ProgramFiles(x86)")
if(DEFINED "ENV{${v}}")
diff --git a/Modules/Platform/eCos.cmake b/Modules/Platform/eCos.cmake
index e1279ef..25db028 100644
--- a/Modules/Platform/eCos.cmake
+++ b/Modules/Platform/eCos.cmake
@@ -52,8 +52,8 @@ include_directories(${ECOS_SYSTEM_CONFIG_HEADER_PATH})
add_definitions(-D__ECOS__=1 -D__ECOS=1)
# special link commands for eCos executables
-set(CMAKE_CXX_LINK_EXECUTABLE "<CMAKE_CXX_COMPILER> <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> -nostdlib -nostartfiles -L${ECOS_LIBTARGET_DIRECTORY} -Ttarget.ld <LINK_LIBRARIES>")
-set(CMAKE_C_LINK_EXECUTABLE "<CMAKE_C_COMPILER> <FLAGS> <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> -nostdlib -nostartfiles -L${ECOS_LIBTARGET_DIRECTORY} -Ttarget.ld <LINK_LIBRARIES>")
+set(CMAKE_CXX_LINK_EXECUTABLE "<CMAKE_CXX_COMPILER> <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> -nostdlib -nostartfiles -L${ECOS_LIBTARGET_DIRECTORY} -Ttarget.ld <LINK_LIBRARIES>")
+set(CMAKE_C_LINK_EXECUTABLE "<CMAKE_C_COMPILER> <FLAGS> <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> -nostdlib -nostartfiles -L${ECOS_LIBTARGET_DIRECTORY} -Ttarget.ld <LINK_LIBRARIES>")
# eCos doesn't support shared libs
set_property(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS FALSE)
diff --git a/Modules/Platform/gas.cmake b/Modules/Platform/gas.cmake
index 7c659f2..8484076 100644
--- a/Modules/Platform/gas.cmake
+++ b/Modules/Platform/gas.cmake
@@ -11,7 +11,7 @@ set(CMAKE_ASM${ASM_DIALECT}_CREATE_STATIC_LIBRARY
"<CMAKE_RANLIB> <TARGET> ")
set(CMAKE_ASM${ASM_DIALECT}_LINK_EXECUTABLE
- "<CMAKE_LINKER> <FLAGS> <CMAKE_ASM${ASM_DIALECT}_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
+ "<CMAKE_LINKER> <FLAGS> <CMAKE_ASM${ASM_DIALECT}_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
# to be done
set(CMAKE_ASM${ASM_DIALECT}_CREATE_SHARED_LIBRARY)
diff --git a/Modules/Squish4RunTestCase.bat b/Modules/Squish4RunTestCase.bat
index ad1cc8c..5bd815a 100755
--- a/Modules/Squish4RunTestCase.bat
+++ b/Modules/Squish4RunTestCase.bat
@@ -12,7 +12,7 @@ echo "Adding AUT... %SQUISHSERVER% --config addAUT %AUT% %AUTDIR%"
%SQUISHSERVER% --config addAUT "%AUT%" "%AUTDIR%"
echo "Starting the squish server... %SQUISHSERVER%"
-start /B %SQUISHSERVER%
+start /B "Squish Server" %SQUISHSERVER%
echo "Running the test case...%SQUISHRUNNER% --testsuite %TESTSUITE% --testcase %TESTCASE%"
%SQUISHRUNNER% --testsuite "%TESTSUITE%" --testcase "%TESTCASE%"
diff --git a/Modules/UseEcos.cmake b/Modules/UseEcos.cmake
index 60324b1..83c9b20 100644
--- a/Modules/UseEcos.cmake
+++ b/Modules/UseEcos.cmake
@@ -185,11 +185,11 @@ macro(ECOS_ADD_EXECUTABLE _exe_NAME )
# when using nmake makefiles, the custom buildtype suppresses the default cl.exe flags
# and the rules for creating objects are adjusted for gcc
set(CMAKE_BUILD_TYPE CUSTOM_ECOS_BUILD)
- set(CMAKE_C_COMPILE_OBJECT "<CMAKE_C_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -o <OBJECT> -c <SOURCE>")
+ set(CMAKE_C_COMPILE_OBJECT "<CMAKE_C_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -o <OBJECT> -c <SOURCE>")
set(CMAKE_CXX_COMPILE_OBJECT "<CMAKE_CXX_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -o <OBJECT> -c <SOURCE>")
# special link commands for ecos-executables
- set(CMAKE_CXX_LINK_EXECUTABLE "<CMAKE_CXX_COMPILER> <CMAKE_CXX_LINK_FLAGS> <OBJECTS> -o <TARGET> ${_ecos_EXTRA_LIBS} -nostdlib -nostartfiles -L${CMAKE_CURRENT_BINARY_DIR}/ecos/install/lib -Ttarget.ld ${ECOS_LD_MCPU}")
- set(CMAKE_C_LINK_EXECUTABLE "<CMAKE_C_COMPILER> <CMAKE_C_LINK_FLAGS> <OBJECTS> -o <TARGET> ${_ecos_EXTRA_LIBS} -nostdlib -nostartfiles -L${CMAKE_CURRENT_BINARY_DIR}/ecos/install/lib -Ttarget.ld ${ECOS_LD_MCPU}")
+ set(CMAKE_CXX_LINK_EXECUTABLE "<CMAKE_CXX_COMPILER> <CMAKE_CXX_LINK_FLAGS> <OBJECTS> -o <TARGET> ${_ecos_EXTRA_LIBS} -nostdlib -nostartfiles -L${CMAKE_CURRENT_BINARY_DIR}/ecos/install/lib -Ttarget.ld ${ECOS_LD_MCPU}")
+ set(CMAKE_C_LINK_EXECUTABLE "<CMAKE_C_COMPILER> <CMAKE_C_LINK_FLAGS> <OBJECTS> -o <TARGET> ${_ecos_EXTRA_LIBS} -nostdlib -nostartfiles -L${CMAKE_CURRENT_BINARY_DIR}/ecos/install/lib -Ttarget.ld ${ECOS_LD_MCPU}")
# some strict compiler flags
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wstrict-prototypes")
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Woverloaded-virtual -fno-rtti -Wctor-dtor-privacy -fno-strict-aliasing -fno-exceptions")
diff --git a/Modules/UseJava.cmake b/Modules/UseJava.cmake
index b668b9e..db3fb95 100644
--- a/Modules/UseJava.cmake
+++ b/Modules/UseJava.cmake
@@ -377,7 +377,9 @@ function (__java_copy_file src dest comment)
ARGS ${src}
${dest}
DEPENDS ${src}
- COMMENT ${comment})
+ COMMENT ${comment}
+ VERBATIM
+ )
endfunction ()
function(__java_lcat VAR)
@@ -597,7 +599,10 @@ function(add_jar _TARGET_NAME)
# Create the list of files to compile.
set(_JAVA_SOURCES_FILE ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_sources)
string(REPLACE ";" "\"\n\"" _JAVA_COMPILE_STRING "\"${_JAVA_COMPILE_FILES}\"")
- file(WRITE ${_JAVA_SOURCES_FILE} ${_JAVA_COMPILE_STRING})
+ set(CMAKE_CONFIGURABLE_FILE_CONTENT "${_JAVA_COMPILE_STRING}")
+ configure_file("${CMAKE_ROOT}/Modules/CMakeConfigurableFile.in"
+ "${_JAVA_SOURCES_FILE}" @ONLY)
+ unset(CMAKE_CONFIGURABLE_FILE_CONTENT)
list (APPEND _JAVA_SOURCES_FILELISTS "@${_JAVA_SOURCES_FILE}")
endif()
if (_JAVA_COMPILE_FILELISTS)
@@ -610,6 +615,10 @@ function(add_jar _TARGET_NAME)
add_custom_command(
# NOTE: this command generates an artificial dependency file
OUTPUT ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_compiled_${_TARGET_NAME}
+ COMMAND ${CMAKE_COMMAND}
+ -DCMAKE_JAVA_CLASS_OUTPUT_PATH=${CMAKE_JAVA_CLASS_OUTPUT_PATH}
+ -DCMAKE_JAR_CLASSES_PREFIX=${CMAKE_JAR_CLASSES_PREFIX}
+ -P ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/UseJava/ClearClassFiles.cmake
COMMAND ${Java_JAVAC_EXECUTABLE}
${CMAKE_JAVA_COMPILE_FLAGS}
-classpath "${CMAKE_JAVA_INCLUDE_PATH_FINAL}"
@@ -617,18 +626,20 @@ function(add_jar _TARGET_NAME)
${_GENERATE_NATIVE_HEADERS}
${_JAVA_SOURCES_FILELISTS}
COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_compiled_${_TARGET_NAME}
- DEPENDS ${_JAVA_COMPILE_FILES} ${_JAVA_COMPILE_FILELISTS} ${_JAVA_COMPILE_DEPENDS}
+ DEPENDS ${_JAVA_COMPILE_FILES} ${_JAVA_COMPILE_FILELISTS} ${_JAVA_COMPILE_DEPENDS} ${_JAVA_SOURCES_FILE}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
COMMENT "Building Java objects for ${_TARGET_NAME}.jar"
+ VERBATIM
)
add_custom_command(
OUTPUT ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_class_filelist
COMMAND ${CMAKE_COMMAND}
-DCMAKE_JAVA_CLASS_OUTPUT_PATH=${CMAKE_JAVA_CLASS_OUTPUT_PATH}
- -DCMAKE_JAR_CLASSES_PREFIX="${CMAKE_JAR_CLASSES_PREFIX}"
+ -DCMAKE_JAR_CLASSES_PREFIX=${CMAKE_JAR_CLASSES_PREFIX}
-P ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/UseJavaClassFilelist.cmake
DEPENDS ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_compiled_${_TARGET_NAME}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ VERBATIM
)
else ()
# create an empty java_class_filelist
@@ -659,6 +670,7 @@ function(add_jar _TARGET_NAME)
DEPENDS ${_JAVA_RESOURCE_FILES} ${_JAVA_DEPENDS} ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_class_filelist
WORKING_DIRECTORY ${CMAKE_JAVA_CLASS_OUTPUT_PATH}
COMMENT "Creating Java archive ${_JAVA_TARGET_OUTPUT_NAME}"
+ VERBATIM
)
else ()
add_custom_command(
@@ -674,6 +686,7 @@ function(add_jar _TARGET_NAME)
WORKING_DIRECTORY ${CMAKE_JAVA_CLASS_OUTPUT_PATH}
DEPENDS ${_JAVA_RESOURCE_FILES} ${_JAVA_DEPENDS} ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_class_filelist
COMMENT "Creating Java archive ${_JAVA_TARGET_OUTPUT_NAME}"
+ VERBATIM
)
endif ()
diff --git a/Modules/UseJava/ClearClassFiles.cmake b/Modules/UseJava/ClearClassFiles.cmake
new file mode 100644
index 0000000..f3115c6
--- /dev/null
+++ b/Modules/UseJava/ClearClassFiles.cmake
@@ -0,0 +1,17 @@
+# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
+# file Copyright.txt or https://cmake.org/licensing for details.
+
+# This script deletes compiled Java class files.
+
+if(CMAKE_JAVA_CLASS_OUTPUT_PATH)
+ if(EXISTS "${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_class_filelist")
+ file(STRINGS "${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_class_filelist" classes)
+ list(TRANSFORM classes PREPEND "${CMAKE_JAVA_CLASS_OUTPUT_PATH}/")
+ if(classes)
+ file(REMOVE ${classes})
+ message(STATUS "Clean class files from previous build")
+ endif()
+ endif()
+else()
+ message(FATAL_ERROR "Can't find CMAKE_JAVA_CLASS_OUTPUT_PATH")
+endif()
diff --git a/Modules/UseSWIG.cmake b/Modules/UseSWIG.cmake
index 78522da..f6a20f8 100644
--- a/Modules/UseSWIG.cmake
+++ b/Modules/UseSWIG.cmake
@@ -341,6 +341,23 @@ function(SWIG_GET_EXTRA_OUTPUT_FILES language outfiles generatedpath infile)
list(APPEND files "${extra_file}")
endforeach()
+ if (language STREQUAL "FORTRAN" AND CMAKE_Fortran_COMPILER_LOADED)
+ # Process possible user-supplied extension in flags (obtained via parent
+ # scope variable) to determine the source file name.
+ list(FIND SWIG_COMPILATION_FLAGS "-fext" fext_idx)
+ if (fext_idx EQUAL -1)
+ # Default Fortran generated extension
+ set(fext "f90")
+ else()
+ # Get extension from user-provided flag
+ math(EXPR fext_idx "${fext_idx} + 1")
+ list(GET SWIG_COMPILATION_FLAGS "${fext_idx}" fext)
+ endif()
+ set(extra_file "${generatedpath}/${module_basename}.${fext}")
+ set_source_files_properties("${extra_file}" PROPERTIES LANGUAGE "Fortran")
+ list(APPEND files "${extra_file}")
+ endif()
+
set (${outfiles} ${files} PARENT_SCOPE)
endfunction()
@@ -415,6 +432,7 @@ function(SWIG_ADD_SOURCE_TO_MODULE name outfiles infile)
get_filename_component(swig_source_file_fullname "${infile}" ABSOLUTE)
if (NOT SWIG_MODULE_${name}_NOPROXY)
+ set(SWIG_COMPILATION_FLAGS ${swig_source_file_flags})
SWIG_GET_EXTRA_OUTPUT_FILES(${SWIG_MODULE_${name}_LANGUAGE}
swig_extra_generated_files
"${outdir}"
@@ -787,6 +805,8 @@ function(SWIG_ADD_LIBRARY name)
if (APPLE)
set_target_properties (${target_name} PROPERTIES SUFFIX ".dylib")
endif ()
+ elseif (swig_lowercase_language STREQUAL "fortran")
+ # Do *not* override the target's library prefix
else()
# assume empty prefix because we expect the module to be dynamically loaded
set_target_properties (${target_name} PROPERTIES PREFIX "")
diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt
index c57f713..6d585ee 100644
--- a/Source/CMakeLists.txt
+++ b/Source/CMakeLists.txt
@@ -1,6 +1,11 @@
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.
+# To ensure maximum portability across various compilers and platforms
+# deactivate any compiler extensions
+set(CMAKE_C_EXTENSIONS FALSE)
+set(CMAKE_CXX_EXTENSIONS FALSE)
+
include(CheckIncludeFile)
# Check if we can build support for ELF parsing.
if(CMAKE_CXX_PLATFORM_ID MATCHES "OpenBSD")
@@ -354,6 +359,7 @@ set(SRCS
cmMakefileTargetGenerator.cxx
cmMakefileExecutableTargetGenerator.cxx
cmMakefileLibraryTargetGenerator.cxx
+ cmMakefileProfilingData.cxx
cmMakefileUtilityTargetGenerator.cxx
cmMessageType.h
cmMessenger.cxx
@@ -377,8 +383,6 @@ set(SRCS
cmProperty.h
cmPropertyDefinition.cxx
cmPropertyDefinition.h
- cmPropertyDefinitionMap.cxx
- cmPropertyDefinitionMap.h
cmPropertyMap.cxx
cmPropertyMap.h
cmQtAutoGen.cxx
@@ -484,6 +488,8 @@ set(SRCS
cmBuildCommand.h
cmBuildNameCommand.cxx
cmBuildNameCommand.h
+ cmCMakeCommand.cxx
+ cmCMakeCommand.h
cmCMakeHostSystemInformationCommand.cxx
cmCMakeHostSystemInformationCommand.h
cmCMakeMinimumRequired.cxx
@@ -690,7 +696,6 @@ set(SRCS
cmWriteFileCommand.cxx
cmWriteFileCommand.h
- cm_static_string_view.hxx
cm_get_date.h
cm_get_date.c
cm_utf8.h
diff --git a/Source/CMakeVersion.cmake b/Source/CMakeVersion.cmake
index b3d3742..fda9848 100644
--- a/Source/CMakeVersion.cmake
+++ b/Source/CMakeVersion.cmake
@@ -1,7 +1,7 @@
# CMake version number components.
set(CMake_VERSION_MAJOR 3)
set(CMake_VERSION_MINOR 17)
-set(CMake_VERSION_PATCH 2)
+set(CMake_VERSION_PATCH 20200522)
#set(CMake_VERSION_RC 0)
set(CMake_VERSION_IS_DIRTY 0)
diff --git a/Source/CPack/IFW/cmCPackIFWCommon.cxx b/Source/CPack/IFW/cmCPackIFWCommon.cxx
index 9fa74be..20d392d 100644
--- a/Source/CPack/IFW/cmCPackIFWCommon.cxx
+++ b/Source/CPack/IFW/cmCPackIFWCommon.cxx
@@ -2,7 +2,7 @@
file Copyright.txt or https://cmake.org/licensing for details. */
#include "cmCPackIFWCommon.h"
-#include <cstddef>
+#include <cstddef> // IWYU pragma: keep
#include <sstream>
#include <utility>
#include <vector>
diff --git a/Source/CPack/IFW/cmCPackIFWGenerator.cxx b/Source/CPack/IFW/cmCPackIFWGenerator.cxx
index 509ac65..2806c61 100644
--- a/Source/CPack/IFW/cmCPackIFWGenerator.cxx
+++ b/Source/CPack/IFW/cmCPackIFWGenerator.cxx
@@ -544,10 +544,7 @@ std::string cmCPackIFWGenerator::GetGroupPackageName(
if (group->ParentGroup) {
cmCPackIFWPackage* package = this->GetGroupPackage(group->ParentGroup);
bool dot = !this->ResolveDuplicateNames;
- if (dot && name.substr(0, package->Name.size()) == package->Name) {
- dot = false;
- }
- if (dot) {
+ if (dot && !cmHasPrefix(name, package->Name)) {
name = package->Name + "." + name;
}
}
@@ -576,10 +573,7 @@ std::string cmCPackIFWGenerator::GetComponentPackageName(
return package->Name;
}
bool dot = !this->ResolveDuplicateNames;
- if (dot && name.substr(0, package->Name.size()) == package->Name) {
- dot = false;
- }
- if (dot) {
+ if (dot && !cmHasPrefix(name, package->Name)) {
name = package->Name + "." + name;
}
}
diff --git a/Source/CPack/IFW/cmCPackIFWPackage.cxx b/Source/CPack/IFW/cmCPackIFWPackage.cxx
index 9a9cd56..56a74c5 100644
--- a/Source/CPack/IFW/cmCPackIFWPackage.cxx
+++ b/Source/CPack/IFW/cmCPackIFWPackage.cxx
@@ -55,8 +55,7 @@ cmCPackIFWPackage::DependenceStruct::DependenceStruct(
if (dashPos != std::string::npos) {
pos = dashPos;
}
- this->Name =
- pos == std::string::npos ? dependence : dependence.substr(0, pos);
+ this->Name = dependence.substr(0, pos);
}
std::string cmCPackIFWPackage::DependenceStruct::NameWithCompare() const
diff --git a/Source/CPack/IFW/cmCPackIFWRepository.cxx b/Source/CPack/IFW/cmCPackIFWRepository.cxx
index a696549..f5e8744 100644
--- a/Source/CPack/IFW/cmCPackIFWRepository.cxx
+++ b/Source/CPack/IFW/cmCPackIFWRepository.cxx
@@ -21,11 +21,7 @@ bool cmCPackIFWRepository::IsValid() const
switch (this->Update) {
case cmCPackIFWRepository::None:
- valid = !this->Url.empty();
- break;
case cmCPackIFWRepository::Add:
- valid = !this->Url.empty();
- break;
case cmCPackIFWRepository::Remove:
valid = !this->Url.empty();
break;
diff --git a/Source/CPack/OSXScriptLauncher.cxx b/Source/CPack/OSXScriptLauncher.cxx
index 21d27a0..bdaf779 100644
--- a/Source/CPack/OSXScriptLauncher.cxx
+++ b/Source/CPack/OSXScriptLauncher.cxx
@@ -5,6 +5,8 @@
#include <string>
#include <vector>
+#include <cm/memory>
+
#include <CoreFoundation/CoreFoundation.h>
#include "cmsys/FStream.hxx"
@@ -26,7 +28,6 @@ int main(int argc, char* argv[])
CFStringRef fileName;
CFBundleRef appBundle;
CFURLRef scriptFileURL;
- UInt8* path;
// get CF URL for script
if (!(appBundle = CFBundleGetMainBundle())) {
@@ -41,13 +42,15 @@ int main(int argc, char* argv[])
}
// create path string
- if (!(path = new UInt8[PATH_MAX])) {
+ auto path = cm::make_unique<UInt8[]>(PATH_MAX);
+ if (!path) {
return 1;
}
// get the file system path of the url as a cstring
// in an encoding suitable for posix apis
- if (!CFURLGetFileSystemRepresentation(scriptFileURL, true, path, PATH_MAX)) {
+ if (!CFURLGetFileSystemRepresentation(scriptFileURL, true, path.get(),
+ PATH_MAX)) {
DebugError("CFURLGetFileSystemRepresentation failed");
return 1;
}
@@ -55,10 +58,10 @@ int main(int argc, char* argv[])
// dispose of the CF variable
CFRelease(scriptFileURL);
- std::string fullScriptPath = reinterpret_cast<char*>(path);
- delete[] path;
+ std::string fullScriptPath = reinterpret_cast<char*>(path.get());
+ path.reset();
- if (!cmsys::SystemTools::FileExists(fullScriptPath.c_str())) {
+ if (!cmsys::SystemTools::FileExists(fullScriptPath)) {
return 1;
}
@@ -80,7 +83,6 @@ int main(int argc, char* argv[])
cmsysProcess_SetTimeout(cp, 0);
cmsysProcess_Execute(cp);
- std::vector<char> tempOutput;
char* data;
int length;
while (cmsysProcess_WaitForData(cp, &data, &length, nullptr)) {
diff --git a/Source/CPack/WiX/cmCPackWIXGenerator.cxx b/Source/CPack/WiX/cmCPackWIXGenerator.cxx
index e71a38f..72af10b 100644
--- a/Source/CPack/WiX/cmCPackWIXGenerator.cxx
+++ b/Source/CPack/WiX/cmCPackWIXGenerator.cxx
@@ -4,14 +4,15 @@
#include <algorithm>
+#include <cm/memory>
#include <cm/string_view>
+#include <cmext/algorithm>
#include "cmsys/Directory.hxx"
#include "cmsys/Encoding.hxx"
#include "cmsys/FStream.hxx"
#include "cmsys/SystemTools.hxx"
-#include "cmAlgorithms.h"
#include "cmCPackComponentGroup.h"
#include "cmCPackLog.h"
#include "cmCryptoHash.h"
@@ -35,22 +36,16 @@
#include "cmCMakeToWixPath.h"
cmCPackWIXGenerator::cmCPackWIXGenerator()
- : Patch(0)
- , ComponentGuidType(cmWIXSourceWriter::WIX_GENERATED_GUID)
+ : ComponentGuidType(cmWIXSourceWriter::WIX_GENERATED_GUID)
{
}
-cmCPackWIXGenerator::~cmCPackWIXGenerator()
-{
- if (this->Patch) {
- delete this->Patch;
- }
-}
+cmCPackWIXGenerator::~cmCPackWIXGenerator() = default;
int cmCPackWIXGenerator::InitializeInternal()
{
componentPackageMethod = ONE_PACKAGE;
- this->Patch = new cmWIXPatch(this->Logger);
+ this->Patch = cm::make_unique<cmWIXPatch>(this->Logger);
return this->Superclass::InitializeInternal();
}
@@ -103,7 +98,7 @@ bool cmCPackWIXGenerator::RunCandleCommand(std::string const& sourceFile,
command << " -ext " << QuotePath(ext);
}
- if (sourceFile.rfind(this->CPackTopLevel, 0) != 0) {
+ if (!cmHasSuffix(sourceFile, this->CPackTopLevel)) {
command << " " << QuotePath("-I" + this->CPackTopLevel);
}
@@ -355,8 +350,7 @@ void cmCPackWIXGenerator::CreateWiXPropertiesIncludeFile()
std::vector<std::string> options = GetOptions();
for (std::string const& name : options) {
- if (name.length() > prefix.length() &&
- name.substr(0, prefix.length()) == prefix) {
+ if (cmHasPrefix(name, prefix)) {
std::string id = name.substr(prefix.length());
std::string value = GetOption(name.c_str());
@@ -960,7 +954,7 @@ void cmCPackWIXGenerator::AddDirectoryAndFileDefinitions(
shortcut.workingDirectoryId = directoryId;
shortcuts.insert(cmWIXShortcuts::START_MENU, id, shortcut);
- if (cmContains(desktopExecutables, executableName)) {
+ if (cm::contains(desktopExecutables, executableName)) {
shortcuts.insert(cmWIXShortcuts::DESKTOP, id, shortcut);
}
}
@@ -1104,14 +1098,14 @@ std::string cmCPackWIXGenerator::CreateHashedId(
cmCryptoHash sha1(cmCryptoHash::AlgoSHA1);
std::string const hash = sha1.HashString(path);
- std::string identifier = cmStrCat(cm::string_view(hash).substr(0, 7), '_');
-
const size_t maxFileNameLength = 52;
+ std::string identifier =
+ cmStrCat(cm::string_view(hash).substr(0, 7), '_',
+ cm::string_view(normalizedFilename).substr(0, maxFileNameLength));
+
+ // if the name was truncated
if (normalizedFilename.length() > maxFileNameLength) {
- identifier += normalizedFilename.substr(0, maxFileNameLength - 3);
identifier += "...";
- } else {
- identifier += normalizedFilename;
}
return identifier;
diff --git a/Source/CPack/WiX/cmCPackWIXGenerator.h b/Source/CPack/WiX/cmCPackWIXGenerator.h
index d193348..d5a16ec 100644
--- a/Source/CPack/WiX/cmCPackWIXGenerator.h
+++ b/Source/CPack/WiX/cmCPackWIXGenerator.h
@@ -4,6 +4,7 @@
#define cmCPackWIXGenerator_h
#include <map>
+#include <memory>
#include <string>
#include "cmCPackGenerator.h"
@@ -24,6 +25,8 @@ public:
cmCPackTypeMacro(cmCPackWIXGenerator, cmCPackGenerator);
cmCPackWIXGenerator();
+ cmCPackWIXGenerator(const cmCPackWIXGenerator&) = delete;
+ const cmCPackWIXGenerator& operator=(const cmCPackWIXGenerator&) = delete;
~cmCPackWIXGenerator();
protected:
@@ -157,7 +160,7 @@ private:
std::string CPackTopLevel;
- cmWIXPatch* Patch;
+ std::unique_ptr<cmWIXPatch> Patch;
cmWIXSourceWriter::GuidType ComponentGuidType;
};
diff --git a/Source/CPack/WiX/cmWIXAccessControlList.cxx b/Source/CPack/WiX/cmWIXAccessControlList.cxx
index 3668b46..9685a7f 100644
--- a/Source/CPack/WiX/cmWIXAccessControlList.cxx
+++ b/Source/CPack/WiX/cmWIXAccessControlList.cxx
@@ -2,6 +2,8 @@
file Copyright.txt or https://cmake.org/licensing for details. */
#include "cmWIXAccessControlList.h"
+#include <cm/string_view>
+
#include "cmCPackGenerator.h"
#include "cmStringAlgorithms.h"
#include "cmSystemTools.h"
@@ -35,12 +37,13 @@ void cmWIXAccessControlList::CreatePermissionElement(std::string const& entry)
return;
}
- std::string user_and_domain = entry.substr(0, pos);
- std::string permission_string = entry.substr(pos + 1);
+ cm::string_view enview(entry);
+ cm::string_view user_and_domain = enview.substr(0, pos);
+ cm::string_view permission_string = enview.substr(pos + 1);
pos = user_and_domain.find('@');
- std::string user;
- std::string domain;
+ cm::string_view user;
+ cm::string_view domain;
if (pos != std::string::npos) {
user = user_and_domain.substr(0, pos);
domain = user_and_domain.substr(pos + 1);
@@ -51,9 +54,9 @@ void cmWIXAccessControlList::CreatePermissionElement(std::string const& entry)
std::vector<std::string> permissions = cmTokenize(permission_string, ",");
this->SourceWriter.BeginElement("Permission");
- this->SourceWriter.AddAttribute("User", user);
+ this->SourceWriter.AddAttribute("User", std::string(user));
if (!domain.empty()) {
- this->SourceWriter.AddAttribute("Domain", domain);
+ this->SourceWriter.AddAttribute("Domain", std::string(domain));
}
for (std::string const& permission : permissions) {
this->EmitBooleanAttribute(entry, cmTrimWhitespace(permission));
diff --git a/Source/CPack/WiX/cmWIXFilesSourceWriter.cxx b/Source/CPack/WiX/cmWIXFilesSourceWriter.cxx
index c0d879a..b4085d5 100644
--- a/Source/CPack/WiX/cmWIXFilesSourceWriter.cxx
+++ b/Source/CPack/WiX/cmWIXFilesSourceWriter.cxx
@@ -1,5 +1,10 @@
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
+#if defined(__CYGWIN__)
+// For S_IWRITE symbol
+# define _DEFAULT_SOURCE
+#endif
+
#include "cmWIXFilesSourceWriter.h"
#include "cm_sys_stat.h"
diff --git a/Source/CPack/WiX/cmWIXPatch.cxx b/Source/CPack/WiX/cmWIXPatch.cxx
index ca232f9..122ffaf 100644
--- a/Source/CPack/WiX/cmWIXPatch.cxx
+++ b/Source/CPack/WiX/cmWIXPatch.cxx
@@ -41,7 +41,7 @@ void cmWIXPatch::ApplyFragment(std::string const& id,
void cmWIXPatch::ApplyElementChildren(const cmWIXPatchElement& element,
cmWIXSourceWriter& writer)
{
- for (cmWIXPatchNode* node : element.children) {
+ for (const auto& node : element.children) {
switch (node->type()) {
case cmWIXPatchNode::ELEMENT:
ApplyElement(dynamic_cast<const cmWIXPatchElement&>(*node), writer);
diff --git a/Source/CPack/WiX/cmWIXPatchParser.cxx b/Source/CPack/WiX/cmWIXPatchParser.cxx
index fd9103b..8b26c4e 100644
--- a/Source/CPack/WiX/cmWIXPatchParser.cxx
+++ b/Source/CPack/WiX/cmWIXPatchParser.cxx
@@ -2,7 +2,11 @@
file Copyright.txt or https://cmake.org/licensing for details. */
#include "cmWIXPatchParser.h"
-#include "cm_expat.h"
+#include <utility>
+
+#include <cm/memory>
+
+#include <cm3p/expat.h>
#include "cmCPackGenerator.h"
@@ -20,12 +24,8 @@ cmWIXPatchNode::~cmWIXPatchNode()
{
}
-cmWIXPatchElement::~cmWIXPatchElement()
-{
- for (cmWIXPatchNode* child : children) {
- delete child;
- }
-}
+cmWIXPatchElement::cmWIXPatchElement() = default;
+cmWIXPatchElement::~cmWIXPatchElement() = default;
cmWIXPatchParser::cmWIXPatchParser(fragment_map_t& fragments,
cmCPackLog* logger)
@@ -54,8 +54,7 @@ void cmWIXPatchParser::StartElement(const std::string& name, const char** atts)
} else if (State == INSIDE_FRAGMENT) {
cmWIXPatchElement& parent = *ElementStack.back();
- cmWIXPatchElement* element = new cmWIXPatchElement;
- parent.children.push_back(element);
+ auto element = cm::make_unique<cmWIXPatchElement>();
element->name = name;
@@ -66,7 +65,8 @@ void cmWIXPatchParser::StartElement(const std::string& name, const char** atts)
element->attributes[key] = value;
}
- ElementStack.push_back(element);
+ ElementStack.push_back(element.get());
+ parent.children.push_back(std::move(element));
}
}
@@ -130,10 +130,10 @@ void cmWIXPatchParser::CharacterDataHandler(const char* data, int length)
std::string::size_type last = text.find_last_not_of(whitespace);
if (first != std::string::npos && last != std::string::npos) {
- cmWIXPatchText* text_node = new cmWIXPatchText;
+ auto text_node = cm::make_unique<cmWIXPatchText>();
text_node->text = text.substr(first, last - first + 1);
- parent.children.push_back(text_node);
+ parent.children.push_back(std::move(text_node));
}
}
}
diff --git a/Source/CPack/WiX/cmWIXPatchParser.h b/Source/CPack/WiX/cmWIXPatchParser.h
index 87dd892..8d5d2ad 100644
--- a/Source/CPack/WiX/cmWIXPatchParser.h
+++ b/Source/CPack/WiX/cmWIXPatchParser.h
@@ -4,6 +4,7 @@
#define cmCPackWIXPatchParser_h
#include <map>
+#include <memory>
#include <vector>
#include "cmCPackLog.h"
@@ -33,9 +34,14 @@ struct cmWIXPatchElement : cmWIXPatchNode
{
virtual Type type();
+ cmWIXPatchElement();
+
+ cmWIXPatchElement(const cmWIXPatchElement&) = delete;
+ const cmWIXPatchElement& operator=(const cmWIXPatchElement&) = delete;
+
~cmWIXPatchElement();
- using child_list_t = std::vector<cmWIXPatchNode*>;
+ using child_list_t = std::vector<std::unique_ptr<cmWIXPatchNode>>;
using attributes_t = std::map<std::string, std::string>;
std::string name;
diff --git a/Source/CPack/cmCPackArchiveGenerator.cxx b/Source/CPack/cmCPackArchiveGenerator.cxx
index 43f2946..967cc60 100644
--- a/Source/CPack/cmCPackArchiveGenerator.cxx
+++ b/Source/CPack/cmCPackArchiveGenerator.cxx
@@ -8,6 +8,8 @@
#include <utility>
#include <vector>
+#include <cm3p/archive.h>
+
#include "cmCPackComponentGroup.h"
#include "cmCPackGenerator.h"
#include "cmCPackLog.h"
@@ -154,6 +156,20 @@ int cmCPackArchiveGenerator::addOneComponentToArchive(
} \
cmArchiveWrite archive(gf, this->Compress, this->ArchiveFormat); \
do { \
+ if (!this->SetArchiveOptions(&archive)) { \
+ cmCPackLogger(cmCPackLog::LOG_ERROR, \
+ "Problem to set archive options <" \
+ << (filename) << ">, ERROR = " << (archive).GetError() \
+ << std::endl); \
+ return 0; \
+ } \
+ if (!archive.Open()) { \
+ cmCPackLogger(cmCPackLog::LOG_ERROR, \
+ "Problem to open archive <" \
+ << (filename) << ">, ERROR = " << (archive).GetError() \
+ << std::endl); \
+ return 0; \
+ } \
if (!(archive)) { \
cmCPackLogger(cmCPackLog::LOG_ERROR, \
"Problem to create archive <" \
@@ -328,3 +344,23 @@ bool cmCPackArchiveGenerator::SupportsComponentInstallation() const
// (for backward compatibility reason)
return IsOn("CPACK_ARCHIVE_COMPONENT_INSTALL");
}
+
+bool cmCPackArchiveGenerator::SetArchiveOptions(cmArchiveWrite* archive)
+{
+#if ARCHIVE_VERSION_NUMBER >= 3004000
+ // Upstream fixed an issue with their integer parsing in 3.4.0 which would
+ // cause spurious errors to be raised from `strtoull`.
+ if (this->Compress == cmArchiveWrite::CompressXZ) {
+ const char* threads = "1";
+ if (this->IsSet("CPACK_ARCHIVE_THREADS")) {
+ threads = this->GetOption("CPACK_ARCHIVE_THREADS");
+ }
+
+ if (!archive->SetFilterOption("xz", "threads", threads)) {
+ return false;
+ }
+ }
+#endif
+
+ return true;
+}
diff --git a/Source/CPack/cmCPackArchiveGenerator.h b/Source/CPack/cmCPackArchiveGenerator.h
index 8d67720..7eb5665 100644
--- a/Source/CPack/cmCPackArchiveGenerator.h
+++ b/Source/CPack/cmCPackArchiveGenerator.h
@@ -86,6 +86,8 @@ private:
return this->OutputExtension.c_str();
}
+ bool SetArchiveOptions(cmArchiveWrite* archive);
+
private:
cmArchiveWrite::Compress Compress;
std::string ArchiveFormat;
diff --git a/Source/CPack/cmCPackDebGenerator.cxx b/Source/CPack/cmCPackDebGenerator.cxx
index d92acde..3d5fe6b 100644
--- a/Source/CPack/cmCPackDebGenerator.cxx
+++ b/Source/CPack/cmCPackDebGenerator.cxx
@@ -135,16 +135,17 @@ void DebGenerator::generateDebianBinaryFile() const
{
// debian-binary file
const std::string dbfilename = WorkDir + "/debian-binary";
- cmGeneratedFileStream out(dbfilename);
- out << "2.0";
- out << std::endl; // required for valid debian package
+ cmGeneratedFileStream out;
+ out.Open(dbfilename, false, true);
+ out << "2.0\n"; // required for valid debian package
}
void DebGenerator::generateControlFile() const
{
std::string ctlfilename = WorkDir + "/control";
- cmGeneratedFileStream out(ctlfilename);
+ cmGeneratedFileStream out;
+ out.Open(ctlfilename, false, true);
for (auto const& kv : ControlValues) {
out << kv.first << ": " << kv.second << "\n";
}
@@ -156,8 +157,7 @@ void DebGenerator::generateControlFile() const
totalSize += cmSystemTools::FileLength(file);
}
}
- out << "Installed-Size: " << (totalSize + 1023) / 1024 << "\n";
- out << std::endl;
+ out << "Installed-Size: " << (totalSize + 1023) / 1024 << "\n\n";
}
bool DebGenerator::generateDataTar() const
@@ -173,6 +173,7 @@ bool DebGenerator::generateDataTar() const
}
cmArchiveWrite data_tar(fileStream_data_tar, TarCompressionType,
DebianArchiveType);
+ data_tar.Open();
// uid/gid should be the one of the root user, and this root user has
// always uid/gid equal to 0.
@@ -247,7 +248,8 @@ std::string DebGenerator::generateMD5File() const
{
std::string md5filename = WorkDir + "/md5sums";
- cmGeneratedFileStream out(md5filename);
+ cmGeneratedFileStream out;
+ out.Open(md5filename, false, true);
std::string topLevelWithTrailingSlash = cmStrCat(TemporaryDir, '/');
for (std::string const& file : PackageFiles) {
@@ -291,6 +293,7 @@ bool DebGenerator::generateControlTar(std::string const& md5Filename) const
}
cmArchiveWrite control_tar(fileStream_control_tar,
cmArchiveWrite::CompressGZip, DebianArchiveType);
+ control_tar.Open();
// sets permissions and uid/gid for the files
control_tar.SetUIDAndGID(0u, 0u);
@@ -410,6 +413,7 @@ bool DebGenerator::generateDeb() const
cmGeneratedFileStream debStream;
debStream.Open(outputPath, false, true);
cmArchiveWrite deb(debStream, cmArchiveWrite::CompressNone, "arbsd");
+ deb.Open();
// uid/gid should be the one of the root user, and this root user has
// always uid/gid equal to 0.
@@ -754,15 +758,17 @@ int cmCPackDebGenerator::createDeb()
const bool gen_shibs = this->IsOn("CPACK_DEBIAN_PACKAGE_GENERATE_SHLIBS") &&
debian_pkg_shlibs && *debian_pkg_shlibs;
if (gen_shibs) {
- cmGeneratedFileStream out(shlibsfilename);
+ cmGeneratedFileStream out;
+ out.Open(shlibsfilename, false, true);
out << debian_pkg_shlibs;
- out << std::endl;
+ out << '\n';
}
const std::string postinst = strGenWDIR + "/postinst";
const std::string postrm = strGenWDIR + "/postrm";
if (this->IsOn("GEN_CPACK_DEBIAN_GENERATE_POSTINST")) {
- cmGeneratedFileStream out(postinst);
+ cmGeneratedFileStream out;
+ out.Open(postinst, false, true);
out << "#!/bin/sh\n\n"
"set -e\n\n"
"if [ \"$1\" = \"configure\" ]; then\n"
@@ -770,7 +776,8 @@ int cmCPackDebGenerator::createDeb()
"fi\n";
}
if (this->IsOn("GEN_CPACK_DEBIAN_GENERATE_POSTRM")) {
- cmGeneratedFileStream out(postrm);
+ cmGeneratedFileStream out;
+ out.Open(postrm, false, true);
out << "#!/bin/sh\n\n"
"set -e\n\n"
"if [ \"$1\" = \"remove\" ]; then\n"
diff --git a/Source/CPack/cmCPackExternalGenerator.cxx b/Source/CPack/cmCPackExternalGenerator.cxx
index 142eb6f..11e1aec 100644
--- a/Source/CPack/cmCPackExternalGenerator.cxx
+++ b/Source/CPack/cmCPackExternalGenerator.cxx
@@ -8,10 +8,10 @@
#include <cm/memory>
-#include "cmsys/FStream.hxx"
+#include <cm3p/json/value.h>
+#include <cm3p/json/writer.h>
-#include "cm_jsoncpp_value.h"
-#include "cm_jsoncpp_writer.h"
+#include "cmsys/FStream.hxx"
#include "cmCPackComponentGroup.h"
#include "cmCPackLog.h"
diff --git a/Source/CPack/cmCPackFreeBSDGenerator.cxx b/Source/CPack/cmCPackFreeBSDGenerator.cxx
index e3cc352..b673006 100644
--- a/Source/CPack/cmCPackFreeBSDGenerator.cxx
+++ b/Source/CPack/cmCPackFreeBSDGenerator.cxx
@@ -8,6 +8,7 @@
#include "cmGeneratedFileStream.h"
#include "cmStringAlgorithms.h"
#include "cmSystemTools.h"
+#include "cmWorkingDirectory.h"
// Needed for ::open() and ::stat()
#include <algorithm>
@@ -285,8 +286,7 @@ int cmCPackFreeBSDGenerator::PackageFiles()
}
std::vector<std::string>::const_iterator fileIt;
- std::string dir = cmSystemTools::GetCurrentWorkingDirectory();
- cmSystemTools::ChangeDirectory(toplevel);
+ cmWorkingDirectory wd(toplevel);
files.erase(std::remove_if(files.begin(), files.end(), ignore_file),
files.end());
@@ -332,6 +332,5 @@ int cmCPackFreeBSDGenerator::PackageFiles()
}
}
- cmSystemTools::ChangeDirectory(dir);
return 1;
}
diff --git a/Source/CPack/cmCPackGenerator.cxx b/Source/CPack/cmCPackGenerator.cxx
index e053144..08fd2a2 100644
--- a/Source/CPack/cmCPackGenerator.cxx
+++ b/Source/CPack/cmCPackGenerator.cxx
@@ -403,7 +403,6 @@ int cmCPackGenerator::InstallProjectViaInstalledDirectories(
}
/* rebuild symlinks in the installed tree */
if (!symlinkedFiles.empty()) {
- std::string curDir = cmSystemTools::GetCurrentWorkingDirectory();
std::string goToDir = cmStrCat(tempDir, '/', subdir);
cmCPackLogger(cmCPackLog::LOG_DEBUG,
"Change dir to: " << goToDir << std::endl);
@@ -442,7 +441,8 @@ int cmCPackGenerator::InstallProjectViaInstalledDirectories(
}
}
cmCPackLogger(cmCPackLog::LOG_DEBUG,
- "Going back to: " << curDir << std::endl);
+ "Going back to: " << workdir.GetOldDirectory()
+ << std::endl);
}
}
}
diff --git a/Source/CPack/cmCPackLog.cxx b/Source/CPack/cmCPackLog.cxx
index ca675fd..49e4113 100644
--- a/Source/CPack/cmCPackLog.cxx
+++ b/Source/CPack/cmCPackLog.cxx
@@ -4,54 +4,38 @@
#include <iostream>
+#include <cm/memory>
+
#include "cmGeneratedFileStream.h"
#include "cmSystemTools.h"
cmCPackLog::cmCPackLog()
{
- this->Verbose = false;
- this->Debug = false;
- this->Quiet = false;
- this->NewLine = true;
-
- this->LastTag = cmCPackLog::NOTAG;
this->DefaultOutput = &std::cout;
this->DefaultError = &std::cerr;
-
- this->LogOutput = nullptr;
- this->LogOutputCleanup = false;
}
-cmCPackLog::~cmCPackLog()
-{
- this->SetLogOutputStream(nullptr);
-}
+cmCPackLog::~cmCPackLog() = default;
void cmCPackLog::SetLogOutputStream(std::ostream* os)
{
- if (this->LogOutputCleanup && this->LogOutput) {
- delete this->LogOutput;
- }
- this->LogOutputCleanup = false;
+ this->LogOutputStream.reset();
this->LogOutput = os;
}
bool cmCPackLog::SetLogOutputFile(const char* fname)
{
- cmGeneratedFileStream* cg = nullptr;
+ this->LogOutputStream.reset();
if (fname) {
- cg = new cmGeneratedFileStream(fname);
- }
- if (cg && !*cg) {
- delete cg;
- cg = nullptr;
+ this->LogOutputStream = cm::make_unique<cmGeneratedFileStream>(fname);
}
- this->SetLogOutputStream(cg);
- if (!cg) {
- return false;
+ if (this->LogOutputStream && !*this->LogOutputStream) {
+ this->LogOutputStream.reset();
}
- this->LogOutputCleanup = true;
- return true;
+
+ this->LogOutput = this->LogOutputStream.get();
+
+ return this->LogOutput != nullptr;
}
void cmCPackLog::Log(int tag, const char* file, int line, const char* msg,
diff --git a/Source/CPack/cmCPackLog.h b/Source/CPack/cmCPackLog.h
index 1cb1643..68ffcce 100644
--- a/Source/CPack/cmCPackLog.h
+++ b/Source/CPack/cmCPackLog.h
@@ -5,6 +5,7 @@
#include "cmConfigure.h" // IWYU pragma: keep
+#include <memory>
#include <ostream>
#include <string>
@@ -97,13 +98,13 @@ public:
void SetErrorPrefix(std::string const& pfx) { this->ErrorPrefix = pfx; }
private:
- bool Verbose;
- bool Debug;
- bool Quiet;
+ bool Verbose = false;
+ bool Debug = false;
+ bool Quiet = false;
- bool NewLine;
+ bool NewLine = true;
- int LastTag;
+ int LastTag = cmCPackLog::NOTAG;
std::string Prefix;
std::string OutputPrefix;
@@ -112,13 +113,11 @@ private:
std::string WarningPrefix;
std::string ErrorPrefix;
- std::ostream* DefaultOutput;
- std::ostream* DefaultError;
+ std::ostream* DefaultOutput = nullptr;
+ std::ostream* DefaultError = nullptr;
- std::string LogOutputFileName;
- std::ostream* LogOutput;
- // Do we need to cleanup log output stream
- bool LogOutputCleanup;
+ std::ostream* LogOutput = nullptr;
+ std::unique_ptr<std::ostream> LogOutputStream;
};
class cmCPackLogWrite
diff --git a/Source/CPack/cmCPackNSISGenerator.cxx b/Source/CPack/cmCPackNSISGenerator.cxx
index 2a46627..058b090 100644
--- a/Source/CPack/cmCPackNSISGenerator.cxx
+++ b/Source/CPack/cmCPackNSISGenerator.cxx
@@ -9,10 +9,11 @@
#include <sstream>
#include <utility>
+#include <cmext/algorithm>
+
#include "cmsys/Directory.hxx"
#include "cmsys/RegularExpression.hxx"
-#include "cmAlgorithms.h"
#include "cmCPackComponentGroup.h"
#include "cmCPackGenerator.h"
#include "cmCPackLog.h"
@@ -68,7 +69,7 @@ int cmCPackNSISGenerator::PackageFiles()
// Use the custom component install directory if we have one
if (pos != std::string::npos) {
- const std::string componentName = fileN.substr(0, pos);
+ auto componentName = cm::string_view(fileN).substr(0, pos);
outputDir = CustomComponentInstallDirectory(componentName);
} else {
outputDir = CustomComponentInstallDirectory(fileN);
@@ -103,7 +104,7 @@ int cmCPackNSISGenerator::PackageFiles()
componentName = fileN.substr(0, slash);
// Strip off the component part of the path.
- fileN = fileN.substr(slash + 1);
+ fileN.erase(0, slash + 1);
}
}
std::replace(fileN.begin(), fileN.end(), '/', '\\');
@@ -203,6 +204,11 @@ int cmCPackNSISGenerator::PackageFiles()
"!define MUI_FINISHPAGE_TITLE_3LINES");
}
+ if (this->IsSet("CPACK_NSIS_MANIFEST_DPI_AWARE")) {
+ this->SetOptionIfNotSet("CPACK_NSIS_MANIFEST_DPI_AWARE_CODE",
+ "ManifestDPIAware true");
+ }
+
// Setup all of the component sections
if (this->Components.empty()) {
this->SetOptionIfNotSet("CPACK_NSIS_INSTALLATION_TYPES", "");
@@ -524,7 +530,7 @@ int cmCPackNSISGenerator::InitializeInternal()
<< ".lnk\"" << std::endl;
// see if CPACK_CREATE_DESKTOP_LINK_ExeName is on
// if so add a desktop link
- if (cmContains(cpackPackageDesktopLinksVector, execName)) {
+ if (cm::contains(cpackPackageDesktopLinksVector, execName)) {
str << " StrCmp \"$INSTALL_DESKTOP\" \"1\" 0 +2\n";
str << " CreateShortCut \"$DESKTOP\\" << linkName
<< R"(.lnk" "$INSTDIR\)" << cpackNsisExecutablesDirectory << "\\"
@@ -672,7 +678,7 @@ std::string cmCPackNSISGenerator::CreateComponentDescription(
const std::string componentOutputDir =
CustomComponentInstallDirectory(component->Name);
- componentCode += " SetOutPath \"" + componentOutputDir + "\"\n";
+ componentCode += cmStrCat(" SetOutPath \"", componentOutputDir, "\"\n");
// Create the actual installation commands
if (component->IsDownloaded) {
@@ -921,12 +927,11 @@ std::string cmCPackNSISGenerator::CreateComponentGroupDescription(
}
std::string cmCPackNSISGenerator::CustomComponentInstallDirectory(
- const std::string& componentName)
+ cm::string_view componentName)
{
- const char* outputDir =
- this->GetOption("CPACK_NSIS_" + componentName + "_INSTALL_DIRECTORY");
- const std::string componentOutputDir = (outputDir ? outputDir : "$INSTDIR");
- return componentOutputDir;
+ const char* outputDir = this->GetOption(
+ cmStrCat("CPACK_NSIS_", componentName, "_INSTALL_DIRECTORY"));
+ return outputDir ? outputDir : "$INSTDIR";
}
std::string cmCPackNSISGenerator::TranslateNewlines(std::string str)
diff --git a/Source/CPack/cmCPackNSISGenerator.h b/Source/CPack/cmCPackNSISGenerator.h
index 0af37af..88cba45 100644
--- a/Source/CPack/cmCPackNSISGenerator.h
+++ b/Source/CPack/cmCPackNSISGenerator.h
@@ -10,6 +10,8 @@
#include <string>
#include <vector>
+#include <cm/string_view>
+
#include "cmCPackGenerator.h"
class cmCPackComponent;
@@ -75,8 +77,7 @@ protected:
/// Returns the custom install directory if available for the specified
/// component, otherwise $INSTDIR is returned.
- std::string CustomComponentInstallDirectory(
- const std::string& componentName);
+ std::string CustomComponentInstallDirectory(cm::string_view componentName);
/// Translations any newlines found in the string into \\r\\n, so that the
/// resulting string can be used within NSIS.
diff --git a/Source/CPack/cpack.cxx b/Source/CPack/cpack.cxx
index dc31623..2e5bde2 100644
--- a/Source/CPack/cpack.cxx
+++ b/Source/CPack/cpack.cxx
@@ -85,7 +85,7 @@ int cpackDefinitionArgument(const char* argument, const char* cValue,
return 0;
}
std::string key = value.substr(0, pos);
- value = value.substr(pos + 1);
+ value.erase(0, pos + 1);
def->Map[key] = value;
cmCPack_Log(def->Log, cmCPackLog::LOG_DEBUG,
"Set CPack variable: " << key << " to \"" << value << "\""
diff --git a/Source/CTest/cmCTestBZR.cxx b/Source/CTest/cmCTestBZR.cxx
index c87fb83b..c533cd7 100644
--- a/Source/CTest/cmCTestBZR.cxx
+++ b/Source/CTest/cmCTestBZR.cxx
@@ -10,9 +10,9 @@
#include <cmext/algorithm>
-#include "cmsys/RegularExpression.hxx"
+#include <cm3p/expat.h>
-#include "cm_expat.h"
+#include "cmsys/RegularExpression.hxx"
#include "cmCTest.h"
#include "cmCTestVC.h"
diff --git a/Source/CTest/cmCTestBuildAndTestHandler.cxx b/Source/CTest/cmCTestBuildAndTestHandler.cxx
index 5e29386..db426b2 100644
--- a/Source/CTest/cmCTestBuildAndTestHandler.cxx
+++ b/Source/CTest/cmCTestBuildAndTestHandler.cxx
@@ -379,7 +379,7 @@ int cmCTestBuildAndTestHandler::ProcessCommandLineArguments(
const std::vector<std::string>& allArgs)
{
// --build-and-test options
- if (currentArg.find("--build-and-test", 0) == 0 &&
+ if (cmHasLiteralPrefix(currentArg, "--build-and-test") &&
idx < allArgs.size() - 1) {
if (idx + 2 < allArgs.size()) {
idx++;
@@ -397,25 +397,29 @@ int cmCTestBuildAndTestHandler::ProcessCommandLineArguments(
return 0;
}
}
- if (currentArg.find("--build-target", 0) == 0 && idx < allArgs.size() - 1) {
+ if (cmHasLiteralPrefix(currentArg, "--build-target") &&
+ idx < allArgs.size() - 1) {
idx++;
this->BuildTargets.push_back(allArgs[idx]);
}
- if (currentArg.find("--build-nocmake", 0) == 0) {
+ if (cmHasLiteralPrefix(currentArg, "--build-nocmake")) {
this->BuildNoCMake = true;
}
- if (currentArg.find("--build-run-dir", 0) == 0 && idx < allArgs.size() - 1) {
+ if (cmHasLiteralPrefix(currentArg, "--build-run-dir") &&
+ idx < allArgs.size() - 1) {
idx++;
this->BuildRunDir = allArgs[idx];
}
- if (currentArg.find("--build-two-config", 0) == 0) {
+ if (cmHasLiteralPrefix(currentArg, "--build-two-config")) {
this->BuildTwoConfig = true;
}
- if (currentArg.find("--build-exe-dir", 0) == 0 && idx < allArgs.size() - 1) {
+ if (cmHasLiteralPrefix(currentArg, "--build-exe-dir") &&
+ idx < allArgs.size() - 1) {
idx++;
this->ExecutableDirectory = allArgs[idx];
}
- if (currentArg.find("--test-timeout", 0) == 0 && idx < allArgs.size() - 1) {
+ if (cmHasLiteralPrefix(currentArg, "--test-timeout") &&
+ idx < allArgs.size() - 1) {
idx++;
this->Timeout = cmDuration(atof(allArgs[idx].c_str()));
}
@@ -431,31 +435,33 @@ int cmCTestBuildAndTestHandler::ProcessCommandLineArguments(
idx++;
this->BuildGeneratorToolset = allArgs[idx];
}
- if (currentArg.find("--build-project", 0) == 0 && idx < allArgs.size() - 1) {
+ if (cmHasLiteralPrefix(currentArg, "--build-project") &&
+ idx < allArgs.size() - 1) {
idx++;
this->BuildProject = allArgs[idx];
}
- if (currentArg.find("--build-makeprogram", 0) == 0 &&
+ if (cmHasLiteralPrefix(currentArg, "--build-makeprogram") &&
idx < allArgs.size() - 1) {
idx++;
this->BuildMakeProgram = allArgs[idx];
}
- if (currentArg.find("--build-config-sample", 0) == 0 &&
+ if (cmHasLiteralPrefix(currentArg, "--build-config-sample") &&
idx < allArgs.size() - 1) {
idx++;
this->ConfigSample = allArgs[idx];
}
- if (currentArg.find("--build-noclean", 0) == 0) {
+ if (cmHasLiteralPrefix(currentArg, "--build-noclean")) {
this->BuildNoClean = true;
}
- if (currentArg.find("--build-options", 0) == 0) {
+ if (cmHasLiteralPrefix(currentArg, "--build-options")) {
while (idx + 1 < allArgs.size() && allArgs[idx + 1] != "--build-target" &&
allArgs[idx + 1] != "--test-command") {
++idx;
this->BuildOptions.push_back(allArgs[idx]);
}
}
- if (currentArg.find("--test-command", 0) == 0 && idx < allArgs.size() - 1) {
+ if (cmHasLiteralPrefix(currentArg, "--test-command") &&
+ idx < allArgs.size() - 1) {
++idx;
this->TestCommand = allArgs[idx];
while (idx + 1 < allArgs.size()) {
diff --git a/Source/CTest/cmCTestBuildCommand.cxx b/Source/CTest/cmCTestBuildCommand.cxx
index d1b7701..44fdc29 100644
--- a/Source/CTest/cmCTestBuildCommand.cxx
+++ b/Source/CTest/cmCTestBuildCommand.cxx
@@ -5,7 +5,7 @@
#include <cstring>
#include <sstream>
-#include "cm_static_string_view.hxx"
+#include <cmext/string_view>
#include "cmCTest.h"
#include "cmCTestBuildHandler.h"
diff --git a/Source/CTest/cmCTestBuildHandler.cxx b/Source/CTest/cmCTestBuildHandler.cxx
index 03a3fd3..35c2b11 100644
--- a/Source/CTest/cmCTestBuildHandler.cxx
+++ b/Source/CTest/cmCTestBuildHandler.cxx
@@ -386,24 +386,20 @@ int cmCTestBuildHandler::ProcessHandler()
if (this->CTest->GetCTestConfiguration("SourceDirectory").size() > 20) {
std::string srcdir =
this->CTest->GetCTestConfiguration("SourceDirectory") + "/";
- for (cc = srcdir.size() - 2; cc > 0; cc--) {
- if (srcdir[cc] == '/') {
- srcdir = srcdir.substr(0, cc + 1);
- break;
- }
+ cc = srcdir.rfind('/', srcdir.size() - 2);
+ if (cc != std::string::npos) {
+ srcdir.resize(cc + 1);
+ this->SimplifySourceDir = std::move(srcdir);
}
- this->SimplifySourceDir = srcdir;
}
if (this->CTest->GetCTestConfiguration("BuildDirectory").size() > 20) {
std::string bindir =
this->CTest->GetCTestConfiguration("BuildDirectory") + "/";
- for (cc = bindir.size() - 2; cc > 0; cc--) {
- if (bindir[cc] == '/') {
- bindir = bindir.substr(0, cc + 1);
- break;
- }
+ cc = bindir.rfind('/', bindir.size() - 2);
+ if (cc != std::string::npos) {
+ bindir.resize(cc + 1);
+ this->SimplifyBuildDir = std::move(bindir);
}
- this->SimplifyBuildDir = bindir;
}
// Ok, let's do the build
@@ -545,11 +541,11 @@ void cmCTestBuildHandler::GenerateXMLLaunched(cmXMLWriter& xml)
const char* fname = launchDir.GetFile(i);
if (this->IsLaunchedErrorFile(fname) && numErrorsAllowed) {
numErrorsAllowed--;
- fragments.insert(this->CTestLaunchDir + "/" + fname);
+ fragments.insert(this->CTestLaunchDir + '/' + fname);
++this->TotalErrors;
} else if (this->IsLaunchedWarningFile(fname) && numWarningsAllowed) {
numWarningsAllowed--;
- fragments.insert(this->CTestLaunchDir + "/" + fname);
+ fragments.insert(this->CTestLaunchDir + '/' + fname);
++this->TotalWarnings;
}
}
diff --git a/Source/CTest/cmCTestCVS.cxx b/Source/CTest/cmCTestCVS.cxx
index 45ec390..1209e06 100644
--- a/Source/CTest/cmCTestCVS.cxx
+++ b/Source/CTest/cmCTestCVS.cxx
@@ -152,10 +152,12 @@ private:
this->FinishRevision();
}
} else if (this->Section == SectionRevisions) {
+ // XXX(clang-tidy): https://bugs.llvm.org/show_bug.cgi?id=44165
+ // NOLINTNEXTLINE(bugprone-branch-clone)
if (!this->Rev.Log.empty()) {
// Continue the existing log.
this->Rev.Log += this->Line;
- this->Rev.Log += "\n";
+ this->Rev.Log += '\n';
} else if (this->Rev.Rev.empty() &&
this->RegexRevision.find(this->Line)) {
this->Rev.Rev = this->RegexRevision.match(1);
@@ -166,7 +168,7 @@ private:
} else if (!this->RegexBranches.find(this->Line)) {
// Start the log.
this->Rev.Log += this->Line;
- this->Rev.Log += "\n";
+ this->Rev.Log += '\n';
}
}
return this->Section != SectionEnd;
diff --git a/Source/CTest/cmCTestConfigureCommand.cxx b/Source/CTest/cmCTestConfigureCommand.cxx
index 3854710..f42c3f1 100644
--- a/Source/CTest/cmCTestConfigureCommand.cxx
+++ b/Source/CTest/cmCTestConfigureCommand.cxx
@@ -6,7 +6,7 @@
#include <sstream>
#include <vector>
-#include "cm_static_string_view.hxx"
+#include <cmext/string_view>
#include "cmCTest.h"
#include "cmCTestConfigureHandler.h"
diff --git a/Source/CTest/cmCTestCoverageCommand.cxx b/Source/CTest/cmCTestCoverageCommand.cxx
index d6e6be3..7432d08 100644
--- a/Source/CTest/cmCTestCoverageCommand.cxx
+++ b/Source/CTest/cmCTestCoverageCommand.cxx
@@ -4,9 +4,9 @@
#include <set>
-#include "cm_static_string_view.hxx"
+#include <cmext/algorithm>
+#include <cmext/string_view>
-#include "cmAlgorithms.h"
#include "cmCTest.h"
#include "cmCTestCoverageHandler.h"
@@ -22,7 +22,7 @@ void cmCTestCoverageCommand::CheckArguments(
std::vector<std::string> const& keywords)
{
this->LabelsMentioned =
- !this->Labels.empty() || cmContains(keywords, "LABELS");
+ !this->Labels.empty() || cm::contains(keywords, "LABELS");
}
cmCTestGenericHandler* cmCTestCoverageCommand::InitializeHandler()
diff --git a/Source/CTest/cmCTestCoverageHandler.cxx b/Source/CTest/cmCTestCoverageHandler.cxx
index 2c8f119..daa10c9 100644
--- a/Source/CTest/cmCTestCoverageHandler.cxx
+++ b/Source/CTest/cmCTestCoverageHandler.cxx
@@ -680,8 +680,9 @@ void cmCTestCoverageHandler::PopulateCustomVectors(cmMakefile* mf)
//
#ifdef _WIN32
# define fnc(s) cmSystemTools::LowerCase(s)
+# define fnc_prefix(s, t) fnc(s.substr(0, t.size())) == fnc(t)
#else
-# define fnc(s) s
+# define fnc_prefix(s, t) cmHasPrefix(s, t)
#endif
bool IsFileInDir(const std::string& infile, const std::string& indir)
@@ -689,8 +690,8 @@ bool IsFileInDir(const std::string& infile, const std::string& indir)
std::string file = cmSystemTools::CollapseFullPath(infile);
std::string dir = cmSystemTools::CollapseFullPath(indir);
- return file.size() > dir.size() &&
- fnc(file.substr(0, dir.size())) == fnc(dir) && file[dir.size()] == '/';
+ return file.size() > dir.size() && fnc_prefix(file, dir) &&
+ file[dir.size()] == '/';
}
int cmCTestCoverageHandler::HandlePHPCoverage(
@@ -1709,29 +1710,26 @@ int cmCTestCoverageHandler::HandleTracePyCoverage(
// Read the coverage count from the beginning of the Trace.py output
// line
- std::string prefix = nl.substr(0, 6);
- if (prefix[5] != ' ' && prefix[5] != ':') {
- // This is a hack. We should really do something more elaborate
- prefix = nl.substr(0, 7);
- if (prefix[6] != ' ' && prefix[6] != ':') {
- prefix = nl.substr(0, 8);
- if (prefix[7] != ' ' && prefix[7] != ':') {
- cmCTestLog(this->CTest, ERROR_MESSAGE,
- "Currently the limit is maximum coverage of 999999"
- << std::endl);
- }
+ std::string::size_type pos;
+ int cov = 0;
+ // This is a hack. We should really do something more elaborate
+ for (pos = 5; pos < 8; pos++) {
+ if (nl[pos] == ' ') {
+ // This line does not have ':' so no coverage here. That said,
+ // Trace.py does not handle not covered lines versus comments etc.
+ // So, this will be set to 0.
+ break;
+ }
+ if (nl[pos] == ':') {
+ cov = atoi(nl.substr(0, pos - 1).c_str());
+ break;
}
}
- int cov = atoi(prefix.c_str());
- if (prefix[prefix.size() - 1] != ':') {
- // This line does not have ':' so no coverage here. That said,
- // Trace.py does not handle not covered lines versus comments etc.
- // So, this will be set to 0.
- cov = 0;
+ if (pos == 8) {
+ cmCTestLog(this->CTest, ERROR_MESSAGE,
+ "Currently the limit is maximum coverage of 999999"
+ << std::endl);
}
- cmCTestOptionalLog(
- this->CTest, DEBUG,
- "Prefix: " << prefix << " cov: " << cov << std::endl, this->Quiet);
// Read the line number starting at the 10th character of the gcov
// output line
long lineIdx = cnt;
diff --git a/Source/CTest/cmCTestCurl.h b/Source/CTest/cmCTestCurl.h
index 9c5ba66..b0d7f07 100644
--- a/Source/CTest/cmCTestCurl.h
+++ b/Source/CTest/cmCTestCurl.h
@@ -8,7 +8,7 @@
#include <string>
#include <vector>
-#include "cm_curl.h"
+#include <cm3p/curl/curl.h>
class cmCTest;
diff --git a/Source/CTest/cmCTestGIT.cxx b/Source/CTest/cmCTestGIT.cxx
index 3f3c107..568b091 100644
--- a/Source/CTest/cmCTestGIT.cxx
+++ b/Source/CTest/cmCTestGIT.cxx
@@ -6,6 +6,7 @@
#include <cstdio>
#include <cstdlib>
#include <ctime>
+#include <utility>
#include <vector>
#include "cmsys/FStream.hxx"
@@ -193,7 +194,8 @@ bool cmCTestGIT::UpdateByFetchAndReset()
if (line.find("\tnot-for-merge\t") == std::string::npos) {
std::string::size_type pos = line.find('\t');
if (pos != std::string::npos) {
- sha1 = line.substr(0, pos);
+ sha1 = std::move(line);
+ sha1.resize(pos);
}
}
}
diff --git a/Source/CTest/cmCTestHandlerCommand.cxx b/Source/CTest/cmCTestHandlerCommand.cxx
index b1034c9..a755632 100644
--- a/Source/CTest/cmCTestHandlerCommand.cxx
+++ b/Source/CTest/cmCTestHandlerCommand.cxx
@@ -7,7 +7,7 @@
#include <cstring>
#include <sstream>
-#include "cm_static_string_view.hxx"
+#include <cmext/string_view>
#include "cmCTest.h"
#include "cmCTestGenericHandler.h"
diff --git a/Source/CTest/cmCTestMemCheckCommand.cxx b/Source/CTest/cmCTestMemCheckCommand.cxx
index 39dec6d..d0e2974 100644
--- a/Source/CTest/cmCTestMemCheckCommand.cxx
+++ b/Source/CTest/cmCTestMemCheckCommand.cxx
@@ -2,7 +2,7 @@
file Copyright.txt or https://cmake.org/licensing for details. */
#include "cmCTestMemCheckCommand.h"
-#include "cm_static_string_view.hxx"
+#include <cmext/string_view>
#include "cmCTest.h"
#include "cmCTestMemCheckHandler.h"
diff --git a/Source/CTest/cmCTestMemCheckHandler.cxx b/Source/CTest/cmCTestMemCheckHandler.cxx
index c1ecaf1..85b8ab1 100644
--- a/Source/CTest/cmCTestMemCheckHandler.cxx
+++ b/Source/CTest/cmCTestMemCheckHandler.cxx
@@ -10,11 +10,12 @@
#include <sstream>
#include <utility>
+#include <cmext/algorithm>
+
#include "cmsys/FStream.hxx"
#include "cmsys/Glob.hxx"
#include "cmsys/RegularExpression.hxx"
-#include "cmAlgorithms.h"
#include "cmCTest.h"
#include "cmDuration.h"
#include "cmSystemTools.h"
@@ -297,9 +298,6 @@ void cmCTestMemCheckHandler::PopulateCustomVectors(cmMakefile* mf)
this->CTest->PopulateCustomVector(mf, "CTEST_CUSTOM_MEMCHECK_IGNORE",
this->CustomTestsIgnore);
- std::string cmake = cmSystemTools::GetCMakeCommand();
- this->CTest->SetCTestConfiguration("CMakeCommand", cmake.c_str(),
- this->Quiet);
}
int cmCTestMemCheckHandler::GetDefectCount()
@@ -490,31 +488,31 @@ bool cmCTestMemCheckHandler::InitializeMemoryChecking()
}
if (this->CTest->GetCTestConfiguration("MemoryCheckType") ==
"AddressSanitizer") {
- this->MemoryTester = this->CTest->GetCTestConfiguration("CMakeCommand");
+ this->MemoryTester = cmSystemTools::GetCMakeCommand();
this->MemoryTesterStyle = cmCTestMemCheckHandler::ADDRESS_SANITIZER;
this->LogWithPID = true; // even if we give the log file the pid is added
}
if (this->CTest->GetCTestConfiguration("MemoryCheckType") ==
"LeakSanitizer") {
- this->MemoryTester = this->CTest->GetCTestConfiguration("CMakeCommand");
+ this->MemoryTester = cmSystemTools::GetCMakeCommand();
this->MemoryTesterStyle = cmCTestMemCheckHandler::LEAK_SANITIZER;
this->LogWithPID = true; // even if we give the log file the pid is added
}
if (this->CTest->GetCTestConfiguration("MemoryCheckType") ==
"ThreadSanitizer") {
- this->MemoryTester = this->CTest->GetCTestConfiguration("CMakeCommand");
+ this->MemoryTester = cmSystemTools::GetCMakeCommand();
this->MemoryTesterStyle = cmCTestMemCheckHandler::THREAD_SANITIZER;
this->LogWithPID = true; // even if we give the log file the pid is added
}
if (this->CTest->GetCTestConfiguration("MemoryCheckType") ==
"MemorySanitizer") {
- this->MemoryTester = this->CTest->GetCTestConfiguration("CMakeCommand");
+ this->MemoryTester = cmSystemTools::GetCMakeCommand();
this->MemoryTesterStyle = cmCTestMemCheckHandler::MEMORY_SANITIZER;
this->LogWithPID = true; // even if we give the log file the pid is added
}
if (this->CTest->GetCTestConfiguration("MemoryCheckType") ==
"UndefinedBehaviorSanitizer") {
- this->MemoryTester = this->CTest->GetCTestConfiguration("CMakeCommand");
+ this->MemoryTester = cmSystemTools::GetCMakeCommand();
this->MemoryTesterStyle = cmCTestMemCheckHandler::UB_SANITIZER;
this->LogWithPID = true; // even if we give the log file the pid is added
}
@@ -594,11 +592,11 @@ bool cmCTestMemCheckHandler::InitializeMemoryChecking()
std::string tempDrMemoryDir =
this->CTest->GetBinaryDir() + "/Testing/Temporary/DrMemory";
- if (!cmContains(this->MemoryTesterOptions, "-quiet")) {
+ if (!cm::contains(this->MemoryTesterOptions, "-quiet")) {
this->MemoryTesterOptions.emplace_back("-quiet");
}
- if (!cmContains(this->MemoryTesterOptions, "-batch")) {
+ if (!cm::contains(this->MemoryTesterOptions, "-batch")) {
this->MemoryTesterOptions.emplace_back("-batch");
}
@@ -957,35 +955,25 @@ bool cmCTestMemCheckHandler::ProcessMemCheckValgrindOutput(
"valgrind line " << lines[cc] << std::endl,
this->Quiet);
int failure = cmCTestMemCheckHandler::NO_MEMORY_FAULT;
- if (vgFIM.find(lines[cc])) {
+ auto& line = lines[cc];
+ if (vgFIM.find(line)) {
failure = cmCTestMemCheckHandler::FIM;
- } else if (vgFMM.find(lines[cc])) {
+ } else if (vgFMM.find(line)) {
failure = cmCTestMemCheckHandler::FMM;
- } else if (vgMLK1.find(lines[cc])) {
- failure = cmCTestMemCheckHandler::MLK;
- } else if (vgMLK2.find(lines[cc])) {
+ } else if (vgMLK1.find(line) || vgMLK2.find(line)) {
failure = cmCTestMemCheckHandler::MLK;
- } else if (vgPAR.find(lines[cc])) {
+ } else if (vgPAR.find(line)) {
failure = cmCTestMemCheckHandler::PAR;
- } else if (vgMPK1.find(lines[cc])) {
- failure = cmCTestMemCheckHandler::MPK;
- } else if (vgMPK2.find(lines[cc])) {
+ } else if (vgMPK1.find(line) || vgMPK2.find(line)) {
failure = cmCTestMemCheckHandler::MPK;
- } else if (vgUMC.find(lines[cc])) {
+ } else if (vgUMC.find(line)) {
failure = cmCTestMemCheckHandler::UMC;
- } else if (vgUMR1.find(lines[cc])) {
- failure = cmCTestMemCheckHandler::UMR;
- } else if (vgUMR2.find(lines[cc])) {
- failure = cmCTestMemCheckHandler::UMR;
- } else if (vgUMR3.find(lines[cc])) {
+ } else if (vgUMR1.find(line) || vgUMR2.find(line) || vgUMR3.find(line) ||
+ vgUMR4.find(line) || vgUMR5.find(line)) {
failure = cmCTestMemCheckHandler::UMR;
- } else if (vgUMR4.find(lines[cc])) {
- failure = cmCTestMemCheckHandler::UMR;
- } else if (vgUMR5.find(lines[cc])) {
- failure = cmCTestMemCheckHandler::UMR;
- } else if (vgIPW.find(lines[cc])) {
+ } else if (vgIPW.find(line)) {
failure = cmCTestMemCheckHandler::IPW;
- } else if (vgABR.find(lines[cc])) {
+ } else if (vgABR.find(line)) {
failure = cmCTestMemCheckHandler::ABR;
}
@@ -1049,13 +1037,9 @@ bool cmCTestMemCheckHandler::ProcessMemCheckDrMemoryOutput(
ostr << l << std::endl;
if (drMemoryError.find(l)) {
defects++;
- if (unaddressableAccess.find(l)) {
+ if (unaddressableAccess.find(l) || uninitializedRead.find(l)) {
results[cmCTestMemCheckHandler::UMR]++;
- } else if (uninitializedRead.find(l)) {
- results[cmCTestMemCheckHandler::UMR]++;
- } else if (leak.find(l)) {
- results[cmCTestMemCheckHandler::MLK]++;
- } else if (handleLeak.find(l)) {
+ } else if (leak.find(l) || handleLeak.find(l)) {
results[cmCTestMemCheckHandler::MLK]++;
} else if (invalidHeapArgument.find(l)) {
results[cmCTestMemCheckHandler::FMM]++;
diff --git a/Source/CTest/cmCTestMultiProcessHandler.cxx b/Source/CTest/cmCTestMultiProcessHandler.cxx
index 2192843..a08cb34 100644
--- a/Source/CTest/cmCTestMultiProcessHandler.cxx
+++ b/Source/CTest/cmCTestMultiProcessHandler.cxx
@@ -6,30 +6,29 @@
#include <cassert>
#include <chrono>
#include <cmath>
-#include <cstddef>
+#include <cstddef> // IWYU pragma: keep
#include <cstdlib>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <list>
-#include <memory>
#include <sstream>
#include <stack>
#include <unordered_map>
#include <utility>
#include <vector>
+#include <cm/memory>
#include <cmext/algorithm>
+#include <cm3p/json/value.h>
+#include <cm3p/json/writer.h>
+#include <cm3p/uv.h>
+
#include "cmsys/FStream.hxx"
#include "cmsys/SystemInformation.hxx"
-#include "cm_jsoncpp_value.h"
-#include "cm_jsoncpp_writer.h"
-#include "cm_uv.h"
-
#include "cmAffinity.h"
-#include "cmAlgorithms.h"
#include "cmCTest.h"
#include "cmCTestBinPacker.h"
#include "cmCTestRunTest.h"
@@ -138,7 +137,7 @@ void cmCTestMultiProcessHandler::RunTests()
uv_run(&this->Loop, UV_RUN_DEFAULT);
uv_loop_close(&this->Loop);
- if (!this->StopTimePassed) {
+ if (!this->StopTimePassed && !this->CheckStopOnFailure()) {
assert(this->Completed == this->Total);
assert(this->Tests.empty());
}
@@ -172,7 +171,8 @@ bool cmCTestMultiProcessHandler::StartTestProcess(int test)
this->EraseTest(test);
this->RunningCount += GetProcessorsUsed(test);
- cmCTestRunTest* testRun = new cmCTestRunTest(*this);
+ auto testRun = cm::make_unique<cmCTestRunTest>(*this);
+
if (this->RepeatMode != cmCTest::Repeat::Never) {
testRun->SetRepeatMode(this->RepeatMode);
testRun->SetNumberOfRuns(this->RepeatCount);
@@ -187,7 +187,7 @@ bool cmCTestMultiProcessHandler::StartTestProcess(int test)
// Find any failed dependencies for this test. We assume the more common
// scenario has no failed tests, so make it the outer loop.
for (std::string const& f : *this->Failed) {
- if (cmContains(this->Properties[test]->RequireSuccessDepends, f)) {
+ if (cm::contains(this->Properties[test]->RequireSuccessDepends, f)) {
testRun->AddFailedDependency(f);
}
}
@@ -229,28 +229,25 @@ bool cmCTestMultiProcessHandler::StartTestProcess(int test)
e << "\n";
}
e << "Resource spec file:\n\n " << this->TestHandler->ResourceSpecFile;
- testRun->StartFailure(e.str(), "Insufficient resources");
- this->FinishTestProcess(testRun, false);
+ cmCTestRunTest::StartFailure(std::move(testRun), e.str(),
+ "Insufficient resources");
return false;
}
cmWorkingDirectory workdir(this->Properties[test]->Directory);
if (workdir.Failed()) {
- testRun->StartFailure("Failed to change working directory to " +
- this->Properties[test]->Directory + " : " +
- std::strerror(workdir.GetLastResult()),
- "Failed to change working directory");
- } else {
- if (testRun->StartTest(this->Completed, this->Total)) {
- // Ownership of 'testRun' has moved to another structure.
- // When the test finishes, FinishTestProcess will be called.
- return true;
- }
+ cmCTestRunTest::StartFailure(std::move(testRun),
+ "Failed to change working directory to " +
+ this->Properties[test]->Directory + " : " +
+ std::strerror(workdir.GetLastResult()),
+ "Failed to change working directory");
+ return false;
}
- // Pass ownership of 'testRun'.
- this->FinishTestProcess(testRun, false);
- return false;
+ // Ownership of 'testRun' has moved to another structure.
+ // When the test finishes, FinishTestProcess will be called.
+ return cmCTestRunTest::StartTest(std::move(testRun), this->Completed,
+ this->Total);
}
bool cmCTestMultiProcessHandler::AllocateResources(int index)
@@ -370,6 +367,11 @@ void cmCTestMultiProcessHandler::CheckResourcesAvailable()
}
}
+bool cmCTestMultiProcessHandler::CheckStopOnFailure()
+{
+ return this->CTest->GetStopOnFailure();
+}
+
bool cmCTestMultiProcessHandler::CheckStopTimePassed()
{
if (!this->StopTimePassed) {
@@ -447,7 +449,7 @@ bool cmCTestMultiProcessHandler::StartTest(int test)
{
// Check for locked resources
for (std::string const& i : this->Properties[test]->LockedResources) {
- if (cmContains(this->LockedResources, i)) {
+ if (cm::contains(this->LockedResources, i)) {
return false;
}
}
@@ -486,6 +488,10 @@ void cmCTestMultiProcessHandler::StartNextTests()
return;
}
+ if (this->CheckStopOnFailure() && !this->Failed->empty()) {
+ return;
+ }
+
size_t numToStart = 0;
if (this->RunningCount < this->ParallelLevel) {
@@ -540,7 +546,8 @@ void cmCTestMultiProcessHandler::StartNextTests()
if (this->SerialTestRunning) {
break;
}
- // We can only start a RUN_SERIAL test if no other tests are also running.
+ // We can only start a RUN_SERIAL test if no other tests are also
+ // running.
if (this->Properties[test]->RunSerial && this->RunningCount > 0) {
continue;
}
@@ -618,8 +625,8 @@ void cmCTestMultiProcessHandler::OnTestLoadRetryCB(uv_timer_t* timer)
self->StartNextTests();
}
-void cmCTestMultiProcessHandler::FinishTestProcess(cmCTestRunTest* runner,
- bool started)
+void cmCTestMultiProcessHandler::FinishTestProcess(
+ std::unique_ptr<cmCTestRunTest> runner, bool started)
{
this->Completed++;
@@ -631,7 +638,8 @@ void cmCTestMultiProcessHandler::FinishTestProcess(cmCTestRunTest* runner,
this->SetStopTimePassed();
}
if (started) {
- if (!this->StopTimePassed && runner->StartAgain(this->Completed)) {
+ if (!this->StopTimePassed &&
+ cmCTestRunTest::StartAgain(std::move(runner), this->Completed)) {
this->Completed--; // remove the completed test because run again
return;
}
@@ -659,7 +667,7 @@ void cmCTestMultiProcessHandler::FinishTestProcess(cmCTestRunTest* runner,
}
properties->Affinity.clear();
- delete runner;
+ runner.reset();
if (started) {
this->StartNextTests();
}
@@ -802,7 +810,7 @@ void cmCTestMultiProcessHandler::CreateParallelTestCostList()
// In parallel test runs add previously failed tests to the front
// of the cost list and queue other tests for further sorting
for (auto const& t : this->Tests) {
- if (cmContains(this->LastTestsFailed, this->Properties[t.first]->Name)) {
+ if (cm::contains(this->LastTestsFailed, this->Properties[t.first]->Name)) {
// If the test failed last time, it should be run first.
this->SortedTests.push_back(t.first);
alreadySortedTests.insert(t.first);
@@ -841,7 +849,7 @@ void cmCTestMultiProcessHandler::CreateParallelTestCostList()
TestComparator(this));
for (auto const& j : sortedCopy) {
- if (!cmContains(alreadySortedTests, j)) {
+ if (!cm::contains(alreadySortedTests, j)) {
this->SortedTests.push_back(j);
alreadySortedTests.insert(j);
}
@@ -873,7 +881,7 @@ void cmCTestMultiProcessHandler::CreateSerialTestCostList()
TestSet alreadySortedTests;
for (int test : presortedList) {
- if (cmContains(alreadySortedTests, test)) {
+ if (cm::contains(alreadySortedTests, test)) {
continue;
}
@@ -881,7 +889,7 @@ void cmCTestMultiProcessHandler::CreateSerialTestCostList()
GetAllTestDependencies(test, dependencies);
for (int testDependency : dependencies) {
- if (!cmContains(alreadySortedTests, testDependency)) {
+ if (!cm::contains(alreadySortedTests, testDependency)) {
alreadySortedTests.insert(testDependency);
this->SortedTests.push_back(testDependency);
}
diff --git a/Source/CTest/cmCTestMultiProcessHandler.h b/Source/CTest/cmCTestMultiProcessHandler.h
index 5b429d4..e21b912 100644
--- a/Source/CTest/cmCTestMultiProcessHandler.h
+++ b/Source/CTest/cmCTestMultiProcessHandler.h
@@ -6,14 +6,14 @@
#include "cmConfigure.h" // IWYU pragma: keep
#include <map>
+#include <memory>
#include <set>
#include <string>
#include <vector>
+#include <cm3p/uv.h>
#include <stddef.h>
-#include "cm_uv.h"
-
#include "cmCTest.h"
#include "cmCTestResourceAllocator.h"
#include "cmCTestTestHandler.h"
@@ -124,7 +124,7 @@ protected:
// Removes the checkpoint file
void MarkFinished();
void EraseTest(int index);
- void FinishTestProcess(cmCTestRunTest* runner, bool started);
+ void FinishTestProcess(std::unique_ptr<cmCTestRunTest> runner, bool started);
static void OnTestLoadRetryCB(uv_timer_t* timer);
@@ -137,6 +137,8 @@ protected:
inline size_t GetProcessorsUsed(int index);
std::string GetName(int index);
+ bool CheckStopOnFailure();
+
bool CheckStopTimePassed();
void SetStopTimePassed();
diff --git a/Source/CTest/cmCTestResourceSpec.cxx b/Source/CTest/cmCTestResourceSpec.cxx
index 8f91efb..21c97de 100644
--- a/Source/CTest/cmCTestResourceSpec.cxx
+++ b/Source/CTest/cmCTestResourceSpec.cxx
@@ -7,12 +7,12 @@
#include <utility>
#include <vector>
+#include <cm3p/json/reader.h>
+#include <cm3p/json/value.h>
+
#include "cmsys/FStream.hxx"
#include "cmsys/RegularExpression.hxx"
-#include "cm_jsoncpp_reader.h"
-#include "cm_jsoncpp_value.h"
-
static const cmsys::RegularExpression IdentifierRegex{ "^[a-z_][a-z0-9_]*$" };
static const cmsys::RegularExpression IdRegex{ "^[a-z0-9_]+$" };
diff --git a/Source/CTest/cmCTestRunTest.cxx b/Source/CTest/cmCTestRunTest.cxx
index ec54960..ba7d47e 100644
--- a/Source/CTest/cmCTestRunTest.cxx
+++ b/Source/CTest/cmCTestRunTest.cxx
@@ -3,7 +3,7 @@
#include "cmCTestRunTest.h"
#include <chrono>
-#include <cstddef>
+#include <cstddef> // IWYU pragma: keep
#include <cstdint>
#include <cstdio>
#include <cstring>
@@ -314,23 +314,27 @@ bool cmCTestRunTest::EndTest(size_t completed, size_t total, bool started)
return passed || skipped;
}
-bool cmCTestRunTest::StartAgain(size_t completed)
+bool cmCTestRunTest::StartAgain(std::unique_ptr<cmCTestRunTest> runner,
+ size_t completed)
{
- if (!this->RunAgain) {
+ auto* testRun = runner.get();
+
+ if (!testRun->RunAgain) {
return false;
}
- this->RunAgain = false; // reset
+ testRun->RunAgain = false; // reset
+ testRun->TestProcess = cm::make_unique<cmProcess>(std::move(runner));
// change to tests directory
- cmWorkingDirectory workdir(this->TestProperties->Directory);
+ cmWorkingDirectory workdir(testRun->TestProperties->Directory);
if (workdir.Failed()) {
- this->StartFailure("Failed to change working directory to " +
- this->TestProperties->Directory + " : " +
- std::strerror(workdir.GetLastResult()),
- "Failed to change working directory");
+ testRun->StartFailure("Failed to change working directory to " +
+ testRun->TestProperties->Directory + " : " +
+ std::strerror(workdir.GetLastResult()),
+ "Failed to change working directory");
return true;
}
- this->StartTest(completed, this->TotalNumberOfTests);
+ testRun->StartTest(completed, testRun->TotalNumberOfTests);
return true;
}
@@ -382,6 +386,18 @@ void cmCTestRunTest::MemCheckPostProcess()
handler->PostProcessTest(this->TestResult, this->Index);
}
+void cmCTestRunTest::StartFailure(std::unique_ptr<cmCTestRunTest> runner,
+ std::string const& output,
+ std::string const& detail)
+{
+ auto* testRun = runner.get();
+
+ testRun->TestProcess = cm::make_unique<cmProcess>(std::move(runner));
+ testRun->StartFailure(output, detail);
+
+ testRun->FinalizeTest(false);
+}
+
void cmCTestRunTest::StartFailure(std::string const& output,
std::string const& detail)
{
@@ -413,7 +429,7 @@ void cmCTestRunTest::StartFailure(std::string const& output,
this->TestResult.Path = this->TestProperties->Directory;
this->TestResult.Output = output;
this->TestResult.FullCommandLine.clear();
- this->TestProcess = cm::make_unique<cmProcess>(*this);
+ this->TestResult.Environment.clear();
}
std::string cmCTestRunTest::GetTestPrefix(size_t completed, size_t total) const
@@ -437,6 +453,21 @@ std::string cmCTestRunTest::GetTestPrefix(size_t completed, size_t total) const
return outputStream.str();
}
+bool cmCTestRunTest::StartTest(std::unique_ptr<cmCTestRunTest> runner,
+ size_t completed, size_t total)
+{
+ auto* testRun = runner.get();
+
+ testRun->TestProcess = cm::make_unique<cmProcess>(std::move(runner));
+
+ if (!testRun->StartTest(completed, total)) {
+ testRun->FinalizeTest(false);
+ return false;
+ }
+
+ return true;
+}
+
// Starts the execution of a test. Returns once it has started
bool cmCTestRunTest::StartTest(size_t completed, size_t total)
{
@@ -468,9 +499,9 @@ bool cmCTestRunTest::StartTest(size_t completed, size_t total)
if (this->TestProperties->Disabled) {
this->TestResult.CompletionStatus = "Disabled";
this->TestResult.Status = cmCTestTestHandler::NOT_RUN;
- this->TestProcess = cm::make_unique<cmProcess>(*this);
this->TestResult.Output = "Disabled";
this->TestResult.FullCommandLine.clear();
+ this->TestResult.Environment.clear();
return false;
}
@@ -482,7 +513,6 @@ bool cmCTestRunTest::StartTest(size_t completed, size_t total)
// its arguments are irrelevant. This matters for the case where a fixture
// dependency might be creating the executable we want to run.
if (!this->FailedDependencies.empty()) {
- this->TestProcess = cm::make_unique<cmProcess>(*this);
std::string msg = "Failed test dependencies:";
for (std::string const& failedDep : this->FailedDependencies) {
msg += " " + failedDep;
@@ -491,6 +521,7 @@ bool cmCTestRunTest::StartTest(size_t completed, size_t total)
cmCTestLog(this->CTest, HANDLER_OUTPUT, msg << std::endl);
this->TestResult.Output = msg;
this->TestResult.FullCommandLine.clear();
+ this->TestResult.Environment.clear();
this->TestResult.CompletionStatus = "Fixture dependency failed";
this->TestResult.Status = cmCTestTestHandler::NOT_RUN;
return false;
@@ -499,7 +530,6 @@ bool cmCTestRunTest::StartTest(size_t completed, size_t total)
this->ComputeArguments();
std::vector<std::string>& args = this->TestProperties->Args;
if (args.size() >= 2 && args[1] == "NOT_AVAILABLE") {
- this->TestProcess = cm::make_unique<cmProcess>(*this);
std::string msg;
if (this->CTest->GetConfigType().empty()) {
msg = "Test not available without configuration. (Missing \"-C "
@@ -512,6 +542,7 @@ bool cmCTestRunTest::StartTest(size_t completed, size_t total)
cmCTestLog(this->CTest, ERROR_MESSAGE, msg << std::endl);
this->TestResult.Output = msg;
this->TestResult.FullCommandLine.clear();
+ this->TestResult.Environment.clear();
this->TestResult.CompletionStatus = "Missing Configuration";
this->TestResult.Status = cmCTestTestHandler::NOT_RUN;
return false;
@@ -521,13 +552,13 @@ bool cmCTestRunTest::StartTest(size_t completed, size_t total)
for (std::string const& file : this->TestProperties->RequiredFiles) {
if (!cmSystemTools::FileExists(file)) {
// Required file was not found
- this->TestProcess = cm::make_unique<cmProcess>(*this);
*this->TestHandler->LogFile << "Unable to find required file: " << file
<< std::endl;
cmCTestLog(this->CTest, ERROR_MESSAGE,
"Unable to find required file: " << file << std::endl);
this->TestResult.Output = "Unable to find required file: " + file;
this->TestResult.FullCommandLine.clear();
+ this->TestResult.Environment.clear();
this->TestResult.CompletionStatus = "Required Files Missing";
this->TestResult.Status = cmCTestTestHandler::NOT_RUN;
return false;
@@ -537,13 +568,13 @@ bool cmCTestRunTest::StartTest(size_t completed, size_t total)
if (this->ActualCommand.empty()) {
// if the command was not found create a TestResult object
// that has that information
- this->TestProcess = cm::make_unique<cmProcess>(*this);
*this->TestHandler->LogFile << "Unable to find executable: " << args[1]
<< std::endl;
cmCTestLog(this->CTest, ERROR_MESSAGE,
"Unable to find executable: " << args[1] << std::endl);
this->TestResult.Output = "Unable to find executable: " + args[1];
this->TestResult.FullCommandLine.clear();
+ this->TestResult.Environment.clear();
this->TestResult.CompletionStatus = "Unable to find executable";
this->TestResult.Status = cmCTestTestHandler::NOT_RUN;
return false;
@@ -649,7 +680,6 @@ bool cmCTestRunTest::ForkProcess(cmDuration testTimeOut, bool explicitTimeout,
std::vector<std::string>* environment,
std::vector<size_t>* affinity)
{
- this->TestProcess = cm::make_unique<cmProcess>(*this);
this->TestProcess->SetId(this->Index);
this->TestProcess->SetWorkingDirectory(this->TestProperties->Directory);
this->TestProcess->SetCommand(this->ActualCommand);
@@ -689,25 +719,43 @@ bool cmCTestRunTest::ForkProcess(cmDuration testTimeOut, bool explicitTimeout,
cmSystemTools::SaveRestoreEnvironment sre;
#endif
+ std::ostringstream envMeasurement;
if (environment && !environment->empty()) {
cmSystemTools::AppendEnv(*environment);
+ for (auto const& var : *environment) {
+ envMeasurement << var << std::endl;
+ }
}
if (this->UseAllocatedResources) {
- this->SetupResourcesEnvironment();
+ std::vector<std::string> envLog;
+ this->SetupResourcesEnvironment(&envLog);
+ for (auto const& var : envLog) {
+ envMeasurement << var << std::endl;
+ }
} else {
cmSystemTools::UnsetEnv("CTEST_RESOURCE_GROUP_COUNT");
+ // Signify that this variable is being actively unset
+ envMeasurement << "#CTEST_RESOURCE_GROUP_COUNT=" << std::endl;
}
+ this->TestResult.Environment = envMeasurement.str();
+ // Remove last newline
+ this->TestResult.Environment.erase(this->TestResult.Environment.length() -
+ 1);
+
return this->TestProcess->StartProcess(this->MultiTestHandler.Loop,
affinity);
}
-void cmCTestRunTest::SetupResourcesEnvironment()
+void cmCTestRunTest::SetupResourcesEnvironment(std::vector<std::string>* log)
{
std::string processCount = "CTEST_RESOURCE_GROUP_COUNT=";
processCount += std::to_string(this->AllocatedResources.size());
cmSystemTools::PutEnv(processCount);
+ if (log) {
+ log->push_back(processCount);
+ }
std::size_t i = 0;
for (auto const& process : this->AllocatedResources) {
@@ -733,8 +781,14 @@ void cmCTestRunTest::SetupResourcesEnvironment()
var += "id:" + it2.Id + ",slots:" + std::to_string(it2.Slots);
}
cmSystemTools::PutEnv(var);
+ if (log) {
+ log->push_back(var);
+ }
}
cmSystemTools::PutEnv(resourceList);
+ if (log) {
+ log->push_back(resourceList);
+ }
++i;
}
}
@@ -816,7 +870,8 @@ void cmCTestRunTest::WriteLogOutputTop(size_t completed, size_t total)
"Testing " << this->TestProperties->Name << " ... ");
}
-void cmCTestRunTest::FinalizeTest()
+void cmCTestRunTest::FinalizeTest(bool started)
{
- this->MultiTestHandler.FinishTestProcess(this, true);
+ this->MultiTestHandler.FinishTestProcess(this->TestProcess->GetRunner(),
+ started);
}
diff --git a/Source/CTest/cmCTestRunTest.h b/Source/CTest/cmCTestRunTest.h
index 4988839..d831247 100644
--- a/Source/CTest/cmCTestRunTest.h
+++ b/Source/CTest/cmCTestRunTest.h
@@ -65,6 +65,15 @@ public:
// Read and store output. Returns true if it must be called again.
void CheckOutput(std::string const& line);
+ static bool StartTest(std::unique_ptr<cmCTestRunTest> runner,
+ size_t completed, size_t total);
+ static bool StartAgain(std::unique_ptr<cmCTestRunTest> runner,
+ size_t completed);
+
+ static void StartFailure(std::unique_ptr<cmCTestRunTest> runner,
+ std::string const& output,
+ std::string const& detail);
+
// launch the test process, return whether it started correctly
bool StartTest(size_t completed, size_t total);
// capture and report the test results
@@ -74,8 +83,6 @@ public:
void ComputeWeightedCost();
- bool StartAgain(size_t completed);
-
void StartFailure(std::string const& output, std::string const& detail);
cmCTest* GetCTest() const { return this->CTest; }
@@ -84,7 +91,7 @@ public:
const std::vector<std::string>& GetArguments() { return this->Arguments; }
- void FinalizeTest();
+ void FinalizeTest(bool started = true);
bool TimedOutForStopTime() const { return this->TimeoutIsForStopTime; }
@@ -112,7 +119,7 @@ private:
// Run post processing of the process output for MemCheck
void MemCheckPostProcess();
- void SetupResourcesEnvironment();
+ void SetupResourcesEnvironment(std::vector<std::string>* log = nullptr);
// Returns "completed/total Test #Index: "
std::string GetTestPrefix(size_t completed, size_t total) const;
diff --git a/Source/CTest/cmCTestScriptHandler.cxx b/Source/CTest/cmCTestScriptHandler.cxx
index 7803e37..4fa4dc0 100644
--- a/Source/CTest/cmCTestScriptHandler.cxx
+++ b/Source/CTest/cmCTestScriptHandler.cxx
@@ -6,7 +6,6 @@
#include <cstdlib>
#include <cstring>
#include <map>
-#include <memory>
#include <ratio>
#include <sstream>
#include <utility>
@@ -51,22 +50,7 @@
#define CTEST_INITIAL_CMAKE_OUTPUT_FILE_NAME "CTestInitialCMakeOutput.log"
-cmCTestScriptHandler::cmCTestScriptHandler()
-{
- this->Backup = false;
- this->EmptyBinDir = false;
- this->EmptyBinDirOnce = false;
- this->Makefile = nullptr;
- this->ParentMakefile = nullptr;
- this->CMake = nullptr;
- this->GlobalGenerator = nullptr;
-
- this->ScriptStartTime = std::chrono::steady_clock::time_point();
-
- // the *60 is because the settings are in minutes but GetTime is seconds
- this->MinimumInterval = 30 * 60;
- this->ContinuousDuration = -1;
-}
+cmCTestScriptHandler::cmCTestScriptHandler() = default;
void cmCTestScriptHandler::Initialize()
{
@@ -95,22 +79,15 @@ void cmCTestScriptHandler::Initialize()
// what time in seconds did this script start running
this->ScriptStartTime = std::chrono::steady_clock::time_point();
- delete this->Makefile;
- this->Makefile = nullptr;
+ this->Makefile.reset();
this->ParentMakefile = nullptr;
- delete this->GlobalGenerator;
- this->GlobalGenerator = nullptr;
+ this->GlobalGenerator.reset();
- delete this->CMake;
+ this->CMake.reset();
}
-cmCTestScriptHandler::~cmCTestScriptHandler()
-{
- delete this->Makefile;
- delete this->GlobalGenerator;
- delete this->CMake;
-}
+cmCTestScriptHandler::~cmCTestScriptHandler() = default;
// just adds an argument to the vector
void cmCTestScriptHandler::AddConfigurationScript(const char* script,
@@ -247,23 +224,20 @@ int cmCTestScriptHandler::ExecuteScript(const std::string& total_script_arg)
void cmCTestScriptHandler::CreateCMake()
{
// create a cmake instance to read the configuration script
- if (this->CMake) {
- delete this->CMake;
- delete this->GlobalGenerator;
- delete this->Makefile;
- }
- this->CMake = new cmake(cmake::RoleScript, cmState::CTest);
+ this->CMake = cm::make_unique<cmake>(cmake::RoleScript, cmState::CTest);
this->CMake->SetHomeDirectory("");
this->CMake->SetHomeOutputDirectory("");
this->CMake->GetCurrentSnapshot().SetDefaultDefinitions();
this->CMake->AddCMakePaths();
- this->GlobalGenerator = new cmGlobalGenerator(this->CMake);
+ this->GlobalGenerator =
+ cm::make_unique<cmGlobalGenerator>(this->CMake.get());
cmStateSnapshot snapshot = this->CMake->GetCurrentSnapshot();
std::string cwd = cmSystemTools::GetCurrentWorkingDirectory();
snapshot.GetDirectory().SetCurrentSource(cwd);
snapshot.GetDirectory().SetCurrentBinary(cwd);
- this->Makefile = new cmMakefile(this->GlobalGenerator, snapshot);
+ this->Makefile =
+ cm::make_unique<cmMakefile>(this->GlobalGenerator.get(), snapshot);
if (this->ParentMakefile) {
this->Makefile->SetRecursionDepth(
this->ParentMakefile->GetRecursionDepth());
@@ -310,12 +284,14 @@ int cmCTestScriptHandler::ReadInScript(const std::string& total_script_arg)
// if the argument has a , in it then it needs to be broken into the fist
// argument (which is the script) and the second argument which will be
// passed into the scripts as S_ARG
- std::string script = total_script_arg;
+ std::string script;
std::string script_arg;
const std::string::size_type comma_pos = total_script_arg.find(',');
if (comma_pos != std::string::npos) {
script = total_script_arg.substr(0, comma_pos);
script_arg = total_script_arg.substr(comma_pos + 1);
+ } else {
+ script = total_script_arg;
}
// make sure the file exists
if (!cmSystemTools::FileExists(script)) {
@@ -878,7 +854,7 @@ bool cmCTestScriptHandler::RunScript(cmCTest* ctest, cmMakefile* mf,
const char* sname, bool InProcess,
int* returnValue)
{
- cmCTestScriptHandler* sh = new cmCTestScriptHandler();
+ auto sh = cm::make_unique<cmCTestScriptHandler>();
sh->SetCTestInstance(ctest);
sh->ParentMakefile = mf;
sh->AddConfigurationScript(sname, InProcess);
@@ -886,7 +862,6 @@ bool cmCTestScriptHandler::RunScript(cmCTest* ctest, cmMakefile* mf,
if (returnValue) {
*returnValue = res;
}
- delete sh;
return true;
}
diff --git a/Source/CTest/cmCTestScriptHandler.h b/Source/CTest/cmCTestScriptHandler.h
index d003199..ebb7905 100644
--- a/Source/CTest/cmCTestScriptHandler.h
+++ b/Source/CTest/cmCTestScriptHandler.h
@@ -101,12 +101,14 @@ public:
cmDuration GetRemainingTimeAllowed();
cmCTestScriptHandler();
+ cmCTestScriptHandler(const cmCTestScriptHandler&) = delete;
+ const cmCTestScriptHandler& operator=(const cmCTestScriptHandler&) = delete;
~cmCTestScriptHandler() override;
void Initialize() override;
void CreateCMake();
- cmake* GetCMake() { return this->CMake; }
+ cmake* GetCMake() { return this->CMake.get(); }
void SetRunCurrentScript(bool value);
@@ -143,9 +145,9 @@ private:
bool ShouldRunCurrentScript;
- bool Backup;
- bool EmptyBinDir;
- bool EmptyBinDirOnce;
+ bool Backup = false;
+ bool EmptyBinDir = false;
+ bool EmptyBinDirOnce = false;
std::string SourceDir;
std::string BinaryDir;
@@ -161,16 +163,18 @@ private:
std::string CMOutFile;
std::vector<std::string> ExtraUpdates;
- double MinimumInterval;
- double ContinuousDuration;
+ // the *60 is because the settings are in minutes but GetTime is seconds
+ double MinimumInterval = 30 * 60;
+ double ContinuousDuration = -1;
// what time in seconds did this script start running
- std::chrono::steady_clock::time_point ScriptStartTime;
+ std::chrono::steady_clock::time_point ScriptStartTime =
+ std::chrono::steady_clock::time_point();
- cmMakefile* Makefile;
- cmMakefile* ParentMakefile;
- cmGlobalGenerator* GlobalGenerator;
- cmake* CMake;
+ std::unique_ptr<cmMakefile> Makefile;
+ cmMakefile* ParentMakefile = nullptr;
+ std::unique_ptr<cmGlobalGenerator> GlobalGenerator;
+ std::unique_ptr<cmake> CMake;
};
#endif
diff --git a/Source/CTest/cmCTestSubmitCommand.cxx b/Source/CTest/cmCTestSubmitCommand.cxx
index acb75b2..279216e 100644
--- a/Source/CTest/cmCTestSubmitCommand.cxx
+++ b/Source/CTest/cmCTestSubmitCommand.cxx
@@ -8,10 +8,9 @@
#include <cm/memory>
#include <cm/vector>
+#include <cmext/algorithm>
+#include <cmext/string_view>
-#include "cm_static_string_view.hxx"
-
-#include "cmAlgorithms.h"
#include "cmCTest.h"
#include "cmCTestSubmitHandler.h"
#include "cmCommand.h"
@@ -172,8 +171,10 @@ void cmCTestSubmitCommand::BindArguments()
void cmCTestSubmitCommand::CheckArguments(
std::vector<std::string> const& keywords)
{
- this->PartsMentioned = !this->Parts.empty() || cmContains(keywords, "PARTS");
- this->FilesMentioned = !this->Files.empty() || cmContains(keywords, "FILES");
+ this->PartsMentioned =
+ !this->Parts.empty() || cm::contains(keywords, "PARTS");
+ this->FilesMentioned =
+ !this->Files.empty() || cm::contains(keywords, "FILES");
cm::erase_if(this->Parts, [this](std::string const& arg) -> bool {
cmCTest::Part p = this->CTest->GetPartFromName(arg.c_str());
diff --git a/Source/CTest/cmCTestSubmitHandler.cxx b/Source/CTest/cmCTestSubmitHandler.cxx
index 22ab48f..2989025 100644
--- a/Source/CTest/cmCTestSubmitHandler.cxx
+++ b/Source/CTest/cmCTestSubmitHandler.cxx
@@ -9,9 +9,9 @@
#include <cmext/algorithm>
-#include "cm_curl.h"
-#include "cm_jsoncpp_reader.h"
-#include "cm_jsoncpp_value.h"
+#include <cm3p/curl/curl.h>
+#include <cm3p/json/reader.h>
+#include <cm3p/json/value.h>
#include "cmAlgorithms.h"
#include "cmCTest.h"
@@ -260,11 +260,10 @@ bool cmCTestSubmitHandler::SubmitUsingHTTP(
cmCTestScriptHandler* ch = this->CTest->GetScriptHandler();
cmake* cm = ch->GetCMake();
if (cm) {
- const char* subproject =
- cm->GetState()->GetGlobalProperty("SubProject");
+ cmProp subproject = cm->GetState()->GetGlobalProperty("SubProject");
if (subproject) {
upload_as += "&subproject=";
- upload_as += ctest_curl.Escape(subproject);
+ upload_as += ctest_curl.Escape(*subproject);
}
}
}
@@ -506,18 +505,19 @@ int cmCTestSubmitHandler::HandleCDashUploadFile(std::string const& file,
curl.SetTimeOutSeconds(SUBMIT_TIMEOUT_IN_SECONDS_DEFAULT);
curl.SetHttpHeaders(this->HttpHeaders);
std::string url = this->CTest->GetSubmitURL();
- std::string fields;
- std::string::size_type pos = url.find('?');
- if (pos != std::string::npos) {
- fields = url.substr(pos + 1);
- url = url.substr(0, pos);
- }
if (!cmHasLiteralPrefix(url, "http://") &&
!cmHasLiteralPrefix(url, "https://")) {
cmCTestLog(this->CTest, ERROR_MESSAGE,
"Only http and https are supported for CDASH_UPLOAD\n");
return -1;
}
+
+ std::string fields;
+ std::string::size_type pos = url.find('?');
+ if (pos != std::string::npos) {
+ fields = url.substr(pos + 1);
+ url.erase(pos);
+ }
bool internalTest = cmIsOn(this->GetOption("InternalTest"));
// Get RETRY_COUNT and RETRY_DELAY values if they were set.
@@ -555,11 +555,11 @@ int cmCTestSubmitHandler::HandleCDashUploadFile(std::string const& file,
// a "&subproject=subprojectname" to the first POST.
cmCTestScriptHandler* ch = this->CTest->GetScriptHandler();
cmake* cm = ch->GetCMake();
- const char* subproject = cm->GetState()->GetGlobalProperty("SubProject");
+ cmProp subproject = cm->GetState()->GetGlobalProperty("SubProject");
// TODO: Encode values for a URL instead of trusting caller.
std::ostringstream str;
if (subproject) {
- str << "subproject=" << curl.Escape(subproject) << "&";
+ str << "subproject=" << curl.Escape(*subproject) << "&";
}
auto timeNow =
std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
diff --git a/Source/CTest/cmCTestTestCommand.cxx b/Source/CTest/cmCTestTestCommand.cxx
index 0f9b695..c71b409 100644
--- a/Source/CTest/cmCTestTestCommand.cxx
+++ b/Source/CTest/cmCTestTestCommand.cxx
@@ -6,7 +6,7 @@
#include <cstdlib>
#include <sstream>
-#include "cm_static_string_view.hxx"
+#include <cmext/string_view>
#include "cmCTest.h"
#include "cmCTestGenericHandler.h"
@@ -34,6 +34,7 @@ void cmCTestTestCommand::BindArguments()
this->Bind("STOP_TIME"_s, this->StopTime);
this->Bind("TEST_LOAD"_s, this->TestLoad);
this->Bind("RESOURCE_SPEC_FILE"_s, this->ResourceSpecFile);
+ this->Bind("STOP_ON_FAILURE"_s, this->StopOnFailure);
}
cmCTestGenericHandler* cmCTestTestCommand::InitializeHandler()
@@ -52,6 +53,13 @@ cmCTestGenericHandler* cmCTestTestCommand::InitializeHandler()
}
}
this->CTest->SetTimeOut(timeout);
+
+ const char* resourceSpecFile =
+ this->Makefile->GetDefinition("CTEST_RESOURCE_SPEC_FILE");
+ if (this->ResourceSpecFile.empty() && resourceSpecFile) {
+ this->ResourceSpecFile = resourceSpecFile;
+ }
+
cmCTestGenericHandler* handler = this->InitializeActualHandler();
if (!this->Start.empty() || !this->End.empty() || !this->Stride.empty()) {
handler->SetOption(
@@ -83,6 +91,9 @@ cmCTestGenericHandler* cmCTestTestCommand::InitializeHandler()
handler->SetOption("ExcludeFixtureCleanupRegularExpression",
this->ExcludeFixtureCleanup.c_str());
}
+ if (this->StopOnFailure) {
+ handler->SetOption("StopOnFailure", "ON");
+ }
if (!this->ParallelLevel.empty()) {
handler->SetOption("ParallelLevel", this->ParallelLevel.c_str());
}
diff --git a/Source/CTest/cmCTestTestCommand.h b/Source/CTest/cmCTestTestCommand.h
index 2345afb..7925586 100644
--- a/Source/CTest/cmCTestTestCommand.h
+++ b/Source/CTest/cmCTestTestCommand.h
@@ -60,6 +60,7 @@ protected:
std::string StopTime;
std::string TestLoad;
std::string ResourceSpecFile;
+ bool StopOnFailure = false;
};
#endif
diff --git a/Source/CTest/cmCTestTestHandler.cxx b/Source/CTest/cmCTestTestHandler.cxx
index 4f324ea..d0dbaae 100644
--- a/Source/CTest/cmCTestTestHandler.cxx
+++ b/Source/CTest/cmCTestTestHandler.cxx
@@ -5,7 +5,7 @@
#include <algorithm>
#include <chrono>
#include <cmath>
-#include <cstddef>
+#include <cstddef> // IWYU pragma: keep
#include <cstdio>
#include <cstdlib>
#include <cstring>
@@ -18,6 +18,9 @@
#include <utility>
#include <cm/memory>
+#include <cm/string_view>
+#include <cmext/algorithm>
+#include <cmext/string_view>
#include "cmsys/FStream.hxx"
#include <cmsys/Base64.h>
@@ -26,7 +29,6 @@
#include "cm_utf8.h"
-#include "cmAlgorithms.h"
#include "cmCTest.h"
#include "cmCTestMultiProcessHandler.h"
#include "cmCTestResourceGroupsLexerHelper.h"
@@ -406,7 +408,9 @@ int cmCTestTestHandler::ProcessHandler()
// start the real time clock
auto clock_start = std::chrono::steady_clock::now();
- this->ProcessDirectory(passed, failed);
+ if (!this->ProcessDirectory(passed, failed)) {
+ return -1;
+ }
auto clock_finish = std::chrono::steady_clock::now();
@@ -510,6 +514,10 @@ bool cmCTestTestHandler::ProcessOptions()
this->CTest->SetParallelLevel(atoi(this->GetOption("ParallelLevel")));
}
+ if (this->GetOption("StopOnFailure")) {
+ this->CTest->SetStopOnFailure(true);
+ }
+
const char* val;
val = this->GetOption("LabelRegularExpression");
if (val) {
@@ -543,22 +551,11 @@ bool cmCTestTestHandler::ProcessOptions()
if (val) {
this->ExcludeFixtureCleanupRegExp = val;
}
- this->SetRerunFailed(cmIsOn(this->GetOption("RerunFailed")));
-
val = this->GetOption("ResourceSpecFile");
if (val) {
- this->UseResourceSpec = true;
this->ResourceSpecFile = val;
- auto result = this->ResourceSpec.ReadFromJSONFile(val);
- if (result != cmCTestResourceSpec::ReadFileResult::READ_OK) {
- cmCTestLog(this->CTest, ERROR_MESSAGE,
- "Could not read/parse resource spec file "
- << val << ": "
- << cmCTestResourceSpec::ResultToString(result)
- << std::endl);
- return false;
- }
}
+ this->SetRerunFailed(cmIsOn(this->GetOption("RerunFailed")));
return true;
}
@@ -718,7 +715,7 @@ void cmCTestTestHandler::PrintLabelOrSubprojectSummary(bool doSubProject)
cmCTestTestProperties& p = *result.Properties;
for (std::string const& l : p.Labels) {
// only use labels found in labels
- if (cmContains(labels, l)) {
+ if (cm::contains(labels, l)) {
labelTimes[l] +=
result.ExecutionTime.count() * result.Properties->Processors;
++labelCounts[l];
@@ -860,14 +857,15 @@ void cmCTestTestHandler::ComputeTestList()
if (this->UseUnion) {
// if it is not in the list and not in the regexp then skip
- if ((!this->TestsToRun.empty() && !cmContains(this->TestsToRun, cnt)) &&
+ if ((!this->TestsToRun.empty() &&
+ !cm::contains(this->TestsToRun, cnt)) &&
!tp.IsInBasedOnREOptions) {
continue;
}
} else {
// is this test in the list of tests to run? If not then skip it
if ((!this->TestsToRun.empty() &&
- !cmContains(this->TestsToRun, inREcnt)) ||
+ !cm::contains(this->TestsToRun, inREcnt)) ||
!tp.IsInBasedOnREOptions) {
continue;
}
@@ -896,7 +894,7 @@ void cmCTestTestHandler::ComputeTestListForRerunFailed()
cnt++;
// if this test is not in our list of tests to run, then skip it.
- if (!this->TestsToRun.empty() && !cmContains(this->TestsToRun, cnt)) {
+ if (!this->TestsToRun.empty() && !cm::contains(this->TestsToRun, cnt)) {
continue;
}
@@ -1015,7 +1013,7 @@ void cmCTestTestHandler::UpdateForFixtures(ListOfTests& tests) const
for (auto sIt = setupRange.first; sIt != setupRange.second; ++sIt) {
const std::string& setupTestName = sIt->second->Name;
tests[i].RequireSuccessDepends.insert(setupTestName);
- if (!cmContains(tests[i].Depends, setupTestName)) {
+ if (!cm::contains(tests[i].Depends, setupTestName)) {
tests[i].Depends.push_back(setupTestName);
}
}
@@ -1119,7 +1117,7 @@ void cmCTestTestHandler::UpdateForFixtures(ListOfTests& tests) const
const std::vector<size_t>& indices = cIt->second;
for (size_t index : indices) {
const std::string& reqTestName = tests[index].Name;
- if (!cmContains(p.Depends, reqTestName)) {
+ if (!cm::contains(p.Depends, reqTestName)) {
p.Depends.push_back(reqTestName);
}
}
@@ -1132,7 +1130,7 @@ void cmCTestTestHandler::UpdateForFixtures(ListOfTests& tests) const
const std::vector<size_t>& indices = cIt->second;
for (size_t index : indices) {
const std::string& setupTestName = tests[index].Name;
- if (!cmContains(p.Depends, setupTestName)) {
+ if (!cm::contains(p.Depends, setupTestName)) {
p.Depends.push_back(setupTestName);
}
}
@@ -1259,7 +1257,7 @@ bool cmCTestTestHandler::GetValue(const char* tag, std::string& value,
return ret;
}
-void cmCTestTestHandler::ProcessDirectory(std::vector<std::string>& passed,
+bool cmCTestTestHandler::ProcessDirectory(std::vector<std::string>& passed,
std::vector<std::string>& failed)
{
this->ComputeTestList();
@@ -1267,7 +1265,7 @@ void cmCTestTestHandler::ProcessDirectory(std::vector<std::string>& passed,
this->StartTestTime = std::chrono::system_clock::now();
auto elapsed_time_start = std::chrono::steady_clock::now();
- cmCTestMultiProcessHandler* parallel = new cmCTestMultiProcessHandler;
+ auto parallel = cm::make_unique<cmCTestMultiProcessHandler>();
parallel->SetCTest(this->CTest);
parallel->SetParallelLevel(this->CTest->GetParallelLevel());
parallel->SetTestHandler(this);
@@ -1283,7 +1281,17 @@ void cmCTestTestHandler::ProcessDirectory(std::vector<std::string>& passed,
} else {
parallel->SetTestLoad(this->CTest->GetTestLoad());
}
- if (this->UseResourceSpec) {
+ if (!this->ResourceSpecFile.empty()) {
+ this->UseResourceSpec = true;
+ auto result = this->ResourceSpec.ReadFromJSONFile(this->ResourceSpecFile);
+ if (result != cmCTestResourceSpec::ReadFileResult::READ_OK) {
+ cmCTestLog(this->CTest, ERROR_MESSAGE,
+ "Could not read/parse resource spec file "
+ << this->ResourceSpecFile << ": "
+ << cmCTestResourceSpec::ResultToString(result)
+ << std::endl);
+ return false;
+ }
parallel->InitResourceAllocator(this->ResourceSpec);
}
@@ -1338,12 +1346,13 @@ void cmCTestTestHandler::ProcessDirectory(std::vector<std::string>& passed,
} else {
parallel->RunTests();
}
- delete parallel;
this->EndTest = this->CTest->CurrentTime();
this->EndTestTime = std::chrono::system_clock::now();
this->ElapsedTestingTime =
std::chrono::steady_clock::now() - elapsed_time_start;
*this->LogFile << "End testing: " << this->CTest->CurrentTime() << std::endl;
+
+ return true;
}
void cmCTestTestHandler::GenerateTestCommand(
@@ -1423,6 +1432,12 @@ void cmCTestTestHandler::GenerateDartOutput(cmXMLWriter& xml)
xml.Attribute("name", "Command Line");
xml.Element("Value", result.FullCommandLine);
xml.EndElement(); // NamedMeasurement
+
+ xml.StartElement("NamedMeasurement");
+ xml.Attribute("type", "text/string");
+ xml.Attribute("name", "Environment");
+ xml.Element("Value", result.Environment);
+ xml.EndElement(); // NamedMeasurement
for (auto const& measure : result.Properties->Measurements) {
xml.StartElement("NamedMeasurement");
xml.Attribute("type", "text/string");
@@ -1742,6 +1757,10 @@ void cmCTestTestHandler::GetListOfTests()
if (cmSystemTools::GetErrorOccuredFlag()) {
return;
}
+ const char* specFile = mf.GetDefinition("CTEST_RESOURCE_SPEC_FILE");
+ if (this->ResourceSpecFile.empty() && specFile) {
+ this->ResourceSpecFile = specFile;
+ }
cmCTestOptionalLog(this->CTest, HANDLER_VERBOSE_OUTPUT,
"Done constructing a list of tests" << std::endl,
this->Quiet);
@@ -1894,7 +1913,8 @@ void cmCTestTestHandler::ExpandTestsToRunInformationForRerunFailed()
continue;
}
- int val = atoi(line.substr(0, pos).c_str());
+ line.erase(pos);
+ int val = atoi(line.c_str());
this->TestsToRun.push_back(val);
}
ifs.close();
@@ -2016,13 +2036,13 @@ void cmCTestTestHandler::GenerateRegressionImages(cmXMLWriter& xml,
| std::ios::binary
#endif
);
- unsigned char* file_buffer = new unsigned char[len + 1];
- ifs.read(reinterpret_cast<char*>(file_buffer), len);
- unsigned char* encoded_buffer = new unsigned char[static_cast<int>(
- static_cast<double>(len) * 1.5 + 5.0)];
+ auto file_buffer = cm::make_unique<unsigned char[]>(len + 1);
+ ifs.read(reinterpret_cast<char*>(file_buffer.get()), len);
+ auto encoded_buffer = cm::make_unique<unsigned char[]>(
+ static_cast<int>(static_cast<double>(len) * 1.5 + 5.0));
- size_t rlen =
- cmsysBase64_Encode(file_buffer, len, encoded_buffer, 1);
+ size_t rlen = cmsysBase64_Encode(file_buffer.get(), len,
+ encoded_buffer.get(), 1);
xml.StartElement("NamedMeasurement");
xml.Attribute(measurementfile.match(1).c_str(),
@@ -2039,8 +2059,6 @@ void cmCTestTestHandler::GenerateRegressionImages(cmXMLWriter& xml,
}
xml.Element("Value", ostr.str());
xml.EndElement(); // NamedMeasurement
- delete[] file_buffer;
- delete[] encoded_buffer;
}
} else {
int idx = 4;
@@ -2085,19 +2103,18 @@ void cmCTestTestHandler::SetTestsToRunInformation(const char* in)
if (cmSystemTools::FileExists(in)) {
cmsys::ifstream fin(in);
unsigned long filelen = cmSystemTools::FileLength(in);
- char* buff = new char[filelen + 1];
- fin.getline(buff, filelen);
+ auto buff = cm::make_unique<char[]>(filelen + 1);
+ fin.getline(buff.get(), filelen);
buff[fin.gcount()] = 0;
- this->TestsToRunString = buff;
- delete[] buff;
+ this->TestsToRunString = buff.get();
}
}
-bool cmCTestTestHandler::CleanTestOutput(std::string& output, size_t length)
+void cmCTestTestHandler::CleanTestOutput(std::string& output, size_t length)
{
if (!length || length >= output.size() ||
output.find("CTEST_FULL_OUTPUT") != std::string::npos) {
- return true;
+ return;
}
// Truncate at given length but do not break in the middle of a multi-byte
@@ -2118,7 +2135,7 @@ bool cmCTestTestHandler::CleanTestOutput(std::string& output, size_t length)
++current;
}
}
- output = output.substr(0, current - begin);
+ output.erase(current - begin);
// Append truncation message.
std::ostringstream msg;
@@ -2128,7 +2145,6 @@ bool cmCTestTestHandler::CleanTestOutput(std::string& output, size_t length)
"of "
<< length << " bytes.\n";
output += msg.str();
- return true;
}
bool cmCTestTestHandler::SetTestsProperties(
@@ -2149,16 +2165,16 @@ bool cmCTestTestHandler::SetTestsProperties(
}
++it; // skip PROPERTIES
for (; it != args.end(); ++it) {
- std::string key = *it;
+ std::string const& key = *it;
++it;
if (it == args.end()) {
break;
}
- std::string val = *it;
+ std::string const& val = *it;
for (std::string const& t : tests) {
for (cmCTestTestProperties& rt : this->TestList) {
if (t == rt.Name) {
- if (key == "_BACKTRACE_TRIPLES") {
+ if (key == "_BACKTRACE_TRIPLES"_s) {
std::vector<std::string> triples;
// allow empty args in the triples
cmExpandList(val, triples, true);
@@ -2182,91 +2198,70 @@ bool cmCTestTestHandler::SetTestsProperties(
rt.Backtrace = rt.Backtrace.Push(fc);
}
}
- }
- if (key == "WILL_FAIL") {
+ } else if (key == "WILL_FAIL"_s) {
rt.WillFail = cmIsOn(val);
- }
- if (key == "DISABLED") {
+ } else if (key == "DISABLED"_s) {
rt.Disabled = cmIsOn(val);
- }
- if (key == "ATTACHED_FILES") {
+ } else if (key == "ATTACHED_FILES"_s) {
cmExpandList(val, rt.AttachedFiles);
- }
- if (key == "ATTACHED_FILES_ON_FAIL") {
+ } else if (key == "ATTACHED_FILES_ON_FAIL"_s) {
cmExpandList(val, rt.AttachOnFail);
- }
- if (key == "RESOURCE_LOCK") {
+ } else if (key == "RESOURCE_LOCK"_s) {
std::vector<std::string> lval = cmExpandedList(val);
rt.LockedResources.insert(lval.begin(), lval.end());
- }
- if (key == "FIXTURES_SETUP") {
+ } else if (key == "FIXTURES_SETUP"_s) {
std::vector<std::string> lval = cmExpandedList(val);
rt.FixturesSetup.insert(lval.begin(), lval.end());
- }
- if (key == "FIXTURES_CLEANUP") {
+ } else if (key == "FIXTURES_CLEANUP"_s) {
std::vector<std::string> lval = cmExpandedList(val);
rt.FixturesCleanup.insert(lval.begin(), lval.end());
- }
- if (key == "FIXTURES_REQUIRED") {
+ } else if (key == "FIXTURES_REQUIRED"_s) {
std::vector<std::string> lval = cmExpandedList(val);
rt.FixturesRequired.insert(lval.begin(), lval.end());
- }
- if (key == "TIMEOUT") {
+ } else if (key == "TIMEOUT"_s) {
rt.Timeout = cmDuration(atof(val.c_str()));
rt.ExplicitTimeout = true;
- }
- if (key == "COST") {
+ } else if (key == "COST"_s) {
rt.Cost = static_cast<float>(atof(val.c_str()));
- }
- if (key == "REQUIRED_FILES") {
+ } else if (key == "REQUIRED_FILES"_s) {
cmExpandList(val, rt.RequiredFiles);
- }
- if (key == "RUN_SERIAL") {
+ } else if (key == "RUN_SERIAL"_s) {
rt.RunSerial = cmIsOn(val);
- }
- if (key == "FAIL_REGULAR_EXPRESSION") {
+ } else if (key == "FAIL_REGULAR_EXPRESSION"_s) {
std::vector<std::string> lval = cmExpandedList(val);
for (std::string const& cr : lval) {
rt.ErrorRegularExpressions.emplace_back(cr, cr);
}
- }
- if (key == "SKIP_REGULAR_EXPRESSION") {
+ } else if (key == "SKIP_REGULAR_EXPRESSION"_s) {
std::vector<std::string> lval = cmExpandedList(val);
for (std::string const& cr : lval) {
rt.SkipRegularExpressions.emplace_back(cr, cr);
}
- }
- if (key == "PROCESSORS") {
+ } else if (key == "PROCESSORS"_s) {
rt.Processors = atoi(val.c_str());
if (rt.Processors < 1) {
rt.Processors = 1;
}
- }
- if (key == "PROCESSOR_AFFINITY") {
+ } else if (key == "PROCESSOR_AFFINITY"_s) {
rt.WantAffinity = cmIsOn(val);
- }
- if (key == "RESOURCE_GROUPS") {
+ } else if (key == "RESOURCE_GROUPS"_s) {
if (!ParseResourceGroupsProperty(val, rt.ResourceGroups)) {
return false;
}
- }
- if (key == "SKIP_RETURN_CODE") {
+ } else if (key == "SKIP_RETURN_CODE"_s) {
rt.SkipReturnCode = atoi(val.c_str());
if (rt.SkipReturnCode < 0 || rt.SkipReturnCode > 255) {
rt.SkipReturnCode = -1;
}
- }
- if (key == "DEPENDS") {
+ } else if (key == "DEPENDS"_s) {
cmExpandList(val, rt.Depends);
- }
- if (key == "ENVIRONMENT") {
+ } else if (key == "ENVIRONMENT"_s) {
cmExpandList(val, rt.Environment);
- }
- if (key == "LABELS") {
+ } else if (key == "LABELS"_s) {
std::vector<std::string> Labels = cmExpandedList(val);
rt.Labels.insert(rt.Labels.end(), Labels.begin(), Labels.end());
// sort the array
@@ -2274,8 +2269,7 @@ bool cmCTestTestHandler::SetTestsProperties(
// remove duplicates
auto new_end = std::unique(rt.Labels.begin(), rt.Labels.end());
rt.Labels.erase(new_end, rt.Labels.end());
- }
- if (key == "MEASUREMENT") {
+ } else if (key == "MEASUREMENT"_s) {
size_t pos = val.find_first_of('=');
if (pos != std::string::npos) {
std::string mKey = val.substr(0, pos);
@@ -2284,17 +2278,14 @@ bool cmCTestTestHandler::SetTestsProperties(
} else {
rt.Measurements[val] = "1";
}
- }
- if (key == "PASS_REGULAR_EXPRESSION") {
+ } else if (key == "PASS_REGULAR_EXPRESSION"_s) {
std::vector<std::string> lval = cmExpandedList(val);
for (std::string const& cr : lval) {
rt.RequiredRegularExpressions.emplace_back(cr, cr);
}
- }
- if (key == "WORKING_DIRECTORY") {
+ } else if (key == "WORKING_DIRECTORY"_s) {
rt.Directory = val;
- }
- if (key == "TIMEOUT_AFTER_MATCH") {
+ } else if (key == "TIMEOUT_AFTER_MATCH"_s) {
std::vector<std::string> propArgs = cmExpandedList(val);
if (propArgs.size() != 2) {
cmCTestLog(this->CTest, WARNING,
@@ -2334,16 +2325,16 @@ bool cmCTestTestHandler::SetDirectoryProperties(
}
++it; // skip PROPERTIES
for (; it != args.end(); ++it) {
- std::string key = *it;
+ std::string const& key = *it;
++it;
if (it == args.end()) {
break;
}
- std::string val = *it;
+ std::string const& val = *it;
for (cmCTestTestProperties& rt : this->TestList) {
std::string cwd = cmSystemTools::GetCurrentWorkingDirectory();
if (cwd == rt.Directory) {
- if (key == "LABELS") {
+ if (key == "LABELS"_s) {
std::vector<std::string> DirectoryLabels = cmExpandedList(val);
rt.Labels.insert(rt.Labels.end(), DirectoryLabels.begin(),
DirectoryLabels.end());
@@ -2422,10 +2413,9 @@ bool cmCTestTestHandler::AddTest(const std::vector<std::string>& args)
test.SkipReturnCode = -1;
test.PreviousRuns = 0;
if (this->UseIncludeRegExpFlag &&
- !this->IncludeTestsRegularExpression.find(testname)) {
- test.IsInBasedOnREOptions = false;
- } else if (this->UseExcludeRegExpFlag && !this->UseExcludeRegExpFirst &&
- this->ExcludeTestsRegularExpression.find(testname)) {
+ (!this->IncludeTestsRegularExpression.find(testname) ||
+ (!this->UseExcludeRegExpFirst &&
+ this->ExcludeTestsRegularExpression.find(testname)))) {
test.IsInBasedOnREOptions = false;
}
this->TestList.push_back(test);
diff --git a/Source/CTest/cmCTestTestHandler.h b/Source/CTest/cmCTestTestHandler.h
index b1c8755..0d88c30 100644
--- a/Source/CTest/cmCTestTestHandler.h
+++ b/Source/CTest/cmCTestTestHandler.h
@@ -169,6 +169,7 @@ public:
std::string Path;
std::string Reason;
std::string FullCommandLine;
+ std::string Environment;
cmDuration ExecutionTime;
std::int64_t ReturnValue;
int Status;
@@ -235,7 +236,7 @@ protected:
void AttachFiles(cmXMLWriter& xml, cmCTestTestResult& result);
//! Clean test output to specified length
- bool CleanTestOutput(std::string& output, size_t length);
+ void CleanTestOutput(std::string& output, size_t length);
cmDuration ElapsedTestingTime;
@@ -278,7 +279,7 @@ private:
/**
* Run the tests for a directory and any subdirectories
*/
- void ProcessDirectory(std::vector<std::string>& passed,
+ bool ProcessDirectory(std::vector<std::string>& passed,
std::vector<std::string>& failed);
/**
diff --git a/Source/CTest/cmCTestUploadCommand.cxx b/Source/CTest/cmCTestUploadCommand.cxx
index eaef1ca..f86ee0d 100644
--- a/Source/CTest/cmCTestUploadCommand.cxx
+++ b/Source/CTest/cmCTestUploadCommand.cxx
@@ -6,8 +6,7 @@
#include <sstream>
#include <cm/vector>
-
-#include "cm_static_string_view.hxx"
+#include <cmext/string_view>
#include "cmCTest.h"
#include "cmCTestUploadHandler.h"
diff --git a/Source/CTest/cmCTestVC.cxx b/Source/CTest/cmCTestVC.cxx
index 6026c69..452d714 100644
--- a/Source/CTest/cmCTestVC.cxx
+++ b/Source/CTest/cmCTestVC.cxx
@@ -38,7 +38,7 @@ void cmCTestVC::SetSourceDirectory(std::string const& dir)
this->SourceDirectory = dir;
}
-bool cmCTestVC::InitialCheckout(const char* command)
+bool cmCTestVC::InitialCheckout(const std::string& command)
{
cmCTestLog(this->CTest, HANDLER_OUTPUT,
" First perform the initial checkout: " << command << "\n");
diff --git a/Source/CTest/cmCTestVC.h b/Source/CTest/cmCTestVC.h
index 2a4765d..3037e01 100644
--- a/Source/CTest/cmCTestVC.h
+++ b/Source/CTest/cmCTestVC.h
@@ -36,7 +36,7 @@ public:
std::string GetNightlyTime();
/** Prepare the work tree. */
- bool InitialCheckout(const char* command);
+ bool InitialCheckout(const std::string& command);
/** Perform cleanup operations on the work tree. */
void Cleanup();
diff --git a/Source/CTest/cmParseCacheCoverage.cxx b/Source/CTest/cmParseCacheCoverage.cxx
index 8c4da75..84d7de0 100644
--- a/Source/CTest/cmParseCacheCoverage.cxx
+++ b/Source/CTest/cmParseCacheCoverage.cxx
@@ -4,6 +4,7 @@
#include <cstdlib>
#include <map>
#include <utility>
+#include <vector>
#include "cmsys/Directory.hxx"
#include "cmsys/FStream.hxx"
@@ -19,7 +20,7 @@ cmParseCacheCoverage::cmParseCacheCoverage(
{
}
-bool cmParseCacheCoverage::LoadCoverageData(const char* d)
+bool cmParseCacheCoverage::LoadCoverageData(std::string const& d)
{
// load all the .mcov files in the specified directory
cmsys::Directory dir;
@@ -69,26 +70,6 @@ void cmParseCacheCoverage::RemoveUnCoveredFiles()
}
}
-bool cmParseCacheCoverage::SplitString(std::vector<std::string>& args,
- std::string const& line)
-{
- std::string::size_type pos1 = 0;
- std::string::size_type pos2 = line.find(',', 0);
- if (pos2 == std::string::npos) {
- return false;
- }
- std::string arg;
- while (pos2 != std::string::npos) {
- arg = line.substr(pos1, pos2 - pos1);
- args.push_back(arg);
- pos1 = pos2 + 1;
- pos2 = line.find(',', pos1);
- }
- arg = line.substr(pos1);
- args.push_back(arg);
- return true;
-}
-
bool cmParseCacheCoverage::ReadCMCovFile(const char* file)
{
cmsys::ifstream in(file);
@@ -97,7 +78,6 @@ bool cmParseCacheCoverage::ReadCMCovFile(const char* file)
return false;
}
std::string line;
- std::vector<std::string> separateLine;
if (!cmSystemTools::GetLineFromStream(in, line)) {
cmCTestLog(this->CTest, ERROR_MESSAGE,
"Empty file : " << file
@@ -106,8 +86,8 @@ bool cmParseCacheCoverage::ReadCMCovFile(const char* file)
<< line << "]\n");
return false;
}
- separateLine.clear();
- this->SplitString(separateLine, line);
+ std::vector<std::string> separateLine =
+ cmSystemTools::SplitString(line, ',');
if (separateLine.size() != 4 || separateLine[0] != "Routine" ||
separateLine[1] != "Line" || separateLine[2] != "RtnLine" ||
separateLine[3] != "Code") {
@@ -120,10 +100,8 @@ bool cmParseCacheCoverage::ReadCMCovFile(const char* file)
std::string routine;
std::string filepath;
while (cmSystemTools::GetLineFromStream(in, line)) {
- // clear out line argument vector
- separateLine.clear();
// parse the comma separated line
- this->SplitString(separateLine, line);
+ separateLine = cmSystemTools::SplitString(line, ',');
// might have more because code could have a quoted , in it
// but we only care about the first 3 args anyway
if (separateLine.size() < 4) {
@@ -155,7 +133,7 @@ bool cmParseCacheCoverage::ReadCMCovFile(const char* file)
// if we have a routine name, check for end of routine
else {
// Totals in arg 0 marks the end of a routine
- if (separateLine[0].substr(0, 6) == "Totals") {
+ if (cmHasLiteralPrefix(separateLine[0], "Totals")) {
routine.clear(); // at the end of this routine
filepath.clear();
continue; // move to next line
diff --git a/Source/CTest/cmParseCacheCoverage.h b/Source/CTest/cmParseCacheCoverage.h
index e89b9e4..a8200b7 100644
--- a/Source/CTest/cmParseCacheCoverage.h
+++ b/Source/CTest/cmParseCacheCoverage.h
@@ -6,7 +6,6 @@
#include "cmConfigure.h" // IWYU pragma: keep
#include <string>
-#include <vector>
#include "cmParseMumpsCoverage.h"
@@ -26,13 +25,11 @@ public:
protected:
// implement virtual from parent
- bool LoadCoverageData(const char* dir) override;
+ bool LoadCoverageData(std::string const& dir) override;
// remove files with no coverage
void RemoveUnCoveredFiles();
// Read a single mcov file
bool ReadCMCovFile(const char* f);
- // split a string based on ,
- bool SplitString(std::vector<std::string>& args, std::string const& line);
};
#endif
diff --git a/Source/CTest/cmParseCoberturaCoverage.cxx b/Source/CTest/cmParseCoberturaCoverage.cxx
index 05da84e..711a856 100644
--- a/Source/CTest/cmParseCoberturaCoverage.cxx
+++ b/Source/CTest/cmParseCoberturaCoverage.cxx
@@ -67,7 +67,7 @@ protected:
// Check if this is an absolute path that falls within our
// source or binary directories.
for (std::string const& filePath : FilePaths) {
- if (filename.find(filePath) == 0) {
+ if (cmHasPrefix(filename, filePath)) {
this->CurFileName = filename;
break;
}
diff --git a/Source/CTest/cmParseGTMCoverage.cxx b/Source/CTest/cmParseGTMCoverage.cxx
index 1dc5b70..14417cc 100644
--- a/Source/CTest/cmParseGTMCoverage.cxx
+++ b/Source/CTest/cmParseGTMCoverage.cxx
@@ -19,7 +19,7 @@ cmParseGTMCoverage::cmParseGTMCoverage(cmCTestCoverageHandlerContainer& cont,
{
}
-bool cmParseGTMCoverage::LoadCoverageData(const char* d)
+bool cmParseGTMCoverage::LoadCoverageData(std::string const& d)
{
// load all the .mcov files in the specified directory
cmsys::Directory dir;
diff --git a/Source/CTest/cmParseGTMCoverage.h b/Source/CTest/cmParseGTMCoverage.h
index fe0ae0b..41cc7f5 100644
--- a/Source/CTest/cmParseGTMCoverage.h
+++ b/Source/CTest/cmParseGTMCoverage.h
@@ -25,7 +25,7 @@ public:
protected:
// implement virtual from parent
- bool LoadCoverageData(const char* dir) override;
+ bool LoadCoverageData(std::string const& dir) override;
// Read a single mcov file
bool ReadMCovFile(const char* f);
// find out what line in a mumps file (filepath) the given entry point
diff --git a/Source/CTest/cmParseMumpsCoverage.cxx b/Source/CTest/cmParseMumpsCoverage.cxx
index b16f101..dc3064d 100644
--- a/Source/CTest/cmParseMumpsCoverage.cxx
+++ b/Source/CTest/cmParseMumpsCoverage.cxx
@@ -39,9 +39,9 @@ bool cmParseMumpsCoverage::ReadCoverageFile(const char* file)
std::string type = line.substr(0, pos);
std::string path = line.substr(pos + 1);
if (type == "packages") {
- this->LoadPackages(path.c_str());
+ this->LoadPackages(path);
} else if (type == "coverage_dir") {
- this->LoadCoverageData(path.c_str());
+ this->LoadCoverageData(path);
} else {
cmCTestLog(this->CTest, ERROR_MESSAGE,
"Parse Error in Mumps coverage file :\n"
@@ -105,7 +105,7 @@ void cmParseMumpsCoverage::InitializeMumpsFile(std::string& file)
}
}
-bool cmParseMumpsCoverage::LoadPackages(const char* d)
+bool cmParseMumpsCoverage::LoadPackages(std::string const& d)
{
cmsys::Glob glob;
glob.RecurseOn();
@@ -113,7 +113,8 @@ bool cmParseMumpsCoverage::LoadPackages(const char* d)
glob.FindFiles(pat);
for (std::string& file : glob.GetFiles()) {
std::string name = cmSystemTools::GetFilenameName(file);
- this->RoutineToDirectory[name.substr(0, name.size() - 2)] = file;
+ name.erase(name.size() - 2);
+ this->RoutineToDirectory[name] = file;
// initialize each file, this is left out until CDash is fixed
// to handle large numbers of files
this->InitializeMumpsFile(file);
diff --git a/Source/CTest/cmParseMumpsCoverage.h b/Source/CTest/cmParseMumpsCoverage.h
index 2c54495..8c08702 100644
--- a/Source/CTest/cmParseMumpsCoverage.h
+++ b/Source/CTest/cmParseMumpsCoverage.h
@@ -29,10 +29,10 @@ public:
protected:
// sub classes will use this to
// load all coverage files found in the given directory
- virtual bool LoadCoverageData(const char* d) = 0;
+ virtual bool LoadCoverageData(std::string const& d) = 0;
// search the package directory for mumps files and fill
// in the RoutineToDirectory map
- bool LoadPackages(const char* dir);
+ bool LoadPackages(std::string const& dir);
// initialize the coverage information for a single mumps file
void InitializeMumpsFile(std::string& file);
// Find mumps file for routine
diff --git a/Source/CTest/cmParsePHPCoverage.cxx b/Source/CTest/cmParsePHPCoverage.cxx
index a494b92..044f518 100644
--- a/Source/CTest/cmParsePHPCoverage.cxx
+++ b/Source/CTest/cmParsePHPCoverage.cxx
@@ -3,6 +3,8 @@
#include <cstdlib>
#include <cstring>
+#include <cm/memory>
+
#include "cmsys/Directory.hxx"
#include "cmsys/FStream.hxx"
@@ -142,17 +144,15 @@ bool cmParsePHPCoverage::ReadFileInformation(std::istream& in)
int size = 0;
if (this->ReadInt(in, size)) {
size++; // add one for null termination
- char* s = new char[size + 1];
+ auto s = cm::make_unique<char[]>(size + 1);
// read open quote
if (in.get(c) && c != '"') {
- delete[] s;
return false;
}
// read the string data
- in.read(s, size - 1);
+ in.read(s.get(), size - 1);
s[size - 1] = 0;
- std::string fileName = s;
- delete[] s;
+ std::string fileName = s.get();
// read close quote
if (in.get(c) && c != '"') {
cmCTestLog(this->CTest, ERROR_MESSAGE,
diff --git a/Source/CTest/cmProcess.cxx b/Source/CTest/cmProcess.cxx
index 6097aa5..a549117 100644
--- a/Source/CTest/cmProcess.cxx
+++ b/Source/CTest/cmProcess.cxx
@@ -5,6 +5,7 @@
#include <csignal>
#include <iostream>
#include <string>
+#include <utility>
#include <cmext/algorithm>
@@ -16,14 +17,13 @@
#include "cmGetPipes.h"
#include "cmStringAlgorithms.h"
#if defined(_WIN32)
-# include "cm_kwiml.h"
+# include <cm3p/kwiml/int.h>
#endif
-#include <utility>
#define CM_PROCESS_BUF_SIZE 65536
-cmProcess::cmProcess(cmCTestRunTest& runner)
- : Runner(runner)
+cmProcess::cmProcess(std::unique_ptr<cmCTestRunTest> runner)
+ : Runner(std::move(runner))
, Conv(cmProcessOutput::UTF8, CM_PROCESS_BUF_SIZE)
{
this->Timeout = cmDuration::zero();
@@ -69,7 +69,7 @@ bool cmProcess::StartProcess(uv_loop_t& loop, std::vector<size_t>* affinity)
cm::uv_timer_ptr timer;
int status = timer.init(loop, this);
if (status != 0) {
- cmCTestLog(this->Runner.GetCTest(), ERROR_MESSAGE,
+ cmCTestLog(this->Runner->GetCTest(), ERROR_MESSAGE,
"Error initializing timer: " << uv_strerror(status)
<< std::endl);
return false;
@@ -84,7 +84,7 @@ bool cmProcess::StartProcess(uv_loop_t& loop, std::vector<size_t>* affinity)
int fds[2] = { -1, -1 };
status = cmGetPipes(fds);
if (status != 0) {
- cmCTestLog(this->Runner.GetCTest(), ERROR_MESSAGE,
+ cmCTestLog(this->Runner->GetCTest(), ERROR_MESSAGE,
"Error initializing pipe: " << uv_strerror(status)
<< std::endl);
return false;
@@ -127,7 +127,7 @@ bool cmProcess::StartProcess(uv_loop_t& loop, std::vector<size_t>* affinity)
uv_read_start(pipe_reader, &cmProcess::OnAllocateCB, &cmProcess::OnReadCB);
if (status != 0) {
- cmCTestLog(this->Runner.GetCTest(), ERROR_MESSAGE,
+ cmCTestLog(this->Runner->GetCTest(), ERROR_MESSAGE,
"Error starting read events: " << uv_strerror(status)
<< std::endl);
return false;
@@ -135,7 +135,7 @@ bool cmProcess::StartProcess(uv_loop_t& loop, std::vector<size_t>* affinity)
status = this->Process.spawn(loop, options, this);
if (status != 0) {
- cmCTestLog(this->Runner.GetCTest(), ERROR_MESSAGE,
+ cmCTestLog(this->Runner->GetCTest(), ERROR_MESSAGE,
"Process not started\n " << this->Command << "\n["
<< uv_strerror(status) << "]\n");
return false;
@@ -152,7 +152,7 @@ bool cmProcess::StartProcess(uv_loop_t& loop, std::vector<size_t>* affinity)
void cmProcess::StartTimer()
{
- auto properties = this->Runner.GetTestProperties();
+ auto properties = this->Runner->GetTestProperties();
auto msec =
std::chrono::duration_cast<std::chrono::milliseconds>(this->Timeout);
@@ -222,7 +222,7 @@ void cmProcess::OnRead(ssize_t nread, const uv_buf_t* buf)
cm::append(this->Output, strdata);
while (this->Output.GetLine(line)) {
- this->Runner.CheckOutput(line);
+ this->Runner->CheckOutput(line);
line.clear();
}
@@ -236,13 +236,13 @@ void cmProcess::OnRead(ssize_t nread, const uv_buf_t* buf)
// The process will provide no more data.
if (nread != UV_EOF) {
auto error = static_cast<int>(nread);
- cmCTestLog(this->Runner.GetCTest(), ERROR_MESSAGE,
+ cmCTestLog(this->Runner->GetCTest(), ERROR_MESSAGE,
"Error reading stream: " << uv_strerror(error) << std::endl);
}
// Look for partial last lines.
if (this->Output.GetLast(line)) {
- this->Runner.CheckOutput(line);
+ this->Runner->CheckOutput(line);
}
this->ReadHandleClosed = true;
@@ -339,7 +339,7 @@ void cmProcess::Finish()
if (this->TotalTime <= cmDuration::zero()) {
this->TotalTime = cmDuration::zero();
}
- this->Runner.FinalizeTest();
+ this->Runner->FinalizeTest();
}
cmProcess::State cmProcess::GetProcessStatus()
diff --git a/Source/CTest/cmProcess.h b/Source/CTest/cmProcess.h
index ea72a26..1e6578c 100644
--- a/Source/CTest/cmProcess.h
+++ b/Source/CTest/cmProcess.h
@@ -6,14 +6,15 @@
#include "cmConfigure.h" // IWYU pragma: keep
#include <chrono>
+#include <memory>
#include <string>
+#include <utility>
#include <vector>
+#include <cm3p/uv.h>
#include <stddef.h>
#include <stdint.h>
-#include "cm_uv.h"
-
#include "cmDuration.h"
#include "cmProcessOutput.h"
#include "cmUVHandlePtr.h"
@@ -28,7 +29,7 @@ class cmCTestRunTest;
class cmProcess
{
public:
- explicit cmProcess(cmCTestRunTest& runner);
+ explicit cmProcess(std::unique_ptr<cmCTestRunTest> runner);
~cmProcess();
void SetCommand(std::string const& command);
void SetCommandArguments(std::vector<std::string> const& arg);
@@ -70,6 +71,11 @@ public:
Exception GetExitException();
std::string GetExitExceptionString();
+ std::unique_ptr<cmCTestRunTest> GetRunner()
+ {
+ return std::move(this->Runner);
+ }
+
private:
cmDuration Timeout;
std::chrono::steady_clock::time_point StartTime;
@@ -82,7 +88,7 @@ private:
cm::uv_timer_ptr Timer;
std::vector<char> Buf;
- cmCTestRunTest& Runner;
+ std::unique_ptr<cmCTestRunTest> Runner;
cmProcessOutput Conv;
int Signal = 0;
cmProcess::State ProcessState = cmProcess::State::Starting;
diff --git a/Source/Checks/cm_cxx_features.cmake b/Source/Checks/cm_cxx_features.cmake
index 2a67748..50ccc7c 100644
--- a/Source/Checks/cm_cxx_features.cmake
+++ b/Source/Checks/cm_cxx_features.cmake
@@ -36,8 +36,6 @@ function(cm_check_cxx_feature name)
string(REGEX REPLACE "[^\n]*icpc: command line warning #10121: overriding [^\n]*" "" check_output "${check_output}")
# Filter out ld warnings.
string(REGEX REPLACE "[^\n]*ld: warning: [^\n]*" "" check_output "${check_output}")
- # Filter out CUDA installation warnings.
- string(REGEX REPLACE "[^\n]*clang: warning: Unknown CUDA version[^\n]*" "" check_output "${check_output}")
# If using the feature causes warnings, treat it as broken/unavailable.
if(check_output MATCHES "(^|[ :])[Ww][Aa][Rr][Nn][Ii][Nn][Gg]")
set(CMake_HAVE_CXX_${FEATURE} OFF CACHE INTERNAL "TRY_COMPILE" FORCE)
diff --git a/Source/CursesDialog/ccmake.cxx b/Source/CursesDialog/ccmake.cxx
index 01fce85..9a26db5 100644
--- a/Source/CursesDialog/ccmake.cxx
+++ b/Source/CursesDialog/ccmake.cxx
@@ -16,6 +16,7 @@
#include "cmDocumentation.h"
#include "cmDocumentationEntry.h" // IWYU pragma: keep
#include "cmState.h"
+#include "cmStringAlgorithms.h"
#include "cmSystemTools.h"
#include "cmake.h"
@@ -111,8 +112,8 @@ int main(int argc, char const* const* argv)
std::string cacheDir = cmSystemTools::GetCurrentWorkingDirectory();
for (i = 1; i < args.size(); ++i) {
- std::string arg = args[i];
- if (arg.find("-B", 0) == 0) {
+ std::string const& arg = args[i];
+ if (cmHasPrefix(arg, "-B")) {
cacheDir = arg.substr(2);
}
}
diff --git a/Source/CursesDialog/cmCursesCacheEntryComposite.cxx b/Source/CursesDialog/cmCursesCacheEntryComposite.cxx
index 4d3131b..9250fbc 100644
--- a/Source/CursesDialog/cmCursesCacheEntryComposite.cxx
+++ b/Source/CursesDialog/cmCursesCacheEntryComposite.cxx
@@ -48,42 +48,42 @@ cmCursesCacheEntryComposite::cmCursesCacheEntryComposite(
this->IsNewLabel = cm::make_unique<cmCursesLabelWidget>(1, 1, 1, 1, " ");
}
- const char* value = state->GetCacheEntryValue(key);
+ cmProp value = state->GetCacheEntryValue(key);
assert(value);
switch (state->GetCacheEntryType(key)) {
case cmStateEnums::BOOL: {
auto bw = cm::make_unique<cmCursesBoolWidget>(this->EntryWidth, 1, 1, 1);
- bw->SetValueAsBool(cmIsOn(value));
+ bw->SetValueAsBool(cmIsOn(*value));
this->Entry = std::move(bw);
break;
}
case cmStateEnums::PATH: {
auto pw = cm::make_unique<cmCursesPathWidget>(this->EntryWidth, 1, 1, 1);
- pw->SetString(value);
+ pw->SetString(*value);
this->Entry = std::move(pw);
break;
}
case cmStateEnums::FILEPATH: {
auto fpw =
cm::make_unique<cmCursesFilePathWidget>(this->EntryWidth, 1, 1, 1);
- fpw->SetString(value);
+ fpw->SetString(*value);
this->Entry = std::move(fpw);
break;
}
case cmStateEnums::STRING: {
- const char* stringsProp = state->GetCacheEntryProperty(key, "STRINGS");
+ cmProp stringsProp = state->GetCacheEntryProperty(key, "STRINGS");
if (stringsProp) {
auto ow =
cm::make_unique<cmCursesOptionsWidget>(this->EntryWidth, 1, 1, 1);
- for (std::string const& opt : cmExpandedList(stringsProp)) {
+ for (std::string const& opt : cmExpandedList(*stringsProp)) {
ow->AddOption(opt);
}
- ow->SetOption(value);
+ ow->SetOption(*value);
this->Entry = std::move(ow);
} else {
auto sw =
cm::make_unique<cmCursesStringWidget>(this->EntryWidth, 1, 1, 1);
- sw->SetString(value);
+ sw->SetString(*value);
this->Entry = std::move(sw);
}
break;
diff --git a/Source/CursesDialog/cmCursesColor.cxx b/Source/CursesDialog/cmCursesColor.cxx
index 641d48c..c0b468b 100644
--- a/Source/CursesDialog/cmCursesColor.cxx
+++ b/Source/CursesDialog/cmCursesColor.cxx
@@ -2,6 +2,12 @@
file Copyright.txt or https://cmake.org/licensing for details. */
#include "cmCursesColor.h"
+#include <cctype>
+#include <cstdlib>
+#include <cstring>
+#include <unordered_map>
+#include <utility>
+
#include "cmCursesStandardIncludes.h"
bool cmCursesColor::HasColors()
@@ -19,11 +25,54 @@ void cmCursesColor::InitColors()
if (HasColors()) {
start_color();
use_default_colors();
- init_pair(cmCursesColor::BoolOff, COLOR_RED, -1);
- init_pair(cmCursesColor::BoolOn, COLOR_GREEN, -1);
- init_pair(cmCursesColor::String, COLOR_BLUE, -1);
- init_pair(cmCursesColor::Path, COLOR_YELLOW, -1);
- init_pair(cmCursesColor::Options, COLOR_MAGENTA, -1);
+ init_pair(BoolOff, GetColor('N', COLOR_RED), -1);
+ init_pair(BoolOn, GetColor('Y', COLOR_GREEN), -1);
+ init_pair(String, GetColor('S', COLOR_CYAN), -1);
+ init_pair(Path, GetColor('P', COLOR_YELLOW), -1);
+ init_pair(Choice, GetColor('C', COLOR_MAGENTA), -1);
}
#endif
}
+
+short cmCursesColor::GetColor(char id, short fallback)
+{
+ static bool initialized = false;
+ static std::unordered_map<char, short> env;
+
+ if (!initialized) {
+ if (auto* v = getenv("CCMAKE_COLORS")) {
+ while (v[0] && v[1] && v[1] == '=') {
+ auto const n = std::toupper(*v);
+
+ char buffer[12];
+ memset(buffer, 0, sizeof(buffer));
+
+ if (auto* const e = strchr(v, ':')) {
+ if (static_cast<size_t>(e - v) > sizeof(buffer)) {
+ break;
+ }
+
+ strncpy(buffer, v + 2, static_cast<size_t>(e - v - 2));
+ v = e + 1;
+ } else {
+ auto const l = strlen(v);
+ if (l > sizeof(buffer)) {
+ break;
+ }
+
+ strncpy(buffer, v + 2, l - 2);
+ v += l;
+ }
+
+ auto const c = atoi(buffer);
+ if (c && c < COLORS) {
+ env.emplace(n, static_cast<short>(c));
+ }
+ }
+ }
+ initialized = true;
+ }
+
+ auto const iter = env.find(id);
+ return (iter == env.end() ? fallback : iter->second);
+}
diff --git a/Source/CursesDialog/cmCursesColor.h b/Source/CursesDialog/cmCursesColor.h
index 78ca52c..f83265f 100644
--- a/Source/CursesDialog/cmCursesColor.h
+++ b/Source/CursesDialog/cmCursesColor.h
@@ -13,12 +13,15 @@ public:
BoolOn,
String,
Path,
- Options
+ Choice
};
static bool HasColors();
static void InitColors();
+
+protected:
+ static short GetColor(char id, short fallback);
};
#endif // cmCursesColor_h
diff --git a/Source/CursesDialog/cmCursesLongMessageForm.cxx b/Source/CursesDialog/cmCursesLongMessageForm.cxx
index afd2b6b..591c546 100644
--- a/Source/CursesDialog/cmCursesLongMessageForm.cxx
+++ b/Source/CursesDialog/cmCursesLongMessageForm.cxx
@@ -41,7 +41,8 @@ void cmCursesLongMessageForm::UpdateContent(std::string const& output,
this->Title = title;
if (!output.empty() && this->Messages.size() < MAX_CONTENT_SIZE) {
- this->Messages.append("\n" + output);
+ this->Messages.push_back('\n');
+ this->Messages.append(output);
form_driver(this->Form, REQ_NEW_LINE);
this->DrawMessage(output.c_str());
}
@@ -67,7 +68,7 @@ void cmCursesLongMessageForm::UpdateStatusBar()
bar[i] = ' ';
}
int width;
- if (x < cmCursesMainForm::MAX_WIDTH) {
+ if (x >= 0 && x < cmCursesMainForm::MAX_WIDTH) {
width = x;
} else {
width = cmCursesMainForm::MAX_WIDTH - 1;
diff --git a/Source/CursesDialog/cmCursesMainForm.cxx b/Source/CursesDialog/cmCursesMainForm.cxx
index 65376d1..df34283 100644
--- a/Source/CursesDialog/cmCursesMainForm.cxx
+++ b/Source/CursesDialog/cmCursesMainForm.cxx
@@ -161,7 +161,7 @@ void cmCursesMainForm::RePost()
// If normal mode, count only non-advanced entries
this->NumberOfVisibleEntries = 0;
for (cmCursesCacheEntryComposite& entry : this->Entries) {
- const char* existingValue =
+ cmProp existingValue =
this->CMakeInstance->GetState()->GetCacheEntryValue(entry.GetValue());
bool advanced =
this->CMakeInstance->GetState()->GetCacheEntryPropertyAsBool(
@@ -182,7 +182,7 @@ void cmCursesMainForm::RePost()
// Assign fields
for (cmCursesCacheEntryComposite& entry : this->Entries) {
- const char* existingValue =
+ cmProp existingValue =
this->CMakeInstance->GetState()->GetCacheEntryValue(entry.GetValue());
bool advanced =
this->CMakeInstance->GetState()->GetCacheEntryPropertyAsBool(
@@ -241,7 +241,7 @@ void cmCursesMainForm::Render(int left, int top, int width, int height)
// If normal, display only non-advanced entries
this->NumberOfVisibleEntries = 0;
for (cmCursesCacheEntryComposite& entry : this->Entries) {
- const char* existingValue =
+ cmProp existingValue =
this->CMakeInstance->GetState()->GetCacheEntryValue(entry.GetValue());
bool advanced =
this->CMakeInstance->GetState()->GetCacheEntryPropertyAsBool(
@@ -259,7 +259,7 @@ void cmCursesMainForm::Render(int left, int top, int width, int height)
bool isNewPage;
int i = 0;
for (cmCursesCacheEntryComposite& entry : this->Entries) {
- const char* existingValue =
+ cmProp existingValue =
this->CMakeInstance->GetState()->GetCacheEntryValue(entry.GetValue());
bool advanced =
this->CMakeInstance->GetState()->GetCacheEntryPropertyAsBool(
@@ -405,11 +405,12 @@ void cmCursesMainForm::UpdateStatusBar(cm::optional<std::string> message)
// Get the help string of the current entry
// and add it to the help string
auto cmakeState = this->CMakeInstance->GetState();
- const char* existingValue = cmakeState->GetCacheEntryValue(labelValue);
+ cmProp existingValue = cmakeState->GetCacheEntryValue(labelValue);
if (existingValue) {
- auto help = cmakeState->GetCacheEntryProperty(labelValue, "HELPSTRING");
+ cmProp help =
+ cmakeState->GetCacheEntryProperty(labelValue, "HELPSTRING");
if (help) {
- bar += help;
+ bar += *help;
}
}
}
@@ -616,10 +617,10 @@ void cmCursesMainForm::FillCacheManagerFromUI()
{
for (cmCursesCacheEntryComposite& entry : this->Entries) {
const std::string& cacheKey = entry.Key;
- const char* existingValue =
+ cmProp existingValue =
this->CMakeInstance->GetState()->GetCacheEntryValue(cacheKey);
if (existingValue) {
- std::string oldValue = existingValue;
+ std::string oldValue = *existingValue;
std::string newValue = entry.Entry->GetValue();
std::string fixedOldValue;
std::string fixedNewValue;
@@ -802,9 +803,9 @@ void cmCursesMainForm::HandleInput()
cmCursesWidget* lbl = reinterpret_cast<cmCursesWidget*>(
field_userptr(this->Fields[findex - 2]));
const char* curField = lbl->GetValue();
- const char* helpString = nullptr;
+ cmProp helpString = nullptr;
- const char* existingValue =
+ cmProp existingValue =
this->CMakeInstance->GetState()->GetCacheEntryValue(curField);
if (existingValue) {
helpString = this->CMakeInstance->GetState()->GetCacheEntryProperty(
@@ -813,7 +814,7 @@ void cmCursesMainForm::HandleInput()
if (helpString) {
this->HelpMessage[1] =
cmStrCat("Current option is: ", curField, '\n',
- "Help string for this option is: ", helpString, '\n');
+ "Help string for this option is: ", *helpString, '\n');
} else {
this->HelpMessage[1] = "";
}
diff --git a/Source/CursesDialog/cmCursesOptionsWidget.cxx b/Source/CursesDialog/cmCursesOptionsWidget.cxx
index a15241f..8df32e2 100644
--- a/Source/CursesDialog/cmCursesOptionsWidget.cxx
+++ b/Source/CursesDialog/cmCursesOptionsWidget.cxx
@@ -17,8 +17,8 @@ cmCursesOptionsWidget::cmCursesOptionsWidget(int width, int height, int left,
// the widget into a string widget at some point. BOOL is safe for
// now.
if (cmCursesColor::HasColors()) {
- set_field_fore(this->Field, COLOR_PAIR(cmCursesColor::Options));
- set_field_back(this->Field, COLOR_PAIR(cmCursesColor::Options));
+ set_field_fore(this->Field, COLOR_PAIR(cmCursesColor::Choice));
+ set_field_back(this->Field, COLOR_PAIR(cmCursesColor::Choice));
} else {
set_field_fore(this->Field, A_NORMAL);
set_field_back(this->Field, A_STANDOUT);
diff --git a/Source/LexerParser/cmListFileLexer.c b/Source/LexerParser/cmListFileLexer.c
index 15dcda0..ec7424c 100644
--- a/Source/LexerParser/cmListFileLexer.c
+++ b/Source/LexerParser/cmListFileLexer.c
@@ -2787,7 +2787,7 @@ int cmListFileLexer_SetString(cmListFileLexer* lexer, const char* text)
/*--------------------------------------------------------------------------*/
cmListFileLexer_Token* cmListFileLexer_Scan(cmListFileLexer* lexer)
{
- if (!lexer->file) {
+ if (!lexer->file && !lexer->string_buffer) {
return 0;
}
if (cmListFileLexer_yylex(lexer->scanner, lexer)) {
@@ -2801,21 +2801,13 @@ cmListFileLexer_Token* cmListFileLexer_Scan(cmListFileLexer* lexer)
/*--------------------------------------------------------------------------*/
long cmListFileLexer_GetCurrentLine(cmListFileLexer* lexer)
{
- if (lexer->file) {
- return lexer->line;
- } else {
- return 0;
- }
+ return lexer->line;
}
/*--------------------------------------------------------------------------*/
long cmListFileLexer_GetCurrentColumn(cmListFileLexer* lexer)
{
- if (lexer->file) {
- return lexer->column;
- } else {
- return 0;
- }
+ return lexer->column;
}
/*--------------------------------------------------------------------------*/
diff --git a/Source/LexerParser/cmListFileLexer.in.l b/Source/LexerParser/cmListFileLexer.in.l
index fdf14d2..94cf8a5 100644
--- a/Source/LexerParser/cmListFileLexer.in.l
+++ b/Source/LexerParser/cmListFileLexer.in.l
@@ -500,7 +500,7 @@ int cmListFileLexer_SetString(cmListFileLexer* lexer, const char* text)
/*--------------------------------------------------------------------------*/
cmListFileLexer_Token* cmListFileLexer_Scan(cmListFileLexer* lexer)
{
- if (!lexer->file) {
+ if (!lexer->file && !lexer->string_buffer) {
return 0;
}
if (cmListFileLexer_yylex(lexer->scanner, lexer)) {
@@ -514,21 +514,13 @@ cmListFileLexer_Token* cmListFileLexer_Scan(cmListFileLexer* lexer)
/*--------------------------------------------------------------------------*/
long cmListFileLexer_GetCurrentLine(cmListFileLexer* lexer)
{
- if (lexer->file) {
- return lexer->line;
- } else {
- return 0;
- }
+ return lexer->line;
}
/*--------------------------------------------------------------------------*/
long cmListFileLexer_GetCurrentColumn(cmListFileLexer* lexer)
{
- if (lexer->file) {
- return lexer->column;
- } else {
- return 0;
- }
+ return lexer->column;
}
/*--------------------------------------------------------------------------*/
diff --git a/Source/QtDialog/CMakeSetup.cxx b/Source/QtDialog/CMakeSetup.cxx
index ee81a7d..9d928b2 100644
--- a/Source/QtDialog/CMakeSetup.cxx
+++ b/Source/QtDialog/CMakeSetup.cxx
@@ -201,8 +201,7 @@ int main(int argc, char** argv)
cmSystemTools::CollapseFullPath(args[1].toLocal8Bit().data());
// check if argument is a directory containing CMakeCache.txt
- std::string buildFilePath =
- cmSystemTools::CollapseFullPath("CMakeCache.txt", filePath.c_str());
+ std::string buildFilePath = cmStrCat(filePath, "/CMakeCache.txt");
// check if argument is a CMakeCache.txt file
if (cmSystemTools::GetFilenameName(filePath) == "CMakeCache.txt" &&
@@ -211,8 +210,7 @@ int main(int argc, char** argv)
}
// check if argument is a directory containing CMakeLists.txt
- std::string srcFilePath =
- cmSystemTools::CollapseFullPath("CMakeLists.txt", filePath.c_str());
+ std::string srcFilePath = cmStrCat(filePath, "/CMakeLists.txt");
if (cmSystemTools::FileExists(buildFilePath.c_str())) {
dialog.setBinaryDirectory(QString::fromLocal8Bit(
diff --git a/Source/QtDialog/CMakeSetupDialog.cxx b/Source/QtDialog/CMakeSetupDialog.cxx
index 436a904..930f300 100644
--- a/Source/QtDialog/CMakeSetupDialog.cxx
+++ b/Source/QtDialog/CMakeSetupDialog.cxx
@@ -2,6 +2,8 @@
file Copyright.txt or https://cmake.org/licensing for details. */
#include "CMakeSetupDialog.h"
+#include <cm/memory>
+
#include <QCloseEvent>
#include <QCoreApplication>
#include <QDesktopServices>
@@ -39,23 +41,21 @@
QCMakeThread::QCMakeThread(QObject* p)
: QThread(p)
- , CMakeInstance(nullptr)
{
}
QCMake* QCMakeThread::cmakeInstance() const
{
- return this->CMakeInstance;
+ return this->CMakeInstance.get();
}
void QCMakeThread::run()
{
- this->CMakeInstance = new QCMake;
+ this->CMakeInstance = cm::make_unique<QCMake>();
// emit that this cmake thread is ready for use
emit this->cmakeInitialized();
this->exec();
- delete this->CMakeInstance;
- this->CMakeInstance = nullptr;
+ this->CMakeInstance.reset();
}
CMakeSetupDialog::CMakeSetupDialog()
@@ -804,12 +804,19 @@ bool CMakeSetupDialog::setupFirstConfigure()
QString systemVersion = dialog.getSystemVersion();
m->insertProperty(QCMakeProperty::STRING, "CMAKE_SYSTEM_VERSION",
tr("CMake System Version"), systemVersion, false);
+ QString systemProcessor = dialog.getSystemProcessor();
+ m->insertProperty(QCMakeProperty::STRING, "CMAKE_SYSTEM_PROCESSOR",
+ tr("CMake System Processor"), systemProcessor, false);
QString cxxCompiler = dialog.getCXXCompiler();
- m->insertProperty(QCMakeProperty::FILEPATH, "CMAKE_CXX_COMPILER",
- tr("CXX compiler."), cxxCompiler, false);
+ if (!cxxCompiler.isEmpty()) {
+ m->insertProperty(QCMakeProperty::FILEPATH, "CMAKE_CXX_COMPILER",
+ tr("CXX compiler."), cxxCompiler, false);
+ }
QString cCompiler = dialog.getCCompiler();
- m->insertProperty(QCMakeProperty::FILEPATH, "CMAKE_C_COMPILER",
- tr("C compiler."), cCompiler, false);
+ if (!cCompiler.isEmpty()) {
+ m->insertProperty(QCMakeProperty::FILEPATH, "CMAKE_C_COMPILER",
+ tr("C compiler."), cCompiler, false);
+ }
} else if (dialog.crossCompilerToolChainFile()) {
QString toolchainFile = dialog.getCrossCompilerToolChainFile();
m->insertProperty(QCMakeProperty::FILEPATH, "CMAKE_TOOLCHAIN_FILE",
@@ -1206,7 +1213,7 @@ void CMakeSetupDialog::setSearchFilter(const QString& str)
void CMakeSetupDialog::doOutputContextMenu(QPoint pt)
{
- QMenu* menu = this->Output->createStandardContextMenu();
+ std::unique_ptr<QMenu> menu(this->Output->createStandardContextMenu());
menu->addSeparator();
menu->addAction(tr("Find..."), this, SLOT(doOutputFindDialog()),
@@ -1220,7 +1227,6 @@ void CMakeSetupDialog::doOutputContextMenu(QPoint pt)
QKeySequence(Qt::Key_F8));
menu->exec(this->Output->mapToGlobal(pt));
- delete menu;
}
void CMakeSetupDialog::doOutputFindDialog()
diff --git a/Source/QtDialog/CMakeSetupDialog.h b/Source/QtDialog/CMakeSetupDialog.h
index f23aee6..d1e2035 100644
--- a/Source/QtDialog/CMakeSetupDialog.h
+++ b/Source/QtDialog/CMakeSetupDialog.h
@@ -3,6 +3,8 @@
#ifndef CMakeSetupDialog_h
#define CMakeSetupDialog_h
+#include <memory>
+
#include "QCMake.h"
#include <QEventLoop>
#include <QMainWindow>
@@ -143,7 +145,7 @@ signals:
protected:
virtual void run();
- QCMake* CMakeInstance;
+ std::unique_ptr<QCMake> CMakeInstance;
};
#endif // CMakeSetupDialog_h
diff --git a/Source/QtDialog/FirstConfigure.cxx b/Source/QtDialog/FirstConfigure.cxx
index ca28b19..3c24b9b 100644
--- a/Source/QtDialog/FirstConfigure.cxx
+++ b/Source/QtDialog/FirstConfigure.cxx
@@ -10,8 +10,12 @@
#include "Compilers.h"
-StartCompilerSetup::StartCompilerSetup(QWidget* p)
+StartCompilerSetup::StartCompilerSetup(QString defaultGeneratorPlatform,
+ QString defaultGeneratorToolset,
+ QWidget* p)
: QWizardPage(p)
+ , DefaultGeneratorPlatform(std::move(defaultGeneratorPlatform))
+ , DefaultGeneratorToolset(std::move(defaultGeneratorToolset))
{
QVBoxLayout* l = new QVBoxLayout(this);
l->addWidget(new QLabel(tr("Specify the generator for this project")));
@@ -68,6 +72,10 @@ QFrame* StartCompilerSetup::CreateToolsetWidgets()
Toolset = new QLineEdit(frame);
l->addWidget(Toolset);
+ // Default to CMAKE_GENERATOR_TOOLSET env var if set
+ if (!DefaultGeneratorToolset.isEmpty()) {
+ this->Toolset->setText(DefaultGeneratorToolset);
+ }
return frame;
}
@@ -199,6 +207,14 @@ void StartCompilerSetup::onGeneratorChanged(QString const& name)
this->PlatformOptions->addItems(platform_list);
PlatformFrame->show();
+
+ // Default to generator platform from environment
+ if (!DefaultGeneratorPlatform.isEmpty()) {
+ int platform_index = platforms.indexOf(DefaultGeneratorPlatform);
+ if (platform_index != -1) {
+ this->PlatformOptions->setCurrentIndex(platform_index);
+ }
+ }
} else {
PlatformFrame->hide();
}
@@ -421,8 +437,26 @@ void ToolchainCompilerSetup::setToolchainFile(const QString& t)
FirstConfigure::FirstConfigure()
{
+ const char* env_generator = std::getenv("CMAKE_GENERATOR");
+ const char* env_generator_platform = nullptr;
+ const char* env_generator_toolset = nullptr;
+ if (env_generator && std::strlen(env_generator)) {
+ mDefaultGenerator = env_generator;
+ env_generator_platform = std::getenv("CMAKE_GENERATOR_PLATFORM");
+ env_generator_toolset = std::getenv("CMAKE_GENERATOR_TOOLSET");
+ }
+
+ if (!env_generator_platform) {
+ env_generator_platform = "";
+ }
+
+ if (!env_generator_toolset) {
+ env_generator_toolset = "";
+ }
+
// this->setOption(QWizard::HaveFinishButtonOnEarlyPages, true);
- this->mStartCompilerSetupPage = new StartCompilerSetup(this);
+ this->mStartCompilerSetupPage = new StartCompilerSetup(
+ env_generator_platform, env_generator_toolset, this);
this->setPage(Start, this->mStartCompilerSetupPage);
QObject::connect(this->mStartCompilerSetupPage, SIGNAL(selectionChanged()),
this, SLOT(restart()));
@@ -504,6 +538,17 @@ void FirstConfigure::loadFromSettings()
this->mCrossCompilerSetupPage->setIncludeMode(
settings.value("IncludeMode", 0).toInt());
settings.endGroup();
+
+ // environment variables take precedence over application settings because...
+ // - they're harder to set
+ // - settings always exist after the program is run once, so the environment
+ // variables would never be used otherwise
+ // - platform and toolset are populated only from environment variables, so
+ // this prevents them from being taken from environment, while the
+ // generator is taken from application settings
+ if (!mDefaultGenerator.isEmpty()) {
+ this->mStartCompilerSetupPage->setCurrentGenerator(mDefaultGenerator);
+ }
}
void FirstConfigure::saveToSettings()
diff --git a/Source/QtDialog/FirstConfigure.h b/Source/QtDialog/FirstConfigure.h
index d1db5bf..c26f489 100644
--- a/Source/QtDialog/FirstConfigure.h
+++ b/Source/QtDialog/FirstConfigure.h
@@ -29,7 +29,8 @@ class StartCompilerSetup : public QWizardPage
{
Q_OBJECT
public:
- StartCompilerSetup(QWidget* p);
+ StartCompilerSetup(QString defaultGeneratorPlatform,
+ QString defaultGeneratorToolset, QWidget* p);
~StartCompilerSetup();
void setGenerators(std::vector<cmake::GeneratorInfo> const& gens);
void setCurrentGenerator(const QString& gen);
@@ -64,6 +65,7 @@ protected:
QStringList GeneratorsSupportingPlatform;
QMultiMap<QString, QString> GeneratorSupportedPlatforms;
QMap<QString, QString> GeneratorDefaultPlatform;
+ QString DefaultGeneratorPlatform, DefaultGeneratorToolset;
private:
QFrame* CreateToolsetWidgets();
@@ -197,6 +199,7 @@ protected:
NativeCompilerSetup* mNativeCompilerSetupPage;
CrossCompilerSetup* mCrossCompilerSetupPage;
ToolchainCompilerSetup* mToolchainCompilerSetupPage;
+ QString mDefaultGenerator;
};
#endif // FirstConfigure_h
diff --git a/Source/QtDialog/QCMake.cxx b/Source/QtDialog/QCMake.cxx
index a9089e5..776af81 100644
--- a/Source/QtDialog/QCMake.cxx
+++ b/Source/QtDialog/QCMake.cxx
@@ -2,6 +2,8 @@
file Copyright.txt or https://cmake.org/licensing for details. */
#include "QCMake.h"
+#include <cm/memory>
+
#include <QCoreApplication>
#include <QDir>
@@ -35,7 +37,8 @@ QCMake::QCMake(QObject* p)
cmSystemTools::SetStderrCallback(
[this](std::string const& msg) { this->stderrCallback(msg); });
- this->CMakeInstance = new cmake(cmake::RoleProject, cmState::Project);
+ this->CMakeInstance =
+ cm::make_unique<cmake>(cmake::RoleProject, cmState::Project);
this->CMakeInstance->SetCMakeEditCommand(
cmSystemTools::GetCMakeGUICommand());
this->CMakeInstance->SetProgressCallback(
@@ -55,11 +58,7 @@ QCMake::QCMake(QObject* p)
}
}
-QCMake::~QCMake()
-{
- delete this->CMakeInstance;
- // cmDynamicLoader::FlushCache();
-}
+QCMake::~QCMake() = default;
void QCMake::loadCache(const QString& dir)
{
@@ -101,29 +100,28 @@ void QCMake::setBinaryDirectory(const QString& _dir)
QCMakePropertyList props = this->properties();
emit this->propertiesChanged(props);
- const char* homeDir = state->GetCacheEntryValue("CMAKE_HOME_DIRECTORY");
+ cmProp homeDir = state->GetCacheEntryValue("CMAKE_HOME_DIRECTORY");
if (homeDir) {
- setSourceDirectory(QString::fromLocal8Bit(homeDir));
+ setSourceDirectory(QString::fromLocal8Bit(homeDir->c_str()));
}
- const char* gen = state->GetCacheEntryValue("CMAKE_GENERATOR");
+ cmProp gen = state->GetCacheEntryValue("CMAKE_GENERATOR");
if (gen) {
const std::string* extraGen =
state->GetInitializedCacheValue("CMAKE_EXTRA_GENERATOR");
std::string curGen =
cmExternalMakefileProjectGenerator::CreateFullGeneratorName(
- gen, extraGen ? *extraGen : "");
+ *gen, extraGen ? *extraGen : "");
this->setGenerator(QString::fromLocal8Bit(curGen.c_str()));
}
- const char* platform =
- state->GetCacheEntryValue("CMAKE_GENERATOR_PLATFORM");
+ cmProp platform = state->GetCacheEntryValue("CMAKE_GENERATOR_PLATFORM");
if (platform) {
- this->setPlatform(QString::fromLocal8Bit(platform));
+ this->setPlatform(QString::fromLocal8Bit(platform->c_str()));
}
- const char* toolset = state->GetCacheEntryValue("CMAKE_GENERATOR_TOOLSET");
+ cmProp toolset = state->GetCacheEntryValue("CMAKE_GENERATOR_TOOLSET");
if (toolset) {
- this->setToolset(QString::fromLocal8Bit(toolset));
+ this->setToolset(QString::fromLocal8Bit(toolset->c_str()));
}
checkOpenPossible();
@@ -304,27 +302,28 @@ QCMakePropertyList QCMake::properties() const
continue;
}
- const char* cachedValue = state->GetCacheEntryValue(key);
+ cmProp cachedValue = state->GetCacheEntryValue(key);
QCMakeProperty prop;
prop.Key = QString::fromLocal8Bit(key.c_str());
- prop.Help =
- QString::fromLocal8Bit(state->GetCacheEntryProperty(key, "HELPSTRING"));
- prop.Value = QString::fromLocal8Bit(cachedValue);
+ if (cmProp hs = state->GetCacheEntryProperty(key, "HELPSTRING")) {
+ prop.Help = QString::fromLocal8Bit(hs->c_str());
+ }
+ prop.Value = QString::fromLocal8Bit(cachedValue->c_str());
prop.Advanced = state->GetCacheEntryPropertyAsBool(key, "ADVANCED");
if (t == cmStateEnums::BOOL) {
prop.Type = QCMakeProperty::BOOL;
- prop.Value = cmIsOn(cachedValue);
+ prop.Value = cmIsOn(*cachedValue);
} else if (t == cmStateEnums::PATH) {
prop.Type = QCMakeProperty::PATH;
} else if (t == cmStateEnums::FILEPATH) {
prop.Type = QCMakeProperty::FILEPATH;
} else if (t == cmStateEnums::STRING) {
prop.Type = QCMakeProperty::STRING;
- const char* stringsProperty =
- state->GetCacheEntryProperty(key, "STRINGS");
+ cmProp stringsProperty = state->GetCacheEntryProperty(key, "STRINGS");
if (stringsProperty) {
- prop.Strings = QString::fromLocal8Bit(stringsProperty).split(";");
+ prop.Strings =
+ QString::fromLocal8Bit(stringsProperty->c_str()).split(";");
}
}
diff --git a/Source/QtDialog/QCMake.h b/Source/QtDialog/QCMake.h
index fa4451b..110a971 100644
--- a/Source/QtDialog/QCMake.h
+++ b/Source/QtDialog/QCMake.h
@@ -12,6 +12,7 @@
# pragma warning(disable : 4512)
#endif
+#include <memory>
#include <vector>
#include <QAtomicInt>
@@ -165,7 +166,7 @@ signals:
void openPossible(bool possible);
protected:
- cmake* CMakeInstance;
+ std::unique_ptr<cmake> CMakeInstance;
bool interruptCallback();
void progressCallback(std::string const& msg, float percent);
diff --git a/Source/bindexplib.cxx b/Source/bindexplib.cxx
index 0b2750d..8435740 100644
--- a/Source/bindexplib.cxx
+++ b/Source/bindexplib.cxx
@@ -64,7 +64,7 @@
*/
#include "bindexplib.h"
-#include <cstddef>
+#include <cstddef> // IWYU pragma: keep
#include <sstream>
#include <vector>
@@ -276,8 +276,9 @@ public:
symbol.compare(0, 4, vectorPrefix)) {
SectChar = this->SectionHeaders[pSymbolTable->SectionNumber - 1]
.Characteristics;
- // skip symbols containing a dot
- if (symbol.find('.') == std::string::npos) {
+ // skip symbols containing a dot or are from managed code
+ if (symbol.find('.') == std::string::npos &&
+ !SymbolIsFromManagedCode(symbol)) {
if (!pSymbolTable->Type && (SectChar & IMAGE_SCN_MEM_WRITE)) {
// Read only (i.e. constants) must be excluded
this->DataSymbols.insert(symbol);
@@ -302,6 +303,13 @@ public:
}
private:
+ bool SymbolIsFromManagedCode(std::string const& symbol)
+ {
+ return symbol == "__t2m" || symbol == "__m2mep" || symbol == "__mep" ||
+ symbol.find("$$F") != std::string::npos ||
+ symbol.find("$$J") != std::string::npos;
+ }
+
std::set<std::string>& Symbols;
std::set<std::string>& DataSymbols;
DWORD_PTR SymbolCount;
@@ -352,14 +360,14 @@ bool DumpFileWithLlvmNm(std::string const& nmPath, const char* filename,
line.c_str());
return false;
}
- const std::string sym = line.substr(0, sym_end);
const char sym_type = line[sym_end + 1];
+ line.resize(sym_end);
switch (sym_type) {
case 'D':
- dataSymbols.insert(sym);
+ dataSymbols.insert(line);
break;
case 'T':
- symbols.insert(sym);
+ symbols.insert(line);
break;
}
}
diff --git a/Source/cmAddSubDirectoryCommand.cxx b/Source/cmAddSubDirectoryCommand.cxx
index 35eabaf..83d6306 100644
--- a/Source/cmAddSubDirectoryCommand.cxx
+++ b/Source/cmAddSubDirectoryCommand.cxx
@@ -4,6 +4,8 @@
#include <cstring>
+#include <cm/string_view>
+
#include "cmExecutionStatus.h"
#include "cmMakefile.h"
#include "cmRange.h"
@@ -86,7 +88,8 @@ bool cmAddSubDirectoryCommand(std::vector<std::string> const& args,
if (binLen > 0 && bin.back() == '/') {
--binLen;
}
- binPath = bin.substr(0, binLen) + srcPath.substr(srcLen);
+ binPath = cmStrCat(cm::string_view(bin).substr(0, binLen),
+ cm::string_view(srcPath).substr(srcLen));
} else {
// Use the binary directory specified.
// Interpret a relative path with respect to the current binary directory.
diff --git a/Source/cmAffinity.cxx b/Source/cmAffinity.cxx
index 8f9fe2a..35443e7 100644
--- a/Source/cmAffinity.cxx
+++ b/Source/cmAffinity.cxx
@@ -2,7 +2,7 @@
file Copyright.txt or https://cmake.org/licensing for details. */
#include "cmAffinity.h"
-#include "cm_uv.h"
+#include <cm3p/uv.h>
#ifndef CMAKE_USE_SYSTEM_LIBUV
# ifdef _WIN32
diff --git a/Source/cmAlgorithms.h b/Source/cmAlgorithms.h
index c0ac551..c8e8dcb 100644
--- a/Source/cmAlgorithms.h
+++ b/Source/cmAlgorithms.h
@@ -13,20 +13,10 @@
#include <utility>
#include <vector>
-#include "cm_kwiml.h"
+#include <cmext/algorithm>
#include "cmRange.h"
-template <std::size_t N>
-struct cmOverloadPriority : cmOverloadPriority<N - 1>
-{
-};
-
-template <>
-struct cmOverloadPriority<0>
-{
-};
-
template <typename FwdIt>
FwdIt cmRotate(FwdIt first, FwdIt middle, FwdIt last)
{
@@ -37,34 +27,6 @@ FwdIt cmRotate(FwdIt first, FwdIt middle, FwdIt last)
return first;
}
-template <typename Range, typename Key>
-auto cmContainsImpl(Range const& range, Key const& key, cmOverloadPriority<2>)
- -> decltype(range.exists(key))
-{
- return range.exists(key);
-}
-
-template <typename Range, typename Key>
-auto cmContainsImpl(Range const& range, Key const& key, cmOverloadPriority<1>)
- -> decltype(range.find(key) != range.end())
-{
- return range.find(key) != range.end();
-}
-
-template <typename Range, typename Key>
-bool cmContainsImpl(Range const& range, Key const& key, cmOverloadPriority<0>)
-{
- using std::begin;
- using std::end;
- return std::find(begin(range), end(range), key) != end(range);
-}
-
-template <typename Range, typename Key>
-bool cmContains(Range const& range, Key const& key)
-{
- return cmContainsImpl(range, key, cmOverloadPriority<2>{});
-}
-
namespace ContainerAlgorithms {
template <typename FwdIt>
@@ -158,7 +120,7 @@ ForwardIterator cmRemoveDuplicates(ForwardIterator first, ForwardIterator last)
ForwardIterator result = first;
while (first != last) {
- if (!cmContains(uniq, first)) {
+ if (!cm::contains(uniq, first)) {
if (result != first) {
*result = std::move(*first);
}
diff --git a/Source/cmArchiveWrite.cxx b/Source/cmArchiveWrite.cxx
index d29b2ac..78bb6e0 100644
--- a/Source/cmArchiveWrite.cxx
+++ b/Source/cmArchiveWrite.cxx
@@ -7,12 +7,14 @@
#include <iostream>
#include <sstream>
+#include <cm3p/archive.h>
+#include <cm3p/archive_entry.h>
+
#include "cmsys/Directory.hxx"
#include "cmsys/Encoding.hxx"
#include "cmsys/FStream.hxx"
#include "cm_get_date.h"
-#include "cm_libarchive.h"
#include "cmLocale.h"
#include "cmStringAlgorithms.h"
@@ -170,15 +172,19 @@ cmArchiveWrite::cmArchiveWrite(std::ostream& os, Compress c,
cm_archive_error_string(this->Archive));
return;
}
+}
+bool cmArchiveWrite::Open()
+{
if (archive_write_open(
this->Archive, this, nullptr,
reinterpret_cast<archive_write_callback*>(&Callback::Write),
nullptr) != ARCHIVE_OK) {
this->Error =
cmStrCat("archive_write_open: ", cm_archive_error_string(this->Archive));
- return;
+ return false;
}
+ return true;
}
cmArchiveWrite::~cmArchiveWrite()
@@ -365,3 +371,16 @@ bool cmArchiveWrite::AddData(const char* file, size_t size)
}
return true;
}
+
+bool cmArchiveWrite::SetFilterOption(const char* module, const char* key,
+ const char* value)
+{
+ if (archive_write_set_filter_option(this->Archive, module, key, value) !=
+ ARCHIVE_OK) {
+ this->Error = "archive_write_set_filter_option: ";
+ this->Error += cm_archive_error_string(this->Archive);
+ return false;
+ }
+
+ return true;
+}
diff --git a/Source/cmArchiveWrite.h b/Source/cmArchiveWrite.h
index e791761..b643bce 100644
--- a/Source/cmArchiveWrite.h
+++ b/Source/cmArchiveWrite.h
@@ -62,6 +62,8 @@ public:
cmArchiveWrite(const cmArchiveWrite&) = delete;
cmArchiveWrite& operator=(const cmArchiveWrite&) = delete;
+ bool Open();
+
/**
* Add a path (file or directory) to the archive. Directories are
* added recursively. The "path" must be readable on disk, either
@@ -139,6 +141,9 @@ public:
this->Gname = "";
}
+ //! Set an option on a filter;
+ bool SetFilterOption(const char* module, const char* key, const char* value);
+
private:
bool Okay() const { return this->Error.empty(); }
bool AddPath(const char* path, size_t skip, const char* prefix,
diff --git a/Source/cmArgumentParser.cxx b/Source/cmArgumentParser.cxx
index 4c87177..4624f1c 100644
--- a/Source/cmArgumentParser.cxx
+++ b/Source/cmArgumentParser.cxx
@@ -3,7 +3,6 @@
#include "cmArgumentParser.h"
#include <algorithm>
-#include <type_traits>
namespace ArgumentParser {
diff --git a/Source/cmArgumentParser.h b/Source/cmArgumentParser.h
index 9426537..5d2dfa2 100644
--- a/Source/cmArgumentParser.h
+++ b/Source/cmArgumentParser.h
@@ -12,8 +12,7 @@
#include <vector>
#include <cm/string_view>
-
-#include "cm_static_string_view.hxx"
+#include <cmext/string_view>
namespace ArgumentParser {
diff --git a/Source/cmAuxSourceDirectoryCommand.cxx b/Source/cmAuxSourceDirectoryCommand.cxx
index 289bb72..d6f7500e 100644
--- a/Source/cmAuxSourceDirectoryCommand.cxx
+++ b/Source/cmAuxSourceDirectoryCommand.cxx
@@ -6,6 +6,8 @@
#include <cstddef>
#include <utility>
+#include <cm/string_view>
+
#include "cmsys/Directory.hxx"
#include "cmExecutionStatus.h"
@@ -50,11 +52,10 @@ bool cmAuxSourceDirectoryCommand(std::vector<std::string> const& args,
// Split the filename into base and extension
std::string::size_type dotpos = file.rfind('.');
if (dotpos != std::string::npos) {
- std::string ext = file.substr(dotpos + 1);
- std::string base = file.substr(0, dotpos);
+ auto ext = cm::string_view(file).substr(dotpos + 1);
// Process only source files
auto cm = mf.GetCMakeInstance();
- if (!base.empty() && cm->IsSourceExtension(ext)) {
+ if (dotpos > 0 && cm->IsSourceExtension(ext)) {
std::string fullname = cmStrCat(templateDirectory, '/', file);
// add the file as a class file so
// depends can be done
diff --git a/Source/cmBinUtilsLinuxELFLinker.cxx b/Source/cmBinUtilsLinuxELFLinker.cxx
index 0dea825..9ce403d 100644
--- a/Source/cmBinUtilsLinuxELFLinker.cxx
+++ b/Source/cmBinUtilsLinuxELFLinker.cxx
@@ -6,6 +6,7 @@
#include <sstream>
#include <cm/memory>
+#include <cm/string_view>
#include <cmsys/RegularExpression.hxx>
@@ -26,14 +27,16 @@ static std::string ReplaceOrigin(const std::string& rpath,
cmsys::RegularExpressionMatch match;
if (originRegex.find(rpath.c_str(), match)) {
- std::string begin = rpath.substr(0, match.start(1));
- std::string end = rpath.substr(match.end(1));
- return begin + origin + end;
+ cm::string_view pathv(rpath);
+ auto begin = pathv.substr(0, match.start(1));
+ auto end = pathv.substr(match.end(1));
+ return cmStrCat(begin, origin, end);
}
if (originCurlyRegex.find(rpath.c_str(), match)) {
- std::string begin = rpath.substr(0, match.start());
- std::string end = rpath.substr(match.end());
- return begin + origin + end;
+ cm::string_view pathv(rpath);
+ auto begin = pathv.substr(0, match.start());
+ auto end = pathv.substr(match.end());
+ return cmStrCat(begin, origin, end);
}
return rpath;
}
diff --git a/Source/cmBuildCommand.cxx b/Source/cmBuildCommand.cxx
index 49c9439..b82fb9a 100644
--- a/Source/cmBuildCommand.cxx
+++ b/Source/cmBuildCommand.cxx
@@ -108,7 +108,7 @@ bool TwoArgsSignature(std::vector<std::string> const& args,
if (cacheValue) {
return true;
}
- mf.AddCacheDefinition(define, makecommand.c_str(),
+ mf.AddCacheDefinition(define, makecommand,
"Command used to build entire project "
"from the command line.",
cmStateEnums::STRING);
diff --git a/Source/cmBuildNameCommand.cxx b/Source/cmBuildNameCommand.cxx
index 3e517dc..ad4d665 100644
--- a/Source/cmBuildNameCommand.cxx
+++ b/Source/cmBuildNameCommand.cxx
@@ -28,7 +28,7 @@ bool cmBuildNameCommand(std::vector<std::string> const& args,
std::replace(cv.begin(), cv.end(), '/', '_');
std::replace(cv.begin(), cv.end(), '(', '_');
std::replace(cv.begin(), cv.end(), ')', '_');
- mf.AddCacheDefinition(args[0], cv.c_str(), "Name of build.",
+ mf.AddCacheDefinition(args[0], cv, "Name of build.",
cmStateEnums::STRING);
}
return true;
@@ -54,7 +54,7 @@ bool cmBuildNameCommand(std::vector<std::string> const& args,
std::replace(buildname.begin(), buildname.end(), '(', '_');
std::replace(buildname.begin(), buildname.end(), ')', '_');
- mf.AddCacheDefinition(args[0], buildname.c_str(), "Name of build.",
+ mf.AddCacheDefinition(args[0], buildname, "Name of build.",
cmStateEnums::STRING);
return true;
}
diff --git a/Source/cmCMakeCommand.cxx b/Source/cmCMakeCommand.cxx
new file mode 100644
index 0000000..23bc0ea
--- /dev/null
+++ b/Source/cmCMakeCommand.cxx
@@ -0,0 +1,111 @@
+/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
+ file Copyright.txt or https://cmake.org/licensing for details. */
+#include "cmCMakeCommand.h"
+
+#include <algorithm>
+#include <cstddef>
+#include <memory>
+#include <string>
+
+#include "cmExecutionStatus.h"
+#include "cmListFileCache.h"
+#include "cmMakefile.h"
+#include "cmRange.h"
+#include "cmStringAlgorithms.h"
+
+bool cmCMakeCommand(std::vector<cmListFileArgument> const& args,
+ cmExecutionStatus& status)
+{
+ if (args.empty()) {
+ status.SetError("called with incorrect number of arguments");
+ return false;
+ }
+
+ cmMakefile& makefile = status.GetMakefile();
+ cmListFileContext context = makefile.GetExecutionContext();
+
+ bool result = false;
+
+ std::vector<std::string> dispatchExpandedArgs;
+ std::vector<cmListFileArgument> dispatchArgs;
+ dispatchArgs.emplace_back(args[0]);
+ makefile.ExpandArguments(dispatchArgs, dispatchExpandedArgs);
+
+ if (dispatchExpandedArgs.empty()) {
+ status.SetError("called with incorrect number of arguments");
+ return false;
+ }
+
+ if (dispatchExpandedArgs[0] == "INVOKE") {
+ if ((args.size() == 1 && dispatchExpandedArgs.size() != 2) ||
+ dispatchExpandedArgs.size() > 2) {
+ status.SetError("called with incorrect number of arguments");
+ return false;
+ }
+
+ // First argument is the name of the function to call
+ std::string invokeCommand;
+ size_t startArg;
+ if (dispatchExpandedArgs.size() == 1) {
+ std::vector<std::string> functionExpandedArg;
+ std::vector<cmListFileArgument> functionArg;
+ functionArg.emplace_back(args[1]);
+ makefile.ExpandArguments(functionArg, functionExpandedArg);
+
+ if (functionExpandedArg.size() != 1) {
+ status.SetError("called with incorrect number of arguments");
+ return false;
+ }
+
+ invokeCommand = functionExpandedArg[0];
+ startArg = 2;
+ } else {
+ invokeCommand = dispatchExpandedArgs[1];
+ startArg = 1;
+ }
+
+ cmListFileFunction func;
+ func.Name = invokeCommand;
+ func.Line = context.Line;
+
+ // The rest of the arguments are passed to the function call above
+ for (size_t i = startArg; i < args.size(); ++i) {
+ cmListFileArgument lfarg;
+ lfarg.Delim = args[i].Delim;
+ lfarg.Line = context.Line;
+ lfarg.Value = args[i].Value;
+ func.Arguments.emplace_back(lfarg);
+ }
+
+ result = makefile.ExecuteCommand(func, status);
+ } else if (dispatchExpandedArgs[0] == "EVAL") {
+ std::vector<std::string> expandedArgs;
+ makefile.ExpandArguments(args, expandedArgs);
+
+ if (expandedArgs.size() < 2) {
+ status.SetError("called with incorrect number of arguments");
+ return false;
+ }
+
+ if (expandedArgs[1] != "CODE") {
+ auto code_iter =
+ std::find(expandedArgs.begin() + 2, expandedArgs.end(), "CODE");
+ if (code_iter == expandedArgs.end()) {
+ status.SetError("called without CODE argument");
+ } else {
+ status.SetError(
+ "called with unsupported arguments between EVAL and CODE arguments");
+ }
+ return false;
+ }
+
+ const std::string code =
+ cmJoin(cmMakeRange(expandedArgs.begin() + 2, expandedArgs.end()), " ");
+ result = makefile.ReadListFileAsString(
+ code, cmStrCat(context.FilePath, ":", context.Line, ":EVAL"));
+ } else {
+ status.SetError("called with unknown meta-operation");
+ }
+
+ return result;
+}
diff --git a/Source/cmCMakeCommand.h b/Source/cmCMakeCommand.h
new file mode 100644
index 0000000..7dbecff
--- /dev/null
+++ b/Source/cmCMakeCommand.h
@@ -0,0 +1,20 @@
+/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
+ file Copyright.txt or https://cmake.org/licensing for details. */
+#ifndef cmCMakeCommand_h
+#define cmCMakeCommand_h
+
+#include "cmConfigure.h" // IWYU pragma: keep
+
+#include <vector>
+
+class cmExecutionStatus;
+struct cmListFileArgument;
+
+/**
+ * \brief Calls a scripted or build-in command
+ *
+ */
+bool cmCMakeCommand(std::vector<cmListFileArgument> const& args,
+ cmExecutionStatus& status);
+
+#endif
diff --git a/Source/cmCPluginAPI.cxx b/Source/cmCPluginAPI.cxx
index b5c7e96..697d435 100644
--- a/Source/cmCPluginAPI.cxx
+++ b/Source/cmCPluginAPI.cxx
@@ -488,24 +488,8 @@ struct cmCPluginAPISourceFile
// Keep a map from real cmSourceFile instances stored in a makefile to
// the CPluginAPI proxy source file.
-class cmCPluginAPISourceFileMap
- : public std::map<cmSourceFile*, cmCPluginAPISourceFile*>
-{
-public:
- using derived = std::map<cmSourceFile*, cmCPluginAPISourceFile*>;
- using iterator = derived::iterator;
- using value_type = derived::value_type;
- cmCPluginAPISourceFileMap() = default;
- ~cmCPluginAPISourceFileMap()
- {
- for (auto const& i : *this) {
- delete i.second;
- }
- }
- cmCPluginAPISourceFileMap(const cmCPluginAPISourceFileMap&) = delete;
- cmCPluginAPISourceFileMap& operator=(const cmCPluginAPISourceFileMap&) =
- delete;
-};
+using cmCPluginAPISourceFileMap =
+ std::map<cmSourceFile*, std::unique_ptr<cmCPluginAPISourceFile>>;
cmCPluginAPISourceFileMap cmCPluginAPISourceFiles;
void* CCONV cmCreateSourceFile(void)
@@ -536,7 +520,7 @@ void CCONV* cmGetSource(void* arg, const char* name)
auto i = cmCPluginAPISourceFiles.find(rsf);
if (i == cmCPluginAPISourceFiles.end()) {
// Create a proxy source file object for this source.
- cmCPluginAPISourceFile* sf = new cmCPluginAPISourceFile;
+ auto sf = cm::make_unique<cmCPluginAPISourceFile>();
sf->RealSourceFile = rsf;
sf->FullPath = rsf->ResolveFullPath();
sf->SourceName =
@@ -545,10 +529,9 @@ void CCONV* cmGetSource(void* arg, const char* name)
cmSystemTools::GetFilenameLastExtension(sf->FullPath);
// Store the proxy in the map so it can be re-used and deleted later.
- cmCPluginAPISourceFileMap::value_type entry(rsf, sf);
- i = cmCPluginAPISourceFiles.insert(entry).first;
+ i = cmCPluginAPISourceFiles.emplace(rsf, std::move(sf)).first;
}
- return i->second;
+ return i->second.get();
}
return nullptr;
}
@@ -569,15 +552,16 @@ void* CCONV cmAddSource(void* arg, void* arg2)
}
// Create the proxy for the real source file.
- cmCPluginAPISourceFile* sf = new cmCPluginAPISourceFile;
+ auto sf = cm::make_unique<cmCPluginAPISourceFile>();
sf->RealSourceFile = rsf;
sf->FullPath = osf->FullPath;
sf->SourceName = osf->SourceName;
sf->SourceExtension = osf->SourceExtension;
// Store the proxy in the map so it can be re-used and deleted later.
- cmCPluginAPISourceFiles[rsf] = sf;
- return sf;
+ auto value = sf.get();
+ cmCPluginAPISourceFiles[rsf] = std::move(sf);
+ return value;
}
const char* CCONV cmSourceFileGetSourceName(void* arg)
@@ -596,12 +580,14 @@ const char* CCONV cmSourceFileGetProperty(void* arg, const char* prop)
{
cmCPluginAPISourceFile* sf = static_cast<cmCPluginAPISourceFile*>(arg);
if (cmSourceFile* rsf = sf->RealSourceFile) {
- return rsf->GetProperty(prop);
+ cmProp p = rsf->GetProperty(prop);
+ return p ? p->c_str() : nullptr;
}
if (!strcmp(prop, "LOCATION")) {
return sf->FullPath.c_str();
}
- return sf->Properties.GetPropertyValue(prop);
+ cmProp retVal = sf->Properties.GetPropertyValue(prop);
+ return retVal ? retVal->c_str() : nullptr;
}
int CCONV cmSourceFileGetPropertyAsBool(void* arg, const char* prop)
@@ -791,8 +777,9 @@ void CCONV DefineSourceFileProperty(void* arg, const char* name,
const char* longDocs, int chained)
{
cmMakefile* mf = static_cast<cmMakefile*>(arg);
- mf->GetState()->DefineProperty(name, cmProperty::SOURCE_FILE, briefDocs,
- longDocs, chained != 0);
+ mf->GetState()->DefineProperty(name, cmProperty::SOURCE_FILE,
+ briefDocs ? briefDocs : "",
+ longDocs ? longDocs : "", chained != 0);
}
} // close the extern "C" scope
diff --git a/Source/cmCTest.cxx b/Source/cmCTest.cxx
index 04f75bd..9b023d9 100644
--- a/Source/cmCTest.cxx
+++ b/Source/cmCTest.cxx
@@ -16,6 +16,14 @@
#include <utility>
#include <vector>
+#include <cm/memory>
+#include <cm/string_view>
+#include <cmext/algorithm>
+#include <cmext/string_view>
+
+#include <cm3p/curl/curl.h>
+#include <cm3p/zlib.h>
+
#include "cmsys/Base64.h"
#include "cmsys/Directory.hxx"
#include "cmsys/FStream.hxx"
@@ -23,18 +31,12 @@
#include "cmsys/Process.h"
#include "cmsys/RegularExpression.hxx"
#include "cmsys/SystemInformation.hxx"
-
-#include "cm_curl.h"
-#include "cm_zlib.h"
#if defined(_WIN32)
# include <windows.h> // IWYU pragma: keep
#else
# include <unistd.h> // IWYU pragma: keep
#endif
-#include <cm/memory>
-#include <cmext/algorithm>
-
#include "cmCTestBuildAndTestHandler.h"
#include "cmCTestBuildHandler.h"
#include "cmCTestConfigureHandler.h"
@@ -89,6 +91,7 @@ struct cmCTest::Private
std::string ConfigType;
std::string ScheduleType;
std::chrono::system_clock::time_point StopTime;
+ bool StopOnFailure = false;
bool TestProgressOutput = false;
bool Verbose = false;
bool ExtraVerbose = false;
@@ -201,7 +204,7 @@ struct cmCTest::Private
int SubmitIndex = 0;
- cmGeneratedFileStream* OutputLogFile = nullptr;
+ std::unique_ptr<cmGeneratedFileStream> OutputLogFile;
int OutputLogFileLastTag = -1;
bool OutputTestOutputOnTestFailure = false;
@@ -271,9 +274,10 @@ bool cmCTest::GetTomorrowTag() const
return this->Impl->TomorrowTag;
}
-std::string cmCTest::CleanString(const std::string& str)
+std::string cmCTest::CleanString(const std::string& str,
+ std::string::size_type spos)
{
- std::string::size_type spos = str.find_first_not_of(" \n\t\r\f\v");
+ spos = str.find_first_not_of(" \n\t\r\f\v", spos);
std::string::size_type epos = str.find_last_not_of(" \n\t\r\f\v");
if (spos == std::string::npos) {
return std::string();
@@ -362,10 +366,7 @@ cmCTest::cmCTest()
cmSystemTools::EnableVSConsoleOutput();
}
-cmCTest::~cmCTest()
-{
- delete this->Impl->OutputLogFile;
-}
+cmCTest::~cmCTest() = default;
int cmCTest::GetParallelLevel() const
{
@@ -727,7 +728,7 @@ bool cmCTest::UpdateCTestConfiguration()
continue;
}
while (fin && (line.back() == '\\')) {
- line = line.substr(0, line.size() - 1);
+ line.resize(line.size() - 1);
buffer[0] = 0;
fin.getline(buffer, 1023);
buffer[1023] = 0;
@@ -741,7 +742,7 @@ bool cmCTest::UpdateCTestConfiguration()
continue;
}
std::string key = line.substr(0, cpos);
- std::string value = cmCTest::CleanString(line.substr(cpos + 1));
+ std::string value = cmCTest::CleanString(line, cpos + 1);
this->Impl->CTestConfiguration[key] = value;
}
fin.close();
@@ -1442,16 +1443,15 @@ void cmCTest::AddSiteProperties(cmXMLWriter& xml)
return;
}
// This code should go when cdash is changed to use labels only
- const char* subproject = cm->GetState()->GetGlobalProperty("SubProject");
+ cmProp subproject = cm->GetState()->GetGlobalProperty("SubProject");
if (subproject) {
xml.StartElement("Subproject");
- xml.Attribute("name", subproject);
- const char* labels =
+ xml.Attribute("name", *subproject);
+ cmProp labels =
ch->GetCMake()->GetState()->GetGlobalProperty("SubProjectLabels");
if (labels) {
xml.StartElement("Labels");
- std::string l = labels;
- std::vector<std::string> args = cmExpandedList(l);
+ std::vector<std::string> args = cmExpandedList(*labels);
for (std::string const& i : args) {
xml.Element("Label", i);
}
@@ -1461,10 +1461,10 @@ void cmCTest::AddSiteProperties(cmXMLWriter& xml)
}
// This code should stay when cdash only does label based sub-projects
- const char* label = cm->GetState()->GetGlobalProperty("Label");
+ cmProp label = cm->GetState()->GetGlobalProperty("Label");
if (label) {
xml.StartElement("Labels");
- xml.Element("Label", label);
+ xml.Element("Label", *label);
xml.EndElement();
}
}
@@ -1816,10 +1816,10 @@ void cmCTest::ErrorMessageUnknownDashDValue(std::string& val)
<< " ctest -D NightlyMemoryCheck" << std::endl);
}
-bool cmCTest::CheckArgument(const std::string& arg, const char* varg1,
+bool cmCTest::CheckArgument(const std::string& arg, cm::string_view varg1,
const char* varg2)
{
- return (varg1 && arg == varg1) || (varg2 && arg == varg2);
+ return (arg == varg1) || (varg2 && arg == varg2);
}
// Processes one command line argument (and its arguments if any)
@@ -1829,21 +1829,21 @@ bool cmCTest::HandleCommandLineArguments(size_t& i,
std::string& errormsg)
{
std::string arg = args[i];
- if (this->CheckArgument(arg, "-F")) {
+ if (this->CheckArgument(arg, "-F"_s)) {
this->Impl->Failover = true;
- }
- if (this->CheckArgument(arg, "-j", "--parallel") && i < args.size() - 1) {
+ } else if (this->CheckArgument(arg, "-j"_s, "--parallel") &&
+ i < args.size() - 1) {
i++;
int plevel = atoi(args[i].c_str());
this->SetParallelLevel(plevel);
this->Impl->ParallelLevelSetInCli = true;
- } else if (arg.find("-j") == 0) {
+ } else if (cmHasPrefix(arg, "-j")) {
int plevel = atoi(arg.substr(2).c_str());
this->SetParallelLevel(plevel);
this->Impl->ParallelLevelSetInCli = true;
}
- if (this->CheckArgument(arg, "--repeat-until-fail")) {
+ else if (this->CheckArgument(arg, "--repeat-until-fail"_s)) {
if (i >= args.size() - 1) {
errormsg = "'--repeat-until-fail' requires an argument";
return false;
@@ -1855,8 +1855,8 @@ bool cmCTest::HandleCommandLineArguments(size_t& i,
i++;
long repeat = 1;
if (!cmStrToLong(args[i], &repeat)) {
- errormsg =
- "'--repeat-until-fail' given non-integer value '" + args[i] + "'";
+ errormsg = cmStrCat("'--repeat-until-fail' given non-integer value '",
+ args[i], "'");
return false;
}
this->Impl->RepeatCount = static_cast<int>(repeat);
@@ -1865,7 +1865,7 @@ bool cmCTest::HandleCommandLineArguments(size_t& i,
}
}
- if (this->CheckArgument(arg, "--repeat")) {
+ else if (this->CheckArgument(arg, "--repeat"_s)) {
if (i >= args.size() - 1) {
errormsg = "'--repeat' requires an argument";
return false;
@@ -1893,12 +1893,12 @@ bool cmCTest::HandleCommandLineArguments(size_t& i,
}
}
} else {
- errormsg = "'--repeat' given invalid value '" + args[i] + "'";
+ errormsg = cmStrCat("'--repeat' given invalid value '", args[i], "'");
return false;
}
}
- if (this->CheckArgument(arg, "--test-load") && i < args.size() - 1) {
+ else if (this->CheckArgument(arg, "--test-load"_s) && i < args.size() - 1) {
i++;
unsigned long load;
if (cmStrToULong(args[i], &load)) {
@@ -1909,76 +1909,68 @@ bool cmCTest::HandleCommandLineArguments(size_t& i,
}
}
- if (this->CheckArgument(arg, "--no-compress-output")) {
+ else if (this->CheckArgument(arg, "--no-compress-output"_s)) {
this->Impl->CompressTestOutput = false;
}
- if (this->CheckArgument(arg, "--print-labels")) {
+ else if (this->CheckArgument(arg, "--print-labels"_s)) {
this->Impl->PrintLabels = true;
}
- if (this->CheckArgument(arg, "--http1.0")) {
+ else if (this->CheckArgument(arg, "--http1.0"_s)) {
this->Impl->UseHTTP10 = true;
}
- if (this->CheckArgument(arg, "--timeout") && i < args.size() - 1) {
+ else if (this->CheckArgument(arg, "--timeout"_s) && i < args.size() - 1) {
i++;
auto timeout = cmDuration(atof(args[i].c_str()));
this->Impl->GlobalTimeout = timeout;
}
- if (this->CheckArgument(arg, "--stop-time") && i < args.size() - 1) {
+ else if (this->CheckArgument(arg, "--stop-time"_s) && i < args.size() - 1) {
i++;
this->SetStopTime(args[i]);
}
- if (this->CheckArgument(arg, "-C", "--build-config") &&
- i < args.size() - 1) {
+ else if (this->CheckArgument(arg, "--stop-on-failure"_s)) {
+ this->Impl->StopOnFailure = true;
+ }
+
+ else if (this->CheckArgument(arg, "-C"_s, "--build-config") &&
+ i < args.size() - 1) {
i++;
this->SetConfigType(args[i].c_str());
}
- if (this->CheckArgument(arg, "--debug")) {
+ else if (this->CheckArgument(arg, "--debug"_s)) {
this->Impl->Debug = true;
this->Impl->ShowLineNumbers = true;
- }
- if (this->CheckArgument(arg, "--group") && i < args.size() - 1) {
+ } else if ((this->CheckArgument(arg, "--group"_s) ||
+ // This is an undocumented / deprecated option.
+ // "Track" has been renamed to "Group".
+ this->CheckArgument(arg, "--track"_s)) &&
+ i < args.size() - 1) {
i++;
this->Impl->SpecificGroup = args[i];
- }
- // This is an undocumented / deprecated option.
- // "Track" has been renamed to "Group".
- if (this->CheckArgument(arg, "--track") && i < args.size() - 1) {
- i++;
- this->Impl->SpecificGroup = args[i];
- }
- if (this->CheckArgument(arg, "--show-line-numbers")) {
+ } else if (this->CheckArgument(arg, "--show-line-numbers"_s)) {
this->Impl->ShowLineNumbers = true;
- }
- if (this->CheckArgument(arg, "--no-label-summary")) {
+ } else if (this->CheckArgument(arg, "--no-label-summary"_s)) {
this->Impl->LabelSummary = false;
- }
- if (this->CheckArgument(arg, "--no-subproject-summary")) {
+ } else if (this->CheckArgument(arg, "--no-subproject-summary"_s)) {
this->Impl->SubprojectSummary = false;
- }
- if (this->CheckArgument(arg, "-Q", "--quiet")) {
+ } else if (this->CheckArgument(arg, "-Q"_s, "--quiet")) {
this->Impl->Quiet = true;
- }
- if (this->CheckArgument(arg, "--progress")) {
+ } else if (this->CheckArgument(arg, "--progress"_s)) {
this->Impl->TestProgressOutput = true;
- }
- if (this->CheckArgument(arg, "-V", "--verbose")) {
+ } else if (this->CheckArgument(arg, "-V"_s, "--verbose")) {
this->Impl->Verbose = true;
- }
- if (this->CheckArgument(arg, "-VV", "--extra-verbose")) {
+ } else if (this->CheckArgument(arg, "-VV"_s, "--extra-verbose")) {
this->Impl->ExtraVerbose = true;
this->Impl->Verbose = true;
- }
- if (this->CheckArgument(arg, "--output-on-failure")) {
+ } else if (this->CheckArgument(arg, "--output-on-failure"_s)) {
this->Impl->OutputTestOutputOnTestFailure = true;
- }
- if (this->CheckArgument(arg, "--test-output-size-passed") &&
- i < args.size() - 1) {
+ } else if (this->CheckArgument(arg, "--test-output-size-passed"_s) &&
+ i < args.size() - 1) {
i++;
long outputSize;
if (cmStrToLong(args[i], &outputSize)) {
@@ -1988,9 +1980,8 @@ bool cmCTest::HandleCommandLineArguments(size_t& i,
"Invalid value for '--test-output-size-passed': " << args[i]
<< "\n");
}
- }
- if (this->CheckArgument(arg, "--test-output-size-failed") &&
- i < args.size() - 1) {
+ } else if (this->CheckArgument(arg, "--test-output-size-failed"_s) &&
+ i < args.size() - 1) {
i++;
long outputSize;
if (cmStrToLong(args[i], &outputSize)) {
@@ -2000,11 +1991,9 @@ bool cmCTest::HandleCommandLineArguments(size_t& i,
"Invalid value for '--test-output-size-failed': " << args[i]
<< "\n");
}
- }
- if (this->CheckArgument(arg, "-N", "--show-only")) {
+ } else if (this->CheckArgument(arg, "-N"_s, "--show-only")) {
this->Impl->ShowOnly = true;
- }
- if (cmHasLiteralPrefix(arg, "--show-only=")) {
+ } else if (cmHasLiteralPrefix(arg, "--show-only=")) {
this->Impl->ShowOnly = true;
// Check if a specific format is requested. Defaults to human readable
@@ -2022,27 +2011,26 @@ bool cmCTest::HandleCommandLineArguments(size_t& i,
}
}
- if (this->CheckArgument(arg, "-O", "--output-log") && i < args.size() - 1) {
+ else if (this->CheckArgument(arg, "-O"_s, "--output-log") &&
+ i < args.size() - 1) {
i++;
this->SetOutputLogFileName(args[i].c_str());
}
- if (this->CheckArgument(arg, "--tomorrow-tag")) {
+ else if (this->CheckArgument(arg, "--tomorrow-tag"_s)) {
this->Impl->TomorrowTag = true;
- }
- if (this->CheckArgument(arg, "--force-new-ctest-process")) {
+ } else if (this->CheckArgument(arg, "--force-new-ctest-process"_s)) {
this->Impl->ForceNewCTestProcess = true;
- }
- if (this->CheckArgument(arg, "-W", "--max-width") && i < args.size() - 1) {
+ } else if (this->CheckArgument(arg, "-W"_s, "--max-width") &&
+ i < args.size() - 1) {
i++;
this->Impl->MaxTestNameWidth = atoi(args[i].c_str());
- }
- if (this->CheckArgument(arg, "--interactive-debug-mode") &&
- i < args.size() - 1) {
+ } else if (this->CheckArgument(arg, "--interactive-debug-mode"_s) &&
+ i < args.size() - 1) {
i++;
this->Impl->InteractiveDebugMode = cmIsOn(args[i]);
- }
- if (this->CheckArgument(arg, "--submit-index") && i < args.size() - 1) {
+ } else if (this->CheckArgument(arg, "--submit-index"_s) &&
+ i < args.size() - 1) {
i++;
this->Impl->SubmitIndex = atoi(args[i].c_str());
if (this->Impl->SubmitIndex < 0) {
@@ -2050,24 +2038,27 @@ bool cmCTest::HandleCommandLineArguments(size_t& i,
}
}
- if (this->CheckArgument(arg, "--overwrite") && i < args.size() - 1) {
+ else if (this->CheckArgument(arg, "--overwrite"_s) && i < args.size() - 1) {
i++;
this->AddCTestConfigurationOverwrite(args[i]);
- }
- if (this->CheckArgument(arg, "-A", "--add-notes") && i < args.size() - 1) {
+ } else if (this->CheckArgument(arg, "-A"_s, "--add-notes") &&
+ i < args.size() - 1) {
this->Impl->ProduceXML = true;
this->SetTest("Notes");
i++;
this->SetNotesFiles(args[i].c_str());
+ return true;
}
- const std::string noTestsPrefix = "--no-tests=";
+ cm::string_view noTestsPrefix = "--no-tests=";
if (cmHasPrefix(arg, noTestsPrefix)) {
- const std::string noTestsMode = arg.substr(noTestsPrefix.length());
+ cm::string_view noTestsMode =
+ cm::string_view(arg).substr(noTestsPrefix.length());
if (noTestsMode == "error") {
this->Impl->NoTestsMode = cmCTest::NoTests::Error;
} else if (noTestsMode != "ignore") {
- errormsg = "'--no-tests=' given unknown value '" + noTestsMode + "'";
+ errormsg =
+ cmStrCat("'--no-tests=' given unknown value '", noTestsMode, '\'');
return false;
} else {
this->Impl->NoTestsMode = cmCTest::NoTests::Ignore;
@@ -2075,34 +2066,32 @@ bool cmCTest::HandleCommandLineArguments(size_t& i,
}
// options that control what tests are run
- if (this->CheckArgument(arg, "-I", "--tests-information") &&
- i < args.size() - 1) {
+ else if (this->CheckArgument(arg, "-I"_s, "--tests-information") &&
+ i < args.size() - 1) {
i++;
this->GetTestHandler()->SetPersistentOption("TestsToRunInformation",
args[i].c_str());
this->GetMemCheckHandler()->SetPersistentOption("TestsToRunInformation",
args[i].c_str());
- }
- if (this->CheckArgument(arg, "-U", "--union")) {
+ } else if (this->CheckArgument(arg, "-U"_s, "--union")) {
this->GetTestHandler()->SetPersistentOption("UseUnion", "true");
this->GetMemCheckHandler()->SetPersistentOption("UseUnion", "true");
- }
- if (this->CheckArgument(arg, "-R", "--tests-regex") && i < args.size() - 1) {
+ } else if (this->CheckArgument(arg, "-R"_s, "--tests-regex") &&
+ i < args.size() - 1) {
i++;
this->GetTestHandler()->SetPersistentOption("IncludeRegularExpression",
args[i].c_str());
this->GetMemCheckHandler()->SetPersistentOption("IncludeRegularExpression",
args[i].c_str());
- }
- if (this->CheckArgument(arg, "-L", "--label-regex") && i < args.size() - 1) {
+ } else if (this->CheckArgument(arg, "-L"_s, "--label-regex") &&
+ i < args.size() - 1) {
i++;
this->GetTestHandler()->SetPersistentOption("LabelRegularExpression",
args[i].c_str());
this->GetMemCheckHandler()->SetPersistentOption("LabelRegularExpression",
args[i].c_str());
- }
- if (this->CheckArgument(arg, "-LE", "--label-exclude") &&
- i < args.size() - 1) {
+ } else if (this->CheckArgument(arg, "-LE"_s, "--label-exclude") &&
+ i < args.size() - 1) {
i++;
this->GetTestHandler()->SetPersistentOption(
"ExcludeLabelRegularExpression", args[i].c_str());
@@ -2110,8 +2099,8 @@ bool cmCTest::HandleCommandLineArguments(size_t& i,
"ExcludeLabelRegularExpression", args[i].c_str());
}
- if (this->CheckArgument(arg, "-E", "--exclude-regex") &&
- i < args.size() - 1) {
+ else if (this->CheckArgument(arg, "-E"_s, "--exclude-regex") &&
+ i < args.size() - 1) {
i++;
this->GetTestHandler()->SetPersistentOption("ExcludeRegularExpression",
args[i].c_str());
@@ -2119,24 +2108,22 @@ bool cmCTest::HandleCommandLineArguments(size_t& i,
args[i].c_str());
}
- if (this->CheckArgument(arg, "-FA", "--fixture-exclude-any") &&
- i < args.size() - 1) {
+ else if (this->CheckArgument(arg, "-FA"_s, "--fixture-exclude-any") &&
+ i < args.size() - 1) {
i++;
this->GetTestHandler()->SetPersistentOption(
"ExcludeFixtureRegularExpression", args[i].c_str());
this->GetMemCheckHandler()->SetPersistentOption(
"ExcludeFixtureRegularExpression", args[i].c_str());
- }
- if (this->CheckArgument(arg, "-FS", "--fixture-exclude-setup") &&
- i < args.size() - 1) {
+ } else if (this->CheckArgument(arg, "-FS"_s, "--fixture-exclude-setup") &&
+ i < args.size() - 1) {
i++;
this->GetTestHandler()->SetPersistentOption(
"ExcludeFixtureSetupRegularExpression", args[i].c_str());
this->GetMemCheckHandler()->SetPersistentOption(
"ExcludeFixtureSetupRegularExpression", args[i].c_str());
- }
- if (this->CheckArgument(arg, "-FC", "--fixture-exclude-cleanup") &&
- i < args.size() - 1) {
+ } else if (this->CheckArgument(arg, "-FC"_s, "--fixture-exclude-cleanup") &&
+ i < args.size() - 1) {
i++;
this->GetTestHandler()->SetPersistentOption(
"ExcludeFixtureCleanupRegularExpression", args[i].c_str());
@@ -2144,8 +2131,8 @@ bool cmCTest::HandleCommandLineArguments(size_t& i,
"ExcludeFixtureCleanupRegularExpression", args[i].c_str());
}
- if (this->CheckArgument(arg, "--resource-spec-file") &&
- i < args.size() - 1) {
+ else if (this->CheckArgument(arg, "--resource-spec-file"_s) &&
+ i < args.size() - 1) {
i++;
this->GetTestHandler()->SetPersistentOption("ResourceSpecFile",
args[i].c_str());
@@ -2153,7 +2140,7 @@ bool cmCTest::HandleCommandLineArguments(size_t& i,
args[i].c_str());
}
- if (this->CheckArgument(arg, "--rerun-failed")) {
+ else if (this->CheckArgument(arg, "--rerun-failed"_s)) {
this->GetTestHandler()->SetPersistentOption("RerunFailed", "true");
this->GetMemCheckHandler()->SetPersistentOption("RerunFailed", "true");
}
@@ -2205,7 +2192,7 @@ void cmCTest::HandleScriptArguments(size_t& i, std::vector<std::string>& args,
bool& SRArgumentSpecified)
{
std::string arg = args[i];
- if (this->CheckArgument(arg, "-SP", "--script-new-process") &&
+ if (this->CheckArgument(arg, "-SP"_s, "--script-new-process") &&
i < args.size() - 1) {
this->Impl->RunConfigurationScript = true;
i++;
@@ -2216,7 +2203,8 @@ void cmCTest::HandleScriptArguments(size_t& i, std::vector<std::string>& args,
}
}
- if (this->CheckArgument(arg, "-SR", "--script-run") && i < args.size() - 1) {
+ if (this->CheckArgument(arg, "-SR"_s, "--script-run") &&
+ i < args.size() - 1) {
SRArgumentSpecified = true;
this->Impl->RunConfigurationScript = true;
i++;
@@ -2224,7 +2212,7 @@ void cmCTest::HandleScriptArguments(size_t& i, std::vector<std::string>& args,
ch->AddConfigurationScript(args[i].c_str(), true);
}
- if (this->CheckArgument(arg, "-S", "--script") && i < args.size() - 1) {
+ if (this->CheckArgument(arg, "-S"_s, "--script") && i < args.size() - 1) {
this->Impl->RunConfigurationScript = true;
i++;
cmCTestScriptHandler* ch = this->GetScriptHandler();
@@ -2274,7 +2262,8 @@ int cmCTest::Run(std::vector<std::string>& args, std::string* output)
// --dashboard: handle a request for a dashboard
std::string arg = args[i];
- if (this->CheckArgument(arg, "-D", "--dashboard") && i < args.size() - 1) {
+ if (this->CheckArgument(arg, "-D"_s, "--dashboard") &&
+ i < args.size() - 1) {
this->Impl->ProduceXML = true;
i++;
std::string targ = args[i];
@@ -2310,7 +2299,7 @@ int cmCTest::Run(std::vector<std::string>& args, std::string* output)
}
// --extra-submit
- if (this->CheckArgument(arg, "--extra-submit") && i < args.size() - 1) {
+ if (this->CheckArgument(arg, "--extra-submit"_s) && i < args.size() - 1) {
this->Impl->ProduceXML = true;
this->SetTest("Submit");
i++;
@@ -2320,12 +2309,13 @@ int cmCTest::Run(std::vector<std::string>& args, std::string* output)
}
// --build-and-test options
- if (this->CheckArgument(arg, "--build-and-test") && i < args.size() - 1) {
+ if (this->CheckArgument(arg, "--build-and-test"_s) &&
+ i < args.size() - 1) {
cmakeAndTest = true;
}
// --schedule-random
- if (this->CheckArgument(arg, "--schedule-random")) {
+ if (this->CheckArgument(arg, "--schedule-random"_s)) {
this->Impl->ScheduleType = "Random";
}
@@ -2380,7 +2370,7 @@ bool cmCTest::HandleTestActionArgument(const char* ctestExec, size_t& i,
{
bool success = true;
std::string arg = args[i];
- if (this->CheckArgument(arg, "-T", "--test-action") &&
+ if (this->CheckArgument(arg, "-T"_s, "--test-action") &&
(i < args.size() - 1)) {
this->Impl->ProduceXML = true;
i++;
@@ -2412,15 +2402,15 @@ bool cmCTest::HandleTestModelArgument(const char* ctestExec, size_t& i,
{
bool success = true;
std::string arg = args[i];
- if (this->CheckArgument(arg, "-M", "--test-model") &&
+ if (this->CheckArgument(arg, "-M"_s, "--test-model") &&
(i < args.size() - 1)) {
i++;
std::string const& str = args[i];
- if (cmSystemTools::LowerCase(str) == "nightly") {
+ if (cmSystemTools::LowerCase(str) == "nightly"_s) {
this->SetTestModel(cmCTest::NIGHTLY);
- } else if (cmSystemTools::LowerCase(str) == "continuous") {
+ } else if (cmSystemTools::LowerCase(str) == "continuous"_s) {
this->SetTestModel(cmCTest::CONTINUOUS);
- } else if (cmSystemTools::LowerCase(str) == "experimental") {
+ } else if (cmSystemTools::LowerCase(str) == "experimental"_s) {
this->SetTestModel(cmCTest::EXPERIMENTAL);
} else {
success = false;
@@ -2507,6 +2497,16 @@ void cmCTest::SetNotesFiles(const char* notes)
this->Impl->NotesFiles = notes;
}
+bool cmCTest::GetStopOnFailure() const
+{
+ return this->Impl->StopOnFailure;
+}
+
+void cmCTest::SetStopOnFailure(bool stop)
+{
+ this->Impl->StopOnFailure = stop;
+}
+
std::chrono::system_clock::time_point cmCTest::GetStopTime() const
{
return this->Impl->StopTime;
@@ -2687,7 +2687,7 @@ std::string cmCTest::GetShortPathToFile(const char* cfname)
path = "./" + *res;
if (path.back() == '/') {
- path = path.substr(0, path.size() - 1);
+ path.resize(path.size() - 1);
}
}
@@ -2738,7 +2738,7 @@ std::string cmCTest::GetSubmitURL()
std::string site = this->GetCTestConfiguration("DropSite");
std::string location = this->GetCTestConfiguration("DropLocation");
- url = cmStrCat(method.empty() ? "http" : method, "://");
+ url = cmStrCat(method.empty() ? "http" : method, "://"_s);
if (!user.empty()) {
url += user;
if (!password.empty()) {
@@ -3086,12 +3086,10 @@ bool cmCTest::RunCommand(std::vector<std::string> const& args,
void cmCTest::SetOutputLogFileName(const char* name)
{
- if (this->Impl->OutputLogFile) {
- delete this->Impl->OutputLogFile;
- this->Impl->OutputLogFile = nullptr;
- }
if (name) {
- this->Impl->OutputLogFile = new cmGeneratedFileStream(name);
+ this->Impl->OutputLogFile = cm::make_unique<cmGeneratedFileStream>(name);
+ } else {
+ this->Impl->OutputLogFile.reset();
}
}
diff --git a/Source/cmCTest.h b/Source/cmCTest.h
index 7f8f913..a39b8fe 100644
--- a/Source/cmCTest.h
+++ b/Source/cmCTest.h
@@ -13,6 +13,8 @@
#include <string>
#include <vector>
+#include <cm/string_view>
+
#include "cmDuration.h"
#include "cmProcessOutput.h"
@@ -140,7 +142,8 @@ public:
std::string GetTestModelString();
static int GetTestModelFromString(const char* str);
- static std::string CleanString(const std::string& str);
+ static std::string CleanString(const std::string& str,
+ std::string::size_type spos = 0);
std::string GetCTestConfiguration(const std::string& name);
void SetCTestConfiguration(const char* name, const char* value,
bool suppress = false);
@@ -201,6 +204,9 @@ public:
bool ShouldCompressTestOutput();
bool CompressString(std::string& str);
+ bool GetStopOnFailure() const;
+ void SetStopOnFailure(bool stop);
+
std::chrono::system_clock::time_point GetStopTime() const;
void SetStopTime(std::string const& time);
@@ -506,8 +512,8 @@ private:
std::vector<std::string> const& files);
/** Check if the argument is the one specified */
- bool CheckArgument(const std::string& arg, const char* varg1,
- const char* varg2 = nullptr);
+ static bool CheckArgument(const std::string& arg, cm::string_view varg1,
+ const char* varg2 = nullptr);
/** Output errors from a test */
void OutputTestErrors(std::vector<char> const& process_output);
diff --git a/Source/cmCacheManager.cxx b/Source/cmCacheManager.cxx
index dc9aba1..35bd681 100644
--- a/Source/cmCacheManager.cxx
+++ b/Source/cmCacheManager.cxx
@@ -19,12 +19,6 @@
#include "cmSystemTools.h"
#include "cmVersion.h"
-cmCacheManager::cmCacheManager()
-{
- this->CacheMajorVersion = 0;
- this->CacheMinorVersion = 0;
-}
-
void cmCacheManager::CleanCMakeFiles(const std::string& path)
{
std::string glob = cmStrCat(path, "/CMakeFiles/*.cmake");
@@ -77,7 +71,7 @@ bool cmCacheManager::LoadCache(const std::string& path, bool internal,
}
while (realbuffer[0] == '/' && realbuffer[1] == '/') {
if ((realbuffer[2] == '\\') && (realbuffer[3] == 'n')) {
- helpString += "\n";
+ helpString += '\n';
helpString += &realbuffer[4];
} else {
helpString += &realbuffer[2];
@@ -117,20 +111,20 @@ bool cmCacheManager::LoadCache(const std::string& path, bool internal,
}
} else {
std::ostringstream error;
- error << "Parse error in cache file " << cacheFile;
- error << " on line " << lineno << ". Offending entry: " << realbuffer;
+ error << "Parse error in cache file " << cacheFile << " on line "
+ << lineno << ". Offending entry: " << realbuffer;
cmSystemTools::Error(error.str());
}
}
this->CacheMajorVersion = 0;
this->CacheMinorVersion = 0;
- if (const std::string* cmajor =
+ if (cmProp cmajor =
this->GetInitializedCacheValue("CMAKE_CACHE_MAJOR_VERSION")) {
unsigned int v = 0;
if (sscanf(cmajor->c_str(), "%u", &v) == 1) {
this->CacheMajorVersion = v;
}
- if (const std::string* cminor =
+ if (cmProp cminor =
this->GetInitializedCacheValue("CMAKE_CACHE_MINOR_VERSION")) {
if (sscanf(cminor->c_str(), "%u", &v) == 1) {
this->CacheMinorVersion = v;
@@ -150,8 +144,7 @@ bool cmCacheManager::LoadCache(const std::string& path, bool internal,
}
// check to make sure the cache directory has not
// been moved
- const std::string* oldDir =
- this->GetInitializedCacheValue("CMAKE_CACHEFILE_DIR");
+ cmProp oldDir = this->GetInitializedCacheValue("CMAKE_CACHEFILE_DIR");
if (internal && oldDir) {
std::string currentcwd = path;
std::string oldcwd = *oldDir;
@@ -159,8 +152,7 @@ bool cmCacheManager::LoadCache(const std::string& path, bool internal,
currentcwd += "/CMakeCache.txt";
oldcwd += "/CMakeCache.txt";
if (!cmSystemTools::SameFile(oldcwd, currentcwd)) {
- const std::string* dir =
- this->GetInitializedCacheValue("CMAKE_CACHEFILE_DIR");
+ cmProp dir = this->GetInitializedCacheValue("CMAKE_CACHEFILE_DIR");
std::ostringstream message;
message << "The current CMakeCache.txt directory " << currentcwd
<< " is different than the directory " << (dir ? *dir : "")
@@ -174,10 +166,10 @@ bool cmCacheManager::LoadCache(const std::string& path, bool internal,
}
const char* cmCacheManager::PersistentProperties[] = { "ADVANCED", "MODIFIED",
- "STRINGS", nullptr };
+ "STRINGS" };
-bool cmCacheManager::ReadPropertyEntry(std::string const& entryKey,
- CacheEntry& e)
+bool cmCacheManager::ReadPropertyEntry(const std::string& entryKey,
+ const CacheEntry& e)
{
// All property entries are internal.
if (e.Type != cmStateEnums::INTERNAL) {
@@ -185,20 +177,18 @@ bool cmCacheManager::ReadPropertyEntry(std::string const& entryKey,
}
const char* end = entryKey.c_str() + entryKey.size();
- for (const char** p = cmCacheManager::PersistentProperties; *p; ++p) {
- std::string::size_type plen = strlen(*p) + 1;
+ for (const char* p : cmCacheManager::PersistentProperties) {
+ std::string::size_type plen = strlen(p) + 1;
if (entryKey.size() > plen && *(end - plen) == '-' &&
- strcmp(end - plen + 1, *p) == 0) {
+ strcmp(end - plen + 1, p) == 0) {
std::string key = entryKey.substr(0, entryKey.size() - plen);
- cmCacheManager::CacheIterator it = this->GetCacheIterator(key);
- if (it.IsAtEnd()) {
+ if (auto entry = this->GetCacheEntry(key)) {
+ // Store this property on its entry.
+ entry->SetProperty(p, e.Value.c_str());
+ } else {
// Create an entry and store the property.
CacheEntry& ne = this->Cache[key];
- ne.Type = cmStateEnums::UNINITIALIZED;
- ne.SetProperty(*p, e.Value.c_str());
- } else {
- // Store this property on its entry.
- it.SetProperty(*p, e.Value.c_str());
+ ne.SetProperty(p, e.Value.c_str());
}
return true;
}
@@ -206,21 +196,23 @@ bool cmCacheManager::ReadPropertyEntry(std::string const& entryKey,
return false;
}
-void cmCacheManager::WritePropertyEntries(std::ostream& os, CacheIterator i,
- cmMessenger* messenger)
+void cmCacheManager::WritePropertyEntries(std::ostream& os,
+ const std::string& entryKey,
+ const CacheEntry& e,
+ cmMessenger* messenger) const
{
- for (const char** p = cmCacheManager::PersistentProperties; *p; ++p) {
- if (const char* value = i.GetProperty(*p)) {
+ for (const char* p : cmCacheManager::PersistentProperties) {
+ if (cmProp value = e.GetProperty(p)) {
std::string helpstring =
- cmStrCat(*p, " property for variable: ", i.GetName());
+ cmStrCat(p, " property for variable: ", entryKey);
cmCacheManager::OutputHelpString(os, helpstring);
- std::string key = cmStrCat(i.GetName(), '-', *p);
+ std::string key = cmStrCat(entryKey, '-', p);
cmCacheManager::OutputKey(os, key);
os << ":INTERNAL=";
- cmCacheManager::OutputValue(os, value);
- os << "\n";
- cmCacheManager::OutputNewlineTruncationWarning(os, key, value,
+ cmCacheManager::OutputValue(os, *value);
+ os << '\n';
+ cmCacheManager::OutputNewlineTruncationWarning(os, key, *value,
messenger);
}
}
@@ -270,31 +262,29 @@ bool cmCacheManager::SaveCache(const std::string& path, cmMessenger* messenger)
/* clang-format off */
fout << "# This is the CMakeCache file.\n"
- << "# For build in directory: " << currentcwd << "\n"
- << "# It was generated by CMake: "
- << cmSystemTools::GetCMakeCommand() << std::endl;
- /* clang-format on */
-
- /* clang-format off */
- fout << "# You can edit this file to change values found and used by cmake."
- << std::endl
- << "# If you do not want to change any of the values, simply exit the "
- "editor." << std::endl
- << "# If you do want to change a value, simply edit, save, and exit "
- "the editor." << std::endl
- << "# The syntax for the file is as follows:\n"
- << "# KEY:TYPE=VALUE\n"
- << "# KEY is the name of a variable in the cache.\n"
- << "# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT "
- "TYPE!." << std::endl
- << "# VALUE is the current value for the KEY.\n\n";
+ "# For build in directory: " << currentcwd << "\n"
+ "# It was generated by CMake: "
+ << cmSystemTools::GetCMakeCommand()
+ << "\n"
+ "# You can edit this file to change values found and used by cmake."
+ "\n"
+ "# If you do not want to change any of the values, simply exit the "
+ "editor.\n"
+ "# If you do want to change a value, simply edit, save, and exit "
+ "the editor.\n"
+ "# The syntax for the file is as follows:\n"
+ "# KEY:TYPE=VALUE\n"
+ "# KEY is the name of a variable in the cache.\n"
+ "# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!."
+ "\n"
+ "# VALUE is the current value for the KEY.\n"
+ "\n"
+ "########################\n"
+ "# EXTERNAL cache entries\n"
+ "########################\n"
+ "\n";
/* clang-format on */
- fout << "########################\n";
- fout << "# EXTERNAL cache entries\n";
- fout << "########################\n";
- fout << "\n";
-
for (auto const& i : this->Cache) {
CacheEntry const& ce = i.second;
cmStateEnums::CacheEntryType t = ce.Type;
@@ -305,49 +295,48 @@ bool cmCacheManager::SaveCache(const std::string& path, cmMessenger* messenger)
*/
} else if (t != cmStateEnums::INTERNAL) {
// Format is key:type=value
- if (const char* help = ce.GetProperty("HELPSTRING")) {
- cmCacheManager::OutputHelpString(fout, help);
+ if (cmProp help = ce.GetProperty("HELPSTRING")) {
+ cmCacheManager::OutputHelpString(fout, *help);
} else {
cmCacheManager::OutputHelpString(fout, "Missing description");
}
cmCacheManager::OutputKey(fout, i.first);
- fout << ":" << cmState::CacheEntryTypeToString(t) << "=";
+ fout << ':' << cmState::CacheEntryTypeToString(t) << '=';
cmCacheManager::OutputValue(fout, ce.Value);
- fout << "\n";
+ fout << '\n';
cmCacheManager::OutputNewlineTruncationWarning(fout, i.first, ce.Value,
messenger);
- fout << "\n";
+ fout << '\n';
}
}
- fout << "\n";
- fout << "########################\n";
- fout << "# INTERNAL cache entries\n";
- fout << "########################\n";
- fout << "\n";
+ fout << "\n"
+ "########################\n"
+ "# INTERNAL cache entries\n"
+ "########################\n"
+ "\n";
- for (cmCacheManager::CacheIterator i = this->NewIterator(); !i.IsAtEnd();
- i.Next()) {
- if (!i.Initialized()) {
+ for (auto const& i : this->Cache) {
+ if (!i.second.Initialized) {
continue;
}
- cmStateEnums::CacheEntryType t = i.GetType();
- this->WritePropertyEntries(fout, i, messenger);
+ cmStateEnums::CacheEntryType t = i.second.GetType();
+ this->WritePropertyEntries(fout, i.first, i.second, messenger);
if (t == cmStateEnums::INTERNAL) {
// Format is key:type=value
- if (const char* help = i.GetProperty("HELPSTRING")) {
- cmCacheManager::OutputHelpString(fout, help);
+ if (cmProp help = i.second.GetProperty("HELPSTRING")) {
+ cmCacheManager::OutputHelpString(fout, *help);
}
- cmCacheManager::OutputKey(fout, i.GetName());
- fout << ":" << cmState::CacheEntryTypeToString(t) << "=";
- cmCacheManager::OutputValue(fout, i.GetValue());
- fout << "\n";
- cmCacheManager::OutputNewlineTruncationWarning(fout, i.GetName(),
- i.GetValue(), messenger);
+ cmCacheManager::OutputKey(fout, i.first);
+ fout << ':' << cmState::CacheEntryTypeToString(t) << '=';
+ cmCacheManager::OutputValue(fout, i.second.GetValue());
+ fout << '\n';
+ cmCacheManager::OutputNewlineTruncationWarning(
+ fout, i.first, i.second.GetValue(), messenger);
}
}
- fout << "\n";
+ fout << '\n';
fout.Close();
std::string checkCacheFile = cmStrCat(path, "/CMakeFiles");
cmSystemTools::MakeDirectory(checkCacheFile);
@@ -385,7 +374,9 @@ void cmCacheManager::OutputKey(std::ostream& fout, std::string const& key)
{
// support : in key name by double quoting
const char* q =
- (key.find(':') != std::string::npos || key.find("//") == 0) ? "\"" : "";
+ (key.find(':') != std::string::npos || cmHasLiteralPrefix(key, "//"))
+ ? "\""
+ : "";
fout << q << key << q;
}
@@ -430,7 +421,7 @@ void cmCacheManager::OutputHelpString(std::ostream& fout,
fout << "\\n";
}
oneLine = helpString.substr(pos, i - pos);
- fout << oneLine << "\n";
+ fout << oneLine << '\n';
pos = i;
}
}
@@ -452,7 +443,7 @@ void cmCacheManager::OutputWarningComment(std::ostream& fout,
fout << "\\n";
}
oneLine = message.substr(pos, i - pos);
- fout << oneLine << "\n";
+ fout << oneLine << '\n';
pos = i;
}
}
@@ -481,10 +472,7 @@ void cmCacheManager::OutputNewlineTruncationWarning(std::ostream& fout,
void cmCacheManager::RemoveCacheEntry(const std::string& key)
{
- auto i = this->Cache.find(key);
- if (i != this->Cache.end()) {
- this->Cache.erase(i);
- }
+ this->Cache.erase(key);
}
cmCacheManager::CacheEntry* cmCacheManager::GetCacheEntry(
@@ -497,40 +485,39 @@ cmCacheManager::CacheEntry* cmCacheManager::GetCacheEntry(
return nullptr;
}
-cmCacheManager::CacheIterator cmCacheManager::GetCacheIterator(
- const std::string& key)
-{
- return { *this, key.c_str() };
-}
-
-cmCacheManager::CacheIterator cmCacheManager::GetCacheIterator()
+const cmCacheManager::CacheEntry* cmCacheManager::GetCacheEntry(
+ const std::string& key) const
{
- return { *this, nullptr };
+ auto i = this->Cache.find(key);
+ if (i != this->Cache.end()) {
+ return &i->second;
+ }
+ return nullptr;
}
-const std::string* cmCacheManager::GetInitializedCacheValue(
- const std::string& key) const
+cmProp cmCacheManager::GetInitializedCacheValue(const std::string& key) const
{
- auto i = this->Cache.find(key);
- if (i != this->Cache.end() && i->second.Initialized) {
- return &i->second.Value;
+ if (auto entry = this->GetCacheEntry(key)) {
+ if (entry->Initialized) {
+ return &entry->GetValue();
+ }
}
return nullptr;
}
void cmCacheManager::PrintCache(std::ostream& out) const
{
- out << "=================================================" << std::endl;
- out << "CMakeCache Contents:" << std::endl;
+ out << "=================================================\n"
+ "CMakeCache Contents:\n";
for (auto const& i : this->Cache) {
if (i.second.Type != cmStateEnums::INTERNAL) {
- out << i.first << " = " << i.second.Value << std::endl;
+ out << i.first << " = " << i.second.Value << '\n';
}
}
- out << "\n\n";
- out << "To change values in the CMakeCache, " << std::endl
- << "edit CMakeCache.txt in your output directory.\n";
- out << "=================================================" << std::endl;
+ out << "\n\n"
+ "To change values in the CMakeCache, \n"
+ "edit CMakeCache.txt in your output directory.\n"
+ "=================================================\n";
}
void cmCacheManager::AddCacheEntry(const std::string& key, const char* value,
@@ -538,12 +525,7 @@ void cmCacheManager::AddCacheEntry(const std::string& key, const char* value,
cmStateEnums::CacheEntryType type)
{
CacheEntry& e = this->Cache[key];
- if (value) {
- e.Value = value;
- e.Initialized = true;
- } else {
- e.Value.clear();
- }
+ e.SetValue(value);
e.Type = type;
// make sure we only use unix style paths
if (type == cmStateEnums::FILEPATH || type == cmStateEnums::PATH) {
@@ -567,70 +549,41 @@ void cmCacheManager::AddCacheEntry(const std::string& key, const char* value,
: "(This variable does not exist and should not be used)");
}
-bool cmCacheManager::CacheIterator::IsAtEnd() const
-{
- return this->Position == this->Container.Cache.end();
-}
-
-void cmCacheManager::CacheIterator::Begin()
-{
- this->Position = this->Container.Cache.begin();
-}
-
-bool cmCacheManager::CacheIterator::Find(const std::string& key)
-{
- this->Position = this->Container.Cache.find(key);
- return !this->IsAtEnd();
-}
-
-void cmCacheManager::CacheIterator::Next()
-{
- if (!this->IsAtEnd()) {
- ++this->Position;
- }
-}
-
-std::vector<std::string> cmCacheManager::CacheIterator::GetPropertyList() const
+void cmCacheManager::CacheEntry::SetValue(const char* value)
{
- return this->GetEntry().GetPropertyList();
-}
-
-void cmCacheManager::CacheIterator::SetValue(const char* value)
-{
- if (this->IsAtEnd()) {
- return;
- }
- CacheEntry* entry = &this->GetEntry();
if (value) {
- entry->Value = value;
- entry->Initialized = true;
+ this->Value = value;
+ this->Initialized = true;
} else {
- entry->Value.clear();
+ this->Value.clear();
}
}
-bool cmCacheManager::CacheIterator::GetValueAsBool() const
-{
- return cmIsOn(this->GetEntry().Value);
-}
-
std::vector<std::string> cmCacheManager::CacheEntry::GetPropertyList() const
{
return this->Properties.GetKeys();
}
-const char* cmCacheManager::CacheEntry::GetProperty(
- const std::string& prop) const
+cmProp cmCacheManager::CacheEntry::GetProperty(const std::string& prop) const
{
if (prop == "TYPE") {
- return cmState::CacheEntryTypeToString(this->Type).c_str();
+ return &cmState::CacheEntryTypeToString(this->Type);
}
if (prop == "VALUE") {
- return this->Value.c_str();
+ return &this->Value;
}
return this->Properties.GetPropertyValue(prop);
}
+bool cmCacheManager::CacheEntry::GetPropertyAsBool(
+ const std::string& prop) const
+{
+ if (cmProp value = this->GetProperty(prop)) {
+ return cmIsOn(*value);
+ }
+ return false;
+}
+
void cmCacheManager::CacheEntry::SetProperty(const std::string& prop,
const char* value)
{
@@ -643,6 +596,11 @@ void cmCacheManager::CacheEntry::SetProperty(const std::string& prop,
}
}
+void cmCacheManager::CacheEntry::SetProperty(const std::string& p, bool v)
+{
+ this->SetProperty(p, v ? "ON" : "OFF");
+}
+
void cmCacheManager::CacheEntry::AppendProperty(const std::string& prop,
const std::string& value,
bool asString)
@@ -661,49 +619,3 @@ void cmCacheManager::CacheEntry::AppendProperty(const std::string& prop,
this->Properties.AppendProperty(prop, value, asString);
}
}
-
-const char* cmCacheManager::CacheIterator::GetProperty(
- const std::string& prop) const
-{
- if (!this->IsAtEnd()) {
- return this->GetEntry().GetProperty(prop);
- }
- return nullptr;
-}
-
-void cmCacheManager::CacheIterator::SetProperty(const std::string& p,
- const char* v)
-{
- if (!this->IsAtEnd()) {
- this->GetEntry().SetProperty(p, v);
- }
-}
-
-void cmCacheManager::CacheIterator::AppendProperty(const std::string& p,
- const std::string& v,
- bool asString)
-{
- if (!this->IsAtEnd()) {
- this->GetEntry().AppendProperty(p, v, asString);
- }
-}
-
-bool cmCacheManager::CacheIterator::GetPropertyAsBool(
- const std::string& prop) const
-{
- if (const char* value = this->GetProperty(prop)) {
- return cmIsOn(value);
- }
- return false;
-}
-
-void cmCacheManager::CacheIterator::SetProperty(const std::string& p, bool v)
-{
- this->SetProperty(p, v ? "ON" : "OFF");
-}
-
-bool cmCacheManager::CacheIterator::PropertyExists(
- const std::string& prop) const
-{
- return this->GetProperty(prop) != nullptr;
-}
diff --git a/Source/cmCacheManager.h b/Source/cmCacheManager.h
index d8be991..3d946b4 100644
--- a/Source/cmCacheManager.h
+++ b/Source/cmCacheManager.h
@@ -25,77 +25,33 @@ class cmMessenger;
*/
class cmCacheManager
{
-public:
- cmCacheManager();
- class CacheIterator;
- friend class cmCacheManager::CacheIterator;
-
-private:
- struct CacheEntry
+ class CacheEntry
{
- std::string Value;
- cmStateEnums::CacheEntryType Type = cmStateEnums::UNINITIALIZED;
- cmPropertyMap Properties;
- std::vector<std::string> GetPropertyList() const;
- const char* GetProperty(const std::string&) const;
- void SetProperty(const std::string& property, const char* value);
- void AppendProperty(const std::string& property, const std::string& value,
- bool asString = false);
- bool Initialized = false;
- };
+ friend class cmCacheManager;
-public:
- class CacheIterator
- {
public:
- void Begin();
- bool Find(const std::string&);
- bool IsAtEnd() const;
- void Next();
- std::string GetName() const { return this->Position->first; }
+ const std::string& GetValue() const { return this->Value; }
+ void SetValue(const char*);
+
+ cmStateEnums::CacheEntryType GetType() const { return this->Type; }
+ void SetType(cmStateEnums::CacheEntryType ty) { this->Type = ty; }
+
std::vector<std::string> GetPropertyList() const;
- const char* GetProperty(const std::string&) const;
- bool GetPropertyAsBool(const std::string&) const;
- bool PropertyExists(const std::string&) const;
+ cmProp GetProperty(const std::string& property) const;
+ bool GetPropertyAsBool(const std::string& property) const;
void SetProperty(const std::string& property, const char* value);
+ void SetProperty(const std::string& property, bool value);
void AppendProperty(const std::string& property, const std::string& value,
bool asString = false);
- void SetProperty(const std::string& property, bool value);
- const std::string& GetValue() const { return this->GetEntry().Value; }
- bool GetValueAsBool() const;
- void SetValue(const char*);
- cmStateEnums::CacheEntryType GetType() const
- {
- return this->GetEntry().Type;
- }
- void SetType(cmStateEnums::CacheEntryType ty)
- {
- this->GetEntry().Type = ty;
- }
- bool Initialized() { return this->GetEntry().Initialized; }
- cmCacheManager& Container;
- std::map<std::string, CacheEntry>::iterator Position;
- CacheIterator(cmCacheManager& cm)
- : Container(cm)
- {
- this->Begin();
- }
- CacheIterator(cmCacheManager& cm, const char* key)
- : Container(cm)
- {
- if (key) {
- this->Find(key);
- }
- }
private:
- CacheEntry const& GetEntry() const { return this->Position->second; }
- CacheEntry& GetEntry() { return this->Position->second; }
+ std::string Value;
+ cmStateEnums::CacheEntryType Type = cmStateEnums::UNINITIALIZED;
+ cmPropertyMap Properties;
+ bool Initialized = false;
};
- //! return an iterator to iterate through the cache map
- cmCacheManager::CacheIterator NewIterator() { return { *this }; }
-
+public:
//! Load a cache for given makefile. Loads from path/CMakeCache.txt.
bool LoadCache(const std::string& path, bool internal,
std::set<std::string>& excludes,
@@ -110,67 +66,82 @@ public:
//! Print the cache to a stream
void PrintCache(std::ostream&) const;
- //! Get the iterator for an entry with a given key.
- cmCacheManager::CacheIterator GetCacheIterator(const std::string& key);
- cmCacheManager::CacheIterator GetCacheIterator();
-
- //! Remove an entry from the cache
- void RemoveCacheEntry(const std::string& key);
+ //! Get a value from the cache given a key
+ cmProp GetInitializedCacheValue(const std::string& key) const;
- //! Get the number of entries in the cache
- int GetSize() { return static_cast<int>(this->Cache.size()); }
+ cmProp GetCacheEntryValue(const std::string& key) const
+ {
+ if (auto entry = this->GetCacheEntry(key)) {
+ return &entry->GetValue();
+ }
+ return nullptr;
+ }
- //! Get a value from the cache given a key
- const std::string* GetInitializedCacheValue(const std::string& key) const;
+ void SetCacheEntryValue(std::string const& key, std::string const& value)
+ {
+ if (auto entry = this->GetCacheEntry(key)) {
+ entry->SetValue(value.c_str());
+ }
+ }
- const char* GetCacheEntryValue(const std::string& key)
+ cmStateEnums::CacheEntryType GetCacheEntryType(std::string const& key) const
{
- cmCacheManager::CacheIterator it = this->GetCacheIterator(key);
- if (it.IsAtEnd()) {
- return nullptr;
+ if (auto entry = this->GetCacheEntry(key)) {
+ return entry->GetType();
}
- return it.GetValue().c_str();
+ return cmStateEnums::UNINITIALIZED;
}
- const char* GetCacheEntryProperty(std::string const& key,
- std::string const& propName)
+ std::vector<std::string> GetCacheEntryPropertyList(
+ std::string const& key) const
{
- return this->GetCacheIterator(key).GetProperty(propName);
+ if (auto entry = this->GetCacheEntry(key)) {
+ return entry->GetPropertyList();
+ }
+ return {};
}
- cmStateEnums::CacheEntryType GetCacheEntryType(std::string const& key)
+ cmProp GetCacheEntryProperty(std::string const& key,
+ std::string const& propName) const
{
- return this->GetCacheIterator(key).GetType();
+ if (auto entry = this->GetCacheEntry(key)) {
+ return entry->GetProperty(propName);
+ }
+ return nullptr;
}
bool GetCacheEntryPropertyAsBool(std::string const& key,
- std::string const& propName)
+ std::string const& propName) const
{
- return this->GetCacheIterator(key).GetPropertyAsBool(propName);
+ if (auto entry = this->GetCacheEntry(key)) {
+ return entry->GetPropertyAsBool(propName);
+ }
+ return false;
}
void SetCacheEntryProperty(std::string const& key,
std::string const& propName,
std::string const& value)
{
- this->GetCacheIterator(key).SetProperty(propName, value.c_str());
+ if (auto entry = this->GetCacheEntry(key)) {
+ entry->SetProperty(propName, value.c_str());
+ }
}
void SetCacheEntryBoolProperty(std::string const& key,
std::string const& propName, bool value)
{
- this->GetCacheIterator(key).SetProperty(propName, value);
- }
-
- void SetCacheEntryValue(std::string const& key, std::string const& value)
- {
- this->GetCacheIterator(key).SetValue(value.c_str());
+ if (auto entry = this->GetCacheEntry(key)) {
+ entry->SetProperty(propName, value);
+ }
}
void RemoveCacheEntryProperty(std::string const& key,
std::string const& propName)
{
- this->GetCacheIterator(key).SetProperty(propName, nullptr);
+ if (auto entry = this->GetCacheEntry(key)) {
+ entry->SetProperty(propName, nullptr);
+ }
}
void AppendCacheEntryProperty(std::string const& key,
@@ -178,16 +149,17 @@ public:
std::string const& value,
bool asString = false)
{
- this->GetCacheIterator(key).AppendProperty(propName, value, asString);
+ if (auto entry = this->GetCacheEntry(key)) {
+ entry->AppendProperty(propName, value, asString);
+ }
}
- std::vector<std::string> GetCacheEntryKeys()
+ std::vector<std::string> GetCacheEntryKeys() const
{
std::vector<std::string> definitions;
- definitions.reserve(this->GetSize());
- cmCacheManager::CacheIterator cit = this->GetCacheIterator();
- for (cit.Begin(); !cit.IsAtEnd(); cit.Next()) {
- definitions.push_back(cit.GetName());
+ definitions.reserve(this->Cache.size());
+ for (auto const& i : this->Cache) {
+ definitions.push_back(i.first);
}
return definitions;
}
@@ -196,23 +168,22 @@ public:
unsigned int GetCacheMajorVersion() const { return this->CacheMajorVersion; }
unsigned int GetCacheMinorVersion() const { return this->CacheMinorVersion; }
-protected:
//! Add an entry into the cache
void AddCacheEntry(const std::string& key, const char* value,
const char* helpString,
cmStateEnums::CacheEntryType type);
+ //! Remove an entry from the cache
+ void RemoveCacheEntry(const std::string& key);
+
+private:
//! Get a cache entry object for a key
CacheEntry* GetCacheEntry(const std::string& key);
+ const CacheEntry* GetCacheEntry(const std::string& key) const;
+
//! Clean out the CMakeFiles directory if no CMakeCache.txt
void CleanCMakeFiles(const std::string& path);
- // Cache version info
- unsigned int CacheMajorVersion;
- unsigned int CacheMinorVersion;
-
-private:
- using CacheEntryMap = std::map<std::string, CacheEntry>;
static void OutputHelpString(std::ostream& fout,
const std::string& helpString);
static void OutputWarningComment(std::ostream& fout,
@@ -228,15 +199,15 @@ private:
std::string const& value);
static const char* PersistentProperties[];
- bool ReadPropertyEntry(std::string const& key, CacheEntry& e);
- void WritePropertyEntries(std::ostream& os, CacheIterator i,
- cmMessenger* messenger);
-
- CacheEntryMap Cache;
- // Only cmake and cmState should be able to add cache values
- // the commands should never use the cmCacheManager directly
- friend class cmState; // allow access to add cache values
- friend class cmake; // allow access to add cache values
+ bool ReadPropertyEntry(const std::string& key, const CacheEntry& e);
+ void WritePropertyEntries(std::ostream& os, const std::string& entryKey,
+ const CacheEntry& e, cmMessenger* messenger) const;
+
+ std::map<std::string, CacheEntry> Cache;
+
+ // Cache version info
+ unsigned int CacheMajorVersion = 0;
+ unsigned int CacheMinorVersion = 0;
};
#endif
diff --git a/Source/cmCallVisualStudioMacro.cxx b/Source/cmCallVisualStudioMacro.cxx
index 9e152ff..94b6e18 100644
--- a/Source/cmCallVisualStudioMacro.cxx
+++ b/Source/cmCallVisualStudioMacro.cxx
@@ -43,8 +43,7 @@ static bool LogErrorsAsMessages;
if (LogErrorsAsMessages) { \
std::ostringstream _hresult_oss; \
_hresult_oss.flags(std::ios::hex); \
- _hresult_oss << context << " failed HRESULT, hr = 0x" << hr \
- << std::endl; \
+ _hresult_oss << context << " failed HRESULT, hr = 0x" << hr << '\n'; \
_hresult_oss.flags(std::ios::dec); \
_hresult_oss << __FILE__ << "(" << __LINE__ << ")"; \
cmSystemTools::Message(_hresult_oss.str()); \
@@ -98,32 +97,37 @@ HRESULT InstanceCallMacro(IDispatch* vsIDE, const std::string& macro,
DISPATCH_METHOD, &params, &result, &excep, &arg);
std::ostringstream oss;
- oss << std::endl;
- oss << "Invoke(ExecuteCommand)" << std::endl;
- oss << " Macro: " << macro << std::endl;
- oss << " Args: " << args << std::endl;
+ /* clang-format off */
+ oss << "\nInvoke(ExecuteCommand)\n"
+ " Macro: " << macro << "\n"
+ " Args: " << args << '\n';
+ /* clang-format on */
if (DISP_E_EXCEPTION == hr) {
- oss << "DISP_E_EXCEPTION EXCEPINFO:" << excep.wCode << std::endl;
- oss << " wCode: " << excep.wCode << std::endl;
- oss << " wReserved: " << excep.wReserved << std::endl;
+ /* clang-format off */
+ oss << "DISP_E_EXCEPTION EXCEPINFO:" << excep.wCode << "\n"
+ " wCode: " << excep.wCode << "\n"
+ " wReserved: " << excep.wReserved << '\n';
+ /* clang-format on */
if (excep.bstrSource) {
oss << " bstrSource: " << (const char*)(_bstr_t)excep.bstrSource
- << std::endl;
+ << '\n';
}
if (excep.bstrDescription) {
oss << " bstrDescription: "
- << (const char*)(_bstr_t)excep.bstrDescription << std::endl;
+ << (const char*)(_bstr_t)excep.bstrDescription << '\n';
}
if (excep.bstrHelpFile) {
oss << " bstrHelpFile: " << (const char*)(_bstr_t)excep.bstrHelpFile
- << std::endl;
+ << '\n';
}
- oss << " dwHelpContext: " << excep.dwHelpContext << std::endl;
- oss << " pvReserved: " << excep.pvReserved << std::endl;
- oss << " pfnDeferredFillIn: "
- << reinterpret_cast<void*>(excep.pfnDeferredFillIn) << std::endl;
- oss << " scode: " << excep.scode << std::endl;
+ /* clang-format off */
+ oss << " dwHelpContext: " << excep.dwHelpContext << "\n"
+ " pvReserved: " << excep.pvReserved << "\n"
+ " pfnDeferredFillIn: "
+ << reinterpret_cast<void*>(excep.pfnDeferredFillIn) << "\n"
+ " scode: " << excep.scode << '\n';
+ /* clang-format on */
}
std::string exstr(oss.str());
diff --git a/Source/cmCommandArgumentParserHelper.cxx b/Source/cmCommandArgumentParserHelper.cxx
index 613ae06..0516d26 100644
--- a/Source/cmCommandArgumentParserHelper.cxx
+++ b/Source/cmCommandArgumentParserHelper.cxx
@@ -5,6 +5,9 @@
#include <cstring>
#include <iostream>
#include <sstream>
+#include <utility>
+
+#include <cm/memory>
#include "cmCommandArgumentLexer.h"
#include "cmMakefile.h"
@@ -40,10 +43,10 @@ const char* cmCommandArgumentParserHelper::AddString(const std::string& str)
if (str.empty()) {
return "";
}
- char* stVal = new char[str.size() + 1];
- strcpy(stVal, str.c_str());
- this->Variables.push_back(stVal);
- return stVal;
+ auto stVal = cm::make_unique<char[]>(str.size() + 1);
+ strcpy(stVal.get(), str.c_str());
+ this->Variables.push_back(std::move(stVal));
+ return this->Variables.back().get();
}
const char* cmCommandArgumentParserHelper::ExpandSpecialVariable(
@@ -66,8 +69,7 @@ const char* cmCommandArgumentParserHelper::ExpandSpecialVariable(
return "";
}
if (strcmp(key, "CACHE") == 0) {
- if (const std::string* c =
- this->Makefile->GetState()->GetInitializedCacheValue(var)) {
+ if (cmProp c = this->Makefile->GetState()->GetInitializedCacheValue(var)) {
if (this->EscapeQuotes) {
return this->AddString(cmEscapeQuotes(*c));
}
@@ -136,11 +138,11 @@ const char* cmCommandArgumentParserHelper::CombineUnions(const char* in1,
return in1;
}
size_t len = strlen(in1) + strlen(in2) + 1;
- char* out = new char[len];
- strcpy(out, in1);
- strcat(out, in2);
- this->Variables.push_back(out);
- return out;
+ auto out = cm::make_unique<char[]>(len);
+ strcpy(out.get(), in1);
+ strcat(out.get(), in2);
+ this->Variables.push_back(std::move(out));
+ return this->Variables.back().get();
}
void cmCommandArgumentParserHelper::AllocateParserType(
@@ -153,11 +155,11 @@ void cmCommandArgumentParserHelper::AllocateParserType(
if (len == 0) {
return;
}
- char* out = new char[len + 1];
- memcpy(out, str, len);
- out[len] = 0;
- pt->str = out;
- this->Variables.push_back(out);
+ auto out = cm::make_unique<char[]>(len + 1);
+ memcpy(out.get(), str, len);
+ out.get()[len] = 0;
+ pt->str = out.get();
+ this->Variables.push_back(std::move(out));
}
bool cmCommandArgumentParserHelper::HandleEscapeSymbol(
@@ -235,10 +237,7 @@ int cmCommandArgumentParserHelper::ParseString(const char* str, int verb)
void cmCommandArgumentParserHelper::CleanupParser()
{
- for (char* var : this->Variables) {
- delete[] var;
- }
- this->Variables.erase(this->Variables.begin(), this->Variables.end());
+ this->Variables.clear();
}
int cmCommandArgumentParserHelper::LexInput(char* buf, int maxlen)
diff --git a/Source/cmCommandArgumentParserHelper.h b/Source/cmCommandArgumentParserHelper.h
index 25e6892..b46edcb 100644
--- a/Source/cmCommandArgumentParserHelper.h
+++ b/Source/cmCommandArgumentParserHelper.h
@@ -5,6 +5,7 @@
#include "cmConfigure.h" // IWYU pragma: keep
+#include <memory>
#include <string>
#include <vector>
@@ -69,7 +70,7 @@ private:
void CleanupParser();
void SetError(std::string const& msg);
- std::vector<char*> Variables;
+ std::vector<std::unique_ptr<char[]>> Variables;
const cmMakefile* Makefile;
std::string Result;
std::string ErrorString;
diff --git a/Source/cmCommands.cxx b/Source/cmCommands.cxx
index 896b6a9..28b4267 100644
--- a/Source/cmCommands.cxx
+++ b/Source/cmCommands.cxx
@@ -91,6 +91,7 @@
# include "cmAddLinkOptionsCommand.h"
# include "cmAuxSourceDirectoryCommand.h"
# include "cmBuildNameCommand.h"
+# include "cmCMakeCommand.h"
# include "cmCMakeHostSystemInformationCommand.h"
# include "cmExportCommand.h"
# include "cmExportLibraryDependenciesCommand.h"
@@ -196,6 +197,7 @@ void GetScriptingCommands(cmState* state)
"match the opening WHILE command.");
#if !defined(CMAKE_BOOTSTRAP)
+ state->AddBuiltinCommand("cmake_command", cmCMakeCommand);
state->AddBuiltinCommand("cmake_host_system_information",
cmCMakeHostSystemInformationCommand);
state->AddBuiltinCommand("load_cache", cmLoadCacheCommand);
diff --git a/Source/cmCommonTargetGenerator.cxx b/Source/cmCommonTargetGenerator.cxx
index 033cb60..5414409 100644
--- a/Source/cmCommonTargetGenerator.cxx
+++ b/Source/cmCommonTargetGenerator.cxx
@@ -73,11 +73,12 @@ void cmCommonTargetGenerator::AddModuleDefinitionFlag(
void cmCommonTargetGenerator::AppendFortranFormatFlags(
std::string& flags, cmSourceFile const& source)
{
- const char* srcfmt = source.GetProperty("Fortran_FORMAT");
+ const std::string srcfmt = source.GetSafeProperty("Fortran_FORMAT");
cmOutputConverter::FortranFormat format =
cmOutputConverter::GetFortranFormat(srcfmt);
if (format == cmOutputConverter::FortranFormatNone) {
- const char* tgtfmt = this->GeneratorTarget->GetProperty("Fortran_FORMAT");
+ std::string const& tgtfmt =
+ this->GeneratorTarget->GetSafeProperty("Fortran_FORMAT");
format = cmOutputConverter::GetFortranFormat(tgtfmt);
}
const char* var = nullptr;
@@ -98,17 +99,20 @@ void cmCommonTargetGenerator::AppendFortranFormatFlags(
}
std::string cmCommonTargetGenerator::GetFlags(const std::string& l,
- const std::string& config)
+ const std::string& config,
+ const std::string& arch)
{
- auto i = this->Configs[config].FlagsByLanguage.find(l);
- if (i == this->Configs[config].FlagsByLanguage.end()) {
+ const std::string key = config + arch;
+
+ auto i = this->Configs[key].FlagsByLanguage.find(l);
+ if (i == this->Configs[key].FlagsByLanguage.end()) {
std::string flags;
this->LocalCommonGenerator->GetTargetCompileFlags(this->GeneratorTarget,
- config, l, flags);
+ config, l, flags, arch);
ByLanguageMap::value_type entry(l, flags);
- i = this->Configs[config].FlagsByLanguage.insert(entry).first;
+ i = this->Configs[key].FlagsByLanguage.insert(entry).first;
}
return i->second;
}
@@ -221,9 +225,9 @@ std::string cmCommonTargetGenerator::GetAIXExports(std::string const&)
{
std::string aixExports;
if (this->GeneratorTarget->Target->IsAIX()) {
- if (const char* exportAll =
+ if (cmProp exportAll =
this->GeneratorTarget->GetProperty("AIX_EXPORT_ALL_SYMBOLS")) {
- if (cmIsOff(exportAll)) {
+ if (cmIsOff(*exportAll)) {
aixExports = "-n";
}
}
diff --git a/Source/cmCommonTargetGenerator.h b/Source/cmCommonTargetGenerator.h
index b40a2ed..78cedf5 100644
--- a/Source/cmCommonTargetGenerator.h
+++ b/Source/cmCommonTargetGenerator.h
@@ -51,7 +51,8 @@ protected:
void AppendOSXVerFlag(std::string& flags, const std::string& lang,
const char* name, bool so);
- std::string GetFlags(const std::string& l, const std::string& config);
+ std::string GetFlags(const std::string& l, const std::string& config,
+ const std::string& arch = std::string());
std::string GetDefines(const std::string& l, const std::string& config);
std::string GetIncludes(std::string const& l, const std::string& config);
std::string GetManifests(const std::string& config);
diff --git a/Source/cmComputeLinkInformation.cxx b/Source/cmComputeLinkInformation.cxx
index 11570d6..ea7ede4 100644
--- a/Source/cmComputeLinkInformation.cxx
+++ b/Source/cmComputeLinkInformation.cxx
@@ -9,8 +9,8 @@
#include <utility>
#include <cm/memory>
+#include <cmext/algorithm>
-#include "cmAlgorithms.h"
#include "cmComputeLinkDepends.h"
#include "cmGeneratorExpression.h"
#include "cmGeneratorTarget.h"
@@ -514,8 +514,8 @@ bool cmComputeLinkInformation::Compute()
// Restore the target link type so the correct system runtime
// libraries are found.
- const char* lss = this->Target->GetProperty("LINK_SEARCH_END_STATIC");
- if (cmIsOn(lss)) {
+ cmProp lss = this->Target->GetProperty("LINK_SEARCH_END_STATIC");
+ if (lss && cmIsOn(*lss)) {
this->SetCurrentLinkType(LinkStatic);
} else {
this->SetCurrentLinkType(this->StartLinkType);
@@ -591,10 +591,9 @@ void cmComputeLinkInformation::AddRuntimeLinkLibrary(std::string const& lang)
// of a default selection whether or not it is overridden by a property.
std::string defaultVar =
cmStrCat("CMAKE_", lang, "_RUNTIME_LIBRARY_DEFAULT");
- const char* langRuntimeLibraryDefault =
- this->Makefile->GetDefinition(defaultVar);
- if (langRuntimeLibraryDefault && *langRuntimeLibraryDefault) {
- const char* runtimeLibraryValue =
+ cmProp langRuntimeLibraryDefault = this->Makefile->GetDef(defaultVar);
+ if (langRuntimeLibraryDefault && !langRuntimeLibraryDefault->empty()) {
+ cmProp runtimeLibraryValue =
this->Target->GetProperty(cmStrCat(lang, "_RUNTIME_LIBRARY"));
if (!runtimeLibraryValue) {
runtimeLibraryValue = langRuntimeLibraryDefault;
@@ -602,7 +601,7 @@ void cmComputeLinkInformation::AddRuntimeLinkLibrary(std::string const& lang)
std::string runtimeLibrary =
cmSystemTools::UpperCase(cmGeneratorExpression::Evaluate(
- runtimeLibraryValue, this->Target->GetLocalGenerator(), this->Config,
+ *runtimeLibraryValue, this->Target->GetLocalGenerator(), this->Config,
this->Target));
if (!runtimeLibrary.empty()) {
if (const char* runtimeLinkOptions = this->Makefile->GetDefinition(
@@ -610,7 +609,7 @@ void cmComputeLinkInformation::AddRuntimeLinkLibrary(std::string const& lang)
runtimeLibrary)) {
std::vector<std::string> libsVec = cmExpandedList(runtimeLinkOptions);
for (std::string const& i : libsVec) {
- if (!cmContains(this->ImplicitLinkLibs, i)) {
+ if (!cm::contains(this->ImplicitLinkLibs, i)) {
this->AddItem(i, nullptr);
}
}
@@ -627,7 +626,7 @@ void cmComputeLinkInformation::AddImplicitLinkInfo(std::string const& lang)
if (const char* libs = this->Makefile->GetDefinition(libVar)) {
std::vector<std::string> libsVec = cmExpandedList(libs);
for (std::string const& i : libsVec) {
- if (!cmContains(this->ImplicitLinkLibs, i)) {
+ if (!cm::contains(this->ImplicitLinkLibs, i)) {
this->AddItem(i, nullptr);
}
}
@@ -855,8 +854,8 @@ void cmComputeLinkInformation::ComputeLinkTypeInfo()
}
// Lookup the starting link type from the target (linked statically?).
- const char* lss = this->Target->GetProperty("LINK_SEARCH_START_STATIC");
- this->StartLinkType = cmIsOn(lss) ? LinkStatic : LinkShared;
+ cmProp lss = this->Target->GetProperty("LINK_SEARCH_START_STATIC");
+ this->StartLinkType = (lss && cmIsOn(*lss)) ? LinkStatic : LinkShared;
this->CurrentLinkType = this->StartLinkType;
}
@@ -998,15 +997,16 @@ std::string cmComputeLinkInformation::CreateExtensionRegex(
std::string cmComputeLinkInformation::NoCaseExpression(const char* str)
{
std::string ret;
+ ret.reserve(strlen(str) * 4);
const char* s = str;
while (*s) {
if (*s == '.') {
ret += *s;
} else {
- ret += "[";
+ ret += '[';
ret += static_cast<char>(tolower(*s));
ret += static_cast<char>(toupper(*s));
- ret += "]";
+ ret += ']';
}
s++;
}
@@ -1063,8 +1063,8 @@ void cmComputeLinkInformation::AddTargetItem(BT<std::string> const& item,
// For compatibility with CMake 2.4 include the item's directory in
// the linker search path.
if (this->OldLinkDirMode && !target->IsFrameworkOnApple() &&
- !cmContains(this->OldLinkDirMask,
- cmSystemTools::GetFilenamePath(item.Value))) {
+ !cm::contains(this->OldLinkDirMask,
+ cmSystemTools::GetFilenamePath(item.Value))) {
this->OldLinkDirItems.push_back(item.Value);
}
@@ -1117,8 +1117,8 @@ void cmComputeLinkInformation::AddFullItem(BT<std::string> const& item)
// For compatibility with CMake 2.4 include the item's directory in
// the linker search path.
if (this->OldLinkDirMode &&
- !cmContains(this->OldLinkDirMask,
- cmSystemTools::GetFilenamePath(item.Value))) {
+ !cm::contains(this->OldLinkDirMask,
+ cmSystemTools::GetFilenamePath(item.Value))) {
this->OldLinkDirItems.push_back(item.Value);
}
@@ -1137,7 +1137,7 @@ bool cmComputeLinkInformation::CheckImplicitDirItem(std::string const& item)
// Check if this item is in an implicit link directory.
std::string dir = cmSystemTools::GetFilenamePath(item);
- if (!cmContains(this->ImplicitLinkDirs, dir)) {
+ if (!cm::contains(this->ImplicitLinkDirs, dir)) {
// Only libraries in implicit link directories are converted to
// pathless items.
return false;
@@ -1200,7 +1200,8 @@ void cmComputeLinkInformation::AddUserItem(BT<std::string> const& item,
// CMP0003 so put it in OldUserFlagItems, if it is not a -l
// or -Wl,-l (-framework -pthread), then allow it without a
// CMP0003 as -L will not affect those other linker flags
- if (item.Value.find("-l") == 0 || item.Value.find("-Wl,-l") == 0) {
+ if (cmHasLiteralPrefix(item.Value, "-l") ||
+ cmHasLiteralPrefix(item.Value, "-Wl,-l")) {
// This is a linker option provided by the user.
this->OldUserFlagItems.push_back(item.Value);
}
@@ -1439,7 +1440,6 @@ void cmComputeLinkInformation::HandleBadFullItem(std::string const& item,
}
case cmPolicies::OLD:
// OLD behavior does not warn.
- break;
case cmPolicies::NEW:
// NEW behavior will not get here.
break;
@@ -1796,11 +1796,11 @@ void cmComputeLinkInformation::GetRPath(std::vector<std::string>& runtimeDirs,
// support or if using the link path as an rpath.
if (use_build_rpath) {
std::string d = ri;
- if (!rootPath.empty() && d.find(rootPath) == 0) {
- d = d.substr(rootPath.size());
- } else if (stagePath && *stagePath && d.find(stagePath) == 0) {
- std::string suffix = d.substr(strlen(stagePath));
- d = cmStrCat(installPrefix, '/', suffix);
+ if (!rootPath.empty() && cmHasPrefix(d, rootPath)) {
+ d.erase(0, rootPath.size());
+ } else if (stagePath && *stagePath && cmHasPrefix(d, stagePath)) {
+ d.erase(0, strlen(stagePath));
+ d = cmStrCat(installPrefix, '/', d);
cmSystemTools::ConvertToUnixSlashes(d);
} else if (use_relative_build_rpath) {
// If expansion of the $ORIGIN token is supported and permitted per
@@ -1827,11 +1827,11 @@ void cmComputeLinkInformation::GetRPath(std::vector<std::string>& runtimeDirs,
!cmSystemTools::IsSubDirectory(ri, topSourceDir) &&
!cmSystemTools::IsSubDirectory(ri, topBinaryDir)) {
std::string d = ri;
- if (!rootPath.empty() && d.find(rootPath) == 0) {
- d = d.substr(rootPath.size());
- } else if (stagePath && *stagePath && d.find(stagePath) == 0) {
- std::string suffix = d.substr(strlen(stagePath));
- d = cmStrCat(installPrefix, '/', suffix);
+ if (!rootPath.empty() && cmHasPrefix(d, rootPath)) {
+ d.erase(0, rootPath.size());
+ } else if (stagePath && *stagePath && cmHasPrefix(d, stagePath)) {
+ d.erase(0, strlen(stagePath));
+ d = cmStrCat(installPrefix, '/', d);
cmSystemTools::ConvertToUnixSlashes(d);
}
if (emitted.insert(d).second) {
diff --git a/Source/cmComputeTargetDepends.cxx b/Source/cmComputeTargetDepends.cxx
index a98a608..41f5346 100644
--- a/Source/cmComputeTargetDepends.cxx
+++ b/Source/cmComputeTargetDepends.cxx
@@ -198,6 +198,20 @@ void cmComputeTargetDepends::CollectTargetDepends(int depender_index)
std::vector<std::string> const& configs =
depender->Makefile->GetGeneratorConfigs();
for (std::string const& it : configs) {
+ cmLinkImplementation const* impl = depender->GetLinkImplementation(it);
+
+ // A target should not depend on itself.
+ emitted.insert(cmLinkItem(depender, false, cmListFileBacktrace()));
+ emitted.insert(cmLinkItem(depender, true, cmListFileBacktrace()));
+ for (cmLinkImplItem const& lib : impl->Libraries) {
+ // Don't emit the same library twice for this target.
+ if (emitted.insert(lib).second) {
+ this->AddTargetDepend(depender_index, lib, true, false);
+ this->AddInterfaceDepends(depender_index, lib, it, emitted);
+ }
+ }
+
+ // Add dependencies on object libraries not otherwise handled above.
std::vector<cmSourceFile const*> objectFiles;
depender->GetExternalObjects(objectFiles, it);
for (cmSourceFile const* o : objectFiles) {
@@ -222,19 +236,6 @@ void cmComputeTargetDepends::CollectTargetDepends(int depender_index)
}
}
}
-
- cmLinkImplementation const* impl = depender->GetLinkImplementation(it);
-
- // A target should not depend on itself.
- emitted.insert(cmLinkItem(depender, false, cmListFileBacktrace()));
- emitted.insert(cmLinkItem(depender, true, cmListFileBacktrace()));
- for (cmLinkImplItem const& lib : impl->Libraries) {
- // Don't emit the same library twice for this target.
- if (emitted.insert(lib).second) {
- this->AddTargetDepend(depender_index, lib, true, false);
- this->AddInterfaceDepends(depender_index, lib, it, emitted);
- }
- }
}
}
diff --git a/Source/cmConditionEvaluator.cxx b/Source/cmConditionEvaluator.cxx
index fda687f..7a3a3e8 100644
--- a/Source/cmConditionEvaluator.cxx
+++ b/Source/cmConditionEvaluator.cxx
@@ -13,7 +13,6 @@
#include "cmsys/RegularExpression.hxx"
-#include "cmAlgorithms.h"
#include "cmMakefile.h"
#include "cmMessageType.h"
#include "cmState.h"
@@ -494,12 +493,12 @@ bool cmConditionEvaluator::HandleLevel1(cmArgumentList& newArgs, std::string&,
if (this->IsKeyword(keyDEFINED, *arg) && argP1 != newArgs.end()) {
size_t argP1len = argP1->GetValue().size();
bool bdef = false;
- if (argP1len > 4 && argP1->GetValue().substr(0, 4) == "ENV{" &&
+ if (argP1len > 4 && cmHasLiteralPrefix(argP1->GetValue(), "ENV{") &&
argP1->GetValue().operator[](argP1len - 1) == '}') {
std::string env = argP1->GetValue().substr(4, argP1len - 5);
bdef = cmSystemTools::HasEnv(env);
} else if (argP1len > 6 &&
- argP1->GetValue().substr(0, 6) == "CACHE{" &&
+ cmHasLiteralPrefix(argP1->GetValue(), "CACHE{") &&
argP1->GetValue().operator[](argP1len - 1) == '}') {
std::string cache = argP1->GetValue().substr(6, argP1len - 7);
bdef =
@@ -673,7 +672,7 @@ bool cmConditionEvaluator::HandleLevel2(cmArgumentList& newArgs,
if (def2) {
std::vector<std::string> list = cmExpandedList(def2, true);
- result = cmContains(list, def);
+ result = cm::contains(list, def);
}
this->HandleBinaryOp(result, reducible, arg, newArgs, argP1, argP2);
diff --git a/Source/cmConfigureFileCommand.cxx b/Source/cmConfigureFileCommand.cxx
index 8767386..5b3045d 100644
--- a/Source/cmConfigureFileCommand.cxx
+++ b/Source/cmConfigureFileCommand.cxx
@@ -2,6 +2,11 @@
file Copyright.txt or https://cmake.org/licensing for details. */
#include "cmConfigureFileCommand.h"
+#include <set>
+
+#include <cm/string_view>
+#include <cmext/string_view>
+
#include "cmExecutionStatus.h"
#include "cmMakefile.h"
#include "cmMessageType.h"
@@ -56,6 +61,18 @@ bool cmConfigureFileCommand(std::vector<std::string> const& args,
bool copyOnly = false;
bool escapeQuotes = false;
+ static std::set<cm::string_view> noopOptions = {
+ /* Legacy. */
+ "IMMEDIATE"_s,
+ /* Handled by NewLineStyle member. */
+ "NEWLINE_STYLE"_s,
+ "LF"_s,
+ "UNIX"_s,
+ "CRLF"_s,
+ "WIN32"_s,
+ "DOS"_s,
+ };
+
std::string unknown_args;
bool atOnly = false;
for (unsigned int i = 2; i < args.size(); ++i) {
@@ -70,12 +87,8 @@ bool cmConfigureFileCommand(std::vector<std::string> const& args,
escapeQuotes = true;
} else if (args[i] == "@ONLY") {
atOnly = true;
- } else if (args[i] == "IMMEDIATE") {
- /* Ignore legacy option. */
- } else if (args[i] == "NEWLINE_STYLE" || args[i] == "LF" ||
- args[i] == "UNIX" || args[i] == "CRLF" || args[i] == "WIN32" ||
- args[i] == "DOS") {
- /* Options handled by NewLineStyle member above. */
+ } else if (noopOptions.find(args[i]) != noopOptions.end()) {
+ /* Ignore no-op options. */
} else {
unknown_args += " ";
unknown_args += args[i];
diff --git a/Source/cmConnection.cxx b/Source/cmConnection.cxx
index 884e314..e4d0cf1 100644
--- a/Source/cmConnection.cxx
+++ b/Source/cmConnection.cxx
@@ -5,7 +5,7 @@
#include <cassert>
#include <cstring>
-#include "cm_uv.h"
+#include <cm3p/uv.h>
#include "cmServer.h"
@@ -20,8 +20,13 @@ void cmEventBasedConnection::on_alloc_buffer(uv_handle_t* handle,
uv_buf_t* buf)
{
(void)(handle);
+#ifndef __clang_analyzer__
char* rawBuffer = new char[suggested_size];
*buf = uv_buf_init(rawBuffer, static_cast<unsigned int>(suggested_size));
+#else
+ (void)(suggested_size);
+ (void)(buf);
+#endif /* __clang_analyzer__ */
}
void cmEventBasedConnection::on_read(uv_stream_t* stream, ssize_t nread,
@@ -76,6 +81,7 @@ void cmEventBasedConnection::WriteData(const std::string& _data)
assert(uv_thread_equal(&curr_thread_id, &this->Server->ServeThreadId));
#endif
+#ifndef __clang_analyzer__
auto data = _data;
assert(this->WriteStream.get());
if (BufferStrategy) {
@@ -90,6 +96,9 @@ void cmEventBasedConnection::WriteData(const std::string& _data)
memcpy(req->buf.base, data.c_str(), ds);
uv_write(reinterpret_cast<uv_write_t*>(req), this->WriteStream, &req->buf, 1,
on_write);
+#else
+ (void)(_data);
+#endif /* __clang_analyzer__ */
}
void cmEventBasedConnection::ReadData(const std::string& data)
diff --git a/Source/cmConnection.h b/Source/cmConnection.h
index 7bb2494..5335a7f 100644
--- a/Source/cmConnection.h
+++ b/Source/cmConnection.h
@@ -9,7 +9,7 @@
#include <memory>
#include <string>
-#include "cm_uv.h"
+#include <cm3p/uv.h>
#include "cmUVHandlePtr.h"
diff --git a/Source/cmConvertMSBuildXMLToJSON.py b/Source/cmConvertMSBuildXMLToJSON.py
index 02074ba..2be3781 100644
--- a/Source/cmConvertMSBuildXMLToJSON.py
+++ b/Source/cmConvertMSBuildXMLToJSON.py
@@ -35,12 +35,14 @@ def vsflags(*args):
return values
-def read_msbuild_xml(path, values={}):
+def read_msbuild_xml(path, values=None):
"""Reads the MS Build XML file at the path and returns its contents.
Keyword arguments:
values -- The map to append the contents to (default {})
"""
+ if values is None:
+ values = {}
# Attempt to read the file contents
try:
@@ -76,12 +78,15 @@ def read_msbuild_xml(path, values={}):
return values
-def read_msbuild_json(path, values=[]):
+def read_msbuild_json(path, values=None):
"""Reads the MS Build JSON file at the path and returns its contents.
Keyword arguments:
values -- The list to append the contents to (default [])
"""
+ if values is None:
+ values = []
+
if not os.path.exists(path):
logging.info('Could not find MS Build JSON file at %s', path)
return values
diff --git a/Source/cmCoreTryCompile.cxx b/Source/cmCoreTryCompile.cxx
index 73f099b..cc2cd01 100644
--- a/Source/cmCoreTryCompile.cxx
+++ b/Source/cmCoreTryCompile.cxx
@@ -8,9 +8,9 @@
#include <sstream>
#include <utility>
-#include "cmsys/Directory.hxx"
+#include <cmext/string_view>
-#include "cm_static_string_view.hxx"
+#include "cmsys/Directory.hxx"
#include "cmExportTryCompileFileGenerator.h"
#include "cmGlobalGenerator.h"
@@ -40,6 +40,10 @@ static std::string const kCMAKE_CXX_LINK_NO_PIE_SUPPORTED =
"CMAKE_CXX_LINK_NO_PIE_SUPPORTED";
static std::string const kCMAKE_CXX_LINK_PIE_SUPPORTED =
"CMAKE_CXX_LINK_PIE_SUPPORTED";
+static std::string const kCMAKE_CUDA_ARCHITECTURES =
+ "CMAKE_CUDA_ARCHITECTURES";
+static std::string const kCMAKE_CUDA_COMPILER_TARGET =
+ "CMAKE_CUDA_COMPILER_TARGET";
static std::string const kCMAKE_CUDA_RUNTIME_LIBRARY =
"CMAKE_CUDA_RUNTIME_LIBRARY";
static std::string const kCMAKE_ENABLE_EXPORTS = "CMAKE_ENABLE_EXPORTS";
@@ -103,29 +107,23 @@ int cmCoreTryCompile::TryCompileCode(std::vector<std::string> const& argv,
this->SrcFileSignature = true;
cmStateEnums::TargetType targetType = cmStateEnums::EXECUTABLE;
- const char* tt =
- this->Makefile->GetDefinition("CMAKE_TRY_COMPILE_TARGET_TYPE");
- if (!isTryRun && tt && *tt) {
- if (strcmp(tt, cmState::GetTargetTypeName(cmStateEnums::EXECUTABLE)) ==
- 0) {
+ const std::string* tt =
+ this->Makefile->GetDef("CMAKE_TRY_COMPILE_TARGET_TYPE");
+ if (!isTryRun && tt && !tt->empty()) {
+ if (*tt == cmState::GetTargetTypeName(cmStateEnums::EXECUTABLE)) {
targetType = cmStateEnums::EXECUTABLE;
- } else if (strcmp(tt,
- cmState::GetTargetTypeName(
- cmStateEnums::STATIC_LIBRARY)) == 0) {
+ } else if (*tt ==
+ cmState::GetTargetTypeName(cmStateEnums::STATIC_LIBRARY)) {
targetType = cmStateEnums::STATIC_LIBRARY;
} else {
this->Makefile->IssueMessage(
MessageType::FATAL_ERROR,
- std::string("Invalid value '") + tt +
- "' for "
- "CMAKE_TRY_COMPILE_TARGET_TYPE. Only "
- "'" +
- cmState::GetTargetTypeName(cmStateEnums::EXECUTABLE) +
- "' and "
- "'" +
- cmState::GetTargetTypeName(cmStateEnums::STATIC_LIBRARY) +
- "' "
- "are allowed.");
+ cmStrCat("Invalid value '", *tt,
+ "' for CMAKE_TRY_COMPILE_TARGET_TYPE. Only '",
+ cmState::GetTargetTypeName(cmStateEnums::EXECUTABLE),
+ "' and '",
+ cmState::GetTargetTypeName(cmStateEnums::STATIC_LIBRARY),
+ "' are allowed."));
return -1;
}
}
@@ -298,12 +296,10 @@ int cmCoreTryCompile::TryCompileCode(std::vector<std::string> const& argv,
default:
this->Makefile->IssueMessage(
MessageType::FATAL_ERROR,
- "Only libraries may be used as try_compile or try_run IMPORTED "
- "LINK_LIBRARIES. Got " +
- std::string(tgt->GetName()) +
- " of "
- "type " +
- cmState::GetTargetTypeName(tgt->GetType()) + ".");
+ cmStrCat("Only libraries may be used as try_compile or try_run "
+ "IMPORTED LINK_LIBRARIES. Got ",
+ tgt->GetName(), " of type ",
+ cmState::GetTargetTypeName(tgt->GetType()), "."));
return -1;
}
if (tgt->IsImported()) {
@@ -721,6 +717,8 @@ int cmCoreTryCompile::TryCompileCode(std::vector<std::string> const& argv,
vars.insert(kCMAKE_C_COMPILER_TARGET);
vars.insert(kCMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN);
vars.insert(kCMAKE_CXX_COMPILER_TARGET);
+ vars.insert(kCMAKE_CUDA_ARCHITECTURES);
+ vars.insert(kCMAKE_CUDA_COMPILER_TARGET);
vars.insert(kCMAKE_CUDA_RUNTIME_LIBRARY);
vars.insert(kCMAKE_ENABLE_EXPORTS);
vars.insert(kCMAKE_LINK_SEARCH_END_STATIC);
diff --git a/Source/cmCryptoHash.cxx b/Source/cmCryptoHash.cxx
index dc7d939..b1e63ba 100644
--- a/Source/cmCryptoHash.cxx
+++ b/Source/cmCryptoHash.cxx
@@ -4,10 +4,10 @@
#include <cm/memory>
-#include "cmsys/FStream.hxx"
+#include <cm3p/kwiml/int.h>
+#include <cm3p/rhash.h>
-#include "cm_kwiml.h"
-#include "cm_rhash.h"
+#include "cmsys/FStream.hxx"
static unsigned int const cmCryptoHashAlgoToId[] = {
/* clang-format needs this comment to break after the opening brace */
diff --git a/Source/cmCurl.h b/Source/cmCurl.h
index cb73ce6..7bd036e 100644
--- a/Source/cmCurl.h
+++ b/Source/cmCurl.h
@@ -7,7 +7,7 @@
#include <string>
-#include "cm_curl.h"
+#include <cm3p/curl/curl.h>
std::string cmCurlSetCAInfo(::CURL* curl, const char* cafile = nullptr);
std::string cmCurlSetNETRCOption(::CURL* curl, const std::string& netrc_level,
diff --git a/Source/cmCustomCommand.cxx b/Source/cmCustomCommand.cxx
index 0dd8722..149f5e9 100644
--- a/Source/cmCustomCommand.cxx
+++ b/Source/cmCustomCommand.cxx
@@ -11,7 +11,8 @@ cmCustomCommand::cmCustomCommand(std::vector<std::string> outputs,
std::vector<std::string> depends,
cmCustomCommandLines commandLines,
cmListFileBacktrace lfbt, const char* comment,
- const char* workingDirectory)
+ const char* workingDirectory,
+ bool stdPipesUTF8)
: Outputs(std::move(outputs))
, Byproducts(std::move(byproducts))
, Depends(std::move(depends))
@@ -20,6 +21,7 @@ cmCustomCommand::cmCustomCommand(std::vector<std::string> outputs,
, Comment(comment ? comment : "")
, WorkingDirectory(workingDirectory ? workingDirectory : "")
, HaveComment(comment != nullptr)
+ , StdPipesUTF8(stdPipesUTF8)
{
}
diff --git a/Source/cmCustomCommand.h b/Source/cmCustomCommand.h
index d300fa5..aa572ad 100644
--- a/Source/cmCustomCommand.h
+++ b/Source/cmCustomCommand.h
@@ -30,7 +30,8 @@ public:
std::vector<std::string> byproducts,
std::vector<std::string> depends,
cmCustomCommandLines commandLines, cmListFileBacktrace lfbt,
- const char* comment, const char* workingDirectory);
+ const char* comment, const char* workingDirectory,
+ bool stdPipesUTF8);
/** Get the output file produced by the command. */
const std::vector<std::string>& GetOutputs() const;
@@ -53,6 +54,9 @@ public:
/** Get the comment string for the command. */
const char* GetComment() const;
+ /** Get a value indicating if the command uses UTF-8 output pipes. */
+ bool GetStdPipesUTF8() const { return this->StdPipesUTF8; }
+
/** Append to the list of command lines. */
void AppendCommands(const cmCustomCommandLines& commandLines);
@@ -108,6 +112,7 @@ private:
bool EscapeOldStyle = true;
bool UsesTerminal = false;
bool CommandExpandLists = false;
+ bool StdPipesUTF8 = false;
};
#endif
diff --git a/Source/cmCustomCommandGenerator.cxx b/Source/cmCustomCommandGenerator.cxx
index 2432d2b..0fe19b6 100644
--- a/Source/cmCustomCommandGenerator.cxx
+++ b/Source/cmCustomCommandGenerator.cxx
@@ -111,13 +111,13 @@ void cmCustomCommandGenerator::FillEmulatorsWithArguments()
if (target && target->GetType() == cmStateEnums::EXECUTABLE &&
!target->IsImported()) {
- const char* emulator_property =
+ cmProp emulator_property =
target->GetProperty("CROSSCOMPILING_EMULATOR");
if (!emulator_property) {
continue;
}
- cmExpandList(emulator_property, this->EmulatorsWithArguments[c]);
+ cmExpandList(*emulator_property, this->EmulatorsWithArguments[c]);
}
}
}
diff --git a/Source/cmDefinePropertyCommand.cxx b/Source/cmDefinePropertyCommand.cxx
index f4e4fda..4e2d9b0 100644
--- a/Source/cmDefinePropertyCommand.cxx
+++ b/Source/cmDefinePropertyCommand.cxx
@@ -95,7 +95,7 @@ bool cmDefinePropertyCommand(std::vector<std::string> const& args,
// Actually define the property.
status.GetMakefile().GetState()->DefineProperty(
- PropertyName, scope, BriefDocs.c_str(), FullDocs.c_str(), inherited);
+ PropertyName, scope, BriefDocs, FullDocs, inherited);
return true;
}
diff --git a/Source/cmDepends.cxx b/Source/cmDepends.cxx
index 129a5f7..d8aa730 100644
--- a/Source/cmDepends.cxx
+++ b/Source/cmDepends.cxx
@@ -2,7 +2,6 @@
file Copyright.txt or https://cmake.org/licensing for details. */
#include "cmDepends.h"
-#include <sstream>
#include <utility>
#include "cmsys/FStream.hxx"
@@ -10,12 +9,12 @@
#include "cmFileTime.h"
#include "cmFileTimeCache.h"
#include "cmGeneratedFileStream.h"
-#include "cmLocalGenerator.h"
+#include "cmLocalUnixMakefileGenerator3.h"
#include "cmMakefile.h"
#include "cmStringAlgorithms.h"
#include "cmSystemTools.h"
-cmDepends::cmDepends(cmLocalGenerator* lg, std::string targetDir)
+cmDepends::cmDepends(cmLocalUnixMakefileGenerator3* lg, std::string targetDir)
: LocalGenerator(lg)
, TargetDirectory(std::move(targetDir))
{
@@ -81,16 +80,14 @@ void cmDepends::Clear(const std::string& file)
{
// Print verbose output.
if (this->Verbose) {
- std::ostringstream msg;
- msg << "Clearing dependencies in \"" << file << "\"." << std::endl;
- cmSystemTools::Stdout(msg.str());
+ cmSystemTools::Stdout(
+ cmStrCat("Clearing dependencies in \"", file, "\".\n"));
}
// Write an empty dependency file.
cmGeneratedFileStream depFileStream(file);
depFileStream << "# Empty dependencies file\n"
- << "# This may be replaced when dependencies are built."
- << std::endl;
+ "# This may be replaced when dependencies are built.\n";
}
bool cmDepends::WriteDependencies(const std::set<std::string>& /*unused*/,
@@ -172,10 +169,9 @@ bool cmDepends::CheckDependencies(std::istream& internalDepends,
// Print verbose output.
if (this->Verbose) {
- std::ostringstream msg;
- msg << "Dependee \"" << dependee << "\" does not exist for depender \""
- << depender << "\"." << std::endl;
- cmSystemTools::Stdout(msg.str());
+ cmSystemTools::Stdout(cmStrCat("Dependee \"", dependee,
+ "\" does not exist for depender \"",
+ depender, "\".\n"));
}
} else if (dependerExists) {
// The dependee and depender both exist. Compare file times.
@@ -185,10 +181,9 @@ bool cmDepends::CheckDependencies(std::istream& internalDepends,
// Print verbose output.
if (this->Verbose) {
- std::ostringstream msg;
- msg << "Dependee \"" << dependee << "\" is newer than depender \""
- << depender << "\"." << std::endl;
- cmSystemTools::Stdout(msg.str());
+ cmSystemTools::Stdout(cmStrCat("Dependee \"", dependee,
+ "\" is newer than depender \"",
+ depender, "\".\n"));
}
}
} else {
@@ -200,11 +195,9 @@ bool cmDepends::CheckDependencies(std::istream& internalDepends,
// Print verbose output.
if (this->Verbose) {
- std::ostringstream msg;
- msg << "Dependee \"" << dependee
- << "\" is newer than depends file \"" << internalDependsFileName
- << "\"." << std::endl;
- cmSystemTools::Stdout(msg.str());
+ cmSystemTools::Stdout(cmStrCat("Dependee \"", dependee,
+ "\" is newer than depends file \"",
+ internalDependsFileName, "\".\n"));
}
}
}
diff --git a/Source/cmDepends.h b/Source/cmDepends.h
index d938775..8cf528f 100644
--- a/Source/cmDepends.h
+++ b/Source/cmDepends.h
@@ -12,7 +12,7 @@
#include <vector>
class cmFileTimeCache;
-class cmLocalGenerator;
+class cmLocalUnixMakefileGenerator3;
/** \class cmDepends
* \brief Dependency scanner superclass.
@@ -29,7 +29,8 @@ public:
public:
/** Instances need to know the build directory name and the relative
path from the build directory to the target file. */
- cmDepends(cmLocalGenerator* lg = nullptr, std::string targetDir = "");
+ cmDepends(cmLocalUnixMakefileGenerator3* lg = nullptr,
+ std::string targetDir = "");
cmDepends(cmDepends const&) = delete;
cmDepends& operator=(cmDepends const&) = delete;
@@ -38,7 +39,10 @@ public:
scanning dependencies. This is not a full local generator; it
has been setup to do relative path conversions for the current
directory. */
- void SetLocalGenerator(cmLocalGenerator* lg) { this->LocalGenerator = lg; }
+ void SetLocalGenerator(cmLocalUnixMakefileGenerator3* lg)
+ {
+ this->LocalGenerator = lg;
+ }
/** Set the specific language to be scanned. */
void SetLanguage(const std::string& lang) { this->Language = lang; }
@@ -92,7 +96,7 @@ protected:
std::ostream& internalDepends);
// The local generator.
- cmLocalGenerator* LocalGenerator;
+ cmLocalUnixMakefileGenerator3* LocalGenerator;
// Flag for verbose output.
bool Verbose = false;
diff --git a/Source/cmDependsC.cxx b/Source/cmDependsC.cxx
index e30d959..4499a66 100644
--- a/Source/cmDependsC.cxx
+++ b/Source/cmDependsC.cxx
@@ -7,7 +7,7 @@
#include "cmsys/FStream.hxx"
#include "cmFileTime.h"
-#include "cmLocalGenerator.h"
+#include "cmLocalUnixMakefileGenerator3.h"
#include "cmMakefile.h"
#include "cmStringAlgorithms.h"
#include "cmSystemTools.h"
@@ -22,8 +22,9 @@
cmDependsC::cmDependsC() = default;
-cmDependsC::cmDependsC(cmLocalGenerator* lg, const std::string& targetDir,
- const std::string& lang, const DependencyMap* validDeps)
+cmDependsC::cmDependsC(cmLocalUnixMakefileGenerator3* lg,
+ const std::string& targetDir, const std::string& lang,
+ const DependencyMap* validDeps)
: cmDepends(lg, targetDir)
, ValidDeps(validDeps)
{
@@ -211,18 +212,18 @@ bool cmDependsC::WriteDependencies(const std::set<std::string>& sources,
// written by the original local generator for this directory
// convert the dependencies to paths relative to the home output
// directory. We must do the same here.
- std::string obj_m = cmSystemTools::ConvertToOutputPath(obj_i);
- internalDepends << obj_i << std::endl;
+ std::string obj_m = this->LocalGenerator->ConvertToMakefilePath(obj_i);
+ internalDepends << obj_i << '\n';
for (std::string const& dep : dependencies) {
makeDepends << obj_m << ": "
- << cmSystemTools::ConvertToOutputPath(
+ << this->LocalGenerator->ConvertToMakefilePath(
this->LocalGenerator->MaybeConvertToRelativePath(binDir,
dep))
- << std::endl;
- internalDepends << " " << dep << std::endl;
+ << '\n';
+ internalDepends << ' ' << dep << '\n';
}
- makeDepends << std::endl;
+ makeDepends << '\n';
return true;
}
@@ -264,19 +265,19 @@ void cmDependsC::ReadCacheFile()
// file doesn't exist, check that the regular expressions
// haven't changed
else if (!res) {
- if (line.find(INCLUDE_REGEX_LINE_MARKER) == 0) {
+ if (cmHasLiteralPrefix(line, INCLUDE_REGEX_LINE_MARKER)) {
if (line != this->IncludeRegexLineString) {
return;
}
- } else if (line.find(INCLUDE_REGEX_SCAN_MARKER) == 0) {
+ } else if (cmHasLiteralPrefix(line, INCLUDE_REGEX_SCAN_MARKER)) {
if (line != this->IncludeRegexScanString) {
return;
}
- } else if (line.find(INCLUDE_REGEX_COMPLAIN_MARKER) == 0) {
+ } else if (cmHasLiteralPrefix(line, INCLUDE_REGEX_COMPLAIN_MARKER)) {
if (line != this->IncludeRegexComplainString) {
return;
}
- } else if (line.find(INCLUDE_REGEX_TRANSFORM_MARKER) == 0) {
+ } else if (cmHasLiteralPrefix(line, INCLUDE_REGEX_TRANSFORM_MARKER)) {
if (line != this->IncludeRegexTransformString) {
return;
}
@@ -312,17 +313,17 @@ void cmDependsC::WriteCacheFile() const
for (auto const& fileIt : this->FileCache) {
if (fileIt.second.Used) {
- cacheOut << fileIt.first << std::endl;
+ cacheOut << fileIt.first << '\n';
for (UnscannedEntry const& inc : fileIt.second.UnscannedEntries) {
- cacheOut << inc.FileName << std::endl;
+ cacheOut << inc.FileName << '\n';
if (inc.QuotedLocation.empty()) {
- cacheOut << "-" << std::endl;
+ cacheOut << '-' << '\n';
} else {
- cacheOut << inc.QuotedLocation << std::endl;
+ cacheOut << inc.QuotedLocation << '\n';
}
}
- cacheOut << std::endl;
+ cacheOut << '\n';
}
}
}
diff --git a/Source/cmDependsC.h b/Source/cmDependsC.h
index 868c94a..e01faa4 100644
--- a/Source/cmDependsC.h
+++ b/Source/cmDependsC.h
@@ -16,7 +16,7 @@
#include "cmDepends.h"
-class cmLocalGenerator;
+class cmLocalUnixMakefileGenerator3;
/** \class cmDependsC
* \brief Dependency scanner for C and C++ object files.
@@ -27,7 +27,7 @@ public:
/** Checking instances need to know the build directory name and the
relative path from the build directory to the target file. */
cmDependsC();
- cmDependsC(cmLocalGenerator* lg, const std::string& targetDir,
+ cmDependsC(cmLocalUnixMakefileGenerator3* lg, const std::string& targetDir,
const std::string& lang, const DependencyMap* validDeps);
/** Virtual destructor to cleanup subclasses properly. */
diff --git a/Source/cmDependsFortran.cxx b/Source/cmDependsFortran.cxx
index 3692202..95dfc4e 100644
--- a/Source/cmDependsFortran.cxx
+++ b/Source/cmDependsFortran.cxx
@@ -12,7 +12,7 @@
#include "cmFortranParser.h" /* Interface to parser object. */
#include "cmGeneratedFileStream.h"
-#include "cmLocalGenerator.h"
+#include "cmLocalUnixMakefileGenerator3.h"
#include "cmMakefile.h"
#include "cmOutputConverter.h"
#include "cmStateDirectory.h"
@@ -29,12 +29,10 @@ static void cmFortranModuleAppendUpperLower(std::string const& mod,
std::string& mod_lower)
{
std::string::size_type ext_len = 0;
- if (cmHasLiteralSuffix(mod, ".mod")) {
+ if (cmHasLiteralSuffix(mod, ".mod") || cmHasLiteralSuffix(mod, ".sub")) {
ext_len = 4;
} else if (cmHasLiteralSuffix(mod, ".smod")) {
ext_len = 5;
- } else if (cmHasLiteralSuffix(mod, ".sub")) {
- ext_len = 4;
}
std::string const& name = mod.substr(0, mod.size() - ext_len);
std::string const& ext = mod.substr(mod.size() - ext_len);
@@ -72,7 +70,7 @@ public:
cmDependsFortran::cmDependsFortran() = default;
-cmDependsFortran::cmDependsFortran(cmLocalGenerator* lg)
+cmDependsFortran::cmDependsFortran(cmLocalUnixMakefileGenerator3* lg)
: cmDepends(lg)
, Internal(new cmDependsFortranInternals)
{
@@ -102,10 +100,7 @@ cmDependsFortran::cmDependsFortran(cmLocalGenerator* lg)
this->SModExt = mf->GetSafeDefinition("CMAKE_Fortran_SUBMODULE_EXT");
}
-cmDependsFortran::~cmDependsFortran()
-{
- delete this->Internal;
-}
+cmDependsFortran::~cmDependsFortran() = default;
bool cmDependsFortran::WriteDependencies(const std::set<std::string>& sources,
const std::string& obj,
@@ -188,7 +183,7 @@ bool cmDependsFortran::Finalize(std::ostream& makeDepends,
fiStream << "provides\n";
std::set<std::string> const& provides = this->Internal->TargetProvides;
for (std::string const& i : provides) {
- fiStream << " " << i << "\n";
+ fiStream << ' ' << i << '\n';
}
// Create a script to clean the modules.
@@ -205,14 +200,14 @@ bool cmDependsFortran::Finalize(std::ostream& makeDepends,
std::string mod_lower = cmStrCat(mod_dir, '/');
cmFortranModuleAppendUpperLower(i, mod_upper, mod_lower);
std::string stamp = cmStrCat(stamp_dir, '/', i, ".stamp");
- fcStream << "\n";
- fcStream << " \""
+ fcStream << "\n"
+ " \""
<< this->MaybeConvertToRelativePath(currentBinDir, mod_lower)
- << "\"\n";
- fcStream << " \""
+ << "\"\n"
+ " \""
<< this->MaybeConvertToRelativePath(currentBinDir, mod_upper)
- << "\"\n";
- fcStream << " \""
+ << "\"\n"
+ " \""
<< this->MaybeConvertToRelativePath(currentBinDir, stamp)
<< "\"\n";
}
@@ -329,16 +324,15 @@ bool cmDependsFortran::WriteDependenciesReal(std::string const& obj,
std::string binDir = this->LocalGenerator->GetBinaryDirectory();
std::string obj_i = this->MaybeConvertToRelativePath(binDir, obj);
std::string obj_m = cmSystemTools::ConvertToOutputPath(obj_i);
- internalDepends << obj_i << std::endl;
- internalDepends << " " << src << std::endl;
+ internalDepends << obj_i << "\n " << src << '\n';
for (std::string const& i : info.Includes) {
makeDepends << obj_m << ": "
<< cmSystemTools::ConvertToOutputPath(
this->MaybeConvertToRelativePath(binDir, i))
- << std::endl;
- internalDepends << " " << i << std::endl;
+ << '\n';
+ internalDepends << ' ' << i << '\n';
}
- makeDepends << std::endl;
+ makeDepends << '\n';
// Write module requirements to the output stream.
for (std::string const& i : info.Requires) {
@@ -357,7 +351,7 @@ bool cmDependsFortran::WriteDependenciesReal(std::string const& obj,
// This module is known. Depend on its timestamp file.
std::string stampFile = cmSystemTools::ConvertToOutputPath(
this->MaybeConvertToRelativePath(binDir, required->second));
- makeDepends << obj_m << ": " << stampFile << "\n";
+ makeDepends << obj_m << ": " << stampFile << '\n';
} else {
// This module is not known to CMake. Try to locate it where
// the compiler will and depend on that.
@@ -365,7 +359,7 @@ bool cmDependsFortran::WriteDependenciesReal(std::string const& obj,
if (this->FindModule(i, module)) {
module = cmSystemTools::ConvertToOutputPath(
this->MaybeConvertToRelativePath(binDir, module));
- makeDepends << obj_m << ": " << module << "\n";
+ makeDepends << obj_m << ": " << module << '\n';
}
}
}
@@ -394,7 +388,7 @@ bool cmDependsFortran::WriteDependenciesReal(std::string const& obj,
cmSystemTools::ConvertToOutputPath(stampFile);
makeDepends << obj_m << ".provides.build"
- << ": " << stampFileForMake << "\n";
+ << ": " << stampFileForMake << '\n';
// Note that when cmake_copy_f90_mod finds that a module file
// and the corresponding stamp file have no differences, the stamp
// file is not updated. In such case the stamp file will be always
@@ -402,15 +396,15 @@ bool cmDependsFortran::WriteDependenciesReal(std::string const& obj,
// on each new build. This is expected behavior for incremental
// builds and can not be changed without preforming recursive make
// calls that would considerably slow down the building process.
- makeDepends << stampFileForMake << ": " << obj_m << "\n";
+ makeDepends << stampFileForMake << ": " << obj_m << '\n';
makeDepends << "\t$(CMAKE_COMMAND) -E cmake_copy_f90_mod " << modFile
- << " " << stampFileForShell;
+ << ' ' << stampFileForShell;
cmMakefile* mf = this->LocalGenerator->GetMakefile();
const char* cid = mf->GetDefinition("CMAKE_Fortran_COMPILER_ID");
if (cid && *cid) {
- makeDepends << " " << cid;
+ makeDepends << ' ' << cid;
}
- makeDepends << "\n";
+ makeDepends << '\n';
}
makeDepends << obj_m << ".provides.build:\n";
// After copying the modules update the timestamp file.
diff --git a/Source/cmDependsFortran.h b/Source/cmDependsFortran.h
index 0485115..3e306dd 100644
--- a/Source/cmDependsFortran.h
+++ b/Source/cmDependsFortran.h
@@ -6,6 +6,7 @@
#include "cmConfigure.h" // IWYU pragma: keep
#include <iosfwd>
+#include <memory>
#include <set>
#include <string>
#include <vector>
@@ -14,7 +15,7 @@
class cmDependsFortranInternals;
class cmFortranSourceInfo;
-class cmLocalGenerator;
+class cmLocalUnixMakefileGenerator3;
/** \class cmDependsFortran
* \brief Dependency scanner for Fortran object files.
@@ -30,7 +31,7 @@ public:
path from the build directory to the target file, the source
file from which to start scanning, the include file search
path, and the target directory. */
- cmDependsFortran(cmLocalGenerator* lg);
+ cmDependsFortran(cmLocalUnixMakefileGenerator3* lg);
/** Virtual destructor to cleanup subclasses properly. */
~cmDependsFortran() override;
@@ -84,7 +85,7 @@ protected:
std::set<std::string> PPDefinitions;
// Internal implementation details.
- cmDependsFortranInternals* Internal = nullptr;
+ std::unique_ptr<cmDependsFortranInternals> Internal;
private:
std::string MaybeConvertToRelativePath(std::string const& base,
diff --git a/Source/cmDependsJavaParserHelper.cxx b/Source/cmDependsJavaParserHelper.cxx
index 516bbbf..fc1bbdd 100644
--- a/Source/cmDependsJavaParserHelper.cxx
+++ b/Source/cmDependsJavaParserHelper.cxx
@@ -8,6 +8,7 @@
#include <iostream>
#include <utility>
+#include <cm/memory>
#include <cm/string_view>
#include "cmsys/FStream.hxx"
@@ -169,10 +170,11 @@ void cmDependsJavaParserHelper::AllocateParserType(
return;
}
this->UnionsAvailable++;
- pt->str = new char[len + 1];
+ auto up = cm::make_unique<char[]>(len + 1);
+ pt->str = up.get();
strncpy(pt->str, str, len);
pt->str[len] = 0;
- this->Allocates.push_back(pt->str);
+ this->Allocates.push_back(std::move(up));
}
void cmDependsJavaParserHelper::StartClass(const char* cls)
@@ -275,10 +277,7 @@ int cmDependsJavaParserHelper::ParseString(const char* str, int verb)
void cmDependsJavaParserHelper::CleanupParser()
{
- for (char* allocate : this->Allocates) {
- delete[] allocate;
- }
- this->Allocates.erase(this->Allocates.begin(), this->Allocates.end());
+ this->Allocates.clear();
}
int cmDependsJavaParserHelper::LexInput(char* buf, int maxlen)
diff --git a/Source/cmDependsJavaParserHelper.h b/Source/cmDependsJavaParserHelper.h
index a673b5b..c545ee2 100644
--- a/Source/cmDependsJavaParserHelper.h
+++ b/Source/cmDependsJavaParserHelper.h
@@ -5,6 +5,7 @@
#include "cmConfigure.h" // IWYU pragma: keep
+#include <memory>
#include <string>
#include <vector>
@@ -81,7 +82,7 @@ private:
int CurrentDepth;
int Verbose;
- std::vector<char*> Allocates;
+ std::vector<std::unique_ptr<char[]>> Allocates;
void PrintClasses();
diff --git a/Source/cmDynamicLoader.cxx b/Source/cmDynamicLoader.cxx
index 0b72a94..a3731c1 100644
--- a/Source/cmDynamicLoader.cxx
+++ b/Source/cmDynamicLoader.cxx
@@ -6,6 +6,7 @@
#include <string>
#include <utility>
+namespace {
class cmDynamicLoaderCache
{
public:
@@ -15,14 +16,15 @@ public:
cmsys::DynamicLoader::LibraryHandle& /*p*/);
bool FlushCache(const char* path);
void FlushCache();
- static cmDynamicLoaderCache* GetInstance();
+ static cmDynamicLoaderCache& GetInstance();
private:
std::map<std::string, cmsys::DynamicLoader::LibraryHandle> CacheMap;
- static cmDynamicLoaderCache* Instance;
+ static cmDynamicLoaderCache Instance;
};
-cmDynamicLoaderCache* cmDynamicLoaderCache::Instance = nullptr;
+cmDynamicLoaderCache cmDynamicLoaderCache::Instance;
+}
cmDynamicLoaderCache::~cmDynamicLoaderCache() = default;
@@ -64,15 +66,11 @@ void cmDynamicLoaderCache::FlushCache()
for (auto const& it : this->CacheMap) {
cmsys::DynamicLoader::CloseLibrary(it.second);
}
- delete cmDynamicLoaderCache::Instance;
- cmDynamicLoaderCache::Instance = nullptr;
+ this->CacheMap.clear();
}
-cmDynamicLoaderCache* cmDynamicLoaderCache::GetInstance()
+cmDynamicLoaderCache& cmDynamicLoaderCache::GetInstance()
{
- if (!cmDynamicLoaderCache::Instance) {
- cmDynamicLoaderCache::Instance = new cmDynamicLoaderCache;
- }
return cmDynamicLoaderCache::Instance;
}
@@ -80,15 +78,15 @@ cmsys::DynamicLoader::LibraryHandle cmDynamicLoader::OpenLibrary(
const char* libname)
{
cmsys::DynamicLoader::LibraryHandle lh;
- if (cmDynamicLoaderCache::GetInstance()->GetCacheFile(libname, lh)) {
+ if (cmDynamicLoaderCache::GetInstance().GetCacheFile(libname, lh)) {
return lh;
}
lh = cmsys::DynamicLoader::OpenLibrary(libname);
- cmDynamicLoaderCache::GetInstance()->CacheFile(libname, lh);
+ cmDynamicLoaderCache::GetInstance().CacheFile(libname, lh);
return lh;
}
void cmDynamicLoader::FlushCache()
{
- cmDynamicLoaderCache::GetInstance()->FlushCache();
+ cmDynamicLoaderCache::GetInstance().FlushCache();
}
diff --git a/Source/cmELF.cxx b/Source/cmELF.cxx
index 202b205..a8d81f7 100644
--- a/Source/cmELF.cxx
+++ b/Source/cmELF.cxx
@@ -3,6 +3,7 @@
#include "cmELF.h"
#include <cstddef>
+#include <cstdint>
#include <map>
#include <memory>
#include <sstream>
@@ -12,14 +13,13 @@
#include <cm/memory>
#include <cmext/algorithm>
-#include "cmsys/FStream.hxx"
+#include <cm3p/kwiml/abi.h>
-#include "cm_kwiml.h"
+#include "cmsys/FStream.hxx"
// Include the ELF format information system header.
#if defined(__OpenBSD__)
# include <elf_abi.h>
-# include <stdint.h>
#elif defined(__HAIKU__)
# include <elf32.h>
# include <elf64.h>
diff --git a/Source/cmExecuteProcessCommand.cxx b/Source/cmExecuteProcessCommand.cxx
index 5be5bce..9c53bdf 100644
--- a/Source/cmExecuteProcessCommand.cxx
+++ b/Source/cmExecuteProcessCommand.cxx
@@ -10,11 +10,10 @@
#include <vector>
#include <cmext/algorithm>
+#include <cmext/string_view>
#include "cmsys/Process.h"
-#include "cm_static_string_view.hxx"
-
#include "cmArgumentParser.h"
#include "cmExecutionStatus.h"
#include "cmMakefile.h"
@@ -61,6 +60,8 @@ bool cmExecuteProcessCommand(std::vector<std::string> const& args,
bool ErrorQuiet = false;
bool OutputStripTrailingWhitespace = false;
bool ErrorStripTrailingWhitespace = false;
+ bool EchoOutputVariable = false;
+ bool EchoErrorVariable = false;
std::string Encoding;
};
@@ -83,7 +84,9 @@ bool cmExecuteProcessCommand(std::vector<std::string> const& args,
&Arguments::OutputStripTrailingWhitespace)
.Bind("ERROR_STRIP_TRAILING_WHITESPACE"_s,
&Arguments::ErrorStripTrailingWhitespace)
- .Bind("ENCODING"_s, &Arguments::Encoding);
+ .Bind("ENCODING"_s, &Arguments::Encoding)
+ .Bind("ECHO_OUTPUT_VARIABLE"_s, &Arguments::EchoOutputVariable)
+ .Bind("ECHO_ERROR_VARIABLE"_s, &Arguments::EchoErrorVariable);
std::vector<std::string> unparsedArguments;
std::vector<std::string> keywordsMissingValue;
@@ -241,28 +244,32 @@ bool cmExecuteProcessCommand(std::vector<std::string> const& args,
while ((p = cmsysProcess_WaitForData(cp, &data, &length, nullptr))) {
// Put the output in the right place.
if (p == cmsysProcess_Pipe_STDOUT && !arguments.OutputQuiet) {
- if (arguments.OutputVariable.empty()) {
+ if (arguments.OutputVariable.empty() || arguments.EchoOutputVariable) {
processOutput.DecodeText(data, length, strdata, 1);
cmSystemTools::Stdout(strdata);
- } else {
+ }
+ if (!arguments.OutputVariable.empty()) {
cmExecuteProcessCommandAppend(tempOutput, data, length);
}
} else if (p == cmsysProcess_Pipe_STDERR && !arguments.ErrorQuiet) {
- if (arguments.ErrorVariable.empty()) {
+ if (arguments.ErrorVariable.empty() || arguments.EchoErrorVariable) {
processOutput.DecodeText(data, length, strdata, 2);
cmSystemTools::Stderr(strdata);
- } else {
+ }
+ if (!arguments.ErrorVariable.empty()) {
cmExecuteProcessCommandAppend(tempError, data, length);
}
}
}
- if (!arguments.OutputQuiet && arguments.OutputVariable.empty()) {
+ if (!arguments.OutputQuiet &&
+ (arguments.OutputVariable.empty() || arguments.EchoOutputVariable)) {
processOutput.DecodeText(std::string(), strdata, 1);
if (!strdata.empty()) {
cmSystemTools::Stdout(strdata);
}
}
- if (!arguments.ErrorQuiet && arguments.ErrorVariable.empty()) {
+ if (!arguments.ErrorQuiet &&
+ (arguments.ErrorVariable.empty() || arguments.EchoErrorVariable)) {
processOutput.DecodeText(std::string(), strdata, 2);
if (!strdata.empty()) {
cmSystemTools::Stderr(strdata);
diff --git a/Source/cmExportBuildAndroidMKGenerator.cxx b/Source/cmExportBuildAndroidMKGenerator.cxx
index 561e830..3641cb2 100644
--- a/Source/cmExportBuildAndroidMKGenerator.cxx
+++ b/Source/cmExportBuildAndroidMKGenerator.cxx
@@ -5,7 +5,8 @@
#include <sstream>
#include <utility>
-#include "cmAlgorithms.h"
+#include <cmext/algorithm>
+
#include "cmGeneratorTarget.h"
#include "cmLinkItem.h"
#include "cmMakefile.h"
@@ -46,7 +47,9 @@ void cmExportBuildAndroidMKGenerator::GenerateImportTargetCode(
os << "LOCAL_MODULE := ";
os << targetName << "\n";
os << "LOCAL_SRC_FILES := ";
- std::string path = cmSystemTools::ConvertToOutputPath(target->GetFullPath());
+ std::string const noConfig; // FIXME: What config to use here?
+ std::string path =
+ cmSystemTools::ConvertToOutputPath(target->GetFullPath(noConfig));
os << path << "\n";
}
@@ -118,13 +121,13 @@ void cmExportBuildAndroidMKGenerator::GenerateInterfaceProperties(
} else {
bool relpath = false;
if (type == cmExportBuildAndroidMKGenerator::INSTALL) {
- relpath = lib.substr(0, 3) == "../";
+ relpath = cmHasLiteralPrefix(lib, "../");
}
// check for full path or if it already has a -l, or
// in the case of an install check for relative paths
// if it is full or a link library then use string directly
if (cmSystemTools::FileIsFullPath(lib) ||
- lib.substr(0, 2) == "-l" || relpath) {
+ cmHasLiteralPrefix(lib, "-l") || relpath) {
ldlibs += " " + lib;
// if it is not a path and does not have a -l then add -l
} else if (!lib.empty()) {
@@ -165,7 +168,7 @@ void cmExportBuildAndroidMKGenerator::GenerateInterfaceProperties(
// Tell the NDK build system if prebuilt static libraries use C++.
if (target->GetType() == cmStateEnums::STATIC_LIBRARY) {
cmLinkImplementation const* li = target->GetLinkImplementation(config);
- if (cmContains(li->Languages, "CXX")) {
+ if (cm::contains(li->Languages, "CXX")) {
os << "LOCAL_HAS_CPP := true\n";
}
}
diff --git a/Source/cmExportBuildFileGenerator.cxx b/Source/cmExportBuildFileGenerator.cxx
index d22bd48..dd700c5 100644
--- a/Source/cmExportBuildFileGenerator.cxx
+++ b/Source/cmExportBuildFileGenerator.cxx
@@ -8,7 +8,8 @@
#include <sstream>
#include <utility>
-#include "cmAlgorithms.h"
+#include <cmext/algorithm>
+
#include "cmExportSet.h"
#include "cmGeneratorExpression.h"
#include "cmGeneratorTarget.h"
@@ -307,7 +308,7 @@ cmExportBuildFileGenerator::FindBuildExportInfo(cmGlobalGenerator* gg,
const auto& exportSet = exp.second;
std::vector<std::string> targets;
exportSet->GetTargets(targets);
- if (cmContains(targets, name)) {
+ if (cm::contains(targets, name)) {
exportFiles.push_back(exp.first);
ns = exportSet->GetNamespace();
}
diff --git a/Source/cmExportCommand.cxx b/Source/cmExportCommand.cxx
index e49c174..9f8a821 100644
--- a/Source/cmExportCommand.cxx
+++ b/Source/cmExportCommand.cxx
@@ -7,12 +7,11 @@
#include <utility>
#include <cm/memory>
+#include <cmext/algorithm>
+#include <cmext/string_view>
#include "cmsys/RegularExpression.hxx"
-#include "cm_static_string_view.hxx"
-
-#include "cmAlgorithms.h"
#include "cmArgumentParser.h"
#include "cmExecutionStatus.h"
#include "cmExportBuildAndroidMKGenerator.h"
@@ -24,6 +23,7 @@
#include "cmMessageType.h"
#include "cmPolicies.h"
#include "cmStateTypes.h"
+#include "cmStringAlgorithms.h"
#include "cmSystemTools.h"
#include "cmTarget.h"
@@ -146,7 +146,7 @@ bool cmExportCommand(std::vector<std::string> const& args,
}
exportSet = &it->second;
} else if (!arguments.Targets.empty() ||
- cmContains(keywordsMissingValue, "TARGETS")) {
+ cm::contains(keywordsMissingValue, "TARGETS")) {
for (std::string const& currentTarget : arguments.Targets) {
if (mf.IsAlias(currentTarget)) {
std::ostringstream e;
@@ -183,6 +183,28 @@ bool cmExportCommand(std::vector<std::string> const& args,
return false;
}
+ // if cmExportBuildFileGenerator is already defined for the file
+ // and APPEND is not specified, if CMP0103 is OLD ignore previous definition
+ // else raise an error
+ if (gg->GetExportedTargetsFile(fname) != nullptr) {
+ switch (mf.GetPolicyStatus(cmPolicies::CMP0103)) {
+ case cmPolicies::WARN:
+ mf.IssueMessage(
+ MessageType::AUTHOR_WARNING,
+ cmStrCat(cmPolicies::GetPolicyWarning(cmPolicies::CMP0103), '\n',
+ "export() command already specified for the file\n ",
+ arguments.Filename, "\nDid you miss 'APPEND' keyword?"));
+ CM_FALLTHROUGH;
+ case cmPolicies::OLD:
+ break;
+ default:
+ status.SetError(cmStrCat("command already specified for the file\n ",
+ arguments.Filename,
+ "\nDid you miss 'APPEND' keyword?"));
+ return false;
+ }
+ }
+
// Setup export file generation.
std::unique_ptr<cmExportBuildFileGenerator> ebfg = nullptr;
if (android) {
diff --git a/Source/cmExportFileGenerator.cxx b/Source/cmExportFileGenerator.cxx
index 6441e6f..ed0689a 100644
--- a/Source/cmExportFileGenerator.cxx
+++ b/Source/cmExportFileGenerator.cxx
@@ -125,9 +125,9 @@ void cmExportFileGenerator::PopulateInterfaceProperty(
const std::string& propName, cmGeneratorTarget* target,
ImportPropertyMap& properties)
{
- const char* input = target->GetProperty(propName);
+ cmProp input = target->GetProperty(propName);
if (input) {
- properties[propName] = input;
+ properties[propName] = *input;
}
}
@@ -137,16 +137,16 @@ void cmExportFileGenerator::PopulateInterfaceProperty(
cmGeneratorExpression::PreprocessContext preprocessRule,
ImportPropertyMap& properties, std::vector<std::string>& missingTargets)
{
- const char* input = target->GetProperty(propName);
+ cmProp input = target->GetProperty(propName);
if (input) {
- if (!*input) {
+ if (input->empty()) {
// Set to empty
properties[outputName].clear();
return;
}
std::string prepro =
- cmGeneratorExpression::Preprocess(input, preprocessRule);
+ cmGeneratorExpression::Preprocess(*input, preprocessRule);
if (!prepro.empty()) {
this->ResolveTargetsInGeneratorExpressions(prepro, target,
missingTargets);
@@ -174,10 +174,10 @@ bool cmExportFileGenerator::PopulateInterfaceLinkLibrariesProperty(
if (!target->IsLinkable()) {
return false;
}
- const char* input = target->GetProperty("INTERFACE_LINK_LIBRARIES");
+ cmProp input = target->GetProperty("INTERFACE_LINK_LIBRARIES");
if (input) {
std::string prepro =
- cmGeneratorExpression::Preprocess(input, preprocessRule);
+ cmGeneratorExpression::Preprocess(*input, preprocessRule);
if (!prepro.empty()) {
this->ResolveTargetsInGeneratorExpressions(
prepro, target, missingTargets, ReplaceFreeTargets);
@@ -276,8 +276,7 @@ static bool checkInterfaceDirs(const std::string& prepro,
<< "\"\nhowever it is also "
"a subdirectory of the "
<< (inBinary ? "build" : "source") << " tree:\n \""
- << (inBinary ? topBinaryDir : topSourceDir) << "\""
- << std::endl;
+ << (inBinary ? topBinaryDir : topSourceDir) << "\"\n";
target->GetLocalGenerator()->IssueMessage(
MessageType::AUTHOR_WARNING, s.str());
CM_FALLTHROUGH;
@@ -342,19 +341,19 @@ void cmExportFileGenerator::PopulateSourcesInterface(
assert(preprocessRule == cmGeneratorExpression::InstallInterface);
const char* propName = "INTERFACE_SOURCES";
- const char* input = gt->GetProperty(propName);
+ cmProp input = gt->GetProperty(propName);
if (!input) {
return;
}
- if (!*input) {
+ if (input->empty()) {
properties[propName].clear();
return;
}
std::string prepro =
- cmGeneratorExpression::Preprocess(input, preprocessRule, true);
+ cmGeneratorExpression::Preprocess(*input, preprocessRule, true);
if (!prepro.empty()) {
this->ResolveTargetsInGeneratorExpressions(prepro, gt, missingTargets);
@@ -373,7 +372,7 @@ void cmExportFileGenerator::PopulateIncludeDirectoriesInterface(
assert(preprocessRule == cmGeneratorExpression::InstallInterface);
const char* propName = "INTERFACE_INCLUDE_DIRECTORIES";
- const char* input = target->GetProperty(propName);
+ cmProp input = target->GetProperty(propName);
cmGeneratorExpression ge;
@@ -400,7 +399,7 @@ void cmExportFileGenerator::PopulateIncludeDirectoriesInterface(
if (!input && exportDirs.empty()) {
return;
}
- if ((input && !*input) && exportDirs.empty()) {
+ if ((input && input->empty()) && exportDirs.empty()) {
// Set to empty
properties[propName].clear();
return;
@@ -408,7 +407,7 @@ void cmExportFileGenerator::PopulateIncludeDirectoriesInterface(
prefixItems(exportDirs);
- std::string includes = (input ? input : "");
+ std::string includes = (input ? *input : "");
const char* sep = input ? ";" : "";
includes += sep + exportDirs;
std::string prepro =
@@ -431,19 +430,19 @@ void cmExportFileGenerator::PopulateLinkDependsInterface(
assert(preprocessRule == cmGeneratorExpression::InstallInterface);
const char* propName = "INTERFACE_LINK_DEPENDS";
- const char* input = gt->GetProperty(propName);
+ cmProp input = gt->GetProperty(propName);
if (!input) {
return;
}
- if (!*input) {
+ if (input->empty()) {
properties[propName].clear();
return;
}
std::string prepro =
- cmGeneratorExpression::Preprocess(input, preprocessRule, true);
+ cmGeneratorExpression::Preprocess(*input, preprocessRule, true);
if (!prepro.empty()) {
this->ResolveTargetsInGeneratorExpressions(prepro, gt, missingTargets);
@@ -462,19 +461,19 @@ void cmExportFileGenerator::PopulateLinkDirectoriesInterface(
assert(preprocessRule == cmGeneratorExpression::InstallInterface);
const char* propName = "INTERFACE_LINK_DIRECTORIES";
- const char* input = gt->GetProperty(propName);
+ cmProp input = gt->GetProperty(propName);
if (!input) {
return;
}
- if (!*input) {
+ if (input->empty()) {
properties[propName].clear();
return;
}
std::string prepro =
- cmGeneratorExpression::Preprocess(input, preprocessRule, true);
+ cmGeneratorExpression::Preprocess(*input, preprocessRule, true);
if (!prepro.empty()) {
this->ResolveTargetsInGeneratorExpressions(prepro, gt, missingTargets);
@@ -497,11 +496,11 @@ void cmExportFileGenerator::PopulateInterfaceProperty(
void getPropertyContents(cmGeneratorTarget const* tgt, const std::string& prop,
std::set<std::string>& ifaceProperties)
{
- const char* p = tgt->GetProperty(prop);
+ cmProp p = tgt->GetProperty(prop);
if (!p) {
return;
}
- std::vector<std::string> content = cmExpandedList(p);
+ std::vector<std::string> content = cmExpandedList(*p);
ifaceProperties.insert(content.begin(), content.end());
}
@@ -762,13 +761,12 @@ void cmExportFileGenerator::SetImportLinkInterface(
return;
}
- const char* propContent;
+ cmProp propContent;
- if (const char* prop_suffixed =
+ if (cmProp prop_suffixed =
target->GetProperty("LINK_INTERFACE_LIBRARIES" + suffix)) {
propContent = prop_suffixed;
- } else if (const char* prop =
- target->GetProperty("LINK_INTERFACE_LIBRARIES")) {
+ } else if (cmProp prop = target->GetProperty("LINK_INTERFACE_LIBRARIES")) {
propContent = prop;
} else {
return;
@@ -790,13 +788,13 @@ void cmExportFileGenerator::SetImportLinkInterface(
return;
}
- if (!*propContent) {
+ if (propContent->empty()) {
properties["IMPORTED_LINK_INTERFACE_LIBRARIES" + suffix].clear();
return;
}
std::string prepro =
- cmGeneratorExpression::Preprocess(propContent, preprocessRule);
+ cmGeneratorExpression::Preprocess(*propContent, preprocessRule);
if (!prepro.empty()) {
this->ResolveTargetsInGeneratorExpressions(prepro, target, missingTargets,
ReplaceFreeTargets);
@@ -856,8 +854,8 @@ void cmExportFileGenerator::SetImportDetailProperties(
cmGeneratorTarget::ManagedType::Native) {
std::string prop = cmStrCat("IMPORTED_COMMON_LANGUAGE_RUNTIME", suffix);
std::string propval;
- if (auto* p = target->GetProperty("COMMON_LANGUAGE_RUNTIME")) {
- propval = p;
+ if (cmProp p = target->GetProperty("COMMON_LANGUAGE_RUNTIME")) {
+ propval = *p;
} else if (target->IsCSharpOnly()) {
// C# projects do not have the /clr flag, so we set the property
// here to mark the target as (only) managed (i.e. no .lib file
@@ -925,12 +923,14 @@ void cmExportFileGenerator::GeneratePolicyHeaderCode(std::ostream& os)
/* clang-format on */
// Isolate the file policy level.
- // We use 2.6 here instead of the current version because newer
- // versions of CMake should be able to export files imported by 2.6
- // until the import format changes.
+ // Support CMake versions as far back as 2.6 but also support using NEW
+ // policy settings for up to CMake 3.17 (this upper limit may be reviewed
+ // and increased from time to time). This reduces the opportunity for CMake
+ // warnings when an older export file is later used with newer CMake
+ // versions.
/* clang-format off */
os << "cmake_policy(PUSH)\n"
- << "cmake_policy(VERSION 2.6)\n";
+ << "cmake_policy(VERSION 2.6...3.17)\n";
/* clang-format on */
}
@@ -1116,7 +1116,7 @@ void cmExportFileGenerator::GenerateMissingTargetsCheckCode(
return;
}
/* clang-format off */
- os << "# Make sure the targets which have been exported in some other \n"
+ os << "# Make sure the targets which have been exported in some other\n"
"# export set exist.\n"
"unset(${CMAKE_FIND_PACKAGE_NAME}_NOT_FOUND_MESSAGE_targets)\n"
"foreach(_target ";
@@ -1215,9 +1215,9 @@ bool cmExportFileGenerator::PopulateExportProperties(
std::string& errorMessage)
{
auto& targetProperties = gte->Target->GetProperties();
- if (const char* exportProperties =
+ if (cmProp exportProperties =
targetProperties.GetPropertyValue("EXPORT_PROPERTIES")) {
- for (auto& prop : cmExpandedList(exportProperties)) {
+ for (auto& prop : cmExpandedList(*exportProperties)) {
/* Black list reserved properties */
if (cmHasLiteralPrefix(prop, "IMPORTED_") ||
cmHasLiteralPrefix(prop, "INTERFACE_")) {
@@ -1228,15 +1228,15 @@ bool cmExportFileGenerator::PopulateExportProperties(
errorMessage = e.str();
return false;
}
- auto propertyValue = targetProperties.GetPropertyValue(prop);
+ cmProp propertyValue = targetProperties.GetPropertyValue(prop);
if (propertyValue == nullptr) {
// Asked to export a property that isn't defined on the target. Do not
// consider this an error, there's just nothing to export.
continue;
}
std::string evaluatedValue = cmGeneratorExpression::Preprocess(
- propertyValue, cmGeneratorExpression::StripAllGeneratorExpressions);
- if (evaluatedValue != propertyValue) {
+ *propertyValue, cmGeneratorExpression::StripAllGeneratorExpressions);
+ if (evaluatedValue != *propertyValue) {
std::ostringstream e;
e << "Target \"" << gte->Target->GetName() << "\" contains property \""
<< prop << "\" in EXPORT_PROPERTIES but this property contains a "
@@ -1244,7 +1244,7 @@ bool cmExportFileGenerator::PopulateExportProperties(
errorMessage = e.str();
return false;
}
- properties[prop] = propertyValue;
+ properties[prop] = *propertyValue;
}
}
return true;
diff --git a/Source/cmExportInstallAndroidMKGenerator.cxx b/Source/cmExportInstallAndroidMKGenerator.cxx
index 9702e0e..80f776e 100644
--- a/Source/cmExportInstallAndroidMKGenerator.cxx
+++ b/Source/cmExportInstallAndroidMKGenerator.cxx
@@ -66,7 +66,7 @@ void cmExportInstallAndroidMKGenerator::GenerateImportTargetCode(
os << "LOCAL_MODULE := ";
os << targetName << "\n";
os << "LOCAL_SRC_FILES := $(_IMPORT_PREFIX)/";
- os << target->Target->GetProperty("__dest") << "/";
+ os << target->Target->GetSafeProperty("__dest") << "/";
std::string config;
if (!this->Configurations.empty()) {
config = this->Configurations[0];
diff --git a/Source/cmExportLibraryDependenciesCommand.cxx b/Source/cmExportLibraryDependenciesCommand.cxx
index 6011ba4..be63278 100644
--- a/Source/cmExportLibraryDependenciesCommand.cxx
+++ b/Source/cmExportLibraryDependenciesCommand.cxx
@@ -23,6 +23,8 @@
class cmListFileBacktrace;
+using cmProp = const std::string*;
+
static void FinalAction(cmMakefile& makefile, std::string const& filename,
bool append)
{
@@ -95,8 +97,8 @@ static void FinalAction(cmMakefile& makefile, std::string const& filename,
// Handle simple output name changes. This command is
// deprecated so we do not support full target name
// translation (which requires per-configuration info).
- if (const char* outname = libtgt->GetProperty("OUTPUT_NAME")) {
- lib = outname;
+ if (cmProp outname = libtgt->GetProperty("OUTPUT_NAME")) {
+ lib = *outname;
}
}
valueOld += lib;
diff --git a/Source/cmExportTryCompileFileGenerator.cxx b/Source/cmExportTryCompileFileGenerator.cxx
index 3df6a5c..46056c1 100644
--- a/Source/cmExportTryCompileFileGenerator.cxx
+++ b/Source/cmExportTryCompileFileGenerator.cxx
@@ -58,7 +58,7 @@ std::string cmExportTryCompileFileGenerator::FindTargets(
const std::string& propName, cmGeneratorTarget const* tgt,
std::string const& language, std::set<cmGeneratorTarget const*>& emitted)
{
- const char* prop = tgt->GetProperty(propName);
+ cmProp prop = tgt->GetProperty(propName);
if (!prop) {
return std::string();
}
@@ -67,11 +67,11 @@ std::string cmExportTryCompileFileGenerator::FindTargets(
cmGeneratorExpressionDAGChecker dagChecker(tgt, propName, nullptr, nullptr);
- std::unique_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(prop);
+ std::unique_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(*prop);
cmTarget dummyHead("try_compile_dummy_exe", cmStateEnums::EXECUTABLE,
cmTarget::VisibilityNormal, tgt->Target->GetMakefile(),
- true);
+ cmTarget::PerConfig::Yes);
cmGeneratorTarget gDummyHead(&dummyHead, tgt->GetLocalGenerator());
@@ -95,11 +95,11 @@ void cmExportTryCompileFileGenerator::PopulateProperties(
std::vector<std::string> props = target->GetPropertyKeys();
for (std::string const& p : props) {
- properties[p] = target->GetProperty(p);
+ properties[p] = *target->GetProperty(p);
- if (p.find("IMPORTED_LINK_INTERFACE_LIBRARIES") == 0 ||
- p.find("IMPORTED_LINK_DEPENDENT_LIBRARIES") == 0 ||
- p.find("INTERFACE_LINK_LIBRARIES") == 0) {
+ if (cmHasLiteralPrefix(p, "IMPORTED_LINK_INTERFACE_LIBRARIES") ||
+ cmHasLiteralPrefix(p, "IMPORTED_LINK_DEPENDENT_LIBRARIES") ||
+ cmHasLiteralPrefix(p, "INTERFACE_LINK_LIBRARIES")) {
std::string evalResult =
this->FindTargets(p, target, std::string(), emitted);
diff --git a/Source/cmExprParserHelper.h b/Source/cmExprParserHelper.h
index eaf5dc7..717acdc 100644
--- a/Source/cmExprParserHelper.h
+++ b/Source/cmExprParserHelper.h
@@ -8,7 +8,7 @@
#include <string>
#include <vector>
-#include "cm_kwiml.h"
+#include <cm3p/kwiml/int.h>
class cmExprParserHelper
{
diff --git a/Source/cmExtraCodeBlocksGenerator.cxx b/Source/cmExtraCodeBlocksGenerator.cxx
index b710467..42fd0ea 100644
--- a/Source/cmExtraCodeBlocksGenerator.cxx
+++ b/Source/cmExtraCodeBlocksGenerator.cxx
@@ -218,7 +218,7 @@ void cmExtraCodeBlocksGenerator::CreateNewProjectFile(
// Convert
for (std::string const& listFile : listFiles) {
// don't put cmake's own files into the project (#12110):
- if (listFile.find(cmSystemTools::GetCMakeRoot()) == 0) {
+ if (cmHasPrefix(listFile, cmSystemTools::GetCMakeRoot())) {
continue;
}
@@ -301,11 +301,11 @@ void cmExtraCodeBlocksGenerator::CreateNewProjectFile(
case cmStateEnums::UTILITY:
// Add all utility targets, except the Nightly/Continuous/
// Experimental-"sub"targets as e.g. NightlyStart
- if (((targetName.find("Nightly") == 0) &&
+ if ((cmHasLiteralPrefix(targetName, "Nightly") &&
(targetName != "Nightly")) ||
- ((targetName.find("Continuous") == 0) &&
+ (cmHasLiteralPrefix(targetName, "Continuous") &&
(targetName != "Continuous")) ||
- ((targetName.find("Experimental") == 0) &&
+ (cmHasLiteralPrefix(targetName, "Experimental") &&
(targetName != "Experimental"))) {
break;
}
diff --git a/Source/cmExtraCodeLiteGenerator.cxx b/Source/cmExtraCodeLiteGenerator.cxx
index de40c77..bf7555d 100644
--- a/Source/cmExtraCodeLiteGenerator.cxx
+++ b/Source/cmExtraCodeLiteGenerator.cxx
@@ -204,9 +204,7 @@ std::string cmExtraCodeLiteGenerator::CollectSourceFiles(
case cmStateEnums::STATIC_LIBRARY: {
projectType = "Static Library";
} break;
- case cmStateEnums::SHARED_LIBRARY: {
- projectType = "Dynamic Library";
- } break;
+ case cmStateEnums::SHARED_LIBRARY:
case cmStateEnums::MODULE_LIBRARY: {
projectType = "Dynamic Library";
} break;
diff --git a/Source/cmExtraEclipseCDT4Generator.cxx b/Source/cmExtraEclipseCDT4Generator.cxx
index 78cabce..80d61c3 100644
--- a/Source/cmExtraEclipseCDT4Generator.cxx
+++ b/Source/cmExtraEclipseCDT4Generator.cxx
@@ -187,10 +187,10 @@ void cmExtraEclipseCDT4Generator::CreateSettingsResourcePrefsFile()
return;
}
- fout << "eclipse.preferences.version=1" << std::endl;
+ fout << "eclipse.preferences.version=1\n";
const char* encoding = mf->GetDefinition("CMAKE_ECLIPSE_RESOURCE_ENCODING");
if (encoding) {
- fout << "encoding/<project>=" << encoding << std::endl;
+ fout << "encoding/<project>=" << encoding << '\n';
}
}
@@ -243,8 +243,7 @@ void cmExtraEclipseCDT4Generator::AddEnvVar(std::ostream& out,
const bool envVarSet = cmSystemTools::GetEnv(envVar, envVarValue);
std::string cacheEntryName = cmStrCat("CMAKE_ECLIPSE_ENVVAR_", envVar);
- const std::string* cacheValue =
- lg.GetState()->GetInitializedCacheValue(cacheEntryName);
+ cmProp cacheValue = lg.GetState()->GetInitializedCacheValue(cacheEntryName);
// now we have both, decide which one to use
std::string valueToUse;
@@ -255,8 +254,8 @@ void cmExtraEclipseCDT4Generator::AddEnvVar(std::ostream& out,
// The variable is in the env, but not in the cache. Use it and put it
// in the cache
valueToUse = envVarValue;
- mf->AddCacheDefinition(cacheEntryName, valueToUse.c_str(),
- cacheEntryName.c_str(), cmStateEnums::STRING, true);
+ mf->AddCacheDefinition(cacheEntryName, valueToUse, cacheEntryName.c_str(),
+ cmStateEnums::STRING, true);
mf->GetCMakeInstance()->SaveCache(lg.GetBinaryDirectory());
} else if (!envVarSet && cacheValue != nullptr) {
// It is already in the cache, but not in the env, so use it from the cache
@@ -270,7 +269,7 @@ void cmExtraEclipseCDT4Generator::AddEnvVar(std::ostream& out,
valueToUse = *cacheValue;
if (valueToUse.find(envVarValue) == std::string::npos) {
valueToUse = envVarValue;
- mf->AddCacheDefinition(cacheEntryName, valueToUse.c_str(),
+ mf->AddCacheDefinition(cacheEntryName, valueToUse,
cacheEntryName.c_str(), cmStateEnums::STRING,
true);
mf->GetCMakeInstance()->SaveCache(lg.GetBinaryDirectory());
@@ -415,9 +414,9 @@ void cmExtraEclipseCDT4Generator::CreateProjectFile()
xml.Element("nature", n);
}
- if (const char* extraNaturesProp =
+ if (cmProp extraNaturesProp =
mf->GetState()->GetGlobalProperty("ECLIPSE_EXTRA_NATURES")) {
- std::vector<std::string> extraNatures = cmExpandedList(extraNaturesProp);
+ std::vector<std::string> extraNatures = cmExpandedList(*extraNaturesProp);
for (std::string const& n : extraNatures) {
xml.Element("nature", n);
}
@@ -754,11 +753,11 @@ void cmExtraEclipseCDT4Generator::CreateCProjectFile() const
emmited.clear();
for (const auto& lgen : this->GlobalGenerator->GetLocalGenerators()) {
- if (const char* cdefs =
+ if (cmProp cdefs =
lgen->GetMakefile()->GetProperty("COMPILE_DEFINITIONS")) {
// Expand the list.
std::vector<std::string> defs;
- cmGeneratorExpression::Split(cdefs, defs);
+ cmGeneratorExpression::Split(*cdefs, defs);
for (std::string const& d : defs) {
if (cmGeneratorExpression::Find(d) != std::string::npos) {
@@ -936,11 +935,11 @@ void cmExtraEclipseCDT4Generator::CreateCProjectFile() const
case cmStateEnums::UTILITY:
// Add all utility targets, except the Nightly/Continuous/
// Experimental-"sub"targets as e.g. NightlyStart
- if (((targetName.find("Nightly") == 0) &&
+ if ((cmHasLiteralPrefix(targetName, "Nightly") &&
(targetName != "Nightly")) ||
- ((targetName.find("Continuous") == 0) &&
+ (cmHasLiteralPrefix(targetName, "Continuous") &&
(targetName != "Continuous")) ||
- ((targetName.find("Experimental") == 0) &&
+ (cmHasLiteralPrefix(targetName, "Experimental") &&
(targetName != "Experimental"))) {
break;
}
@@ -981,7 +980,6 @@ void cmExtraEclipseCDT4Generator::CreateCProjectFile() const
}
} break;
case cmStateEnums::INTERFACE_LIBRARY:
- break;
default:
break;
}
@@ -1033,9 +1031,9 @@ void cmExtraEclipseCDT4Generator::CreateCProjectFile() const
xml.EndElement(); // storageModule
// Append additional cproject contents without applying any XML formatting
- if (const char* extraCProjectContents =
+ if (cmProp extraCProjectContents =
mf->GetState()->GetGlobalProperty("ECLIPSE_EXTRA_CPROJECT_CONTENTS")) {
- fout << extraCProjectContents;
+ fout << *extraCProjectContents;
}
xml.EndElement(); // cproject
diff --git a/Source/cmExtraKateGenerator.cxx b/Source/cmExtraKateGenerator.cxx
index 3a22846..01fac5a 100644
--- a/Source/cmExtraKateGenerator.cxx
+++ b/Source/cmExtraKateGenerator.cxx
@@ -129,9 +129,8 @@ void cmExtraKateGenerator::WriteTargets(const cmLocalGenerator& lg,
if (targetName == "edit_cache") {
const char* editCommand =
localGen->GetMakefile()->GetDefinition("CMAKE_EDIT_COMMAND");
- if (editCommand == nullptr) {
- insertTarget = false;
- } else if (strstr(editCommand, "ccmake") != nullptr) {
+ if (editCommand == nullptr ||
+ strstr(editCommand, "ccmake") != nullptr) {
insertTarget = false;
}
}
@@ -144,11 +143,11 @@ void cmExtraKateGenerator::WriteTargets(const cmLocalGenerator& lg,
case cmStateEnums::UTILITY:
// Add all utility targets, except the Nightly/Continuous/
// Experimental-"sub"targets as e.g. NightlyStart
- if (((targetName.find("Nightly") == 0) &&
+ if ((cmHasLiteralPrefix(targetName, "Nightly") &&
(targetName != "Nightly")) ||
- ((targetName.find("Continuous") == 0) &&
+ (cmHasLiteralPrefix(targetName, "Continuous") &&
(targetName != "Continuous")) ||
- ((targetName.find("Experimental") == 0) &&
+ (cmHasLiteralPrefix(targetName, "Experimental") &&
(targetName != "Experimental"))) {
break;
}
@@ -274,7 +273,7 @@ std::string cmExtraKateGenerator::GenerateProjectName(
const std::string& name, const std::string& type,
const std::string& path) const
{
- return name + (type.empty() ? "" : "-") + type + "@" + path;
+ return name + (type.empty() ? "" : "-") + type + '@' + path;
}
std::string cmExtraKateGenerator::GetPathBasename(
diff --git a/Source/cmExtraSublimeTextGenerator.cxx b/Source/cmExtraSublimeTextGenerator.cxx
index 413449c..6dbc7b7 100644
--- a/Source/cmExtraSublimeTextGenerator.cxx
+++ b/Source/cmExtraSublimeTextGenerator.cxx
@@ -23,6 +23,8 @@
#include "cmSystemTools.h"
#include "cmake.h"
+using cmProp = const std::string*; // just to silence IWYU
+
/*
Sublime Text 2 Generator
Author: Morné Chamberlain
@@ -199,11 +201,11 @@ void cmExtraSublimeTextGenerator::AppendAllTargets(
case cmStateEnums::UTILITY:
// Add all utility targets, except the Nightly/Continuous/
// Experimental-"sub"targets as e.g. NightlyStart
- if (((targetName.find("Nightly") == 0) &&
+ if ((cmHasLiteralPrefix(targetName, "Nightly") &&
(targetName != "Nightly")) ||
- ((targetName.find("Continuous") == 0) &&
+ (cmHasLiteralPrefix(targetName, "Continuous") &&
(targetName != "Continuous")) ||
- ((targetName.find("Experimental") == 0) &&
+ (cmHasLiteralPrefix(targetName, "Experimental") &&
(targetName != "Experimental"))) {
break;
}
@@ -358,14 +360,14 @@ std::string cmExtraSublimeTextGenerator::ComputeFlagsForObject(
language);
const std::string COMPILE_FLAGS("COMPILE_FLAGS");
- if (const char* cflags = source->GetProperty(COMPILE_FLAGS)) {
- lg->AppendFlags(flags, genexInterpreter.Evaluate(cflags, COMPILE_FLAGS));
+ if (cmProp cflags = source->GetProperty(COMPILE_FLAGS)) {
+ lg->AppendFlags(flags, genexInterpreter.Evaluate(*cflags, COMPILE_FLAGS));
}
const std::string COMPILE_OPTIONS("COMPILE_OPTIONS");
- if (const char* coptions = source->GetProperty(COMPILE_OPTIONS)) {
+ if (cmProp coptions = source->GetProperty(COMPILE_OPTIONS)) {
lg->AppendCompileOptions(
- flags, genexInterpreter.Evaluate(coptions, COMPILE_OPTIONS));
+ flags, genexInterpreter.Evaluate(*coptions, COMPILE_OPTIONS));
}
return flags;
@@ -387,17 +389,17 @@ std::string cmExtraSublimeTextGenerator::ComputeDefines(
// Add preprocessor definitions for this target and configuration.
lg->GetTargetDefines(target, config, language, defines);
const std::string COMPILE_DEFINITIONS("COMPILE_DEFINITIONS");
- if (const char* compile_defs = source->GetProperty(COMPILE_DEFINITIONS)) {
+ if (cmProp compile_defs = source->GetProperty(COMPILE_DEFINITIONS)) {
lg->AppendDefines(
- defines, genexInterpreter.Evaluate(compile_defs, COMPILE_DEFINITIONS));
+ defines, genexInterpreter.Evaluate(*compile_defs, COMPILE_DEFINITIONS));
}
std::string defPropName =
cmStrCat("COMPILE_DEFINITIONS_", cmSystemTools::UpperCase(config));
- if (const char* config_compile_defs = source->GetProperty(defPropName)) {
+ if (cmProp config_compile_defs = source->GetProperty(defPropName)) {
lg->AppendDefines(
defines,
- genexInterpreter.Evaluate(config_compile_defs, COMPILE_DEFINITIONS));
+ genexInterpreter.Evaluate(*config_compile_defs, COMPILE_DEFINITIONS));
}
std::string definesString;
@@ -419,9 +421,9 @@ std::string cmExtraSublimeTextGenerator::ComputeIncludes(
// Add include directories for this source file
const std::string INCLUDE_DIRECTORIES("INCLUDE_DIRECTORIES");
- if (const char* cincludes = source->GetProperty(INCLUDE_DIRECTORIES)) {
+ if (cmProp cincludes = source->GetProperty(INCLUDE_DIRECTORIES)) {
lg->AppendIncludeDirectories(
- includes, genexInterpreter.Evaluate(cincludes, INCLUDE_DIRECTORIES),
+ includes, genexInterpreter.Evaluate(*cincludes, INCLUDE_DIRECTORIES),
*source);
}
diff --git a/Source/cmFileAPI.h b/Source/cmFileAPI.h
index e183e0d..ae07612 100644
--- a/Source/cmFileAPI.h
+++ b/Source/cmFileAPI.h
@@ -11,9 +11,9 @@
#include <unordered_set>
#include <vector>
-#include "cm_jsoncpp_reader.h"
-#include "cm_jsoncpp_value.h"
-#include "cm_jsoncpp_writer.h"
+#include <cm3p/json/reader.h>
+#include <cm3p/json/value.h>
+#include <cm3p/json/writer.h>
class cmake;
diff --git a/Source/cmFileAPICMakeFiles.cxx b/Source/cmFileAPICMakeFiles.cxx
index 44ba96c..1e4f3b6 100644
--- a/Source/cmFileAPICMakeFiles.cxx
+++ b/Source/cmFileAPICMakeFiles.cxx
@@ -6,7 +6,7 @@
#include <string>
#include <vector>
-#include "cm_jsoncpp_value.h"
+#include <cm3p/json/value.h>
#include "cmFileAPI.h"
#include "cmGlobalGenerator.h"
diff --git a/Source/cmFileAPICMakeFiles.h b/Source/cmFileAPICMakeFiles.h
index a851c32..1ae1e4f 100644
--- a/Source/cmFileAPICMakeFiles.h
+++ b/Source/cmFileAPICMakeFiles.h
@@ -5,7 +5,7 @@
#include "cmConfigure.h" // IWYU pragma: keep
-#include "cm_jsoncpp_value.h"
+#include <cm3p/json/value.h>
class cmFileAPI;
diff --git a/Source/cmFileAPICache.cxx b/Source/cmFileAPICache.cxx
index ef77795..25e5916 100644
--- a/Source/cmFileAPICache.cxx
+++ b/Source/cmFileAPICache.cxx
@@ -7,7 +7,7 @@
#include <utility>
#include <vector>
-#include "cm_jsoncpp_value.h"
+#include <cm3p/json/value.h>
#include "cmFileAPI.h"
#include "cmState.h"
@@ -67,7 +67,7 @@ Json::Value Cache::DumpEntry(std::string const& name)
entry["name"] = name;
entry["type"] =
cmState::CacheEntryTypeToString(this->State->GetCacheEntryType(name));
- entry["value"] = this->State->GetCacheEntryValue(name);
+ entry["value"] = this->State->GetSafeCacheEntryValue(name);
Json::Value properties = this->DumpEntryProperties(name);
if (!properties.empty()) {
@@ -94,7 +94,8 @@ Json::Value Cache::DumpEntryProperty(std::string const& name,
{
Json::Value property = Json::objectValue;
property["name"] = prop;
- property["value"] = this->State->GetCacheEntryProperty(name, prop);
+ cmProp p = this->State->GetCacheEntryProperty(name, prop);
+ property["value"] = p ? *p : "";
return property;
}
}
diff --git a/Source/cmFileAPICache.h b/Source/cmFileAPICache.h
index 09d9e1c..2f30c76 100644
--- a/Source/cmFileAPICache.h
+++ b/Source/cmFileAPICache.h
@@ -5,7 +5,7 @@
#include "cmConfigure.h" // IWYU pragma: keep
-#include "cm_jsoncpp_value.h"
+#include <cm3p/json/value.h>
class cmFileAPI;
diff --git a/Source/cmFileAPICodemodel.cxx b/Source/cmFileAPICodemodel.cxx
index 955195f..b983b21 100644
--- a/Source/cmFileAPICodemodel.cxx
+++ b/Source/cmFileAPICodemodel.cxx
@@ -17,7 +17,7 @@
#include <cmext/algorithm>
-#include "cm_jsoncpp_value.h"
+#include <cm3p/json/value.h>
#include "cmCryptoHash.h"
#include "cmFileAPI.h"
@@ -855,8 +855,8 @@ CompileData Target::BuildCompileData(cmSourceFile* sf)
fd.Language);
const std::string COMPILE_FLAGS("COMPILE_FLAGS");
- if (const char* cflags = sf->GetProperty(COMPILE_FLAGS)) {
- std::string flags = genexInterpreter.Evaluate(cflags, COMPILE_FLAGS);
+ if (cmProp cflags = sf->GetProperty(COMPILE_FLAGS)) {
+ std::string flags = genexInterpreter.Evaluate(*cflags, COMPILE_FLAGS);
fd.Flags.emplace_back(std::move(flags), JBTIndex());
}
const std::string COMPILE_OPTIONS("COMPILE_OPTIONS");
@@ -872,14 +872,27 @@ CompileData Target::BuildCompileData(cmSourceFile* sf)
}
// Add precompile headers compile options.
- const std::string pchSource =
- this->GT->GetPchSource(this->Config, fd.Language);
+ std::vector<std::string> architectures;
+ this->GT->GetAppleArchs(this->Config, architectures);
+ if (architectures.empty()) {
+ architectures.emplace_back();
+ }
+
+ std::unordered_map<std::string, std::string> pchSources;
+ for (const std::string& arch : architectures) {
+ const std::string pchSource =
+ this->GT->GetPchSource(this->Config, fd.Language, arch);
+ if (!pchSource.empty()) {
+ pchSources.insert(std::make_pair(pchSource, arch));
+ }
+ }
- if (!pchSource.empty() && !sf->GetProperty("SKIP_PRECOMPILE_HEADERS")) {
+ if (!pchSources.empty() && !sf->GetProperty("SKIP_PRECOMPILE_HEADERS")) {
std::string pchOptions;
- if (sf->ResolveFullPath() == pchSource) {
- pchOptions =
- this->GT->GetPchCreateCompileOptions(this->Config, fd.Language);
+ auto pchIt = pchSources.find(sf->ResolveFullPath());
+ if (pchIt != pchSources.end()) {
+ pchOptions = this->GT->GetPchCreateCompileOptions(
+ this->Config, fd.Language, pchIt->second);
} else {
pchOptions =
this->GT->GetPchUseCompileOptions(this->Config, fd.Language);
@@ -936,10 +949,10 @@ CompileData Target::BuildCompileData(cmSourceFile* sf)
std::set<std::string> configFileDefines;
const std::string defPropName =
"COMPILE_DEFINITIONS_" + cmSystemTools::UpperCase(this->Config);
- if (const char* config_defs = sf->GetProperty(defPropName)) {
+ if (cmProp config_defs = sf->GetProperty(defPropName)) {
lg->AppendDefines(
configFileDefines,
- genexInterpreter.Evaluate(config_defs, COMPILE_DEFINITIONS));
+ genexInterpreter.Evaluate(*config_defs, COMPILE_DEFINITIONS));
}
fd.Defines.reserve(fileDefines.size() + configFileDefines.size());
@@ -1411,9 +1424,9 @@ Json::Value Target::DumpDependency(cmTargetDepend const& td)
Json::Value Target::DumpFolder()
{
Json::Value folder;
- if (const char* f = this->GT->GetProperty("FOLDER")) {
+ if (cmProp f = this->GT->GetProperty("FOLDER")) {
folder = Json::objectValue;
- folder["name"] = f;
+ folder["name"] = *f;
}
return folder;
}
diff --git a/Source/cmFileAPICodemodel.h b/Source/cmFileAPICodemodel.h
index ffbd928..a6c6bdd 100644
--- a/Source/cmFileAPICodemodel.h
+++ b/Source/cmFileAPICodemodel.h
@@ -5,7 +5,7 @@
#include "cmConfigure.h" // IWYU pragma: keep
-#include "cm_jsoncpp_value.h"
+#include <cm3p/json/value.h>
class cmFileAPI;
diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx
index e36abdc..268c5d1 100644
--- a/Source/cmFileCommand.cxx
+++ b/Source/cmFileCommand.cxx
@@ -8,6 +8,7 @@
#include <cmath>
#include <cstdio>
#include <cstdlib>
+#include <iterator>
#include <map>
#include <set>
#include <sstream>
@@ -16,13 +17,14 @@
#include <cm/memory>
#include <cmext/algorithm>
+#include <cmext/string_view>
+
+#include <cm3p/kwiml/int.h>
#include "cmsys/FStream.hxx"
#include "cmsys/Glob.hxx"
#include "cmsys/RegularExpression.hxx"
-#include "cm_kwiml.h"
-#include "cm_static_string_view.hxx"
#include "cm_sys_stat.h"
#include "cmAlgorithms.h"
@@ -33,12 +35,14 @@
#include "cmFileInstaller.h"
#include "cmFileLockPool.h"
#include "cmFileTimes.h"
+#include "cmGeneratedFileStream.h"
#include "cmGeneratorExpression.h"
#include "cmGlobalGenerator.h"
#include "cmHexFileConverter.h"
#include "cmListFileCache.h"
#include "cmMakefile.h"
#include "cmMessageType.h"
+#include "cmNewLineStyle.h"
#include "cmPolicies.h"
#include "cmRange.h"
#include "cmRuntimeDependencyArchive.h"
@@ -47,10 +51,11 @@
#include "cmSubcommandTable.h"
#include "cmSystemTools.h"
#include "cmTimestamp.h"
+#include "cmWorkingDirectory.h"
#include "cmake.h"
#if !defined(CMAKE_BOOTSTRAP)
-# include "cm_curl.h"
+# include <cm3p/curl/curl.h>
# include "cmCurl.h"
# include "cmFileLockResult.h"
@@ -672,12 +677,12 @@ bool HandleGlobImpl(std::vector<std::string> const& args, bool recurse,
}
}
+ cmake* cm = status.GetMakefile().GetCMakeInstance();
std::vector<std::string> files;
bool configureDepends = false;
bool warnConfigureLate = false;
bool warnFollowedSymlinks = false;
- const cmake::WorkingMode workingMode =
- status.GetMakefile().GetCMakeInstance()->GetWorkingMode();
+ const cmake::WorkingMode workingMode = cm->GetWorkingMode();
while (i != args.end()) {
if (*i == "LIST_DIRECTORIES") {
++i; // skip LIST_DIRECTORIES
@@ -765,12 +770,17 @@ bool HandleGlobImpl(std::vector<std::string> const& args, bool recurse,
MessageType::AUTHOR_WARNING,
"Cyclic recursion detected while globbing for '" + *i + "':\n" +
globMessage.content);
- } else {
+ } else if (globMessage.type == cmsys::Glob::error) {
status.GetMakefile().IssueMessage(
MessageType::FATAL_ERROR,
"Error has occurred while globbing for '" + *i + "' - " +
globMessage.content);
shouldExit = true;
+ } else if (cm->GetDebugOutput() || cm->GetTrace()) {
+ status.GetMakefile().IssueMessage(
+ MessageType::LOG,
+ cmStrCat("Globbing for\n ", *i, "\nEncountered an error:\n ",
+ globMessage.content));
}
}
if (shouldExit) {
@@ -790,7 +800,7 @@ bool HandleGlobImpl(std::vector<std::string> const& args, bool recurse,
std::sort(foundFiles.begin(), foundFiles.end());
foundFiles.erase(std::unique(foundFiles.begin(), foundFiles.end()),
foundFiles.end());
- status.GetMakefile().GetCMakeInstance()->AddGlobCacheEntry(
+ cm->AddGlobCacheEntry(
recurse, (recurse ? g.GetRecurseListDirs() : g.GetListDirs()),
(recurse ? g.GetRecurseThroughSymlinks() : false),
(g.GetRelative() ? g.GetRelative() : ""), expr, foundFiles, variable,
@@ -1606,7 +1616,7 @@ bool HandleDownloadCommand(std::vector<std::string> const& args,
if (i != args.end()) {
tls_verify = cmIsOn(*i);
} else {
- status.SetError("TLS_VERIFY missing bool value.");
+ status.SetError("DOWNLOAD missing bool value for TLS_VERIFY.");
return false;
}
} else if (*i == "TLS_CAINFO") {
@@ -1614,7 +1624,7 @@ bool HandleDownloadCommand(std::vector<std::string> const& args,
if (i != args.end()) {
cainfo = i->c_str();
} else {
- status.SetError("TLS_CAFILE missing file value.");
+ status.SetError("DOWNLOAD missing file value for TLS_CAINFO.");
return false;
}
} else if (*i == "NETRC_FILE") {
@@ -1756,11 +1766,12 @@ bool HandleDownloadCommand(std::vector<std::string> const& args,
// check to see if TLS verification is requested
if (tls_verify) {
res = ::curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1);
- check_curl_result(res, "Unable to set TLS/SSL Verify on: ");
+ check_curl_result(res, "DOWNLOAD cannot set TLS/SSL Verify on: ");
} else {
res = ::curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
- check_curl_result(res, "Unable to set TLS/SSL Verify off: ");
+ check_curl_result(res, "DOWNLOAD cannot set TLS/SSL Verify off: ");
}
+
// check to see if a CAINFO file has been specified
// command arg comes first
std::string const& cainfo_err = cmCurlSetCAInfo(curl, cainfo);
@@ -1925,6 +1936,8 @@ bool HandleUploadCommand(std::vector<std::string> const& args,
std::string logVar;
std::string statusVar;
bool showProgress = false;
+ bool tls_verify = status.GetMakefile().IsOn("CMAKE_TLS_VERIFY");
+ const char* cainfo = status.GetMakefile().GetDefinition("CMAKE_TLS_CAINFO");
std::string userpwd;
std::string netrc_level =
status.GetMakefile().GetSafeDefinition("CMAKE_NETRC");
@@ -1966,6 +1979,22 @@ bool HandleUploadCommand(std::vector<std::string> const& args,
statusVar = *i;
} else if (*i == "SHOW_PROGRESS") {
showProgress = true;
+ } else if (*i == "TLS_VERIFY") {
+ ++i;
+ if (i != args.end()) {
+ tls_verify = cmIsOn(*i);
+ } else {
+ status.SetError("UPLOAD missing bool value for TLS_VERIFY.");
+ return false;
+ }
+ } else if (*i == "TLS_CAINFO") {
+ ++i;
+ if (i != args.end()) {
+ cainfo = i->c_str();
+ } else {
+ status.SetError("UPLOAD missing file value for TLS_CAINFO.");
+ return false;
+ }
} else if (*i == "NETRC_FILE") {
++i;
if (i != args.end()) {
@@ -2051,8 +2080,18 @@ bool HandleUploadCommand(std::vector<std::string> const& args,
cmFileCommandCurlDebugCallback);
check_curl_result(res, "UPLOAD cannot set debug function: ");
- // make sure default CAInfo is set
- std::string const& cainfo_err = cmCurlSetCAInfo(curl, nullptr);
+ // check to see if TLS verification is requested
+ if (tls_verify) {
+ res = ::curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1);
+ check_curl_result(res, "UPLOAD cannot set TLS/SSL Verify on: ");
+ } else {
+ res = ::curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
+ check_curl_result(res, "UPLOAD cannot set TLS/SSL Verify off: ");
+ }
+
+ // check to see if a CAINFO file has been specified
+ // command arg comes first
+ std::string const& cainfo_err = cmCurlSetCAInfo(curl, cainfo);
if (!cainfo_err.empty()) {
status.SetError(cainfo_err);
return false;
@@ -2330,12 +2369,9 @@ bool HandleLockCommand(std::vector<std::string> const& args,
path += "/cmake.lock";
}
- if (!cmsys::SystemTools::FileIsFullPath(path)) {
- path = status.GetMakefile().GetCurrentSourceDirectory() + "/" + path;
- }
-
// Unify path (remove '//', '/../', ...)
- path = cmSystemTools::CollapseFullPath(path);
+ path = cmSystemTools::CollapseFullPath(
+ path, status.GetMakefile().GetCurrentSourceDirectory());
// Create file and directories if needed
std::string parentDir = cmSystemTools::GetParentDirectory(path);
@@ -2783,6 +2819,325 @@ bool HandleGetRuntimeDependenciesCommand(std::vector<std::string> const& args,
return true;
}
+bool HandleConfigureCommand(std::vector<std::string> const& args,
+ cmExecutionStatus& status)
+{
+ if (args.size() < 5) {
+ status.SetError("Incorrect arguments to CONFIGURE subcommand.");
+ return false;
+ }
+ if (args[1] != "OUTPUT") {
+ status.SetError("Incorrect arguments to CONFIGURE subcommand.");
+ return false;
+ }
+ if (args[3] != "CONTENT") {
+ status.SetError("Incorrect arguments to CONFIGURE subcommand.");
+ return false;
+ }
+
+ std::string errorMessage;
+ cmNewLineStyle newLineStyle;
+ if (!newLineStyle.ReadFromArguments(args, errorMessage)) {
+ status.SetError(cmStrCat("CONFIGURE ", errorMessage));
+ return false;
+ }
+
+ bool escapeQuotes = false;
+ bool atOnly = false;
+ for (unsigned int i = 5; i < args.size(); ++i) {
+ if (args[i] == "@ONLY") {
+ atOnly = true;
+ } else if (args[i] == "ESCAPE_QUOTES") {
+ escapeQuotes = true;
+ } else if (args[i] == "NEWLINE_STYLE" || args[i] == "LF" ||
+ args[i] == "UNIX" || args[i] == "CRLF" || args[i] == "WIN32" ||
+ args[i] == "DOS") {
+ /* Options handled by NewLineStyle member above. */
+ } else {
+ status.SetError(
+ cmStrCat("CONFIGURE Unrecognized argument \"", args[i], "\""));
+ return false;
+ }
+ }
+
+ // Check for generator expressions
+ const std::string input = args[4];
+ std::string outputFile = args[2];
+
+ std::string::size_type pos = input.find_first_of("<>");
+ if (pos != std::string::npos) {
+ status.SetError(cmStrCat("CONFIGURE called with CONTENT containing a \"",
+ input[pos],
+ "\". This character is not allowed."));
+ return false;
+ }
+
+ pos = outputFile.find_first_of("<>");
+ if (pos != std::string::npos) {
+ status.SetError(cmStrCat("CONFIGURE called with OUTPUT containing a \"",
+ outputFile[pos],
+ "\". This character is not allowed."));
+ return false;
+ }
+
+ cmMakefile& makeFile = status.GetMakefile();
+ if (!makeFile.CanIWriteThisFile(outputFile)) {
+ cmSystemTools::Error("Attempt to write file: " + outputFile +
+ " into a source directory.");
+ return false;
+ }
+
+ cmSystemTools::ConvertToUnixSlashes(outputFile);
+
+ // Re-generate if non-temporary outputs are missing.
+ // when we finalize the configuration we will remove all
+ // output files that now don't exist.
+ makeFile.AddCMakeOutputFile(outputFile);
+
+ // Create output directory
+ const std::string::size_type slashPos = outputFile.rfind('/');
+ if (slashPos != std::string::npos) {
+ const std::string path = outputFile.substr(0, slashPos);
+ cmSystemTools::MakeDirectory(path);
+ }
+
+ std::string newLineCharacters;
+ bool open_with_binary_flag = false;
+ if (newLineStyle.IsValid()) {
+ open_with_binary_flag = true;
+ newLineCharacters = newLineStyle.GetCharacters();
+ }
+
+ cmGeneratedFileStream fout;
+ fout.Open(outputFile, false, open_with_binary_flag);
+ if (!fout) {
+ cmSystemTools::Error("Could not open file for write in copy operation " +
+ outputFile);
+ cmSystemTools::ReportLastSystemError("");
+ return false;
+ }
+ fout.SetCopyIfDifferent(true);
+
+ // copy intput to output and expand variables from input at the same time
+ std::stringstream sin(input, std::ios::in);
+ std::string inLine;
+ std::string outLine;
+ while (cmSystemTools::GetLineFromStream(sin, inLine)) {
+ outLine.clear();
+ makeFile.ConfigureString(inLine, outLine, atOnly, escapeQuotes);
+ fout << outLine << newLineCharacters;
+ }
+
+ // close file before attempting to copy
+ fout.close();
+
+ return true;
+}
+
+bool HandleArchiveCreateCommand(std::vector<std::string> const& args,
+ cmExecutionStatus& status)
+{
+ struct Arguments
+ {
+ std::string Output;
+ std::string Format;
+ std::string Type;
+ std::string MTime;
+ bool Verbose = false;
+ std::vector<std::string> Files;
+ std::vector<std::string> Directories;
+ };
+
+ static auto const parser = cmArgumentParser<Arguments>{}
+ .Bind("OUTPUT"_s, &Arguments::Output)
+ .Bind("FORMAT"_s, &Arguments::Format)
+ .Bind("TYPE"_s, &Arguments::Type)
+ .Bind("MTIME"_s, &Arguments::MTime)
+ .Bind("VERBOSE"_s, &Arguments::Verbose)
+ .Bind("FILES"_s, &Arguments::Files)
+ .Bind("DIRECTORY"_s, &Arguments::Directories);
+
+ std::vector<std::string> unrecognizedArguments;
+ std::vector<std::string> keywordsMissingValues;
+ auto parsedArgs =
+ parser.Parse(cmMakeRange(args).advance(1), &unrecognizedArguments,
+ &keywordsMissingValues);
+ auto argIt = unrecognizedArguments.begin();
+ if (argIt != unrecognizedArguments.end()) {
+ status.SetError(cmStrCat("Unrecognized argument: \"", *argIt, "\""));
+ cmSystemTools::SetFatalErrorOccured();
+ return false;
+ }
+
+ const std::vector<std::string> LIST_ARGS = {
+ "OUTPUT", "FORMAT", "TYPE", "MTIME", "FILES", "DIRECTORY",
+ };
+ auto kwbegin = keywordsMissingValues.cbegin();
+ auto kwend = cmRemoveMatching(keywordsMissingValues, LIST_ARGS);
+ if (kwend != kwbegin) {
+ status.SetError(cmStrCat("Keywords missing values:\n ",
+ cmJoin(cmMakeRange(kwbegin, kwend), "\n ")));
+ cmSystemTools::SetFatalErrorOccured();
+ return false;
+ }
+
+ const char* knownFormats[] = {
+ "7zip", "gnutar", "pax", "paxr", "raw", "zip"
+ };
+
+ if (!parsedArgs.Format.empty() &&
+ !cm::contains(knownFormats, parsedArgs.Format)) {
+ status.SetError(
+ cmStrCat("archive format ", parsedArgs.Format, " not supported"));
+ cmSystemTools::SetFatalErrorOccured();
+ return false;
+ }
+
+ const char* zipFileFormats[] = { "7zip", "zip" };
+ if (!parsedArgs.Type.empty() &&
+ cm::contains(zipFileFormats, parsedArgs.Format)) {
+ status.SetError(cmStrCat("archive format ", parsedArgs.Format,
+ " does not support TYPE arguments"));
+ cmSystemTools::SetFatalErrorOccured();
+ return false;
+ }
+
+ static std::map<std::string, cmSystemTools::cmTarCompression>
+ compressionTypeMap = { { "None", cmSystemTools::TarCompressNone },
+ { "BZip2", cmSystemTools::TarCompressBZip2 },
+ { "GZip", cmSystemTools::TarCompressGZip },
+ { "XZ", cmSystemTools::TarCompressXZ },
+ { "Zstd", cmSystemTools::TarCompressZstd } };
+
+ std::string const& outFile = parsedArgs.Output;
+ std::vector<std::string> files = parsedArgs.Files;
+ std::copy(parsedArgs.Directories.begin(), parsedArgs.Directories.end(),
+ std::back_inserter(files));
+
+ cmSystemTools::cmTarCompression compress = cmSystemTools::TarCompressNone;
+ auto typeIt = compressionTypeMap.find(parsedArgs.Type);
+ if (typeIt != compressionTypeMap.end()) {
+ compress = typeIt->second;
+ } else if (!parsedArgs.Type.empty()) {
+ status.SetError(
+ cmStrCat("compression type ", parsedArgs.Type, " is not supported"));
+ cmSystemTools::SetFatalErrorOccured();
+ return false;
+ }
+
+ if (files.empty()) {
+ status.GetMakefile().IssueMessage(MessageType::AUTHOR_WARNING,
+ "No files or directories specified");
+ }
+
+ if (!cmSystemTools::CreateTar(outFile, files, compress, parsedArgs.Verbose,
+ parsedArgs.MTime, parsedArgs.Format)) {
+ status.SetError(cmStrCat("failed to compress: ", outFile));
+ cmSystemTools::SetFatalErrorOccured();
+ return false;
+ }
+
+ return true;
+}
+
+bool HandleArchiveExtractCommand(std::vector<std::string> const& args,
+ cmExecutionStatus& status)
+{
+ struct Arguments
+ {
+ std::string Input;
+ bool Verbose = false;
+ bool ListOnly = false;
+ std::string Destination;
+ std::vector<std::string> Files;
+ std::vector<std::string> Directories;
+ };
+
+ static auto const parser = cmArgumentParser<Arguments>{}
+ .Bind("INPUT"_s, &Arguments::Input)
+ .Bind("VERBOSE"_s, &Arguments::Verbose)
+ .Bind("LIST_ONLY"_s, &Arguments::ListOnly)
+ .Bind("DESTINATION"_s, &Arguments::Destination)
+ .Bind("FILES"_s, &Arguments::Files)
+ .Bind("DIRECTORY"_s, &Arguments::Directories);
+
+ std::vector<std::string> unrecognizedArguments;
+ std::vector<std::string> keywordsMissingValues;
+ auto parsedArgs =
+ parser.Parse(cmMakeRange(args).advance(1), &unrecognizedArguments,
+ &keywordsMissingValues);
+ auto argIt = unrecognizedArguments.begin();
+ if (argIt != unrecognizedArguments.end()) {
+ status.SetError(cmStrCat("Unrecognized argument: \"", *argIt, "\""));
+ cmSystemTools::SetFatalErrorOccured();
+ return false;
+ }
+
+ const std::vector<std::string> LIST_ARGS = {
+ "INPUT",
+ "DESTINATION",
+ "FILES",
+ "DIRECTORY",
+ };
+ auto kwbegin = keywordsMissingValues.cbegin();
+ auto kwend = cmRemoveMatching(keywordsMissingValues, LIST_ARGS);
+ if (kwend != kwbegin) {
+ status.SetError(cmStrCat("Keywords missing values:\n ",
+ cmJoin(cmMakeRange(kwbegin, kwend), "\n ")));
+ cmSystemTools::SetFatalErrorOccured();
+ return false;
+ }
+
+ std::string inFile = parsedArgs.Input;
+ std::vector<std::string> files = parsedArgs.Files;
+ std::copy(parsedArgs.Directories.begin(), parsedArgs.Directories.end(),
+ std::back_inserter(files));
+
+ if (parsedArgs.ListOnly) {
+ if (!cmSystemTools::ListTar(inFile, files, parsedArgs.Verbose)) {
+ status.SetError(cmStrCat("failed to list: ", inFile));
+ cmSystemTools::SetFatalErrorOccured();
+ return false;
+ }
+ } else {
+ std::string destDir = cmSystemTools::GetCurrentWorkingDirectory();
+ if (!parsedArgs.Destination.empty()) {
+ if (cmSystemTools::FileIsFullPath(parsedArgs.Destination)) {
+ destDir = parsedArgs.Destination;
+ } else {
+ destDir = cmStrCat(destDir, "/", parsedArgs.Destination);
+ }
+
+ if (!cmSystemTools::MakeDirectory(destDir)) {
+ status.SetError(cmStrCat("failed to create directory: ", destDir));
+ cmSystemTools::SetFatalErrorOccured();
+ return false;
+ }
+
+ if (!cmSystemTools::FileIsFullPath(inFile)) {
+ inFile =
+ cmStrCat(cmSystemTools::GetCurrentWorkingDirectory(), "/", inFile);
+ }
+ }
+
+ cmWorkingDirectory workdir(destDir);
+ if (workdir.Failed()) {
+ status.SetError(
+ cmStrCat("failed to change working directory to: ", destDir));
+ cmSystemTools::SetFatalErrorOccured();
+ return false;
+ }
+
+ if (!cmSystemTools::ExtractTar(inFile, files, parsedArgs.Verbose)) {
+ status.SetError(cmStrCat("failed to extract: ", inFile));
+ cmSystemTools::SetFatalErrorOccured();
+ return false;
+ }
+ }
+
+ return true;
+}
+
} // namespace
bool cmFileCommand(std::vector<std::string> const& args,
@@ -2836,6 +3191,9 @@ bool cmFileCommand(std::vector<std::string> const& args,
{ "READ_SYMLINK"_s, HandleReadSymlinkCommand },
{ "CREATE_LINK"_s, HandleCreateLinkCommand },
{ "GET_RUNTIME_DEPENDENCIES"_s, HandleGetRuntimeDependenciesCommand },
+ { "CONFIGURE"_s, HandleConfigureCommand },
+ { "ARCHIVE_CREATE"_s, HandleArchiveCreateCommand },
+ { "ARCHIVE_EXTRACT"_s, HandleArchiveExtractCommand },
};
return subcommand(args[0], args, status);
diff --git a/Source/cmFileMonitor.h b/Source/cmFileMonitor.h
index b510a2c..fc75b0c 100644
--- a/Source/cmFileMonitor.h
+++ b/Source/cmFileMonitor.h
@@ -9,7 +9,7 @@
#include <string>
#include <vector>
-#include "cm_uv.h"
+#include <cm3p/uv.h>
class cmRootWatcher;
diff --git a/Source/cmFindBase.cxx b/Source/cmFindBase.cxx
index bec99bb..b5553b8 100644
--- a/Source/cmFindBase.cxx
+++ b/Source/cmFindBase.cxx
@@ -22,10 +22,6 @@ class cmExecutionStatus;
cmFindBase::cmFindBase(cmExecutionStatus& status)
: cmFindCommon(status)
{
- this->AlreadyInCache = false;
- this->AlreadyInCacheWithoutMetaInfo = false;
- this->NamesPerDir = false;
- this->NamesPerDirAllowed = false;
}
bool cmFindBase::ParseArguments(std::vector<std::string> const& argsIn)
@@ -115,6 +111,10 @@ bool cmFindBase::ParseArguments(std::vector<std::string> const& argsIn)
} else if (args[j] == "NO_SYSTEM_PATH") {
doing = DoingNone;
this->NoDefaultPath = true;
+ } else if (args[j] == "REQUIRED") {
+ doing = DoingNone;
+ this->Required = true;
+ newStyle = true;
} else if (this->CheckCommonArgument(args[j])) {
doing = DoingNone;
} else {
@@ -296,7 +296,7 @@ bool cmFindBase::CheckForVariableInCache()
if (const char* cacheValue =
this->Makefile->GetDefinition(this->VariableName)) {
cmState* state = this->Makefile->GetState();
- const char* cacheEntry = state->GetCacheEntryValue(this->VariableName);
+ cmProp cacheEntry = state->GetCacheEntryValue(this->VariableName);
bool found = !cmIsNOTFOUND(cacheValue);
bool cached = cacheEntry != nullptr;
if (found) {
@@ -312,9 +312,9 @@ bool cmFindBase::CheckForVariableInCache()
return true;
}
if (cached) {
- const char* hs =
+ cmProp hs =
state->GetCacheEntryProperty(this->VariableName, "HELPSTRING");
- this->VariableDocumentation = hs ? hs : "(none)";
+ this->VariableDocumentation = hs ? *hs : "(none)";
}
}
return false;
diff --git a/Source/cmFindBase.h b/Source/cmFindBase.h
index fce0b11..4cbf09e 100644
--- a/Source/cmFindBase.h
+++ b/Source/cmFindBase.h
@@ -44,14 +44,16 @@ protected:
std::string VariableDocumentation;
std::string VariableName;
std::vector<std::string> Names;
- bool NamesPerDir;
- bool NamesPerDirAllowed;
+ bool NamesPerDir = false;
+ bool NamesPerDirAllowed = false;
// CMAKE_*_PATH CMAKE_SYSTEM_*_PATH FRAMEWORK|LIBRARY|INCLUDE|PROGRAM
std::string EnvironmentPath; // LIB,INCLUDE
- bool AlreadyInCache;
- bool AlreadyInCacheWithoutMetaInfo;
+ bool AlreadyInCache = false;
+ bool AlreadyInCacheWithoutMetaInfo = false;
+
+ bool Required = false;
private:
// Add pieces of the search.
diff --git a/Source/cmFindLibraryCommand.cxx b/Source/cmFindLibraryCommand.cxx
index d5a4bde..31f1201 100644
--- a/Source/cmFindLibraryCommand.cxx
+++ b/Source/cmFindLibraryCommand.cxx
@@ -12,6 +12,7 @@
#include "cmGlobalGenerator.h"
#include "cmMakefile.h"
+#include "cmMessageType.h"
#include "cmState.h"
#include "cmStateTypes.h"
#include "cmStringAlgorithms.h"
@@ -75,15 +76,22 @@ bool cmFindLibraryCommand::InitialPass(std::vector<std::string> const& argsIn)
std::string const library = this->FindLibrary();
if (!library.empty()) {
// Save the value in the cache
- this->Makefile->AddCacheDefinition(this->VariableName, library.c_str(),
+ this->Makefile->AddCacheDefinition(this->VariableName, library,
this->VariableDocumentation.c_str(),
cmStateEnums::FILEPATH);
return true;
}
std::string notfound = this->VariableName + "-NOTFOUND";
- this->Makefile->AddCacheDefinition(this->VariableName, notfound.c_str(),
+ this->Makefile->AddCacheDefinition(this->VariableName, notfound,
this->VariableDocumentation.c_str(),
cmStateEnums::FILEPATH);
+ if (this->Required) {
+ this->Makefile->IssueMessage(
+ MessageType::FATAL_ERROR,
+ "Could not find " + this->VariableName +
+ " using the following names: " + cmJoin(this->Names, ", "));
+ cmSystemTools::SetFatalErrorOccured();
+ }
return true;
}
diff --git a/Source/cmFindPackageCommand.cxx b/Source/cmFindPackageCommand.cxx
index 297c72b..d1517fe 100644
--- a/Source/cmFindPackageCommand.cxx
+++ b/Source/cmFindPackageCommand.cxx
@@ -279,9 +279,13 @@ bool cmFindPackageCommand::InitialPass(std::vector<std::string> const& args)
} else if (args[i] == "MODULE") {
moduleArgs.insert(i);
doing = DoingNone;
+ // XXX(clang-tidy): https://bugs.llvm.org/show_bug.cgi?id=44165
+ // NOLINTNEXTLINE(bugprone-branch-clone)
} else if (args[i] == "CONFIG") {
configArgs.insert(i);
doing = DoingNone;
+ // XXX(clang-tidy): https://bugs.llvm.org/show_bug.cgi?id=44165
+ // NOLINTNEXTLINE(bugprone-branch-clone)
} else if (args[i] == "NO_MODULE") {
configArgs.insert(i);
doing = DoingNone;
@@ -318,6 +322,8 @@ bool cmFindPackageCommand::InitialPass(std::vector<std::string> const& args)
this->NoSystemRegistry = true;
configArgs.insert(i);
doing = DoingNone;
+ // XXX(clang-tidy): https://bugs.llvm.org/show_bug.cgi?id=44165
+ // NOLINTNEXTLINE(bugprone-branch-clone)
} else if (args[i] == "NO_CMAKE_BUILDS_PATH") {
// Ignore legacy option.
configArgs.insert(i);
@@ -1060,8 +1066,8 @@ bool cmFindPackageCommand::FindConfig()
cmStrCat("The directory containing a CMake configuration file for ",
this->Name, '.');
// We force the value since we do not get here if it was already set.
- this->Makefile->AddCacheDefinition(this->Variable, init.c_str(),
- help.c_str(), cmStateEnums::PATH, true);
+ this->Makefile->AddCacheDefinition(this->Variable, init, help.c_str(),
+ cmStateEnums::PATH, true);
return found;
}
@@ -1114,12 +1120,10 @@ bool cmFindPackageCommand::ReadListFile(const std::string& f,
void cmFindPackageCommand::AppendToFoundProperty(bool found)
{
std::vector<std::string> foundContents;
- const char* foundProp =
+ cmProp foundProp =
this->Makefile->GetState()->GetGlobalProperty("PACKAGES_FOUND");
- if (foundProp && *foundProp) {
- std::string tmp = foundProp;
-
- cmExpandList(tmp, foundContents, false);
+ if (foundProp && !foundProp->empty()) {
+ cmExpandList(*foundProp, foundContents, false);
auto nameIt =
std::find(foundContents.begin(), foundContents.end(), this->Name);
if (nameIt != foundContents.end()) {
@@ -1128,12 +1132,10 @@ void cmFindPackageCommand::AppendToFoundProperty(bool found)
}
std::vector<std::string> notFoundContents;
- const char* notFoundProp =
+ cmProp notFoundProp =
this->Makefile->GetState()->GetGlobalProperty("PACKAGES_NOT_FOUND");
- if (notFoundProp && *notFoundProp) {
- std::string tmp = notFoundProp;
-
- cmExpandList(tmp, notFoundContents, false);
+ if (notFoundProp && !notFoundProp->empty()) {
+ cmExpandList(*notFoundProp, notFoundContents, false);
auto nameIt =
std::find(notFoundContents.begin(), notFoundContents.end(), this->Name);
if (nameIt != notFoundContents.end()) {
diff --git a/Source/cmFindPackageCommand.h b/Source/cmFindPackageCommand.h
index ae9ade7..7058a54 100644
--- a/Source/cmFindPackageCommand.h
+++ b/Source/cmFindPackageCommand.h
@@ -12,7 +12,7 @@
#include <string>
#include <vector>
-#include "cm_kwiml.h"
+#include <cm3p/kwiml/int.h>
#include "cmFindCommon.h"
#include "cmPolicies.h"
diff --git a/Source/cmFindPathCommand.cxx b/Source/cmFindPathCommand.cxx
index 908f0c1..4bab469 100644
--- a/Source/cmFindPathCommand.cxx
+++ b/Source/cmFindPathCommand.cxx
@@ -5,6 +5,7 @@
#include "cmsys/Glob.hxx"
#include "cmMakefile.h"
+#include "cmMessageType.h"
#include "cmStateTypes.h"
#include "cmStringAlgorithms.h"
#include "cmSystemTools.h"
@@ -43,14 +44,21 @@ bool cmFindPathCommand::InitialPass(std::vector<std::string> const& argsIn)
std::string result = this->FindHeader();
if (!result.empty()) {
this->Makefile->AddCacheDefinition(
- this->VariableName, result.c_str(), this->VariableDocumentation.c_str(),
+ this->VariableName, result, this->VariableDocumentation.c_str(),
(this->IncludeFileInPath) ? cmStateEnums::FILEPATH : cmStateEnums::PATH);
return true;
}
this->Makefile->AddCacheDefinition(
- this->VariableName, (this->VariableName + "-NOTFOUND").c_str(),
+ this->VariableName, this->VariableName + "-NOTFOUND",
this->VariableDocumentation.c_str(),
(this->IncludeFileInPath) ? cmStateEnums::FILEPATH : cmStateEnums::PATH);
+ if (this->Required) {
+ this->Makefile->IssueMessage(
+ MessageType::FATAL_ERROR,
+ "Could not find " + this->VariableName +
+ " using the following files: " + cmJoin(this->Names, ", "));
+ cmSystemTools::SetFatalErrorOccured();
+ }
return true;
}
diff --git a/Source/cmFindProgramCommand.cxx b/Source/cmFindProgramCommand.cxx
index 3e49172..599b1d2 100644
--- a/Source/cmFindProgramCommand.cxx
+++ b/Source/cmFindProgramCommand.cxx
@@ -3,6 +3,7 @@
#include "cmFindProgramCommand.h"
#include "cmMakefile.h"
+#include "cmMessageType.h"
#include "cmStateTypes.h"
#include "cmStringAlgorithms.h"
#include "cmSystemTools.h"
@@ -84,7 +85,7 @@ struct cmFindProgramHelper
this->TestNameExt = cmStrCat(name, ext);
this->TestPath =
cmSystemTools::CollapseFullPath(this->TestNameExt, path);
- bool exists = cmSystemTools::FileExists(this->TestPath, true);
+ bool exists = cmSystemTools::FileIsExecutable(this->TestPath);
exists ? this->DebugSearches.FoundAt(this->TestPath)
: this->DebugSearches.FailedAt(this->TestPath);
if (exists) {
@@ -127,15 +128,22 @@ bool cmFindProgramCommand::InitialPass(std::vector<std::string> const& argsIn)
std::string const result = FindProgram();
if (!result.empty()) {
// Save the value in the cache
- this->Makefile->AddCacheDefinition(this->VariableName, result.c_str(),
+ this->Makefile->AddCacheDefinition(this->VariableName, result,
this->VariableDocumentation.c_str(),
cmStateEnums::FILEPATH);
return true;
}
this->Makefile->AddCacheDefinition(
- this->VariableName, (this->VariableName + "-NOTFOUND").c_str(),
+ this->VariableName, this->VariableName + "-NOTFOUND",
this->VariableDocumentation.c_str(), cmStateEnums::FILEPATH);
+ if (this->Required) {
+ this->Makefile->IssueMessage(
+ MessageType::FATAL_ERROR,
+ "Could not find " + this->VariableName +
+ " using the following names: " + cmJoin(this->Names, ", "));
+ cmSystemTools::SetFatalErrorOccured();
+ }
return true;
}
diff --git a/Source/cmForEachCommand.cxx b/Source/cmForEachCommand.cxx
index 0546186..32e7892 100644
--- a/Source/cmForEachCommand.cxx
+++ b/Source/cmForEachCommand.cxx
@@ -4,7 +4,7 @@
#include <algorithm>
#include <cassert>
-#include <cstddef>
+#include <cstddef> // IWYU pragma: keep
// NOTE The declaration of `std::abs` has moved to `cmath` since C++17
// See https://en.cppreference.com/w/cpp/numeric/math/abs
// ALERT But IWYU used to lint `#include`s do not "understand"
@@ -18,8 +18,7 @@
#include <cm/memory>
#include <cm/string_view>
-
-#include "cm_static_string_view.hxx"
+#include <cmext/string_view>
#include "cmExecutionStatus.h"
#include "cmFunctionBlocker.h"
diff --git a/Source/cmFunctionBlocker.cxx b/Source/cmFunctionBlocker.cxx
index 5778a71..643cd82 100644
--- a/Source/cmFunctionBlocker.cxx
+++ b/Source/cmFunctionBlocker.cxx
@@ -3,7 +3,9 @@
#include "cmFunctionBlocker.h"
#include <cassert>
+#include <memory> // IWYU pragma: keep
#include <sstream>
+#include <string> // IWYU pragma: keep
#include <utility>
#include "cmExecutionStatus.h"
diff --git a/Source/cmFunctionCommand.cxx b/Source/cmFunctionCommand.cxx
index a4c9072..b6f58bd 100644
--- a/Source/cmFunctionCommand.cxx
+++ b/Source/cmFunctionCommand.cxx
@@ -7,8 +7,7 @@
#include <cm/memory>
#include <cm/string_view>
#include <cmext/algorithm>
-
-#include "cm_static_string_view.hxx"
+#include <cmext/string_view>
#include "cmExecutionStatus.h"
#include "cmFunctionBlocker.h"
diff --git a/Source/cmGeneratedFileStream.cxx b/Source/cmGeneratedFileStream.cxx
index 2af04b6..9cee0e6 100644
--- a/Source/cmGeneratedFileStream.cxx
+++ b/Source/cmGeneratedFileStream.cxx
@@ -8,8 +8,9 @@
#include "cmSystemTools.h"
#if !defined(CMAKE_BOOTSTRAP)
+# include <cm3p/zlib.h>
+
# include "cm_codecvt.hxx"
-# include "cm_zlib.h"
#endif
cmGeneratedFileStream::cmGeneratedFileStream(Encoding encoding)
@@ -180,6 +181,7 @@ int cmGeneratedFileStreamBase::CompressFile(std::string const& oldname,
}
FILE* ifs = cmsys::SystemTools::Fopen(oldname, "r");
if (!ifs) {
+ gzclose(gf);
return 0;
}
size_t res;
diff --git a/Source/cmGeneratorExpression.cxx b/Source/cmGeneratorExpression.cxx
index 81d1e46..6e293d5 100644
--- a/Source/cmGeneratorExpression.cxx
+++ b/Source/cmGeneratorExpression.cxx
@@ -32,12 +32,6 @@ std::unique_ptr<cmCompiledGeneratorExpression> cmGeneratorExpression::Parse(
new cmCompiledGeneratorExpression(this->Backtrace, std::move(input)));
}
-std::unique_ptr<cmCompiledGeneratorExpression> cmGeneratorExpression::Parse(
- const char* input) const
-{
- return this->Parse(std::string(input ? input : ""));
-}
-
std::string cmGeneratorExpression::Evaluate(
std::string input, cmLocalGenerator* lg, const std::string& config,
cmGeneratorTarget const* headTarget,
@@ -52,17 +46,6 @@ std::string cmGeneratorExpression::Evaluate(
return input;
}
-std::string cmGeneratorExpression::Evaluate(
- const char* input, cmLocalGenerator* lg, const std::string& config,
- cmGeneratorTarget const* headTarget,
- cmGeneratorExpressionDAGChecker* dagChecker,
- cmGeneratorTarget const* currentTarget, std::string const& language)
-{
- return input ? Evaluate(std::string(input), lg, config, headTarget,
- dagChecker, currentTarget, language)
- : "";
-}
-
const std::string& cmCompiledGeneratorExpression::Evaluate(
cmLocalGenerator* lg, const std::string& config,
const cmGeneratorTarget* headTarget,
@@ -103,6 +86,8 @@ const std::string& cmCompiledGeneratorExpression::EvaluateWithContext(
if (!context.HadError) {
this->HadContextSensitiveCondition = context.HadContextSensitiveCondition;
this->HadHeadSensitiveCondition = context.HadHeadSensitiveCondition;
+ this->HadLinkLanguageSensitiveCondition =
+ context.HadLinkLanguageSensitiveCondition;
this->SourceSensitiveTargets = context.SourceSensitiveTargets;
}
@@ -119,6 +104,7 @@ cmCompiledGeneratorExpression::cmCompiledGeneratorExpression(
, Quiet(false)
, HadContextSensitiveCondition(false)
, HadHeadSensitiveCondition(false)
+ , HadLinkLanguageSensitiveCondition(false)
{
cmGeneratorExpressionLexer l;
std::vector<cmGeneratorExpressionToken> tokens = l.Tokenize(this->Input);
diff --git a/Source/cmGeneratorExpression.h b/Source/cmGeneratorExpression.h
index c4be3a1..75bba02 100644
--- a/Source/cmGeneratorExpression.h
+++ b/Source/cmGeneratorExpression.h
@@ -42,8 +42,6 @@ public:
std::unique_ptr<cmCompiledGeneratorExpression> Parse(
std::string input) const;
- std::unique_ptr<cmCompiledGeneratorExpression> Parse(
- const char* input) const;
static std::string Evaluate(
std::string input, cmLocalGenerator* lg, const std::string& config,
@@ -51,12 +49,6 @@ public:
cmGeneratorExpressionDAGChecker* dagChecker = nullptr,
cmGeneratorTarget const* currentTarget = nullptr,
std::string const& language = std::string());
- static std::string Evaluate(
- const char* input, cmLocalGenerator* lg, const std::string& config,
- cmGeneratorTarget const* headTarget = nullptr,
- cmGeneratorExpressionDAGChecker* dagChecker = nullptr,
- cmGeneratorTarget const* currentTarget = nullptr,
- std::string const& language = std::string());
enum PreprocessContext
{
@@ -137,6 +129,10 @@ public:
{
return this->HadHeadSensitiveCondition;
}
+ bool GetHadLinkLanguageSensitiveCondition() const
+ {
+ return this->HadLinkLanguageSensitiveCondition;
+ }
std::set<cmGeneratorTarget const*> GetSourceSensitiveTargets() const
{
return this->SourceSensitiveTargets;
@@ -178,6 +174,7 @@ private:
mutable std::string Output;
mutable bool HadContextSensitiveCondition;
mutable bool HadHeadSensitiveCondition;
+ mutable bool HadLinkLanguageSensitiveCondition;
mutable std::set<cmGeneratorTarget const*> SourceSensitiveTargets;
};
diff --git a/Source/cmGeneratorExpressionContext.cxx b/Source/cmGeneratorExpressionContext.cxx
index 6d97331..42cbe2a 100644
--- a/Source/cmGeneratorExpressionContext.cxx
+++ b/Source/cmGeneratorExpressionContext.cxx
@@ -19,6 +19,7 @@ cmGeneratorExpressionContext::cmGeneratorExpressionContext(
, HadError(false)
, HadContextSensitiveCondition(false)
, HadHeadSensitiveCondition(false)
+ , HadLinkLanguageSensitiveCondition(false)
, EvaluateForBuildsystem(evaluateForBuildsystem)
{
}
diff --git a/Source/cmGeneratorExpressionContext.h b/Source/cmGeneratorExpressionContext.h
index 4709fa0..bceff12 100644
--- a/Source/cmGeneratorExpressionContext.h
+++ b/Source/cmGeneratorExpressionContext.h
@@ -40,6 +40,7 @@ struct cmGeneratorExpressionContext
bool HadError;
bool HadContextSensitiveCondition;
bool HadHeadSensitiveCondition;
+ bool HadLinkLanguageSensitiveCondition;
bool EvaluateForBuildsystem;
};
diff --git a/Source/cmGeneratorExpressionDAGChecker.cxx b/Source/cmGeneratorExpressionDAGChecker.cxx
index 643ba34..4f379cd 100644
--- a/Source/cmGeneratorExpressionDAGChecker.cxx
+++ b/Source/cmGeneratorExpressionDAGChecker.cxx
@@ -6,6 +6,9 @@
#include <sstream>
#include <utility>
+#include <cm/string_view>
+#include <cmext/string_view>
+
#include "cmGeneratorExpressionContext.h"
#include "cmGeneratorExpressionEvaluator.h"
#include "cmGeneratorTarget.h"
@@ -44,12 +47,7 @@ cmGeneratorExpressionDAGChecker::cmGeneratorExpressionDAGChecker(
void cmGeneratorExpressionDAGChecker::Initialize()
{
- const cmGeneratorExpressionDAGChecker* top = this;
- const cmGeneratorExpressionDAGChecker* p = this->Parent;
- while (p) {
- top = p;
- p = p->Parent;
- }
+ const auto* top = this->Top();
this->CheckResult = this->CheckGraph();
#define TEST_TRANSITIVE_PROPERTY_METHOD(METHOD) top->METHOD() ||
@@ -140,61 +138,57 @@ cmGeneratorExpressionDAGChecker::CheckGraph() const
return DAG;
}
-bool cmGeneratorExpressionDAGChecker::GetTransitivePropertiesOnly()
+bool cmGeneratorExpressionDAGChecker::GetTransitivePropertiesOnly() const
{
- const cmGeneratorExpressionDAGChecker* top = this;
- const cmGeneratorExpressionDAGChecker* parent = this->Parent;
- while (parent) {
- top = parent;
- parent = parent->Parent;
- }
+ return this->Top()->TransitivePropertiesOnly;
+}
- return top->TransitivePropertiesOnly;
+bool cmGeneratorExpressionDAGChecker::EvaluatingGenexExpression() const
+{
+ return cmHasLiteralPrefix(this->Property, "TARGET_GENEX_EVAL:") ||
+ cmHasLiteralPrefix(this->Property, "GENEX_EVAL:");
}
-bool cmGeneratorExpressionDAGChecker::EvaluatingGenexExpression()
+bool cmGeneratorExpressionDAGChecker::EvaluatingPICExpression() const
{
- return this->Property.find("TARGET_GENEX_EVAL:") == 0 ||
- this->Property.find("GENEX_EVAL:", 0) == 0;
+ return this->Top()->Property == "INTERFACE_POSITION_INDEPENDENT_CODE";
}
-bool cmGeneratorExpressionDAGChecker::EvaluatingPICExpression()
+bool cmGeneratorExpressionDAGChecker::EvaluatingLinkExpression() const
{
- const cmGeneratorExpressionDAGChecker* top = this;
- const cmGeneratorExpressionDAGChecker* parent = this->Parent;
- while (parent) {
- top = parent;
- parent = parent->Parent;
- }
+ cm::string_view property(this->Top()->Property);
+
+ return property == "LINK_DIRECTORIES"_s || property == "LINK_OPTIONS"_s ||
+ property == "LINK_DEPENDS"_s;
+}
+
+bool cmGeneratorExpressionDAGChecker::EvaluatingLinkOptionsExpression() const
+{
+ cm::string_view property(this->Top()->Property);
- return top->Property == "INTERFACE_POSITION_INDEPENDENT_CODE";
+ return property == "LINK_OPTIONS"_s;
}
bool cmGeneratorExpressionDAGChecker::EvaluatingLinkLibraries(
- cmGeneratorTarget const* tgt)
+ cmGeneratorTarget const* tgt) const
{
- const cmGeneratorExpressionDAGChecker* top = this;
- const cmGeneratorExpressionDAGChecker* parent = this->Parent;
- while (parent) {
- top = parent;
- parent = parent->Parent;
- }
+ const auto* top = this->Top();
- const char* prop = top->Property.c_str();
+ cm::string_view prop(top->Property);
if (tgt) {
- return top->Target == tgt && strcmp(prop, "LINK_LIBRARIES") == 0;
+ return top->Target == tgt && prop == "LINK_LIBRARIES"_s;
}
- return (strcmp(prop, "LINK_LIBRARIES") == 0 ||
- strcmp(prop, "LINK_INTERFACE_LIBRARIES") == 0 ||
- strcmp(prop, "IMPORTED_LINK_INTERFACE_LIBRARIES") == 0 ||
- cmHasLiteralPrefix(prop, "LINK_INTERFACE_LIBRARIES_") ||
- cmHasLiteralPrefix(prop, "IMPORTED_LINK_INTERFACE_LIBRARIES_")) ||
- strcmp(prop, "INTERFACE_LINK_LIBRARIES") == 0;
+ return prop == "LINK_LIBRARIES"_s || prop == "LINK_INTERFACE_LIBRARIES"_s ||
+ prop == "IMPORTED_LINK_INTERFACE_LIBRARIES"_s ||
+ cmHasLiteralPrefix(prop, "LINK_INTERFACE_LIBRARIES_") ||
+ cmHasLiteralPrefix(prop, "IMPORTED_LINK_INTERFACE_LIBRARIES_") ||
+ prop == "INTERFACE_LINK_LIBRARIES"_s;
}
-cmGeneratorTarget const* cmGeneratorExpressionDAGChecker::TopTarget() const
+cmGeneratorExpressionDAGChecker const* cmGeneratorExpressionDAGChecker::Top()
+ const
{
const cmGeneratorExpressionDAGChecker* top = this;
const cmGeneratorExpressionDAGChecker* parent = this->Parent;
@@ -202,7 +196,12 @@ cmGeneratorTarget const* cmGeneratorExpressionDAGChecker::TopTarget() const
top = parent;
parent = parent->Parent;
}
- return top->Target;
+ return top;
+}
+
+cmGeneratorTarget const* cmGeneratorExpressionDAGChecker::TopTarget() const
+{
+ return this->Top()->Target;
}
enum TransitiveProperty
diff --git a/Source/cmGeneratorExpressionDAGChecker.h b/Source/cmGeneratorExpressionDAGChecker.h
index f2c49bb..c2c5b6b 100644
--- a/Source/cmGeneratorExpressionDAGChecker.h
+++ b/Source/cmGeneratorExpressionDAGChecker.h
@@ -66,9 +66,12 @@ struct cmGeneratorExpressionDAGChecker
void ReportError(cmGeneratorExpressionContext* context,
const std::string& expr);
- bool EvaluatingGenexExpression();
- bool EvaluatingPICExpression();
- bool EvaluatingLinkLibraries(cmGeneratorTarget const* tgt = nullptr);
+ bool EvaluatingGenexExpression() const;
+ bool EvaluatingPICExpression() const;
+ bool EvaluatingLinkExpression() const;
+ bool EvaluatingLinkOptionsExpression() const;
+
+ bool EvaluatingLinkLibraries(cmGeneratorTarget const* tgt = nullptr) const;
#define DECLARE_TRANSITIVE_PROPERTY_METHOD(METHOD) bool METHOD() const;
@@ -76,9 +79,10 @@ struct cmGeneratorExpressionDAGChecker
#undef DECLARE_TRANSITIVE_PROPERTY_METHOD
- bool GetTransitivePropertiesOnly();
+ bool GetTransitivePropertiesOnly() const;
void SetTransitivePropertiesOnly() { this->TransitivePropertiesOnly = true; }
+ cmGeneratorExpressionDAGChecker const* Top() const;
cmGeneratorTarget const* TopTarget() const;
private:
diff --git a/Source/cmGeneratorExpressionNode.cxx b/Source/cmGeneratorExpressionNode.cxx
index 14478c2..e3de2d8 100644
--- a/Source/cmGeneratorExpressionNode.cxx
+++ b/Source/cmGeneratorExpressionNode.cxx
@@ -15,12 +15,13 @@
#include <cm/iterator>
#include <cm/string_view>
+#include <cm/vector>
+#include <cmext/algorithm>
+#include <cmext/string_view>
#include "cmsys/RegularExpression.hxx"
#include "cmsys/String.h"
-#include "cm_static_string_view.hxx"
-
#include "cmAlgorithms.h"
#include "cmGeneratorExpression.h"
#include "cmGeneratorExpressionContext.h"
@@ -62,6 +63,9 @@ std::string cmGeneratorExpressionNode::EvaluateDependentExpression(
if (cge->GetHadHeadSensitiveCondition()) {
context->HadHeadSensitiveCondition = true;
}
+ if (cge->GetHadLinkLanguageSensitiveCondition()) {
+ context->HadLinkLanguageSensitiveCondition = true;
+ }
return result;
}
@@ -310,7 +314,7 @@ static const struct InListNode : public cmGeneratorExpressionNode
break;
}
- return cmContains(values, parameters.front()) ? "1" : "0";
+ return cm::contains(values, parameters.front()) ? "1" : "0";
}
} inListNode;
@@ -904,22 +908,21 @@ static const struct ConfigurationTestNode : public cmGeneratorExpressionNode
}
if (context->CurrentTarget && context->CurrentTarget->IsImported()) {
- const char* loc = nullptr;
- const char* imp = nullptr;
+ cmProp loc = nullptr;
+ cmProp imp = nullptr;
std::string suffix;
- if (context->CurrentTarget->Target->GetMappedConfig(
- context->Config, &loc, &imp, suffix)) {
+ if (context->CurrentTarget->Target->GetMappedConfig(context->Config, loc,
+ imp, suffix)) {
// This imported target has an appropriate location
// for this (possibly mapped) config.
// Check if there is a proper config mapping for the tested config.
std::vector<std::string> mappedConfigs;
std::string mapProp = cmStrCat(
"MAP_IMPORTED_CONFIG_", cmSystemTools::UpperCase(context->Config));
- if (const char* mapValue =
- context->CurrentTarget->GetProperty(mapProp)) {
- cmExpandList(cmSystemTools::UpperCase(mapValue), mappedConfigs);
- return cmContains(mappedConfigs,
- cmSystemTools::UpperCase(parameters.front()))
+ if (cmProp mapValue = context->CurrentTarget->GetProperty(mapProp)) {
+ cmExpandList(cmSystemTools::UpperCase(*mapValue), mappedConfigs);
+ return cm::contains(mappedConfigs,
+ cmSystemTools::UpperCase(parameters.front()))
? "1"
: "0";
}
@@ -1039,6 +1042,214 @@ static const struct CompileLanguageAndIdNode : public cmGeneratorExpressionNode
}
} languageAndIdNode;
+static const struct LinkLanguageNode : public cmGeneratorExpressionNode
+{
+ LinkLanguageNode() {} // NOLINT(modernize-use-equals-default)
+
+ int NumExpectedParameters() const override { return ZeroOrMoreParameters; }
+
+ std::string Evaluate(
+ const std::vector<std::string>& parameters,
+ cmGeneratorExpressionContext* context,
+ const GeneratorExpressionContent* content,
+ cmGeneratorExpressionDAGChecker* dagChecker) const override
+ {
+ if (!context->HeadTarget || !dagChecker ||
+ !(dagChecker->EvaluatingLinkExpression() ||
+ dagChecker->EvaluatingLinkLibraries())) {
+ reportError(context, content->GetOriginalExpression(),
+ "$<LINK_LANGUAGE:...> may only be used with binary targets "
+ "to specify link libraries, link directories, link options "
+ "and link depends.");
+ return std::string();
+ }
+ if (dagChecker->EvaluatingLinkLibraries() && parameters.empty()) {
+ reportError(
+ context, content->GetOriginalExpression(),
+ "$<LINK_LANGUAGE> is not supported in link libraries expression.");
+ return std::string();
+ }
+
+ cmGlobalGenerator* gg = context->LG->GetGlobalGenerator();
+ std::string genName = gg->GetName();
+ if (genName.find("Makefiles") == std::string::npos &&
+ genName.find("Ninja") == std::string::npos &&
+ genName.find("Visual Studio") == std::string::npos &&
+ genName.find("Xcode") == std::string::npos &&
+ genName.find("Watcom WMake") == std::string::npos) {
+ reportError(context, content->GetOriginalExpression(),
+ "$<LINK_LANGUAGE:...> not supported for this generator.");
+ return std::string();
+ }
+
+ if (dagChecker->EvaluatingLinkLibraries()) {
+ context->HadHeadSensitiveCondition = true;
+ context->HadLinkLanguageSensitiveCondition = true;
+ }
+
+ if (parameters.empty()) {
+ return context->Language;
+ }
+
+ for (auto& param : parameters) {
+ if (context->Language == param) {
+ return "1";
+ }
+ }
+ return "0";
+ }
+} linkLanguageNode;
+
+namespace {
+struct LinkerId
+{
+ static std::string Evaluate(const std::vector<std::string>& parameters,
+ cmGeneratorExpressionContext* context,
+ const GeneratorExpressionContent* content,
+ const std::string& lang)
+ {
+ std::string const& linkerId =
+ context->LG->GetMakefile()->GetSafeDefinition("CMAKE_" + lang +
+ "_COMPILER_ID");
+ if (parameters.empty()) {
+ return linkerId;
+ }
+ if (linkerId.empty()) {
+ return parameters.front().empty() ? "1" : "0";
+ }
+ static cmsys::RegularExpression linkerIdValidator("^[A-Za-z0-9_]*$");
+
+ for (auto& param : parameters) {
+ if (!linkerIdValidator.find(param)) {
+ reportError(context, content->GetOriginalExpression(),
+ "Expression syntax not recognized.");
+ return std::string();
+ }
+
+ if (param == linkerId) {
+ return "1";
+ }
+ }
+ return "0";
+ }
+};
+}
+
+static const struct LinkLanguageAndIdNode : public cmGeneratorExpressionNode
+{
+ LinkLanguageAndIdNode() {} // NOLINT(modernize-use-equals-default)
+
+ int NumExpectedParameters() const override { return TwoOrMoreParameters; }
+
+ std::string Evaluate(
+ const std::vector<std::string>& parameters,
+ cmGeneratorExpressionContext* context,
+ const GeneratorExpressionContent* content,
+ cmGeneratorExpressionDAGChecker* dagChecker) const override
+ {
+ if (!context->HeadTarget || !dagChecker ||
+ !(dagChecker->EvaluatingLinkExpression() ||
+ dagChecker->EvaluatingLinkLibraries())) {
+ reportError(
+ context, content->GetOriginalExpression(),
+ "$<LINK_LANG_AND_ID:lang,id> may only be used with binary targets "
+ "to specify link libraries, link directories, link options, and link "
+ "depends.");
+ return std::string();
+ }
+
+ cmGlobalGenerator* gg = context->LG->GetGlobalGenerator();
+ std::string genName = gg->GetName();
+ if (genName.find("Makefiles") == std::string::npos &&
+ genName.find("Ninja") == std::string::npos &&
+ genName.find("Visual Studio") == std::string::npos &&
+ genName.find("Xcode") == std::string::npos &&
+ genName.find("Watcom WMake") == std::string::npos) {
+ reportError(
+ context, content->GetOriginalExpression(),
+ "$<LINK_LANG_AND_ID:lang,id> not supported for this generator.");
+ return std::string();
+ }
+
+ if (dagChecker->EvaluatingLinkLibraries()) {
+ context->HadHeadSensitiveCondition = true;
+ context->HadLinkLanguageSensitiveCondition = true;
+ }
+
+ const std::string& lang = context->Language;
+ if (lang == parameters.front()) {
+ std::vector<std::string> idParameter((parameters.cbegin() + 1),
+ parameters.cend());
+ return LinkerId::Evaluate(idParameter, context, content, lang);
+ }
+ return "0";
+ }
+} linkLanguageAndIdNode;
+
+static const struct HostLinkNode : public cmGeneratorExpressionNode
+{
+ HostLinkNode() {} // NOLINT(modernize-use-equals-default)
+
+ int NumExpectedParameters() const override { return ZeroOrMoreParameters; }
+
+ std::string Evaluate(
+ const std::vector<std::string>& parameters,
+ cmGeneratorExpressionContext* context,
+ const GeneratorExpressionContent* content,
+ cmGeneratorExpressionDAGChecker* dagChecker) const override
+ {
+ if (!context->HeadTarget || !dagChecker ||
+ !dagChecker->EvaluatingLinkOptionsExpression()) {
+ reportError(context, content->GetOriginalExpression(),
+ "$<HOST_LINK:...> may only be used with binary targets "
+ "to specify link options.");
+ return std::string();
+ }
+
+ return context->HeadTarget->IsDeviceLink() ? std::string()
+ : cmJoin(parameters, ";");
+ }
+} hostLinkNode;
+
+static const struct DeviceLinkNode : public cmGeneratorExpressionNode
+{
+ DeviceLinkNode() {} // NOLINT(modernize-use-equals-default)
+
+ int NumExpectedParameters() const override { return ZeroOrMoreParameters; }
+
+ std::string Evaluate(
+ const std::vector<std::string>& parameters,
+ cmGeneratorExpressionContext* context,
+ const GeneratorExpressionContent* content,
+ cmGeneratorExpressionDAGChecker* dagChecker) const override
+ {
+ if (!context->HeadTarget || !dagChecker ||
+ !dagChecker->EvaluatingLinkOptionsExpression()) {
+ reportError(context, content->GetOriginalExpression(),
+ "$<DEVICE_LINK:...> may only be used with binary targets "
+ "to specify link options.");
+ return std::string();
+ }
+
+ if (context->HeadTarget->IsDeviceLink()) {
+ std::vector<std::string> list;
+ cmExpandLists(parameters.begin(), parameters.end(), list);
+ const auto DL_BEGIN = "<DEVICE_LINK>"_s;
+ const auto DL_END = "</DEVICE_LINK>"_s;
+ cm::erase_if(list, [&](const std::string& item) {
+ return item == DL_BEGIN || item == DL_END;
+ });
+
+ list.insert(list.begin(), static_cast<std::string>(DL_BEGIN));
+ list.push_back(static_cast<std::string>(DL_END));
+
+ return cmJoin(list, ";");
+ }
+
+ return std::string();
+ }
+} deviceLinkNode;
+
std::string getLinkedTargetsContent(
cmGeneratorTarget const* target, std::string const& prop,
cmGeneratorExpressionContext* context,
@@ -1156,6 +1367,7 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode
context, content->GetOriginalExpression(),
"$<TARGET_PROPERTY:prop> may only be used with binary targets. "
"It may not be used with add_custom_command or add_custom_target. "
+ " "
"Specify the target to read a property from using the "
"$<TARGET_PROPERTY:tgt,prop> signature instead.");
return std::string();
@@ -1270,8 +1482,8 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode
std::string result;
bool haveProp = false;
- if (const char* p = target->GetProperty(propertyName)) {
- result = p;
+ if (cmProp p = target->GetProperty(propertyName)) {
+ result = *p;
haveProp = true;
} else if (evaluatingLinkLibraries) {
return std::string();
@@ -1418,11 +1630,11 @@ static const struct TargetObjectsNode : public cmGeneratorExpressionNode
std::vector<std::string> objects;
if (gt->IsImported()) {
- const char* loc = nullptr;
- const char* imp = nullptr;
+ cmProp loc = nullptr;
+ cmProp imp = nullptr;
std::string suffix;
- if (gt->Target->GetMappedConfig(context->Config, &loc, &imp, suffix)) {
- cmExpandList(loc, objects);
+ if (gt->Target->GetMappedConfig(context->Config, loc, imp, suffix)) {
+ cmExpandList(*loc, objects);
}
context->HadContextSensitiveCondition = true;
} else {
@@ -1509,13 +1721,13 @@ static const struct CompileFeaturesNode : public cmGeneratorExpressionNode
for (auto const& lit : testedFeatures) {
std::vector<std::string> const& langAvailable =
availableFeatures[lit.first];
- const char* standardDefault = context->LG->GetMakefile()->GetDefinition(
+ cmProp standardDefault = context->LG->GetMakefile()->GetDef(
"CMAKE_" + lit.first + "_STANDARD_DEFAULT");
for (std::string const& it : lit.second) {
- if (!cmContains(langAvailable, it)) {
+ if (!cm::contains(langAvailable, it)) {
return "0";
}
- if (standardDefault && !*standardDefault) {
+ if (standardDefault && standardDefault->empty()) {
// This compiler has no notion of language standard levels.
// All features known for the language are always available.
continue;
@@ -1523,12 +1735,12 @@ static const struct CompileFeaturesNode : public cmGeneratorExpressionNode
if (!context->LG->GetMakefile()->HaveStandardAvailable(
target->Target, lit.first, it)) {
if (evalLL) {
- const char* l = target->GetProperty(lit.first + "_STANDARD");
+ cmProp l = target->GetProperty(lit.first + "_STANDARD");
if (!l) {
l = standardDefault;
}
assert(l);
- context->MaxLanguageStandard[target][lit.first] = l;
+ context->MaxLanguageStandard[target][lit.first] = *l;
} else {
return "0";
}
@@ -2314,6 +2526,10 @@ const cmGeneratorExpressionNode* cmGeneratorExpressionNode::GetNode(
{ "LINK_ONLY", &linkOnlyNode },
{ "COMPILE_LANG_AND_ID", &languageAndIdNode },
{ "COMPILE_LANGUAGE", &languageNode },
+ { "LINK_LANG_AND_ID", &linkLanguageAndIdNode },
+ { "LINK_LANGUAGE", &linkLanguageNode },
+ { "HOST_LINK", &hostLinkNode },
+ { "DEVICE_LINK", &deviceLinkNode },
{ "SHELL_PATH", &shellPathNode }
};
diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx
index 5828651..917985a 100644
--- a/Source/cmGeneratorTarget.cxx
+++ b/Source/cmGeneratorTarget.cxx
@@ -17,6 +17,8 @@
#include <cm/memory>
#include <cm/string_view>
+#include <cmext/algorithm>
+#include <cmext/string_view>
#include "cmsys/RegularExpression.hxx"
@@ -51,11 +53,11 @@
class cmMessenger;
template <>
-const char* cmTargetPropertyComputer::GetSources<cmGeneratorTarget>(
+cmProp cmTargetPropertyComputer::GetSources<cmGeneratorTarget>(
cmGeneratorTarget const* tgt, cmMessenger* /* messenger */,
cmListFileBacktrace const& /* context */)
{
- return tgt->GetSourcesProperty().c_str();
+ return &tgt->GetSourcesProperty();
}
template <>
@@ -236,17 +238,23 @@ EvaluatedTargetPropertyEntry EvaluateTargetPropertyEntry(
return ee;
}
-std::vector<EvaluatedTargetPropertyEntry> EvaluateTargetPropertyEntries(
+struct EvaluatedTargetPropertyEntries
+{
+ std::vector<EvaluatedTargetPropertyEntry> Entries;
+ bool HadContextSensitiveCondition = false;
+};
+
+EvaluatedTargetPropertyEntries EvaluateTargetPropertyEntries(
cmGeneratorTarget const* thisTarget, std::string const& config,
std::string const& lang, cmGeneratorExpressionDAGChecker* dagChecker,
std::vector<std::unique_ptr<cmGeneratorTarget::TargetPropertyEntry>> const&
in)
{
- std::vector<EvaluatedTargetPropertyEntry> out;
- out.reserve(in.size());
+ EvaluatedTargetPropertyEntries out;
+ out.Entries.reserve(in.size());
for (auto& entry : in) {
- out.emplace_back(EvaluateTargetPropertyEntry(thisTarget, config, lang,
- dagChecker, *entry));
+ out.Entries.emplace_back(EvaluateTargetPropertyEntry(
+ thisTarget, config, lang, dagChecker, *entry));
}
return out;
}
@@ -308,6 +316,13 @@ cmGeneratorTarget::cmGeneratorTarget(cmTarget* t, cmLocalGenerator* lg)
this->SourceEntries, true);
this->PolicyMap = t->GetPolicyMap();
+
+ // Get hard-coded linker language
+ if (this->Target->GetProperty("HAS_CXX")) {
+ this->LinkerLanguage = "CXX";
+ } else {
+ this->LinkerLanguage = this->Target->GetSafeProperty("LINKER_LANGUAGE");
+ }
}
cmGeneratorTarget::~cmGeneratorTarget() = default;
@@ -346,29 +361,29 @@ const std::string& cmGeneratorTarget::GetName() const
std::string cmGeneratorTarget::GetExportName() const
{
- const char* exportName = this->GetProperty("EXPORT_NAME");
+ cmProp exportName = this->GetProperty("EXPORT_NAME");
- if (exportName && *exportName) {
- if (!cmGeneratorExpression::IsValidTargetName(exportName)) {
+ if (exportName && !exportName->empty()) {
+ if (!cmGeneratorExpression::IsValidTargetName(*exportName)) {
std::ostringstream e;
- e << "EXPORT_NAME property \"" << exportName << "\" for \""
+ e << "EXPORT_NAME property \"" << *exportName << "\" for \""
<< this->GetName() << "\": is not valid.";
cmSystemTools::Error(e.str());
return "";
}
- return exportName;
+ return *exportName;
}
return this->GetName();
}
-const char* cmGeneratorTarget::GetProperty(const std::string& prop) const
+cmProp cmGeneratorTarget::GetProperty(const std::string& prop) const
{
if (!cmTargetPropertyComputer::PassesWhitelist(
this->GetType(), prop, this->Makefile->GetMessenger(),
this->GetBacktrace())) {
return nullptr;
}
- if (const char* result = cmTargetPropertyComputer::GetProperty(
+ if (cmProp result = cmTargetPropertyComputer::GetProperty(
this, prop, this->Makefile->GetMessenger(), this->GetBacktrace())) {
return result;
}
@@ -378,13 +393,16 @@ const char* cmGeneratorTarget::GetProperty(const std::string& prop) const
return this->Target->GetProperty(prop);
}
-const char* cmGeneratorTarget::GetSafeProperty(const std::string& prop) const
+std::string const& cmGeneratorTarget::GetSafeProperty(
+ std::string const& prop) const
{
- const char* ret = this->GetProperty(prop);
- if (!ret) {
- return "";
+ cmProp ret = this->GetProperty(prop);
+ if (ret) {
+ return *ret;
}
- return ret;
+
+ static std::string const s_empty;
+ return s_empty;
}
const char* cmGeneratorTarget::GetOutputTargetType(
@@ -473,8 +491,8 @@ std::string cmGeneratorTarget::GetOutputName(
std::string outName;
for (std::string const& p : props) {
- if (const char* outNameProp = this->GetProperty(p)) {
- outName = outNameProp;
+ if (cmProp outNameProp = this->GetProperty(p)) {
+ outName = *outNameProp;
break;
}
}
@@ -530,18 +548,46 @@ std::string cmGeneratorTarget::GetFileSuffix(
std::string cmGeneratorTarget::GetFilePostfix(const std::string& config) const
{
- const char* postfix = nullptr;
+ cmProp postfix = nullptr;
+ std::string frameworkPostfix;
if (!config.empty()) {
std::string configProp =
cmStrCat(cmSystemTools::UpperCase(config), "_POSTFIX");
postfix = this->GetProperty(configProp);
- // Mac application bundles and frameworks have no postfix.
+
+ // Mac application bundles and frameworks have no regular postfix like
+ // libraries do.
if (!this->IsImported() && postfix &&
(this->IsAppBundleOnApple() || this->IsFrameworkOnApple())) {
postfix = nullptr;
}
+
+ // Frameworks created by multi config generators can have a special
+ // framework postfix.
+ frameworkPostfix = GetFrameworkMultiConfigPostfix(config);
+ if (!frameworkPostfix.empty()) {
+ postfix = &frameworkPostfix;
+ }
}
- return postfix ? postfix : std::string();
+ return postfix ? *postfix : std::string();
+}
+
+std::string cmGeneratorTarget::GetFrameworkMultiConfigPostfix(
+ const std::string& config) const
+{
+ cmProp postfix = nullptr;
+ if (!config.empty()) {
+ std::string configProp = cmStrCat("FRAMEWORK_MULTI_CONFIG_POSTFIX_",
+ cmSystemTools::UpperCase(config));
+ postfix = this->GetProperty(configProp);
+
+ if (!this->IsImported() && postfix &&
+ (this->IsFrameworkOnApple() &&
+ !GetGlobalGenerator()->IsMultiConfig())) {
+ postfix = nullptr;
+ }
+ }
+ return postfix ? *postfix : std::string();
}
const char* cmGeneratorTarget::GetFilePrefixInternal(
@@ -574,7 +620,7 @@ const char* cmGeneratorTarget::GetFilePrefixInternal(
}
// Compute prefix value.
- const char* targetPrefix =
+ cmProp targetPrefix =
(isImportedLibraryArtifact ? this->GetProperty("IMPORT_PREFIX")
: this->GetProperty("PREFIX"));
@@ -582,17 +628,17 @@ const char* cmGeneratorTarget::GetFilePrefixInternal(
const char* prefixVar = this->Target->GetPrefixVariableInternal(artifact);
if (!language.empty() && prefixVar && *prefixVar) {
std::string langPrefix = prefixVar + std::string("_") + language;
- targetPrefix = this->Makefile->GetDefinition(langPrefix);
+ targetPrefix = this->Makefile->GetDef(langPrefix);
}
// if there is no prefix on the target nor specific language
// use the cmake definition.
if (!targetPrefix && prefixVar) {
- targetPrefix = this->Makefile->GetDefinition(prefixVar);
+ targetPrefix = this->Makefile->GetDef(prefixVar);
}
}
- return targetPrefix;
+ return targetPrefix ? targetPrefix->c_str() : nullptr;
}
const char* cmGeneratorTarget::GetFileSuffixInternal(
std::string const& config, cmStateEnums::ArtifactType artifact,
@@ -624,7 +670,7 @@ const char* cmGeneratorTarget::GetFileSuffixInternal(
}
// Compute suffix value.
- const char* targetSuffix =
+ cmProp targetSuffix =
(isImportedLibraryArtifact ? this->GetProperty("IMPORT_SUFFIX")
: this->GetProperty("SUFFIX"));
@@ -632,17 +678,17 @@ const char* cmGeneratorTarget::GetFileSuffixInternal(
const char* suffixVar = this->Target->GetSuffixVariableInternal(artifact);
if (!language.empty() && suffixVar && *suffixVar) {
std::string langSuffix = suffixVar + std::string("_") + language;
- targetSuffix = this->Makefile->GetDefinition(langSuffix);
+ targetSuffix = this->Makefile->GetDef(langSuffix);
}
// if there is no suffix on the target nor specific language
// use the cmake definition.
if (!targetSuffix && suffixVar) {
- targetSuffix = this->Makefile->GetDefinition(suffixVar);
+ targetSuffix = this->Makefile->GetDef(suffixVar);
}
}
- return targetSuffix;
+ return targetSuffix ? targetSuffix->c_str() : nullptr;
}
void cmGeneratorTarget::ClearSourcesCache()
@@ -705,9 +751,9 @@ void handleSystemIncludesDep(cmLocalGenerator* lg,
std::vector<std::string>& result,
bool excludeImported, std::string const& language)
{
- if (const char* dirs =
+ if (cmProp dirs =
depTgt->GetProperty("INTERFACE_SYSTEM_INCLUDE_DIRECTORIES")) {
- cmExpandList(cmGeneratorExpression::Evaluate(dirs, lg, config, headTarget,
+ cmExpandList(cmGeneratorExpression::Evaluate(*dirs, lg, config, headTarget,
dagChecker, depTgt, language),
result);
}
@@ -715,9 +761,8 @@ void handleSystemIncludesDep(cmLocalGenerator* lg,
return;
}
- if (const char* dirs =
- depTgt->GetProperty("INTERFACE_INCLUDE_DIRECTORIES")) {
- cmExpandList(cmGeneratorExpression::Evaluate(dirs, lg, config, headTarget,
+ if (cmProp dirs = depTgt->GetProperty("INTERFACE_INCLUDE_DIRECTORIES")) {
+ cmExpandList(cmGeneratorExpression::Evaluate(*dirs, lg, config, headTarget,
dagChecker, depTgt, language),
result);
}
@@ -773,12 +818,12 @@ const char* cmGeneratorTarget::GetFeature(const std::string& feature,
if (!config.empty()) {
std::string featureConfig =
cmStrCat(feature, '_', cmSystemTools::UpperCase(config));
- if (const char* value = this->GetProperty(featureConfig)) {
- return value;
+ if (cmProp value = this->GetProperty(featureConfig)) {
+ return value->c_str();
}
}
- if (const char* value = this->GetProperty(feature)) {
- return value;
+ if (cmProp value = this->GetProperty(feature)) {
+ return value->c_str();
}
return this->LocalGenerator->GetFeature(feature, config);
}
@@ -931,51 +976,12 @@ void cmGeneratorTarget::GetExternalObjects(
IMPLEMENT_VISIT(SourceKindExternalObject);
}
-void cmGeneratorTarget::GetExpectedResxHeaders(std::set<std::string>& headers,
- const std::string& config) const
-{
- KindedSources const& kinded = this->GetKindedSources(config);
- headers = kinded.ExpectedResxHeaders;
-}
-
-void cmGeneratorTarget::GetResxSources(std::vector<cmSourceFile const*>& data,
- const std::string& config) const
-{
- IMPLEMENT_VISIT(SourceKindResx);
-}
-
-void cmGeneratorTarget::GetAppManifest(std::vector<cmSourceFile const*>& data,
- const std::string& config) const
-{
- IMPLEMENT_VISIT(SourceKindAppManifest);
-}
-
void cmGeneratorTarget::GetManifests(std::vector<cmSourceFile const*>& data,
const std::string& config) const
{
IMPLEMENT_VISIT(SourceKindManifest);
}
-void cmGeneratorTarget::GetCertificates(std::vector<cmSourceFile const*>& data,
- const std::string& config) const
-{
- IMPLEMENT_VISIT(SourceKindCertificate);
-}
-
-void cmGeneratorTarget::GetExpectedXamlHeaders(std::set<std::string>& headers,
- const std::string& config) const
-{
- KindedSources const& kinded = this->GetKindedSources(config);
- headers = kinded.ExpectedXamlHeaders;
-}
-
-void cmGeneratorTarget::GetExpectedXamlSources(std::set<std::string>& srcs,
- const std::string& config) const
-{
- KindedSources const& kinded = this->GetKindedSources(config);
- srcs = kinded.ExpectedXamlSources;
-}
-
std::set<cmLinkItem> const& cmGeneratorTarget::GetUtilityItems() const
{
if (!this->UtilityItemsDone) {
@@ -995,12 +1001,6 @@ std::set<cmLinkItem> const& cmGeneratorTarget::GetUtilityItems() const
return this->UtilityItems;
}
-void cmGeneratorTarget::GetXamlSources(std::vector<cmSourceFile const*>& data,
- const std::string& config) const
-{
- IMPLEMENT_VISIT(SourceKindXaml);
-}
-
const std::string& cmGeneratorTarget::GetLocation(
const std::string& config) const
{
@@ -1052,7 +1052,8 @@ const std::string& cmGeneratorTarget::GetLocationForBuild() const
}
// Now handle the deprecated build-time configuration location.
- location = this->GetDirectory();
+ std::string const noConfig;
+ location = this->GetDirectory(noConfig);
const char* cfgid = this->Makefile->GetDefinition("CMAKE_CFG_INTDIR");
if (cfgid && strcmp(cfgid, ".") != 0) {
location += "/";
@@ -1134,8 +1135,8 @@ bool cmGeneratorTarget::MaybeHaveInterfaceProperty(
bool& maybeInterfaceProp = i->second;
// If this target itself has a non-empty property value, we are done.
- const char* p = this->GetProperty(prop);
- maybeInterfaceProp = p && *p;
+ cmProp p = this->GetProperty(prop);
+ maybeInterfaceProp = p && !p->empty();
// Otherwise, recurse to interface dependencies.
if (!maybeInterfaceProp) {
@@ -1191,7 +1192,6 @@ std::string cmGeneratorTarget::EvaluateInterfaceProperty(
return result;
case cmGeneratorExpressionDAGChecker::CYCLIC_REFERENCE:
// No error. We just skip cyclic references.
- return result;
case cmGeneratorExpressionDAGChecker::ALREADY_SEEN:
// No error. We have already seen this transitive property.
return result;
@@ -1202,13 +1202,16 @@ std::string cmGeneratorTarget::EvaluateInterfaceProperty(
cmGeneratorTarget const* headTarget =
context->HeadTarget ? context->HeadTarget : this;
- if (const char* p = this->GetProperty(prop)) {
+ if (cmProp p = this->GetProperty(prop)) {
result = cmGeneratorExpressionNode::EvaluateDependentExpression(
- p, context->LG, context, headTarget, &dagChecker, this);
+ *p, context->LG, context, headTarget, &dagChecker, this);
}
if (cmLinkInterfaceLibraries const* iface = this->GetLinkInterfaceLibraries(
context->Config, headTarget, usage_requirements_only)) {
+ context->HadContextSensitiveCondition =
+ context->HadContextSensitiveCondition ||
+ iface->HadContextSensitiveCondition;
for (cmLinkItem const& lib : iface->Libraries) {
// Broken code can have a target in its own link interface.
// Don't follow such link interface entries so as not to create a
@@ -1247,15 +1250,96 @@ std::string cmGeneratorTarget::EvaluateInterfaceProperty(
}
namespace {
+std::string AddSwiftInterfaceIncludeDirectories(
+ const cmGeneratorTarget* root, const cmGeneratorTarget* target,
+ const std::string& config, cmGeneratorExpressionDAGChecker* context)
+{
+ cmGeneratorExpressionDAGChecker dag{ target->GetBacktrace(), target,
+ "Swift_MODULE_DIRECTORY", nullptr,
+ context };
+ switch (dag.Check()) {
+ case cmGeneratorExpressionDAGChecker::SELF_REFERENCE:
+ dag.ReportError(nullptr,
+ "$<TARGET_PROPERTY:" + target->GetName() +
+ ",Swift_MODULE_DIRECTORY>");
+ CM_FALLTHROUGH;
+ case cmGeneratorExpressionDAGChecker::CYCLIC_REFERENCE:
+ // No error. We just skip cyclic references.
+ case cmGeneratorExpressionDAGChecker::ALREADY_SEEN:
+ // No error. We have already seen this transitive property.
+ return "";
+ case cmGeneratorExpressionDAGChecker::DAG:
+ break;
+ }
+
+ std::string directories;
+ if (const auto* interface =
+ target->GetLinkInterfaceLibraries(config, root, true)) {
+ for (const cmLinkItem& library : interface->Libraries) {
+ if (const cmGeneratorTarget* dependency = library.Target) {
+ if (cm::contains(dependency->GetAllConfigCompileLanguages(),
+ "Swift")) {
+ std::string value =
+ dependency->GetSafeProperty("Swift_MODULE_DIRECTORY");
+ if (value.empty()) {
+ value =
+ dependency->GetLocalGenerator()->GetCurrentBinaryDirectory();
+ }
+
+ if (!directories.empty()) {
+ directories += ";";
+ }
+ directories += value;
+ }
+ }
+ }
+ }
+ return directories;
+}
+
+void AddSwiftImplicitIncludeDirectories(
+ const cmGeneratorTarget* target, const std::string& config,
+ EvaluatedTargetPropertyEntries& entries)
+{
+ if (const auto* libraries = target->GetLinkImplementationLibraries(config)) {
+ cmGeneratorExpressionDAGChecker dag{ target->GetBacktrace(), target,
+ "Swift_MODULE_DIRECTORY", nullptr,
+ nullptr };
+
+ for (const cmLinkImplItem& library : libraries->Libraries) {
+ if (const cmGeneratorTarget* dependency = library.Target) {
+ if (cm::contains(dependency->GetAllConfigCompileLanguages(),
+ "Swift")) {
+ EvaluatedTargetPropertyEntry entry{ library, library.Backtrace };
+
+ if (cmProp val = dependency->GetProperty("Swift_MODULE_DIRECTORY")) {
+ entry.Values.emplace_back(*val);
+ } else {
+ entry.Values.emplace_back(
+ dependency->GetLocalGenerator()->GetCurrentBinaryDirectory());
+ }
+
+ cmExpandList(AddSwiftInterfaceIncludeDirectories(target, dependency,
+ config, &dag),
+ entry.Values);
+
+ entries.Entries.emplace_back(std::move(entry));
+ }
+ }
+ }
+ }
+}
+
void AddInterfaceEntries(cmGeneratorTarget const* headTarget,
std::string const& config, std::string const& prop,
std::string const& lang,
cmGeneratorExpressionDAGChecker* dagChecker,
- std::vector<EvaluatedTargetPropertyEntry>& entries,
+ EvaluatedTargetPropertyEntries& entries,
bool usage_requirements_only = true)
{
if (cmLinkImplementationLibraries const* impl =
headTarget->GetLinkImplementationLibraries(config)) {
+ entries.HadContextSensitiveCondition = impl->HadContextSensitiveCondition;
for (cmLinkImplItem const& lib : impl->Libraries) {
if (lib.Target) {
EvaluatedTargetPropertyEntry ee(lib, lib.Backtrace);
@@ -1269,7 +1353,7 @@ void AddInterfaceEntries(cmGeneratorTarget const* headTarget,
prop, &context, dagChecker, usage_requirements_only),
ee.Values);
ee.ContextDependent = context.HadContextSensitiveCondition;
- entries.emplace_back(std::move(ee));
+ entries.Entries.emplace_back(std::move(ee));
}
}
}
@@ -1278,10 +1362,11 @@ void AddInterfaceEntries(cmGeneratorTarget const* headTarget,
void AddObjectEntries(cmGeneratorTarget const* headTarget,
std::string const& config,
cmGeneratorExpressionDAGChecker* dagChecker,
- std::vector<EvaluatedTargetPropertyEntry>& entries)
+ EvaluatedTargetPropertyEntries& entries)
{
if (cmLinkImplementationLibraries const* impl =
headTarget->GetLinkImplementationLibraries(config)) {
+ entries.HadContextSensitiveCondition = impl->HadContextSensitiveCondition;
for (cmLinkImplItem const& lib : impl->Libraries) {
if (lib.Target &&
lib.Target->GetType() == cmStateEnums::OBJECT_LIBRARY) {
@@ -1300,23 +1385,23 @@ void AddObjectEntries(cmGeneratorTarget const* headTarget,
if (cge->GetHadContextSensitiveCondition()) {
ee.ContextDependent = true;
}
- entries.emplace_back(std::move(ee));
+ entries.Entries.emplace_back(std::move(ee));
}
}
}
}
bool processSources(cmGeneratorTarget const* tgt,
- std::vector<EvaluatedTargetPropertyEntry>& entries,
+ EvaluatedTargetPropertyEntries& entries,
std::vector<BT<std::string>>& srcs,
std::unordered_set<std::string>& uniqueSrcs,
bool debugSources)
{
cmMakefile* mf = tgt->Target->GetMakefile();
- bool contextDependent = false;
+ bool contextDependent = entries.HadContextSensitiveCondition;
- for (EvaluatedTargetPropertyEntry& entry : entries) {
+ for (EvaluatedTargetPropertyEntry& entry : entries.Entries) {
if (entry.ContextDependent) {
contextDependent = true;
}
@@ -1408,7 +1493,7 @@ std::vector<BT<std::string>> cmGeneratorTarget::GetSourceFilePaths(
}
bool debugSources =
- !this->DebugSourcesDone && cmContains(debugProperties, "SOURCES");
+ !this->DebugSourcesDone && cm::contains(debugProperties, "SOURCES");
if (this->LocalGenerator->GetGlobalGenerator()->GetConfigureDoneCMP0026()) {
this->DebugSourcesDone = true;
@@ -1417,16 +1502,15 @@ std::vector<BT<std::string>> cmGeneratorTarget::GetSourceFilePaths(
cmGeneratorExpressionDAGChecker dagChecker(this, "SOURCES", nullptr,
nullptr);
- std::vector<EvaluatedTargetPropertyEntry> entries =
- EvaluateTargetPropertyEntries(this, config, std::string(), &dagChecker,
- this->SourceEntries);
+ EvaluatedTargetPropertyEntries entries = EvaluateTargetPropertyEntries(
+ this, config, std::string(), &dagChecker, this->SourceEntries);
std::unordered_set<std::string> uniqueSrcs;
bool contextDependentDirectSources =
processSources(this, entries, files, uniqueSrcs, debugSources);
// Collect INTERFACE_SOURCES of all direct link-dependencies.
- std::vector<EvaluatedTargetPropertyEntry> linkInterfaceSourcesEntries;
+ EvaluatedTargetPropertyEntries linkInterfaceSourcesEntries;
AddInterfaceEntries(this, config, "INTERFACE_SOURCES", std::string(),
&dagChecker, linkInterfaceSourcesEntries);
std::vector<std::string>::size_type numFilesBefore = files.size();
@@ -1437,7 +1521,7 @@ std::vector<BT<std::string>> cmGeneratorTarget::GetSourceFilePaths(
bool contextDependentObjects = false;
std::vector<std::string>::size_type numFilesBefore2 = files.size();
if (this->GetType() != cmStateEnums::OBJECT_LIBRARY) {
- std::vector<EvaluatedTargetPropertyEntry> linkObjectsEntries;
+ EvaluatedTargetPropertyEntries linkObjectsEntries;
AddObjectEntries(this, config, &dagChecker, linkObjectsEntries);
contextDependentObjects = processSources(this, linkObjectsEntries, files,
uniqueSrcs, debugSources);
@@ -1573,10 +1657,14 @@ void cmGeneratorTarget::ComputeKindedSources(KindedSources& files,
std::string ext = cmSystemTools::LowerCase(sf->GetExtension());
if (sf->GetCustomCommand()) {
kind = SourceKindCustomCommand;
+ // XXX(clang-tidy): https://bugs.llvm.org/show_bug.cgi?id=44165
+ // NOLINTNEXTLINE(bugprone-branch-clone)
} else if (this->Target->GetType() == cmStateEnums::UTILITY) {
kind = SourceKindExtra;
} else if (this->IsSourceFilePartOfUnityBatch(sf->ResolveFullPath())) {
kind = SourceKindUnityBatched;
+ // XXX(clang-tidy): https://bugs.llvm.org/show_bug.cgi?id=44165
+ // NOLINTNEXTLINE(bugprone-branch-clone)
} else if (sf->GetPropertyAsBool("HEADER_FILE_ONLY")) {
kind = SourceKindHeader;
} else if (sf->GetPropertyAsBool("EXTERNAL_OBJECT")) {
@@ -1595,14 +1683,6 @@ void cmGeneratorTarget::ComputeKindedSources(KindedSources& files,
}
} else if (ext == "resx") {
kind = SourceKindResx;
- // Build and save the name of the corresponding .h file
- // This relationship will be used later when building the project files.
- // Both names would have been auto generated from Visual Studio
- // where the user supplied the file name and Visual Studio
- // appended the suffix.
- std::string resx = sf->ResolveFullPath();
- std::string hFileName = resx.substr(0, resx.find_last_of('.')) + ".h";
- files.ExpectedResxHeaders.insert(hFileName);
} else if (ext == "appxmanifest") {
kind = SourceKindAppManifest;
} else if (ext == "manifest") {
@@ -1611,16 +1691,6 @@ void cmGeneratorTarget::ComputeKindedSources(KindedSources& files,
kind = SourceKindCertificate;
} else if (ext == "xaml") {
kind = SourceKindXaml;
- // Build and save the name of the corresponding .h and .cpp file
- // This relationship will be used later when building the project files.
- // Both names would have been auto generated from Visual Studio
- // where the user supplied the file name and Visual Studio
- // appended the suffix.
- std::string xaml = sf->ResolveFullPath();
- std::string hFileName = xaml + ".h";
- std::string cppFileName = xaml + ".cpp";
- files.ExpectedXamlHeaders.insert(hFileName);
- files.ExpectedXamlSources.insert(cppFileName);
} else if (header_regex.find(sf->ResolveFullPath())) {
kind = SourceKindHeader;
} else {
@@ -1678,6 +1748,18 @@ void cmGeneratorTarget::ComputeAllConfigSources() const
}
}
+std::vector<cmGeneratorTarget::AllConfigSource>
+cmGeneratorTarget::GetAllConfigSources(SourceKind kind) const
+{
+ std::vector<AllConfigSource> result;
+ for (AllConfigSource const& source : this->GetAllConfigSources()) {
+ if (source.Kind == kind) {
+ result.push_back(source);
+ }
+ }
+ return result;
+}
+
std::set<std::string> cmGeneratorTarget::GetAllConfigCompileLanguages() const
{
std::set<std::string> languages;
@@ -1703,14 +1785,14 @@ std::string cmGeneratorTarget::GetCompilePDBName(
// Check for a per-configuration output directory target property.
std::string configUpper = cmSystemTools::UpperCase(config);
std::string configProp = cmStrCat("COMPILE_PDB_NAME_", configUpper);
- const char* config_name = this->GetProperty(configProp);
- if (config_name && *config_name) {
- return prefix + config_name + ".pdb";
+ cmProp config_name = this->GetProperty(configProp);
+ if (config_name && !config_name->empty()) {
+ return prefix + *config_name + ".pdb";
}
- const char* name = this->GetProperty("COMPILE_PDB_NAME");
- if (name && *name) {
- return prefix + name + ".pdb";
+ cmProp name = this->GetProperty("COMPILE_PDB_NAME");
+ if (name && !name->empty()) {
+ return prefix + *name + ".pdb";
}
return "";
@@ -1892,10 +1974,9 @@ bool cmGeneratorTarget::HasMacOSXRpathInstallNameDir(
if (this->GetType() != cmStateEnums::SHARED_LIBRARY) {
return false;
}
- const char* install_name = this->GetProperty("INSTALL_NAME_DIR");
+ cmProp install_name = this->GetProperty("INSTALL_NAME_DIR");
bool use_install_name = this->MacOSXUseInstallNameDir();
- if (install_name && use_install_name &&
- std::string(install_name) == "@rpath") {
+ if (install_name && use_install_name && *install_name == "@rpath") {
install_name_is_rpath = true;
} else if (install_name && use_install_name) {
return false;
@@ -1908,7 +1989,7 @@ bool cmGeneratorTarget::HasMacOSXRpathInstallNameDir(
if (cmGeneratorTarget::ImportInfo const* info =
this->GetImportInfo(config)) {
if (!info->NoSOName && !info->SOName.empty()) {
- if (info->SOName.find("@rpath/") == 0) {
+ if (cmHasLiteralPrefix(info->SOName, "@rpath/")) {
install_name_is_rpath = true;
}
} else {
@@ -1951,7 +2032,7 @@ bool cmGeneratorTarget::MacOSXRpathInstallNameDirDefault() const
return false;
}
- const char* macosx_rpath_str = this->GetProperty("MACOSX_RPATH");
+ cmProp macosx_rpath_str = this->GetProperty("MACOSX_RPATH");
if (macosx_rpath_str) {
return this->GetPropertyAsBool("MACOSX_RPATH");
}
@@ -1968,10 +2049,10 @@ bool cmGeneratorTarget::MacOSXRpathInstallNameDirDefault() const
bool cmGeneratorTarget::MacOSXUseInstallNameDir() const
{
- const char* build_with_install_name =
+ cmProp build_with_install_name =
this->GetProperty("BUILD_WITH_INSTALL_NAME_DIR");
if (build_with_install_name) {
- return cmIsOn(build_with_install_name);
+ return cmIsOn(*build_with_install_name);
}
cmPolicies::PolicyStatus cmp0068 = this->GetPolicyStatusCMP0068();
@@ -2025,7 +2106,7 @@ std::string cmGeneratorTarget::GetSOName(const std::string& config) const
return cmSystemTools::GetFilenameName(info->Location);
}
// Use the soname given if any.
- if (info->SOName.find("@rpath/") == 0) {
+ if (cmHasLiteralPrefix(info->SOName, "@rpath/")) {
return info->SOName.substr(6);
}
return info->SOName;
@@ -2053,11 +2134,8 @@ std::string cmGeneratorTarget::GetAppBundleDirectory(
{
std::string fpath = cmStrCat(
this->GetFullName(config, cmStateEnums::RuntimeBinaryArtifact), '.');
- const char* ext = this->GetProperty("BUNDLE_EXTENSION");
- if (!ext) {
- ext = "app";
- }
- fpath += ext;
+ cmProp ext = this->GetProperty("BUNDLE_EXTENSION");
+ fpath += (ext ? *ext : "app");
if (shouldAddContentLevel(level) &&
!this->Makefile->PlatformIsAppleEmbedded()) {
fpath += "/Contents";
@@ -2079,8 +2157,10 @@ std::string cmGeneratorTarget::GetCFBundleDirectory(
{
std::string fpath = cmStrCat(
this->GetOutputName(config, cmStateEnums::RuntimeBinaryArtifact), '.');
- const char* ext = this->GetProperty("BUNDLE_EXTENSION");
- if (!ext) {
+ std::string ext;
+ if (cmProp p = this->GetProperty("BUNDLE_EXTENSION")) {
+ ext = *p;
+ } else {
if (this->IsXCTestOnApple()) {
ext = "xctest";
} else {
@@ -2103,11 +2183,8 @@ std::string cmGeneratorTarget::GetFrameworkDirectory(
{
std::string fpath = cmStrCat(
this->GetOutputName(config, cmStateEnums::RuntimeBinaryArtifact), '.');
- const char* ext = this->GetProperty("BUNDLE_EXTENSION");
- if (!ext) {
- ext = "framework";
- }
- fpath += ext;
+ cmProp ext = this->GetProperty("BUNDLE_EXTENSION");
+ fpath += (ext ? *ext : "framework");
if (shouldAddFullLevel(level) &&
!this->Makefile->PlatformIsAppleEmbedded()) {
fpath += "/Versions/";
@@ -2158,11 +2235,11 @@ std::string cmGeneratorTarget::GetInstallNameDirForInstallTree(
{
if (this->Makefile->IsOn("CMAKE_PLATFORM_HAS_INSTALLNAME")) {
std::string dir;
- const char* install_name_dir = this->GetProperty("INSTALL_NAME_DIR");
+ cmProp install_name_dir = this->GetProperty("INSTALL_NAME_DIR");
if (this->CanGenerateInstallNameDir(INSTALL_NAME_FOR_INSTALL)) {
- if (install_name_dir && *install_name_dir) {
- dir = install_name_dir;
+ if (install_name_dir && !install_name_dir->empty()) {
+ dir = *install_name_dir;
cmGeneratorExpression::ReplaceInstallPrefix(dir, installPrefix);
dir =
cmGeneratorExpression::Evaluate(dir, this->LocalGenerator, config);
@@ -2207,8 +2284,8 @@ const std::string* cmGeneratorTarget::GetExportMacro() const
if (this->GetType() == cmStateEnums::SHARED_LIBRARY ||
this->GetType() == cmStateEnums::MODULE_LIBRARY ||
this->IsExecutableWithExports()) {
- if (const char* custom_export_name = this->GetProperty("DEFINE_SYMBOL")) {
- this->ExportMacro = custom_export_name;
+ if (cmProp custom_export_name = this->GetProperty("DEFINE_SYMBOL")) {
+ this->ExportMacro = *custom_export_name;
} else {
std::string in = cmStrCat(this->GetName(), "_EXPORTS");
this->ExportMacro = cmSystemTools::MakeCidentifier(in);
@@ -2224,11 +2301,12 @@ public:
cmTargetCollectLinkLanguages(cmGeneratorTarget const* target,
std::string config,
std::unordered_set<std::string>& languages,
- cmGeneratorTarget const* head)
+ cmGeneratorTarget const* head, bool secondPass)
: Config(std::move(config))
, Languages(languages)
, HeadTarget(head)
, Target(target)
+ , SecondPass(secondPass)
{
this->Visited.insert(target);
}
@@ -2270,11 +2348,14 @@ public:
if (!this->Visited.insert(item.Target).second) {
return;
}
- cmLinkInterface const* iface =
- item.Target->GetLinkInterface(this->Config, this->HeadTarget);
+ cmLinkInterface const* iface = item.Target->GetLinkInterface(
+ this->Config, this->HeadTarget, this->SecondPass);
if (!iface) {
return;
}
+ if (iface->HadLinkLanguageSensitiveCondition) {
+ this->HadLinkLanguageSensitiveCondition = true;
+ }
for (std::string const& language : iface->Languages) {
this->Languages.insert(language);
@@ -2285,12 +2366,19 @@ public:
}
}
+ bool GetHadLinkLanguageSensitiveCondition()
+ {
+ return HadLinkLanguageSensitiveCondition;
+ }
+
private:
std::string Config;
std::unordered_set<std::string>& Languages;
cmGeneratorTarget const* HeadTarget;
const cmGeneratorTarget* Target;
std::set<cmGeneratorTarget const*> Visited;
+ bool SecondPass;
+ bool HadLinkLanguageSensitiveCondition = false;
};
cmGeneratorTarget::LinkClosure const* cmGeneratorTarget::GetLinkClosure(
@@ -2321,7 +2409,7 @@ public:
{
this->GG = this->Target->GetLocalGenerator()->GetGlobalGenerator();
}
- void Consider(const char* lang)
+ void Consider(const std::string& lang)
{
int preference = this->GG->GetLinkerPreference(lang);
if (preference > this->Preference) {
@@ -2354,40 +2442,36 @@ public:
}
};
-void cmGeneratorTarget::ComputeLinkClosure(const std::string& config,
- LinkClosure& lc) const
+bool cmGeneratorTarget::ComputeLinkClosure(const std::string& config,
+ LinkClosure& lc,
+ bool secondPass) const
{
// Get languages built in this target.
std::unordered_set<std::string> languages;
- cmLinkImplementation const* impl = this->GetLinkImplementation(config);
+ cmLinkImplementation const* impl =
+ this->GetLinkImplementation(config, secondPass);
assert(impl);
- for (std::string const& li : impl->Languages) {
- languages.insert(li);
- }
+ languages.insert(impl->Languages.cbegin(), impl->Languages.cend());
// Add interface languages from linked targets.
- cmTargetCollectLinkLanguages cll(this, config, languages, this);
+ // cmTargetCollectLinkLanguages cll(this, config, languages, this,
+ // secondPass);
+ cmTargetCollectLinkLanguages cll(this, config, languages, this, secondPass);
for (cmLinkImplItem const& lib : impl->Libraries) {
cll.Visit(lib);
}
// Store the transitive closure of languages.
- for (std::string const& lang : languages) {
- lc.Languages.push_back(lang);
- }
+ cm::append(lc.Languages, languages);
// Choose the language whose linker should be used.
- if (this->GetProperty("HAS_CXX")) {
- lc.LinkerLanguage = "CXX";
- } else if (const char* linkerLang = this->GetProperty("LINKER_LANGUAGE")) {
- lc.LinkerLanguage = linkerLang;
- } else {
+ if (secondPass || lc.LinkerLanguage.empty()) {
// Find the language with the highest preference value.
cmTargetSelectLinker tsl(this);
// First select from the languages compiled directly in this target.
for (std::string const& l : impl->Languages) {
- tsl.Consider(l.c_str());
+ tsl.Consider(l);
}
// Now consider languages that propagate from linked targets.
@@ -2395,12 +2479,50 @@ void cmGeneratorTarget::ComputeLinkClosure(const std::string& config,
std::string propagates =
"CMAKE_" + lang + "_LINKER_PREFERENCE_PROPAGATES";
if (this->Makefile->IsOn(propagates)) {
- tsl.Consider(lang.c_str());
+ tsl.Consider(lang);
}
}
lc.LinkerLanguage = tsl.Choose();
}
+
+ return impl->HadLinkLanguageSensitiveCondition ||
+ cll.GetHadLinkLanguageSensitiveCondition();
+}
+
+void cmGeneratorTarget::ComputeLinkClosure(const std::string& config,
+ LinkClosure& lc) const
+{
+ bool secondPass = false;
+
+ {
+ LinkClosure linkClosure;
+ linkClosure.LinkerLanguage = this->LinkerLanguage;
+
+ // Get languages built in this target.
+ secondPass = this->ComputeLinkClosure(config, linkClosure, false);
+ this->LinkerLanguage = linkClosure.LinkerLanguage;
+ if (!secondPass) {
+ lc = std::move(linkClosure);
+ }
+ }
+
+ if (secondPass) {
+ LinkClosure linkClosure;
+
+ this->ComputeLinkClosure(config, linkClosure, secondPass);
+ lc = std::move(linkClosure);
+
+ // linker language must not be changed between the two passes
+ if (this->LinkerLanguage != lc.LinkerLanguage) {
+ std::ostringstream e;
+ e << "Evaluation of $<LINK_LANGUAGE:...> or $<LINK_LAND_AND_ID:...> "
+ "changes\nthe linker language for target \""
+ << this->GetName() << "\" (from '" << this->LinkerLanguage << "' to '"
+ << lc.LinkerLanguage << "') which is invalid.";
+ cmSystemTools::Error(e.str());
+ }
+ }
}
void cmGeneratorTarget::GetFullNameComponents(
@@ -2450,9 +2572,9 @@ std::string cmGeneratorTarget::GetEffectiveFolderName() const
return effectiveFolder;
}
- const char* targetFolder = this->GetProperty("FOLDER");
+ cmProp targetFolder = this->GetProperty("FOLDER");
if (targetFolder) {
- effectiveFolder += targetFolder;
+ effectiveFolder += *targetFolder;
}
return effectiveFolder;
@@ -2643,7 +2765,7 @@ cmTargetTraceDependencies::cmTargetTraceDependencies(cmGeneratorTarget* target)
for (cmSourceFile* sf : sources) {
const std::set<cmGeneratorTarget const*> tgts =
this->GlobalGenerator->GetFilenameTargetDepends(sf);
- if (cmContains(tgts, this->GeneratorTarget)) {
+ if (cm::contains(tgts, this->GeneratorTarget)) {
std::ostringstream e;
e << "Evaluation output file\n \"" << sf->ResolveFullPath()
<< "\"\ndepends on the sources of a target it is used in. This "
@@ -2676,8 +2798,8 @@ void cmTargetTraceDependencies::Trace()
this->CurrentEntry = &this->GeneratorTarget->SourceDepends[sf];
// Queue dependencies added explicitly by the user.
- if (const char* additionalDeps = sf->GetProperty("OBJECT_DEPENDS")) {
- std::vector<std::string> objDeps = cmExpandedList(additionalDeps);
+ if (cmProp additionalDeps = sf->GetProperty("OBJECT_DEPENDS")) {
+ std::vector<std::string> objDeps = cmExpandedList(*additionalDeps);
for (std::string& objDep : objDeps) {
if (cmSystemTools::FileIsFullPath(objDep)) {
objDep = cmSystemTools::CollapseFullPath(objDep);
@@ -2908,7 +3030,7 @@ std::string cmGeneratorTarget::GetCompilePDBDirectory(
void cmGeneratorTarget::GetAppleArchs(const std::string& config,
std::vector<std::string>& archVec) const
{
- const char* archs = nullptr;
+ cmProp archs = nullptr;
if (!config.empty()) {
std::string defVarName =
cmStrCat("OSX_ARCHITECTURES_", cmSystemTools::UpperCase(config));
@@ -2918,7 +3040,110 @@ void cmGeneratorTarget::GetAppleArchs(const std::string& config,
archs = this->GetProperty("OSX_ARCHITECTURES");
}
if (archs) {
- cmExpandList(std::string(archs), archVec);
+ cmExpandList(*archs, archVec);
+ }
+}
+
+void cmGeneratorTarget::AddCUDAArchitectureFlags(std::string& flags) const
+{
+ struct CudaArchitecture
+ {
+ std::string name;
+ bool real{ true };
+ bool virtual_{ true };
+ };
+ std::vector<CudaArchitecture> architectures;
+
+ {
+ std::vector<std::string> options;
+ cmExpandList(this->GetSafeProperty("CUDA_ARCHITECTURES"), options);
+
+ if (options.empty()) {
+ switch (this->GetPolicyStatusCMP0104()) {
+ case cmPolicies::WARN:
+ if (!this->LocalGenerator->GetCMakeInstance()->GetIsInTryCompile()) {
+ this->Makefile->IssueMessage(
+ MessageType::AUTHOR_WARNING,
+ cmPolicies::GetPolicyWarning(cmPolicies::CMP0104) +
+ "\nCUDA_ARCHITECTURES is empty for target \"" +
+ this->GetName() + "\".");
+ }
+ CM_FALLTHROUGH;
+ case cmPolicies::OLD:
+ break;
+ default:
+ this->Makefile->IssueMessage(
+ MessageType::FATAL_ERROR,
+ "CUDA_ARCHITECTURES is empty for target \"" + this->GetName() +
+ "\".");
+ }
+ }
+
+ for (std::string& option : options) {
+ CudaArchitecture architecture;
+
+ // Architecture name is up to the first specifier.
+ std::size_t pos = option.find_first_of('-');
+ architecture.name = option.substr(0, pos);
+
+ if (pos != std::string::npos) {
+ cm::string_view specifier{ option.c_str() + pos + 1,
+ option.length() - pos - 1 };
+
+ if (specifier == "real") {
+ architecture.real = true;
+ architecture.virtual_ = false;
+ } else if (specifier == "virtual") {
+ architecture.real = false;
+ architecture.virtual_ = true;
+ } else {
+ this->Makefile->IssueMessage(
+ MessageType::FATAL_ERROR,
+ "Uknown CUDA architecture specifier \"" + std::string(specifier) +
+ "\".");
+ }
+ }
+
+ architectures.emplace_back(architecture);
+ }
+ }
+
+ std::string const& compiler =
+ this->Makefile->GetSafeDefinition("CMAKE_CUDA_COMPILER_ID");
+
+ if (compiler == "NVIDIA") {
+ for (CudaArchitecture& architecture : architectures) {
+ flags +=
+ " --generate-code=arch=compute_" + architecture.name + ",code=[";
+
+ if (architecture.virtual_) {
+ flags += "compute_" + architecture.name;
+
+ if (architecture.real) {
+ flags += ",";
+ }
+ }
+
+ if (architecture.real) {
+ flags += "sm_" + architecture.name;
+ }
+
+ flags += "]";
+ }
+ } else if (compiler == "Clang") {
+ for (CudaArchitecture& architecture : architectures) {
+ flags += " --cuda-gpu-arch=sm_" + architecture.name;
+
+ if (!architecture.real) {
+ Makefile->IssueMessage(
+ MessageType::WARNING,
+ "Clang doesn't support disabling CUDA real code generation.");
+ }
+
+ if (!architecture.virtual_) {
+ flags += " --no-cuda-include-ptx=sm_" + architecture.name;
+ }
+ }
}
}
@@ -2966,13 +3191,13 @@ std::string cmGeneratorTarget::GetCreateRuleVariable(
}
namespace {
-void processIncludeDirectories(
- cmGeneratorTarget const* tgt,
- std::vector<EvaluatedTargetPropertyEntry>& entries,
- std::vector<BT<std::string>>& includes,
- std::unordered_set<std::string>& uniqueIncludes, bool debugIncludes)
+void processIncludeDirectories(cmGeneratorTarget const* tgt,
+ EvaluatedTargetPropertyEntries& entries,
+ std::vector<BT<std::string>>& includes,
+ std::unordered_set<std::string>& uniqueIncludes,
+ bool debugIncludes)
{
- for (EvaluatedTargetPropertyEntry& entry : entries) {
+ for (EvaluatedTargetPropertyEntry& entry : entries.Entries) {
cmLinkImplItem const& item = entry.LinkImplItem;
std::string const& targetName = item.AsStr();
bool const fromImported = item.Target && item.Target->IsImported();
@@ -3087,15 +3312,18 @@ std::vector<BT<std::string>> cmGeneratorTarget::GetIncludeDirectories(
}
bool debugIncludes = !this->DebugIncludesDone &&
- cmContains(debugProperties, "INCLUDE_DIRECTORIES");
+ cm::contains(debugProperties, "INCLUDE_DIRECTORIES");
if (this->GlobalGenerator->GetConfigureDoneCMP0026()) {
this->DebugIncludesDone = true;
}
- std::vector<EvaluatedTargetPropertyEntry> entries =
- EvaluateTargetPropertyEntries(this, config, lang, &dagChecker,
- this->IncludeDirectoriesEntries);
+ EvaluatedTargetPropertyEntries entries = EvaluateTargetPropertyEntries(
+ this, config, lang, &dagChecker, this->IncludeDirectoriesEntries);
+
+ if (lang == "Swift") {
+ AddSwiftImplicitIncludeDirectories(this, config, entries);
+ }
AddInterfaceEntries(this, config, "INTERFACE_INCLUDE_DIRECTORIES", lang,
&dagChecker, entries);
@@ -3117,7 +3345,7 @@ std::vector<BT<std::string>> cmGeneratorTarget::GetIncludeDirectories(
EvaluatedTargetPropertyEntry ee(lib, cmListFileBacktrace());
ee.Values.emplace_back(std::move(libDir));
- entries.emplace_back(std::move(ee));
+ entries.Entries.emplace_back(std::move(ee));
}
}
@@ -3134,22 +3362,38 @@ enum class OptionsParse
};
namespace {
+const auto DL_BEGIN = "<DEVICE_LINK>"_s;
+const auto DL_END = "</DEVICE_LINK>"_s;
+
void processOptions(cmGeneratorTarget const* tgt,
- std::vector<EvaluatedTargetPropertyEntry> const& entries,
+ EvaluatedTargetPropertyEntries const& entries,
std::vector<BT<std::string>>& options,
std::unordered_set<std::string>& uniqueOptions,
- bool debugOptions, const char* logName, OptionsParse parse)
+ bool debugOptions, const char* logName, OptionsParse parse,
+ bool processDeviceOptions = false)
{
- for (EvaluatedTargetPropertyEntry const& entry : entries) {
+ bool splitOption = !processDeviceOptions;
+ for (EvaluatedTargetPropertyEntry const& entry : entries.Entries) {
std::string usedOptions;
for (std::string const& opt : entry.Values) {
+ if (processDeviceOptions && (opt == DL_BEGIN || opt == DL_END)) {
+ options.emplace_back(opt, entry.Backtrace);
+ splitOption = opt == DL_BEGIN;
+ continue;
+ }
+
if (uniqueOptions.insert(opt).second) {
if (parse == OptionsParse::Shell &&
cmHasLiteralPrefix(opt, "SHELL:")) {
- std::vector<std::string> tmp;
- cmSystemTools::ParseUnixCommandLine(opt.c_str() + 6, tmp);
- for (std::string& o : tmp) {
- options.emplace_back(std::move(o), entry.Backtrace);
+ if (splitOption) {
+ std::vector<std::string> tmp;
+ cmSystemTools::ParseUnixCommandLine(opt.c_str() + 6, tmp);
+ for (std::string& o : tmp) {
+ options.emplace_back(std::move(o), entry.Backtrace);
+ }
+ } else {
+ options.emplace_back(std::string(opt.c_str() + 6),
+ entry.Backtrace);
}
} else {
options.emplace_back(opt, entry.Backtrace);
@@ -3168,6 +3412,63 @@ void processOptions(cmGeneratorTarget const* tgt,
}
}
}
+
+std::vector<BT<std::string>> wrapOptions(
+ std::vector<std::string>& options, const cmListFileBacktrace& bt,
+ const std::vector<std::string>& wrapperFlag, const std::string& wrapperSep,
+ bool concatFlagAndArgs)
+{
+ std::vector<BT<std::string>> result;
+
+ if (options.empty()) {
+ return result;
+ }
+
+ if (wrapperFlag.empty() || cmHasLiteralPrefix(options.front(), "LINKER:")) {
+ // nothing specified or LINKER wrapper, insert elements as is
+ result.reserve(options.size());
+ for (std::string& o : options) {
+ result.emplace_back(std::move(o), bt);
+ }
+ } else {
+ if (!wrapperSep.empty()) {
+ if (concatFlagAndArgs) {
+ // insert flag elements except last one
+ for (auto i = wrapperFlag.begin(); i != wrapperFlag.end() - 1; ++i) {
+ result.emplace_back(*i, bt);
+ }
+ // concatenate last flag element and all list values
+ // in one option
+ result.emplace_back(wrapperFlag.back() + cmJoin(options, wrapperSep),
+ bt);
+ } else {
+ for (std::string const& i : wrapperFlag) {
+ result.emplace_back(i, bt);
+ }
+ // concatenate all list values in one option
+ result.emplace_back(cmJoin(options, wrapperSep), bt);
+ }
+ } else {
+ // prefix each element of list with wrapper
+ if (concatFlagAndArgs) {
+ std::transform(options.begin(), options.end(), options.begin(),
+ [&wrapperFlag](std::string const& o) -> std::string {
+ return wrapperFlag.back() + o;
+ });
+ }
+ for (std::string& o : options) {
+ for (auto i = wrapperFlag.begin(),
+ e = concatFlagAndArgs ? wrapperFlag.end() - 1
+ : wrapperFlag.end();
+ i != e; ++i) {
+ result.emplace_back(*i, bt);
+ }
+ result.emplace_back(std::move(o), bt);
+ }
+ }
+ }
+ return result;
+}
}
void cmGeneratorTarget::GetCompileOptions(std::vector<std::string>& result,
@@ -3198,15 +3499,14 @@ std::vector<BT<std::string>> cmGeneratorTarget::GetCompileOptions(
}
bool debugOptions = !this->DebugCompileOptionsDone &&
- cmContains(debugProperties, "COMPILE_OPTIONS");
+ cm::contains(debugProperties, "COMPILE_OPTIONS");
if (this->GlobalGenerator->GetConfigureDoneCMP0026()) {
this->DebugCompileOptionsDone = true;
}
- std::vector<EvaluatedTargetPropertyEntry> entries =
- EvaluateTargetPropertyEntries(this, config, language, &dagChecker,
- this->CompileOptionsEntries);
+ EvaluatedTargetPropertyEntries entries = EvaluateTargetPropertyEntries(
+ this, config, language, &dagChecker, this->CompileOptionsEntries);
AddInterfaceEntries(this, config, "INTERFACE_COMPILE_OPTIONS", language,
&dagChecker, entries);
@@ -3244,15 +3544,14 @@ std::vector<BT<std::string>> cmGeneratorTarget::GetCompileFeatures(
}
bool debugFeatures = !this->DebugCompileFeaturesDone &&
- cmContains(debugProperties, "COMPILE_FEATURES");
+ cm::contains(debugProperties, "COMPILE_FEATURES");
if (this->GlobalGenerator->GetConfigureDoneCMP0026()) {
this->DebugCompileFeaturesDone = true;
}
- std::vector<EvaluatedTargetPropertyEntry> entries =
- EvaluateTargetPropertyEntries(this, config, std::string(), &dagChecker,
- this->CompileFeaturesEntries);
+ EvaluatedTargetPropertyEntries entries = EvaluateTargetPropertyEntries(
+ this, config, std::string(), &dagChecker, this->CompileFeaturesEntries);
AddInterfaceEntries(this, config, "INTERFACE_COMPILE_FEATURES",
std::string(), &dagChecker, entries);
@@ -3292,15 +3591,14 @@ std::vector<BT<std::string>> cmGeneratorTarget::GetCompileDefinitions(
}
bool debugDefines = !this->DebugCompileDefinitionsDone &&
- cmContains(debugProperties, "COMPILE_DEFINITIONS");
+ cm::contains(debugProperties, "COMPILE_DEFINITIONS");
if (this->GlobalGenerator->GetConfigureDoneCMP0026()) {
this->DebugCompileDefinitionsDone = true;
}
- std::vector<EvaluatedTargetPropertyEntry> entries =
- EvaluateTargetPropertyEntries(this, config, language, &dagChecker,
- this->CompileDefinitionsEntries);
+ EvaluatedTargetPropertyEntries entries = EvaluateTargetPropertyEntries(
+ this, config, language, &dagChecker, this->CompileDefinitionsEntries);
AddInterfaceEntries(this, config, "INTERFACE_COMPILE_DEFINITIONS", language,
&dagChecker, entries);
@@ -3308,7 +3606,7 @@ std::vector<BT<std::string>> cmGeneratorTarget::GetCompileDefinitions(
if (!config.empty()) {
std::string configPropName =
"COMPILE_DEFINITIONS_" + cmSystemTools::UpperCase(config);
- const char* configProp = this->GetProperty(configPropName);
+ cmProp configProp = this->GetProperty(configPropName);
if (configProp) {
switch (this->Makefile->GetPolicyStatus(cmPolicies::CMP0043)) {
case cmPolicies::WARN: {
@@ -3319,8 +3617,8 @@ std::vector<BT<std::string>> cmGeneratorTarget::GetCompileDefinitions(
}
case cmPolicies::OLD: {
std::unique_ptr<TargetPropertyEntry> entry =
- CreateTargetPropertyEntry(configProp);
- entries.emplace_back(EvaluateTargetPropertyEntry(
+ CreateTargetPropertyEntry(*configProp);
+ entries.Entries.emplace_back(EvaluateTargetPropertyEntry(
this, config, language, &dagChecker, *entry));
} break;
case cmPolicies::NEW:
@@ -3360,9 +3658,8 @@ std::vector<BT<std::string>> cmGeneratorTarget::GetPrecompileHeaders(
this->DebugPrecompileHeadersDone = true;
}
- std::vector<EvaluatedTargetPropertyEntry> entries =
- EvaluateTargetPropertyEntries(this, config, language, &dagChecker,
- this->PrecompileHeadersEntries);
+ EvaluatedTargetPropertyEntries entries = EvaluateTargetPropertyEntries(
+ this, config, language, &dagChecker, this->PrecompileHeadersEntries);
AddInterfaceEntries(this, config, "INTERFACE_PRECOMPILE_HEADERS", language,
&dagChecker, entries);
@@ -3375,7 +3672,8 @@ std::vector<BT<std::string>> cmGeneratorTarget::GetPrecompileHeaders(
}
std::string cmGeneratorTarget::GetPchHeader(const std::string& config,
- const std::string& language) const
+ const std::string& language,
+ const std::string& arch) const
{
if (language != "C" && language != "CXX" && language != "OBJC" &&
language != "OBJCXX") {
@@ -3386,11 +3684,11 @@ std::string cmGeneratorTarget::GetPchHeader(const std::string& config,
return std::string();
}
const cmGeneratorTarget* generatorTarget = this;
- const char* pchReuseFrom =
+ cmProp pchReuseFrom =
generatorTarget->GetProperty("PRECOMPILE_HEADERS_REUSE_FROM");
const auto inserted =
- this->PchHeaders.insert(std::make_pair(language + config, ""));
+ this->PchHeaders.insert(std::make_pair(language + config + arch, ""));
if (inserted.second) {
const std::vector<BT<std::string>> headers =
this->GetPrecompileHeaders(config, language);
@@ -3401,7 +3699,7 @@ std::string cmGeneratorTarget::GetPchHeader(const std::string& config,
if (pchReuseFrom) {
generatorTarget =
- this->GetGlobalGenerator()->FindGeneratorTarget(pchReuseFrom);
+ this->GetGlobalGenerator()->FindGeneratorTarget(*pchReuseFrom);
}
filename = cmStrCat(
@@ -3422,7 +3720,8 @@ std::string cmGeneratorTarget::GetPchHeader(const std::string& config,
}
filename =
- cmStrCat(filename, "/cmake_pch", languageToExtension.at(language));
+ cmStrCat(filename, "/cmake_pch", arch.empty() ? "" : cmStrCat("_", arch),
+ languageToExtension.at(language));
const std::string filename_tmp = cmStrCat(filename, ".tmp");
if (!pchReuseFrom) {
@@ -3481,27 +3780,28 @@ std::string cmGeneratorTarget::GetPchHeader(const std::string& config,
}
std::string cmGeneratorTarget::GetPchSource(const std::string& config,
- const std::string& language) const
+ const std::string& language,
+ const std::string& arch) const
{
if (language != "C" && language != "CXX" && language != "OBJC" &&
language != "OBJCXX") {
return std::string();
}
const auto inserted =
- this->PchSources.insert(std::make_pair(language + config, ""));
+ this->PchSources.insert(std::make_pair(language + config + arch, ""));
if (inserted.second) {
- const std::string pchHeader = this->GetPchHeader(config, language);
+ const std::string pchHeader = this->GetPchHeader(config, language, arch);
if (pchHeader.empty()) {
return std::string();
}
std::string& filename = inserted.first->second;
const cmGeneratorTarget* generatorTarget = this;
- const char* pchReuseFrom =
+ cmProp pchReuseFrom =
generatorTarget->GetProperty("PRECOMPILE_HEADERS_REUSE_FROM");
if (pchReuseFrom) {
generatorTarget =
- this->GetGlobalGenerator()->FindGeneratorTarget(pchReuseFrom);
+ this->GetGlobalGenerator()->FindGeneratorTarget(*pchReuseFrom);
}
filename =
@@ -3517,13 +3817,15 @@ std::string cmGeneratorTarget::GetPchSource(const std::string& config,
{ "OBJCXX", ".objcxx.hxx.mm" }
};
- filename += languageToExtension.at(language);
+ filename = cmStrCat(filename, arch.empty() ? "" : cmStrCat("_", arch),
+ languageToExtension.at(language));
} else {
const std::map<std::string, std::string> languageToExtension = {
{ "C", ".c" }, { "CXX", ".cxx" }, { "OBJC", ".m" }, { "OBJCXX", ".mm" }
};
- filename += languageToExtension.at(language);
+ filename = cmStrCat(filename, arch.empty() ? "" : cmStrCat("_", arch),
+ languageToExtension.at(language));
}
const std::string filename_tmp = cmStrCat(filename, ".tmp");
@@ -3540,16 +3842,17 @@ std::string cmGeneratorTarget::GetPchSource(const std::string& config,
}
std::string cmGeneratorTarget::GetPchFileObject(const std::string& config,
- const std::string& language)
+ const std::string& language,
+ const std::string& arch)
{
if (language != "C" && language != "CXX" && language != "OBJC" &&
language != "OBJCXX") {
return std::string();
}
const auto inserted =
- this->PchObjectFiles.insert(std::make_pair(language + config, ""));
+ this->PchObjectFiles.insert(std::make_pair(language + config + arch, ""));
if (inserted.second) {
- const std::string pchSource = this->GetPchSource(config, language);
+ const std::string pchSource = this->GetPchSource(config, language, arch);
if (pchSource.empty()) {
return std::string();
}
@@ -3561,15 +3864,20 @@ std::string cmGeneratorTarget::GetPchFileObject(const std::string& config,
pchSource, false, cmSourceFileLocationKind::Known);
filename = cmStrCat(this->ObjectDirectory, this->GetObjectName(pchSf));
+ if (this->GetGlobalGenerator()->IsMultiConfig()) {
+ cmSystemTools::ReplaceString(
+ filename, this->GetGlobalGenerator()->GetCMakeCFGIntDir(), config);
+ }
}
return inserted.first->second;
}
std::string cmGeneratorTarget::GetPchFile(const std::string& config,
- const std::string& language)
+ const std::string& language,
+ const std::string& arch)
{
const auto inserted =
- this->PchFiles.insert(std::make_pair(language + config, ""));
+ this->PchFiles.insert(std::make_pair(language + config + arch, ""));
if (inserted.second) {
std::string& pchFile = inserted.first->second;
@@ -3589,20 +3897,20 @@ std::string cmGeneratorTarget::GetPchFile(const std::string& config,
};
cmGeneratorTarget* generatorTarget = this;
- const char* pchReuseFrom =
+ cmProp pchReuseFrom =
generatorTarget->GetProperty("PRECOMPILE_HEADERS_REUSE_FROM");
if (pchReuseFrom) {
generatorTarget =
- this->GetGlobalGenerator()->FindGeneratorTarget(pchReuseFrom);
+ this->GetGlobalGenerator()->FindGeneratorTarget(*pchReuseFrom);
}
const std::string pchFileObject =
- generatorTarget->GetPchFileObject(config, language);
+ generatorTarget->GetPchFileObject(config, language, arch);
if (!pchExtension.empty()) {
pchFile = replaceExtension(pchFileObject, pchExtension);
}
} else {
- pchFile = this->GetPchHeader(config, language);
+ pchFile = this->GetPchHeader(config, language, arch);
pchFile += pchExtension;
}
}
@@ -3610,19 +3918,27 @@ std::string cmGeneratorTarget::GetPchFile(const std::string& config,
}
std::string cmGeneratorTarget::GetPchCreateCompileOptions(
- const std::string& config, const std::string& language)
+ const std::string& config, const std::string& language,
+ const std::string& arch)
{
const auto inserted = this->PchCreateCompileOptions.insert(
- std::make_pair(language + config, ""));
+ std::make_pair(language + config + arch, ""));
if (inserted.second) {
std::string& createOptionList = inserted.first->second;
+ if (this->GetPropertyAsBool("PCH_WARN_INVALID")) {
+ createOptionList = this->Makefile->GetSafeDefinition(
+ cmStrCat("CMAKE_", language, "_COMPILE_OPTIONS_INVALID_PCH"));
+ }
+
const std::string createOptVar =
cmStrCat("CMAKE_", language, "_COMPILE_OPTIONS_CREATE_PCH");
- createOptionList = this->Makefile->GetSafeDefinition(createOptVar);
- const std::string pchHeader = this->GetPchHeader(config, language);
- const std::string pchFile = this->GetPchFile(config, language);
+ createOptionList = cmStrCat(
+ createOptionList, ";", this->Makefile->GetSafeDefinition(createOptVar));
+
+ const std::string pchHeader = this->GetPchHeader(config, language, arch);
+ const std::string pchFile = this->GetPchFile(config, language, arch);
cmSystemTools::ReplaceString(createOptionList, "<PCH_HEADER>", pchHeader);
cmSystemTools::ReplaceString(createOptionList, "<PCH_FILE>", pchFile);
@@ -3631,19 +3947,33 @@ std::string cmGeneratorTarget::GetPchCreateCompileOptions(
}
std::string cmGeneratorTarget::GetPchUseCompileOptions(
- const std::string& config, const std::string& language)
+ const std::string& config, const std::string& language,
+ const std::string& arch)
{
- const auto inserted =
- this->PchUseCompileOptions.insert(std::make_pair(language + config, ""));
+ const auto inserted = this->PchUseCompileOptions.insert(
+ std::make_pair(language + config + arch, ""));
if (inserted.second) {
std::string& useOptionList = inserted.first->second;
+ if (this->GetPropertyAsBool("PCH_WARN_INVALID")) {
+ useOptionList = this->Makefile->GetSafeDefinition(
+ cmStrCat("CMAKE_", language, "_COMPILE_OPTIONS_INVALID_PCH"));
+ }
+
const std::string useOptVar =
- cmStrCat("CMAKE_", language, "_COMPILE_OPTIONS_USE_PCH");
- useOptionList = this->Makefile->GetSafeDefinition(useOptVar);
+ cmStrCat(language, "_COMPILE_OPTIONS_USE_PCH");
+
+ std::string const& useOptionListProperty =
+ this->GetSafeProperty(useOptVar);
- const std::string pchHeader = this->GetPchHeader(config, language);
- const std::string pchFile = this->GetPchFile(config, language);
+ useOptionList = cmStrCat(
+ useOptionList, ";",
+ useOptionListProperty.empty()
+ ? this->Makefile->GetSafeDefinition(cmStrCat("CMAKE_", useOptVar))
+ : useOptionListProperty);
+
+ const std::string pchHeader = this->GetPchHeader(config, language, arch);
+ const std::string pchFile = this->GetPchFile(config, language, arch);
cmSystemTools::ReplaceString(useOptionList, "<PCH_HEADER>", pchHeader);
cmSystemTools::ReplaceString(useOptionList, "<PCH_FILE>", pchFile);
@@ -3672,6 +4002,12 @@ void cmGeneratorTarget::GetLinkOptions(std::vector<std::string>& result,
const std::string& config,
const std::string& language) const
{
+ if (this->IsDeviceLink() &&
+ this->GetPolicyStatusCMP0105() != cmPolicies::NEW) {
+ // link options are not propagated to the device link step
+ return;
+ }
+
std::vector<BT<std::string>> tmp = this->GetLinkOptions(config, language);
result.reserve(tmp.size());
for (BT<std::string>& v : tmp) {
@@ -3695,31 +4031,80 @@ std::vector<BT<std::string>> cmGeneratorTarget::GetLinkOptions(
cmExpandList(debugProp, debugProperties);
}
- bool debugOptions =
- !this->DebugLinkOptionsDone && cmContains(debugProperties, "LINK_OPTIONS");
+ bool debugOptions = !this->DebugLinkOptionsDone &&
+ cm::contains(debugProperties, "LINK_OPTIONS");
if (this->GlobalGenerator->GetConfigureDoneCMP0026()) {
this->DebugLinkOptionsDone = true;
}
- std::vector<EvaluatedTargetPropertyEntry> entries =
- EvaluateTargetPropertyEntries(this, config, language, &dagChecker,
- this->LinkOptionsEntries);
+ EvaluatedTargetPropertyEntries entries = EvaluateTargetPropertyEntries(
+ this, config, language, &dagChecker, this->LinkOptionsEntries);
AddInterfaceEntries(this, config, "INTERFACE_LINK_OPTIONS", language,
&dagChecker, entries,
this->GetPolicyStatusCMP0099() != cmPolicies::NEW);
processOptions(this, entries, result, uniqueOptions, debugOptions,
- "link options", OptionsParse::Shell);
+ "link options", OptionsParse::Shell, this->IsDeviceLink());
+
+ if (this->IsDeviceLink()) {
+ // wrap host link options
+ const std::string wrapper(this->Makefile->GetSafeDefinition(
+ "CMAKE_" + language + "_DEVICE_COMPILER_WRAPPER_FLAG"));
+ std::vector<std::string> wrapperFlag = cmExpandedList(wrapper);
+ const std::string wrapperSep(this->Makefile->GetSafeDefinition(
+ "CMAKE_" + language + "_DEVICE_COMPILER_WRAPPER_FLAG_SEP"));
+ bool concatFlagAndArgs = true;
+ if (!wrapperFlag.empty() && wrapperFlag.back() == " ") {
+ concatFlagAndArgs = false;
+ wrapperFlag.pop_back();
+ }
+
+ auto it = result.begin();
+ while (it != result.end()) {
+ if (it->Value == DL_BEGIN) {
+ // device link options, no treatment
+ it = result.erase(it);
+ it = std::find_if(it, result.end(), [](const BT<std::string>& item) {
+ return item.Value == DL_END;
+ });
+ if (it != result.end()) {
+ it = result.erase(it);
+ }
+ } else {
+ // host link options must be wrapped
+ std::vector<std::string> options;
+ cmSystemTools::ParseUnixCommandLine(it->Value.c_str(), options);
+ auto hostOptions = wrapOptions(options, it->Backtrace, wrapperFlag,
+ wrapperSep, concatFlagAndArgs);
+ it = result.erase(it);
+ // some compilers (like gcc 4.8 or Intel 19.0 or XLC 16) do not respect
+ // C++11 standard: 'std::vector::insert()' do not returns an iterator,
+ // so need to recompute the iterator after insertion.
+ if (it == result.end()) {
+ cm::append(result, hostOptions);
+ it = result.end();
+ } else {
+ auto index = it - result.begin();
+ result.insert(it, hostOptions.begin(), hostOptions.end());
+ it = result.begin() + index + hostOptions.size();
+ }
+ }
+ }
+ }
// Last step: replace "LINKER:" prefixed elements by
// actual linker wrapper
const std::string wrapper(this->Makefile->GetSafeDefinition(
- "CMAKE_" + language + "_LINKER_WRAPPER_FLAG"));
+ "CMAKE_" + language +
+ (this->IsDeviceLink() ? "_DEVICE_LINKER_WRAPPER_FLAG"
+ : "_LINKER_WRAPPER_FLAG")));
std::vector<std::string> wrapperFlag = cmExpandedList(wrapper);
const std::string wrapperSep(this->Makefile->GetSafeDefinition(
- "CMAKE_" + language + "_LINKER_WRAPPER_FLAG_SEP"));
+ "CMAKE_" + language +
+ (this->IsDeviceLink() ? "_DEVICE_LINKER_WRAPPER_FLAG_SEP"
+ : "_LINKER_WRAPPER_FLAG_SEP")));
bool concatFlagAndArgs = true;
if (!wrapperFlag.empty() && wrapperFlag.back() == " ") {
concatFlagAndArgs = false;
@@ -3765,51 +4150,8 @@ std::vector<BT<std::string>> cmGeneratorTarget::GetLinkOptions(
return result;
}
- std::vector<BT<std::string>> options;
- if (wrapperFlag.empty()) {
- // nothing specified, insert elements as is
- options.reserve(linkerOptions.size());
- for (std::string& o : linkerOptions) {
- options.emplace_back(std::move(o), bt);
- }
- } else {
- if (!wrapperSep.empty()) {
- if (concatFlagAndArgs) {
- // insert flag elements except last one
- for (auto i = wrapperFlag.begin(); i != wrapperFlag.end() - 1; ++i) {
- options.emplace_back(*i, bt);
- }
- // concatenate last flag element and all LINKER list values
- // in one option
- options.emplace_back(
- wrapperFlag.back() + cmJoin(linkerOptions, wrapperSep), bt);
- } else {
- for (std::string const& i : wrapperFlag) {
- options.emplace_back(i, bt);
- }
- // concatenate all LINKER list values in one option
- options.emplace_back(cmJoin(linkerOptions, wrapperSep), bt);
- }
- } else {
- // prefix each element of LINKER list with wrapper
- if (concatFlagAndArgs) {
- std::transform(linkerOptions.begin(), linkerOptions.end(),
- linkerOptions.begin(),
- [&wrapperFlag](std::string const& o) -> std::string {
- return wrapperFlag.back() + o;
- });
- }
- for (std::string& o : linkerOptions) {
- for (auto i = wrapperFlag.begin(),
- e = concatFlagAndArgs ? wrapperFlag.end() - 1
- : wrapperFlag.end();
- i != e; ++i) {
- options.emplace_back(*i, bt);
- }
- options.emplace_back(std::move(o), bt);
- }
- }
- }
+ std::vector<BT<std::string>> options = wrapOptions(
+ linkerOptions, bt, wrapperFlag, wrapperSep, concatFlagAndArgs);
result.insert(entry, options.begin(), options.end());
}
return result;
@@ -3836,14 +4178,14 @@ std::vector<BT<std::string>> cmGeneratorTarget::GetStaticLibraryLinkOptions(
cmGeneratorExpressionDAGChecker dagChecker(this, "STATIC_LIBRARY_OPTIONS",
nullptr, nullptr);
- std::vector<EvaluatedTargetPropertyEntry> entries;
- if (const char* linkOptions = this->GetProperty("STATIC_LIBRARY_OPTIONS")) {
- std::vector<std::string> options = cmExpandedList(linkOptions);
+ EvaluatedTargetPropertyEntries entries;
+ if (cmProp linkOptions = this->GetProperty("STATIC_LIBRARY_OPTIONS")) {
+ std::vector<std::string> options = cmExpandedList(*linkOptions);
for (const auto& option : options) {
std::unique_ptr<TargetPropertyEntry> entry =
CreateTargetPropertyEntry(option);
- entries.emplace_back(EvaluateTargetPropertyEntry(this, config, language,
- &dagChecker, *entry));
+ entries.Entries.emplace_back(EvaluateTargetPropertyEntry(
+ this, config, language, &dagChecker, *entry));
}
}
processOptions(this, entries, result, uniqueOptions, false,
@@ -3854,12 +4196,12 @@ std::vector<BT<std::string>> cmGeneratorTarget::GetStaticLibraryLinkOptions(
namespace {
void processLinkDirectories(cmGeneratorTarget const* tgt,
- std::vector<EvaluatedTargetPropertyEntry>& entries,
+ EvaluatedTargetPropertyEntries& entries,
std::vector<BT<std::string>>& directories,
std::unordered_set<std::string>& uniqueDirectories,
bool debugDirectories)
{
- for (EvaluatedTargetPropertyEntry& entry : entries) {
+ for (EvaluatedTargetPropertyEntry& entry : entries.Entries) {
cmLinkImplItem const& item = entry.LinkImplItem;
std::string const& targetName = item.AsStr();
@@ -3952,15 +4294,14 @@ std::vector<BT<std::string>> cmGeneratorTarget::GetLinkDirectories(
}
bool debugDirectories = !this->DebugLinkDirectoriesDone &&
- cmContains(debugProperties, "LINK_DIRECTORIES");
+ cm::contains(debugProperties, "LINK_DIRECTORIES");
if (this->GlobalGenerator->GetConfigureDoneCMP0026()) {
this->DebugLinkDirectoriesDone = true;
}
- std::vector<EvaluatedTargetPropertyEntry> entries =
- EvaluateTargetPropertyEntries(this, config, language, &dagChecker,
- this->LinkDirectoriesEntries);
+ EvaluatedTargetPropertyEntries entries = EvaluateTargetPropertyEntries(
+ this, config, language, &dagChecker, this->LinkDirectoriesEntries);
AddInterfaceEntries(this, config, "INTERFACE_LINK_DIRECTORIES", language,
&dagChecker, entries,
@@ -3991,14 +4332,14 @@ std::vector<BT<std::string>> cmGeneratorTarget::GetLinkDepends(
cmGeneratorExpressionDAGChecker dagChecker(this, "LINK_DEPENDS", nullptr,
nullptr);
- std::vector<EvaluatedTargetPropertyEntry> entries;
- if (const char* linkDepends = this->GetProperty("LINK_DEPENDS")) {
- std::vector<std::string> depends = cmExpandedList(linkDepends);
+ EvaluatedTargetPropertyEntries entries;
+ if (cmProp linkDepends = this->GetProperty("LINK_DEPENDS")) {
+ std::vector<std::string> depends = cmExpandedList(*linkDepends);
for (const auto& depend : depends) {
std::unique_ptr<TargetPropertyEntry> entry =
CreateTargetPropertyEntry(depend);
- entries.emplace_back(EvaluateTargetPropertyEntry(this, config, language,
- &dagChecker, *entry));
+ entries.Entries.emplace_back(EvaluateTargetPropertyEntry(
+ this, config, language, &dagChecker, *entry));
}
}
AddInterfaceEntries(this, config, "INTERFACE_LINK_DEPENDS", language,
@@ -4153,8 +4494,8 @@ cmGeneratorTarget::Names cmGeneratorTarget::GetLibraryNames(
}
// Check for library version properties.
- const char* version = this->GetProperty("VERSION");
- const char* soversion = this->GetProperty("SOVERSION");
+ cmProp version = this->GetProperty("VERSION");
+ cmProp soversion = this->GetProperty("SOVERSION");
if (!this->HasSOName(config) ||
this->Makefile->IsOn("CMAKE_PLATFORM_NO_VERSIONED_SONAME") ||
this->IsFrameworkOnApple()) {
@@ -4189,17 +4530,18 @@ cmGeneratorTarget::Names cmGeneratorTarget::GetLibraryNames(
targetNames.Real += this->GetFrameworkVersion();
targetNames.Real += "/";
}
- targetNames.Real += targetNames.Base;
- targetNames.SharedObject = targetNames.Real;
+ targetNames.Real += targetNames.Base + suffix;
+ targetNames.SharedObject = targetNames.Real + suffix;
} else {
// The library's soname.
this->ComputeVersionedName(targetNames.SharedObject, prefix,
targetNames.Base, suffix, targetNames.Output,
- soversion);
+ (soversion ? soversion->c_str() : nullptr));
// The library's real name on disk.
this->ComputeVersionedName(targetNames.Real, prefix, targetNames.Base,
- suffix, targetNames.Output, version);
+ suffix, targetNames.Output,
+ (version ? version->c_str() : nullptr));
}
// The import library name.
@@ -4232,10 +4574,13 @@ cmGeneratorTarget::Names cmGeneratorTarget::GetExecutableNames(
// This versioning is supported only for executables and then only
// when the platform supports symbolic links.
#if defined(_WIN32) && !defined(__CYGWIN__)
- const char* version = 0;
+ const char* version = nullptr;
#else
// Check for executable version properties.
- const char* version = this->GetProperty("VERSION");
+ const char* version = nullptr;
+ if (cmProp p = this->GetProperty("VERSION")) {
+ version = p->c_str();
+ }
if (this->GetType() != cmStateEnums::EXECUTABLE ||
this->Makefile->IsOn("XCODE")) {
version = nullptr;
@@ -4365,15 +4710,23 @@ void cmGeneratorTarget::GetFullNameInternal(
outBase += this->GetOutputName(config, artifact);
// Append the per-configuration postfix.
- outBase += configPostfix;
+ // When using Xcode, the postfix should be part of the suffix rather than
+ // the base, because the suffix ends up being used in Xcode's
+ // EXECUTABLE_SUFFIX attribute.
+ if (this->IsFrameworkOnApple() &&
+ GetGlobalGenerator()->GetName() == "Xcode") {
+ targetSuffix = configPostfix.c_str();
+ } else {
+ outBase += configPostfix;
+ }
// Name shared libraries with their version number on some platforms.
- if (const char* soversion = this->GetProperty("SOVERSION")) {
+ if (cmProp soversion = this->GetProperty("SOVERSION")) {
if (this->GetType() == cmStateEnums::SHARED_LIBRARY &&
!isImportedLibraryArtifact &&
this->Makefile->IsOn("CMAKE_SHARED_LIBRARY_NAME_WITH_VERSION")) {
outBase += "-";
- outBase += soversion;
+ outBase += *soversion;
}
}
@@ -4404,8 +4757,8 @@ std::string cmGeneratorTarget::GetPDBOutputName(
props.emplace_back("PDB_NAME");
for (std::string const& p : props) {
- if (const char* outName = this->GetProperty(p)) {
- base = outName;
+ if (cmProp outName = this->GetProperty(p)) {
+ base = *outName;
break;
}
}
@@ -4431,8 +4784,8 @@ std::string cmGeneratorTarget::GetPDBName(const std::string& config) const
props.emplace_back("PDB_NAME");
for (std::string const& p : props) {
- if (const char* outName = this->GetProperty(p)) {
- base = outName;
+ if (cmProp outName = this->GetProperty(p)) {
+ base = *outName;
break;
}
}
@@ -4504,16 +4857,16 @@ cmGeneratorTarget::GetTargetSourceFileFlags(const cmSourceFile* sf) const
} else {
// Handle the MACOSX_PACKAGE_LOCATION property on source files that
// were not listed in one of the other lists.
- if (const char* location = sf->GetProperty("MACOSX_PACKAGE_LOCATION")) {
- flags.MacFolder = location;
+ if (cmProp location = sf->GetProperty("MACOSX_PACKAGE_LOCATION")) {
+ flags.MacFolder = location->c_str();
const bool stripResources =
this->GlobalGenerator->ShouldStripResourcePath(this->Makefile);
- if (strcmp(location, "Resources") == 0) {
+ if (*location == "Resources") {
flags.Type = cmGeneratorTarget::SourceFileTypeResource;
if (stripResources) {
flags.MacFolder = "";
}
- } else if (cmHasLiteralPrefix(location, "Resources/")) {
+ } else if (cmHasLiteralPrefix(*location, "Resources/")) {
flags.Type = cmGeneratorTarget::SourceFileTypeDeepResource;
if (stripResources) {
flags.MacFolder += strlen("Resources/");
@@ -4534,8 +4887,8 @@ void cmGeneratorTarget::ConstructSourceFileFlags() const
this->SourceFileFlagsConstructed = true;
// Process public headers to mark the source files.
- if (const char* files = this->GetProperty("PUBLIC_HEADER")) {
- std::vector<std::string> relFiles = cmExpandedList(files);
+ if (cmProp files = this->GetProperty("PUBLIC_HEADER")) {
+ std::vector<std::string> relFiles = cmExpandedList(*files);
for (std::string const& relFile : relFiles) {
if (cmSourceFile* sf = this->Makefile->GetSource(relFile)) {
SourceFileFlags& flags = this->SourceFlagsMap[sf];
@@ -4547,8 +4900,8 @@ void cmGeneratorTarget::ConstructSourceFileFlags() const
// Process private headers after public headers so that they take
// precedence if a file is listed in both.
- if (const char* files = this->GetProperty("PRIVATE_HEADER")) {
- std::vector<std::string> relFiles = cmExpandedList(files);
+ if (cmProp files = this->GetProperty("PRIVATE_HEADER")) {
+ std::vector<std::string> relFiles = cmExpandedList(*files);
for (std::string const& relFile : relFiles) {
if (cmSourceFile* sf = this->Makefile->GetSource(relFile)) {
SourceFileFlags& flags = this->SourceFlagsMap[sf];
@@ -4559,8 +4912,8 @@ void cmGeneratorTarget::ConstructSourceFileFlags() const
}
// Mark sources listed as resources.
- if (const char* files = this->GetProperty("RESOURCE")) {
- std::vector<std::string> relFiles = cmExpandedList(files);
+ if (cmProp files = this->GetProperty("RESOURCE")) {
+ std::vector<std::string> relFiles = cmExpandedList(*files);
for (std::string const& relFile : relFiles) {
if (cmSourceFile* sf = this->Makefile->GetSource(relFile)) {
SourceFileFlags& flags = this->SourceFlagsMap[sf];
@@ -4587,9 +4940,9 @@ cmGeneratorTarget::GetCompatibleInterfaces(std::string const& config) const
this->GetLinkImplementationClosure(config);
for (cmGeneratorTarget const* li : deps) {
#define CM_READ_COMPATIBLE_INTERFACE(X, x) \
- if (const char* prop = li->GetProperty("COMPATIBLE_INTERFACE_" #X)) { \
+ if (cmProp prop = li->GetProperty("COMPATIBLE_INTERFACE_" #X)) { \
std::vector<std::string> props; \
- cmExpandList(prop, props); \
+ cmExpandList(*prop, props); \
compat.Props##x.insert(props.begin(), props.end()); \
}
CM_READ_COMPATIBLE_INTERFACE(BOOL, Bool)
@@ -4697,12 +5050,12 @@ void checkPropertyConsistency(cmGeneratorTarget const* depender,
const std::string& config, CompatibleType t,
PropertyType* /*unused*/)
{
- const char* prop = dependee->GetProperty(propName);
+ cmProp prop = dependee->GetProperty(propName);
if (!prop) {
return;
}
- std::vector<std::string> props = cmExpandedList(prop);
+ std::vector<std::string> props = cmExpandedList(*prop);
std::string pdir =
cmStrCat(cmSystemTools::GetCMakeRoot(), "/Help/prop_tgt/");
@@ -4856,7 +5209,8 @@ void cmGeneratorTarget::CheckPropertyCompatibility(
std::ostringstream e;
e << "Property \"" << prop << "\" appears in both the " << propsString
<< " property in the dependencies of target \"" << this->GetName()
- << "\". This is not allowed. A property may only require compatibility "
+ << "\". This is not allowed. A property may only require "
+ "compatibility "
"in a boolean interpretation, a numeric minimum, a numeric maximum "
"or a "
"string interpretation, but not a mixture.";
@@ -4931,8 +5285,9 @@ bool getTypedProperty<bool>(cmGeneratorTarget const* tgt,
return tgt->GetPropertyAsBool(prop);
}
- const char* value = tgt->GetProperty(prop);
- return cmIsOn(genexInterpreter->Evaluate(value, prop));
+ cmProp value = tgt->GetProperty(prop);
+ return cmIsOn(
+ genexInterpreter->Evaluate(value ? value->c_str() : nullptr, prop));
}
template <>
@@ -4940,13 +5295,14 @@ const char* getTypedProperty<const char*>(
cmGeneratorTarget const* tgt, const std::string& prop,
cmGeneratorExpressionInterpreter* genexInterpreter)
{
- const char* value = tgt->GetProperty(prop);
+ cmProp value = tgt->GetProperty(prop);
if (genexInterpreter == nullptr) {
- return value;
+ return value ? value->c_str() : nullptr;
}
- return genexInterpreter->Evaluate(value, prop).c_str();
+ return genexInterpreter->Evaluate(value ? value->c_str() : nullptr, prop)
+ .c_str();
}
template <>
@@ -4954,13 +5310,13 @@ std::string getTypedProperty<std::string>(
cmGeneratorTarget const* tgt, const std::string& prop,
cmGeneratorExpressionInterpreter* genexInterpreter)
{
- const char* value = tgt->GetProperty(prop);
+ cmProp value = tgt->GetProperty(prop);
if (genexInterpreter == nullptr) {
- return valueAsString(value);
+ return valueAsString(value ? value->c_str() : nullptr);
}
- return genexInterpreter->Evaluate(value, prop);
+ return genexInterpreter->Evaluate(value ? value->c_str() : nullptr, prop);
}
template <typename PropertyType>
@@ -5105,7 +5461,7 @@ PropertyType checkInterfacePropertyCompatibility(cmGeneratorTarget const* tgt,
PropertyType propContent = getTypedProperty<PropertyType>(tgt, p);
std::vector<std::string> headPropKeys = tgt->GetPropertyKeys();
- const bool explicitlySet = cmContains(headPropKeys, p);
+ const bool explicitlySet = cm::contains(headPropKeys, p);
const bool impliedByUse = tgt->IsNullImpliedByLinkLibraries(p);
assert((impliedByUse ^ explicitlySet) || (!impliedByUse && !explicitlySet));
@@ -5145,7 +5501,7 @@ PropertyType checkInterfacePropertyCompatibility(cmGeneratorTarget const* tgt,
std::vector<std::string> propKeys = theTarget->GetPropertyKeys();
- const bool ifaceIsSet = cmContains(propKeys, interfaceProperty);
+ const bool ifaceIsSet = cm::contains(propKeys, interfaceProperty);
PropertyType ifacePropContent = getTypedProperty<PropertyType>(
theTarget, interfaceProperty, genexInterpreter.get());
@@ -5238,6 +5594,13 @@ PropertyType checkInterfacePropertyCompatibility(cmGeneratorTarget const* tgt,
return propContent;
}
+bool cmGeneratorTarget::SetDeviceLink(bool deviceLink)
+{
+ bool previous = this->DeviceLink;
+ this->DeviceLink = deviceLink;
+ return previous;
+}
+
bool cmGeneratorTarget::GetLinkInterfaceDependentBoolProperty(
const std::string& p, const std::string& config) const
{
@@ -5324,13 +5687,13 @@ void cmGeneratorTarget::GetTargetVersion(const std::string& property,
assert(this->GetType() != cmStateEnums::INTERFACE_LIBRARY);
- if (const char* version = this->GetProperty(property)) {
+ if (cmProp version = this->GetProperty(property)) {
// Try to parse the version number and store the results that were
// successfully parsed.
int parsed_major;
int parsed_minor;
int parsed_patch;
- switch (sscanf(version, "%d.%d.%d", &parsed_major, &parsed_minor,
+ switch (sscanf(version->c_str(), "%d.%d.%d", &parsed_major, &parsed_minor,
&parsed_patch)) {
case 3:
patch = parsed_patch;
@@ -5364,8 +5727,8 @@ std::string cmGeneratorTarget::CreateFortranModuleDirectory(
{
std::string mod_dir;
std::string target_mod_dir;
- if (const char* prop = this->GetProperty("Fortran_MODULE_DIRECTORY")) {
- target_mod_dir = prop;
+ if (cmProp prop = this->GetProperty("Fortran_MODULE_DIRECTORY")) {
+ target_mod_dir = *prop;
} else {
std::string const& default_mod_dir =
this->LocalGenerator->GetCurrentBinaryDirectory();
@@ -5396,11 +5759,11 @@ std::string cmGeneratorTarget::GetFrameworkVersion() const
{
assert(this->GetType() != cmStateEnums::INTERFACE_LIBRARY);
- if (const char* fversion = this->GetProperty("FRAMEWORK_VERSION")) {
- return fversion;
+ if (cmProp fversion = this->GetProperty("FRAMEWORK_VERSION")) {
+ return *fversion;
}
- if (const char* tversion = this->GetProperty("VERSION")) {
- return tversion;
+ if (cmProp tversion = this->GetProperty("VERSION")) {
+ return *tversion;
}
return "A";
}
@@ -5436,8 +5799,8 @@ void cmGeneratorTarget::ReportPropertyOrigin(
cmExpandList(debugProp, debugProperties);
}
- bool debugOrigin =
- !this->DebugCompatiblePropertiesDone[p] && cmContains(debugProperties, p);
+ bool debugOrigin = !this->DebugCompatiblePropertiesDone[p] &&
+ cm::contains(debugProperties, p);
if (this->GlobalGenerator->GetConfigureDoneCMP0026()) {
this->DebugCompatiblePropertiesDone[p] = true;
@@ -5493,31 +5856,44 @@ void cmGeneratorTarget::LookupLinkItems(std::vector<std::string> const& names,
void cmGeneratorTarget::ExpandLinkItems(
std::string const& prop, std::string const& value, std::string const& config,
cmGeneratorTarget const* headTarget, bool usage_requirements_only,
- std::vector<cmLinkItem>& items, bool& hadHeadSensitiveCondition) const
+ std::vector<cmLinkItem>& items, bool& hadHeadSensitiveCondition,
+ bool& hadContextSensitiveCondition,
+ bool& hadLinkLanguageSensitiveCondition) const
{
// Keep this logic in sync with ComputeLinkImplementationLibraries.
cmGeneratorExpression ge;
cmGeneratorExpressionDAGChecker dagChecker(this, prop, nullptr, nullptr);
- // The $<LINK_ONLY> expression may be in a link interface to specify private
- // link dependencies that are otherwise excluded from usage requirements.
+ // The $<LINK_ONLY> expression may be in a link interface to specify
+ // private link dependencies that are otherwise excluded from usage
+ // requirements.
if (usage_requirements_only) {
dagChecker.SetTransitivePropertiesOnly();
}
std::vector<std::string> libs;
std::unique_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(value);
- cmExpandList(
- cge->Evaluate(this->LocalGenerator, config, headTarget, &dagChecker, this),
- libs);
+ cmExpandList(cge->Evaluate(this->LocalGenerator, config, headTarget,
+ &dagChecker, this, headTarget->LinkerLanguage),
+ libs);
this->LookupLinkItems(libs, cge->GetBacktrace(), items);
hadHeadSensitiveCondition = cge->GetHadHeadSensitiveCondition();
+ hadContextSensitiveCondition = cge->GetHadContextSensitiveCondition();
+ hadLinkLanguageSensitiveCondition =
+ cge->GetHadLinkLanguageSensitiveCondition();
}
cmLinkInterface const* cmGeneratorTarget::GetLinkInterface(
const std::string& config, cmGeneratorTarget const* head) const
{
+ return this->GetLinkInterface(config, head, false);
+}
+
+cmLinkInterface const* cmGeneratorTarget::GetLinkInterface(
+ const std::string& config, cmGeneratorTarget const* head,
+ bool secondPass) const
+{
// Imported targets have their own link interface.
if (this->IsImported()) {
- return this->GetImportLinkInterface(config, head, false);
+ return this->GetImportLinkInterface(config, head, false, secondPass);
}
// Link interfaces are not supported for executables that do not
@@ -5530,6 +5906,10 @@ cmLinkInterface const* cmGeneratorTarget::GetLinkInterface(
// Lookup any existing link interface for this configuration.
cmHeadToLinkInterfaceMap& hm = this->GetHeadToLinkInterfaceMap(config);
+ if (secondPass) {
+ hm.erase(head);
+ }
+
// If the link interface does not depend on the head target
// then return the one we computed first.
if (!hm.empty() && !hm.begin()->second.HadHeadSensitiveCondition) {
@@ -5544,7 +5924,7 @@ cmLinkInterface const* cmGeneratorTarget::GetLinkInterface(
if (!iface.AllDone) {
iface.AllDone = true;
if (iface.Exists) {
- this->ComputeLinkInterface(config, iface, head);
+ this->ComputeLinkInterface(config, iface, head, secondPass);
}
}
@@ -5555,6 +5935,13 @@ void cmGeneratorTarget::ComputeLinkInterface(
const std::string& config, cmOptionalLinkInterface& iface,
cmGeneratorTarget const* headTarget) const
{
+ this->ComputeLinkInterface(config, iface, headTarget, false);
+}
+
+void cmGeneratorTarget::ComputeLinkInterface(
+ const std::string& config, cmOptionalLinkInterface& iface,
+ cmGeneratorTarget const* headTarget, bool secondPass) const
+{
if (iface.Explicit) {
if (this->GetType() == cmStateEnums::SHARED_LIBRARY ||
this->GetType() == cmStateEnums::STATIC_LIBRARY ||
@@ -5566,7 +5953,8 @@ void cmGeneratorTarget::ComputeLinkInterface(
emitted.insert(lib);
}
if (this->GetType() != cmStateEnums::INTERFACE_LIBRARY) {
- cmLinkImplementation const* impl = this->GetLinkImplementation(config);
+ cmLinkImplementation const* impl =
+ this->GetLinkImplementation(config, secondPass);
for (cmLinkImplItem const& lib : impl->Libraries) {
if (emitted.insert(lib).second) {
if (lib.Target) {
@@ -5576,9 +5964,9 @@ void cmGeneratorTarget::ComputeLinkInterface(
}
} else {
// TODO: Recognize shared library file names. Perhaps this
- // should be moved to cmComputeLinkInformation, but that creates
- // a chicken-and-egg problem since this list is needed for its
- // construction.
+ // should be moved to cmComputeLinkInformation, but that
+ // creates a chicken-and-egg problem since this list is needed
+ // for its construction.
}
}
}
@@ -5596,7 +5984,7 @@ void cmGeneratorTarget::ComputeLinkInterface(
if (this->LinkLanguagePropagatesToDependents()) {
// Targets using this archive need its language runtime libraries.
if (cmLinkImplementation const* impl =
- this->GetLinkImplementation(config)) {
+ this->GetLinkImplementation(config, secondPass)) {
iface.Languages = impl->Languages;
}
}
@@ -5613,11 +6001,11 @@ void cmGeneratorTarget::ComputeLinkInterface(
// How many repetitions are needed if this library has cyclic
// dependencies?
std::string propName = cmStrCat("LINK_INTERFACE_MULTIPLICITY", suffix);
- if (const char* config_reps = this->GetProperty(propName)) {
- sscanf(config_reps, "%u", &iface.Multiplicity);
- } else if (const char* reps =
+ if (cmProp config_reps = this->GetProperty(propName)) {
+ sscanf(config_reps->c_str(), "%u", &iface.Multiplicity);
+ } else if (cmProp reps =
this->GetProperty("LINK_INTERFACE_MULTIPLICITY")) {
- sscanf(reps, "%u", &iface.Multiplicity);
+ sscanf(reps->c_str(), "%u", &iface.Multiplicity);
}
}
}
@@ -5639,7 +6027,6 @@ const cmLinkInterfaceLibraries* cmGeneratorTarget::GetLinkInterfaceLibraries(
}
// Lookup any existing link interface for this configuration.
- std::string CONFIG = cmSystemTools::UpperCase(config);
cmHeadToLinkInterfaceMap& hm =
(usage_requirements_only
? this->GetHeadToLinkInterfaceUsageRequirementsMap(config)
@@ -5768,21 +6155,21 @@ bool cmGeneratorTarget::ComputeOutputDir(const std::string& config,
}
// Select an output directory.
- if (const char* config_outdir = this->GetProperty(configProp)) {
+ if (cmProp config_outdir = this->GetProperty(configProp)) {
// Use the user-specified per-configuration output directory.
- out = cmGeneratorExpression::Evaluate(config_outdir, this->LocalGenerator,
+ out = cmGeneratorExpression::Evaluate(*config_outdir, this->LocalGenerator,
config);
// Skip per-configuration subdirectory.
conf.clear();
- } else if (const char* outdir = this->GetProperty(propertyName)) {
+ } else if (cmProp outdir = this->GetProperty(propertyName)) {
// Use the user-specified output directory.
out =
- cmGeneratorExpression::Evaluate(outdir, this->LocalGenerator, config);
+ cmGeneratorExpression::Evaluate(*outdir, this->LocalGenerator, config);
// Skip per-configuration subdirectory if the value contained a
// generator expression.
- if (out != outdir) {
+ if (out != *outdir) {
conf.clear();
}
} else if (this->GetType() == cmStateEnums::EXECUTABLE) {
@@ -5844,21 +6231,21 @@ bool cmGeneratorTarget::ComputePDBOutputDir(const std::string& kind,
}
// Select an output directory.
- if (const char* config_outdir = this->GetProperty(configProp)) {
+ if (cmProp config_outdir = this->GetProperty(configProp)) {
// Use the user-specified per-configuration output directory.
- out = cmGeneratorExpression::Evaluate(config_outdir, this->LocalGenerator,
+ out = cmGeneratorExpression::Evaluate(*config_outdir, this->LocalGenerator,
config);
// Skip per-configuration subdirectory.
conf.clear();
- } else if (const char* outdir = this->GetProperty(propertyName)) {
+ } else if (cmProp outdir = this->GetProperty(propertyName)) {
// Use the user-specified output directory.
out =
- cmGeneratorExpression::Evaluate(outdir, this->LocalGenerator, config);
+ cmGeneratorExpression::Evaluate(*outdir, this->LocalGenerator, config);
// Skip per-configuration subdirectory if the value contained a
// generator expression.
- if (out != outdir) {
+ if (out != *outdir) {
conf.clear();
}
}
@@ -5904,12 +6291,13 @@ bool cmGeneratorTarget::GetRPATH(const std::string& config,
const std::string& prop,
std::string& rpath) const
{
- const char* value = this->GetProperty(prop);
+ cmProp value = this->GetProperty(prop);
if (!value) {
return false;
}
- rpath = cmGeneratorExpression::Evaluate(value, this->LocalGenerator, config);
+ rpath =
+ cmGeneratorExpression::Evaluate(*value, this->LocalGenerator, config);
return true;
}
@@ -5928,7 +6316,7 @@ void cmGeneratorTarget::ComputeLinkInterfaceLibraries(
// An explicit list of interface libraries may be set for shared
// libraries and executables that export symbols.
- const char* explicitLibraries = nullptr;
+ cmProp explicitLibraries = nullptr;
std::string linkIfaceProp;
bool const cmp0022NEW = (this->GetPolicyStatusCMP0022() != cmPolicies::OLD &&
this->GetPolicyStatusCMP0022() != cmPolicies::WARN);
@@ -5957,10 +6345,10 @@ void cmGeneratorTarget::ComputeLinkInterfaceLibraries(
!this->PolicyWarnedCMP0022) {
// Compare the explicitly set old link interface properties to the
// preferred new link interface property one and warn if different.
- const char* newExplicitLibraries =
+ cmProp newExplicitLibraries =
this->GetProperty("INTERFACE_LINK_LIBRARIES");
if (newExplicitLibraries &&
- strcmp(newExplicitLibraries, explicitLibraries) != 0) {
+ (*newExplicitLibraries != *explicitLibraries)) {
std::ostringstream w;
/* clang-format off */
w << cmPolicies::GetPolicyWarning(cmPolicies::CMP0022) << "\n"
@@ -5969,9 +6357,9 @@ void cmGeneratorTarget::ComputeLinkInterfaceLibraries(
linkIfaceProp << " properties."
"\n"
"INTERFACE_LINK_LIBRARIES:\n"
- " " << newExplicitLibraries << "\n" <<
+ " " << *newExplicitLibraries << "\n" <<
linkIfaceProp << ":\n"
- " " << explicitLibraries << "\n";
+ " " << *explicitLibraries << "\n";
/* clang-format on */
this->LocalGenerator->IssueMessage(MessageType::AUTHOR_WARNING, w.str());
this->PolicyWarnedCMP0022 = true;
@@ -5990,9 +6378,11 @@ void cmGeneratorTarget::ComputeLinkInterfaceLibraries(
if (explicitLibraries) {
// The interface libraries have been explicitly set.
- this->ExpandLinkItems(linkIfaceProp, explicitLibraries, config, headTarget,
- usage_requirements_only, iface.Libraries,
- iface.HadHeadSensitiveCondition);
+ this->ExpandLinkItems(linkIfaceProp, *explicitLibraries, config,
+ headTarget, usage_requirements_only, iface.Libraries,
+ iface.HadHeadSensitiveCondition,
+ iface.HadContextSensitiveCondition,
+ iface.HadLinkLanguageSensitiveCondition);
} else if (!cmp0022NEW)
// If CMP0022 is NEW then the plain tll signature sets the
// INTERFACE_LINK_LIBRARIES, so if we get here then the project
@@ -6010,11 +6400,15 @@ void cmGeneratorTarget::ComputeLinkInterfaceLibraries(
// preferred new link interface property and warn if different.
std::vector<cmLinkItem> ifaceLibs;
static const std::string newProp = "INTERFACE_LINK_LIBRARIES";
- if (const char* newExplicitLibraries = this->GetProperty(newProp)) {
+ if (cmProp newExplicitLibraries = this->GetProperty(newProp)) {
bool hadHeadSensitiveConditionDummy = false;
- this->ExpandLinkItems(newProp, newExplicitLibraries, config,
+ bool hadContextSensitiveConditionDummy = false;
+ bool hadLinkLanguageSensitiveConditionDummy = false;
+ this->ExpandLinkItems(newProp, *newExplicitLibraries, config,
headTarget, usage_requirements_only, ifaceLibs,
- hadHeadSensitiveConditionDummy);
+ hadHeadSensitiveConditionDummy,
+ hadContextSensitiveConditionDummy,
+ hadLinkLanguageSensitiveConditionDummy);
}
if (ifaceLibs != iface.Libraries) {
std::string oldLibraries = cmJoin(impl->Libraries, ";");
@@ -6051,19 +6445,22 @@ void cmGeneratorTarget::ComputeLinkInterfaceLibraries(
const cmLinkInterface* cmGeneratorTarget::GetImportLinkInterface(
const std::string& config, cmGeneratorTarget const* headTarget,
- bool usage_requirements_only) const
+ bool usage_requirements_only, bool secondPass) const
{
cmGeneratorTarget::ImportInfo const* info = this->GetImportInfo(config);
if (!info) {
return nullptr;
}
- std::string CONFIG = cmSystemTools::UpperCase(config);
cmHeadToLinkInterfaceMap& hm =
(usage_requirements_only
? this->GetHeadToLinkInterfaceUsageRequirementsMap(config)
: this->GetHeadToLinkInterfaceMap(config));
+ if (secondPass) {
+ hm.erase(headTarget);
+ }
+
// If the link interface does not depend on the head target
// then return the one we computed first.
if (!hm.empty() && !hm.begin()->second.HadHeadSensitiveCondition) {
@@ -6077,7 +6474,9 @@ const cmLinkInterface* cmGeneratorTarget::GetImportLinkInterface(
cmExpandList(info->Languages, iface.Languages);
this->ExpandLinkItems(info->LibrariesProp, info->Libraries, config,
headTarget, usage_requirements_only, iface.Libraries,
- iface.HadHeadSensitiveCondition);
+ iface.HadHeadSensitiveCondition,
+ iface.HadContextSensitiveCondition,
+ iface.HadLinkLanguageSensitiveCondition);
std::vector<std::string> deps = cmExpandedList(info->SharedDeps);
this->LookupLinkItems(deps, cmListFileBacktrace(), iface.SharedDeps);
}
@@ -6133,17 +6532,17 @@ void cmGeneratorTarget::ComputeImportInfo(std::string const& desired_config,
// Initialize members.
info.NoSOName = false;
- const char* loc = nullptr;
- const char* imp = nullptr;
+ cmProp loc = nullptr;
+ cmProp imp = nullptr;
std::string suffix;
- if (!this->Target->GetMappedConfig(desired_config, &loc, &imp, suffix)) {
+ if (!this->Target->GetMappedConfig(desired_config, loc, imp, suffix)) {
return;
}
// Get the link interface.
{
std::string linkProp = "INTERFACE_LINK_LIBRARIES";
- const char* propertyLibs = this->GetProperty(linkProp);
+ cmProp propertyLibs = this->GetProperty(linkProp);
if (this->GetType() != cmStateEnums::INTERFACE_LIBRARY) {
if (!propertyLibs) {
@@ -6158,12 +6557,12 @@ void cmGeneratorTarget::ComputeImportInfo(std::string const& desired_config,
}
if (propertyLibs) {
info.LibrariesProp = linkProp;
- info.Libraries = propertyLibs;
+ info.Libraries = *propertyLibs;
}
}
if (this->GetType() == cmStateEnums::INTERFACE_LIBRARY) {
if (loc) {
- info.LibName = loc;
+ info.LibName = *loc;
}
return;
}
@@ -6173,47 +6572,46 @@ void cmGeneratorTarget::ComputeImportInfo(std::string const& desired_config,
// Get the location.
if (loc) {
- info.Location = loc;
+ info.Location = *loc;
} else {
std::string impProp = cmStrCat("IMPORTED_LOCATION", suffix);
- if (const char* config_location = this->GetProperty(impProp)) {
- info.Location = config_location;
- } else if (const char* location = this->GetProperty("IMPORTED_LOCATION")) {
- info.Location = location;
+ if (cmProp config_location = this->GetProperty(impProp)) {
+ info.Location = *config_location;
+ } else if (cmProp location = this->GetProperty("IMPORTED_LOCATION")) {
+ info.Location = *location;
}
}
// Get the soname.
if (this->GetType() == cmStateEnums::SHARED_LIBRARY) {
std::string soProp = cmStrCat("IMPORTED_SONAME", suffix);
- if (const char* config_soname = this->GetProperty(soProp)) {
- info.SOName = config_soname;
- } else if (const char* soname = this->GetProperty("IMPORTED_SONAME")) {
- info.SOName = soname;
+ if (cmProp config_soname = this->GetProperty(soProp)) {
+ info.SOName = *config_soname;
+ } else if (cmProp soname = this->GetProperty("IMPORTED_SONAME")) {
+ info.SOName = *soname;
}
}
// Get the "no-soname" mark.
if (this->GetType() == cmStateEnums::SHARED_LIBRARY) {
std::string soProp = cmStrCat("IMPORTED_NO_SONAME", suffix);
- if (const char* config_no_soname = this->GetProperty(soProp)) {
- info.NoSOName = cmIsOn(config_no_soname);
- } else if (const char* no_soname =
- this->GetProperty("IMPORTED_NO_SONAME")) {
- info.NoSOName = cmIsOn(no_soname);
+ if (cmProp config_no_soname = this->GetProperty(soProp)) {
+ info.NoSOName = cmIsOn(*config_no_soname);
+ } else if (cmProp no_soname = this->GetProperty("IMPORTED_NO_SONAME")) {
+ info.NoSOName = cmIsOn(*no_soname);
}
}
// Get the import library.
if (imp) {
- info.ImportLibrary = imp;
+ info.ImportLibrary = *imp;
} else if (this->GetType() == cmStateEnums::SHARED_LIBRARY ||
this->IsExecutableWithExports()) {
std::string impProp = cmStrCat("IMPORTED_IMPLIB", suffix);
- if (const char* config_implib = this->GetProperty(impProp)) {
- info.ImportLibrary = config_implib;
- } else if (const char* implib = this->GetProperty("IMPORTED_IMPLIB")) {
- info.ImportLibrary = implib;
+ if (cmProp config_implib = this->GetProperty(impProp)) {
+ info.ImportLibrary = *config_implib;
+ } else if (cmProp implib = this->GetProperty("IMPORTED_IMPLIB")) {
+ info.ImportLibrary = *implib;
}
}
@@ -6221,11 +6619,11 @@ void cmGeneratorTarget::ComputeImportInfo(std::string const& desired_config,
{
std::string linkProp =
cmStrCat("IMPORTED_LINK_DEPENDENT_LIBRARIES", suffix);
- if (const char* config_libs = this->GetProperty(linkProp)) {
- info.SharedDeps = config_libs;
- } else if (const char* libs =
+ if (cmProp config_libs = this->GetProperty(linkProp)) {
+ info.SharedDeps = *config_libs;
+ } else if (cmProp libs =
this->GetProperty("IMPORTED_LINK_DEPENDENT_LIBRARIES")) {
- info.SharedDeps = libs;
+ info.SharedDeps = *libs;
}
}
@@ -6233,21 +6631,21 @@ void cmGeneratorTarget::ComputeImportInfo(std::string const& desired_config,
if (this->LinkLanguagePropagatesToDependents()) {
std::string linkProp =
cmStrCat("IMPORTED_LINK_INTERFACE_LANGUAGES", suffix);
- if (const char* config_libs = this->GetProperty(linkProp)) {
- info.Languages = config_libs;
- } else if (const char* libs =
+ if (cmProp config_libs = this->GetProperty(linkProp)) {
+ info.Languages = *config_libs;
+ } else if (cmProp libs =
this->GetProperty("IMPORTED_LINK_INTERFACE_LANGUAGES")) {
- info.Languages = libs;
+ info.Languages = *libs;
}
}
// Get information if target is managed assembly.
{
std::string linkProp = "IMPORTED_COMMON_LANGUAGE_RUNTIME";
- if (auto pc = this->GetProperty(linkProp + suffix)) {
- info.Managed = this->CheckManagedType(pc);
- } else if (auto p = this->GetProperty(linkProp)) {
- info.Managed = this->CheckManagedType(p);
+ if (cmProp pc = this->GetProperty(linkProp + suffix)) {
+ info.Managed = this->CheckManagedType(*pc);
+ } else if (cmProp p = this->GetProperty(linkProp)) {
+ info.Managed = this->CheckManagedType(*p);
}
}
@@ -6255,11 +6653,11 @@ void cmGeneratorTarget::ComputeImportInfo(std::string const& desired_config,
if (this->GetType() == cmStateEnums::STATIC_LIBRARY) {
std::string linkProp =
cmStrCat("IMPORTED_LINK_INTERFACE_MULTIPLICITY", suffix);
- if (const char* config_reps = this->GetProperty(linkProp)) {
- sscanf(config_reps, "%u", &info.Multiplicity);
- } else if (const char* reps =
+ if (cmProp config_reps = this->GetProperty(linkProp)) {
+ sscanf(config_reps->c_str(), "%u", &info.Multiplicity);
+ } else if (cmProp reps =
this->GetProperty("IMPORTED_LINK_INTERFACE_MULTIPLICITY")) {
- sscanf(reps, "%u", &info.Multiplicity);
+ sscanf(reps->c_str(), "%u", &info.Multiplicity);
}
}
}
@@ -6267,28 +6665,36 @@ void cmGeneratorTarget::ComputeImportInfo(std::string const& desired_config,
cmHeadToLinkInterfaceMap& cmGeneratorTarget::GetHeadToLinkInterfaceMap(
const std::string& config) const
{
- std::string CONFIG = cmSystemTools::UpperCase(config);
- return this->LinkInterfaceMap[CONFIG];
+ return this->LinkInterfaceMap[cmSystemTools::UpperCase(config)];
}
cmHeadToLinkInterfaceMap&
cmGeneratorTarget::GetHeadToLinkInterfaceUsageRequirementsMap(
const std::string& config) const
{
- std::string CONFIG = cmSystemTools::UpperCase(config);
- return this->LinkInterfaceUsageRequirementsOnlyMap[CONFIG];
+ return this
+ ->LinkInterfaceUsageRequirementsOnlyMap[cmSystemTools::UpperCase(config)];
}
const cmLinkImplementation* cmGeneratorTarget::GetLinkImplementation(
const std::string& config) const
{
+ return this->GetLinkImplementation(config, false);
+}
+
+const cmLinkImplementation* cmGeneratorTarget::GetLinkImplementation(
+ const std::string& config, bool secondPass) const
+{
// There is no link implementation for imported targets.
if (this->IsImported()) {
return nullptr;
}
- std::string CONFIG = cmSystemTools::UpperCase(config);
- cmOptionalLinkImplementation& impl = this->LinkImplMap[CONFIG][this];
+ cmOptionalLinkImplementation& impl =
+ this->LinkImplMap[cmSystemTools::UpperCase(config)][this];
+ if (secondPass) {
+ impl = cmOptionalLinkImplementation();
+ }
if (!impl.LibrariesDone) {
impl.LibrariesDone = true;
this->ComputeLinkImplementationLibraries(config, impl, this);
@@ -6427,15 +6833,15 @@ std::string cmGeneratorTarget::CheckCMP0004(std::string const& item) const
bool cmGeneratorTarget::IsDeprecated() const
{
- const char* deprecation = this->GetProperty("DEPRECATION");
- return deprecation && *deprecation;
+ cmProp deprecation = this->GetProperty("DEPRECATION");
+ return deprecation && !deprecation->empty();
}
std::string cmGeneratorTarget::GetDeprecation() const
{
// find DEPRECATION property
- if (const char* deprecation = this->GetProperty("DEPRECATION")) {
- return deprecation;
+ if (cmProp deprecation = this->GetProperty("DEPRECATION")) {
+ return *deprecation;
}
return std::string();
}
@@ -6492,9 +6898,9 @@ bool cmGeneratorTarget::IsCSharpOnly() const
std::set<std::string> languages = this->GetAllConfigCompileLanguages();
// Consider an explicit linker language property, but *not* the
// computed linker language that may depend on linked targets.
- const char* linkLang = this->GetProperty("LINKER_LANGUAGE");
- if (linkLang && *linkLang) {
- languages.insert(linkLang);
+ cmProp linkLang = this->GetProperty("LINKER_LANGUAGE");
+ if (linkLang && !linkLang->empty()) {
+ languages.insert(*linkLang);
}
return languages.size() == 1 && languages.count("CSharp") > 0;
}
@@ -6544,8 +6950,8 @@ cmGeneratorTarget::GetLinkImplementationLibrariesInternal(
}
// Populate the link implementation libraries for this configuration.
- std::string CONFIG = cmSystemTools::UpperCase(config);
- HeadToLinkImplementationMap& hm = this->LinkImplMap[CONFIG];
+ HeadToLinkImplementationMap& hm =
+ this->LinkImplMap[cmSystemTools::UpperCase(config)];
// If the link implementation does not depend on the head target
// then return the one we computed first.
@@ -6564,7 +6970,7 @@ cmGeneratorTarget::GetLinkImplementationLibrariesInternal(
bool cmGeneratorTarget::IsNullImpliedByLinkLibraries(
const std::string& p) const
{
- return cmContains(this->LinkImplicitNullProperties, p);
+ return cm::contains(this->LinkImplicitNullProperties, p);
}
void cmGeneratorTarget::ComputeLinkImplementationLibraries(
@@ -6586,11 +6992,18 @@ void cmGeneratorTarget::ComputeLinkImplementationLibraries(
cmGeneratorExpression ge(*btIt);
std::unique_ptr<cmCompiledGeneratorExpression> const cge = ge.Parse(*le);
std::string const& evaluated =
- cge->Evaluate(this->LocalGenerator, config, head, &dagChecker);
+ cge->Evaluate(this->LocalGenerator, config, head, &dagChecker, nullptr,
+ this->LinkerLanguage);
cmExpandList(evaluated, llibs);
if (cge->GetHadHeadSensitiveCondition()) {
impl.HadHeadSensitiveCondition = true;
}
+ if (cge->GetHadContextSensitiveCondition()) {
+ impl.HadContextSensitiveCondition = true;
+ }
+ if (cge->GetHadLinkLanguageSensitiveCondition()) {
+ impl.HadLinkLanguageSensitiveCondition = true;
+ }
for (std::string const& lib : llibs) {
if (this->IsLinkLookupScope(lib, lg)) {
@@ -6868,8 +7281,8 @@ cmGeneratorTarget::ManagedType cmGeneratorTarget::GetManagedType(
}
// Check for explicitly set clr target property.
- if (auto* clr = this->GetProperty("COMMON_LANGUAGE_RUNTIME")) {
- return this->CheckManagedType(clr);
+ if (cmProp clr = this->GetProperty("COMMON_LANGUAGE_RUNTIME")) {
+ return this->CheckManagedType(*clr);
}
// C# targets are always managed. This language specific check
diff --git a/Source/cmGeneratorTarget.h b/Source/cmGeneratorTarget.h
index d81bb3d..c8732bc 100644
--- a/Source/cmGeneratorTarget.h
+++ b/Source/cmGeneratorTarget.h
@@ -31,6 +31,8 @@ class cmTarget;
struct cmGeneratorExpressionContext;
struct cmGeneratorExpressionDAGChecker;
+using cmProp = const std::string*;
+
class cmGeneratorTarget
{
public:
@@ -76,9 +78,9 @@ public:
std::vector<std::string> GetPropertyKeys() const;
//! Might return a nullptr if the property is not set or invalid
- const char* GetProperty(const std::string& prop) const;
+ cmProp GetProperty(const std::string& prop) const;
//! Always returns a valid pointer
- const char* GetSafeProperty(const std::string& prop) const;
+ std::string const& GetSafeProperty(std::string const& prop) const;
bool GetPropertyAsBool(const std::string& prop) const;
void GetSourceFiles(std::vector<cmSourceFile*>& files,
const std::string& config) const;
@@ -115,9 +117,6 @@ public:
struct KindedSources
{
std::vector<SourceAndKind> Sources;
- std::set<std::string> ExpectedResxHeaders;
- std::set<std::string> ExpectedXamlHeaders;
- std::set<std::string> ExpectedXamlSources;
bool Initialized = false;
};
@@ -135,6 +134,9 @@ public:
per-source configurations assigned. */
std::vector<AllConfigSource> const& GetAllConfigSources() const;
+ /** Get all sources needed for all configurations with given kind. */
+ std::vector<AllConfigSource> GetAllConfigSources(SourceKind kind) const;
+
/** Get all languages used to compile sources in any configuration.
This excludes the languages of objects from object libraries. */
std::set<std::string> GetAllConfigCompileLanguages() const;
@@ -149,8 +151,6 @@ public:
void GetModuleDefinitionSources(std::vector<cmSourceFile const*>&,
const std::string& config) const;
- void GetResxSources(std::vector<cmSourceFile const*>&,
- const std::string& config) const;
void GetExternalObjects(std::vector<cmSourceFile const*>&,
const std::string& config) const;
void GetHeaderSources(std::vector<cmSourceFile const*>&,
@@ -159,20 +159,8 @@ public:
const std::string& config) const;
void GetCustomCommands(std::vector<cmSourceFile const*>&,
const std::string& config) const;
- void GetExpectedResxHeaders(std::set<std::string>&,
- const std::string& config) const;
- void GetAppManifest(std::vector<cmSourceFile const*>&,
- const std::string& config) const;
void GetManifests(std::vector<cmSourceFile const*>&,
const std::string& config) const;
- void GetCertificates(std::vector<cmSourceFile const*>&,
- const std::string& config) const;
- void GetXamlSources(std::vector<cmSourceFile const*>&,
- const std::string& config) const;
- void GetExpectedXamlHeaders(std::set<std::string>&,
- const std::string& config) const;
- void GetExpectedXamlSources(std::set<std::string>&,
- const std::string& config) const;
std::set<cmLinkItem> const& GetUtilityItems() const;
@@ -204,6 +192,24 @@ public:
const char* GetLinkInterfaceDependentNumberMaxProperty(
const std::string& p, const std::string& config) const;
+ class DeviceLinkSetter
+ {
+ public:
+ DeviceLinkSetter(cmGeneratorTarget& target)
+ : Target(target)
+ {
+ this->PreviousState = target.SetDeviceLink(true);
+ }
+ ~DeviceLinkSetter() { this->Target.SetDeviceLink(this->PreviousState); };
+
+ private:
+ cmGeneratorTarget& Target;
+ bool PreviousState;
+ };
+
+ bool SetDeviceLink(bool deviceLink);
+ bool IsDeviceLink() const { return this->DeviceLink; }
+
cmLinkInterface const* GetLinkInterface(
const std::string& config, const cmGeneratorTarget* headTarget) const;
void ComputeLinkInterface(const std::string& config,
@@ -225,7 +231,7 @@ public:
/** Get the full path to the target according to the settings in its
makefile and the configuration type. */
std::string GetFullPath(
- const std::string& config = "",
+ const std::string& config,
cmStateEnums::ArtifactType artifact = cmStateEnums::RuntimeBinaryArtifact,
bool realname = false) const;
std::string NormalGetFullPath(const std::string& config,
@@ -263,7 +269,7 @@ public:
/** Get the full name of the target according to the settings in its
makefile. */
- std::string GetFullName(const std::string& config = "",
+ std::string GetFullName(const std::string& config,
cmStateEnums::ArtifactType artifact =
cmStateEnums::RuntimeBinaryArtifact) const;
@@ -306,8 +312,7 @@ public:
std::string GetSOName(const std::string& config) const;
void GetFullNameComponents(std::string& prefix, std::string& base,
- std::string& suffix,
- const std::string& config = "",
+ std::string& suffix, const std::string& config,
cmStateEnums::ArtifactType artifact =
cmStateEnums::RuntimeBinaryArtifact) const;
@@ -357,7 +362,6 @@ public:
};
LinkClosure const* GetLinkClosure(const std::string& config) const;
- void ComputeLinkClosure(const std::string& config, LinkClosure& lc) const;
cmLinkImplementation const* GetLinkImplementation(
const std::string& config) const;
@@ -422,6 +426,8 @@ public:
void GetAppleArchs(const std::string& config,
std::vector<std::string>& archVec) const;
+ void AddCUDAArchitectureFlags(std::string& flags) const;
+
std::string GetFeatureSpecificLinkRuleVariable(
std::string const& var, std::string const& lang,
std::string const& config) const;
@@ -479,17 +485,23 @@ public:
const std::string& config, const std::string& language) const;
std::string GetPchHeader(const std::string& config,
- const std::string& language) const;
+ const std::string& language,
+ const std::string& arch = std::string()) const;
std::string GetPchSource(const std::string& config,
- const std::string& language) const;
+ const std::string& language,
+ const std::string& arch = std::string()) const;
std::string GetPchFileObject(const std::string& config,
- const std::string& language);
+ const std::string& language,
+ const std::string& arch = std::string());
std::string GetPchFile(const std::string& config,
- const std::string& language);
- std::string GetPchCreateCompileOptions(const std::string& config,
- const std::string& language);
+ const std::string& language,
+ const std::string& arch = std::string());
+ std::string GetPchCreateCompileOptions(
+ const std::string& config, const std::string& language,
+ const std::string& arch = std::string());
std::string GetPchUseCompileOptions(const std::string& config,
- const std::string& language);
+ const std::string& language,
+ const std::string& arch = std::string());
void AddSourceFileToUnityBatch(const std::string& sourceFilename);
bool IsSourceFilePartOfUnityBatch(const std::string& sourceFilename) const;
@@ -513,7 +525,7 @@ public:
configuration name is given then the generator will add its
subdirectory for that configuration. Otherwise just the canonical
output directory is given. */
- std::string GetDirectory(const std::string& config = "",
+ std::string GetDirectory(const std::string& config,
cmStateEnums::ArtifactType artifact =
cmStateEnums::RuntimeBinaryArtifact) const;
@@ -521,7 +533,7 @@ public:
If the configuration name is given then the generator will add its
subdirectory for that configuration. Otherwise just the canonical
compiler pdb output directory is given. */
- std::string GetCompilePDBDirectory(const std::string& config = "") const;
+ std::string GetCompilePDBDirectory(const std::string& config) const;
/** Get sources that must be built before the given source. */
std::vector<cmSourceFile*> const* GetSourceDepends(
@@ -550,7 +562,7 @@ public:
std::string GetPDBOutputName(const std::string& config) const;
/** Get the name of the pdb file for the target. */
- std::string GetPDBName(const std::string& config = "") const;
+ std::string GetPDBName(const std::string& config) const;
/** Whether this library has soname enabled and platform supports it. */
bool HasSOName(const std::string& config) const;
@@ -568,10 +580,10 @@ public:
bool IsNullImpliedByLinkLibraries(const std::string& p) const;
/** Get the name of the compiler pdb file for the target. */
- std::string GetCompilePDBName(const std::string& config = "") const;
+ std::string GetCompilePDBName(const std::string& config) const;
/** Get the path for the MSVC /Fd option for this target. */
- std::string GetCompilePDBPath(const std::string& config = "") const;
+ std::string GetCompilePDBPath(const std::string& config) const;
// Get the target base name.
std::string GetOutputName(const std::string& config,
@@ -589,6 +601,9 @@ public:
/** Get target file postfix */
std::string GetFilePostfix(const std::string& config) const;
+ /** Get framework multi-config-specific postfix */
+ std::string GetFrameworkMultiConfigPostfix(const std::string& config) const;
+
/** Clears cached meta data for local and external source files.
* The meta data will be recomputed on demand.
*/
@@ -816,8 +831,10 @@ private:
std::string& outPrefix, std::string& outBase,
std::string& outSuffix) const;
+ mutable std::string LinkerLanguage;
using LinkClosureMapType = std::map<std::string, LinkClosure>;
mutable LinkClosureMapType LinkClosureMap;
+ bool DeviceLink = false;
// Returns ARCHIVE, LIBRARY, or RUNTIME based on platform and type.
const char* GetOutputTargetType(cmStateEnums::ArtifactType artifact) const;
@@ -850,6 +867,10 @@ private:
void CheckPropertyCompatibility(cmComputeLinkInformation& info,
const std::string& config) const;
+ void ComputeLinkClosure(const std::string& config, LinkClosure& lc) const;
+ bool ComputeLinkClosure(const std::string& config, LinkClosure& lc,
+ bool secondPass) const;
+
struct LinkImplClosure : public std::vector<cmGeneratorTarget const*>
{
bool Done = false;
@@ -868,6 +889,17 @@ private:
std::string GetLinkInterfaceDependentStringAsBoolProperty(
const std::string& p, const std::string& config) const;
+ friend class cmTargetCollectLinkLanguages;
+ cmLinkInterface const* GetLinkInterface(const std::string& config,
+ const cmGeneratorTarget* headTarget,
+ bool secondPass) const;
+ void ComputeLinkInterface(const std::string& config,
+ cmOptionalLinkInterface& iface,
+ const cmGeneratorTarget* head,
+ bool secondPass) const;
+ cmLinkImplementation const* GetLinkImplementation(const std::string& config,
+ bool secondPass) const;
+
// Cache import information from properties for each configuration.
struct ImportInfo
{
@@ -894,9 +926,10 @@ private:
the link dependencies of this target. */
std::string CheckCMP0004(std::string const& item) const;
- cmLinkInterface const* GetImportLinkInterface(
- const std::string& config, const cmGeneratorTarget* head,
- bool usage_requirements_only) const;
+ cmLinkInterface const* GetImportLinkInterface(const std::string& config,
+ const cmGeneratorTarget* head,
+ bool usage_requirements_only,
+ bool secondPass = false) const;
using KindedSourcesMapType = std::map<std::string, KindedSources>;
mutable KindedSourcesMapType KindedSourcesMap;
@@ -940,7 +973,9 @@ private:
const cmGeneratorTarget* headTarget,
bool usage_requirements_only,
std::vector<cmLinkItem>& items,
- bool& hadHeadSensitiveCondition) const;
+ bool& hadHeadSensitiveCondition,
+ bool& hadContextSensitiveCondition,
+ bool& hadLinkLanguageSensitiveCondition) const;
void LookupLinkItems(std::vector<std::string> const& names,
cmListFileBacktrace const& bt,
std::vector<cmLinkItem>& items) const;
diff --git a/Source/cmGetCMakePropertyCommand.cxx b/Source/cmGetCMakePropertyCommand.cxx
index ff4e312..0480876 100644
--- a/Source/cmGetCMakePropertyCommand.cxx
+++ b/Source/cmGetCMakePropertyCommand.cxx
@@ -23,25 +23,25 @@ bool cmGetCMakePropertyCommand(std::vector<std::string> const& args,
std::string output = "NOTFOUND";
if (args[1] == "VARIABLES") {
- if (const char* varsProp = status.GetMakefile().GetProperty("VARIABLES")) {
- output = varsProp;
+ if (cmProp varsProp = status.GetMakefile().GetProperty("VARIABLES")) {
+ output = *varsProp;
}
} else if (args[1] == "MACROS") {
output.clear();
- if (const char* macrosProp = status.GetMakefile().GetProperty("MACROS")) {
- output = macrosProp;
+ if (cmProp macrosProp = status.GetMakefile().GetProperty("MACROS")) {
+ output = *macrosProp;
}
} else if (args[1] == "COMPONENTS") {
const std::set<std::string>* components =
status.GetMakefile().GetGlobalGenerator()->GetInstallComponents();
output = cmJoin(*components, ";");
} else {
- const char* prop = nullptr;
+ cmProp prop = nullptr;
if (!args[1].empty()) {
prop = status.GetMakefile().GetState()->GetGlobalProperty(args[1]);
}
if (prop) {
- output = prop;
+ output = *prop;
}
}
diff --git a/Source/cmGetDirectoryPropertyCommand.cxx b/Source/cmGetDirectoryPropertyCommand.cxx
index 64438d5..2833977 100644
--- a/Source/cmGetDirectoryPropertyCommand.cxx
+++ b/Source/cmGetDirectoryPropertyCommand.cxx
@@ -7,7 +7,6 @@
#include "cmMakefile.h"
#include "cmMessageType.h"
#include "cmPolicies.h"
-#include "cmStringAlgorithms.h"
#include "cmSystemTools.h"
namespace {
@@ -37,14 +36,8 @@ bool cmGetDirectoryPropertyCommand(std::vector<std::string> const& args,
"DIRECTORY argument provided without subsequent arguments");
return false;
}
- std::string sd = *i;
- // make sure the start dir is a full path
- if (!cmSystemTools::FileIsFullPath(sd)) {
- sd = cmStrCat(status.GetMakefile().GetCurrentSourceDirectory(), '/', *i);
- }
-
- // The local generators are associated with collapsed paths.
- sd = cmSystemTools::CollapseFullPath(sd);
+ std::string sd = cmSystemTools::CollapseFullPath(
+ *i, status.GetMakefile().GetCurrentSourceDirectory());
// lookup the makefile from the directory name
dir = status.GetMakefile().GetGlobalGenerator()->FindMakefile(sd);
@@ -92,7 +85,9 @@ bool cmGetDirectoryPropertyCommand(std::vector<std::string> const& args,
break;
}
}
- prop = dir->GetProperty(*i);
+ if (cmProp p = dir->GetProperty(*i)) {
+ prop = p->c_str();
+ }
}
StoreResult(status.GetMakefile(), variable, prop);
return true;
diff --git a/Source/cmGetFilenameComponentCommand.cxx b/Source/cmGetFilenameComponentCommand.cxx
index 7d91a75..811421a 100644
--- a/Source/cmGetFilenameComponentCommand.cxx
+++ b/Source/cmGetFilenameComponentCommand.cxx
@@ -120,11 +120,11 @@ bool cmGetFilenameComponentCommand(std::vector<std::string> const& args,
if (args.size() >= 4 && args.back() == "CACHE") {
if (!programArgs.empty() && !storeArgs.empty()) {
status.GetMakefile().AddCacheDefinition(
- storeArgs, programArgs.c_str(), "",
+ storeArgs, programArgs, "",
args[2] == "PATH" ? cmStateEnums::FILEPATH : cmStateEnums::STRING);
}
status.GetMakefile().AddCacheDefinition(
- args.front(), result.c_str(), "",
+ args.front(), result, "",
args[2] == "PATH" ? cmStateEnums::FILEPATH : cmStateEnums::STRING);
} else {
if (!programArgs.empty() && !storeArgs.empty()) {
diff --git a/Source/cmGetPipes.cxx b/Source/cmGetPipes.cxx
index 4eda1c5..a5b6469 100644
--- a/Source/cmGetPipes.cxx
+++ b/Source/cmGetPipes.cxx
@@ -2,10 +2,9 @@
file Copyright.txt or https://cmake.org/licensing for details. */
#include "cmGetPipes.h"
+#include <cm3p/uv.h>
#include <fcntl.h>
-#include "cm_uv.h"
-
#if defined(_WIN32) && !defined(__CYGWIN__)
# include <io.h>
diff --git a/Source/cmGetPropertyCommand.cxx b/Source/cmGetPropertyCommand.cxx
index 947d893..851f426 100644
--- a/Source/cmGetPropertyCommand.cxx
+++ b/Source/cmGetPropertyCommand.cxx
@@ -11,6 +11,7 @@
#include "cmPolicies.h"
#include "cmProperty.h"
#include "cmPropertyDefinition.h"
+#include "cmSetPropertyCommand.h"
#include "cmSourceFile.h"
#include "cmState.h"
#include "cmStringAlgorithms.h"
@@ -48,7 +49,9 @@ bool HandleTargetMode(cmExecutionStatus& status, const std::string& name,
const std::string& propertyName);
bool HandleSourceMode(cmExecutionStatus& status, const std::string& name,
OutType infoType, const std::string& variable,
- const std::string& propertyName);
+ const std::string& propertyName,
+ cmMakefile& directory_makefile,
+ bool source_file_paths_should_be_absolute);
bool HandleTestMode(cmExecutionStatus& status, const std::string& name,
OutType infoType, const std::string& variable,
const std::string& propertyName);
@@ -78,6 +81,11 @@ bool cmGetPropertyCommand(std::vector<std::string> const& args,
std::string name;
std::string propertyName;
+ std::vector<std::string> source_file_directories;
+ std::vector<std::string> source_file_target_directories;
+ bool source_file_directory_option_enabled = false;
+ bool source_file_target_option_enabled = false;
+
// Get the scope from which to get the property.
cmProperty::ScopeType scope;
if (args[1] == "GLOBAL") {
@@ -111,7 +119,9 @@ bool cmGetPropertyCommand(std::vector<std::string> const& args,
DoingNone,
DoingName,
DoingProperty,
- DoingType
+ DoingType,
+ DoingSourceDirectory,
+ DoingSourceTargetDirectory
};
Doing doing = DoingName;
for (unsigned int i = 2; i < args.size(); ++i) {
@@ -132,6 +142,20 @@ bool cmGetPropertyCommand(std::vector<std::string> const& args,
} else if (doing == DoingName) {
doing = DoingNone;
name = args[i];
+ } else if (doing == DoingNone && scope == cmProperty::SOURCE_FILE &&
+ args[i] == "DIRECTORY") {
+ doing = DoingSourceDirectory;
+ source_file_directory_option_enabled = true;
+ } else if (doing == DoingNone && scope == cmProperty::SOURCE_FILE &&
+ args[i] == "TARGET_DIRECTORY") {
+ doing = DoingSourceTargetDirectory;
+ source_file_target_option_enabled = true;
+ } else if (doing == DoingSourceDirectory) {
+ source_file_directories.push_back(args[i]);
+ doing = DoingNone;
+ } else if (doing == DoingSourceTargetDirectory) {
+ source_file_target_directories.push_back(args[i]);
+ doing = DoingNone;
} else if (doing == DoingProperty) {
doing = DoingNone;
propertyName = args[i];
@@ -147,6 +171,16 @@ bool cmGetPropertyCommand(std::vector<std::string> const& args,
return false;
}
+ std::vector<cmMakefile*> source_file_directory_makefiles;
+ bool file_scopes_handled =
+ SetPropertyCommand::HandleAndValidateSourceFileDirectortoryScopes(
+ status, source_file_directory_option_enabled,
+ source_file_target_option_enabled, source_file_directories,
+ source_file_target_directories, source_file_directory_makefiles);
+ if (!file_scopes_handled) {
+ return false;
+ }
+
// Compute requested output.
if (infoType == OutBriefDoc) {
// Lookup brief documentation.
@@ -180,6 +214,11 @@ bool cmGetPropertyCommand(std::vector<std::string> const& args,
}
} else {
// Dispatch property getting.
+ cmMakefile& directory_scope_mf = *(source_file_directory_makefiles[0]);
+ bool source_file_paths_should_be_absolute =
+ source_file_directory_option_enabled ||
+ source_file_target_option_enabled;
+
switch (scope) {
case cmProperty::GLOBAL:
return HandleGlobalMode(status, name, infoType, variable,
@@ -191,8 +230,9 @@ bool cmGetPropertyCommand(std::vector<std::string> const& args,
return HandleTargetMode(status, name, infoType, variable,
propertyName);
case cmProperty::SOURCE_FILE:
- return HandleSourceMode(status, name, infoType, variable,
- propertyName);
+ return HandleSourceMode(status, name, infoType, variable, propertyName,
+ directory_scope_mf,
+ source_file_paths_should_be_absolute);
case cmProperty::TEST:
return HandleTestMode(status, name, infoType, variable, propertyName);
case cmProperty::VARIABLE:
@@ -241,8 +281,9 @@ bool HandleGlobalMode(cmExecutionStatus& status, const std::string& name,
// Get the property.
cmake* cm = status.GetMakefile().GetCMakeInstance();
+ cmProp p = cm->GetState()->GetGlobalProperty(propertyName);
return StoreResult(infoType, status.GetMakefile(), variable,
- cm->GetState()->GetGlobalProperty(propertyName));
+ p ? p->c_str() : nullptr);
}
bool HandleDirectoryMode(cmExecutionStatus& status, const std::string& name,
@@ -256,14 +297,8 @@ bool HandleDirectoryMode(cmExecutionStatus& status, const std::string& name,
if (!name.empty()) {
// Construct the directory name. Interpret relative paths with
// respect to the current directory.
- std::string dir = name;
- if (!cmSystemTools::FileIsFullPath(dir)) {
- dir =
- cmStrCat(status.GetMakefile().GetCurrentSourceDirectory(), '/', name);
- }
-
- // The local generators are associated with collapsed paths.
- dir = cmSystemTools::CollapseFullPath(dir);
+ std::string dir = cmSystemTools::CollapseFullPath(
+ name, status.GetMakefile().GetCurrentSourceDirectory());
// Lookup the generator.
mf = status.GetMakefile().GetGlobalGenerator()->FindMakefile(dir);
@@ -294,8 +329,9 @@ bool HandleDirectoryMode(cmExecutionStatus& status, const std::string& name,
}
// Get the property.
+ cmProp p = mf->GetProperty(propertyName);
return StoreResult(infoType, status.GetMakefile(), variable,
- mf->GetProperty(propertyName));
+ p ? p->c_str() : nullptr);
}
bool HandleTargetMode(cmExecutionStatus& status, const std::string& name,
@@ -315,7 +351,7 @@ bool HandleTargetMode(cmExecutionStatus& status, const std::string& name,
}
return StoreResult(infoType, status.GetMakefile(), variable, nullptr);
}
- const char* prop_cstr = nullptr;
+ cmProp prop_cstr = nullptr;
cmListFileBacktrace bt = status.GetMakefile().GetBacktrace();
cmMessenger* messenger = status.GetMakefile().GetMessenger();
if (cmTargetPropertyComputer::PassesWhitelist(
@@ -325,7 +361,8 @@ bool HandleTargetMode(cmExecutionStatus& status, const std::string& name,
prop_cstr = target->GetProperty(propertyName);
}
}
- return StoreResult(infoType, status.GetMakefile(), variable, prop_cstr);
+ return StoreResult(infoType, status.GetMakefile(), variable,
+ prop_cstr ? prop_cstr->c_str() : nullptr);
}
status.SetError(cmStrCat("could not find TARGET ", name,
". Perhaps it has not yet been created."));
@@ -334,7 +371,9 @@ bool HandleTargetMode(cmExecutionStatus& status, const std::string& name,
bool HandleSourceMode(cmExecutionStatus& status, const std::string& name,
OutType infoType, const std::string& variable,
- const std::string& propertyName)
+ const std::string& propertyName,
+ cmMakefile& directory_makefile,
+ const bool source_file_paths_should_be_absolute)
{
if (name.empty()) {
status.SetError("not given name for SOURCE scope.");
@@ -342,12 +381,17 @@ bool HandleSourceMode(cmExecutionStatus& status, const std::string& name,
}
// Get the source file.
- if (cmSourceFile* sf = status.GetMakefile().GetOrCreateSource(name)) {
+ const std::string source_file_absolute_path =
+ SetPropertyCommand::MakeSourceFilePathAbsoluteIfNeeded(
+ status, name, source_file_paths_should_be_absolute);
+ if (cmSourceFile* sf =
+ directory_makefile.GetOrCreateSource(source_file_absolute_path)) {
return StoreResult(infoType, status.GetMakefile(), variable,
sf->GetPropertyForUser(propertyName));
}
status.SetError(
- cmStrCat("given SOURCE name that could not be found or created: ", name));
+ cmStrCat("given SOURCE name that could not be found or created: ",
+ source_file_absolute_path));
return false;
}
@@ -393,12 +437,13 @@ bool HandleCacheMode(cmExecutionStatus& status, const std::string& name,
return false;
}
- const char* value = nullptr;
+ cmProp value = nullptr;
if (status.GetMakefile().GetState()->GetCacheEntryValue(name)) {
value = status.GetMakefile().GetState()->GetCacheEntryProperty(
name, propertyName);
}
- StoreResult(infoType, status.GetMakefile(), variable, value);
+ StoreResult(infoType, status.GetMakefile(), variable,
+ value ? value->c_str() : nullptr);
return true;
}
diff --git a/Source/cmGetSourceFilePropertyCommand.cxx b/Source/cmGetSourceFilePropertyCommand.cxx
index eefdc6c..5395bc8 100644
--- a/Source/cmGetSourceFilePropertyCommand.cxx
+++ b/Source/cmGetSourceFilePropertyCommand.cxx
@@ -4,35 +4,71 @@
#include "cmExecutionStatus.h"
#include "cmMakefile.h"
+#include "cmSetPropertyCommand.h"
#include "cmSourceFile.h"
bool cmGetSourceFilePropertyCommand(std::vector<std::string> const& args,
cmExecutionStatus& status)
{
- if (args.size() != 3) {
+ std::vector<std::string>::size_type args_size = args.size();
+ if (args_size != 3 && args_size != 5) {
status.SetError("called with incorrect number of arguments");
return false;
}
+
+ std::vector<std::string> source_file_directories;
+ std::vector<std::string> source_file_target_directories;
+ bool source_file_directory_option_enabled = false;
+ bool source_file_target_option_enabled = false;
+
+ int property_arg_index = 2;
+ if (args[2] == "DIRECTORY" && args_size == 5) {
+ property_arg_index = 4;
+ source_file_directory_option_enabled = true;
+ source_file_directories.push_back(args[3]);
+ } else if (args[2] == "TARGET_DIRECTORY" && args_size == 5) {
+ property_arg_index = 4;
+ source_file_target_option_enabled = true;
+ source_file_target_directories.push_back(args[3]);
+ }
+
+ std::vector<cmMakefile*> source_file_directory_makefiles;
+ bool file_scopes_handled =
+ SetPropertyCommand::HandleAndValidateSourceFileDirectortoryScopes(
+ status, source_file_directory_option_enabled,
+ source_file_target_option_enabled, source_file_directories,
+ source_file_target_directories, source_file_directory_makefiles);
+ if (!file_scopes_handled) {
+ return false;
+ }
+
std::string const& var = args[0];
- std::string const& file = args[1];
- cmMakefile& mf = status.GetMakefile();
+ bool source_file_paths_should_be_absolute =
+ source_file_directory_option_enabled || source_file_target_option_enabled;
+ std::string const file =
+ SetPropertyCommand::MakeSourceFilePathAbsoluteIfNeeded(
+ status, args[1], source_file_paths_should_be_absolute);
+ cmMakefile& mf = *source_file_directory_makefiles[0];
cmSourceFile* sf = mf.GetSource(file);
// for the location we must create a source file first
- if (!sf && args[2] == "LOCATION") {
+ if (!sf && args[property_arg_index] == "LOCATION") {
sf = mf.CreateSource(file);
}
+
if (sf) {
const char* prop = nullptr;
- if (!args[2].empty()) {
- prop = sf->GetPropertyForUser(args[2]);
+ if (!args[property_arg_index].empty()) {
+ prop = sf->GetPropertyForUser(args[property_arg_index]);
}
if (prop) {
- mf.AddDefinition(var, prop);
+ // Set the value on the original Makefile scope, not the scope of the
+ // requested directory.
+ status.GetMakefile().AddDefinition(var, prop);
return true;
}
}
- mf.AddDefinition(var, "NOTFOUND");
+ status.GetMakefile().AddDefinition(var, "NOTFOUND");
return true;
}
diff --git a/Source/cmGetTargetPropertyCommand.cxx b/Source/cmGetTargetPropertyCommand.cxx
index 7f5df9c..6b850d1 100644
--- a/Source/cmGetTargetPropertyCommand.cxx
+++ b/Source/cmGetTargetPropertyCommand.cxx
@@ -34,7 +34,7 @@ bool cmGetTargetPropertyCommand(std::vector<std::string> const& args,
prop_exists = true;
}
} else if (!args[2].empty()) {
- const char* prop_cstr = nullptr;
+ cmProp prop_cstr = nullptr;
cmListFileBacktrace bt = mf.GetBacktrace();
cmMessenger* messenger = mf.GetMessenger();
if (cmTargetPropertyComputer::PassesWhitelist(tgt->GetType(), args[2],
@@ -45,7 +45,7 @@ bool cmGetTargetPropertyCommand(std::vector<std::string> const& args,
}
}
if (prop_cstr) {
- prop = prop_cstr;
+ prop = *prop_cstr;
prop_exists = true;
}
}
diff --git a/Source/cmGhsMultiTargetGenerator.cxx b/Source/cmGhsMultiTargetGenerator.cxx
index 5e2248e..a5e496b 100644
--- a/Source/cmGhsMultiTargetGenerator.cxx
+++ b/Source/cmGhsMultiTargetGenerator.cxx
@@ -14,7 +14,7 @@
#include "cmGeneratedFileStream.h"
#include "cmGeneratorTarget.h"
#include "cmGlobalGhsMultiGenerator.h"
-#include "cmLinkLineComputer.h"
+#include "cmLinkLineComputer.h" // IWYU pragma: keep
#include "cmLocalGenerator.h"
#include "cmLocalGhsMultiGenerator.h"
#include "cmMakefile.h"
@@ -165,13 +165,15 @@ void cmGhsMultiTargetGenerator::WriteTargetSpecifics(std::ostream& fout,
outpath = this->GeneratorTarget->GetDirectory(config);
outpath =
this->LocalGenerator->MaybeConvertToRelativePath(rootpath, outpath);
- fout << " :binDirRelative=\"" << outpath << "\"" << std::endl;
- fout << " -o \"" << this->TargetNameReal << "\"" << std::endl;
+ /* clang-format off */
+ fout << " :binDirRelative=\"" << outpath << "\"\n"
+ " -o \"" << this->TargetNameReal << "\"\n";
+ /* clang-format on */
}
// set target object file destination
outpath = this->LocalGenerator->GetTargetDirectory(this->GeneratorTarget);
- fout << " :outputDirRelative=\"" << outpath << "\"" << std::endl;
+ fout << " :outputDirRelative=\"" << outpath << "\"\n";
}
void cmGhsMultiTargetGenerator::SetCompilerFlags(std::string const& config,
@@ -180,15 +182,12 @@ void cmGhsMultiTargetGenerator::SetCompilerFlags(std::string const& config,
auto i = this->FlagsByLanguage.find(language);
if (i == this->FlagsByLanguage.end()) {
std::string flags;
- const char* lang = language.c_str();
-
- this->LocalGenerator->AddLanguageFlags(flags, this->GeneratorTarget, lang,
- config);
-
- this->LocalGenerator->AddCMP0018Flags(flags, this->GeneratorTarget, lang,
- config);
+ this->LocalGenerator->AddLanguageFlags(flags, this->GeneratorTarget,
+ language, config);
+ this->LocalGenerator->AddCMP0018Flags(flags, this->GeneratorTarget,
+ language, config);
this->LocalGenerator->AddVisibilityPresetFlags(
- flags, this->GeneratorTarget, lang);
+ flags, this->GeneratorTarget, language);
// Append old-style preprocessor definition flags.
if (this->Makefile->GetDefineFlags() != " ") {
@@ -197,8 +196,8 @@ void cmGhsMultiTargetGenerator::SetCompilerFlags(std::string const& config,
}
// Add target-specific flags.
- this->LocalGenerator->AddCompileOptions(flags, this->GeneratorTarget, lang,
- config);
+ this->LocalGenerator->AddCompileOptions(flags, this->GeneratorTarget,
+ language, config);
std::map<std::string, std::string>::value_type entry(language, flags);
i = this->FlagsByLanguage.insert(entry).first;
@@ -211,13 +210,12 @@ std::string cmGhsMultiTargetGenerator::GetDefines(const std::string& language,
auto i = this->DefinesByLanguage.find(language);
if (i == this->DefinesByLanguage.end()) {
std::set<std::string> defines;
- const char* lang = language.c_str();
// Add preprocessor definitions for this target and configuration.
this->LocalGenerator->GetTargetDefines(this->GeneratorTarget, config,
language, defines);
std::string definesString;
- this->LocalGenerator->JoinDefines(defines, definesString, lang);
+ this->LocalGenerator->JoinDefines(defines, definesString, language);
std::map<std::string, std::string>::value_type entry(language,
definesString);
@@ -235,8 +233,8 @@ void cmGhsMultiTargetGenerator::WriteCompilerFlags(std::ostream& fout,
if (!flagsByLangI->second.empty()) {
std::vector<std::string> ghsCompFlags =
cmSystemTools::ParseArguments(flagsByLangI->second);
- for (auto& f : ghsCompFlags) {
- fout << " " << f << std::endl;
+ for (const std::string& f : ghsCompFlags) {
+ fout << " " << f << '\n';
}
}
}
@@ -249,7 +247,7 @@ void cmGhsMultiTargetGenerator::WriteCompilerDefinitions(
this->GeneratorTarget->GetCompileDefinitions(compileDefinitions, config,
language);
for (std::string const& compileDefinition : compileDefinitions) {
- fout << " -D" << compileDefinition << std::endl;
+ fout << " -D" << compileDefinition << '\n';
}
}
@@ -262,7 +260,7 @@ void cmGhsMultiTargetGenerator::WriteIncludes(std::ostream& fout,
language, config);
for (std::string const& include : includes) {
- fout << " -I\"" << include << "\"" << std::endl;
+ fout << " -I\"" << include << "\"\n";
}
}
@@ -290,15 +288,15 @@ void cmGhsMultiTargetGenerator::WriteTargetLinkLine(std::ostream& fout,
// write out link options
std::vector<std::string> lopts = cmSystemTools::ParseArguments(linkFlags);
- for (auto& l : lopts) {
- fout << " " << l << std::endl;
+ for (const std::string& l : lopts) {
+ fout << " " << l << '\n';
}
// write out link search paths
// must be quoted for paths that contain spaces
std::vector<std::string> lpath = cmSystemTools::ParseArguments(linkPath);
- for (auto& l : lpath) {
- fout << " -L\"" << l << "\"" << std::endl;
+ for (const std::string& l : lpath) {
+ fout << " -L\"" << l << "\"\n";
}
// write out link libs
@@ -307,12 +305,12 @@ void cmGhsMultiTargetGenerator::WriteTargetLinkLine(std::ostream& fout,
std::vector<std::string> llibs =
cmSystemTools::ParseArguments(linkLibraries);
- for (auto& l : llibs) {
+ for (const std::string& l : llibs) {
if (l.compare(0, 2, "-l") == 0) {
- fout << " \"" << l << "\"" << std::endl;
+ fout << " \"" << l << "\"\n";
} else {
std::string rl = cmSystemTools::CollapseFullPath(l, cbd);
- fout << " -l\"" << rl << "\"" << std::endl;
+ fout << " -l\"" << rl << "\"\n";
}
}
}
@@ -353,13 +351,12 @@ void cmGhsMultiTargetGenerator::WriteBuildEventsHelper(
this->WriteCustomCommandsHelper(f, ccg);
f.Close();
if (this->TagType != GhsMultiGpj::CUSTOM_TARGET) {
- fout << " :" << cmd << "=\"" << fname << "\"" << std::endl;
+ fout << " :" << cmd << "=\"" << fname << "\"\n";
} else {
- fout << fname << std::endl;
- fout << " :outputName=\"" << fname << ".rule\"" << std::endl;
+ fout << fname << "\n :outputName=\"" << fname << ".rule\"\n";
}
for (auto& byp : ccg.GetByproducts()) {
- fout << " :extraOutputFile=\"" << byp << "\"" << std::endl;
+ fout << " :extraOutputFile=\"" << byp << "\"\n";
}
}
}
@@ -451,8 +448,7 @@ void cmGhsMultiTargetGenerator::WriteCustomCommandsHelper(
// push back the custom commands
for (auto const& c : cmdLines) {
- fout << c << std::endl;
- fout << check_error << std::endl;
+ fout << c << '\n' << check_error << '\n';
}
}
@@ -460,11 +456,11 @@ void cmGhsMultiTargetGenerator::WriteSourceProperty(
std::ostream& fout, const cmSourceFile* sf, std::string const& propName,
std::string const& propFlag)
{
- const char* prop = sf->GetProperty(propName);
+ cmProp prop = sf->GetProperty(propName);
if (prop) {
- std::vector<std::string> list = cmExpandedList(prop);
- for (auto& p : list) {
- fout << " " << propFlag << p << std::endl;
+ std::vector<std::string> list = cmExpandedList(*prop);
+ for (const std::string& p : list) {
+ fout << " " << propFlag << p << '\n';
}
}
}
@@ -483,7 +479,7 @@ void cmGhsMultiTargetGenerator::WriteSources(std::ostream& fout_proj)
/* for each source file assign it to its group */
std::map<std::string, std::vector<cmSourceFile*>> groupFiles;
std::set<std::string> groupNames;
- for (auto& sf : sources) {
+ for (cmSourceFile* sf : sources) {
cmSourceGroup* sourceGroup =
this->Makefile->FindSourceGroup(sf->ResolveFullPath(), sourceGroups);
std::string gn = sourceGroup->GetFullName();
@@ -553,8 +549,8 @@ void cmGhsMultiTargetGenerator::WriteSources(std::ostream& fout_proj)
*/
for (auto& sg : groupFilesList) {
std::ostream* fout;
- bool useProjectFile =
- cmIsOn(this->GeneratorTarget->GetProperty("GHS_NO_SOURCE_GROUP_FILE")) ||
+ bool useProjectFile = cmIsOn(*this->GeneratorTarget->GetProperty(
+ "GHS_NO_SOURCE_GROUP_FILE")) ||
cmIsOn(this->Makefile->GetDefinition("CMAKE_GHS_NO_SOURCE_GROUP_FILE"));
if (useProjectFile || sg.empty()) {
fout = &fout_proj;
@@ -579,12 +575,12 @@ void cmGhsMultiTargetGenerator::WriteSources(std::ostream& fout_proj)
if (useProjectFile) {
if (sg.empty()) {
- *fout << "{comment} Others" << std::endl;
+ *fout << "{comment} Others" << '\n';
} else {
- *fout << "{comment} " << sg << std::endl;
+ *fout << "{comment} " << sg << '\n';
}
} else if (sg.empty()) {
- *fout << "{comment} Others" << std::endl;
+ *fout << "{comment} Others\n";
}
if (sg != "CMake Rules") {
@@ -612,7 +608,7 @@ void cmGhsMultiTargetGenerator::WriteSources(std::ostream& fout_proj)
compile = false;
}
- *fout << comment << fname << std::endl;
+ *fout << comment << fname << '\n';
if (compile) {
if ("ld" != si->GetExtension() && "int" != si->GetExtension() &&
"bsp" != si->GetExtension()) {
@@ -628,7 +624,7 @@ void cmGhsMultiTargetGenerator::WriteSources(std::ostream& fout_proj)
std::string objectName = this->GeneratorTarget->GetObjectName(si);
if (!objectName.empty() &&
this->GeneratorTarget->HasExplicitObjectName(si)) {
- *fout << " -o " << objectName << std::endl;
+ *fout << " -o " << objectName << '\n';
}
}
}
@@ -695,14 +691,14 @@ void cmGhsMultiTargetGenerator::WriteCustomCommandLine(
*/
bool specifyExtra = true;
for (auto& out : ccg.GetOutputs()) {
- fout << fname << std::endl;
- fout << " :outputName=\"" << out << "\"" << std::endl;
+ fout << fname << '\n';
+ fout << " :outputName=\"" << out << "\"\n";
if (specifyExtra) {
for (auto& byp : ccg.GetByproducts()) {
- fout << " :extraOutputFile=\"" << byp << "\"" << std::endl;
+ fout << " :extraOutputFile=\"" << byp << "\"\n";
}
for (auto& dep : ccg.GetDepends()) {
- fout << " :depends=\"" << dep << "\"" << std::endl;
+ fout << " :depends=\"" << dep << "\"\n";
}
specifyExtra = false;
}
@@ -712,25 +708,25 @@ void cmGhsMultiTargetGenerator::WriteCustomCommandLine(
void cmGhsMultiTargetGenerator::WriteObjectLangOverride(
std::ostream& fout, const cmSourceFile* sourceFile)
{
- const char* rawLangProp = sourceFile->GetProperty("LANGUAGE");
+ cmProp rawLangProp = sourceFile->GetProperty("LANGUAGE");
if (nullptr != rawLangProp) {
- std::string sourceLangProp(rawLangProp);
+ std::string sourceLangProp(*rawLangProp);
std::string const& extension = sourceFile->GetExtension();
if ("CXX" == sourceLangProp && ("c" == extension || "C" == extension)) {
- fout << " -dotciscxx" << std::endl;
+ fout << " -dotciscxx\n";
}
}
}
bool cmGhsMultiTargetGenerator::DetermineIfIntegrityApp()
{
- const char* p = this->GeneratorTarget->GetProperty("ghs_integrity_app");
+ cmProp p = this->GeneratorTarget->GetProperty("ghs_integrity_app");
if (p) {
- return cmIsOn(this->GeneratorTarget->GetProperty("ghs_integrity_app"));
+ return cmIsOn(*p);
}
std::vector<cmSourceFile*> sources;
this->GeneratorTarget->GetSourceFiles(sources, this->ConfigName);
- for (auto& sf : sources) {
+ for (const cmSourceFile* sf : sources) {
if ("int" == sf->GetExtension()) {
return true;
}
diff --git a/Source/cmGlobalBorlandMakefileGenerator.h b/Source/cmGlobalBorlandMakefileGenerator.h
index 9af0eac..3c97955 100644
--- a/Source/cmGlobalBorlandMakefileGenerator.h
+++ b/Source/cmGlobalBorlandMakefileGenerator.h
@@ -46,6 +46,7 @@ public:
bool AllowNotParallel() const override { return false; }
bool AllowDeleteOnError() const override { return false; }
+ bool CanEscapeOctothorpe() const override { return true; }
protected:
std::vector<GeneratedMakeCommand> GenerateBuildCommand(
diff --git a/Source/cmGlobalCommonGenerator.cxx b/Source/cmGlobalCommonGenerator.cxx
index e04eef1..f57ef04 100644
--- a/Source/cmGlobalCommonGenerator.cxx
+++ b/Source/cmGlobalCommonGenerator.cxx
@@ -45,8 +45,8 @@ cmGlobalCommonGenerator::ComputeDirectoryTargets() const
}
DirectoryTarget::Target t;
t.GT = gt.get();
- if (const char* exclude = gt->GetProperty("EXCLUDE_FROM_ALL")) {
- if (cmIsOn(exclude)) {
+ if (cmProp exclude = gt->GetProperty("EXCLUDE_FROM_ALL")) {
+ if (cmIsOn(*exclude)) {
// This target has been explicitly excluded.
t.ExcludeFromAll = true;
} else {
diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx
index 6a2d4c7..0b7ba04 100644
--- a/Source/cmGlobalGenerator.cxx
+++ b/Source/cmGlobalGenerator.cxx
@@ -14,6 +14,7 @@
#include <utility>
#include <cm/memory>
+#include <cmext/algorithm>
#include "cmsys/Directory.hxx"
#include "cmsys/FStream.hxx"
@@ -51,8 +52,8 @@
#include "cmake.h"
#if !defined(CMAKE_BOOTSTRAP)
-# include "cm_jsoncpp_value.h"
-# include "cm_jsoncpp_writer.h"
+# include <cm3p/json/value.h>
+# include <cm3p/json/writer.h>
# include "cmCryptoHash.h"
# include "cmQtAutoGenGlobalInitializer.h"
@@ -231,7 +232,7 @@ void cmGlobalGenerator::ResolveLanguageCompiler(const std::string& lang,
if (!optional && (path.empty() || !cmSystemTools::FileExists(path))) {
return;
}
- const std::string* cname =
+ cmProp cname =
this->GetCMakeInstance()->GetState()->GetInitializedCacheValue(langComp);
std::string changeVars;
if (cname && !optional) {
@@ -246,11 +247,10 @@ void cmGlobalGenerator::ResolveLanguageCompiler(const std::string& lang,
cmSystemTools::ConvertToUnixSlashes(cnameString);
cmSystemTools::ConvertToUnixSlashes(pathString);
if (cnameString != pathString) {
- const char* cvars =
- this->GetCMakeInstance()->GetState()->GetGlobalProperty(
- "__CMAKE_DELETE_CACHE_CHANGE_VARS_");
+ cmProp cvars = this->GetCMakeInstance()->GetState()->GetGlobalProperty(
+ "__CMAKE_DELETE_CACHE_CHANGE_VARS_");
if (cvars) {
- changeVars += cvars;
+ changeVars += *cvars;
changeVars += ";";
}
changeVars += langComp;
@@ -303,10 +303,14 @@ bool cmGlobalGenerator::CheckTargetsForMissingSources() const
for (const auto& target : localGen->GetGeneratorTargets()) {
if (target->GetType() == cmStateEnums::TargetType::GLOBAL_TARGET ||
target->GetType() == cmStateEnums::TargetType::INTERFACE_LIBRARY ||
- target->GetType() == cmStateEnums::TargetType::UTILITY ||
- cmIsOn(target->GetProperty("ghs_integrity_app"))) {
+ target->GetType() == cmStateEnums::TargetType::UTILITY) {
continue;
}
+ if (cmProp p = target->GetProperty("ghs_integrity_app")) {
+ if (cmIsOn(*p)) {
+ continue;
+ }
+ }
std::vector<std::string> configs;
target->Makefile->GetConfigurations(configs);
@@ -316,7 +320,7 @@ bool cmGlobalGenerator::CheckTargetsForMissingSources() const
} else {
for (std::string const& config : configs) {
target->GetSourceFiles(srcs, config);
- if (srcs.empty()) {
+ if (!srcs.empty()) {
break;
}
}
@@ -371,14 +375,18 @@ bool cmGlobalGenerator::CheckTargetsForPchCompilePdb() const
for (const auto& target : generator->GetGeneratorTargets()) {
if (target->GetType() == cmStateEnums::TargetType::GLOBAL_TARGET ||
target->GetType() == cmStateEnums::TargetType::INTERFACE_LIBRARY ||
- target->GetType() == cmStateEnums::TargetType::UTILITY ||
- cmIsOn(target->GetProperty("ghs_integrity_app"))) {
+ target->GetType() == cmStateEnums::TargetType::UTILITY) {
continue;
}
+ if (cmProp p = target->GetProperty("ghs_integrity_app")) {
+ if (cmIsOn(*p)) {
+ continue;
+ }
+ }
- const std::string reuseFrom =
+ std::string const& reuseFrom =
target->GetSafeProperty("PRECOMPILE_HEADERS_REUSE_FROM");
- const std::string compilePdb =
+ std::string const& compilePdb =
target->GetSafeProperty("COMPILE_PDB_NAME");
if (!reuseFrom.empty() && reuseFrom != compilePdb) {
@@ -404,7 +412,7 @@ bool cmGlobalGenerator::IsExportedTargetsFile(
if (it == this->BuildExportSets.end()) {
return false;
}
- return !cmContains(this->BuildExportExportSets, filename);
+ return !cm::contains(this->BuildExportExportSets, filename);
}
// Find the make program for the generator, required for try compiles
@@ -445,8 +453,8 @@ bool cmGlobalGenerator::FindMakeProgram(cmMakefile* mf)
cmSystemTools::GetShortPath(makeProgram, makeProgram);
cmSystemTools::SplitProgramPath(makeProgram, dir, file);
makeProgram = cmStrCat(dir, '/', saveFile);
- mf->AddCacheDefinition("CMAKE_MAKE_PROGRAM", makeProgram.c_str(),
- "make program", cmStateEnums::FILEPATH);
+ mf->AddCacheDefinition("CMAKE_MAKE_PROGRAM", makeProgram, "make program",
+ cmStateEnums::FILEPATH);
}
return true;
}
@@ -530,7 +538,7 @@ void cmGlobalGenerator::EnableLanguage(
if (lang == "NONE") {
this->SetLanguageEnabled("NONE", mf);
} else {
- if (!cmContains(this->LanguagesReady, lang)) {
+ if (!cm::contains(this->LanguagesReady, lang)) {
std::ostringstream e;
e << "The test project needs language " << lang
<< " which is not enabled.";
@@ -1095,7 +1103,7 @@ void cmGlobalGenerator::SetLanguageEnabledMaps(const std::string& l,
{
// use LanguageToLinkerPreference to detect whether this functions has
// run before
- if (cmContains(this->LanguageToLinkerPreference, l)) {
+ if (cm::contains(this->LanguageToLinkerPreference, l)) {
return;
}
@@ -1679,8 +1687,8 @@ void cmGlobalGenerator::FinalizeTargetCompileInfo()
for (std::string const& c : configs) {
std::string defPropName =
cmStrCat("COMPILE_DEFINITIONS_", cmSystemTools::UpperCase(c));
- if (const char* val = mf->GetProperty(defPropName)) {
- t->AppendProperty(defPropName, val);
+ if (cmProp val = mf->GetProperty(defPropName)) {
+ t->AppendProperty(defPropName, *val);
}
}
}
@@ -1791,14 +1799,13 @@ void cmGlobalGenerator::CheckTargetProperties()
}
}
std::vector<std::string> incs;
- const char* incDirProp =
- target.second.GetProperty("INCLUDE_DIRECTORIES");
+ cmProp incDirProp = target.second.GetProperty("INCLUDE_DIRECTORIES");
if (!incDirProp) {
continue;
}
std::string incDirs = cmGeneratorExpression::Preprocess(
- incDirProp, cmGeneratorExpression::StripAllGeneratorExpressions);
+ *incDirProp, cmGeneratorExpression::StripAllGeneratorExpressions);
cmExpandList(incDirs, incs);
@@ -2050,9 +2057,8 @@ void cmGlobalGenerator::AddMakefile(std::unique_ptr<cmMakefile> mf)
// update progress
// estimate how many lg there will be
- const std::string* numGenC =
- this->CMakeInstance->GetState()->GetInitializedCacheValue(
- "CMAKE_NUMBER_OF_MAKEFILES");
+ cmProp numGenC = this->CMakeInstance->GetState()->GetInitializedCacheValue(
+ "CMAKE_NUMBER_OF_MAKEFILES");
if (!numGenC) {
// If CMAKE_NUMBER_OF_MAKEFILES is not set
@@ -2161,8 +2167,8 @@ bool cmGlobalGenerator::IsExcluded(cmLocalGenerator* root,
if (target->GetType() == cmStateEnums::INTERFACE_LIBRARY) {
return true;
}
- if (const char* exclude = target->GetProperty("EXCLUDE_FROM_ALL")) {
- return cmIsOn(exclude);
+ if (cmProp exclude = target->GetProperty("EXCLUDE_FROM_ALL")) {
+ return cmIsOn(*exclude);
}
// This target is included in its directory. Check whether the
// directory is excluded.
@@ -2229,7 +2235,7 @@ void cmGlobalGenerator::AddAlias(const std::string& name,
bool cmGlobalGenerator::IsAlias(const std::string& name) const
{
- return cmContains(this->AliasTargets, name);
+ return cm::contains(this->AliasTargets, name);
}
void cmGlobalGenerator::IndexTarget(cmTarget* t)
@@ -2255,10 +2261,12 @@ std::string cmGlobalGenerator::IndexGeneratorTargetUniquely(
// Use a ":" prefix to avoid conflict with project-defined targets.
// We must satisfy cmGeneratorExpression::IsValidTargetName so use no
// other special characters.
- char buf[1 + sizeof(gt) * 2];
+ constexpr size_t sizeof_ptr =
+ sizeof(gt); // NOLINT(bugprone-sizeof-expression)
+ char buf[1 + sizeof_ptr * 2];
char* b = buf;
*b++ = ':';
- for (size_t i = 0; i < sizeof(gt); ++i) {
+ for (size_t i = 0; i < sizeof_ptr; ++i) {
unsigned char const c = reinterpret_cast<unsigned char const*>(&gt)[i];
*b++ = hexDigits[(c & 0xf0) >> 4];
*b++ = hexDigits[(c & 0x0f)];
@@ -2527,7 +2535,7 @@ void cmGlobalGenerator::AddGlobalTarget_EditCache(
}
GlobalTargetInfo gti;
gti.Name = editCacheTargetName;
- gti.PerConfig = false;
+ gti.PerConfig = cmTarget::PerConfig::No;
cmCustomCommandLine singleLine;
// Use generator preference for the edit_cache rule if it is defined.
@@ -2545,6 +2553,7 @@ void cmGlobalGenerator::AddGlobalTarget_EditCache(
singleLine.push_back("No interactive CMake dialog available.");
gti.Message = "No interactive CMake dialog available...";
gti.UsesTerminal = false;
+ gti.StdPipesUTF8 = true;
}
gti.CommandLines.push_back(std::move(singleLine));
@@ -2562,13 +2571,14 @@ void cmGlobalGenerator::AddGlobalTarget_RebuildCache(
gti.Name = rebuildCacheTargetName;
gti.Message = "Running CMake to regenerate build system...";
gti.UsesTerminal = true;
- gti.PerConfig = false;
+ gti.PerConfig = cmTarget::PerConfig::No;
cmCustomCommandLine singleLine;
singleLine.push_back(cmSystemTools::GetCMakeCommand());
singleLine.push_back("--regenerate-during-build");
singleLine.push_back("-S$(CMAKE_SOURCE_DIR)");
singleLine.push_back("-B$(CMAKE_BINARY_DIR)");
gti.CommandLines.push_back(std::move(singleLine));
+ gti.StdPipesUTF8 = true;
targets.push_back(std::move(gti));
}
@@ -2605,6 +2615,7 @@ void cmGlobalGenerator::AddGlobalTarget_Install(
gti.Name = this->GetInstallTargetName();
gti.Message = "Install the project...";
gti.UsesTerminal = true;
+ gti.StdPipesUTF8 = true;
cmCustomCommandLine singleLine;
if (this->GetPreinstallTargetName()) {
gti.Depends.emplace_back(this->GetPreinstallTargetName());
@@ -2674,13 +2685,13 @@ void cmGlobalGenerator::AddGlobalTarget_Install(
}
}
-const char* cmGlobalGenerator::GetPredefinedTargetsFolder()
+std::string cmGlobalGenerator::GetPredefinedTargetsFolder()
{
- const char* prop = this->GetCMakeInstance()->GetState()->GetGlobalProperty(
+ cmProp prop = this->GetCMakeInstance()->GetState()->GetGlobalProperty(
"PREDEFINED_TARGETS_FOLDER");
if (prop) {
- return prop;
+ return *prop;
}
return "CMakePredefinedTargets";
@@ -2688,13 +2699,13 @@ const char* cmGlobalGenerator::GetPredefinedTargetsFolder()
bool cmGlobalGenerator::UseFolderProperty() const
{
- const char* prop =
+ cmProp prop =
this->GetCMakeInstance()->GetState()->GetGlobalProperty("USE_FOLDERS");
// If this property is defined, let the setter turn this on or off...
//
if (prop) {
- return cmIsOn(prop);
+ return cmIsOn(*prop);
}
// By default, this feature is OFF, since it is not supported in the
@@ -2716,7 +2727,8 @@ cmTarget cmGlobalGenerator::CreateGlobalTarget(GlobalTargetInfo const& gti,
std::vector<std::string> no_depends;
// Store the custom command in the target.
cmCustomCommand cc(no_outputs, no_byproducts, no_depends, gti.CommandLines,
- cmListFileBacktrace(), nullptr, gti.WorkingDir.c_str());
+ cmListFileBacktrace(), nullptr, gti.WorkingDir.c_str(),
+ gti.StdPipesUTF8);
cc.SetUsesTerminal(gti.UsesTerminal);
target.AddPostBuildCommand(std::move(cc));
if (!gti.Message.empty()) {
@@ -2788,7 +2800,7 @@ bool cmGlobalGenerator::IsReservedTarget(std::string const& name)
"clean", "edit_cache", "rebuild_cache",
"ZERO_CHECK" };
- return cmContains(reservedTargets, name);
+ return cm::contains(reservedTargets, name);
}
void cmGlobalGenerator::SetExternalMakefileProjectGenerator(
@@ -3035,8 +3047,8 @@ void cmGlobalGenerator::WriteSummary(cmGeneratorTarget* target)
#ifndef CMAKE_BOOTSTRAP
// Check whether labels are enabled for this target.
- const char* targetLabels = target->GetProperty("LABELS");
- const char* directoryLabels =
+ cmProp targetLabels = target->GetProperty("LABELS");
+ cmProp directoryLabels =
target->Target->GetMakefile()->GetProperty("LABELS");
const char* cmakeDirectoryLabels =
target->Target->GetMakefile()->GetDefinition("CMAKE_DIRECTORY_LABELS");
@@ -3055,7 +3067,7 @@ void cmGlobalGenerator::WriteSummary(cmGeneratorTarget* target)
// List the target-wide labels. All sources in the target get
// these labels.
if (targetLabels) {
- cmExpandList(targetLabels, labels);
+ cmExpandList(*targetLabels, labels);
if (!labels.empty()) {
fout << "# Target labels\n";
for (std::string const& l : labels) {
@@ -3070,7 +3082,7 @@ void cmGlobalGenerator::WriteSummary(cmGeneratorTarget* target)
std::vector<std::string> cmakeDirectoryLabelsList;
if (directoryLabels) {
- cmExpandList(directoryLabels, directoryLabelsList);
+ cmExpandList(*directoryLabels, directoryLabelsList);
}
if (cmakeDirectoryLabels) {
@@ -3105,10 +3117,10 @@ void cmGlobalGenerator::WriteSummary(cmGeneratorTarget* target)
std::string const& sfp = sf->ResolveFullPath();
fout << sfp << "\n";
lj_source["file"] = sfp;
- if (const char* svalue = sf->GetProperty("LABELS")) {
+ if (cmProp svalue = sf->GetProperty("LABELS")) {
labels.clear();
Json::Value& lj_source_labels = lj_source["labels"] = Json::arrayValue;
- cmExpandList(svalue, labels);
+ cmExpandList(*svalue, labels);
for (std::string const& label : labels) {
fout << " " << label << "\n";
lj_source_labels.append(label);
diff --git a/Source/cmGlobalGenerator.h b/Source/cmGlobalGenerator.h
index 7dc4822..57c7808 100644
--- a/Source/cmGlobalGenerator.h
+++ b/Source/cmGlobalGenerator.h
@@ -28,7 +28,7 @@
#include "cmTargetDepend.h"
#if !defined(CMAKE_BOOTSTRAP)
-# include "cm_jsoncpp_value.h"
+# include <cm3p/json/value.h>
# include "cmFileLockPool.h"
#endif
@@ -553,7 +553,8 @@ protected:
std::vector<std::string> Depends;
std::string WorkingDir;
bool UsesTerminal = false;
- bool PerConfig = true;
+ cmTarget::PerConfig PerConfig = cmTarget::PerConfig::Yes;
+ bool StdPipesUTF8 = false;
};
void CreateDefaultGlobalTargets(std::vector<GlobalTargetInfo>& targets);
@@ -588,7 +589,7 @@ protected:
cmGeneratorTarget* FindGeneratorTargetImpl(std::string const& name) const;
- const char* GetPredefinedTargetsFolder();
+ std::string GetPredefinedTargetsFolder();
private:
using TargetMap = std::unordered_map<std::string, cmTarget*>;
diff --git a/Source/cmGlobalGhsMultiGenerator.cxx b/Source/cmGlobalGhsMultiGenerator.cxx
index bb9dd37..651bfbd 100644
--- a/Source/cmGlobalGhsMultiGenerator.cxx
+++ b/Source/cmGlobalGhsMultiGenerator.cxx
@@ -9,8 +9,9 @@
#include <utility>
#include <cm/memory>
+#include <cm/string>
+#include <cmext/algorithm>
-#include "cmAlgorithms.h"
#include "cmDocumentationEntry.h"
#include "cmGeneratedFileStream.h"
#include "cmGeneratorTarget.h"
@@ -90,7 +91,7 @@ bool cmGlobalGhsMultiGenerator::SetGeneratorToolset(std::string const& ts,
/* store the full toolset for later use
* -- already done if -T<toolset> was specified
*/
- mf->AddCacheDefinition("CMAKE_GENERATOR_TOOLSET", tsp.c_str(),
+ mf->AddCacheDefinition("CMAKE_GENERATOR_TOOLSET", tsp,
"Location of generator toolset.",
cmStateEnums::INTERNAL);
}
@@ -112,8 +113,8 @@ bool cmGlobalGhsMultiGenerator::SetGeneratorToolset(std::string const& ts,
}
/* store the toolset that is being used for this build */
- mf->AddCacheDefinition("CMAKE_MAKE_PROGRAM", gbuild.c_str(),
- "build program to use", cmStateEnums::INTERNAL, true);
+ mf->AddCacheDefinition("CMAKE_MAKE_PROGRAM", gbuild, "build program to use",
+ cmStateEnums::INTERNAL, true);
mf->AddDefinition("CMAKE_SYSTEM_VERSION", tsp);
@@ -132,7 +133,7 @@ bool cmGlobalGhsMultiGenerator::SetGeneratorPlatform(std::string const& p,
/* store the platform name for later use
* -- already done if -A<arch> was specified
*/
- mf->AddCacheDefinition("CMAKE_GENERATOR_PLATFORM", arch.c_str(),
+ mf->AddCacheDefinition("CMAKE_GENERATOR_PLATFORM", arch,
"Name of generator platform.",
cmStateEnums::INTERNAL);
} else {
@@ -166,7 +167,7 @@ bool cmGlobalGhsMultiGenerator::SetGeneratorPlatform(std::string const& p,
if (cmIsOff(bspName) && platform.find("integrity") != std::string::npos) {
bspName = "sim" + arch;
/* write back the calculate name for next time */
- mf->AddCacheDefinition("GHS_BSP_NAME", bspName.c_str(),
+ mf->AddCacheDefinition("GHS_BSP_NAME", bspName,
"Name of GHS target platform.",
cmStateEnums::STRING, true);
std::string m = cmStrCat(
@@ -253,14 +254,15 @@ void cmGlobalGhsMultiGenerator::GetToolset(cmMakefile* mf, std::string& tsd,
void cmGlobalGhsMultiGenerator::WriteFileHeader(std::ostream& fout)
{
- fout << "#!gbuild" << std::endl;
- fout << "#" << std::endl
- << "# CMAKE generated file: DO NOT EDIT!" << std::endl
- << "# Generated by \"" << GetActualName() << "\""
- << " Generator, CMake Version " << cmVersion::GetMajorVersion() << "."
- << cmVersion::GetMinorVersion() << std::endl
- << "#" << std::endl
- << std::endl;
+ /* clang-format off */
+ fout << "#!gbuild\n"
+ "#\n"
+ "# CMAKE generated file: DO NOT EDIT!\n"
+ "# Generated by \"" << GetActualName() << "\""
+ " Generator, CMake Version " << cmVersion::GetMajorVersion() << '.'
+ << cmVersion::GetMinorVersion() << "\n"
+ "#\n\n";
+ /* clang-format on */
}
void cmGlobalGhsMultiGenerator::WriteCustomRuleBOD(std::ostream& fout)
@@ -268,36 +270,36 @@ void cmGlobalGhsMultiGenerator::WriteCustomRuleBOD(std::ostream& fout)
fout << "Commands {\n"
" Custom_Rule_Command {\n"
" name = \"Custom Rule Command\"\n"
- " exec = \"";
+ " exec = \""
#ifdef _WIN32
- fout << "cmd.exe";
+ "cmd.exe"
#else
- fout << "/bin/sh";
+ "/bin/sh"
#endif
- fout << "\"\n"
+ "\"\n"
" options = {\"SpecialOptions\"}\n"
" }\n"
- "}\n";
+ "}\n"
- fout << "\n\n";
- fout << "FileTypes {\n"
+ "\n\n"
+ "FileTypes {\n"
" CmakeRule {\n"
" name = \"Custom Rule\"\n"
" action = \"&Run\"\n"
- " extensions = {\"";
+ " extensions = {\""
#ifdef _WIN32
- fout << "bat";
+ "bat"
#else
- fout << "sh";
+ "sh"
#endif
- fout << "\"}\n"
+ "\"}\n"
" grepable = false\n"
" command = \"Custom Rule Command\"\n"
- " commandLine = \"$COMMAND ";
+ " commandLine = \"$COMMAND "
#ifdef _WIN32
- fout << "/c";
+ "/c"
#endif
- fout << " $INPUTFILE\"\n"
+ " $INPUTFILE\"\n"
" progress = \"Processing Custom Rule\"\n"
" promoteToFirstPass = true\n"
" outputType = \"None\"\n"
@@ -327,13 +329,13 @@ void cmGlobalGhsMultiGenerator::WriteTopLevelProject(std::ostream& fout,
this->WriteHighLevelDirectives(root, fout);
GhsMultiGpj::WriteGpjTag(GhsMultiGpj::PROJECT, fout);
- fout << "# Top Level Project File" << std::endl;
+ fout << "# Top Level Project File\n";
// Specify BSP option if supplied by user
const char* bspName =
this->GetCMakeInstance()->GetCacheDefinition("GHS_BSP_NAME");
if (!cmIsOff(bspName)) {
- fout << " -bsp " << bspName << std::endl;
+ fout << " -bsp " << bspName << '\n';
}
// Specify OS DIR if supplied by user
@@ -348,14 +350,14 @@ void cmGlobalGhsMultiGenerator::WriteTopLevelProject(std::ostream& fout,
} else {
fout << osDirOption;
}
- fout << "\"" << this->OsDir << "\"" << std::endl;
+ fout << "\"" << this->OsDir << "\"\n";
}
}
void cmGlobalGhsMultiGenerator::WriteSubProjects(std::ostream& fout,
std::string& all_target)
{
- fout << "CMakeFiles/" << all_target << " [Project]" << std::endl;
+ fout << "CMakeFiles/" << all_target << " [Project]\n";
// All known targets
for (cmGeneratorTarget const* target : this->ProjectTargets) {
if (target->GetType() == cmStateEnums::INTERFACE_LIBRARY ||
@@ -366,7 +368,7 @@ void cmGlobalGhsMultiGenerator::WriteSubProjects(std::ostream& fout,
continue;
}
fout << "CMakeFiles/" << target->GetName() + ".tgt" + FILE_EXTENSION
- << " [Project]" << std::endl;
+ << " [Project]\n";
}
}
@@ -374,8 +376,8 @@ void cmGlobalGhsMultiGenerator::WriteProjectLine(
std::ostream& fout, cmGeneratorTarget const* target, cmLocalGenerator* root,
std::string& rootBinaryDir)
{
- const char* projName = target->GetProperty("GENERATOR_FILE_NAME");
- const char* projType = target->GetProperty("GENERATOR_FILE_NAME_EXT");
+ cmProp projName = target->GetProperty("GENERATOR_FILE_NAME");
+ cmProp projType = target->GetProperty("GENERATOR_FILE_NAME_EXT");
if (projName && projType) {
cmLocalGenerator* lg = target->GetLocalGenerator();
std::string dir = lg->GetCurrentBinaryDirectory();
@@ -388,9 +390,9 @@ void cmGlobalGhsMultiGenerator::WriteProjectLine(
}
}
- std::string projFile = dir + projName + FILE_EXTENSION;
+ std::string projFile = dir + *projName + FILE_EXTENSION;
fout << projFile;
- fout << " " << projType << std::endl;
+ fout << ' ' << *projType << '\n';
} else {
/* Should never happen */
std::string message =
@@ -467,7 +469,8 @@ void cmGlobalGhsMultiGenerator::WriteAllTarget(
if (t->GetType() == cmStateEnums::INTERFACE_LIBRARY) {
continue;
}
- if (!cmIsOn(t->GetProperty("EXCLUDE_FROM_ALL"))) {
+ cmProp p = t->GetProperty("EXCLUDE_FROM_ALL");
+ if (!(p && cmIsOn(*p))) {
defaultTargets.push_back(t);
}
}
@@ -583,14 +586,14 @@ cmGlobalGhsMultiGenerator::GenerateBuildCommand(
/* if multiple top-projects are found in build directory
* then prefer projectName top-project.
*/
- if (!cmContains(files, proj)) {
+ if (!cm::contains(files, proj)) {
proj = files.at(0);
}
}
makeCommand.Add("-top", proj);
if (!targetNames.empty()) {
- if (cmContains(targetNames, "clean")) {
+ if (cm::contains(targetNames, "clean")) {
makeCommand.Add("-clean");
} else {
for (const auto& tname : targetNames) {
@@ -612,14 +615,14 @@ cmGlobalGhsMultiGenerator::GenerateBuildCommand(
void cmGlobalGhsMultiGenerator::WriteMacros(std::ostream& fout,
cmLocalGenerator* root)
{
- fout << "macro PROJ_NAME=" << root->GetProjectName() << std::endl;
+ fout << "macro PROJ_NAME=" << root->GetProjectName() << '\n';
char const* ghsGpjMacros =
this->GetCMakeInstance()->GetCacheDefinition("GHS_GPJ_MACROS");
if (nullptr != ghsGpjMacros) {
std::vector<std::string> expandedList =
cmExpandedList(std::string(ghsGpjMacros));
for (std::string const& arg : expandedList) {
- fout << "macro " << arg << std::endl;
+ fout << "macro " << arg << '\n';
}
}
}
@@ -642,30 +645,27 @@ void cmGlobalGhsMultiGenerator::WriteHighLevelDirectives(
tgt = cmStrCat((a ? a : ""), '_', (p ? p : ""), ".tgt");
}
- fout << "primaryTarget=" << tgt << std::endl;
- fout << "customization=" << root->GetBinaryDirectory()
- << "/CMakeFiles/custom_rule.bod" << std::endl;
- fout << "customization=" << root->GetBinaryDirectory()
- << "/CMakeFiles/custom_target.bod" << std::endl;
+ /* clang-format off */
+ fout << "primaryTarget=" << tgt << "\n"
+ "customization=" << root->GetBinaryDirectory()
+ << "/CMakeFiles/custom_rule.bod\n"
+ "customization=" << root->GetBinaryDirectory()
+ << "/CMakeFiles/custom_target.bod" << '\n';
+ /* clang-format on */
char const* const customization =
this->GetCMakeInstance()->GetCacheDefinition("GHS_CUSTOMIZATION");
if (nullptr != customization && strlen(customization) > 0) {
- fout << "customization=" << this->TrimQuotes(customization) << std::endl;
+ fout << "customization="
+ << cmGlobalGhsMultiGenerator::TrimQuotes(customization) << '\n';
this->GetCMakeInstance()->MarkCliAsUsed("GHS_CUSTOMIZATION");
}
}
-std::string cmGlobalGhsMultiGenerator::TrimQuotes(std::string const& str)
+std::string cmGlobalGhsMultiGenerator::TrimQuotes(std::string str)
{
- std::string result;
- result.reserve(str.size());
- for (const char* ch = str.c_str(); *ch != '\0'; ++ch) {
- if (*ch != '"') {
- result += *ch;
- }
- }
- return result;
+ cm::erase(str, '"');
+ return str;
}
bool cmGlobalGhsMultiGenerator::TargetCompare::operator()(
diff --git a/Source/cmGlobalGhsMultiGenerator.h b/Source/cmGlobalGhsMultiGenerator.h
index b82e9f5..12ca8b6 100644
--- a/Source/cmGlobalGhsMultiGenerator.h
+++ b/Source/cmGlobalGhsMultiGenerator.h
@@ -111,7 +111,7 @@ private:
std::vector<cmLocalGenerator*>& generators,
std::string& all_target);
- std::string TrimQuotes(std::string const& str);
+ static std::string TrimQuotes(std::string str);
std::string OsDir;
static const char* DEFAULT_BUILD_PROGRAM;
diff --git a/Source/cmGlobalNinjaGenerator.cxx b/Source/cmGlobalNinjaGenerator.cxx
index b6c343c..843b0f4 100644
--- a/Source/cmGlobalNinjaGenerator.cxx
+++ b/Source/cmGlobalNinjaGenerator.cxx
@@ -12,13 +12,12 @@
#include <cmext/algorithm>
#include <cmext/memory>
-#include "cmsys/FStream.hxx"
+#include <cm3p/json/reader.h>
+#include <cm3p/json/value.h>
+#include <cm3p/json/writer.h>
-#include "cm_jsoncpp_reader.h"
-#include "cm_jsoncpp_value.h"
-#include "cm_jsoncpp_writer.h"
+#include "cmsys/FStream.hxx"
-#include "cmAlgorithms.h"
#include "cmDocumentationEntry.h"
#include "cmFortranParser.h"
#include "cmGeneratedFileStream.h"
@@ -46,7 +45,8 @@
#include "cmake.h"
const char* cmGlobalNinjaGenerator::NINJA_BUILD_FILE = "build.ninja";
-const char* cmGlobalNinjaGenerator::NINJA_RULES_FILE = "rules.ninja";
+const char* cmGlobalNinjaGenerator::NINJA_RULES_FILE =
+ "CMakeFiles/rules.ninja";
const char* cmGlobalNinjaGenerator::INDENT = " ";
#ifdef _WIN32
std::string const cmGlobalNinjaGenerator::SHELL_NOOP = "cd .";
@@ -147,15 +147,15 @@ void cmGlobalNinjaGenerator::WriteBuild(std::ostream& os,
{
// Make sure there is a rule.
if (build.Rule.empty()) {
- cmSystemTools::Error("No rule for WriteBuild! called with comment: " +
- build.Comment);
+ cmSystemTools::Error(cmStrCat(
+ "No rule for WriteBuild! called with comment: ", build.Comment));
return;
}
// Make sure there is at least one output file.
if (build.Outputs.empty()) {
- cmSystemTools::Error(
- "No output files for WriteBuild! called with comment: " + build.Comment);
+ cmSystemTools::Error(cmStrCat(
+ "No output files for WriteBuild! called with comment: ", build.Comment));
return;
}
@@ -166,7 +166,7 @@ void cmGlobalNinjaGenerator::WriteBuild(std::ostream& os,
{
// Write explicit outputs
for (std::string const& output : build.Outputs) {
- buildStr += " " + EncodePath(output);
+ buildStr += cmStrCat(' ', EncodePath(output));
if (this->ComputingUnknownDependencies) {
this->CombinedBuildOutputs.insert(output);
}
@@ -175,14 +175,13 @@ void cmGlobalNinjaGenerator::WriteBuild(std::ostream& os,
if (!build.ImplicitOuts.empty()) {
buildStr += " |";
for (std::string const& implicitOut : build.ImplicitOuts) {
- buildStr += " " + EncodePath(implicitOut);
+ buildStr += cmStrCat(' ', EncodePath(implicitOut));
}
}
- buildStr += ":";
+ buildStr += ':';
// Write the rule.
- buildStr += " ";
- buildStr += build.Rule;
+ buildStr += cmStrCat(' ', build.Rule);
}
std::string arguments;
@@ -191,14 +190,14 @@ void cmGlobalNinjaGenerator::WriteBuild(std::ostream& os,
// Write explicit dependencies.
for (std::string const& explicitDep : build.ExplicitDeps) {
- arguments += " " + EncodePath(explicitDep);
+ arguments += cmStrCat(' ', EncodePath(explicitDep));
}
// Write implicit dependencies.
if (!build.ImplicitDeps.empty()) {
arguments += " |";
for (std::string const& implicitDep : build.ImplicitDeps) {
- arguments += " " + EncodePath(implicitDep);
+ arguments += cmStrCat(' ', EncodePath(implicitDep));
}
}
@@ -206,11 +205,11 @@ void cmGlobalNinjaGenerator::WriteBuild(std::ostream& os,
if (!build.OrderOnlyDeps.empty()) {
arguments += " ||";
for (std::string const& orderOnlyDep : build.OrderOnlyDeps) {
- arguments += " " + EncodePath(orderOnlyDep);
+ arguments += cmStrCat(' ', EncodePath(orderOnlyDep));
}
}
- arguments += "\n";
+ arguments += '\n';
}
// Write the variables bound to this build statement.
@@ -309,7 +308,7 @@ void cmGlobalNinjaGenerator::WriteCustomCommandBuild(
void cmGlobalNinjaGenerator::AddMacOSXContentRule()
{
cmNinjaRule rule("COPY_OSX_CONTENT");
- rule.Command = CMakeCmd() + " -E copy $in $out";
+ rule.Command = cmStrCat(CMakeCmd(), " -E copy $in $out");
rule.Description = "Copying OS X Content $out";
rule.Comment = "Rule for copying OS X bundle content file.";
this->AddRule(rule);
@@ -334,23 +333,24 @@ void cmGlobalNinjaGenerator::WriteRule(std::ostream& os,
// -- Parameter checks
// Make sure the rule has a name.
if (rule.Name.empty()) {
- cmSystemTools::Error("No name given for WriteRule! called with comment: " +
- rule.Comment);
+ cmSystemTools::Error(cmStrCat(
+ "No name given for WriteRule! called with comment: ", rule.Comment));
return;
}
// Make sure a command is given.
if (rule.Command.empty()) {
- cmSystemTools::Error(
- "No command given for WriteRule! called with comment: " + rule.Comment);
+ cmSystemTools::Error(cmStrCat(
+ "No command given for WriteRule! called with comment: ", rule.Comment));
return;
}
// Make sure response file content is given
if (!rule.RspFile.empty() && rule.RspContent.empty()) {
- cmSystemTools::Error("rspfile but no rspfile_content given for WriteRule! "
- "called with comment: " +
- rule.Comment);
+ cmSystemTools::Error(
+ cmStrCat("rspfile but no rspfile_content given for WriteRule! "
+ "called with comment: ",
+ rule.Comment));
return;
}
@@ -392,9 +392,9 @@ void cmGlobalNinjaGenerator::WriteVariable(std::ostream& os,
{
// Make sure we have a name.
if (name.empty()) {
- cmSystemTools::Error("No name given for WriteVariable! called "
- "with comment: " +
- comment);
+ cmSystemTools::Error(cmStrCat("No name given for WriteVariable! called "
+ "with comment: ",
+ comment));
return;
}
@@ -435,8 +435,6 @@ cmGlobalNinjaGenerator::cmGlobalNinjaGenerator(cmake* cm)
#ifdef _WIN32
cm->GetState()->SetWindowsShell(true);
#endif
- // // Ninja is not ported to non-Unix OS yet.
- // this->ForceUnixPaths = true;
this->FindMakeProgramFile = "CMakeNinjaFindMake.cmake";
}
@@ -558,11 +556,11 @@ void cmGlobalNinjaGenerator::CleanMetaData()
nullptr,
cmSystemTools::OUTPUT_NONE)) {
this->GetCMakeInstance()->IssueMessage(MessageType::FATAL_ERROR,
- "Running\n '" +
- cmJoin(command, "' '") +
- "'\n"
- "failed with:\n " +
- error);
+ cmStrCat("Running\n '",
+ cmJoin(command, "' '"),
+ "'\n"
+ "failed with:\n ",
+ error));
cmSystemTools::SetFatalErrorOccured();
}
};
@@ -626,10 +624,10 @@ bool cmGlobalNinjaGenerator::FindMakeProgram(cmMakefile* mf)
nullptr,
cmSystemTools::OUTPUT_NONE)) {
mf->IssueMessage(MessageType::FATAL_ERROR,
- "Running\n '" + cmJoin(command, "' '") +
- "'\n"
- "failed with:\n " +
- error);
+ cmStrCat("Running\n '", cmJoin(command, "' '"),
+ "'\n"
+ "failed with:\n ",
+ error));
cmSystemTools::SetFatalErrorOccured();
return false;
}
@@ -686,10 +684,10 @@ void cmGlobalNinjaGenerator::CheckNinjaFeatures()
bool cmGlobalNinjaGenerator::CheckLanguages(
std::vector<std::string> const& languages, cmMakefile* mf) const
{
- if (cmContains(languages, "Fortran")) {
+ if (cm::contains(languages, "Fortran")) {
return this->CheckFortran(mf);
}
- if (cmContains(languages, "Swift")) {
+ if (cm::contains(languages, "Swift")) {
const std::string architectures =
mf->GetSafeDefinition("CMAKE_OSX_ARCHITECTURES");
if (architectures.find_first_of(';') != std::string::npos) {
@@ -713,7 +711,7 @@ bool cmGlobalNinjaGenerator::CheckFortran(cmMakefile* mf) const
/* clang-format off */
e <<
"The Ninja generator does not support Fortran using Ninja version\n"
- " " + this->NinjaVersion + "\n"
+ " " << this->NinjaVersion << "\n"
"due to lack of required features. Ninja 1.10 or higher is required."
;
/* clang-format on */
@@ -991,7 +989,8 @@ void cmGlobalNinjaGenerator::AddCXXCompileCommand(
std::string buildFileDir =
this->GetCMakeInstance()->GetHomeOutputDirectory();
if (!this->CompileCommandsStream) {
- std::string buildFilePath = buildFileDir + "/compile_commands.json";
+ std::string buildFilePath =
+ cmStrCat(buildFileDir, "/compile_commands.json");
if (this->ComputingUnknownDependencies) {
this->CombinedBuildOutputs.insert(
this->NinjaOutputPath("compile_commands.json"));
@@ -1000,9 +999,9 @@ void cmGlobalNinjaGenerator::AddCXXCompileCommand(
// Get a stream where to generate things.
this->CompileCommandsStream =
cm::make_unique<cmGeneratedFileStream>(buildFilePath);
- *this->CompileCommandsStream << "[";
+ *this->CompileCommandsStream << "[\n";
} else {
- *this->CompileCommandsStream << "," << std::endl;
+ *this->CompileCommandsStream << ",\n";
}
std::string sourceFileName = sourceFile;
@@ -1012,7 +1011,7 @@ void cmGlobalNinjaGenerator::AddCXXCompileCommand(
}
/* clang-format off */
- *this->CompileCommandsStream << "\n{\n"
+ *this->CompileCommandsStream << "{\n"
<< R"( "directory": ")"
<< cmGlobalGenerator::EscapeJSON(buildFileDir) << "\",\n"
<< R"( "command": ")"
@@ -1095,8 +1094,8 @@ void cmGlobalNinjaGenerator::AppendTargetOutputs(
case cmStateEnums::GLOBAL_TARGET:
case cmStateEnums::UTILITY: {
std::string path =
- target->GetLocalGenerator()->GetCurrentBinaryDirectory() +
- std::string("/") + target->GetName();
+ cmStrCat(target->GetLocalGenerator()->GetCurrentBinaryDirectory(), '/',
+ target->GetName());
std::string output = this->ConvertToNinjaPath(path);
if (target->Target->IsPerConfig()) {
output = this->BuildAlias(output, config);
@@ -1120,8 +1119,8 @@ void cmGlobalNinjaGenerator::AppendTargetDepends(
for (BT<std::pair<std::string, bool>> const& util :
target->GetUtilities()) {
std::string d =
- target->GetLocalGenerator()->GetCurrentBinaryDirectory() + "/" +
- util.Value.first;
+ cmStrCat(target->GetLocalGenerator()->GetCurrentBinaryDirectory(), '/',
+ util.Value.first);
outputs.push_back(this->BuildAlias(this->ConvertToNinjaPath(d), config));
}
} else {
@@ -1348,12 +1347,13 @@ void cmGlobalNinjaGenerator::WriteFolderTargets(std::ostream& os)
// Setup target
cmNinjaDeps configDeps;
- build.Comment = "Folder: " + currentBinaryDir;
+ build.Comment = cmStrCat("Folder: ", currentBinaryDir);
build.Outputs.emplace_back();
+ std::string const buildDirAllTarget =
+ this->ConvertToNinjaPath(cmStrCat(currentBinaryDir, "/all"));
for (auto const& config : configs) {
build.ExplicitDeps.clear();
- build.Outputs.front() = this->BuildAlias(
- this->ConvertToNinjaPath(currentBinaryDir + "/all"), config);
+ build.Outputs.front() = this->BuildAlias(buildDirAllTarget, config);
configDeps.emplace_back(build.Outputs.front());
for (DirectoryTarget::Target const& t : dt.Targets) {
if (!t.ExcludeFromAll) {
@@ -1363,7 +1363,7 @@ void cmGlobalNinjaGenerator::WriteFolderTargets(std::ostream& os)
for (DirectoryTarget::Dir const& d : dt.Children) {
if (!d.ExcludeFromAll) {
build.ExplicitDeps.emplace_back(this->BuildAlias(
- this->ConvertToNinjaPath(d.Path + "/all"), config));
+ this->ConvertToNinjaPath(cmStrCat(d.Path, "/all")), config));
}
}
// Write target
@@ -1377,21 +1377,18 @@ void cmGlobalNinjaGenerator::WriteFolderTargets(std::ostream& os)
// Add shortcut target
if (this->IsMultiConfig()) {
for (auto const& config : configs) {
- build.ExplicitDeps = { this->BuildAlias(
- this->ConvertToNinjaPath(currentBinaryDir + "/all"), config) };
- build.Outputs.front() =
- this->ConvertToNinjaPath(currentBinaryDir + "/all");
+ build.ExplicitDeps = { this->BuildAlias(buildDirAllTarget, config) };
+ build.Outputs.front() = buildDirAllTarget;
this->WriteBuild(*this->GetConfigFileStream(config), build);
}
if (!this->DefaultFileConfig.empty()) {
build.ExplicitDeps.clear();
for (auto const& config : this->DefaultConfigs) {
- build.ExplicitDeps.push_back(this->BuildAlias(
- this->ConvertToNinjaPath(currentBinaryDir + "/all"), config));
+ build.ExplicitDeps.push_back(
+ this->BuildAlias(buildDirAllTarget, config));
}
- build.Outputs.front() =
- this->ConvertToNinjaPath(currentBinaryDir + "/all");
+ build.Outputs.front() = buildDirAllTarget;
this->WriteBuild(*this->GetDefaultFileStream(), build);
}
}
@@ -1400,11 +1397,10 @@ void cmGlobalNinjaGenerator::WriteFolderTargets(std::ostream& os)
if (this->EnableCrossConfigBuild()) {
build.ExplicitDeps.clear();
for (auto const& config : this->CrossConfigs) {
- build.ExplicitDeps.push_back(this->BuildAlias(
- this->ConvertToNinjaPath(currentBinaryDir + "/all"), config));
+ build.ExplicitDeps.push_back(
+ this->BuildAlias(buildDirAllTarget, config));
}
- build.Outputs.front() = this->BuildAlias(
- this->ConvertToNinjaPath(currentBinaryDir + "/all"), "all");
+ build.Outputs.front() = this->BuildAlias(buildDirAllTarget, "all");
this->WriteBuild(os, build);
}
}
@@ -1616,7 +1612,8 @@ void cmGlobalNinjaGenerator::WriteTargetRebuildManifest(std::ostream& os)
cmNinjaBuild phonyBuild("phony");
phonyBuild.Comment = "Phony target to force glob verification run.";
- phonyBuild.Outputs.push_back(cm->GetGlobVerifyScript() + "_force");
+ phonyBuild.Outputs.push_back(
+ cmStrCat(cm->GetGlobVerifyScript(), "_force"));
this->WriteBuild(os, phonyBuild);
reBuild.Variables["restat"] = "1";
@@ -1807,7 +1804,7 @@ void cmGlobalNinjaGenerator::WriteTargetClean(std::ostream& os)
// Write rule
{
cmNinjaRule rule("CLEAN");
- rule.Command = NinjaCmd() + " $FILE_ARG -t clean $TARGETS";
+ rule.Command = cmStrCat(NinjaCmd(), " $FILE_ARG -t clean $TARGETS");
rule.Description = "Cleaning all built files...";
rule.Comment = "Rule for cleaning all built files.";
WriteRule(*this->RulesFileStream, rule);
@@ -1921,7 +1918,7 @@ void cmGlobalNinjaGenerator::WriteTargetHelp(std::ostream& os)
{
{
cmNinjaRule rule("HELP");
- rule.Command = NinjaCmd() + " -t targets";
+ rule.Command = cmStrCat(NinjaCmd(), " -t targets");
rule.Description = "All primary targets available:";
rule.Comment = "Rule for printing all primary targets available.";
WriteRule(*this->RulesFileStream, rule);
@@ -1948,7 +1945,7 @@ std::string cmGlobalNinjaGenerator::NinjaOutputPath(
if (!this->HasOutputPathPrefix() || cmSystemTools::FileIsFullPath(path)) {
return path;
}
- return this->OutputPathPrefix + path;
+ return cmStrCat(this->OutputPathPrefix, path);
}
void cmGlobalNinjaGenerator::StripNinjaOutputPathPrefixAsSuffix(
@@ -2076,7 +2073,8 @@ int cmcmd_cmake_ninja_depends(std::vector<std::string>::const_iterator argBeg,
} else if (cmHasLiteralPrefix(arg, "--lang=")) {
arg_lang = arg.substr(7);
} else {
- cmSystemTools::Error("-E cmake_ninja_depends unknown argument: " + arg);
+ cmSystemTools::Error(
+ cmStrCat("-E cmake_ninja_depends unknown argument: ", arg));
return 1;
}
}
@@ -2147,7 +2145,8 @@ int cmcmd_cmake_ninja_depends(std::vector<std::string>::const_iterator argBeg,
cmGeneratedFileStream ddif(arg_ddi);
ddif << ddi;
if (!ddif) {
- cmSystemTools::Error("-E cmake_ninja_depends failed to write " + arg_ddi);
+ cmSystemTools::Error(
+ cmStrCat("-E cmake_ninja_depends failed to write ", arg_ddi));
return 1;
}
return 0;
@@ -2193,7 +2192,8 @@ std::unique_ptr<cmSourceInfo> cmcmd_cmake_ninja_depends_fortran(
std::set<std::string> defines;
cmFortranParser parser(fc, includes, defines, finfo);
if (!cmFortranParser_FilePush(&parser, arg_pp.c_str())) {
- cmSystemTools::Error("-E cmake_ninja_depends failed to open " + arg_pp);
+ cmSystemTools::Error(
+ cmStrCat("-E cmake_ninja_depends failed to open ", arg_pp));
return nullptr;
}
if (cmFortran_yyparse(parser.Scanner) != 0) {
@@ -2296,7 +2296,7 @@ bool cmGlobalNinjaGenerator::WriteDyndepFile(
Json::Value tm = Json::objectValue;
for (cmDyndepObjectInfo const& object : objects) {
for (std::string const& p : object.Provides) {
- std::string const mod = module_dir + p;
+ std::string const mod = cmStrCat(module_dir, p);
mod_files[p] = mod;
tm[p] = mod;
}
@@ -2332,8 +2332,8 @@ bool cmGlobalNinjaGenerator::WriteDyndepFile(
// Store the map of modules provided by this target in a file for
// use by dependents that reference this target in linked-target-dirs.
- std::string const target_mods_file =
- cmSystemTools::GetFilenamePath(arg_dd) + "/" + arg_lang + "Modules.json";
+ std::string const target_mods_file = cmStrCat(
+ cmSystemTools::GetFilenamePath(arg_dd), '/', arg_lang, "Modules.json");
cmGeneratedFileStream tmf(target_mods_file);
tmf << tm;
@@ -2366,7 +2366,8 @@ int cmcmd_cmake_ninja_dyndep(std::vector<std::string>::const_iterator argBeg,
cmHasLiteralSuffix(arg, ".ddi")) {
arg_ddis.push_back(arg);
} else {
- cmSystemTools::Error("-E cmake_ninja_dyndep unknown argument: " + arg);
+ cmSystemTools::Error(
+ cmStrCat("-E cmake_ninja_dyndep unknown argument: ", arg));
return 1;
}
}
@@ -2402,7 +2403,7 @@ int cmcmd_cmake_ninja_dyndep(std::vector<std::string>::const_iterator argBeg,
std::string const dir_top_src = tdi["dir-top-src"].asString();
std::string module_dir = tdi["module-dir"].asString();
if (!module_dir.empty() && !cmHasLiteralSuffix(module_dir, "/")) {
- module_dir += "/";
+ module_dir += '/';
}
std::vector<std::string> linked_target_dirs;
Json::Value const& tdi_linked_target_dirs = tdi["linked-target-dirs"];
@@ -2430,9 +2431,7 @@ void cmGlobalNinjaGenerator::AppendDirectoryForConfig(
const std::string& suffix, std::string& dir)
{
if (!config.empty() && this->IsMultiConfig()) {
- dir += prefix;
- dir += config;
- dir += suffix;
+ dir += cmStrCat(prefix, config, suffix);
}
}
diff --git a/Source/cmGlobalUnixMakefileGenerator3.cxx b/Source/cmGlobalUnixMakefileGenerator3.cxx
index 90c9ef0..5363ea5 100644
--- a/Source/cmGlobalUnixMakefileGenerator3.cxx
+++ b/Source/cmGlobalUnixMakefileGenerator3.cxx
@@ -41,7 +41,6 @@ cmGlobalUnixMakefileGenerator3::cmGlobalUnixMakefileGenerator3(cmake* cm)
#else
this->UseLinkScript = true;
#endif
- this->CommandDatabase = nullptr;
this->IncludeDirective = "include";
this->DefineWindowsNULL = false;
@@ -49,6 +48,8 @@ cmGlobalUnixMakefileGenerator3::cmGlobalUnixMakefileGenerator3(cmake* cm)
this->UnixCD = true;
}
+cmGlobalUnixMakefileGenerator3::~cmGlobalUnixMakefileGenerator3() = default;
+
void cmGlobalUnixMakefileGenerator3::EnableLanguage(
std::vector<std::string> const& languages, cmMakefile* mf, bool optional)
{
@@ -116,6 +117,12 @@ void cmGlobalUnixMakefileGenerator3::ComputeTargetObjectDirectory(
gt->ObjectDirectory = dir;
}
+bool cmGlobalUnixMakefileGenerator3::CanEscapeOctothorpe() const
+{
+ // Make tools that use UNIX-style '/' paths also support '\' escaping.
+ return this->ForceUnixPaths;
+}
+
void cmGlobalUnixMakefileGenerator3::Configure()
{
// Initialize CMAKE_EDIT_COMMAND cache entry.
@@ -157,10 +164,9 @@ void cmGlobalUnixMakefileGenerator3::Generate()
this->WriteMainMakefile2();
this->WriteMainCMakefile();
- if (this->CommandDatabase != nullptr) {
- *this->CommandDatabase << std::endl << "]";
- delete this->CommandDatabase;
- this->CommandDatabase = nullptr;
+ if (this->CommandDatabase) {
+ *this->CommandDatabase << "\n]";
+ this->CommandDatabase.reset();
}
}
@@ -168,26 +174,26 @@ void cmGlobalUnixMakefileGenerator3::AddCXXCompileCommand(
const std::string& sourceFile, const std::string& workingDirectory,
const std::string& compileCommand)
{
- if (this->CommandDatabase == nullptr) {
+ if (!this->CommandDatabase) {
std::string commandDatabaseName =
this->GetCMakeInstance()->GetHomeOutputDirectory() +
"/compile_commands.json";
- this->CommandDatabase = new cmGeneratedFileStream(commandDatabaseName);
- *this->CommandDatabase << "[" << std::endl;
+ this->CommandDatabase =
+ cm::make_unique<cmGeneratedFileStream>(commandDatabaseName);
+ *this->CommandDatabase << "[\n";
} else {
- *this->CommandDatabase << "," << std::endl;
+ *this->CommandDatabase << ",\n";
}
- *this->CommandDatabase << "{" << std::endl
+ *this->CommandDatabase << "{\n"
<< R"( "directory": ")"
<< cmGlobalGenerator::EscapeJSON(workingDirectory)
- << "\"," << std::endl
+ << "\",\n"
<< R"( "command": ")"
<< cmGlobalGenerator::EscapeJSON(compileCommand)
- << "\"," << std::endl
+ << "\",\n"
<< R"( "file": ")"
- << cmGlobalGenerator::EscapeJSON(sourceFile) << "\""
- << std::endl
- << "}";
+ << cmGlobalGenerator::EscapeJSON(sourceFile)
+ << "\"\n}";
}
void cmGlobalUnixMakefileGenerator3::WriteMainMakefile2()
@@ -343,19 +349,18 @@ void cmGlobalUnixMakefileGenerator3::WriteMainCMakefile()
const std::string& binDir = lg.GetBinaryDirectory();
// CMake must rerun if a byproduct is missing.
- {
- cmakefileStream << "# Byproducts of CMake generate step:\n"
- << "set(CMAKE_MAKEFILE_PRODUCTS\n";
- for (std::string const& outfile : lg.GetMakefile()->GetOutputFiles()) {
+ cmakefileStream << "# Byproducts of CMake generate step:\n"
+ << "set(CMAKE_MAKEFILE_PRODUCTS\n";
+
+ // add in any byproducts and all the directory information files
+ std::string tmpStr;
+ for (const auto& localGen : this->LocalGenerators) {
+ for (std::string const& outfile :
+ localGen->GetMakefile()->GetOutputFiles()) {
cmakefileStream << " \""
<< lg.MaybeConvertToRelativePath(binDir, outfile)
<< "\"\n";
}
- }
-
- // add in all the directory information files
- std::string tmpStr;
- for (const auto& localGen : this->LocalGenerators) {
tmpStr = cmStrCat(localGen->GetCurrentBinaryDirectory(),
"/CMakeFiles/CMakeDirectoryInformation.cmake");
cmakefileStream << " \""
@@ -481,6 +486,78 @@ void cmGlobalUnixMakefileGenerator3::WriteDirectoryRules2(
}
}
+namespace {
+std::string ConvertToMakefilePathForUnix(std::string const& path)
+{
+ std::string result;
+ result.reserve(path.size());
+ for (char c : path) {
+ switch (c) {
+ case '=':
+ // We provide 'EQUALS = =' to encode '=' in a non-assignment case.
+ result.append("$(EQUALS)");
+ break;
+ case '$':
+ result.append("$$");
+ break;
+ case '\\':
+ case ' ':
+ case '#':
+ result.push_back('\\');
+ CM_FALLTHROUGH;
+ default:
+ result.push_back(c);
+ break;
+ }
+ }
+ return result;
+}
+
+#if defined(_WIN32) && !defined(__CYGWIN__)
+std::string ConvertToMakefilePathForWindows(std::string const& path)
+{
+ bool const quote = path.find_first_of(" #") != std::string::npos;
+ std::string result;
+ result.reserve(path.size() + (quote ? 2 : 0));
+ if (quote) {
+ result.push_back('"');
+ }
+ for (char c : path) {
+ switch (c) {
+ case '=':
+ // We provide 'EQUALS = =' to encode '=' in a non-assignment case.
+ result.append("$(EQUALS)");
+ break;
+ case '$':
+ result.append("$$");
+ break;
+ case '/':
+ result.push_back('\\');
+ break;
+ default:
+ result.push_back(c);
+ break;
+ }
+ }
+ if (quote) {
+ result.push_back('"');
+ }
+ return result;
+}
+#endif
+}
+
+std::string cmGlobalUnixMakefileGenerator3::ConvertToMakefilePath(
+ std::string const& path) const
+{
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ if (!this->ForceUnixPaths) {
+ return ConvertToMakefilePathForWindows(path);
+ }
+#endif
+ return ConvertToMakefilePathForUnix(path);
+}
+
std::vector<cmGlobalGenerator::GeneratedMakeCommand>
cmGlobalUnixMakefileGenerator3::GenerateBuildCommand(
const std::string& makeProgram, const std::string& /*projectName*/,
@@ -674,10 +751,10 @@ void cmGlobalUnixMakefileGenerator3::WriteConvenienceRules2(
}
bool targetMessages = true;
- if (const char* tgtMsg =
+ if (cmProp tgtMsg =
this->GetCMakeInstance()->GetState()->GetGlobalProperty(
"TARGET_MESSAGES")) {
- targetMessages = cmIsOn(tgtMsg);
+ targetMessages = cmIsOn(*tgtMsg);
}
if (targetMessages) {
@@ -697,9 +774,8 @@ void cmGlobalUnixMakefileGenerator3::WriteConvenienceRules2(
std::ostringstream progCmd;
progCmd << "$(CMAKE_COMMAND) -E cmake_progress_start ";
// # in target
- progCmd << lg.ConvertToOutputFormat(
- cmSystemTools::CollapseFullPath(progress.Dir),
- cmOutputConverter::SHELL);
+ progCmd << lg.ConvertToOutputFormat(progress.Dir,
+ cmOutputConverter::SHELL);
//
std::set<cmGeneratorTarget const*> emitted;
progCmd << " "
@@ -711,9 +787,8 @@ void cmGlobalUnixMakefileGenerator3::WriteConvenienceRules2(
{
std::ostringstream progCmd;
progCmd << "$(CMAKE_COMMAND) -E cmake_progress_start "; // # 0
- progCmd << lg.ConvertToOutputFormat(
- cmSystemTools::CollapseFullPath(progress.Dir),
- cmOutputConverter::SHELL);
+ progCmd << lg.ConvertToOutputFormat(progress.Dir,
+ cmOutputConverter::SHELL);
progCmd << " 0";
commands.push_back(progCmd.str());
}
diff --git a/Source/cmGlobalUnixMakefileGenerator3.h b/Source/cmGlobalUnixMakefileGenerator3.h
index 340a7ef..1caa4b7 100644
--- a/Source/cmGlobalUnixMakefileGenerator3.h
+++ b/Source/cmGlobalUnixMakefileGenerator3.h
@@ -68,6 +68,13 @@ public:
new cmGlobalGeneratorSimpleFactory<cmGlobalUnixMakefileGenerator3>());
}
+ ~cmGlobalUnixMakefileGenerator3() override;
+
+ cmGlobalUnixMakefileGenerator3(const cmGlobalUnixMakefileGenerator3&) =
+ delete;
+ cmGlobalUnixMakefileGenerator3& operator=(
+ const cmGlobalUnixMakefileGenerator3&) = delete;
+
//! Get the name for the generator.
std::string GetName() const override
{
@@ -129,6 +136,12 @@ public:
or dependencies. */
std::string GetEmptyRuleHackDepends() { return this->EmptyRuleHackDepends; }
+ /**
+ * Convert a file path to a Makefile target or dependency with
+ * escaping and quoting suitable for the generator's make tool.
+ */
+ std::string ConvertToMakefilePath(std::string const& path) const;
+
// change the build command for speed
std::vector<GeneratedMakeCommand> GenerateBuildCommand(
const std::string& makeProgram, const std::string& projectName,
@@ -150,6 +163,9 @@ public:
/** Does the make tool tolerate .DELETE_ON_ERROR? */
virtual bool AllowDeleteOnError() const { return true; }
+ /** Does the make tool interpret '\#' as '#'? */
+ virtual bool CanEscapeOctothorpe() const;
+
bool IsIPOSupported() const override { return true; }
void ComputeTargetObjectDirectory(cmGeneratorTarget* gt) const override;
@@ -232,7 +248,7 @@ protected:
std::set<cmGeneratorTarget const*>& emitted);
size_t CountProgressMarksInAll(const cmLocalGenerator& lg);
- cmGeneratedFileStream* CommandDatabase;
+ std::unique_ptr<cmGeneratedFileStream> CommandDatabase;
private:
const char* GetBuildIgnoreErrorsFlag() const override { return "-i"; }
diff --git a/Source/cmGlobalVisualStudio10Generator.cxx b/Source/cmGlobalVisualStudio10Generator.cxx
index ccb6c50..5dac072 100644
--- a/Source/cmGlobalVisualStudio10Generator.cxx
+++ b/Source/cmGlobalVisualStudio10Generator.cxx
@@ -6,12 +6,12 @@
#include <cm/memory>
+#include <cm3p/json/reader.h>
+
#include "cmsys/FStream.hxx"
#include "cmsys/Glob.hxx"
#include "cmsys/RegularExpression.hxx"
-#include "cm_jsoncpp_reader.h"
-
#include "cmAlgorithms.h"
#include "cmDocumentationEntry.h"
#include "cmGeneratorTarget.h"
@@ -19,6 +19,7 @@
#include "cmMakefile.h"
#include "cmMessageType.h"
#include "cmSourceFile.h"
+#include "cmStringAlgorithms.h"
#include "cmVersion.h"
#include "cmVisualStudioSlnData.h"
#include "cmVisualStudioSlnParser.h"
@@ -313,7 +314,7 @@ bool cmGlobalVisualStudio10Generator::SetGeneratorToolset(
version.clear();
}
- if (version.find(this->GetPlatformToolsetString()) != 0) {
+ if (!cmHasPrefix(version, this->GetPlatformToolsetString())) {
std::ostringstream e;
/* clang-format off */
e <<
diff --git a/Source/cmGlobalVisualStudio71Generator.cxx b/Source/cmGlobalVisualStudio71Generator.cxx
index d0aec61..7ada325 100644
--- a/Source/cmGlobalVisualStudio71Generator.cxx
+++ b/Source/cmGlobalVisualStudio71Generator.cxx
@@ -91,7 +91,7 @@ void cmGlobalVisualStudio71Generator::WriteProject(std::ostream& fout,
cmGeneratorTarget const* t)
{
// check to see if this is a fortran build
- const char* ext = ".vcproj";
+ std::string ext = ".vcproj";
const char* project =
"Project(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"";
if (this->TargetIsFortranOnly(t)) {
@@ -102,9 +102,9 @@ void cmGlobalVisualStudio71Generator::WriteProject(std::ostream& fout,
ext = ".csproj";
project = "Project(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"";
}
- const char* targetExt = t->GetProperty("GENERATOR_FILE_NAME_EXT");
+ cmProp targetExt = t->GetProperty("GENERATOR_FILE_NAME_EXT");
if (targetExt) {
- ext = targetExt;
+ ext = *targetExt;
}
std::string guid = this->GetGUID(dspname);
@@ -198,9 +198,9 @@ void cmGlobalVisualStudio71Generator::WriteProjectConfigurations(
std::vector<std::string> mapConfig;
const char* dstConfig = i.c_str();
if (target.GetProperty("EXTERNAL_MSPROJECT")) {
- if (const char* m = target.GetProperty("MAP_IMPORTED_CONFIG_" +
- cmSystemTools::UpperCase(i))) {
- cmExpandList(m, mapConfig);
+ if (cmProp m = target.GetProperty("MAP_IMPORTED_CONFIG_" +
+ cmSystemTools::UpperCase(i))) {
+ cmExpandList(*m, mapConfig);
if (!mapConfig.empty()) {
dstConfig = mapConfig[0].c_str();
}
diff --git a/Source/cmGlobalVisualStudio7Generator.cxx b/Source/cmGlobalVisualStudio7Generator.cxx
index 9799124..428c748 100644
--- a/Source/cmGlobalVisualStudio7Generator.cxx
+++ b/Source/cmGlobalVisualStudio7Generator.cxx
@@ -128,7 +128,7 @@ void cmGlobalVisualStudio7Generator::EnableLanguage(
// does not know about.
std::string extraPath;
if (cmSystemTools::GetEnv("CMAKE_MSVCIDE_RUN_PATH", extraPath)) {
- mf->AddCacheDefinition("CMAKE_MSVCIDE_RUN_PATH", extraPath.c_str(),
+ mf->AddCacheDefinition("CMAKE_MSVCIDE_RUN_PATH", extraPath,
"Saved environment variable CMAKE_MSVCIDE_RUN_PATH",
cmStateEnums::STATIC);
}
@@ -342,19 +342,19 @@ void cmGlobalVisualStudio7Generator::WriteTargetConfigurations(
if (target->GetType() == cmStateEnums::INTERFACE_LIBRARY) {
continue;
}
- const char* expath = target->GetProperty("EXTERNAL_MSPROJECT");
+ cmProp expath = target->GetProperty("EXTERNAL_MSPROJECT");
if (expath) {
std::set<std::string> allConfigurations(configs.begin(), configs.end());
- const char* mapping = target->GetProperty("VS_PLATFORM_MAPPING");
+ cmProp mapping = target->GetProperty("VS_PLATFORM_MAPPING");
this->WriteProjectConfigurations(fout, target->GetName(), *target,
configs, allConfigurations,
- mapping ? mapping : "");
+ mapping ? *mapping : "");
} else {
const std::set<std::string>& configsPartOfDefaultBuild =
this->IsPartOfDefaultBuild(configs, projectTargets, target);
- const char* vcprojName = target->GetProperty("GENERATOR_FILE_NAME");
+ cmProp vcprojName = target->GetProperty("GENERATOR_FILE_NAME");
if (vcprojName) {
- this->WriteProjectConfigurations(fout, vcprojName, *target, configs,
+ this->WriteProjectConfigurations(fout, *vcprojName, *target, configs,
configsPartOfDefaultBuild);
}
}
@@ -375,17 +375,18 @@ void cmGlobalVisualStudio7Generator::WriteTargetsToSolution(
bool written = false;
// handle external vc project files
- const char* expath = target->GetProperty("EXTERNAL_MSPROJECT");
+ cmProp expath = target->GetProperty("EXTERNAL_MSPROJECT");
if (expath) {
std::string project = target->GetName();
- std::string location = expath;
+ std::string location = *expath;
+ cmProp p = target->GetProperty("VS_PROJECT_TYPE");
this->WriteExternalProject(fout, project, location,
- target->GetProperty("VS_PROJECT_TYPE"),
+ p ? p->c_str() : nullptr,
target->GetUtilities());
written = true;
} else {
- const char* vcprojName = target->GetProperty("GENERATOR_FILE_NAME");
+ cmProp vcprojName = target->GetProperty("GENERATOR_FILE_NAME");
if (vcprojName) {
cmLocalGenerator* lg = target->GetLocalGenerator();
std::string dir = lg->GetCurrentBinaryDirectory();
@@ -393,7 +394,7 @@ void cmGlobalVisualStudio7Generator::WriteTargetsToSolution(
if (dir == ".") {
dir.clear(); // msbuild cannot handle ".\" prefix
}
- this->WriteProject(fout, vcprojName, dir, target);
+ this->WriteProject(fout, *vcprojName, dir, target);
written = true;
}
}
@@ -438,11 +439,11 @@ void cmGlobalVisualStudio7Generator::WriteTargetDepends(
if (target->GetType() == cmStateEnums::INTERFACE_LIBRARY) {
continue;
}
- const char* vcprojName = target->GetProperty("GENERATOR_FILE_NAME");
+ cmProp vcprojName = target->GetProperty("GENERATOR_FILE_NAME");
if (vcprojName) {
std::string dir =
target->GetLocalGenerator()->GetCurrentSourceDirectory();
- this->WriteProjectDepends(fout, vcprojName, dir.c_str(), target);
+ this->WriteProjectDepends(fout, *vcprojName, dir, target);
}
}
}
@@ -505,13 +506,13 @@ void cmGlobalVisualStudio7Generator::WriteSLNGlobalSections(
const std::vector<std::string> propKeys =
root->GetMakefile()->GetPropertyKeys();
for (std::string const& it : propKeys) {
- if (it.find("VS_GLOBAL_SECTION_") == 0) {
+ if (cmHasLiteralPrefix(it, "VS_GLOBAL_SECTION_")) {
std::string sectionType;
std::string name = it.substr(18);
- if (name.find("PRE_") == 0) {
+ if (cmHasLiteralPrefix(name, "PRE_")) {
name = name.substr(4);
sectionType = "preSolution";
- } else if (name.find("POST_") == 0) {
+ } else if (cmHasLiteralPrefix(name, "POST_")) {
name = name.substr(5);
sectionType = "postSolution";
} else
@@ -526,8 +527,8 @@ void cmGlobalVisualStudio7Generator::WriteSLNGlobalSections(
extensibilityAddInsOverridden = true;
}
fout << "\tGlobalSection(" << name << ") = " << sectionType << "\n";
- std::vector<std::string> keyValuePairs =
- cmExpandedList(root->GetMakefile()->GetProperty(it));
+ cmProp p = root->GetMakefile()->GetProperty(it);
+ std::vector<std::string> keyValuePairs = cmExpandedList(p ? *p : "");
for (std::string const& itPair : keyValuePairs) {
const std::string::size_type posEqual = itPair.find('=');
if (posEqual != std::string::npos) {
@@ -676,7 +677,8 @@ std::set<std::string> cmGlobalVisualStudio7Generator::IsPartOfDefaultBuild(
for (std::string const& i : configs) {
const char* propertyValue =
target->Target->GetMakefile()->GetDefinition(propertyName);
- if (cmIsOn(cmGeneratorExpression::Evaluate(
+ if (propertyValue &&
+ cmIsOn(cmGeneratorExpression::Evaluate(
propertyValue, target->GetLocalGenerator(), i))) {
activeConfigs.insert(i);
}
diff --git a/Source/cmGlobalVisualStudio8Generator.cxx b/Source/cmGlobalVisualStudio8Generator.cxx
index 1c62fbd..29ca154 100644
--- a/Source/cmGlobalVisualStudio8Generator.cxx
+++ b/Source/cmGlobalVisualStudio8Generator.cxx
@@ -142,6 +142,9 @@ bool cmGlobalVisualStudio8Generator::AddCheckTarget()
// Add a custom rule to re-run CMake if any input files changed.
{
+ // The custom rule runs cmake so set UTF-8 pipes.
+ bool stdPipesUTF8 = true;
+
// Collect the input files used to generate all targets in this
// project.
std::vector<std::string> listFiles;
@@ -160,7 +163,7 @@ bool cmGlobalVisualStudio8Generator::AddCheckTarget()
lg.AddCustomCommandToTarget(
CMAKE_CHECK_BUILD_SYSTEM_TARGET, byproducts, no_depends,
verifyCommandLines, cmCustomCommandType::PRE_BUILD,
- "Checking File Globs", no_working_directory, false);
+ "Checking File Globs", no_working_directory, stdPipesUTF8);
// Ensure ZERO_CHECK always runs in Visual Studio using MSBuild,
// otherwise the prebuild command will not be run.
@@ -192,7 +195,8 @@ bool cmGlobalVisualStudio8Generator::AddCheckTarget()
if (cmSourceFile* file = lg.AddCustomCommandToOutput(
stamps, no_byproducts, listFiles, no_main_dependency,
no_implicit_depends, commandLines, "Checking Build System",
- no_working_directory, true, false)) {
+ no_working_directory, true, false, false, false, "", "",
+ stdPipesUTF8)) {
gt->AddSource(file->ResolveFullPath());
} else {
cmSystemTools::Error("Error adding rule for " + stamps[0]);
@@ -240,9 +244,9 @@ void cmGlobalVisualStudio8Generator::WriteProjectConfigurations(
std::vector<std::string> mapConfig;
const char* dstConfig = i.c_str();
if (target.GetProperty("EXTERNAL_MSPROJECT")) {
- if (const char* m = target.GetProperty("MAP_IMPORTED_CONFIG_" +
- cmSystemTools::UpperCase(i))) {
- cmExpandList(m, mapConfig);
+ if (cmProp m = target.GetProperty("MAP_IMPORTED_CONFIG_" +
+ cmSystemTools::UpperCase(i))) {
+ cmExpandList(*m, mapConfig);
if (!mapConfig.empty()) {
dstConfig = mapConfig[0].c_str();
}
@@ -275,23 +279,31 @@ void cmGlobalVisualStudio8Generator::WriteProjectConfigurations(
bool cmGlobalVisualStudio8Generator::NeedsDeploy(
cmGeneratorTarget const& target, const char* config) const
{
- cmStateEnums::TargetType type = target.GetType();
- bool noDeploy = DeployInhibited(target, config);
- return !noDeploy &&
- (type == cmStateEnums::EXECUTABLE ||
- type == cmStateEnums::SHARED_LIBRARY) &&
- this->TargetSystemSupportsDeployment();
-}
+ cmStateEnums::TargetType const type = target.GetType();
+ if (type != cmStateEnums::EXECUTABLE &&
+ type != cmStateEnums::SHARED_LIBRARY) {
+ // deployment only valid on executables and shared libraries.
+ return false;
+ }
-bool cmGlobalVisualStudio8Generator::DeployInhibited(
- cmGeneratorTarget const& target, const char* config) const
-{
- bool rVal = false;
- if (const char* prop = target.GetProperty("VS_NO_SOLUTION_DEPLOY")) {
- rVal = cmIsOn(
- cmGeneratorExpression::Evaluate(prop, target.LocalGenerator, config));
+ if (cmProp prop = target.GetProperty("VS_SOLUTION_DEPLOY")) {
+ // If set, it dictates behavior
+ return cmIsOn(
+ cmGeneratorExpression::Evaluate(*prop, target.LocalGenerator, config));
}
- return rVal;
+
+ // To be deprecated, disable deployment even if target supports it.
+ if (cmProp prop = target.GetProperty("VS_NO_SOLUTION_DEPLOY")) {
+ if (cmIsOn(cmGeneratorExpression::Evaluate(*prop, target.LocalGenerator,
+ config))) {
+ // If true, always disable deployment
+ return false;
+ }
+ }
+
+ // Legacy behavior, enabled deployment based on 'hard-coded' target
+ // platforms.
+ return this->TargetSystemSupportsDeployment();
}
bool cmGlobalVisualStudio8Generator::TargetSystemSupportsDeployment() const
diff --git a/Source/cmGlobalVisualStudio8Generator.h b/Source/cmGlobalVisualStudio8Generator.h
index 8f8e33b..6ce67d3 100644
--- a/Source/cmGlobalVisualStudio8Generator.h
+++ b/Source/cmGlobalVisualStudio8Generator.h
@@ -57,10 +57,6 @@ protected:
virtual bool NeedsDeploy(cmGeneratorTarget const& target,
const char* config) const;
- /** Returns true if deployment has been disabled in cmake file. */
- bool DeployInhibited(cmGeneratorTarget const& target,
- const char* config) const;
-
/** Returns true if the target system support debugging deployment. */
virtual bool TargetSystemSupportsDeployment() const;
diff --git a/Source/cmGlobalVisualStudioGenerator.cxx b/Source/cmGlobalVisualStudioGenerator.cxx
index 4b4d72a..0932d06 100644
--- a/Source/cmGlobalVisualStudioGenerator.cxx
+++ b/Source/cmGlobalVisualStudioGenerator.cxx
@@ -508,9 +508,9 @@ std::string cmGlobalVisualStudioGenerator::GetUtilityDepend(
std::string cmGlobalVisualStudioGenerator::GetStartupProjectName(
cmLocalGenerator const* root) const
{
- const char* n = root->GetMakefile()->GetProperty("VS_STARTUP_PROJECT");
- if (n && *n) {
- std::string startup = n;
+ cmProp n = root->GetMakefile()->GetProperty("VS_STARTUP_PROJECT");
+ if (n && !n->empty()) {
+ std::string startup = *n;
if (this->FindTarget(startup)) {
return startup;
} else {
@@ -809,9 +809,9 @@ bool cmGlobalVisualStudioGenerator::TargetIsFortranOnly(
// This allows the project to control the language choice in
// a target with none of its own sources, e.g. when also using
// object libraries.
- const char* linkLang = gt->GetProperty("LINKER_LANGUAGE");
- if (linkLang && *linkLang) {
- languages.insert(linkLang);
+ cmProp linkLang = gt->GetProperty("LINKER_LANGUAGE");
+ if (linkLang && !linkLang->empty()) {
+ languages.insert(*linkLang);
}
// Intel Fortran .vfproj files do support the resource compiler.
@@ -933,7 +933,7 @@ void cmGlobalVisualStudioGenerator::AddSymbolExportCommand(
{ cmakeCommand, "-E", "__create_def", mdi->DefFile, objs_file });
cmCustomCommand command(outputs, empty, empty, commandLines,
gt->Target->GetMakefile()->GetBacktrace(),
- "Auto build dll exports", ".");
+ "Auto build dll exports", ".", true);
commands.push_back(std::move(command));
}
diff --git a/Source/cmGlobalWatcomWMakeGenerator.cxx b/Source/cmGlobalWatcomWMakeGenerator.cxx
index 308ddda..d6a7afa 100644
--- a/Source/cmGlobalWatcomWMakeGenerator.cxx
+++ b/Source/cmGlobalWatcomWMakeGenerator.cxx
@@ -19,7 +19,7 @@ cmGlobalWatcomWMakeGenerator::cmGlobalWatcomWMakeGenerator(cmake* cm)
#endif
this->ToolSupportsColor = true;
this->NeedSymbolicMark = true;
- this->EmptyRuleHackCommand = "@cd .";
+ this->EmptyRuleHackCommand = "@%null";
#ifdef _WIN32
cm->GetState()->SetWindowsShell(true);
#endif
@@ -44,6 +44,16 @@ void cmGlobalWatcomWMakeGenerator::EnableLanguage(
this->cmGlobalUnixMakefileGenerator3::EnableLanguage(l, mf, optional);
}
+bool cmGlobalWatcomWMakeGenerator::SetSystemName(std::string const& s,
+ cmMakefile* mf)
+{
+ if (mf->GetSafeDefinition("CMAKE_SYSTEM_PROCESSOR") == "I86") {
+ mf->AddDefinition("CMAKE_GENERATOR_CC", "wcl");
+ mf->AddDefinition("CMAKE_GENERATOR_CXX", "wcl");
+ }
+ return this->cmGlobalUnixMakefileGenerator3::SetSystemName(s, mf);
+}
+
void cmGlobalWatcomWMakeGenerator::GetDocumentation(
cmDocumentationEntry& entry)
{
diff --git a/Source/cmGlobalWatcomWMakeGenerator.h b/Source/cmGlobalWatcomWMakeGenerator.h
index c0daf8a..c47127f 100644
--- a/Source/cmGlobalWatcomWMakeGenerator.h
+++ b/Source/cmGlobalWatcomWMakeGenerator.h
@@ -41,6 +41,9 @@ public:
/** Get the documentation entry for this generator. */
static void GetDocumentation(cmDocumentationEntry& entry);
+ /** Tell the generator about the target system. */
+ bool SetSystemName(std::string const& s, cmMakefile* mf) override;
+
/**
* Try to determine system information such as shared library
* extension, pthreads, byte order etc.
diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx
index e0005a4..cda3338 100644
--- a/Source/cmGlobalXCodeGenerator.cxx
+++ b/Source/cmGlobalXCodeGenerator.cxx
@@ -8,13 +8,13 @@
#include <cstring>
#include <iomanip>
#include <sstream>
+#include <utility>
#include <cm/memory>
#include <cmext/algorithm>
#include "cmsys/RegularExpression.hxx"
-#include "cmAlgorithms.h"
#include "cmComputeLinkInformation.h"
#include "cmCustomCommand.h"
#include "cmCustomCommandGenerator.h"
@@ -33,6 +33,7 @@
#include "cmSourceGroup.h"
#include "cmState.h"
#include "cmStateTypes.h"
+#include "cmStringAlgorithms.h"
#include "cmSystemTools.h"
#include "cmTarget.h"
#include "cmXCode21Object.h"
@@ -361,7 +362,7 @@ cmGlobalXCodeGenerator::GenerateBuildCommand(
std::string projectArg = cmStrCat(projectName, ".xcodeproj");
makeCommand.Add(projectArg);
}
- if (cmContains(targetNames, "clean")) {
+ if (cm::contains(targetNames, "clean")) {
makeCommand.Add("clean");
makeCommand.Add("-target", "ALL_BUILD");
} else {
@@ -642,7 +643,8 @@ void cmGlobalXCodeGenerator::CreateReRunCMakeFile(
<< "\n";
}
-static bool objectIdLessThan(cmXCodeObject* l, cmXCodeObject* r)
+static bool objectIdLessThan(const std::unique_ptr<cmXCodeObject>& l,
+ const std::unique_ptr<cmXCodeObject>& r)
{
return l->GetId() < r->GetId();
}
@@ -656,9 +658,6 @@ void cmGlobalXCodeGenerator::SortXCodeObjects()
void cmGlobalXCodeGenerator::ClearXCodeObjects()
{
this->TargetDoneSet.clear();
- for (auto& obj : this->XCodeObjects) {
- delete obj;
- }
this->XCodeObjects.clear();
this->XCodeObjectIDs.clear();
this->XCodeObjectMap.clear();
@@ -668,7 +667,7 @@ void cmGlobalXCodeGenerator::ClearXCodeObjects()
this->FileRefs.clear();
}
-void cmGlobalXCodeGenerator::addObject(cmXCodeObject* obj)
+void cmGlobalXCodeGenerator::addObject(std::unique_ptr<cmXCodeObject> obj)
{
if (obj->GetType() == cmXCodeObject::OBJECT) {
const std::string& id = obj->GetId();
@@ -683,22 +682,24 @@ void cmGlobalXCodeGenerator::addObject(cmXCodeObject* obj)
this->XCodeObjectIDs.insert(id);
}
- this->XCodeObjects.push_back(obj);
+ this->XCodeObjects.push_back(std::move(obj));
}
cmXCodeObject* cmGlobalXCodeGenerator::CreateObject(
cmXCodeObject::PBXType ptype)
{
- cmXCodeObject* obj = new cmXCode21Object(ptype, cmXCodeObject::OBJECT);
- this->addObject(obj);
- return obj;
+ auto obj = cm::make_unique<cmXCode21Object>(ptype, cmXCodeObject::OBJECT);
+ auto ptr = obj.get();
+ this->addObject(std::move(obj));
+ return ptr;
}
cmXCodeObject* cmGlobalXCodeGenerator::CreateObject(cmXCodeObject::Type type)
{
- cmXCodeObject* obj = new cmXCodeObject(cmXCodeObject::None, type);
- this->addObject(obj);
- return obj;
+ auto obj = cm::make_unique<cmXCodeObject>(cmXCodeObject::None, type);
+ auto ptr = obj.get();
+ this->addObject(std::move(obj));
+ return ptr;
}
cmXCodeObject* cmGlobalXCodeGenerator::CreateString(const std::string& s)
@@ -768,11 +769,15 @@ public:
XCodeGeneratorExpressionInterpreter& operator=(
XCodeGeneratorExpressionInterpreter const&) = delete;
- using cmGeneratorExpressionInterpreter::Evaluate;
-
const std::string& Evaluate(const char* expression,
const std::string& property)
{
+ return this->Evaluate(std::string(expression ? expression : ""), property);
+ }
+
+ const std::string& Evaluate(const std::string& expression,
+ const std::string& property)
+ {
const std::string& processed =
this->cmGeneratorExpressionInterpreter::Evaluate(expression, property);
if (this->CompiledGeneratorExpression->GetHadContextSensitiveCondition()) {
@@ -803,7 +808,7 @@ cmXCodeObject* cmGlobalXCodeGenerator::CreateXCodeSourceFile(
// Add flags from target and source file properties.
std::string flags;
- const char* srcfmt = sf->GetProperty("Fortran_FORMAT");
+ std::string const& srcfmt = sf->GetSafeProperty("Fortran_FORMAT");
switch (cmOutputConverter::GetFortranFormat(srcfmt)) {
case cmOutputConverter::FortranFormatFixed:
flags = "-fixed " + flags;
@@ -815,22 +820,22 @@ cmXCodeObject* cmGlobalXCodeGenerator::CreateXCodeSourceFile(
break;
}
const std::string COMPILE_FLAGS("COMPILE_FLAGS");
- if (const char* cflags = sf->GetProperty(COMPILE_FLAGS)) {
- lg->AppendFlags(flags, genexInterpreter.Evaluate(cflags, COMPILE_FLAGS));
+ if (cmProp cflags = sf->GetProperty(COMPILE_FLAGS)) {
+ lg->AppendFlags(flags, genexInterpreter.Evaluate(*cflags, COMPILE_FLAGS));
}
const std::string COMPILE_OPTIONS("COMPILE_OPTIONS");
- if (const char* coptions = sf->GetProperty(COMPILE_OPTIONS)) {
+ if (cmProp coptions = sf->GetProperty(COMPILE_OPTIONS)) {
lg->AppendCompileOptions(
- flags, genexInterpreter.Evaluate(coptions, COMPILE_OPTIONS));
+ flags, genexInterpreter.Evaluate(*coptions, COMPILE_OPTIONS));
}
// Add per-source definitions.
BuildObjectListOrString flagsBuild(this, false);
const std::string COMPILE_DEFINITIONS("COMPILE_DEFINITIONS");
- if (const char* compile_defs = sf->GetProperty(COMPILE_DEFINITIONS)) {
+ if (cmProp compile_defs = sf->GetProperty(COMPILE_DEFINITIONS)) {
this->AppendDefines(
flagsBuild,
- genexInterpreter.Evaluate(compile_defs, COMPILE_DEFINITIONS).c_str(),
+ genexInterpreter.Evaluate(*compile_defs, COMPILE_DEFINITIONS).c_str(),
true);
}
@@ -848,9 +853,9 @@ cmXCodeObject* cmGlobalXCodeGenerator::CreateXCodeSourceFile(
// Add per-source include directories.
std::vector<std::string> includes;
const std::string INCLUDE_DIRECTORIES("INCLUDE_DIRECTORIES");
- if (const char* cincludes = sf->GetProperty(INCLUDE_DIRECTORIES)) {
+ if (cmProp cincludes = sf->GetProperty(INCLUDE_DIRECTORIES)) {
lg->AppendIncludeDirectories(
- includes, genexInterpreter.Evaluate(cincludes, INCLUDE_DIRECTORIES),
+ includes, genexInterpreter.Evaluate(*cincludes, INCLUDE_DIRECTORIES),
*sf);
}
lg->AppendFlags(flags, lg->GetIncludeFlags(includes, gtgt, lang, true));
@@ -879,10 +884,10 @@ cmXCodeObject* cmGlobalXCodeGenerator::CreateXCodeSourceFile(
}
// Add user-specified file attributes.
- const char* extraFileAttributes = sf->GetProperty("XCODE_FILE_ATTRIBUTES");
+ cmProp extraFileAttributes = sf->GetProperty("XCODE_FILE_ATTRIBUTES");
if (extraFileAttributes) {
// Expand the list of attributes.
- std::vector<std::string> attributes = cmExpandedList(extraFileAttributes);
+ std::vector<std::string> attributes = cmExpandedList(*extraFileAttributes);
// Store the attributes.
for (const auto& attribute : attributes) {
@@ -904,7 +909,7 @@ void cmGlobalXCodeGenerator::AddXCodeProjBuildRule(
"/CMakeLists.txt");
cmSourceFile* srcCMakeLists = target->Makefile->GetOrCreateSource(
listfile, false, cmSourceFileLocationKind::Known);
- if (!cmContains(sources, srcCMakeLists)) {
+ if (!cm::contains(sources, srcCMakeLists)) {
sources.push_back(srcCMakeLists);
}
}
@@ -993,11 +998,11 @@ cmXCodeObject* cmGlobalXCodeGenerator::CreateXCodeFileReferenceFromPath(
bool useLastKnownFileType = false;
std::string fileType;
if (sf) {
- if (const char* e = sf->GetProperty("XCODE_EXPLICIT_FILE_TYPE")) {
- fileType = e;
- } else if (const char* l = sf->GetProperty("XCODE_LAST_KNOWN_FILE_TYPE")) {
+ if (cmProp e = sf->GetProperty("XCODE_EXPLICIT_FILE_TYPE")) {
+ fileType = *e;
+ } else if (cmProp l = sf->GetProperty("XCODE_LAST_KNOWN_FILE_TYPE")) {
useLastKnownFileType = true;
- fileType = l;
+ fileType = *l;
}
}
if (fileType.empty()) {
@@ -1420,8 +1425,8 @@ void cmGlobalXCodeGenerator::ForceLinkerLanguage(cmGeneratorTarget* gtgt)
bool cmGlobalXCodeGenerator::IsHeaderFile(cmSourceFile* sf)
{
- return cmContains(this->CMakeInstance->GetHeaderExtensions(),
- sf->GetExtension());
+ return cm::contains(this->CMakeInstance->GetHeaderExtensions(),
+ sf->GetExtension());
}
cmXCodeObject* cmGlobalXCodeGenerator::CreateBuildPhase(
@@ -1462,6 +1467,7 @@ void cmGlobalXCodeGenerator::CreateCustomCommands(
cmStrCat("$<TARGET_SONAME_FILE:", gtgt->GetName(), '>');
std::string str_link_file =
cmStrCat("$<TARGET_LINKER_FILE:", gtgt->GetName(), '>');
+ bool stdPipesUTF8 = true;
cmCustomCommandLines cmd = cmMakeSingleCommandLine(
{ cmSystemTools::GetCMakeCommand(), "-E", "cmake_symlink_library",
str_file, str_so_file, str_link_file });
@@ -1469,7 +1475,7 @@ void cmGlobalXCodeGenerator::CreateCustomCommands(
cmCustomCommand command(
std::vector<std::string>(), std::vector<std::string>(),
std::vector<std::string>(), cmd, this->CurrentMakefile->GetBacktrace(),
- "Creating symlinks", "");
+ "Creating symlinks", "", stdPipesUTF8);
postbuild.push_back(std::move(command));
}
@@ -1859,18 +1865,18 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmGeneratorTarget* gtgt,
if (gtgt->GetType() == cmStateEnums::OBJECT_LIBRARY ||
gtgt->GetType() == cmStateEnums::STATIC_LIBRARY) {
this->CurrentLocalGenerator->GetStaticLibraryFlags(
- extraLinkOptions, cmSystemTools::UpperCase(configName), llang, gtgt);
+ extraLinkOptions, configName, llang, gtgt);
} else {
- const char* targetLinkFlags = gtgt->GetProperty("LINK_FLAGS");
+ cmProp targetLinkFlags = gtgt->GetProperty("LINK_FLAGS");
if (targetLinkFlags) {
this->CurrentLocalGenerator->AppendFlags(extraLinkOptions,
- targetLinkFlags);
+ *targetLinkFlags);
}
if (!configName.empty()) {
std::string linkFlagsVar =
cmStrCat("LINK_FLAGS_", cmSystemTools::UpperCase(configName));
- if (const char* linkFlags = gtgt->GetProperty(linkFlagsVar)) {
- this->CurrentLocalGenerator->AppendFlags(extraLinkOptions, linkFlags);
+ if (cmProp linkFlags = gtgt->GetProperty(linkFlagsVar)) {
+ this->CurrentLocalGenerator->AppendFlags(extraLinkOptions, *linkFlags);
}
}
std::vector<std::string> opts;
@@ -1906,8 +1912,8 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmGeneratorTarget* gtgt,
std::string pnsuffix;
gtgt->GetFullNameComponents(pnprefix, pnbase, pnsuffix, configName);
- const char* version = gtgt->GetProperty("VERSION");
- const char* soversion = gtgt->GetProperty("SOVERSION");
+ cmProp version = gtgt->GetProperty("VERSION");
+ cmProp soversion = gtgt->GetProperty("SOVERSION");
if (!gtgt->HasSOName(configName) || gtgt->IsFrameworkOnApple()) {
version = nullptr;
soversion = nullptr;
@@ -1923,9 +1929,9 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmGeneratorTarget* gtgt,
std::string soName = pnbase;
if (version && soversion) {
realName += ".";
- realName += version;
+ realName += *version;
soName += ".";
- soName += soversion;
+ soName += *soversion;
}
// Set attributes to specify the proper name for the target.
@@ -1971,10 +1977,10 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmGeneratorTarget* gtgt,
std::string fw_version = gtgt->GetFrameworkVersion();
buildSettings->AddAttribute("FRAMEWORK_VERSION",
this->CreateString(fw_version));
- const char* ext = gtgt->GetProperty("BUNDLE_EXTENSION");
+ cmProp ext = gtgt->GetProperty("BUNDLE_EXTENSION");
if (ext) {
buildSettings->AddAttribute("WRAPPER_EXTENSION",
- this->CreateString(ext));
+ this->CreateString(*ext));
}
std::string plist = this->ComputeInfoPListLocation(gtgt);
@@ -2012,10 +2018,10 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmGeneratorTarget* gtgt,
extraLinkOptions += " ";
extraLinkOptions += createFlags;
}
- const char* ext = gtgt->GetProperty("BUNDLE_EXTENSION");
+ cmProp ext = gtgt->GetProperty("BUNDLE_EXTENSION");
if (ext) {
buildSettings->AddAttribute("WRAPPER_EXTENSION",
- this->CreateString(ext));
+ this->CreateString(*ext));
}
std::string plist = this->ComputeInfoPListLocation(gtgt);
// Xcode will create the final version of Info.plist at build time,
@@ -2046,10 +2052,10 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmGeneratorTarget* gtgt,
std::string fw_version = gtgt->GetFrameworkVersion();
buildSettings->AddAttribute("FRAMEWORK_VERSION",
this->CreateString(fw_version));
- const char* ext = gtgt->GetProperty("BUNDLE_EXTENSION");
+ cmProp ext = gtgt->GetProperty("BUNDLE_EXTENSION");
if (ext) {
buildSettings->AddAttribute("WRAPPER_EXTENSION",
- this->CreateString(ext));
+ this->CreateString(*ext));
}
std::string plist = this->ComputeInfoPListLocation(gtgt);
@@ -2085,10 +2091,10 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmGeneratorTarget* gtgt,
// Handle bundles and normal executables separately.
if (gtgt->GetPropertyAsBool("MACOSX_BUNDLE")) {
- const char* ext = gtgt->GetProperty("BUNDLE_EXTENSION");
+ cmProp ext = gtgt->GetProperty("BUNDLE_EXTENSION");
if (ext) {
buildSettings->AddAttribute("WRAPPER_EXTENSION",
- this->CreateString(ext));
+ this->CreateString(*ext));
}
std::string plist = this->ComputeInfoPListLocation(gtgt);
// Xcode will create the final version of Info.plist at build time,
@@ -2283,7 +2289,7 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmGeneratorTarget* gtgt,
// Add Fortran source format attribute if property is set.
const char* format = nullptr;
- const char* tgtfmt = gtgt->GetProperty("Fortran_FORMAT");
+ std::string const& tgtfmt = gtgt->GetSafeProperty("Fortran_FORMAT");
switch (cmOutputConverter::GetFortranFormat(tgtfmt)) {
case cmOutputConverter::FortranFormatFixed:
format = "fixed";
@@ -2406,12 +2412,13 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmGeneratorTarget* gtgt,
// Convert "XCODE_ATTRIBUTE_*" properties directly.
{
for (auto const& prop : gtgt->GetPropertyKeys()) {
- if (prop.find("XCODE_ATTRIBUTE_") == 0) {
+ if (cmHasLiteralPrefix(prop, "XCODE_ATTRIBUTE_")) {
std::string attribute = prop.substr(16);
this->FilterConfigurationAttribute(configName, attribute);
if (!attribute.empty()) {
+ std::string const& pr = gtgt->GetSafeProperty(prop);
std::string processed = cmGeneratorExpression::Evaluate(
- gtgt->GetProperty(prop), this->CurrentLocalGenerator, configName);
+ pr, this->CurrentLocalGenerator, configName);
buildSettings->AddAttribute(attribute,
this->CreateString(processed));
}
@@ -2530,8 +2537,8 @@ const char* cmGlobalXCodeGenerator::GetTargetLinkFlagsVar(
const char* cmGlobalXCodeGenerator::GetTargetFileType(
cmGeneratorTarget* target)
{
- if (const char* e = target->GetProperty("XCODE_EXPLICIT_FILE_TYPE")) {
- return e;
+ if (cmProp e = target->GetProperty("XCODE_EXPLICIT_FILE_TYPE")) {
+ return e->c_str();
}
switch (target->GetType()) {
@@ -2563,8 +2570,8 @@ const char* cmGlobalXCodeGenerator::GetTargetFileType(
const char* cmGlobalXCodeGenerator::GetTargetProductType(
cmGeneratorTarget* target)
{
- if (const char* e = target->GetProperty("XCODE_PRODUCT_TYPE")) {
- return e;
+ if (cmProp e = target->GetProperty("XCODE_PRODUCT_TYPE")) {
+ return e->c_str();
}
switch (target->GetType()) {
@@ -3141,12 +3148,12 @@ bool cmGlobalXCodeGenerator::CreateXCodeObjects(
// Put this last so it can override existing settings
// Convert "CMAKE_XCODE_ATTRIBUTE_*" variables directly.
for (const auto& var : this->CurrentMakefile->GetDefinitions()) {
- if (var.find("CMAKE_XCODE_ATTRIBUTE_") == 0) {
+ if (cmHasLiteralPrefix(var, "CMAKE_XCODE_ATTRIBUTE_")) {
std::string attribute = var.substr(22);
this->FilterConfigurationAttribute(config.first, attribute);
if (!attribute.empty()) {
std::string processed = cmGeneratorExpression::Evaluate(
- this->CurrentMakefile->GetDefinition(var),
+ this->CurrentMakefile->GetSafeDefinition(var),
this->CurrentLocalGenerator, config.first);
buildSettingsForCfg->AddAttribute(attribute,
this->CreateString(processed));
@@ -3390,7 +3397,7 @@ bool cmGlobalXCodeGenerator::OutputXCodeSharedSchemes(
// collect all tests for the targets
std::map<std::string, cmXCodeScheme::TestObjects> testables;
- for (auto obj : this->XCodeObjects) {
+ for (const auto& obj : this->XCodeObjects) {
if (obj->GetType() != cmXCodeObject::OBJECT ||
obj->GetIsA() != cmXCodeObject::PBXNativeTarget) {
continue;
@@ -3400,12 +3407,12 @@ bool cmGlobalXCodeGenerator::OutputXCodeSharedSchemes(
continue;
}
- const char* testee = obj->GetTarget()->GetProperty("XCTEST_TESTEE");
+ cmProp testee = obj->GetTarget()->GetProperty("XCTEST_TESTEE");
if (!testee) {
continue;
}
- testables[testee].push_back(obj);
+ testables[*testee].push_back(obj.get());
}
// generate scheme
@@ -3414,14 +3421,14 @@ bool cmGlobalXCodeGenerator::OutputXCodeSharedSchemes(
// Since the lowest available Xcode version for testing was 6.4,
// I'm setting this as a limit then
if (this->XcodeVersion >= 64) {
- for (auto obj : this->XCodeObjects) {
+ for (const auto& obj : this->XCodeObjects) {
if (obj->GetType() == cmXCodeObject::OBJECT &&
(obj->GetIsA() == cmXCodeObject::PBXNativeTarget ||
obj->GetIsA() == cmXCodeObject::PBXAggregateTarget) &&
(root->GetMakefile()->GetCMakeInstance()->GetIsInTryCompile() ||
obj->GetTarget()->GetPropertyAsBool("XCODE_GENERATE_SCHEME"))) {
const std::string& targetName = obj->GetTarget()->GetName();
- cmXCodeScheme schm(root, obj, testables[targetName],
+ cmXCodeScheme schm(root, obj.get(), testables[targetName],
this->CurrentConfigurationTypes,
this->XcodeVersion);
schm.WriteXCodeSharedScheme(xcProjDir,
@@ -3547,7 +3554,7 @@ std::string cmGlobalXCodeGenerator::RelativeToBinary(const std::string& p)
std::string cmGlobalXCodeGenerator::XCodeEscapePath(const std::string& p)
{
- if (p.find(' ') != std::string::npos) {
+ if (p.find_first_of(" []") != std::string::npos) {
std::string t = cmStrCat('"', p, '"');
return t;
}
@@ -3693,15 +3700,14 @@ bool cmGlobalXCodeGenerator::HasKnownObjectFileLocation(
bool cmGlobalXCodeGenerator::UseEffectivePlatformName(cmMakefile* mf) const
{
- const char* epnValue =
- this->GetCMakeInstance()->GetState()->GetGlobalProperty(
- "XCODE_EMIT_EFFECTIVE_PLATFORM_NAME");
+ cmProp epnValue = this->GetCMakeInstance()->GetState()->GetGlobalProperty(
+ "XCODE_EMIT_EFFECTIVE_PLATFORM_NAME");
if (!epnValue) {
return mf->PlatformIsAppleEmbedded();
}
- return cmIsOn(epnValue);
+ return cmIsOn(*epnValue);
}
bool cmGlobalXCodeGenerator::ShouldStripResourcePath(cmMakefile*) const
diff --git a/Source/cmGlobalXCodeGenerator.h b/Source/cmGlobalXCodeGenerator.h
index df68f80..e380f1c 100644
--- a/Source/cmGlobalXCodeGenerator.h
+++ b/Source/cmGlobalXCodeGenerator.h
@@ -37,6 +37,10 @@ public:
unsigned int version_number);
static std::unique_ptr<cmGlobalGeneratorFactory> NewFactory();
+ cmGlobalXCodeGenerator(const cmGlobalXCodeGenerator&) = delete;
+ const cmGlobalXCodeGenerator& operator=(const cmGlobalXCodeGenerator&) =
+ delete;
+
//! Get the name for the generator.
std::string GetName() const override
{
@@ -249,7 +253,7 @@ protected:
unsigned int XcodeVersion;
std::string VersionString;
std::set<std::string> XCodeObjectIDs;
- std::vector<cmXCodeObject*> XCodeObjects;
+ std::vector<std::unique_ptr<cmXCodeObject>> XCodeObjects;
cmXCodeObject* RootObject;
private:
@@ -273,7 +277,7 @@ private:
void ComputeArchitectures(cmMakefile* mf);
void ComputeObjectDirArch(cmMakefile* mf);
- void addObject(cmXCodeObject* obj);
+ void addObject(std::unique_ptr<cmXCodeObject> obj);
std::string PostBuildMakeTarget(std::string const& tName,
std::string const& configName);
cmXCodeObject* MainGroupChildren;
diff --git a/Source/cmGraphVizWriter.cxx b/Source/cmGraphVizWriter.cxx
index 1b77678..0fcda4e 100644
--- a/Source/cmGraphVizWriter.cxx
+++ b/Source/cmGraphVizWriter.cxx
@@ -298,13 +298,13 @@ void cmGraphVizWriter::WriteHeader(cmGeneratedFileStream& fs,
const std::string& name)
{
auto const escapedGraphName = EscapeForDotFile(name);
- fs << "digraph \"" << escapedGraphName << "\" {" << std::endl;
- fs << this->GraphHeader << std::endl;
+ fs << "digraph \"" << escapedGraphName << "\" {\n"
+ << this->GraphHeader << '\n';
}
void cmGraphVizWriter::WriteFooter(cmGeneratedFileStream& fs)
{
- fs << "}" << std::endl;
+ fs << "}\n";
}
void cmGraphVizWriter::WriteLegend(cmGeneratedFileStream& fs)
@@ -312,52 +312,46 @@ void cmGraphVizWriter::WriteLegend(cmGeneratedFileStream& fs)
// Note that the subgraph name must start with "cluster", as done here, to
// make Graphviz layout engines do the right thing and keep the nodes
// together.
- fs << "subgraph clusterLegend {" << std::endl;
- fs << " label = \"Legend\";" << std::endl;
- // Set the color of the box surrounding the legend.
- fs << " color = black;" << std::endl;
- // We use invisible edges just to enforce the layout.
- fs << " edge [ style = invis ];" << std::endl;
-
- // Nodes.
- fs << " legendNode0 [ label = \"Executable\", shape = "
- << GRAPHVIZ_NODE_SHAPE_EXECUTABLE << " ];" << std::endl;
-
- fs << " legendNode1 [ label = \"Static Library\", shape = "
- << GRAPHVIZ_NODE_SHAPE_LIBRARY_STATIC << " ];" << std::endl;
- fs << " legendNode2 [ label = \"Shared Library\", shape = "
- << GRAPHVIZ_NODE_SHAPE_LIBRARY_SHARED << " ];" << std::endl;
- fs << " legendNode3 [ label = \"Module Library\", shape = "
- << GRAPHVIZ_NODE_SHAPE_LIBRARY_MODULE << " ];" << std::endl;
-
- fs << " legendNode4 [ label = \"Interface Library\", shape = "
- << GRAPHVIZ_NODE_SHAPE_LIBRARY_INTERFACE << " ];" << std::endl;
- fs << " legendNode5 [ label = \"Object Library\", shape = "
- << GRAPHVIZ_NODE_SHAPE_LIBRARY_OBJECT << " ];" << std::endl;
- fs << " legendNode6 [ label = \"Unknown Library\", shape = "
- << GRAPHVIZ_NODE_SHAPE_LIBRARY_UNKNOWN << " ];" << std::endl;
-
- fs << " legendNode7 [ label = \"Custom Target\", shape = "
- << GRAPHVIZ_NODE_SHAPE_UTILITY << " ];" << std::endl;
-
- // Edges.
- // Some of those are dummy (invisible) edges to enforce a layout.
- fs << " legendNode0 -> legendNode1 [ style = " << GRAPHVIZ_EDGE_STYLE_PUBLIC
- << " ];" << std::endl;
- fs << " legendNode0 -> legendNode2 [ style = " << GRAPHVIZ_EDGE_STYLE_PUBLIC
- << " ];" << std::endl;
- fs << " legendNode0 -> legendNode3;" << std::endl;
-
- fs << " legendNode1 -> legendNode4 [ label = \"Interface\", style = "
- << GRAPHVIZ_EDGE_STYLE_INTERFACE << " ];" << std::endl;
- fs << " legendNode2 -> legendNode5 [ label = \"Private\", style = "
- << GRAPHVIZ_EDGE_STYLE_PRIVATE << " ];" << std::endl;
- fs << " legendNode3 -> legendNode6 [ style = " << GRAPHVIZ_EDGE_STYLE_PUBLIC
- << " ];" << std::endl;
-
- fs << " legendNode0 -> legendNode7;" << std::endl;
-
- fs << "}" << std::endl;
+ /* clang-format off */
+ fs << "subgraph clusterLegend {\n"
+ " label = \"Legend\";\n"
+ // Set the color of the box surrounding the legend.
+ " color = black;\n"
+ // We use invisible edges just to enforce the layout.
+ " edge [ style = invis ];\n"
+ // Nodes.
+ " legendNode0 [ label = \"Executable\", shape = "
+ << GRAPHVIZ_NODE_SHAPE_EXECUTABLE << " ];\n"
+ " legendNode1 [ label = \"Static Library\", shape = "
+ << GRAPHVIZ_NODE_SHAPE_LIBRARY_STATIC << " ];\n"
+ " legendNode2 [ label = \"Shared Library\", shape = "
+ << GRAPHVIZ_NODE_SHAPE_LIBRARY_SHARED << " ];\n"
+ " legendNode3 [ label = \"Module Library\", shape = "
+ << GRAPHVIZ_NODE_SHAPE_LIBRARY_MODULE << " ];\n"
+ " legendNode4 [ label = \"Interface Library\", shape = "
+ << GRAPHVIZ_NODE_SHAPE_LIBRARY_INTERFACE << " ];\n"
+ " legendNode5 [ label = \"Object Library\", shape = "
+ << GRAPHVIZ_NODE_SHAPE_LIBRARY_OBJECT << " ];\n"
+ " legendNode6 [ label = \"Unknown Library\", shape = "
+ << GRAPHVIZ_NODE_SHAPE_LIBRARY_UNKNOWN << " ];\n"
+ " legendNode7 [ label = \"Custom Target\", shape = "
+ << GRAPHVIZ_NODE_SHAPE_UTILITY << " ];\n"
+ // Edges.
+ // Some of those are dummy (invisible) edges to enforce a layout.
+ " legendNode0 -> legendNode1 [ style = "
+ << GRAPHVIZ_EDGE_STYLE_PUBLIC << " ];\n"
+ " legendNode0 -> legendNode2 [ style = "
+ << GRAPHVIZ_EDGE_STYLE_PUBLIC << " ];\n"
+ " legendNode0 -> legendNode3;\n"
+ " legendNode1 -> legendNode4 [ label = \"Interface\", style = "
+ << GRAPHVIZ_EDGE_STYLE_INTERFACE << " ];\n"
+ " legendNode2 -> legendNode5 [ label = \"Private\", style = "
+ << GRAPHVIZ_EDGE_STYLE_PRIVATE << " ];\n"
+ " legendNode3 -> legendNode6 [ style = "
+ << GRAPHVIZ_EDGE_STYLE_PUBLIC << " ];\n"
+ " legendNode0 -> legendNode7;\n"
+ "}\n";
+ /* clang-format off */
}
void cmGraphVizWriter::WriteNode(cmGeneratedFileStream& fs,
@@ -370,7 +364,7 @@ void cmGraphVizWriter::WriteNode(cmGeneratedFileStream& fs,
auto const escapedLabel = EscapeForDotFile(itemNameWithAliases);
fs << " \"" << nodeName << "\" [ label = \"" << escapedLabel
- << "\", shape = " << getShapeForTarget(item) << " ];" << std::endl;
+ << "\", shape = " << getShapeForTarget(item) << " ];\n";
}
void cmGraphVizWriter::WriteConnection(cmGeneratedFileStream& fs,
@@ -382,11 +376,9 @@ void cmGraphVizWriter::WriteConnection(cmGeneratedFileStream& fs,
auto const& dependeeName = dependee.AsStr();
fs << " \"" << this->NodeNames[dependerName] << "\" -> \""
- << this->NodeNames[dependeeName] << "\" ";
-
- fs << edgeStyle;
-
- fs << " // " << dependerName << " -> " << dependeeName << std::endl;
+ << this->NodeNames[dependeeName] << "\" "
+ << edgeStyle
+ << " // " << dependerName << " -> " << dependeeName << '\n';
}
bool cmGraphVizWriter::ItemExcluded(cmLinkItem const& item)
@@ -402,9 +394,9 @@ bool cmGraphVizWriter::ItemExcluded(cmLinkItem const& item)
}
if (item.Target->GetType() == cmStateEnums::UTILITY) {
- if ((itemName.find("Nightly") == 0) ||
- (itemName.find("Continuous") == 0) ||
- (itemName.find("Experimental") == 0)) {
+ if (cmHasLiteralPrefix(itemName, "Nightly") ||
+ cmHasLiteralPrefix(itemName, "Continuous") ||
+ cmHasLiteralPrefix(itemName, "Experimental")) {
return true;
}
}
diff --git a/Source/cmIfCommand.cxx b/Source/cmIfCommand.cxx
index 290e064..5808f90 100644
--- a/Source/cmIfCommand.cxx
+++ b/Source/cmIfCommand.cxx
@@ -7,8 +7,7 @@
#include <cm/memory>
#include <cm/string_view>
-
-#include "cm_static_string_view.hxx"
+#include <cmext/string_view>
#include "cmConditionEvaluator.h"
#include "cmExecutionStatus.h"
diff --git a/Source/cmIncludeCommand.cxx b/Source/cmIncludeCommand.cxx
index 14264f4..ae801bb 100644
--- a/Source/cmIncludeCommand.cxx
+++ b/Source/cmIncludeCommand.cxx
@@ -2,7 +2,9 @@
file Copyright.txt or https://cmake.org/licensing for details. */
#include "cmIncludeCommand.h"
+#include <map>
#include <sstream>
+#include <utility>
#include "cmExecutionStatus.h"
#include "cmGlobalGenerator.h"
@@ -16,6 +18,11 @@
bool cmIncludeCommand(std::vector<std::string> const& args,
cmExecutionStatus& status)
{
+ static std::map<std::string, cmPolicies::PolicyID> DeprecatedModules;
+ if (DeprecatedModules.empty()) {
+ DeprecatedModules["Documentation"] = cmPolicies::CMP0106;
+ }
+
if (args.empty() || args.size() > 4) {
status.SetError("called with wrong number of arguments. "
"include() only takes one file.");
@@ -65,9 +72,35 @@ bool cmIncludeCommand(std::vector<std::string> const& args,
}
if (!cmSystemTools::FileIsFullPath(fname)) {
+ bool system = false;
// Not a path. Maybe module.
std::string module = cmStrCat(fname, ".cmake");
- std::string mfile = status.GetMakefile().GetModulesFile(module);
+ std::string mfile = status.GetMakefile().GetModulesFile(module, system);
+
+ if (system) {
+ auto ModulePolicy = DeprecatedModules.find(fname);
+ if (ModulePolicy != DeprecatedModules.end()) {
+ cmPolicies::PolicyStatus PolicyStatus =
+ status.GetMakefile().GetPolicyStatus(ModulePolicy->second);
+ switch (PolicyStatus) {
+ case cmPolicies::WARN: {
+ status.GetMakefile().IssueMessage(
+ MessageType::AUTHOR_WARNING,
+ cmStrCat(cmPolicies::GetPolicyWarning(ModulePolicy->second),
+ "\n"));
+ CM_FALLTHROUGH;
+ }
+ case cmPolicies::OLD:
+ break;
+ case cmPolicies::REQUIRED_IF_USED:
+ case cmPolicies::REQUIRED_ALWAYS:
+ case cmPolicies::NEW:
+ mfile = "";
+ break;
+ }
+ }
+ }
+
if (!mfile.empty()) {
fname = mfile;
}
diff --git a/Source/cmInstallCommand.cxx b/Source/cmInstallCommand.cxx
index d669ed7..ac57bc2 100644
--- a/Source/cmInstallCommand.cxx
+++ b/Source/cmInstallCommand.cxx
@@ -8,11 +8,10 @@
#include <utility>
#include <cm/memory>
+#include <cmext/string_view>
#include "cmsys/Glob.hxx"
-#include "cm_static_string_view.hxx"
-
#include "cmArgumentParser.h"
#include "cmExecutionStatus.h"
#include "cmExportSet.h"
@@ -661,7 +660,6 @@ bool HandleTargetsMode(std::vector<std::string> const& args,
// Nothing to do. An INTERFACE_LIBRARY can be installed, but the
// only effect of that is to make it exportable. It installs no
// other files itself.
- break;
default:
// This should never happen due to the above type check.
// Ignore the case.
@@ -680,9 +678,9 @@ bool HandleTargetsMode(std::vector<std::string> const& args,
}
if (createInstallGeneratorsForTargetFileSets && !namelinkOnly) {
- const char* files = target.GetProperty("PRIVATE_HEADER");
- if ((files) && (*files)) {
- std::vector<std::string> relFiles = cmExpandedList(files);
+ cmProp files = target.GetProperty("PRIVATE_HEADER");
+ if (files && !files->empty()) {
+ std::vector<std::string> relFiles = cmExpandedList(*files);
std::vector<std::string> absFiles;
if (!helper.MakeFilesFullPath("PRIVATE_HEADER", relFiles, absFiles)) {
return false;
@@ -703,8 +701,8 @@ bool HandleTargetsMode(std::vector<std::string> const& args,
}
files = target.GetProperty("PUBLIC_HEADER");
- if ((files) && (*files)) {
- std::vector<std::string> relFiles = cmExpandedList(files);
+ if (files && !files->empty()) {
+ std::vector<std::string> relFiles = cmExpandedList(*files);
std::vector<std::string> absFiles;
if (!helper.MakeFilesFullPath("PUBLIC_HEADER", relFiles, absFiles)) {
return false;
@@ -725,8 +723,8 @@ bool HandleTargetsMode(std::vector<std::string> const& args,
}
files = target.GetProperty("RESOURCE");
- if ((files) && (*files)) {
- std::vector<std::string> relFiles = cmExpandedList(files);
+ if (files && !files->empty()) {
+ std::vector<std::string> relFiles = cmExpandedList(*files);
std::vector<std::string> absFiles;
if (!helper.MakeFilesFullPath("RESOURCE", relFiles, absFiles)) {
return false;
diff --git a/Source/cmInstallCommandArguments.cxx b/Source/cmInstallCommandArguments.cxx
index 31ba63f..a034689 100644
--- a/Source/cmInstallCommandArguments.cxx
+++ b/Source/cmInstallCommandArguments.cxx
@@ -4,7 +4,7 @@
#include <utility>
-#include "cm_static_string_view.hxx"
+#include <cmext/string_view>
#include "cmRange.h"
#include "cmSystemTools.h"
diff --git a/Source/cmInstallExportGenerator.cxx b/Source/cmInstallExportGenerator.cxx
index 2c53a28..6e3508c 100644
--- a/Source/cmInstallExportGenerator.cxx
+++ b/Source/cmInstallExportGenerator.cxx
@@ -7,6 +7,8 @@
#include <sstream>
#include <utility>
+#include <cm/memory>
+
#ifndef CMAKE_BOOTSTRAP
# include "cmExportInstallAndroidMKGenerator.h"
#endif
@@ -33,18 +35,15 @@ cmInstallExportGenerator::cmInstallExportGenerator(
{
if (android) {
#ifndef CMAKE_BOOTSTRAP
- this->EFGen = new cmExportInstallAndroidMKGenerator(this);
+ this->EFGen = cm::make_unique<cmExportInstallAndroidMKGenerator>(this);
#endif
} else {
- this->EFGen = new cmExportInstallFileGenerator(this);
+ this->EFGen = cm::make_unique<cmExportInstallFileGenerator>(this);
}
exportSet->AddInstallation(this);
}
-cmInstallExportGenerator::~cmInstallExportGenerator()
-{
- delete this->EFGen;
-}
+cmInstallExportGenerator::~cmInstallExportGenerator() = default;
bool cmInstallExportGenerator::Compute(cmLocalGenerator* lg)
{
diff --git a/Source/cmInstallExportGenerator.h b/Source/cmInstallExportGenerator.h
index cf28b35..43dd00d 100644
--- a/Source/cmInstallExportGenerator.h
+++ b/Source/cmInstallExportGenerator.h
@@ -7,6 +7,7 @@
#include <cstddef>
#include <iosfwd>
+#include <memory>
#include <string>
#include <vector>
@@ -30,8 +31,12 @@ public:
bool exclude_from_all, std::string filename,
std::string name_space, bool exportOld,
bool android);
+ cmInstallExportGenerator(const cmInstallExportGenerator&) = delete;
~cmInstallExportGenerator() override;
+ cmInstallExportGenerator& operator=(const cmInstallExportGenerator&) =
+ delete;
+
cmExportSet* GetExportSet() { return this->ExportSet; }
bool Compute(cmLocalGenerator* lg) override;
@@ -61,7 +66,7 @@ protected:
std::string TempDir;
std::string MainImportFile;
- cmExportInstallFileGenerator* EFGen;
+ std::unique_ptr<cmExportInstallFileGenerator> EFGen;
};
#endif
diff --git a/Source/cmInstallTargetGenerator.cxx b/Source/cmInstallTargetGenerator.cxx
index e05daa8..37d8c28 100644
--- a/Source/cmInstallTargetGenerator.cxx
+++ b/Source/cmInstallTargetGenerator.cxx
@@ -24,6 +24,8 @@
#include "cmTarget.h"
#include "cmake.h"
+using cmProp = const std::string*; // just to silence IWYU
+
cmInstallTargetGenerator::cmInstallTargetGenerator(
std::string targetName, std::string const& dest, bool implib,
std::string file_permissions, std::vector<std::string> const& configurations,
@@ -133,8 +135,10 @@ void cmInstallTargetGenerator::GenerateScriptForConfig(
cmMakefile const* mf = this->Target->Target->GetMakefile();
// Get App Bundle Extension
- const char* ext = this->Target->GetProperty("BUNDLE_EXTENSION");
- if (!ext) {
+ std::string ext;
+ if (cmProp p = this->Target->GetProperty("BUNDLE_EXTENSION")) {
+ ext = *p;
+ } else {
ext = "app";
}
diff --git a/Source/cmInstalledFile.cxx b/Source/cmInstalledFile.cxx
index a65ae03..32395d1 100644
--- a/Source/cmInstalledFile.cxx
+++ b/Source/cmInstalledFile.cxx
@@ -42,7 +42,8 @@ void cmInstalledFile::RemoveProperty(const std::string& prop)
}
void cmInstalledFile::SetProperty(cmMakefile const* mf,
- const std::string& prop, const char* value)
+ const std::string& prop,
+ const std::string& value)
{
this->RemoveProperty(prop);
this->AppendProperty(mf, prop, value);
@@ -50,7 +51,8 @@ void cmInstalledFile::SetProperty(cmMakefile const* mf,
void cmInstalledFile::AppendProperty(cmMakefile const* mf,
const std::string& prop,
- const char* value, bool /*asString*/)
+ const std::string& value,
+ bool /*asString*/)
{
cmListFileBacktrace backtrace = mf->GetBacktrace();
cmGeneratorExpression ge(backtrace);
diff --git a/Source/cmInstalledFile.h b/Source/cmInstalledFile.h
index 698151e..07f7081 100644
--- a/Source/cmInstalledFile.h
+++ b/Source/cmInstalledFile.h
@@ -49,10 +49,10 @@ public:
void RemoveProperty(const std::string& prop);
void SetProperty(cmMakefile const* mf, const std::string& prop,
- const char* value);
+ const std::string& value);
void AppendProperty(cmMakefile const* mf, const std::string& prop,
- const char* value, bool asString = false);
+ const std::string& value, bool asString = false);
bool HasProperty(const std::string& prop) const;
diff --git a/Source/cmJsonObjects.cxx b/Source/cmJsonObjects.cxx
index dd36386..a4f78bc 100644
--- a/Source/cmJsonObjects.cxx
+++ b/Source/cmJsonObjects.cxx
@@ -90,7 +90,8 @@ void cmGetCMakeInputs(const cmGlobalGenerator* gg,
const std::string startOfFile = lf.substr(0, cmakeRootDir.size());
const bool isInternal = (startOfFile == cmakeRootDir);
- const bool isTemporary = !isInternal && (lf.find(buildDir + '/') == 0);
+ const bool isTemporary =
+ !isInternal && (cmHasPrefix(lf, buildDir + '/'));
std::string toAdd = lf;
if (!sourceDir.empty()) {
@@ -274,14 +275,14 @@ static Json::Value DumpSourceFilesList(
std::string compileFlags = ld.Flags;
const std::string COMPILE_FLAGS("COMPILE_FLAGS");
- if (const char* cflags = file->GetProperty(COMPILE_FLAGS)) {
+ if (cmProp cflags = file->GetProperty(COMPILE_FLAGS)) {
lg->AppendFlags(compileFlags,
- genexInterpreter.Evaluate(cflags, COMPILE_FLAGS));
+ genexInterpreter.Evaluate(*cflags, COMPILE_FLAGS));
}
const std::string COMPILE_OPTIONS("COMPILE_OPTIONS");
- if (const char* coptions = file->GetProperty(COMPILE_OPTIONS)) {
+ if (cmProp coptions = file->GetProperty(COMPILE_OPTIONS)) {
lg->AppendCompileOptions(
- compileFlags, genexInterpreter.Evaluate(coptions, COMPILE_OPTIONS));
+ compileFlags, genexInterpreter.Evaluate(*coptions, COMPILE_OPTIONS));
}
fileData.Flags = compileFlags;
@@ -289,9 +290,9 @@ static Json::Value DumpSourceFilesList(
std::vector<std::string> includes;
const std::string INCLUDE_DIRECTORIES("INCLUDE_DIRECTORIES");
- if (const char* cincludes = file->GetProperty(INCLUDE_DIRECTORIES)) {
+ if (cmProp cincludes = file->GetProperty(INCLUDE_DIRECTORIES)) {
const std::string& evaluatedIncludes =
- genexInterpreter.Evaluate(cincludes, INCLUDE_DIRECTORIES);
+ genexInterpreter.Evaluate(*cincludes, INCLUDE_DIRECTORIES);
lg->AppendIncludeDirectories(includes, evaluatedIncludes, *file);
for (const auto& include : includes) {
@@ -308,17 +309,17 @@ static Json::Value DumpSourceFilesList(
const std::string COMPILE_DEFINITIONS("COMPILE_DEFINITIONS");
std::set<std::string> defines;
- if (const char* defs = file->GetProperty(COMPILE_DEFINITIONS)) {
+ if (cmProp defs = file->GetProperty(COMPILE_DEFINITIONS)) {
lg->AppendDefines(
- defines, genexInterpreter.Evaluate(defs, COMPILE_DEFINITIONS));
+ defines, genexInterpreter.Evaluate(*defs, COMPILE_DEFINITIONS));
}
const std::string defPropName =
"COMPILE_DEFINITIONS_" + cmSystemTools::UpperCase(config);
- if (const char* config_defs = file->GetProperty(defPropName)) {
+ if (cmProp config_defs = file->GetProperty(defPropName)) {
lg->AppendDefines(
defines,
- genexInterpreter.Evaluate(config_defs, COMPILE_DEFINITIONS));
+ genexInterpreter.Evaluate(*config_defs, COMPILE_DEFINITIONS));
}
defines.insert(ld.Defines.begin(), ld.Defines.end());
diff --git a/Source/cmJsonObjects.h b/Source/cmJsonObjects.h
index 64291cc..2fd4b26 100644
--- a/Source/cmJsonObjects.h
+++ b/Source/cmJsonObjects.h
@@ -8,7 +8,7 @@
#include <string>
#include <vector>
-#include "cm_jsoncpp_value.h"
+#include <cm3p/json/value.h>
class cmake;
class cmGlobalGenerator;
diff --git a/Source/cmLinkItem.h b/Source/cmLinkItem.h
index 0ea25c0..3d92935 100644
--- a/Source/cmLinkItem.h
+++ b/Source/cmLinkItem.h
@@ -10,7 +10,8 @@
#include <string>
#include <vector>
-#include "cmAlgorithms.h"
+#include <cmext/algorithm>
+
#include "cmListFileCache.h"
#include "cmSystemTools.h"
#include "cmTargetLinkLibraryType.h"
@@ -53,6 +54,9 @@ struct cmLinkImplementationLibraries
// Libraries linked directly in other configurations.
// Needed only for OLD behavior of CMP0003.
std::vector<cmLinkItem> WrongConfigLibraries;
+
+ // Whether the list depends on a genex referencing the configuration.
+ bool HadContextSensitiveCondition = false;
};
struct cmLinkInterfaceLibraries
@@ -62,6 +66,9 @@ struct cmLinkInterfaceLibraries
// Whether the list depends on a genex referencing the head target.
bool HadHeadSensitiveCondition = false;
+
+ // Whether the list depends on a genex referencing the configuration.
+ bool HadContextSensitiveCondition = false;
};
struct cmLinkInterface : public cmLinkInterfaceLibraries
@@ -81,6 +88,9 @@ struct cmLinkInterface : public cmLinkInterfaceLibraries
std::vector<cmLinkItem> WrongConfigLibraries;
bool ImplementationIsInterface = false;
+
+ // Whether the list depends on a link language genex.
+ bool HadLinkLanguageSensitiveCondition = false;
};
struct cmOptionalLinkInterface : public cmLinkInterface
@@ -100,6 +110,9 @@ struct cmLinkImplementation : public cmLinkImplementationLibraries
{
// Languages whose runtime libraries must be linked.
std::vector<std::string> Languages;
+
+ // Whether the list depends on a link language genex.
+ bool HadLinkLanguageSensitiveCondition = false;
};
// Cache link implementation computation from each configuration.
@@ -121,7 +134,7 @@ inline cmTargetLinkLibraryType CMP0003_ComputeLinkType(
// Check if any entry in the list matches this configuration.
std::string configUpper = cmSystemTools::UpperCase(config);
- if (cmContains(debugConfigs, configUpper)) {
+ if (cm::contains(debugConfigs, configUpper)) {
return DEBUG_LibraryType;
}
// The current configuration is not a debug configuration.
diff --git a/Source/cmLinkLineDeviceComputer.cxx b/Source/cmLinkLineDeviceComputer.cxx
index 65ed34c..eebf328 100644
--- a/Source/cmLinkLineDeviceComputer.cxx
+++ b/Source/cmLinkLineDeviceComputer.cxx
@@ -6,7 +6,8 @@
#include <set>
#include <utility>
-#include "cmAlgorithms.h"
+#include <cmext/algorithm>
+
#include "cmComputeLinkInformation.h"
#include "cmGeneratorTarget.h"
#include "cmGlobalGenerator.h"
@@ -176,11 +177,11 @@ bool requireDeviceLinking(cmGeneratorTarget& target, cmLocalGenerator& lg,
return false;
}
- if (const char* resolveDeviceSymbols =
+ if (cmProp resolveDeviceSymbols =
target.GetProperty("CUDA_RESOLVE_DEVICE_SYMBOLS")) {
// If CUDA_RESOLVE_DEVICE_SYMBOLS has been explicitly set we need
// to honor the value no matter what it is.
- return cmIsOn(resolveDeviceSymbols);
+ return cmIsOn(*resolveDeviceSymbols);
}
// Determine if we have any dependencies that require
@@ -188,10 +189,10 @@ bool requireDeviceLinking(cmGeneratorTarget& target, cmLocalGenerator& lg,
cmGeneratorTarget::LinkClosure const* closure =
target.GetLinkClosure(config);
- if (cmContains(closure->Languages, "CUDA")) {
- if (const char* separableCompilation =
+ if (cm::contains(closure->Languages, "CUDA")) {
+ if (cmProp separableCompilation =
target.GetProperty("CUDA_SEPARABLE_COMPILATION")) {
- if (cmIsOn(separableCompilation)) {
+ if (cmIsOn(*separableCompilation)) {
bool doDeviceLinking = false;
switch (target.GetType()) {
case cmStateEnums::SHARED_LIBRARY:
diff --git a/Source/cmListCommand.cxx b/Source/cmListCommand.cxx
index 5200a16..edec613 100644
--- a/Source/cmListCommand.cxx
+++ b/Source/cmListCommand.cxx
@@ -16,11 +16,11 @@
#include <vector>
#include <cm/memory>
+#include <cmext/algorithm>
+#include <cmext/string_view>
#include "cmsys/RegularExpression.hxx"
-#include "cm_static_string_view.hxx"
-
#include "cmAlgorithms.h"
#include "cmExecutionStatus.h"
#include "cmGeneratorExpression.h"
@@ -66,7 +66,7 @@ bool GetList(std::vector<std::string>& list, const std::string& var,
// expand the variable into a list
cmExpandList(listString, list, true);
// if no empty elements then just return
- if (!cmContains(list, std::string())) {
+ if (!cm::contains(list, std::string())) {
return true;
}
// if we have empty elements we need to check policy CMP0007
@@ -1051,6 +1051,7 @@ public:
UNINITIALIZED,
STRING,
FILE_BASENAME,
+ NATURAL,
};
enum class CaseSensitivity
{
@@ -1074,10 +1075,25 @@ protected:
: nullptr;
}
+ using ComparisonFunction =
+ std::function<bool(const std::string&, const std::string&)>;
+ ComparisonFunction GetComparisonFunction(Compare compare)
+ {
+ if (compare == Compare::NATURAL) {
+ return std::function<bool(const std::string&, const std::string&)>(
+ [](const std::string& x, const std::string& y) {
+ return cmSystemTools::strverscmp(x, y) < 0;
+ });
+ }
+ return std::function<bool(const std::string&, const std::string&)>(
+ [](const std::string& x, const std::string& y) { return x < y; });
+ }
+
public:
cmStringSorter(Compare compare, CaseSensitivity caseSensitivity,
Order desc = Order::ASCENDING)
: filters{ GetCompareFilter(compare), GetCaseFilter(caseSensitivity) }
+ , sortMethod(GetComparisonFunction(compare))
, descending(desc == Order::DESCENDING)
{
}
@@ -1099,15 +1115,16 @@ public:
std::string bf = ApplyFilter(b);
bool result;
if (descending) {
- result = bf < af;
+ result = sortMethod(bf, af);
} else {
- result = af < bf;
+ result = sortMethod(af, bf);
}
return result;
}
protected:
StringFilter filters[2] = { nullptr, nullptr };
+ ComparisonFunction sortMethod;
bool descending;
};
@@ -1142,6 +1159,8 @@ bool HandleSortCommand(std::vector<std::string> const& args,
sortCompare = cmStringSorter::Compare::STRING;
} else if (argument == "FILE_BASENAME") {
sortCompare = cmStringSorter::Compare::FILE_BASENAME;
+ } else if (argument == "NATURAL") {
+ sortCompare = cmStringSorter::Compare::NATURAL;
} else {
std::string error =
cmStrCat(messageHint, "value \"", argument, "\" for option \"",
diff --git a/Source/cmListFileCache.cxx b/Source/cmListFileCache.cxx
index 47679c9..7ebb02f 100644
--- a/Source/cmListFileCache.cxx
+++ b/Source/cmListFileCache.cxx
@@ -26,13 +26,15 @@ cmCommandContext::cmCommandName& cmCommandContext::cmCommandName::operator=(
struct cmListFileParser
{
cmListFileParser(cmListFile* lf, cmListFileBacktrace lfbt,
- cmMessenger* messenger, const char* filename);
+ cmMessenger* messenger);
~cmListFileParser();
cmListFileParser(const cmListFileParser&) = delete;
cmListFileParser& operator=(const cmListFileParser&) = delete;
void IssueFileOpenError(std::string const& text) const;
void IssueError(std::string const& text) const;
- bool ParseFile();
+ bool ParseFile(const char* filename);
+ bool ParseString(const char* str, const char* virtual_filename);
+ bool Parse();
bool ParseFunction(const char* name, long line);
bool AddArgument(cmListFileLexer_Token* token,
cmListFileArgument::Delimiter delim);
@@ -51,12 +53,11 @@ struct cmListFileParser
};
cmListFileParser::cmListFileParser(cmListFile* lf, cmListFileBacktrace lfbt,
- cmMessenger* messenger,
- const char* filename)
+ cmMessenger* messenger)
: ListFile(lf)
, Backtrace(std::move(lfbt))
, Messenger(messenger)
- , FileName(filename)
+ , FileName(nullptr)
, Lexer(cmListFileLexer_New())
{
}
@@ -83,8 +84,10 @@ void cmListFileParser::IssueError(const std::string& text) const
cmSystemTools::SetFatalErrorOccured();
}
-bool cmListFileParser::ParseFile()
+bool cmListFileParser::ParseFile(const char* filename)
{
+ this->FileName = filename;
+
// Open the file.
cmListFileLexer_BOM bom;
if (!cmListFileLexer_SetFileName(this->Lexer, this->FileName, &bom)) {
@@ -107,6 +110,24 @@ bool cmListFileParser::ParseFile()
return false;
}
+ return Parse();
+}
+
+bool cmListFileParser::ParseString(const char* str,
+ const char* virtual_filename)
+{
+ this->FileName = virtual_filename;
+
+ if (!cmListFileLexer_SetString(this->Lexer, str)) {
+ this->IssueFileOpenError("cmListFileCache: cannot allocate buffer.");
+ return false;
+ }
+
+ return Parse();
+}
+
+bool cmListFileParser::Parse()
+{
// Use a simple recursive-descent parser to process the token
// stream.
bool haveNewline = true;
@@ -155,8 +176,22 @@ bool cmListFile::ParseFile(const char* filename, cmMessenger* messenger,
bool parseError = false;
{
- cmListFileParser parser(this, lfbt, messenger, filename);
- parseError = !parser.ParseFile();
+ cmListFileParser parser(this, lfbt, messenger);
+ parseError = !parser.ParseFile(filename);
+ }
+
+ return !parseError;
+}
+
+bool cmListFile::ParseString(const char* str, const char* virtual_filename,
+ cmMessenger* messenger,
+ const cmListFileBacktrace& lfbt)
+{
+ bool parseError = false;
+
+ {
+ cmListFileParser parser(this, lfbt, messenger);
+ parseError = !parser.ParseString(str, virtual_filename);
}
return !parseError;
diff --git a/Source/cmListFileCache.h b/Source/cmListFileCache.h
index 9cae827..89902ff 100644
--- a/Source/cmListFileCache.h
+++ b/Source/cmListFileCache.h
@@ -184,6 +184,9 @@ struct cmListFile
bool ParseFile(const char* path, cmMessenger* messenger,
cmListFileBacktrace const& lfbt);
+ bool ParseString(const char* str, const char* virtual_filename,
+ cmMessenger* messenger, cmListFileBacktrace const& lfbt);
+
std::vector<cmListFileFunction> Functions;
};
diff --git a/Source/cmLoadCommandCommand.cxx b/Source/cmLoadCommandCommand.cxx
index 92258e2..5790e16 100644
--- a/Source/cmLoadCommandCommand.cxx
+++ b/Source/cmLoadCommandCommand.cxx
@@ -1,5 +1,15 @@
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
+
+#if !defined(_WIN32) && !defined(__sun)
+// POSIX APIs are needed
+# define _POSIX_C_SOURCE 200809L
+#endif
+#if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__NetBSD__)
+// For isascii
+# define _XOPEN_SOURCE 700
+#endif
+
#include "cmLoadCommandCommand.h"
#include <csignal>
diff --git a/Source/cmLocalCommonGenerator.cxx b/Source/cmLocalCommonGenerator.cxx
index 025ef7e..278ec8b 100644
--- a/Source/cmLocalCommonGenerator.cxx
+++ b/Source/cmLocalCommonGenerator.cxx
@@ -50,6 +50,15 @@ std::string cmLocalCommonGenerator::GetTargetFortranFlags(
this->Makefile->GetRequiredDefinition("CMAKE_Fortran_MODDIR_FLAG"),
mod_dir);
this->AppendFlags(flags, modflag);
+ // Some compilers do not search their own module output directory
+ // for using other modules. Add an include directory explicitly
+ // for consistency with compilers that do search it.
+ std::string incflag =
+ this->Makefile->GetSafeDefinition("CMAKE_Fortran_MODDIR_INCLUDE_FLAG");
+ if (!incflag.empty()) {
+ incflag = cmStrCat(incflag, mod_dir);
+ this->AppendFlags(flags, incflag);
+ }
}
// If there is a separate module path flag then duplicate the
diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx
index f592b7b..ad1cbd8 100644
--- a/Source/cmLocalGenerator.cxx
+++ b/Source/cmLocalGenerator.cxx
@@ -6,7 +6,6 @@
#include <cassert>
#include <cstdio>
#include <cstdlib>
-#include <cstring>
#include <initializer_list>
#include <iterator>
#include <sstream>
@@ -20,7 +19,6 @@
#include "cmsys/RegularExpression.hxx"
-#include "cmAlgorithms.h"
#include "cmComputeLinkInformation.h"
#include "cmCustomCommand.h"
#include "cmCustomCommandGenerator.h"
@@ -35,7 +33,6 @@
#include "cmInstallScriptGenerator.h"
#include "cmInstallTargetGenerator.h"
#include "cmLinkLineComputer.h"
-#include "cmLinkLineDeviceComputer.h"
#include "cmMakefile.h"
#include "cmRulePlaceholderExpander.h"
#include "cmSourceFile.h"
@@ -310,29 +307,35 @@ void cmLocalGenerator::GenerateTestFiles()
cmGeneratedFileStream fout(file);
fout.SetCopyIfDifferent(true);
- fout << "# CMake generated Testfile for " << std::endl
- << "# Source directory: "
- << this->StateSnapshot.GetDirectory().GetCurrentSource() << std::endl
- << "# Build directory: "
- << this->StateSnapshot.GetDirectory().GetCurrentBinary() << std::endl
- << "# " << std::endl
- << "# This file includes the relevant testing commands "
- << "required for " << std::endl
- << "# testing this directory and lists subdirectories to "
- << "be tested as well." << std::endl;
-
- const char* testIncludeFile =
- this->Makefile->GetProperty("TEST_INCLUDE_FILE");
+ fout << "# CMake generated Testfile for \n"
+ "# Source directory: "
+ << this->StateSnapshot.GetDirectory().GetCurrentSource()
+ << "\n"
+ "# Build directory: "
+ << this->StateSnapshot.GetDirectory().GetCurrentBinary()
+ << "\n"
+ "# \n"
+ "# This file includes the relevant testing commands "
+ "required for \n"
+ "# testing this directory and lists subdirectories to "
+ "be tested as well.\n";
+
+ std::string resourceSpecFile =
+ this->Makefile->GetSafeDefinition("CTEST_RESOURCE_SPEC_FILE");
+ if (!resourceSpecFile.empty()) {
+ fout << "set(CTEST_RESOURCE_SPEC_FILE \"" << resourceSpecFile << "\")\n";
+ }
+
+ cmProp testIncludeFile = this->Makefile->GetProperty("TEST_INCLUDE_FILE");
if (testIncludeFile) {
- fout << "include(\"" << testIncludeFile << "\")" << std::endl;
+ fout << "include(\"" << *testIncludeFile << "\")\n";
}
- const char* testIncludeFiles =
- this->Makefile->GetProperty("TEST_INCLUDE_FILES");
+ cmProp testIncludeFiles = this->Makefile->GetProperty("TEST_INCLUDE_FILES");
if (testIncludeFiles) {
- std::vector<std::string> includesList = cmExpandedList(testIncludeFiles);
+ std::vector<std::string> includesList = cmExpandedList(*testIncludeFiles);
for (std::string const& i : includesList) {
- fout << "include(\"" << i << "\")" << std::endl;
+ fout << "include(\"" << i << "\")\n";
}
}
@@ -349,18 +352,18 @@ void cmLocalGenerator::GenerateTestFiles()
std::string outP = i.GetDirectory().GetCurrentBinary();
outP = this->MaybeConvertToRelativePath(parentBinDir, outP);
outP = cmOutputConverter::EscapeForCMake(outP);
- fout << "subdirs(" << outP << ")" << std::endl;
+ fout << "subdirs(" << outP << ")\n";
}
// Add directory labels property
const char* directoryLabels =
this->Makefile->GetDefinition("CMAKE_DIRECTORY_LABELS");
- const char* labels = this->Makefile->GetProperty("LABELS");
+ cmProp labels = this->Makefile->GetProperty("LABELS");
if (labels || directoryLabels) {
fout << "set_directory_properties(PROPERTIES LABELS ";
if (labels) {
- fout << cmOutputConverter::EscapeForCMake(labels);
+ fout << cmOutputConverter::EscapeForCMake(*labels);
}
if (labels && directoryLabels) {
fout << ";";
@@ -368,7 +371,7 @@ void cmLocalGenerator::GenerateTestFiles()
if (directoryLabels) {
fout << cmOutputConverter::EscapeForCMake(directoryLabels);
}
- fout << ")" << std::endl;
+ fout << ")\n";
}
}
@@ -489,16 +492,17 @@ void cmLocalGenerator::GenerateInstallRules()
fout.SetCopyIfDifferent(true);
// Write the header.
+ /* clang-format off */
fout << "# Install script for directory: "
- << this->StateSnapshot.GetDirectory().GetCurrentSource() << std::endl
- << std::endl;
- fout << "# Set the install prefix" << std::endl
- << "if(NOT DEFINED CMAKE_INSTALL_PREFIX)" << std::endl
- << " set(CMAKE_INSTALL_PREFIX \"" << prefix << "\")" << std::endl
- << "endif()" << std::endl
+ << this->StateSnapshot.GetDirectory().GetCurrentSource()
+ << "\n\n"
+ "# Set the install prefix\n"
+ "if(NOT DEFINED CMAKE_INSTALL_PREFIX)\n"
+ " set(CMAKE_INSTALL_PREFIX \"" << prefix << "\")\n"
+ "endif()\n"
<< R"(string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX )"
- << "\"${CMAKE_INSTALL_PREFIX}\")" << std::endl
- << std::endl;
+ << "\"${CMAKE_INSTALL_PREFIX}\")\n\n";
+ /* clang-format on */
// Write support code for generating per-configuration install rules.
/* clang-format off */
@@ -572,6 +576,71 @@ void cmLocalGenerator::GenerateInstallRules()
/* clang-format on */
}
+ // Write out CMAKE_GET_RUNTIME_DEPENDENCIES_PLATFORM so that
+ // installed code that uses `file(GET_RUNTIME_DEPENDENCIES)`
+ // has same platform variable as when running cmake
+ if (const char* platform = this->Makefile->GetDefinition(
+ "CMAKE_GET_RUNTIME_DEPENDENCIES_PLATFORM")) {
+ /* clang-format off */
+ fout <<
+ "# Set default install directory permissions.\n"
+ "if(NOT DEFINED CMAKE_GET_RUNTIME_DEPENDENCIES_PLATFORM)\n"
+ " set(CMAKE_GET_RUNTIME_DEPENDENCIES_PLATFORM \""
+ << platform << "\")\n"
+ "endif()\n"
+ "\n";
+ /* clang-format on */
+ }
+
+ // Write out CMAKE_GET_RUNTIME_DEPENDENCIES_TOOL so that
+ // installed code that uses `file(GET_RUNTIME_DEPENDENCIES)`
+ // has same tool selected as when running cmake
+ if (const char* command =
+ this->Makefile->GetDefinition("CMAKE_GET_RUNTIME_DEPENDENCIES_TOOL")) {
+ /* clang-format off */
+ fout <<
+ "# Set default install directory permissions.\n"
+ "if(NOT DEFINED CMAKE_GET_RUNTIME_DEPENDENCIES_TOOL)\n"
+ " set(CMAKE_GET_RUNTIME_DEPENDENCIES_TOOL \""
+ << command << "\")\n"
+ "endif()\n"
+ "\n";
+ /* clang-format on */
+ }
+
+ // Write out CMAKE_GET_RUNTIME_DEPENDENCIES_COMMAND so that
+ // installed code that uses `file(GET_RUNTIME_DEPENDENCIES)`
+ // has same path to the tool as when running cmake
+ if (const char* command = this->Makefile->GetDefinition(
+ "CMAKE_GET_RUNTIME_DEPENDENCIES_COMMAND")) {
+ /* clang-format off */
+ fout <<
+ "# Set default install directory permissions.\n"
+ "if(NOT DEFINED CMAKE_GET_RUNTIME_DEPENDENCIES_COMMAND)\n"
+ " set(CMAKE_GET_RUNTIME_DEPENDENCIES_COMMAND \""
+ << command << "\")\n"
+ "endif()\n"
+ "\n";
+ /* clang-format on */
+ }
+
+ // Write out CMAKE_OBJDUMP so that installed code that uses
+ // `file(GET_RUNTIME_DEPENDENCIES)` and hasn't specified
+ // CMAKE_GET_RUNTIME_DEPENDENCIES_COMMAND has consistent
+ // logic to fallback to CMAKE_OBJDUMP when `objdump` is
+ // not on the path
+ if (const char* command = this->Makefile->GetDefinition("CMAKE_OBJDUMP")) {
+ /* clang-format off */
+ fout <<
+ "# Set default install directory permissions.\n"
+ "if(NOT DEFINED CMAKE_OBJDUMP)\n"
+ " set(CMAKE_OBJDUMP \""
+ << command << "\")\n"
+ "endif()\n"
+ "\n";
+ /* clang-format on */
+ }
+
// Ask each install generator to write its code.
cmPolicies::PolicyStatus status = this->GetPolicyStatus(cmPolicies::CMP0082);
auto const& installers = this->Makefile->GetInstallGenerators();
@@ -613,8 +682,7 @@ void cmLocalGenerator::GenerateInstallRules()
if (!c.GetDirectory().GetPropertyAsBool("EXCLUDE_FROM_ALL")) {
std::string odir = c.GetDirectory().GetCurrentBinary();
cmSystemTools::ConvertToUnixSlashes(odir);
- fout << " include(\"" << odir << "/cmake_install.cmake\")"
- << std::endl;
+ fout << " include(\"" << odir << "/cmake_install.cmake\")\n";
}
}
fout << "\n";
@@ -736,14 +804,14 @@ bool cmLocalGenerator::ComputeTargetCompileFeatures()
if (target->GetType() != cmStateEnums::INTERFACE_LIBRARY) {
auto copyStandardToObjLang = [&](LanguagePair const& lang) -> bool {
if (!target->GetProperty(cmStrCat(lang.first, "_STANDARD"))) {
- auto* standard =
+ cmProp standard =
target->GetProperty(cmStrCat(lang.second, "_STANDARD"));
if (!standard) {
- standard = this->Makefile->GetDefinition(
+ standard = this->Makefile->GetDef(
cmStrCat("CMAKE_", lang.second, "_STANDARD_DEFAULT"));
}
target->Target->SetProperty(cmStrCat(lang.first, "_STANDARD"),
- standard);
+ standard ? standard->c_str() : nullptr);
return true;
}
return false;
@@ -752,9 +820,9 @@ bool cmLocalGenerator::ComputeTargetCompileFeatures()
const char* property) {
if (!target->GetProperty(cmStrCat(lang.first, property)) &&
target->GetProperty(cmStrCat(lang.second, property))) {
- target->Target->SetProperty(
- cmStrCat(lang.first, property),
- target->GetProperty(cmStrCat(lang.second, property)));
+ cmProp p = target->GetProperty(cmStrCat(lang.second, property));
+ target->Target->SetProperty(cmStrCat(lang.first, property),
+ p ? p->c_str() : nullptr);
}
};
for (auto const& lang : pairedLanguages) {
@@ -763,8 +831,8 @@ bool cmLocalGenerator::ComputeTargetCompileFeatures()
copyPropertyToObjLang(lang, "_EXTENSIONS");
}
}
- if (const char* standard = target->GetProperty("CUDA_STANDARD")) {
- if (std::string{ standard } == "98") {
+ if (cmProp standard = target->GetProperty("CUDA_STANDARD")) {
+ if (*standard == "98") {
target->Target->SetProperty("CUDA_STANDARD", "03");
}
}
@@ -792,10 +860,13 @@ cmStateSnapshot cmLocalGenerator::GetStateSnapshot() const
const char* cmLocalGenerator::GetRuleLauncher(cmGeneratorTarget* target,
const std::string& prop)
{
+ cmProp p;
if (target) {
- return target->GetProperty(prop);
+ p = target->GetProperty(prop);
+ } else {
+ p = this->Makefile->GetProperty(prop);
}
- return this->Makefile->GetProperty(prop);
+ return p ? p->c_str() : nullptr;
}
std::string cmLocalGenerator::ConvertToIncludeReference(
@@ -899,7 +970,7 @@ std::string cmLocalGenerator::GetIncludeFlags(
if ((sep[0] != ' ') && !flags.empty() && flags.back() == sep[0]) {
flags.back() = ' ';
}
- return flags;
+ return cmTrimWhitespace(flags);
}
void cmLocalGenerator::AddCompileOptions(std::string& flags,
@@ -922,9 +993,9 @@ void cmLocalGenerator::AddCompileOptions(std::vector<BT<std::string>>& flags,
if (const char* langFlagRegexStr =
this->Makefile->GetDefinition(langFlagRegexVar)) {
// Filter flags acceptable to this language.
- if (const char* targetFlags = target->GetProperty("COMPILE_FLAGS")) {
+ if (cmProp targetFlags = target->GetProperty("COMPILE_FLAGS")) {
std::vector<std::string> opts;
- cmSystemTools::ParseWindowsCommandLine(targetFlags, opts);
+ cmSystemTools::ParseWindowsCommandLine(targetFlags->c_str(), opts);
// Re-escape these flags since COMPILE_FLAGS were already parsed
// as a command line above.
std::string compileOpts;
@@ -939,10 +1010,10 @@ void cmLocalGenerator::AddCompileOptions(std::vector<BT<std::string>>& flags,
this->AppendCompileOptions(flags, targetCompileOpts, langFlagRegexStr);
} else {
// Use all flags.
- if (const char* targetFlags = target->GetProperty("COMPILE_FLAGS")) {
+ if (cmProp targetFlags = target->GetProperty("COMPILE_FLAGS")) {
// COMPILE_FLAGS are not escaped for historical reasons.
std::string compileFlags;
- this->AppendFlags(compileFlags, targetFlags);
+ this->AppendFlags(compileFlags, *targetFlags);
if (!compileFlags.empty()) {
flags.emplace_back(std::move(compileFlags));
}
@@ -954,11 +1025,11 @@ void cmLocalGenerator::AddCompileOptions(std::vector<BT<std::string>>& flags,
}
for (auto const& it : target->GetMaxLanguageStandards()) {
- const char* standard = target->GetProperty(it.first + "_STANDARD");
+ cmProp standard = target->GetProperty(it.first + "_STANDARD");
if (!standard) {
continue;
}
- if (this->Makefile->IsLaterStandard(it.first, standard, it.second)) {
+ if (this->Makefile->IsLaterStandard(it.first, *standard, it.second)) {
std::ostringstream e;
e << "The COMPILE_FEATURES property of target \"" << target->GetName()
<< "\" was evaluated when computing the link "
@@ -967,12 +1038,11 @@ void cmLocalGenerator::AddCompileOptions(std::vector<BT<std::string>>& flags,
<< "\" for that computation. Computing the "
"COMPILE_FEATURES based on the link implementation resulted in a "
"higher \""
- << it.first << "_STANDARD\" \"" << standard
+ << it.first << "_STANDARD\" \"" << *standard
<< "\". "
"This is not permitted. The COMPILE_FEATURES may not both depend "
"on "
- "and be depended on by the link implementation."
- << std::endl;
+ "and be depended on by the link implementation.\n";
this->IssueMessage(MessageType::FATAL_ERROR, e.str());
return;
}
@@ -995,10 +1065,10 @@ void cmLocalGenerator::AddCompileOptions(std::vector<BT<std::string>>& flags,
cmGeneratorTarget::ManagedType::Managed) {
// add /JMC flags if target property VS_JUST_MY_CODE_DEBUGGING is set
// to ON
- if (char const* jmcExprGen =
+ if (cmProp jmcExprGen =
target->GetProperty("VS_JUST_MY_CODE_DEBUGGING")) {
std::string isJMCEnabled =
- cmGeneratorExpression::Evaluate(jmcExprGen, this, config);
+ cmGeneratorExpression::Evaluate(*jmcExprGen, this, config);
if (cmIsOn(isJMCEnabled)) {
std::vector<std::string> optVec = cmExpandedList(jmc);
std::string jmcFlags;
@@ -1018,7 +1088,8 @@ cmTarget* cmLocalGenerator::AddCustomCommandToTarget(
const cmCustomCommandLines& commandLines, cmCustomCommandType type,
const char* comment, const char* workingDir, bool escapeOldStyle,
bool uses_terminal, const std::string& depfile, const std::string& job_pool,
- bool command_expand_lists, cmObjectLibraryCommands objLibCommands)
+ bool command_expand_lists, cmObjectLibraryCommands objLibCommands,
+ bool stdPipesUTF8)
{
cmTarget* t = this->Makefile->GetCustomCommandTarget(
target, objLibCommands, this->DirectoryBacktrace);
@@ -1029,7 +1100,7 @@ cmTarget* cmLocalGenerator::AddCustomCommandToTarget(
detail::AddCustomCommandToTarget(
*this, this->DirectoryBacktrace, cmCommandOrigin::Generator, t, byproducts,
depends, commandLines, type, comment, workingDir, escapeOldStyle,
- uses_terminal, depfile, job_pool, command_expand_lists);
+ uses_terminal, depfile, job_pool, command_expand_lists, stdPipesUTF8);
return t;
}
@@ -1039,14 +1110,14 @@ cmSourceFile* cmLocalGenerator::AddCustomCommandToOutput(
const std::string& main_dependency, const cmCustomCommandLines& commandLines,
const char* comment, const char* workingDir, bool replace,
bool escapeOldStyle, bool uses_terminal, bool command_expand_lists,
- const std::string& depfile, const std::string& job_pool)
+ const std::string& depfile, const std::string& job_pool, bool stdPipesUTF8)
{
std::vector<std::string> no_byproducts;
cmImplicitDependsList no_implicit_depends;
return this->AddCustomCommandToOutput(
{ output }, no_byproducts, depends, main_dependency, no_implicit_depends,
commandLines, comment, workingDir, replace, escapeOldStyle, uses_terminal,
- command_expand_lists, depfile, job_pool);
+ command_expand_lists, depfile, job_pool, stdPipesUTF8);
}
cmSourceFile* cmLocalGenerator::AddCustomCommandToOutput(
@@ -1057,7 +1128,7 @@ cmSourceFile* cmLocalGenerator::AddCustomCommandToOutput(
const cmCustomCommandLines& commandLines, const char* comment,
const char* workingDir, bool replace, bool escapeOldStyle,
bool uses_terminal, bool command_expand_lists, const std::string& depfile,
- const std::string& job_pool)
+ const std::string& job_pool, bool stdPipesUTF8)
{
// Make sure there is at least one output.
if (outputs.empty()) {
@@ -1069,7 +1140,7 @@ cmSourceFile* cmLocalGenerator::AddCustomCommandToOutput(
*this, this->DirectoryBacktrace, cmCommandOrigin::Generator, outputs,
byproducts, depends, main_dependency, implicit_depends, commandLines,
comment, workingDir, replace, escapeOldStyle, uses_terminal,
- command_expand_lists, depfile, job_pool);
+ command_expand_lists, depfile, job_pool, stdPipesUTF8);
}
cmTarget* cmLocalGenerator::AddUtilityCommand(
@@ -1078,7 +1149,7 @@ cmTarget* cmLocalGenerator::AddUtilityCommand(
const std::vector<std::string>& depends,
const cmCustomCommandLines& commandLines, bool escapeOldStyle,
const char* comment, bool uses_terminal, bool command_expand_lists,
- const std::string& job_pool)
+ const std::string& job_pool, bool stdPipesUTF8)
{
cmTarget* target =
this->Makefile->AddNewUtilityTarget(utilityName, excludeFromAll);
@@ -1092,7 +1163,7 @@ cmTarget* cmLocalGenerator::AddUtilityCommand(
*this, this->DirectoryBacktrace, cmCommandOrigin::Generator, target,
this->Makefile->GetUtilityOutput(target), workingDir, byproducts, depends,
commandLines, escapeOldStyle, comment, uses_terminal, command_expand_lists,
- job_pool);
+ job_pool, stdPipesUTF8);
return target;
}
@@ -1183,7 +1254,7 @@ std::vector<BT<std::string>> cmLocalGenerator::GetIncludeDirectoriesImplicit(
// directly. In this case adding -I/usr/include can hide SDK headers so we
// must still exclude it.
if ((lang == "C" || lang == "CXX" || lang == "CUDA") &&
- !cmContains(impDirVec, "/usr/include") &&
+ !cm::contains(impDirVec, "/usr/include") &&
std::find_if(impDirVec.begin(), impDirVec.end(),
[](std::string const& d) {
return cmHasLiteralSuffix(d, "/usr/include");
@@ -1204,13 +1275,14 @@ std::vector<BT<std::string>> cmLocalGenerator::GetIncludeDirectoriesImplicit(
&lang](std::string const& dir) {
return (
// Do not exclude directories that are not in an excluded set.
- ((!cmContains(implicitSet, this->GlobalGenerator->GetRealPath(dir))) &&
- (!cmContains(implicitExclude, dir)))
+ ((!cm::contains(implicitSet, this->GlobalGenerator->GetRealPath(dir))) &&
+ (!cm::contains(implicitExclude, dir)))
// Do not exclude entries of the CPATH environment variable even though
// they are implicitly searched by the compiler. They are meant to be
// user-specified directories that can be re-ordered or converted to
// -isystem without breaking real compiler builtin headers.
- || ((lang == "C" || lang == "CXX") && cmContains(this->EnvCPATH, dir)));
+ ||
+ ((lang == "C" || lang == "CXX") && cm::contains(this->EnvCPATH, dir)));
};
// Get the target-specific include directories.
@@ -1257,7 +1329,7 @@ std::vector<BT<std::string>> cmLocalGenerator::GetIncludeDirectoriesImplicit(
if (!stripImplicitDirs) {
// Append implicit directories that were requested by the user only
for (BT<std::string> const& udr : userDirs) {
- if (cmContains(implicitSet, cmSystemTools::GetRealPath(udr.Value))) {
+ if (cm::contains(implicitSet, cmSystemTools::GetRealPath(udr.Value))) {
emitBT(udr);
}
}
@@ -1314,14 +1386,15 @@ std::vector<BT<std::string>> cmLocalGenerator::GetStaticLibraryFlags(
std::string const& config, std::string const& linkLanguage,
cmGeneratorTarget* target)
{
+ const std::string configUpper = cmSystemTools::UpperCase(config);
std::vector<BT<std::string>> flags;
if (linkLanguage != "Swift") {
std::string staticLibFlags;
this->AppendFlags(
staticLibFlags,
this->Makefile->GetSafeDefinition("CMAKE_STATIC_LINKER_FLAGS"));
- if (!config.empty()) {
- std::string name = "CMAKE_STATIC_LINKER_FLAGS_" + config;
+ if (!configUpper.empty()) {
+ std::string name = "CMAKE_STATIC_LINKER_FLAGS_" + configUpper;
this->AppendFlags(staticLibFlags,
this->Makefile->GetSafeDefinition(name));
}
@@ -1333,8 +1406,8 @@ std::vector<BT<std::string>> cmLocalGenerator::GetStaticLibraryFlags(
std::string staticLibFlags;
this->AppendFlags(staticLibFlags,
target->GetSafeProperty("STATIC_LIBRARY_FLAGS"));
- if (!config.empty()) {
- std::string name = "STATIC_LIBRARY_FLAGS_" + config;
+ if (!configUpper.empty()) {
+ std::string name = "STATIC_LIBRARY_FLAGS_" + configUpper;
this->AppendFlags(staticLibFlags, target->GetSafeProperty(name));
}
@@ -1350,6 +1423,30 @@ std::vector<BT<std::string>> cmLocalGenerator::GetStaticLibraryFlags(
return flags;
}
+void cmLocalGenerator::GetDeviceLinkFlags(
+ cmLinkLineComputer* linkLineComputer, const std::string& config,
+ std::string& linkLibs, std::string& linkFlags, std::string& frameworkPath,
+ std::string& linkPath, cmGeneratorTarget* target)
+{
+ cmGeneratorTarget::DeviceLinkSetter setter(*target);
+
+ cmComputeLinkInformation* pcli = target->GetLinkInformation(config);
+ const std::string linkLanguage =
+ linkLineComputer->GetLinkerLanguage(target, config);
+
+ if (pcli) {
+ // Compute the required cuda device link libraries when
+ // resolving cuda device symbols
+ this->OutputLinkLibraries(pcli, linkLineComputer, linkLibs, frameworkPath,
+ linkPath);
+ }
+
+ std::vector<std::string> linkOpts;
+ target->GetLinkOptions(linkOpts, config, linkLanguage);
+ // LINK_OPTIONS are escaped.
+ this->AppendCompileOptions(linkFlags, linkOpts);
+}
+
void cmLocalGenerator::GetTargetFlags(
cmLinkLineComputer* linkLineComputer, const std::string& config,
std::string& linkLibs, std::string& flags, std::string& linkFlags,
@@ -1371,23 +1468,17 @@ void cmLocalGenerator::GetTargetFlags(
std::vector<BT<std::string>>& linkFlags, std::string& frameworkPath,
std::vector<BT<std::string>>& linkPath, cmGeneratorTarget* target)
{
- const std::string buildType = cmSystemTools::UpperCase(config);
+ const std::string configUpper = cmSystemTools::UpperCase(config);
cmComputeLinkInformation* pcli = target->GetLinkInformation(config);
const char* libraryLinkVariable =
"CMAKE_SHARED_LINKER_FLAGS"; // default to shared library
const std::string linkLanguage =
- linkLineComputer->GetLinkerLanguage(target, buildType);
+ linkLineComputer->GetLinkerLanguage(target, config);
switch (target->GetType()) {
case cmStateEnums::STATIC_LIBRARY:
- linkFlags = this->GetStaticLibraryFlags(buildType, linkLanguage, target);
- if (pcli && dynamic_cast<cmLinkLineDeviceComputer*>(linkLineComputer)) {
- // Compute the required cuda device link libraries when
- // resolving cuda device symbols
- this->OutputLinkLibraries(pcli, linkLineComputer, linkLibs,
- frameworkPath, linkPath);
- }
+ linkFlags = this->GetStaticLibraryFlags(config, linkLanguage, target);
break;
case cmStateEnums::MODULE_LIBRARY:
libraryLinkVariable = "CMAKE_MODULE_LINKER_FLAGS";
@@ -1397,8 +1488,8 @@ void cmLocalGenerator::GetTargetFlags(
if (linkLanguage != "Swift") {
sharedLibFlags = cmStrCat(
this->Makefile->GetSafeDefinition(libraryLinkVariable), ' ');
- if (!buildType.empty()) {
- std::string build = cmStrCat(libraryLinkVariable, '_', buildType);
+ if (!configUpper.empty()) {
+ std::string build = cmStrCat(libraryLinkVariable, '_', configUpper);
sharedLibFlags += this->Makefile->GetSafeDefinition(build);
sharedLibFlags += " ";
}
@@ -1406,30 +1497,30 @@ void cmLocalGenerator::GetTargetFlags(
!(this->Makefile->IsOn("CYGWIN") ||
this->Makefile->IsOn("MINGW"))) {
std::vector<cmSourceFile*> sources;
- target->GetSourceFiles(sources, buildType);
+ target->GetSourceFiles(sources, config);
std::string defFlag =
this->Makefile->GetSafeDefinition("CMAKE_LINK_DEF_FILE_FLAG");
for (cmSourceFile* sf : sources) {
if (sf->GetExtension() == "def") {
sharedLibFlags += defFlag;
- sharedLibFlags += this->ConvertToOutputFormat(
- cmSystemTools::CollapseFullPath(sf->ResolveFullPath()), SHELL);
+ sharedLibFlags +=
+ this->ConvertToOutputFormat(sf->ResolveFullPath(), SHELL);
sharedLibFlags += " ";
}
}
}
}
- const char* targetLinkFlags = target->GetProperty("LINK_FLAGS");
+ cmProp targetLinkFlags = target->GetProperty("LINK_FLAGS");
if (targetLinkFlags) {
- sharedLibFlags += targetLinkFlags;
+ sharedLibFlags += *targetLinkFlags;
sharedLibFlags += " ";
}
- if (!buildType.empty()) {
+ if (!configUpper.empty()) {
targetLinkFlags =
- target->GetProperty(cmStrCat("LINK_FLAGS_", buildType));
+ target->GetProperty(cmStrCat("LINK_FLAGS_", configUpper));
if (targetLinkFlags) {
- sharedLibFlags += targetLinkFlags;
+ sharedLibFlags += *targetLinkFlags;
sharedLibFlags += " ";
}
}
@@ -1452,9 +1543,9 @@ void cmLocalGenerator::GetTargetFlags(
if (linkLanguage != "Swift") {
exeFlags = this->Makefile->GetSafeDefinition("CMAKE_EXE_LINKER_FLAGS");
exeFlags += " ";
- if (!buildType.empty()) {
+ if (!configUpper.empty()) {
exeFlags += this->Makefile->GetSafeDefinition(
- cmStrCat("CMAKE_EXE_LINKER_FLAGS_", buildType));
+ cmStrCat("CMAKE_EXE_LINKER_FLAGS_", configUpper));
exeFlags += " ";
}
if (linkLanguage.empty()) {
@@ -1481,7 +1572,7 @@ void cmLocalGenerator::GetTargetFlags(
}
}
- this->AddLanguageFlagsForLinking(flags, target, linkLanguage, buildType);
+ this->AddLanguageFlagsForLinking(flags, target, linkLanguage, config);
if (pcli) {
this->OutputLinkLibraries(pcli, linkLineComputer, linkLibs,
frameworkPath, linkPath);
@@ -1501,16 +1592,16 @@ void cmLocalGenerator::GetTargetFlags(
exeFlags += " ";
}
- const char* targetLinkFlags = target->GetProperty("LINK_FLAGS");
+ cmProp targetLinkFlags = target->GetProperty("LINK_FLAGS");
if (targetLinkFlags) {
- exeFlags += targetLinkFlags;
+ exeFlags += *targetLinkFlags;
exeFlags += " ";
}
- if (!buildType.empty()) {
+ if (!configUpper.empty()) {
targetLinkFlags =
- target->GetProperty(cmStrCat("LINK_FLAGS_", buildType));
+ target->GetProperty(cmStrCat("LINK_FLAGS_", configUpper));
if (targetLinkFlags) {
- exeFlags += targetLinkFlags;
+ exeFlags += *targetLinkFlags;
exeFlags += " ";
}
}
@@ -1541,16 +1632,17 @@ void cmLocalGenerator::GetTargetFlags(
void cmLocalGenerator::GetTargetCompileFlags(cmGeneratorTarget* target,
std::string const& config,
std::string const& lang,
- std::string& flags)
+ std::string& flags,
+ std::string const& arch)
{
std::vector<BT<std::string>> tmpFlags =
- this->GetTargetCompileFlags(target, config, lang);
+ this->GetTargetCompileFlags(target, config, lang, arch);
this->AppendFlags(flags, tmpFlags);
}
std::vector<BT<std::string>> cmLocalGenerator::GetTargetCompileFlags(
cmGeneratorTarget* target, std::string const& config,
- std::string const& lang)
+ std::string const& lang, std::string const& arch)
{
std::vector<BT<std::string>> flags;
std::string compileFlags;
@@ -1564,7 +1656,7 @@ std::vector<BT<std::string>> cmLocalGenerator::GetTargetCompileFlags(
this->AppendFeatureOptions(compileFlags, lang, "IPO");
}
- this->AddArchitectureFlags(compileFlags, target, lang, config);
+ this->AddArchitectureFlags(compileFlags, target, lang, config, arch);
if (lang == "Fortran") {
this->AppendFlags(compileFlags,
@@ -1753,10 +1845,10 @@ std::string cmLocalGenerator::GetLinkLibsCMP0065(
"CMAKE_POLICY_WARNING_CMP0065")) {
std::ostringstream w;
/* clang-format off */
- w << cmPolicies::GetPolicyWarning(cmPolicies::CMP0065) << "\n"
- "For compatibility with older versions of CMake, "
- "additional flags may be added to export symbols on all "
- "executables regardless of their ENABLE_EXPORTS property.";
+ w << cmPolicies::GetPolicyWarning(cmPolicies::CMP0065) << "\n"
+ "For compatibility with older versions of CMake, "
+ "additional flags may be added to export symbols on all "
+ "executables regardless of their ENABLE_EXPORTS property.";
/* clang-format on */
this->IssueMessage(MessageType::AUTHOR_WARNING, w.str());
}
@@ -1812,7 +1904,8 @@ bool cmLocalGenerator::AllAppleArchSysrootsAreTheSame(
void cmLocalGenerator::AddArchitectureFlags(std::string& flags,
cmGeneratorTarget const* target,
const std::string& lang,
- const std::string& config)
+ const std::string& config,
+ const std::string& filterArch)
{
// Only add Apple specific flags on Apple platforms
if (this->Makefile->IsOn("APPLE") && this->EmitUniversalBinaryFlags) {
@@ -1821,8 +1914,10 @@ void cmLocalGenerator::AddArchitectureFlags(std::string& flags,
if (!archs.empty() && !lang.empty() &&
(lang[0] == 'C' || lang[0] == 'F' || lang[0] == 'O')) {
for (std::string const& arch : archs) {
- flags += " -arch ";
- flags += arch;
+ if (filterArch.empty() || filterArch == arch) {
+ flags += " -arch ";
+ flags += arch;
+ }
}
}
@@ -1841,10 +1936,12 @@ void cmLocalGenerator::AddArchitectureFlags(std::string& flags,
if (cmIsOff(archSysroot)) {
continue;
}
- flags += " -Xarch_" + arch + " ";
- // Combine sysroot flag and path to work with -Xarch
- std::string arch_sysroot = sysrootFlag + archSysroot;
- flags += this->ConvertToOutputFormat(arch_sysroot, SHELL);
+ if (filterArch.empty() || filterArch == arch) {
+ flags += " -Xarch_" + arch + " ";
+ // Combine sysroot flag and path to work with -Xarch
+ std::string arch_sysroot = sysrootFlag + archSysroot;
+ flags += this->ConvertToOutputFormat(arch_sysroot, SHELL);
+ }
}
} else if (sysroot && *sysroot) {
flags += " ";
@@ -1879,28 +1976,30 @@ void cmLocalGenerator::AddLanguageFlags(std::string& flags,
config);
if (lang == "Swift") {
- if (const char* v = target->GetProperty("Swift_LANGUAGE_VERSION")) {
+ if (cmProp v = target->GetProperty("Swift_LANGUAGE_VERSION")) {
if (cmSystemTools::VersionCompare(
cmSystemTools::OP_GREATER_EQUAL,
this->Makefile->GetDefinition("CMAKE_Swift_COMPILER_VERSION"),
"4.2")) {
- this->AppendFlags(flags, "-swift-version " + std::string(v));
+ this->AppendFlags(flags, "-swift-version " + *v);
}
}
+ } else if (lang == "CUDA") {
+ target->AddCUDAArchitectureFlags(flags);
}
// Add MSVC runtime library flags. This is activated by the presence
// of a default selection whether or not it is overridden by a property.
- const char* msvcRuntimeLibraryDefault =
- this->Makefile->GetDefinition("CMAKE_MSVC_RUNTIME_LIBRARY_DEFAULT");
- if (msvcRuntimeLibraryDefault && *msvcRuntimeLibraryDefault) {
- const char* msvcRuntimeLibraryValue =
+ cmProp msvcRuntimeLibraryDefault =
+ this->Makefile->GetDef("CMAKE_MSVC_RUNTIME_LIBRARY_DEFAULT");
+ if (msvcRuntimeLibraryDefault && !msvcRuntimeLibraryDefault->empty()) {
+ cmProp msvcRuntimeLibraryValue =
target->GetProperty("MSVC_RUNTIME_LIBRARY");
if (!msvcRuntimeLibraryValue) {
msvcRuntimeLibraryValue = msvcRuntimeLibraryDefault;
}
std::string const msvcRuntimeLibrary = cmGeneratorExpression::Evaluate(
- msvcRuntimeLibraryValue, this, config, target);
+ *msvcRuntimeLibraryValue, this, config, target);
if (!msvcRuntimeLibrary.empty()) {
if (const char* msvcRuntimeLibraryOptions =
this->Makefile->GetDefinition(
@@ -1973,7 +2072,6 @@ bool cmLocalGenerator::GetRealDependency(const std::string& inName,
if (name.empty()) {
return false;
}
-
if (cmSystemTools::GetFilenameLastExtension(name) == ".exe") {
name = cmSystemTools::GetFilenameWithoutLastExtension(name);
}
@@ -2013,11 +2111,9 @@ bool cmLocalGenerator::GetRealDependency(const std::string& inName,
case cmStateEnums::OBJECT_LIBRARY:
// An object library has no single file on which to depend.
// This was listed to get the target-level dependency.
- return false;
case cmStateEnums::INTERFACE_LIBRARY:
// An interface library has no file on which to depend.
// This was listed to get the target-level dependency.
- return false;
case cmStateEnums::UTILITY:
case cmStateEnums::GLOBAL_TARGET:
// A utility target has no file on which to depend. This was listed
@@ -2082,13 +2178,13 @@ void cmLocalGenerator::AddCompilerRequirementFlag(
}
std::string extProp = lang + "_EXTENSIONS";
bool ext = true;
- if (const char* extPropValue = target->GetProperty(extProp)) {
- if (cmIsOff(extPropValue)) {
+ if (cmProp extPropValue = target->GetProperty(extProp)) {
+ if (cmIsOff(*extPropValue)) {
ext = false;
}
}
std::string stdProp = lang + "_STANDARD";
- const char* standardProp = target->GetProperty(stdProp);
+ cmProp standardProp = target->GetProperty(stdProp);
if (!standardProp) {
if (ext) {
// No language standard is specified and extensions are not disabled.
@@ -2110,7 +2206,7 @@ void cmLocalGenerator::AddCompilerRequirementFlag(
if (target->GetPropertyAsBool(lang + "_STANDARD_REQUIRED")) {
std::string option_flag =
- "CMAKE_" + lang + standardProp + "_" + type + "_COMPILE_OPTION";
+ "CMAKE_" + lang + *standardProp + "_" + type + "_COMPILE_OPTION";
const char* opt =
target->Target->GetMakefile()->GetDefinition(option_flag);
@@ -2119,7 +2215,7 @@ void cmLocalGenerator::AddCompilerRequirementFlag(
e << "Target \"" << target->GetName()
<< "\" requires the language "
"dialect \""
- << lang << standardProp << "\" "
+ << lang << *standardProp << "\" "
<< (ext ? "(with compiler extensions)" : "")
<< ", but CMake "
"does not know the compile flags to use to enable it.";
@@ -2163,7 +2259,7 @@ void cmLocalGenerator::AddCompilerRequirementFlag(
langStdMap["CUDA"].emplace_back("03");
}
- std::string standard(standardProp);
+ std::string standard(*standardProp);
if (lang == "CUDA" && standard == "98") {
standard = "03";
}
@@ -2236,7 +2332,7 @@ static void AddVisibilityCompileOption(std::string& flags,
}
std::string flagDefine = lang + "_VISIBILITY_PRESET";
- const char* prop = target->GetProperty(flagDefine);
+ cmProp prop = target->GetProperty(flagDefine);
if (!prop) {
return;
}
@@ -2244,17 +2340,17 @@ static void AddVisibilityCompileOption(std::string& flags,
*warnCMP0063 += " " + flagDefine + "\n";
return;
}
- if (strcmp(prop, "hidden") != 0 && strcmp(prop, "default") != 0 &&
- strcmp(prop, "protected") != 0 && strcmp(prop, "internal") != 0) {
+ if ((*prop != "hidden") && (*prop != "default") && (*prop != "protected") &&
+ (*prop != "internal")) {
std::ostringstream e;
- e << "Target " << target->GetName() << " uses unsupported value \"" << prop
- << "\" for " << flagDefine << "."
+ e << "Target " << target->GetName() << " uses unsupported value \""
+ << *prop << "\" for " << flagDefine << "."
<< " The supported values are: default, hidden, protected, and "
"internal.";
cmSystemTools::Error(e.str());
return;
}
- std::string option = std::string(opt) + prop;
+ std::string option = opt + *prop;
lg->AppendFlags(flags, option);
}
@@ -2434,7 +2530,9 @@ void cmLocalGenerator::AddConfigVariableFlags(std::string& flags,
void cmLocalGenerator::AppendFlags(std::string& flags,
const std::string& newFlags) const
{
- if (!newFlags.empty()) {
+ bool allSpaces = std::all_of(newFlags.begin(), newFlags.end(), cmIsSpace);
+
+ if (!newFlags.empty() && !allSpaces) {
if (!flags.empty()) {
flags += " ";
}
@@ -2481,151 +2579,299 @@ void cmLocalGenerator::AddPchDependencies(cmGeneratorTarget* target)
continue;
}
- const std::string pchSource = target->GetPchSource(config, lang);
- const std::string pchHeader = target->GetPchHeader(config, lang);
-
- if (pchSource.empty() || pchHeader.empty()) {
- continue;
+ std::vector<std::string> architectures;
+ if (!this->GetGlobalGenerator()->IsXcode()) {
+ target->GetAppleArchs(config, architectures);
}
+ if (architectures.empty()) {
+ architectures.emplace_back();
+ } else {
+ std::string useMultiArchPch;
+ for (const std::string& arch : architectures) {
+ const std::string pchHeader =
+ target->GetPchHeader(config, lang, arch);
+ if (!pchHeader.empty()) {
+ useMultiArchPch = cmStrCat(useMultiArchPch, ";-Xarch_", arch,
+ ";-include", pchHeader);
+ }
+ }
- const std::string pchExtension =
- this->Makefile->GetSafeDefinition("CMAKE_PCH_EXTENSION");
-
- if (pchExtension.empty()) {
- continue;
+ if (!useMultiArchPch.empty()) {
+ target->Target->SetProperty(
+ cmStrCat(lang, "_COMPILE_OPTIONS_USE_PCH"), useMultiArchPch);
+ }
}
- const char* pchReuseFrom =
- target->GetProperty("PRECOMPILE_HEADERS_REUSE_FROM");
-
- auto pch_sf = this->Makefile->GetOrCreateSource(
- pchSource, false, cmSourceFileLocationKind::Known);
+ for (const std::string& arch : architectures) {
+ const std::string pchSource = target->GetPchSource(config, lang, arch);
+ const std::string pchHeader = target->GetPchHeader(config, lang, arch);
- if (!this->GetGlobalGenerator()->IsXcode()) {
- if (!pchReuseFrom) {
- target->AddSource(pchSource, true);
+ if (pchSource.empty() || pchHeader.empty()) {
+ continue;
}
- const std::string pchFile = target->GetPchFile(config, lang);
-
- // Exclude the pch files from linking
- if (this->Makefile->IsOn("CMAKE_LINK_PCH")) {
- if (!pchReuseFrom) {
- pch_sf->SetProperty("OBJECT_OUTPUTS", pchFile.c_str());
- } else {
- auto reuseTarget =
- this->GlobalGenerator->FindGeneratorTarget(pchReuseFrom);
-
- if (this->Makefile->IsOn("CMAKE_PCH_COPY_COMPILE_PDB")) {
+ const std::string pchExtension =
+ this->Makefile->GetSafeDefinition("CMAKE_PCH_EXTENSION");
- const std::string pdb_prefix =
- this->GetGlobalGenerator()->IsMultiConfig()
- ? cmStrCat(this->GlobalGenerator->GetCMakeCFGIntDir(), "/")
- : "";
+ if (pchExtension.empty()) {
+ continue;
+ }
- const std::string target_compile_pdb_dir = cmStrCat(
- target->GetLocalGenerator()->GetCurrentBinaryDirectory(), "/",
- target->GetName(), ".dir/");
+ cmProp ReuseFrom =
+ target->GetProperty("PRECOMPILE_HEADERS_REUSE_FROM");
- const std::string copy_script =
- cmStrCat(target_compile_pdb_dir, "copy_idb_pdb.cmake");
- cmGeneratedFileStream file(copy_script);
+ auto pch_sf = this->Makefile->GetOrCreateSource(
+ pchSource, false, cmSourceFileLocationKind::Known);
- file << "# CMake generated file\n";
- for (auto extension : { ".pdb", ".idb" }) {
- const std::string from_file =
- cmStrCat(reuseTarget->GetLocalGenerator()
- ->GetCurrentBinaryDirectory(),
- "/", pchReuseFrom, ".dir/${PDB_PREFIX}",
- pchReuseFrom, extension);
+ if (!this->GetGlobalGenerator()->IsXcode()) {
+ if (!ReuseFrom) {
+ target->AddSource(pchSource, true);
+ }
- const std::string to_dir = cmStrCat(
- target->GetLocalGenerator()->GetCurrentBinaryDirectory(),
- "/", target->GetName(), ".dir/${PDB_PREFIX}");
+ const std::string pchFile = target->GetPchFile(config, lang, arch);
- const std::string to_file =
- cmStrCat(to_dir, pchReuseFrom, extension);
+ // Exclude the pch files from linking
+ if (this->Makefile->IsOn("CMAKE_LINK_PCH")) {
+ if (!ReuseFrom) {
+ pch_sf->AppendProperty(
+ "OBJECT_OUTPUTS",
+ cmStrCat("$<$<CONFIG:", config, ">:", pchFile, ">"));
+ } else {
+ auto reuseTarget =
+ this->GlobalGenerator->FindGeneratorTarget(*ReuseFrom);
- std::string dest_file = to_file;
+ if (this->Makefile->IsOn("CMAKE_PCH_COPY_COMPILE_PDB")) {
- const std::string prefix = target->GetSafeProperty("PREFIX");
- if (!prefix.empty()) {
- dest_file =
- cmStrCat(to_dir, prefix, pchReuseFrom, extension);
- }
+ const std::string pdb_prefix =
+ this->GetGlobalGenerator()->IsMultiConfig()
+ ? cmStrCat(this->GlobalGenerator->GetCMakeCFGIntDir(), "/")
+ : "";
- file << "if (EXISTS \"" << from_file << "\" AND \""
- << from_file << "\" IS_NEWER_THAN \"" << dest_file
- << "\")\n";
- file << " file(COPY \"" << from_file << "\""
- << " DESTINATION \"" << to_dir << "\")\n";
- if (!prefix.empty()) {
- file << " file(REMOVE \"" << dest_file << "\")\n";
- file << " file(RENAME \"" << to_file << "\" \"" << dest_file
+ const std::string target_compile_pdb_dir = cmStrCat(
+ target->GetLocalGenerator()->GetCurrentBinaryDirectory(),
+ "/", target->GetName(), ".dir/");
+
+ const std::string copy_script =
+ cmStrCat(target_compile_pdb_dir, "copy_idb_pdb.cmake");
+ cmGeneratedFileStream file(copy_script);
+
+ file << "# CMake generated file\n";
+ for (auto extension : { ".pdb", ".idb" }) {
+ const std::string from_file =
+ cmStrCat(reuseTarget->GetLocalGenerator()
+ ->GetCurrentBinaryDirectory(),
+ "/", *ReuseFrom, ".dir/${PDB_PREFIX}", *ReuseFrom,
+ extension);
+
+ const std::string to_dir = cmStrCat(
+ target->GetLocalGenerator()->GetCurrentBinaryDirectory(),
+ "/", target->GetName(), ".dir/${PDB_PREFIX}");
+
+ const std::string to_file =
+ cmStrCat(to_dir, *ReuseFrom, extension);
+
+ std::string dest_file = to_file;
+
+ std::string const& prefix =
+ target->GetSafeProperty("PREFIX");
+ if (!prefix.empty()) {
+ dest_file =
+ cmStrCat(to_dir, prefix, *ReuseFrom, extension);
+ }
+
+ file << "if (EXISTS \"" << from_file << "\" AND \""
+ << from_file << "\" IS_NEWER_THAN \"" << dest_file
<< "\")\n";
+ file << " file(COPY \"" << from_file << "\""
+ << " DESTINATION \"" << to_dir << "\")\n";
+ if (!prefix.empty()) {
+ file << " file(REMOVE \"" << dest_file << "\")\n";
+ file << " file(RENAME \"" << to_file << "\" \""
+ << dest_file << "\")\n";
+ }
+ file << "endif()\n";
}
- file << "endif()\n";
- }
- cmCustomCommandLines commandLines = cmMakeSingleCommandLine(
- { cmSystemTools::GetCMakeCommand(),
- cmStrCat("-DPDB_PREFIX=", pdb_prefix), "-P", copy_script });
-
- const std::string no_main_dependency;
- const std::vector<std::string> no_deps;
- const char* no_message = "";
- const char* no_current_dir = nullptr;
- std::vector<std::string> no_byproducts;
-
- std::vector<std::string> outputs;
- outputs.push_back(cmStrCat(target_compile_pdb_dir, pdb_prefix,
- pchReuseFrom, ".pdb"));
-
- if (this->GetGlobalGenerator()->IsVisualStudio()) {
- this->AddCustomCommandToTarget(
- target->GetName(), outputs, no_deps, commandLines,
- cmCustomCommandType::PRE_BUILD, no_message, no_current_dir);
- } else {
- cmImplicitDependsList no_implicit_depends;
- cmSourceFile* copy_rule = this->AddCustomCommandToOutput(
- outputs, no_byproducts, no_deps, no_main_dependency,
- no_implicit_depends, commandLines, no_message,
- no_current_dir);
-
- if (copy_rule) {
- target->AddSource(copy_rule->ResolveFullPath());
+ bool stdPipesUTF8 = true;
+ cmCustomCommandLines commandLines = cmMakeSingleCommandLine(
+ { cmSystemTools::GetCMakeCommand(),
+ cmStrCat("-DPDB_PREFIX=", pdb_prefix), "-P",
+ copy_script });
+
+ const std::string no_main_dependency;
+ const std::vector<std::string> no_deps;
+ const char* no_message = "";
+ const char* no_current_dir = nullptr;
+ std::vector<std::string> no_byproducts;
+
+ std::vector<std::string> outputs;
+ outputs.push_back(cmStrCat(target_compile_pdb_dir, pdb_prefix,
+ *ReuseFrom, ".pdb"));
+
+ if (this->GetGlobalGenerator()->IsVisualStudio()) {
+ this->AddCustomCommandToTarget(
+ target->GetName(), outputs, no_deps, commandLines,
+ cmCustomCommandType::PRE_BUILD, no_message, no_current_dir,
+ true, false, "", "", false,
+ cmObjectLibraryCommands::Reject, stdPipesUTF8);
+ } else {
+ cmImplicitDependsList no_implicit_depends;
+ cmSourceFile* copy_rule = this->AddCustomCommandToOutput(
+ outputs, no_byproducts, no_deps, no_main_dependency,
+ no_implicit_depends, commandLines, no_message,
+ no_current_dir, false, true, false, false, "", "",
+ stdPipesUTF8);
+
+ if (copy_rule) {
+ target->AddSource(copy_rule->ResolveFullPath());
+ }
}
- }
- target->Target->SetProperty("COMPILE_PDB_OUTPUT_DIRECTORY",
- target_compile_pdb_dir);
- }
+ target->Target->SetProperty("COMPILE_PDB_OUTPUT_DIRECTORY",
+ target_compile_pdb_dir);
+ }
- std::string pchSourceObj =
- reuseTarget->GetPchFileObject(config, lang);
+ std::string pchSourceObj =
+ reuseTarget->GetPchFileObject(config, lang, arch);
- const std::string configUpper = cmSystemTools::UpperCase(config);
+ const std::string configUpper = cmSystemTools::UpperCase(config);
- // Link to the pch object file
- target->Target->AppendProperty(
- cmStrCat("LINK_FLAGS_", configUpper),
- cmStrCat(" ", this->ConvertToOutputFormat(pchSourceObj, SHELL)),
- true);
+ // Link to the pch object file
+ target->Target->AppendProperty(
+ cmStrCat("LINK_FLAGS_", configUpper),
+ cmStrCat(" ",
+ this->ConvertToOutputFormat(pchSourceObj, SHELL)),
+ true);
+ }
+ } else {
+ pch_sf->SetProperty("PCH_EXTENSION", pchExtension.c_str());
}
- } else {
- pch_sf->SetProperty("PCH_EXTENSION", pchExtension.c_str());
+
+ // Add pchHeader to source files, which will
+ // be grouped as "Precompile Header File"
+ auto pchHeader_sf = this->Makefile->GetOrCreateSource(
+ pchHeader, false, cmSourceFileLocationKind::Known);
+ std::string err;
+ pchHeader_sf->ResolveFullPath(&err);
+ target->AddSource(pchHeader);
}
+ }
+ }
+ }
+}
+
+namespace {
+
+inline void RegisterUnitySources(cmGeneratorTarget* target, cmSourceFile* sf,
+ std::string const& filename)
+{
+ target->AddSourceFileToUnityBatch(sf->ResolveFullPath());
+ sf->SetProperty("UNITY_SOURCE_FILE", filename.c_str());
+}
+
+inline void IncludeFileInUnitySources(cmGeneratedFileStream& unity_file,
+ std::string const& sf_full_path,
+ cmProp beforeInclude,
+ cmProp afterInclude)
+{
+ if (beforeInclude) {
+ unity_file << *beforeInclude << "\n";
+ }
+
+ unity_file << "#include \"" << sf_full_path << "\"\n";
+
+ if (afterInclude) {
+ unity_file << *afterInclude << "\n";
+ }
+}
+
+std::vector<std::string> AddUnityFilesModeAuto(
+ cmGeneratorTarget* target, std::string const& lang,
+ std::vector<cmSourceFile*> const& filtered_sources, cmProp beforeInclude,
+ cmProp afterInclude, std::string const& filename_base, size_t batchSize)
+{
+ if (batchSize == 0) {
+ batchSize = filtered_sources.size();
+ }
+
+ std::vector<std::string> unity_files;
+ for (size_t itemsLeft = filtered_sources.size(), chunk, batch = 0;
+ itemsLeft > 0; itemsLeft -= chunk, ++batch) {
+
+ chunk = std::min(itemsLeft, batchSize);
+
+ std::string filename = cmStrCat(filename_base, "unity_", batch,
+ (lang == "C") ? "_c.c" : "_cxx.cxx");
+
+ const std::string filename_tmp = cmStrCat(filename, ".tmp");
+ {
+ size_t begin = batch * batchSize;
+ size_t end = begin + chunk;
- // Add pchHeader to source files, which will
- // be grouped as "Precompile Header File"
- auto pchHeader_sf = this->Makefile->GetOrCreateSource(
- pchHeader, false, cmSourceFileLocationKind::Known);
- std::string err;
- pchHeader_sf->ResolveFullPath(&err);
- target->AddSource(pchHeader);
+ cmGeneratedFileStream file(
+ filename_tmp, false,
+ target->GetGlobalGenerator()->GetMakefileEncoding());
+ file << "/* generated by CMake */\n\n";
+
+ for (; begin != end; ++begin) {
+ cmSourceFile* sf = filtered_sources[begin];
+ RegisterUnitySources(target, sf, filename);
+ IncludeFileInUnitySources(file, sf->ResolveFullPath(), beforeInclude,
+ afterInclude);
+ }
+ }
+ cmSystemTools::MoveFileIfDifferent(filename_tmp, filename);
+ unity_files.emplace_back(std::move(filename));
+ }
+ return unity_files;
+}
+
+std::vector<std::string> AddUnityFilesModeGroup(
+ cmGeneratorTarget* target, std::string const& lang,
+ std::vector<cmSourceFile*> const& filtered_sources, cmProp beforeInclude,
+ cmProp afterInclude, std::string const& filename_base)
+{
+ std::vector<std::string> unity_files;
+
+ // sources organized by group name. Drop any source
+ // without a group
+ std::unordered_map<std::string, std::vector<cmSourceFile*>> explicit_mapping;
+ for (cmSourceFile* sf : filtered_sources) {
+ if (cmProp value = sf->GetProperty("UNITY_GROUP")) {
+ auto i = explicit_mapping.find(*value);
+ if (i == explicit_mapping.end()) {
+ std::vector<cmSourceFile*> sources{ sf };
+ explicit_mapping.emplace(*value, sources);
+ } else {
+ i->second.emplace_back(sf);
}
}
}
+
+ for (auto const& item : explicit_mapping) {
+ auto const& name = item.first;
+ std::string filename = cmStrCat(filename_base, "unity_", name,
+ (lang == "C") ? "_c.c" : "_cxx.cxx");
+
+ const std::string filename_tmp = cmStrCat(filename, ".tmp");
+ {
+ cmGeneratedFileStream file(
+ filename_tmp, false,
+ target->GetGlobalGenerator()->GetMakefileEncoding());
+ file << "/* generated by CMake */\n\n";
+
+ for (cmSourceFile* sf : item.second) {
+ RegisterUnitySources(target, sf, filename);
+ IncludeFileInUnitySources(file, sf->ResolveFullPath(), beforeInclude,
+ afterInclude);
+ }
+ }
+ cmSystemTools::MoveFileIfDifferent(filename_tmp, filename);
+ unity_files.emplace_back(std::move(filename));
+ }
+
+ return unity_files;
+}
}
void cmLocalGenerator::AddUnityBuild(cmGeneratorTarget* target)
@@ -2648,12 +2894,15 @@ void cmLocalGenerator::AddUnityBuild(cmGeneratorTarget* target)
std::vector<cmSourceFile*> sources;
target->GetSourceFiles(sources, config);
- auto batchSizeString = target->GetProperty("UNITY_BUILD_BATCH_SIZE");
- const size_t unityBatchSize =
- static_cast<size_t>(std::atoi(batchSizeString));
+ cmProp batchSizeString = target->GetProperty("UNITY_BUILD_BATCH_SIZE");
+ const size_t unityBatchSize = batchSizeString
+ ? static_cast<size_t>(std::atoi(batchSizeString->c_str()))
+ : 0;
- auto beforeInclude = target->GetProperty("UNITY_BUILD_CODE_BEFORE_INCLUDE");
- auto afterInclude = target->GetProperty("UNITY_BUILD_CODE_AFTER_INCLUDE");
+ cmProp beforeInclude =
+ target->GetProperty("UNITY_BUILD_CODE_BEFORE_INCLUDE");
+ cmProp afterInclude = target->GetProperty("UNITY_BUILD_CODE_AFTER_INCLUDE");
+ cmProp unityMode = target->GetProperty("UNITY_BUILD_MODE");
for (std::string lang : { "C", "CXX" }) {
std::vector<cmSourceFile*> filtered_sources;
@@ -2668,53 +2917,28 @@ void cmLocalGenerator::AddUnityBuild(cmGeneratorTarget* target)
!sf->GetProperty("INCLUDE_DIRECTORIES");
});
- size_t batchSize = unityBatchSize;
- if (unityBatchSize == 0) {
- batchSize = filtered_sources.size();
+ std::vector<std::string> unity_files;
+ if (!unityMode || *unityMode == "BATCH") {
+ unity_files =
+ AddUnityFilesModeAuto(target, lang, filtered_sources, beforeInclude,
+ afterInclude, filename_base, unityBatchSize);
+ } else if (unityMode && *unityMode == "GROUP") {
+ unity_files =
+ AddUnityFilesModeGroup(target, lang, filtered_sources, beforeInclude,
+ afterInclude, filename_base);
+ } else {
+ // unity mode is set to an unsupported value
+ std::string e("Invalid UNITY_BUILD_MODE value of " + *unityMode +
+ " assigned to target " + target->GetName() +
+ ". Acceptable values are BATCH and GROUP.");
+ this->IssueMessage(MessageType::FATAL_ERROR, e);
}
- for (size_t itemsLeft = filtered_sources.size(), chunk, batch = 0;
- itemsLeft > 0; itemsLeft -= chunk, ++batch) {
-
- chunk = std::min(itemsLeft, batchSize);
-
- std::string filename = cmStrCat(filename_base, "unity_", batch,
- (lang == "C") ? "_c.c" : "_cxx.cxx");
-
- const std::string filename_tmp = cmStrCat(filename, ".tmp");
- {
- size_t begin = batch * batchSize;
- size_t end = begin + chunk;
-
- cmGeneratedFileStream file(
- filename_tmp, false,
- this->GetGlobalGenerator()->GetMakefileEncoding());
- file << "/* generated by CMake */\n\n";
-
- for (; begin != end; ++begin) {
- cmSourceFile* sf = filtered_sources[begin];
-
- target->AddSourceFileToUnityBatch(sf->ResolveFullPath());
- sf->SetProperty("UNITY_SOURCE_FILE", filename.c_str());
-
- if (beforeInclude) {
- file << beforeInclude << "\n";
- }
-
- file << "#include \"" << sf->ResolveFullPath() << "\"\n";
-
- if (afterInclude) {
- file << afterInclude << "\n";
- }
- }
- }
- cmSystemTools::MoveFileIfDifferent(filename_tmp, filename);
-
- target->AddSource(filename, true);
-
- auto unity = this->Makefile->GetOrCreateSource(filename);
+ for (auto const& file : unity_files) {
+ auto unity = this->GetMakefile()->GetOrCreateSource(file);
+ target->AddSource(file, true);
unity->SetProperty("SKIP_UNITY_BUILD_INCLUSION", "ON");
- unity->SetProperty("UNITY_SOURCE_FILE", filename.c_str());
+ unity->SetProperty("UNITY_SOURCE_FILE", file.c_str());
}
}
}
@@ -2950,11 +3174,11 @@ void cmLocalGenerator::JoinDefines(const std::set<std::string>& defines,
// command line without any escapes. However we still have to
// get the '$' and '#' characters through WMake as '$$' and
// '$#'.
- for (const char* c = define.c_str(); *c; ++c) {
- if (*c == '$' || *c == '#') {
+ for (char c : define) {
+ if (c == '$' || c == '#') {
def += '$';
}
- def += *c;
+ def += c;
}
} else {
// Make the definition appear properly on the command line. Use
@@ -2998,8 +3222,8 @@ const char* cmLocalGenerator::GetFeature(const std::string& feature,
}
cmStateSnapshot snp = this->StateSnapshot;
while (snp.IsValid()) {
- if (const char* value = snp.GetDirectory().GetProperty(featureName)) {
- return value;
+ if (cmProp value = snp.GetDirectory().GetProperty(featureName)) {
+ return value->c_str();
}
snp = snp.GetBuildsystemDirectoryParent();
}
@@ -3064,8 +3288,8 @@ void cmLocalGenerator::GenerateTargetInstallRules(
}
// Include the user-specified pre-install script for this target.
- if (const char* preinstall = l->GetProperty("PRE_INSTALL_SCRIPT")) {
- cmInstallScriptGenerator g(preinstall, false, "", false);
+ if (cmProp preinstall = l->GetProperty("PRE_INSTALL_SCRIPT")) {
+ cmInstallScriptGenerator g(*preinstall, false, "", false);
g.Generate(os, config, configurationTypes);
}
@@ -3117,8 +3341,8 @@ void cmLocalGenerator::GenerateTargetInstallRules(
}
// Include the user-specified post-install script for this target.
- if (const char* postinstall = l->GetProperty("POST_INSTALL_SCRIPT")) {
- cmInstallScriptGenerator g(postinstall, false, "", false);
+ if (cmProp postinstall = l->GetProperty("POST_INSTALL_SCRIPT")) {
+ cmInstallScriptGenerator g(*postinstall, false, "", false);
g.Generate(os, config, configurationTypes);
}
}
@@ -3304,11 +3528,12 @@ std::string cmLocalGenerator::GetObjectFileNameWithoutTarget(
// Select a nice-looking reference to the source file to construct
// the object file name.
std::string objectName;
+ // XXX(clang-tidy): https://bugs.llvm.org/show_bug.cgi?id=44165
+ // NOLINTNEXTLINE(bugprone-branch-clone)
if ((relSource && !relBinary) || (subSource && !subBinary)) {
objectName = relFromSource;
- } else if ((relBinary && !relSource) || (subBinary && !subSource)) {
- objectName = relFromBinary;
- } else if (relFromBinary.length() < relFromSource.length()) {
+ } else if ((relBinary && !relSource) || (subBinary && !subSource) ||
+ relFromBinary.length() < relFromSource.length()) {
objectName = relFromBinary;
} else {
objectName = relFromSource;
@@ -3326,12 +3551,12 @@ std::string cmLocalGenerator::GetObjectFileNameWithoutTarget(
// Ensure that for the CMakeFiles/<target>.dir/generated_source_file
// we don't end up having:
// CMakeFiles/<target>.dir/CMakeFiles/<target>.dir/generated_source_file.obj
- const char* unitySourceFile = source.GetProperty("UNITY_SOURCE_FILE");
- const char* pchExtension = source.GetProperty("PCH_EXTENSION");
+ cmProp unitySourceFile = source.GetProperty("UNITY_SOURCE_FILE");
+ cmProp psExtension = source.GetProperty("PCH_EXTENSION");
const bool isPchObject = objectName.find("cmake_pch") != std::string::npos;
- if (unitySourceFile || pchExtension || isPchObject) {
- if (pchExtension) {
- customOutputExtension = pchExtension;
+ if (unitySourceFile || psExtension || isPchObject) {
+ if (psExtension) {
+ customOutputExtension = psExtension->c_str();
}
cmsys::RegularExpression var("(CMakeFiles/[^/]+.dir/)");
@@ -3467,7 +3692,6 @@ bool cmLocalGenerator::NeedBackwardsCompatibility_2_4()
break;
case cmPolicies::NEW:
// New behavior is to ignore the variable.
- return false;
case cmPolicies::REQUIRED_IF_USED:
case cmPolicies::REQUIRED_ALWAYS:
// This will never be the case because the only way to require
@@ -3529,8 +3753,8 @@ bool cmLocalGenerator::CheckDefinition(std::string const& define) const
static void cmLGInfoProp(cmMakefile* mf, cmGeneratorTarget* target,
const std::string& prop)
{
- if (const char* val = target->GetProperty(prop)) {
- mf->AddDefinition(prop, val);
+ if (cmProp val = target->GetProperty(prop)) {
+ mf->AddDefinition(prop, *val);
}
}
@@ -3539,8 +3763,9 @@ void cmLocalGenerator::GenerateAppleInfoPList(cmGeneratorTarget* target,
const std::string& fname)
{
// Find the Info.plist template.
- const char* in = target->GetProperty("MACOSX_BUNDLE_INFO_PLIST");
- std::string inFile = (in && *in) ? in : "MacOSXBundleInfo.plist.in";
+ cmProp in = target->GetProperty("MACOSX_BUNDLE_INFO_PLIST");
+ std::string inFile =
+ (in && !in->empty()) ? *in : "MacOSXBundleInfo.plist.in";
if (!cmSystemTools::FileIsFullPath(inFile)) {
std::string inMod = this->Makefile->GetModulesFile(inFile);
if (!inMod.empty()) {
@@ -3578,8 +3803,9 @@ void cmLocalGenerator::GenerateFrameworkInfoPList(
const std::string& fname)
{
// Find the Info.plist template.
- const char* in = target->GetProperty("MACOSX_FRAMEWORK_INFO_PLIST");
- std::string inFile = (in && *in) ? in : "MacOSXFrameworkInfo.plist.in";
+ cmProp in = target->GetProperty("MACOSX_FRAMEWORK_INFO_PLIST");
+ std::string inFile =
+ (in && !in->empty()) ? *in : "MacOSXFrameworkInfo.plist.in";
if (!cmSystemTools::FileIsFullPath(inFile)) {
std::string inMod = this->Makefile->GetModulesFile(inFile);
if (!inMod.empty()) {
@@ -3647,7 +3873,7 @@ cmSourceFile* AddCustomCommand(
const cmCustomCommandLines& commandLines, const char* comment,
const char* workingDir, bool replace, bool escapeOldStyle,
bool uses_terminal, bool command_expand_lists, const std::string& depfile,
- const std::string& job_pool)
+ const std::string& job_pool, bool stdPipesUTF8)
{
cmMakefile* mf = lg.GetMakefile();
@@ -3709,7 +3935,8 @@ cmSourceFile* AddCustomCommand(
}
std::unique_ptr<cmCustomCommand> cc = cm::make_unique<cmCustomCommand>(
- outputs, byproducts, depends2, commandLines, lfbt, comment, workingDir);
+ outputs, byproducts, depends2, commandLines, lfbt, comment, workingDir,
+ stdPipesUTF8);
cc->SetEscapeOldStyle(escapeOldStyle);
cc->SetEscapeAllowMakeVars(true);
cc->SetImplicitDepends(implicit_depends);
@@ -3736,7 +3963,7 @@ void AddCustomCommandToTarget(cmLocalGenerator& lg,
const char* workingDir, bool escapeOldStyle,
bool uses_terminal, const std::string& depfile,
const std::string& job_pool,
- bool command_expand_lists)
+ bool command_expand_lists, bool stdPipesUTF8)
{
cmMakefile* mf = lg.GetMakefile();
@@ -3746,7 +3973,7 @@ void AddCustomCommandToTarget(cmLocalGenerator& lg,
// Add the command to the appropriate build step for the target.
std::vector<std::string> no_output;
cmCustomCommand cc(no_output, byproducts, depends, commandLines, lfbt,
- comment, workingDir);
+ comment, workingDir, stdPipesUTF8);
cc.SetEscapeOldStyle(escapeOldStyle);
cc.SetEscapeAllowMakeVars(true);
cc.SetUsesTerminal(uses_terminal);
@@ -3777,7 +4004,7 @@ cmSourceFile* AddCustomCommandToOutput(
const cmCustomCommandLines& commandLines, const char* comment,
const char* workingDir, bool replace, bool escapeOldStyle,
bool uses_terminal, bool command_expand_lists, const std::string& depfile,
- const std::string& job_pool)
+ const std::string& job_pool, bool stdPipesUTF8)
{
// Always create the output sources and mark them generated.
CreateGeneratedSources(lg, outputs, origin, lfbt);
@@ -3786,7 +4013,7 @@ cmSourceFile* AddCustomCommandToOutput(
return AddCustomCommand(
lg, lfbt, outputs, byproducts, depends, main_dependency, implicit_depends,
commandLines, comment, workingDir, replace, escapeOldStyle, uses_terminal,
- command_expand_lists, depfile, job_pool);
+ command_expand_lists, depfile, job_pool, stdPipesUTF8);
}
void AppendCustomCommandToOutput(cmLocalGenerator& lg,
@@ -3822,7 +4049,7 @@ void AddUtilityCommand(cmLocalGenerator& lg, const cmListFileBacktrace& lfbt,
const cmCustomCommandLines& commandLines,
bool escapeOldStyle, const char* comment,
bool uses_terminal, bool command_expand_lists,
- const std::string& job_pool)
+ const std::string& job_pool, bool stdPipesUTF8)
{
// Always create the byproduct sources and mark them generated.
CreateGeneratedSource(lg, force.Name, origin, lfbt);
@@ -3839,7 +4066,7 @@ void AddUtilityCommand(cmLocalGenerator& lg, const cmListFileBacktrace& lfbt,
lg, lfbt, { force.Name }, byproducts, depends, no_main_dependency,
no_implicit_depends, commandLines, comment, workingDir, /*replace=*/false,
escapeOldStyle, uses_terminal, command_expand_lists, /*depfile=*/"",
- job_pool);
+ job_pool, stdPipesUTF8);
if (rule) {
lg.GetMakefile()->AddTargetByproducts(target, byproducts);
}
diff --git a/Source/cmLocalGenerator.h b/Source/cmLocalGenerator.h
index a459384..9beae61 100644
--- a/Source/cmLocalGenerator.h
+++ b/Source/cmLocalGenerator.h
@@ -13,7 +13,7 @@
#include <unordered_map>
#include <vector>
-#include "cm_kwiml.h"
+#include <cm3p/kwiml/int.h>
#include "cmCustomCommandTypes.h"
#include "cmListFileCache.h"
@@ -105,8 +105,8 @@ public:
void AddArchitectureFlags(std::string& flags,
cmGeneratorTarget const* target,
- const std::string& lang,
- const std::string& config);
+ const std::string& lang, const std::string& config,
+ const std::string& filterArch = std::string());
void AddLanguageFlags(std::string& flags, cmGeneratorTarget const* target,
const std::string& lang, const std::string& config);
@@ -297,7 +297,8 @@ public:
const char* comment, const char* workingDir, bool escapeOldStyle = true,
bool uses_terminal = false, const std::string& depfile = "",
const std::string& job_pool = "", bool command_expand_lists = false,
- cmObjectLibraryCommands objLibCommands = cmObjectLibraryCommands::Reject);
+ cmObjectLibraryCommands objLibCommands = cmObjectLibraryCommands::Reject,
+ bool stdPipesUTF8 = false);
/**
* Add a custom command to a source file.
@@ -308,7 +309,8 @@ public:
const cmCustomCommandLines& commandLines, const char* comment,
const char* workingDir, bool replace = false, bool escapeOldStyle = true,
bool uses_terminal = false, bool command_expand_lists = false,
- const std::string& depfile = "", const std::string& job_pool = "");
+ const std::string& depfile = "", const std::string& job_pool = "",
+ bool stdPipesUTF8 = false);
cmSourceFile* AddCustomCommandToOutput(
const std::vector<std::string>& outputs,
const std::vector<std::string>& byproducts,
@@ -318,7 +320,8 @@ public:
const cmCustomCommandLines& commandLines, const char* comment,
const char* workingDir, bool replace = false, bool escapeOldStyle = true,
bool uses_terminal = false, bool command_expand_lists = false,
- const std::string& depfile = "", const std::string& job_pool = "");
+ const std::string& depfile = "", const std::string& job_pool = "",
+ bool stdPipesUTF8 = false);
/**
* Add a utility to the build. A utility target is a command that is run
@@ -330,7 +333,8 @@ public:
const std::vector<std::string>& depends,
const cmCustomCommandLines& commandLines, bool escapeOldStyle = true,
const char* comment = nullptr, bool uses_terminal = false,
- bool command_expand_lists = false, const std::string& job_pool = "");
+ bool command_expand_lists = false, const std::string& job_pool = "",
+ bool stdPipesUTF8 = false);
std::string GetProjectName() const;
@@ -417,6 +421,11 @@ public:
/** Fill out these strings for the given target. Libraries to link,
* flags, and linkflags. */
+ void GetDeviceLinkFlags(cmLinkLineComputer* linkLineComputer,
+ const std::string& config, std::string& linkLibs,
+ std::string& linkFlags, std::string& frameworkPath,
+ std::string& linkPath, cmGeneratorTarget* target);
+
void GetTargetFlags(cmLinkLineComputer* linkLineComputer,
const std::string& config, std::string& linkLibs,
std::string& flags, std::string& linkFlags,
@@ -435,10 +444,11 @@ public:
std::string const& lang) const;
void GetTargetCompileFlags(cmGeneratorTarget* target,
std::string const& config,
- std::string const& lang, std::string& flags);
- std::vector<BT<std::string>> GetTargetCompileFlags(cmGeneratorTarget* target,
- std::string const& config,
- std::string const& lang);
+ std::string const& lang, std::string& flags,
+ std::string const& arch = std::string());
+ std::vector<BT<std::string>> GetTargetCompileFlags(
+ cmGeneratorTarget* target, std::string const& config,
+ std::string const& lang, std::string const& arch = std::string());
std::string GetFrameworkFlags(std::string const& l,
std::string const& config,
@@ -549,7 +559,7 @@ void AddCustomCommandToTarget(cmLocalGenerator& lg,
const char* workingDir, bool escapeOldStyle,
bool uses_terminal, const std::string& depfile,
const std::string& job_pool,
- bool command_expand_lists);
+ bool command_expand_lists, bool stdPipesUTF8);
cmSourceFile* AddCustomCommandToOutput(
cmLocalGenerator& lg, const cmListFileBacktrace& lfbt,
@@ -560,7 +570,7 @@ cmSourceFile* AddCustomCommandToOutput(
const cmCustomCommandLines& commandLines, const char* comment,
const char* workingDir, bool replace, bool escapeOldStyle,
bool uses_terminal, bool command_expand_lists, const std::string& depfile,
- const std::string& job_pool);
+ const std::string& job_pool, bool stdPipesUTF8);
void AppendCustomCommandToOutput(cmLocalGenerator& lg,
const cmListFileBacktrace& lfbt,
@@ -577,7 +587,7 @@ void AddUtilityCommand(cmLocalGenerator& lg, const cmListFileBacktrace& lfbt,
const cmCustomCommandLines& commandLines,
bool escapeOldStyle, const char* comment,
bool uses_terminal, bool command_expand_lists,
- const std::string& job_pool);
+ const std::string& job_pool, bool stdPipesUTF8);
}
#endif
diff --git a/Source/cmLocalNinjaGenerator.cxx b/Source/cmLocalNinjaGenerator.cxx
index be1dd0d..d1944a4 100644
--- a/Source/cmLocalNinjaGenerator.cxx
+++ b/Source/cmLocalNinjaGenerator.cxx
@@ -144,8 +144,9 @@ std::string cmLocalNinjaGenerator::ConvertToIncludeReference(
bool forceFullPaths)
{
if (forceFullPaths) {
- return this->ConvertToOutputFormat(cmSystemTools::CollapseFullPath(path),
- format);
+ return this->ConvertToOutputFormat(
+ cmSystemTools::CollapseFullPath(path, this->GetCurrentBinaryDirectory()),
+ format);
}
return this->ConvertToOutputFormat(
this->MaybeConvertToRelativePath(this->GetBinaryDirectory(), path),
@@ -206,9 +207,8 @@ void cmLocalNinjaGenerator::WriteBuildFileTop()
void cmLocalNinjaGenerator::WriteProjectHeader(std::ostream& os)
{
cmGlobalNinjaGenerator::WriteDivider(os);
- os << "# Project: " << this->GetProjectName() << std::endl
- << "# Configurations: " << cmJoin(this->GetConfigNames(), ", ")
- << std::endl;
+ os << "# Project: " << this->GetProjectName() << '\n'
+ << "# Configurations: " << cmJoin(this->GetConfigNames(), ", ") << '\n';
cmGlobalNinjaGenerator::WriteDivider(os);
}
@@ -235,8 +235,7 @@ void cmLocalNinjaGenerator::WriteNinjaRequiredVersion(std::ostream& os)
cmGlobalNinjaGenerator::WriteComment(
os, "Minimal version of Ninja required by this file");
- os << "ninja_required_version = " << requiredVersion << std::endl
- << std::endl;
+ os << "ninja_required_version = " << requiredVersion << "\n\n";
}
void cmLocalNinjaGenerator::WriteNinjaConfigurationVariable(
@@ -251,23 +250,22 @@ void cmLocalNinjaGenerator::WritePools(std::ostream& os)
{
cmGlobalNinjaGenerator::WriteDivider(os);
- const char* jobpools =
+ cmProp jobpools =
this->GetCMakeInstance()->GetState()->GetGlobalProperty("JOB_POOLS");
if (!jobpools) {
- jobpools = this->GetMakefile()->GetDefinition("CMAKE_JOB_POOLS");
+ jobpools = this->GetMakefile()->GetDef("CMAKE_JOB_POOLS");
}
if (jobpools) {
cmGlobalNinjaGenerator::WriteComment(
os, "Pools defined by global property JOB_POOLS");
- std::vector<std::string> pools = cmExpandedList(jobpools);
+ std::vector<std::string> pools = cmExpandedList(*jobpools);
for (std::string const& pool : pools) {
const std::string::size_type eq = pool.find('=');
unsigned int jobs;
if (eq != std::string::npos &&
sscanf(pool.c_str() + eq, "=%u", &jobs) == 1) {
- os << "pool " << pool.substr(0, eq) << std::endl;
- os << " depth = " << jobs << std::endl;
- os << std::endl;
+ os << "pool " << pool.substr(0, eq) << "\n depth = " << jobs
+ << "\n\n";
} else {
cmSystemTools::Error("Invalid pool defined by property 'JOB_POOLS': " +
pool);
@@ -279,8 +277,7 @@ void cmLocalNinjaGenerator::WritePools(std::ostream& os)
void cmLocalNinjaGenerator::WriteNinjaFilesInclusionConfig(std::ostream& os)
{
cmGlobalNinjaGenerator::WriteDivider(os);
- os << "# Include auxiliary files.\n"
- << "\n";
+ os << "# Include auxiliary files.\n\n";
cmGlobalNinjaGenerator* ng = this->GetGlobalNinjaGenerator();
std::string const ninjaCommonFile =
ng->NinjaOutputPath(cmGlobalNinjaMultiGenerator::NINJA_COMMON_FILE);
@@ -293,8 +290,7 @@ void cmLocalNinjaGenerator::WriteNinjaFilesInclusionConfig(std::ostream& os)
void cmLocalNinjaGenerator::WriteNinjaFilesInclusionCommon(std::ostream& os)
{
cmGlobalNinjaGenerator::WriteDivider(os);
- os << "# Include auxiliary files.\n"
- << "\n";
+ os << "# Include auxiliary files.\n\n";
cmGlobalNinjaGenerator* ng = this->GetGlobalNinjaGenerator();
std::string const ninjaRulesFile =
ng->NinjaOutputPath(cmGlobalNinjaGenerator::NINJA_RULES_FILE);
@@ -307,14 +303,14 @@ void cmLocalNinjaGenerator::WriteNinjaFilesInclusionCommon(std::ostream& os)
void cmLocalNinjaGenerator::WriteProcessedMakefile(std::ostream& os)
{
cmGlobalNinjaGenerator::WriteDivider(os);
- os << "# Write statements declared in CMakeLists.txt:" << std::endl
+ os << "# Write statements declared in CMakeLists.txt:\n"
<< "# " << this->Makefile->GetDefinition("CMAKE_CURRENT_LIST_FILE")
- << std::endl;
+ << '\n';
if (this->IsRootMakefile()) {
- os << "# Which is the root file." << std::endl;
+ os << "# Which is the root file.\n";
}
cmGlobalNinjaGenerator::WriteDivider(os);
- os << std::endl;
+ os << '\n';
}
void cmLocalNinjaGenerator::AppendTargetOutputs(cmGeneratorTarget* target,
@@ -632,10 +628,9 @@ void cmLocalNinjaGenerator::WriteCustomCommandBuildStatements(
std::string cmLocalNinjaGenerator::MakeCustomLauncher(
cmCustomCommandGenerator const& ccg)
{
- const char* property_value =
- this->Makefile->GetProperty("RULE_LAUNCH_CUSTOM");
+ cmProp property_value = this->Makefile->GetProperty("RULE_LAUNCH_CUSTOM");
- if (!property_value || !*property_value) {
+ if (!property_value || property_value->empty()) {
return std::string();
}
@@ -657,7 +652,7 @@ std::string cmLocalNinjaGenerator::MakeCustomLauncher(
std::unique_ptr<cmRulePlaceholderExpander> rulePlaceholderExpander(
this->CreateRulePlaceholderExpander());
- std::string launcher = property_value;
+ std::string launcher = *property_value;
rulePlaceholderExpander->ExpandRuleVariables(this, launcher, vars);
if (!launcher.empty()) {
launcher += " ";
@@ -668,11 +663,11 @@ std::string cmLocalNinjaGenerator::MakeCustomLauncher(
void cmLocalNinjaGenerator::AdditionalCleanFiles(const std::string& config)
{
- if (const char* prop_value =
+ if (cmProp prop_value =
this->Makefile->GetProperty("ADDITIONAL_CLEAN_FILES")) {
std::vector<std::string> cleanFiles;
{
- cmExpandList(cmGeneratorExpression::Evaluate(prop_value, this, config),
+ cmExpandList(cmGeneratorExpression::Evaluate(*prop_value, this, config),
cleanFiles);
}
std::string const& binaryDir = this->GetCurrentBinaryDirectory();
diff --git a/Source/cmLocalUnixMakefileGenerator3.cxx b/Source/cmLocalUnixMakefileGenerator3.cxx
index c9c656c..4c7c8c4 100644
--- a/Source/cmLocalUnixMakefileGenerator3.cxx
+++ b/Source/cmLocalUnixMakefileGenerator3.cxx
@@ -48,37 +48,6 @@
# include "cmDependsJava.h"
#endif
-// Escape special characters in Makefile dependency lines
-class cmMakeSafe
-{
-public:
- cmMakeSafe(const char* s)
- : Data(s)
- {
- }
- cmMakeSafe(std::string const& s)
- : Data(s.c_str())
- {
- }
-
-private:
- const char* Data;
- friend std::ostream& operator<<(std::ostream& os, cmMakeSafe const& self)
- {
- for (const char* c = self.Data; *c; ++c) {
- switch (*c) {
- case '=':
- os << "$(EQUALS)";
- break;
- default:
- os << *c;
- break;
- }
- }
- return os;
- }
-};
-
// Helper function used below.
static std::string cmSplitExtension(std::string const& in, std::string& base)
{
@@ -498,6 +467,14 @@ const std::string& cmLocalUnixMakefileGenerator3::GetHomeRelativeOutputPath()
return this->HomeRelativeOutputPath;
}
+std::string cmLocalUnixMakefileGenerator3::ConvertToMakefilePath(
+ std::string const& path) const
+{
+ cmGlobalUnixMakefileGenerator3* gg =
+ static_cast<cmGlobalUnixMakefileGenerator3*>(this->GlobalGenerator);
+ return gg->ConvertToMakefilePath(path);
+}
+
void cmLocalUnixMakefileGenerator3::WriteMakeRule(
std::ostream& os, const char* comment, const std::string& target,
const std::vector<std::string>& depends,
@@ -528,7 +505,7 @@ void cmLocalUnixMakefileGenerator3::WriteMakeRule(
}
// Construct the left hand side of the rule.
- std::string tgt = cmSystemTools::ConvertToOutputPath(
+ std::string tgt = this->ConvertToMakefilePath(
this->MaybeConvertToRelativePath(this->GetBinaryDirectory(), target));
const char* space = "";
@@ -542,30 +519,30 @@ void cmLocalUnixMakefileGenerator3::WriteMakeRule(
if (symbolic) {
if (const char* sym =
this->Makefile->GetDefinition("CMAKE_MAKE_SYMBOLIC_RULE")) {
- os << cmMakeSafe(tgt) << space << ": " << sym << "\n";
+ os << tgt << space << ": " << sym << "\n";
}
}
// Write the rule.
if (depends.empty()) {
// No dependencies. The commands will always run.
- os << cmMakeSafe(tgt) << space << ":\n";
+ os << tgt << space << ":\n";
} else {
// Split dependencies into multiple rule lines. This allows for
// very long dependency lists even on older make implementations.
std::string binDir = this->GetBinaryDirectory();
for (std::string const& depend : depends) {
- replace = depend;
- replace = cmSystemTools::ConvertToOutputPath(
- this->MaybeConvertToRelativePath(binDir, replace));
- os << cmMakeSafe(tgt) << space << ": " << cmMakeSafe(replace) << "\n";
+ os << tgt << space << ": "
+ << this->ConvertToMakefilePath(
+ this->MaybeConvertToRelativePath(binDir, depend))
+ << '\n';
}
}
// Write the list of commands.
os << cmWrap("\t", commands, "", "\n") << "\n";
if (symbolic && !this->IsWatcomWMake()) {
- os << ".PHONY : " << cmMakeSafe(tgt) << "\n";
+ os << ".PHONY : " << tgt << "\n";
}
os << "\n";
// Add the output to the local help if requested.
@@ -623,8 +600,7 @@ void cmLocalUnixMakefileGenerator3::WriteMakeVariables(
this->MaybeConvertWatcomShellCommand(cmSystemTools::GetCMakeCommand());
if (cmakeShellCommand.empty()) {
cmakeShellCommand = this->ConvertToOutputFormat(
- cmSystemTools::CollapseFullPath(cmSystemTools::GetCMakeCommand()),
- cmOutputConverter::SHELL);
+ cmSystemTools::GetCMakeCommand(), cmOutputConverter::SHELL);
}
/* clang-format off */
@@ -648,16 +624,14 @@ void cmLocalUnixMakefileGenerator3::WriteMakeVariables(
<< "# The top-level source directory on which CMake was run.\n"
<< "CMAKE_SOURCE_DIR = "
<< this->ConvertToOutputFormat(
- cmSystemTools::CollapseFullPath(this->GetSourceDirectory()),
- cmOutputConverter::SHELL)
+ this->GetSourceDirectory(), cmOutputConverter::SHELL)
<< "\n"
<< "\n";
makefileStream
<< "# The top-level build directory on which CMake was run.\n"
<< "CMAKE_BINARY_DIR = "
<< this->ConvertToOutputFormat(
- cmSystemTools::CollapseFullPath(this->GetBinaryDirectory()),
- cmOutputConverter::SHELL)
+ this->GetBinaryDirectory(), cmOutputConverter::SHELL)
<< "\n"
<< "\n";
/* clang-format on */
@@ -978,7 +952,8 @@ void cmLocalUnixMakefileGenerator3::AppendCustomCommand(
// Expand rule variables referenced in the given launcher command.
cmRulePlaceholderExpander::RuleVariables vars;
vars.CMTargetName = target->GetName().c_str();
- vars.CMTargetType = cmState::GetTargetTypeName(target->GetType());
+ vars.CMTargetType =
+ cmState::GetTargetTypeName(target->GetType()).c_str();
std::string output;
const std::vector<std::string>& outputs = ccg.GetOutputs();
if (!outputs.empty()) {
@@ -1057,10 +1032,9 @@ void cmLocalUnixMakefileGenerator3::AppendCleanCommand(
cleanfile += filename;
}
cleanfile += ".cmake";
- std::string cleanfilePath = cmSystemTools::CollapseFullPath(cleanfile);
- cmsys::ofstream fout(cleanfilePath.c_str());
+ cmsys::ofstream fout(cleanfile.c_str());
if (!fout) {
- cmSystemTools::Error("Could not create " + cleanfilePath);
+ cmSystemTools::Error("Could not create " + cleanfile);
}
if (!files.empty()) {
fout << "file(REMOVE_RECURSE\n";
@@ -1102,10 +1076,10 @@ void cmLocalUnixMakefileGenerator3::AppendDirectoryCleanCommand(
{
std::vector<std::string> cleanFiles;
// Look for additional files registered for cleaning in this directory.
- if (const char* prop_value =
+ if (cmProp prop_value =
this->Makefile->GetProperty("ADDITIONAL_CLEAN_FILES")) {
cmExpandList(cmGeneratorExpression::Evaluate(
- prop_value, this,
+ *prop_value, this,
this->Makefile->GetSafeDefinition("CMAKE_BUILD_TYPE")),
cleanFiles);
}
@@ -1120,10 +1094,9 @@ void cmLocalUnixMakefileGenerator3::AppendDirectoryCleanCommand(
cmStrCat(currentBinaryDir, "/CMakeFiles/cmake_directory_clean.cmake");
// Write clean script
{
- std::string cleanfilePath = cmSystemTools::CollapseFullPath(cleanfile);
- cmsys::ofstream fout(cleanfilePath.c_str());
+ cmsys::ofstream fout(cleanfile.c_str());
if (!fout) {
- cmSystemTools::Error("Could not create " + cleanfilePath);
+ cmSystemTools::Error("Could not create " + cleanfile);
return;
}
fout << "file(REMOVE_RECURSE\n";
@@ -1194,9 +1167,8 @@ void cmLocalUnixMakefileGenerator3::AppendEcho(
color_name);
if (progress) {
cmd += "--progress-dir=";
- cmd += this->ConvertToOutputFormat(
- cmSystemTools::CollapseFullPath(progress->Dir),
- cmOutputConverter::SHELL);
+ cmd += this->ConvertToOutputFormat(progress->Dir,
+ cmOutputConverter::SHELL);
cmd += " ";
cmd += "--progress-num=";
cmd += progress->Arg;
@@ -1331,10 +1303,9 @@ bool cmLocalUnixMakefileGenerator3::UpdateDependencies(
int result;
if (!ftc->Compare(internalDependFile, tgtInfo, &result) || result < 0) {
if (verbose) {
- std::ostringstream msg;
- msg << "Dependee \"" << tgtInfo << "\" is newer than depender \""
- << internalDependFile << "\"." << std::endl;
- cmSystemTools::Stdout(msg.str());
+ cmSystemTools::Stdout(cmStrCat("Dependee \"", tgtInfo,
+ "\" is newer than depender \"",
+ internalDependFile, "\".\n"));
}
needRescanDependInfo = true;
}
@@ -1351,10 +1322,9 @@ bool cmLocalUnixMakefileGenerator3::UpdateDependencies(
if (!ftc->Compare(internalDependFile, dirInfoFile, &result) ||
result < 0) {
if (verbose) {
- std::ostringstream msg;
- msg << "Dependee \"" << dirInfoFile << "\" is newer than depender \""
- << internalDependFile << "\"." << std::endl;
- cmSystemTools::Stdout(msg.str());
+ cmSystemTools::Stdout(cmStrCat("Dependee \"", dirInfoFile,
+ "\" is newer than depender \"",
+ internalDependFile, "\".\n"));
}
needRescanDirInfo = true;
}
@@ -1520,11 +1490,9 @@ void cmLocalUnixMakefileGenerator3::CheckMultipleOutputs(bool verbose)
if (cmSystemTools::FileExists(dependee) &&
!cmSystemTools::FileExists(depender)) {
if (verbose) {
- std::ostringstream msg;
- msg << "Deleting primary custom command output \"" << dependee
- << "\" because another output \"" << depender
- << "\" does not exist." << std::endl;
- cmSystemTools::Stdout(msg.str());
+ cmSystemTools::Stdout(cmStrCat(
+ "Deleting primary custom command output \"", dependee,
+ "\" because another output \"", depender, "\" does not exist.\n"));
}
cmSystemTools::RemoveFile(dependee);
}
@@ -1578,10 +1546,8 @@ void cmLocalUnixMakefileGenerator3::WriteLocalAllRules(
std::vector<std::string> commands;
std::vector<std::string> depends;
- const char* text = gt->GetProperty("EchoString");
- if (!text) {
- text = "Running external command ...";
- }
+ cmProp p = gt->GetProperty("EchoString");
+ const char* text = p ? p->c_str() : "Running external command ...";
depends.reserve(gt->GetUtilities().size());
for (BT<std::pair<std::string, bool>> const& u : gt->GetUtilities()) {
depends.push_back(u.Value.first);
@@ -1636,15 +1602,14 @@ void cmLocalUnixMakefileGenerator3::WriteLocalAllRules(
{
std::ostringstream progCmd;
progCmd << "$(CMAKE_COMMAND) -E cmake_progress_start ";
- progCmd << this->ConvertToOutputFormat(
- cmSystemTools::CollapseFullPath(progressDir), cmOutputConverter::SHELL);
+ progCmd << this->ConvertToOutputFormat(progressDir,
+ cmOutputConverter::SHELL);
std::string progressFile = "/CMakeFiles/progress.marks";
std::string progressFileNameFull = this->ConvertToFullPath(progressFile);
progCmd << " "
- << this->ConvertToOutputFormat(
- cmSystemTools::CollapseFullPath(progressFileNameFull),
- cmOutputConverter::SHELL);
+ << this->ConvertToOutputFormat(progressFileNameFull,
+ cmOutputConverter::SHELL);
commands.push_back(progCmd.str());
}
std::string mf2Dir = "CMakeFiles/Makefile2";
@@ -1654,8 +1619,8 @@ void cmLocalUnixMakefileGenerator3::WriteLocalAllRules(
{
std::ostringstream progCmd;
progCmd << "$(CMAKE_COMMAND) -E cmake_progress_start "; // # 0
- progCmd << this->ConvertToOutputFormat(
- cmSystemTools::CollapseFullPath(progressDir), cmOutputConverter::SHELL);
+ progCmd << this->ConvertToOutputFormat(progressDir,
+ cmOutputConverter::SHELL);
progCmd << " 0";
commands.push_back(progCmd.str());
}
@@ -1788,7 +1753,7 @@ private:
const std::string& testDir)
{
// First check if the test directory "starts with" the base directory:
- if (testDir.find(baseDir) != 0) {
+ if (!cmHasPrefix(testDir, baseDir)) {
return false;
}
// If it does, then check that it's either the same string, or that the
@@ -1899,13 +1864,13 @@ void cmLocalUnixMakefileGenerator3::WriteDependLanguageInfo(
// Store include transform rule properties. Write the directory
// rules first because they may be overridden by later target rules.
std::vector<std::string> transformRules;
- if (const char* xform =
+ if (cmProp xform =
this->Makefile->GetProperty("IMPLICIT_DEPENDS_INCLUDE_TRANSFORM")) {
- cmExpandList(xform, transformRules);
+ cmExpandList(*xform, transformRules);
}
- if (const char* xform =
+ if (cmProp xform =
target->GetProperty("IMPLICIT_DEPENDS_INCLUDE_TRANSFORM")) {
- cmExpandList(xform, transformRules);
+ cmExpandList(*xform, transformRules);
}
if (!transformRules.empty()) {
cmakefileStream << "set(CMAKE_INCLUDE_TRANSFORMS\n";
@@ -1972,7 +1937,7 @@ std::string cmLocalUnixMakefileGenerator3::GetRecursiveMakeCall(
void cmLocalUnixMakefileGenerator3::WriteDivider(std::ostream& os)
{
os << "#======================================"
- << "=======================================\n";
+ "=======================================\n";
}
void cmLocalUnixMakefileGenerator3::WriteCMakeArgument(std::ostream& os,
@@ -1980,7 +1945,7 @@ void cmLocalUnixMakefileGenerator3::WriteCMakeArgument(std::ostream& os,
{
// Write the given string to the stream with escaping to get it back
// into CMake through the lexical scanner.
- os << "\"";
+ os << '"';
for (char c : s) {
if (c == '\\') {
os << "\\\\";
@@ -1990,7 +1955,7 @@ void cmLocalUnixMakefileGenerator3::WriteCMakeArgument(std::ostream& os,
os << c;
}
}
- os << "\"";
+ os << '"';
}
std::string cmLocalUnixMakefileGenerator3::ConvertToQuotedOutputPath(
diff --git a/Source/cmLocalUnixMakefileGenerator3.h b/Source/cmLocalUnixMakefileGenerator3.h
index 68eeb29..2b07952 100644
--- a/Source/cmLocalUnixMakefileGenerator3.h
+++ b/Source/cmLocalUnixMakefileGenerator3.h
@@ -46,6 +46,12 @@ public:
// local generators StartOutputDirectory
const std::string& GetHomeRelativeOutputPath();
+ /**
+ * Convert a file path to a Makefile target or dependency with
+ * escaping and quoting suitable for the generator's make tool.
+ */
+ std::string ConvertToMakefilePath(std::string const& path) const;
+
// Write out a make rule
void WriteMakeRule(std::ostream& os, const char* comment,
const std::string& target,
diff --git a/Source/cmLocalVisualStudio10Generator.cxx b/Source/cmLocalVisualStudio10Generator.cxx
index 02e2c6d..9076e26 100644
--- a/Source/cmLocalVisualStudio10Generator.cxx
+++ b/Source/cmLocalVisualStudio10Generator.cxx
@@ -4,7 +4,7 @@
#include <cmext/algorithm>
-#include "cm_expat.h"
+#include <cm3p/expat.h>
#include "cmAlgorithms.h"
#include "cmGeneratorTarget.h"
diff --git a/Source/cmLocalVisualStudio7Generator.cxx b/Source/cmLocalVisualStudio7Generator.cxx
index 9aa3991..0b02724 100644
--- a/Source/cmLocalVisualStudio7Generator.cxx
+++ b/Source/cmLocalVisualStudio7Generator.cxx
@@ -2,12 +2,14 @@
file Copyright.txt or https://cmake.org/licensing for details. */
#include "cmLocalVisualStudio7Generator.h"
+#include <cm/memory>
+#include <cmext/algorithm>
+
#include <windows.h>
+#include <cm3p/expat.h>
#include <ctype.h> // for isspace
-#include "cm_expat.h"
-
#include "cmComputeLinkInformation.h"
#include "cmCustomCommand.h"
#include "cmCustomCommandGenerator.h"
@@ -18,6 +20,7 @@
#include "cmMakefile.h"
#include "cmMessageType.h"
#include "cmSourceFile.h"
+#include "cmStringAlgorithms.h"
#include "cmSystemTools.h"
#include "cmXMLParser.h"
#include "cmake.h"
@@ -52,14 +55,11 @@ extern cmVS7FlagTable cmLocalVisualStudio7GeneratorFlagTable[];
cmLocalVisualStudio7Generator::cmLocalVisualStudio7Generator(
cmGlobalGenerator* gg, cmMakefile* mf)
: cmLocalVisualStudioGenerator(gg, mf)
+ , Internal(cm::make_unique<cmLocalVisualStudio7GeneratorInternals>(this))
{
- this->Internal = new cmLocalVisualStudio7GeneratorInternals(this);
}
-cmLocalVisualStudio7Generator::~cmLocalVisualStudio7Generator()
-{
- delete this->Internal;
-}
+cmLocalVisualStudio7Generator::~cmLocalVisualStudio7Generator() = default;
void cmLocalVisualStudio7Generator::AddHelperCommands()
{
@@ -69,9 +69,9 @@ void cmLocalVisualStudio7Generator::AddHelperCommands()
if (l->GetType() == cmStateEnums::INTERFACE_LIBRARY) {
continue;
}
- const char* path = l->GetProperty("EXTERNAL_MSPROJECT");
+ cmProp path = l->GetProperty("EXTERNAL_MSPROJECT");
if (path) {
- this->ReadAndStoreExternalGUID(l->GetName(), path);
+ this->ReadAndStoreExternalGUID(l->GetName(), path->c_str());
}
}
@@ -226,7 +226,6 @@ cmSourceFile* cmLocalVisualStudio7Generator::CreateVCProjBuildRule()
std::string makefileIn =
cmStrCat(this->GetCurrentSourceDirectory(), "/CMakeLists.txt");
- makefileIn = cmSystemTools::CollapseFullPath(makefileIn);
if (cmSourceFile* file = this->Makefile->GetSource(makefileIn)) {
if (file->GetCustomCommand()) {
return file;
@@ -252,15 +251,15 @@ cmSourceFile* cmLocalVisualStudio7Generator::CreateVCProjBuildRule()
std::string argB = cmStrCat("-B", this->GetBinaryDirectory());
std::string stampName =
cmStrCat(this->GetCurrentBinaryDirectory(), "/CMakeFiles/generate.stamp");
+ bool stdPipesUTF8 = true;
cmCustomCommandLines commandLines =
cmMakeSingleCommandLine({ cmSystemTools::GetCMakeCommand(), argS, argB,
"--check-stamp-file", stampName });
std::string comment = cmStrCat("Building Custom Rule ", makefileIn);
const char* no_working_directory = nullptr;
- std::string fullpathStampName = cmSystemTools::CollapseFullPath(stampName);
- this->AddCustomCommandToOutput(fullpathStampName, listFiles, makefileIn,
- commandLines, comment.c_str(),
- no_working_directory, true, false);
+ this->AddCustomCommandToOutput(
+ stampName, listFiles, makefileIn, commandLines, comment.c_str(),
+ no_working_directory, true, false, false, false, "", "", stdPipesUTF8);
if (cmSourceFile* file = this->Makefile->GetSource(makefileIn)) {
// Finalize the source file path now since we're adding this after
// the generator validated all project-named sources.
@@ -672,7 +671,7 @@ void cmLocalVisualStudio7Generator::WriteConfiguration(
if (this->FortranProject) {
switch (cmOutputConverter::GetFortranFormat(
- target->GetProperty("Fortran_FORMAT"))) {
+ target->GetSafeProperty("Fortran_FORMAT"))) {
case cmOutputConverter::FortranFormatFixed:
flags += " -fixed";
break;
@@ -778,12 +777,11 @@ void cmLocalVisualStudio7Generator::WriteConfiguration(
fout << "\t\t\t<Tool\n"
<< "\t\t\t\tName=\"" << tool << "\"\n";
if (this->FortranProject) {
- const char* target_mod_dir =
- target->GetProperty("Fortran_MODULE_DIRECTORY");
+ cmProp target_mod_dir = target->GetProperty("Fortran_MODULE_DIRECTORY");
std::string modDir;
if (target_mod_dir) {
modDir = this->MaybeConvertToRelativePath(
- this->GetCurrentBinaryDirectory(), target_mod_dir);
+ this->GetCurrentBinaryDirectory(), *target_mod_dir);
} else {
modDir = ".";
}
@@ -937,17 +935,17 @@ void cmLocalVisualStudio7Generator::OutputBuildTool(
" " + GetBuildTypeLinkerFlags("CMAKE_MODULE_LINKER_FLAGS", configName);
}
- const char* targetLinkFlags = target->GetProperty("LINK_FLAGS");
+ cmProp targetLinkFlags = target->GetProperty("LINK_FLAGS");
if (targetLinkFlags) {
extraLinkOptions += " ";
- extraLinkOptions += targetLinkFlags;
+ extraLinkOptions += *targetLinkFlags;
}
std::string configTypeUpper = cmSystemTools::UpperCase(configName);
std::string linkFlagsConfig = cmStrCat("LINK_FLAGS_", configTypeUpper);
targetLinkFlags = target->GetProperty(linkFlagsConfig);
if (targetLinkFlags) {
extraLinkOptions += " ";
- extraLinkOptions += targetLinkFlags;
+ extraLinkOptions += *targetLinkFlags;
}
std::vector<std::string> opts;
@@ -1006,9 +1004,8 @@ void cmLocalVisualStudio7Generator::OutputBuildTool(
}
}
std::string libflags;
- this->GetStaticLibraryFlags(libflags, configTypeUpper,
- target->GetLinkerLanguage(configName),
- target);
+ this->GetStaticLibraryFlags(
+ libflags, configName, target->GetLinkerLanguage(configName), target);
if (!libflags.empty()) {
fout << "\t\t\t\tAdditionalOptions=\"" << libflags << "\"\n";
}
@@ -1206,8 +1203,8 @@ void cmLocalVisualStudio7Generator::OutputDeploymentDebuggerTool(
std::ostream& fout, std::string const& config, cmGeneratorTarget* target)
{
if (this->WindowsCEProject) {
- const char* dir = target->GetProperty("DEPLOYMENT_REMOTE_DIRECTORY");
- const char* additionalFiles =
+ cmProp dir = target->GetProperty("DEPLOYMENT_REMOTE_DIRECTORY");
+ cmProp additionalFiles =
target->GetProperty("DEPLOYMENT_ADDITIONAL_FILES");
if (dir == nullptr && additionalFiles == nullptr) {
@@ -1217,15 +1214,15 @@ void cmLocalVisualStudio7Generator::OutputDeploymentDebuggerTool(
fout << "\t\t\t<DeploymentTool\n"
"\t\t\t\tForceDirty=\"-1\"\n"
"\t\t\t\tRemoteDirectory=\""
- << GetEscapedPropertyIfValueNotNULL(dir)
+ << GetEscapedPropertyIfValueNotNULL(dir->c_str())
<< "\"\n"
"\t\t\t\tRegisterOutput=\"0\"\n"
"\t\t\t\tAdditionalFiles=\""
- << GetEscapedPropertyIfValueNotNULL(additionalFiles) << "\"/>\n";
+ << GetEscapedPropertyIfValueNotNULL(additionalFiles->c_str())
+ << "\"/>\n";
if (dir != nullptr) {
- std::string const exe =
- dir + std::string("\\") + target->GetFullName(config);
+ std::string const exe = *dir + "\\" + target->GetFullName(config);
fout << "\t\t\t<DebuggerTool\n"
"\t\t\t\tRemoteExecutable=\""
@@ -1448,14 +1445,15 @@ cmLocalVisualStudio7GeneratorFCInfo::cmLocalVisualStudio7GeneratorFCInfo(
needfc = true;
}
const std::string COMPILE_FLAGS("COMPILE_FLAGS");
- if (const char* cflags = sf.GetProperty(COMPILE_FLAGS)) {
- fc.CompileFlags = genexInterpreter.Evaluate(cflags, COMPILE_FLAGS);
+ if (cmProp cflags = sf.GetProperty(COMPILE_FLAGS)) {
+ fc.CompileFlags = genexInterpreter.Evaluate(*cflags, COMPILE_FLAGS);
needfc = true;
}
const std::string COMPILE_OPTIONS("COMPILE_OPTIONS");
- if (const char* coptions = sf.GetProperty(COMPILE_OPTIONS)) {
+ if (cmProp coptions = sf.GetProperty(COMPILE_OPTIONS)) {
lg->AppendCompileOptions(
- fc.CompileFlags, genexInterpreter.Evaluate(coptions, COMPILE_OPTIONS));
+ fc.CompileFlags,
+ genexInterpreter.Evaluate(*coptions, COMPILE_OPTIONS));
needfc = true;
}
// Add precompile headers compile options.
@@ -1476,7 +1474,7 @@ cmLocalVisualStudio7GeneratorFCInfo::cmLocalVisualStudio7GeneratorFCInfo(
if (lg->FortranProject) {
switch (cmOutputConverter::GetFortranFormat(
- sf.GetProperty("Fortran_FORMAT"))) {
+ sf.GetSafeProperty("Fortran_FORMAT"))) {
case cmOutputConverter::FortranFormatFixed:
fc.CompileFlags = "-fixed " + fc.CompileFlags;
needfc = true;
@@ -1490,31 +1488,30 @@ cmLocalVisualStudio7GeneratorFCInfo::cmLocalVisualStudio7GeneratorFCInfo(
}
}
const std::string COMPILE_DEFINITIONS("COMPILE_DEFINITIONS");
- if (const char* cdefs = sf.GetProperty(COMPILE_DEFINITIONS)) {
- fc.CompileDefs = genexInterpreter.Evaluate(cdefs, COMPILE_DEFINITIONS);
+ if (cmProp cdefs = sf.GetProperty(COMPILE_DEFINITIONS)) {
+ fc.CompileDefs = genexInterpreter.Evaluate(*cdefs, COMPILE_DEFINITIONS);
needfc = true;
}
std::string defPropName = cmStrCat("COMPILE_DEFINITIONS_", configUpper);
- if (const char* ccdefs = sf.GetProperty(defPropName)) {
+ if (cmProp ccdefs = sf.GetProperty(defPropName)) {
fc.CompileDefsConfig =
- genexInterpreter.Evaluate(ccdefs, COMPILE_DEFINITIONS);
+ genexInterpreter.Evaluate(*ccdefs, COMPILE_DEFINITIONS);
needfc = true;
}
const std::string INCLUDE_DIRECTORIES("INCLUDE_DIRECTORIES");
- if (const char* cincs = sf.GetProperty(INCLUDE_DIRECTORIES)) {
- fc.IncludeDirs = genexInterpreter.Evaluate(cincs, INCLUDE_DIRECTORIES);
+ if (cmProp cincs = sf.GetProperty(INCLUDE_DIRECTORIES)) {
+ fc.IncludeDirs = genexInterpreter.Evaluate(*cincs, INCLUDE_DIRECTORIES);
needfc = true;
}
// Check for extra object-file dependencies.
- if (const char* deps = sf.GetProperty("OBJECT_DEPENDS")) {
- std::vector<std::string> depends = cmExpandedList(deps);
+ if (cmProp deps = sf.GetProperty("OBJECT_DEPENDS")) {
+ std::vector<std::string> depends = cmExpandedList(*deps);
const char* sep = "";
- for (std::vector<std::string>::iterator j = depends.begin();
- j != depends.end(); ++j) {
+ for (const std::string& d : depends) {
fc.AdditionalDeps += sep;
- fc.AdditionalDeps += lg->ConvertToXMLOutputPath(*j);
+ fc.AdditionalDeps += lg->ConvertToXMLOutputPath(d);
sep = ";";
needfc = true;
}
@@ -1524,7 +1521,7 @@ cmLocalVisualStudio7GeneratorFCInfo::cmLocalVisualStudio7GeneratorFCInfo(
// If HEADER_FILE_ONLY is set, we must suppress this generation in
// the project file
fc.ExcludedFromBuild = sf.GetPropertyAsBool("HEADER_FILE_ONLY") ||
- !cmContains(acs.Configs, ci) ||
+ !cm::contains(acs.Configs, ci) ||
(gt->GetPropertyAsBool("UNITY_BUILD") &&
sf.GetProperty("UNITY_SOURCE_FILE") &&
!sf.GetPropertyAsBool("SKIP_UNITY_BUILD_INCLUSION"));
@@ -1877,20 +1874,20 @@ void cmLocalVisualStudio7Generator::WriteProjectSCC(std::ostream& fout,
{
// if we have all the required Source code control tags
// then add that to the project
- const char* vsProjectname = target->GetProperty("VS_SCC_PROJECTNAME");
- const char* vsLocalpath = target->GetProperty("VS_SCC_LOCALPATH");
- const char* vsProvider = target->GetProperty("VS_SCC_PROVIDER");
+ cmProp vsProjectname = target->GetProperty("VS_SCC_PROJECTNAME");
+ cmProp vsLocalpath = target->GetProperty("VS_SCC_LOCALPATH");
+ cmProp vsProvider = target->GetProperty("VS_SCC_PROVIDER");
if (vsProvider && vsLocalpath && vsProjectname) {
/* clang-format off */
- fout << "\tSccProjectName=\"" << vsProjectname << "\"\n"
- << "\tSccLocalPath=\"" << vsLocalpath << "\"\n"
- << "\tSccProvider=\"" << vsProvider << "\"\n";
+ fout << "\tSccProjectName=\"" << *vsProjectname << "\"\n"
+ << "\tSccLocalPath=\"" << *vsLocalpath << "\"\n"
+ << "\tSccProvider=\"" << *vsProvider << "\"\n";
/* clang-format on */
- const char* vsAuxPath = target->GetProperty("VS_SCC_AUXPATH");
+ cmProp vsAuxPath = target->GetProperty("VS_SCC_AUXPATH");
if (vsAuxPath) {
- fout << "\tSccAuxPath=\"" << vsAuxPath << "\"\n";
+ fout << "\tSccAuxPath=\"" << *vsAuxPath << "\"\n";
}
}
}
@@ -1908,10 +1905,8 @@ void cmLocalVisualStudio7Generator::WriteProjectStartFortran(
<< "\tProjectCreator=\"Intel Fortran\"\n"
<< "\tVersion=\"" << gg->GetIntelProjectVersion() << "\"\n";
/* clang-format on */
- const char* keyword = target->GetProperty("VS_KEYWORD");
- if (!keyword) {
- keyword = "Console Application";
- }
+ cmProp p = target->GetProperty("VS_KEYWORD");
+ const char* keyword = p ? p->c_str() : "Console Application";
const char* projectType = 0;
switch (target->GetType()) {
case cmStateEnums::STATIC_LIBRARY:
@@ -1970,20 +1965,16 @@ void cmLocalVisualStudio7Generator::WriteProjectStart(
<< "\tProjectType=\"Visual C++\"\n";
/* clang-format on */
fout << "\tVersion=\"" << (gg->GetVersion() / 10) << ".00\"\n";
- const char* projLabel = target->GetProperty("PROJECT_LABEL");
- if (!projLabel) {
- projLabel = libName.c_str();
- }
- const char* keyword = target->GetProperty("VS_KEYWORD");
- if (!keyword) {
- keyword = "Win32Proj";
- }
+ cmProp p = target->GetProperty("PROJECT_LABEL");
+ const std::string projLabel = p ? *p : libName;
+ p = target->GetProperty("VS_KEYWORD");
+ const std::string keyword = p ? *p : "Win32Proj";
fout << "\tName=\"" << projLabel << "\"\n";
fout << "\tProjectGUID=\"{" << gg->GetGUID(libName) << "}\"\n";
this->WriteProjectSCC(fout, target);
- if (const char* targetFrameworkVersion =
+ if (cmProp targetFrameworkVersion =
target->GetProperty("VS_DOTNET_TARGET_FRAMEWORK_VERSION")) {
- fout << "\tTargetFrameworkVersion=\"" << targetFrameworkVersion << "\"\n";
+ fout << "\tTargetFrameworkVersion=\"" << *targetFrameworkVersion << "\"\n";
}
/* clang-format off */
fout << "\tKeyword=\"" << keyword << "\">\n"
@@ -2010,7 +2001,7 @@ void cmLocalVisualStudio7Generator::WriteVCProjFooter(
fout << "\t<Globals>\n";
for (std::string const& key : target->GetPropertyKeys()) {
- if (key.find("VS_GLOBAL_") == 0) {
+ if (cmHasLiteralPrefix(key, "VS_GLOBAL_")) {
std::string name = key.substr(10);
if (!name.empty()) {
/* clang-format off */
diff --git a/Source/cmLocalVisualStudio7Generator.h b/Source/cmLocalVisualStudio7Generator.h
index 745766c..8b9b8ad 100644
--- a/Source/cmLocalVisualStudio7Generator.h
+++ b/Source/cmLocalVisualStudio7Generator.h
@@ -6,6 +6,7 @@
#include "cmConfigure.h" // IWYU pragma: keep
#include <iosfwd>
+#include <memory>
#include <string>
#include <vector>
@@ -48,6 +49,10 @@ public:
virtual ~cmLocalVisualStudio7Generator();
+ cmLocalVisualStudio7Generator(const cmLocalVisualStudio7Generator&) = delete;
+ const cmLocalVisualStudio7Generator& operator=(
+ const cmLocalVisualStudio7Generator&) = delete;
+
void AddHelperCommands() override;
/**
@@ -144,7 +149,7 @@ private:
bool FortranProject;
bool WindowsCEProject;
- cmLocalVisualStudio7GeneratorInternals* Internal;
+ std::unique_ptr<cmLocalVisualStudio7GeneratorInternals> Internal;
};
#endif
diff --git a/Source/cmLocalVisualStudioGenerator.cxx b/Source/cmLocalVisualStudioGenerator.cxx
index 8d50898..ebd4f96 100644
--- a/Source/cmLocalVisualStudioGenerator.cxx
+++ b/Source/cmLocalVisualStudioGenerator.cxx
@@ -102,10 +102,12 @@ cmLocalVisualStudioGenerator::MaybeCreateImplibDir(cmGeneratorTarget* target,
std::vector<std::string> no_output;
std::vector<std::string> no_byproducts;
std::vector<std::string> no_depends;
+ bool stdPipesUTF8 = true;
cmCustomCommandLines commands = cmMakeSingleCommandLine(
{ cmSystemTools::GetCMakeCommand(), "-E", "make_directory", impDir });
pcc.reset(new cmCustomCommand(no_output, no_byproducts, no_depends, commands,
- cmListFileBacktrace(), nullptr, nullptr));
+ cmListFileBacktrace(), nullptr, nullptr,
+ stdPipesUTF8));
pcc->SetEscapeOldStyle(false);
pcc->SetEscapeAllowMakeVars(true);
return pcc;
@@ -154,8 +156,7 @@ std::string cmLocalVisualStudioGenerator::ConstructScript(
script += newline;
newline = newline_text;
script += "cd ";
- script += this->ConvertToOutputFormat(
- cmSystemTools::CollapseFullPath(workingDirectory), SHELL);
+ script += this->ConvertToOutputFormat(workingDirectory, SHELL);
script += check_error;
// Change the working drive.
diff --git a/Source/cmMachO.cxx b/Source/cmMachO.cxx
index 6cbed36..53112e0 100644
--- a/Source/cmMachO.cxx
+++ b/Source/cmMachO.cxx
@@ -79,14 +79,14 @@ public:
// A load_command and its associated data
struct RawLoadCommand
{
- uint32_t type(const cmMachOHeaderAndLoadCommands* m) const
+ uint32_t type(const cmMachOHeaderAndLoadCommands& m) const
{
if (this->LoadCommand.size() < sizeof(load_command)) {
return 0;
}
const load_command* cmd =
reinterpret_cast<const load_command*>(&this->LoadCommand[0]);
- return m->swap(cmd->cmd);
+ return m.swap(cmd->cmd);
}
std::vector<char> LoadCommand;
};
@@ -186,8 +186,11 @@ class cmMachOInternal
{
public:
cmMachOInternal(const char* fname);
+ cmMachOInternal(const cmMachOInternal&) = delete;
~cmMachOInternal();
+ cmMachOInternal& operator=(const cmMachOInternal&) = delete;
+
// read a Mach-O file
bool read_mach_o(uint32_t file_offset);
@@ -202,7 +205,7 @@ public:
std::string ErrorMessage;
// the list of Mach-O's
- std::vector<cmMachOHeaderAndLoadCommands*> MachOList;
+ std::vector<std::unique_ptr<cmMachOHeaderAndLoadCommands>> MachOList;
};
cmMachOInternal::cmMachOInternal(const char* fname)
@@ -260,12 +263,7 @@ cmMachOInternal::cmMachOInternal(const char* fname)
}
}
-cmMachOInternal::~cmMachOInternal()
-{
- for (auto& i : this->MachOList) {
- delete i;
- }
-}
+cmMachOInternal::~cmMachOInternal() = default;
bool cmMachOInternal::read_mach_o(uint32_t file_offset)
{
@@ -280,25 +278,25 @@ bool cmMachOInternal::read_mach_o(uint32_t file_offset)
return false;
}
- cmMachOHeaderAndLoadCommands* f = nullptr;
+ std::unique_ptr<cmMachOHeaderAndLoadCommands> f;
if (magic == MH_CIGAM || magic == MH_MAGIC) {
bool swap = false;
if (magic == MH_CIGAM) {
swap = true;
}
- f = new cmMachOHeaderAndLoadCommandsImpl<mach_header>(swap);
+ f = cm::make_unique<cmMachOHeaderAndLoadCommandsImpl<mach_header>>(swap);
} else if (magic == MH_CIGAM_64 || magic == MH_MAGIC_64) {
bool swap = false;
if (magic == MH_CIGAM_64) {
swap = true;
}
- f = new cmMachOHeaderAndLoadCommandsImpl<mach_header_64>(swap);
+ f =
+ cm::make_unique<cmMachOHeaderAndLoadCommandsImpl<mach_header_64>>(swap);
}
if (f && f->read_mach_o(this->Fin)) {
- this->MachOList.push_back(f);
+ this->MachOList.push_back(std::move(f));
} else {
- delete f;
this->ErrorMessage = "Failed to read Mach-O header.";
return false;
}
@@ -333,11 +331,12 @@ bool cmMachO::GetInstallName(std::string& install_name)
}
// grab the first Mach-O and get the install name from that one
- cmMachOHeaderAndLoadCommands* macho = this->Internal->MachOList[0];
+ std::unique_ptr<cmMachOHeaderAndLoadCommands>& macho =
+ this->Internal->MachOList[0];
for (size_t i = 0; i < macho->load_commands().size(); i++) {
const cmMachOHeaderAndLoadCommands::RawLoadCommand& cmd =
macho->load_commands()[i];
- uint32_t lc_cmd = cmd.type(macho);
+ uint32_t lc_cmd = cmd.type(*macho);
if (lc_cmd == LC_ID_DYLIB || lc_cmd == LC_LOAD_WEAK_DYLIB ||
lc_cmd == LC_LOAD_DYLIB) {
if (sizeof(dylib_command) < cmd.LoadCommand.size()) {
diff --git a/Source/cmMacroCommand.cxx b/Source/cmMacroCommand.cxx
index 0b0d9ac..c88b343 100644
--- a/Source/cmMacroCommand.cxx
+++ b/Source/cmMacroCommand.cxx
@@ -8,8 +8,7 @@
#include <cm/memory>
#include <cm/string_view>
#include <cmext/algorithm>
-
-#include "cm_static_string_view.hxx"
+#include <cmext/string_view>
#include "cmExecutionStatus.h"
#include "cmFunctionBlocker.h"
diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx
index 18689fa..154da50 100644
--- a/Source/cmMakefile.cxx
+++ b/Source/cmMakefile.cxx
@@ -18,15 +18,16 @@
#include <cm/optional>
#include <cm/vector>
#include <cmext/algorithm>
+#include <cmext/string_view>
+
+#include <cm3p/json/value.h>
+#include <cm3p/json/writer.h>
#include "cmsys/FStream.hxx"
#include "cmsys/RegularExpression.hxx"
-#include "cm_jsoncpp_value.h"
-#include "cm_jsoncpp_writer.h"
#include "cm_sys_stat.h"
-#include "cmAlgorithms.h"
#include "cmCommandArgumentParserHelper.h"
#include "cmCustomCommand.h"
#include "cmCustomCommandLines.h"
@@ -61,6 +62,7 @@
#include "cmake.h"
#ifndef CMAKE_BOOTSTRAP
+# include "cmMakefileProfilingData.h"
# include "cmVariableWatch.h"
#endif
@@ -373,19 +375,30 @@ void cmMakefile::PrintCommandTrace(const cmListFileFunction& lff) const
class cmMakefileCall
{
public:
- cmMakefileCall(cmMakefile* mf, cmCommandContext const& cc,
+ cmMakefileCall(cmMakefile* mf, cmListFileFunction const& lff,
cmExecutionStatus& status)
: Makefile(mf)
{
cmListFileContext const& lfc = cmListFileContext::FromCommandContext(
- cc, this->Makefile->StateSnapshot.GetExecutionListFile());
+ lff, this->Makefile->StateSnapshot.GetExecutionListFile());
this->Makefile->Backtrace = this->Makefile->Backtrace.Push(lfc);
++this->Makefile->RecursionDepth;
this->Makefile->ExecutionStatusStack.push_back(&status);
+#if !defined(CMAKE_BOOTSTRAP)
+ if (this->Makefile->GetCMakeInstance()->IsProfilingEnabled()) {
+ this->Makefile->GetCMakeInstance()->GetProfilingOutput().StartEntry(lff,
+ lfc);
+ }
+#endif
}
~cmMakefileCall()
{
+#if !defined(CMAKE_BOOTSTRAP)
+ if (this->Makefile->GetCMakeInstance()->IsProfilingEnabled()) {
+ this->Makefile->GetCMakeInstance()->GetProfilingOutput().StopEntry();
+ }
+#endif
this->Makefile->ExecutionStatusStack.pop_back();
--this->Makefile->RecursionDepth;
this->Makefile->Backtrace = this->Makefile->Backtrace.Pop();
@@ -685,6 +698,27 @@ bool cmMakefile::ReadListFile(const std::string& filename)
return true;
}
+bool cmMakefile::ReadListFileAsString(const std::string& content,
+ const std::string& virtualFileName)
+{
+ std::string filenametoread = cmSystemTools::CollapseFullPath(
+ virtualFileName, this->GetCurrentSourceDirectory());
+
+ ListFileScope scope(this, filenametoread);
+
+ cmListFile listFile;
+ if (!listFile.ParseString(content.c_str(), virtualFileName.c_str(),
+ this->GetMessenger(), this->Backtrace)) {
+ return false;
+ }
+
+ this->ReadListFile(listFile, filenametoread);
+ if (cmSystemTools::GetFatalErrorOccured()) {
+ scope.Quiet();
+ }
+ return true;
+}
+
void cmMakefile::ReadListFile(cmListFile const& listFile,
std::string const& filenametoread)
{
@@ -988,7 +1022,7 @@ cmTarget* cmMakefile::AddCustomCommandToTarget(
const cmCustomCommandLines& commandLines, cmCustomCommandType type,
const char* comment, const char* workingDir, bool escapeOldStyle,
bool uses_terminal, const std::string& depfile, const std::string& job_pool,
- bool command_expand_lists)
+ bool command_expand_lists, bool stdPipesUTF8)
{
cmTarget* t = this->GetCustomCommandTarget(
target, cmObjectLibraryCommands::Reject, this->Backtrace);
@@ -1006,14 +1040,15 @@ cmTarget* cmMakefile::AddCustomCommandToTarget(
cm::optional<std::string> workingStr = MakeOptionalString(workingDir);
// Dispatch command creation to allow generator expressions in outputs.
- this->AddGeneratorAction([=](cmLocalGenerator& lg,
- const cmListFileBacktrace& lfbt) {
- BacktraceGuard guard(this->Backtrace, lfbt);
- detail::AddCustomCommandToTarget(
- lg, lfbt, cmCommandOrigin::Project, t, byproducts, depends, commandLines,
- type, GetCStrOrNull(commentStr), GetCStrOrNull(workingStr),
- escapeOldStyle, uses_terminal, depfile, job_pool, command_expand_lists);
- });
+ this->AddGeneratorAction(
+ [=](cmLocalGenerator& lg, const cmListFileBacktrace& lfbt) {
+ BacktraceGuard guard(this->Backtrace, lfbt);
+ detail::AddCustomCommandToTarget(
+ lg, lfbt, cmCommandOrigin::Project, t, byproducts, depends,
+ commandLines, type, GetCStrOrNull(commentStr),
+ GetCStrOrNull(workingStr), escapeOldStyle, uses_terminal, depfile,
+ job_pool, command_expand_lists, stdPipesUTF8);
+ });
return t;
}
@@ -1024,14 +1059,14 @@ void cmMakefile::AddCustomCommandToOutput(
const char* comment, const char* workingDir,
const CommandSourceCallback& callback, bool replace, bool escapeOldStyle,
bool uses_terminal, bool command_expand_lists, const std::string& depfile,
- const std::string& job_pool)
+ const std::string& job_pool, bool stdPipesUTF8)
{
std::vector<std::string> no_byproducts;
cmImplicitDependsList no_implicit_depends;
this->AddCustomCommandToOutput(
{ output }, no_byproducts, depends, main_dependency, no_implicit_depends,
commandLines, comment, workingDir, callback, replace, escapeOldStyle,
- uses_terminal, command_expand_lists, depfile, job_pool);
+ uses_terminal, command_expand_lists, depfile, job_pool, stdPipesUTF8);
}
void cmMakefile::AddCustomCommandToOutput(
@@ -1042,7 +1077,7 @@ void cmMakefile::AddCustomCommandToOutput(
const cmCustomCommandLines& commandLines, const char* comment,
const char* workingDir, const CommandSourceCallback& callback, bool replace,
bool escapeOldStyle, bool uses_terminal, bool command_expand_lists,
- const std::string& depfile, const std::string& job_pool)
+ const std::string& depfile, const std::string& job_pool, bool stdPipesUTF8)
{
// Make sure there is at least one output.
if (outputs.empty()) {
@@ -1064,18 +1099,19 @@ void cmMakefile::AddCustomCommandToOutput(
cm::optional<std::string> workingStr = MakeOptionalString(workingDir);
// Dispatch command creation to allow generator expressions in outputs.
- this->AddGeneratorAction([=](cmLocalGenerator& lg,
- const cmListFileBacktrace& lfbt) {
- BacktraceGuard guard(this->Backtrace, lfbt);
- cmSourceFile* sf = detail::AddCustomCommandToOutput(
- lg, lfbt, cmCommandOrigin::Project, outputs, byproducts, depends,
- main_dependency, implicit_depends, commandLines,
- GetCStrOrNull(commentStr), GetCStrOrNull(workingStr), replace,
- escapeOldStyle, uses_terminal, command_expand_lists, depfile, job_pool);
- if (callback && sf) {
- callback(sf);
- }
- });
+ this->AddGeneratorAction(
+ [=](cmLocalGenerator& lg, const cmListFileBacktrace& lfbt) {
+ BacktraceGuard guard(this->Backtrace, lfbt);
+ cmSourceFile* sf = detail::AddCustomCommandToOutput(
+ lg, lfbt, cmCommandOrigin::Project, outputs, byproducts, depends,
+ main_dependency, implicit_depends, commandLines,
+ GetCStrOrNull(commentStr), GetCStrOrNull(workingStr), replace,
+ escapeOldStyle, uses_terminal, command_expand_lists, depfile, job_pool,
+ stdPipesUTF8);
+ if (callback && sf) {
+ callback(sf);
+ }
+ });
}
void cmMakefile::AddCustomCommandOldStyle(
@@ -1191,7 +1227,7 @@ cmTarget* cmMakefile::AddUtilityCommand(
const std::vector<std::string>& depends,
const cmCustomCommandLines& commandLines, bool escapeOldStyle,
const char* comment, bool uses_terminal, bool command_expand_lists,
- const std::string& job_pool)
+ const std::string& job_pool, bool stdPipesUTF8)
{
cmTarget* target = this->AddNewUtilityTarget(utilityName, excludeFromAll);
@@ -1220,7 +1256,7 @@ cmTarget* cmMakefile::AddUtilityCommand(
force, GetCStrOrNull(workingStr), byproducts,
depends, commandLines, escapeOldStyle,
GetCStrOrNull(commentStr), uses_terminal,
- command_expand_lists, job_pool);
+ command_expand_lists, job_pool, stdPipesUTF8);
});
return target;
@@ -1358,9 +1394,9 @@ bool cmMakefile::ParseDefineFlag(std::string const& def, bool remove)
const char* define = def.c_str() + 2;
if (remove) {
- if (const char* cdefs = this->GetProperty("COMPILE_DEFINITIONS")) {
+ if (cmProp cdefs = this->GetProperty("COMPILE_DEFINITIONS")) {
// Expand the list.
- std::vector<std::string> defs = cmExpandedList(cdefs);
+ std::vector<std::string> defs = cmExpandedList(*cdefs);
// Recompose the list without the definition.
auto defEnd = std::remove(defs.begin(), defs.end(), define);
@@ -1389,29 +1425,32 @@ void cmMakefile::InitializeFromParent(cmMakefile* parent)
// Include transform property. There is no per-config version.
{
const char* prop = "IMPLICIT_DEPENDS_INCLUDE_TRANSFORM";
- this->SetProperty(prop, parent->GetProperty(prop));
+ cmProp p = parent->GetProperty(prop);
+ this->SetProperty(prop, p ? p->c_str() : nullptr);
}
// compile definitions property and per-config versions
cmPolicies::PolicyStatus polSt = this->GetPolicyStatus(cmPolicies::CMP0043);
if (polSt == cmPolicies::WARN || polSt == cmPolicies::OLD) {
- this->SetProperty("COMPILE_DEFINITIONS",
- parent->GetProperty("COMPILE_DEFINITIONS"));
+ cmProp p = parent->GetProperty("COMPILE_DEFINITIONS");
+ this->SetProperty("COMPILE_DEFINITIONS", p ? p->c_str() : nullptr);
std::vector<std::string> configs;
this->GetConfigurations(configs);
for (std::string const& config : configs) {
std::string defPropName =
cmStrCat("COMPILE_DEFINITIONS_", cmSystemTools::UpperCase(config));
- const char* prop = parent->GetProperty(defPropName);
- this->SetProperty(defPropName, prop);
+ cmProp prop = parent->GetProperty(defPropName);
+ this->SetProperty(defPropName, prop ? prop->c_str() : nullptr);
}
}
// labels
- this->SetProperty("LABELS", parent->GetProperty("LABELS"));
+ cmProp p = parent->GetProperty("LABELS");
+ this->SetProperty("LABELS", p ? p->c_str() : nullptr);
// link libraries
- this->SetProperty("LINK_LIBRARIES", parent->GetProperty("LINK_LIBRARIES"));
+ p = parent->GetProperty("LINK_LIBRARIES");
+ this->SetProperty("LINK_LIBRARIES", p ? p->c_str() : nullptr);
// the initial project name
this->StateSnapshot.SetProjectName(parent->StateSnapshot.GetProjectName());
@@ -1606,7 +1645,7 @@ void cmMakefile::Configure()
allowedCommands.insert("message");
isProblem = false;
for (cmListFileFunction const& func : listFile.Functions) {
- if (!cmContains(allowedCommands, func.Name.Lower)) {
+ if (!cm::contains(allowedCommands, func.Name.Lower)) {
isProblem = true;
break;
}
@@ -1842,8 +1881,7 @@ void cmMakefile::AddCacheDefinition(const std::string& name, const char* value,
cmStateEnums::CacheEntryType type,
bool force)
{
- const std::string* existingValue =
- this->GetState()->GetInitializedCacheValue(name);
+ cmProp existingValue = this->GetState()->GetInitializedCacheValue(name);
// must be outside the following if() to keep it alive long enough
std::string nvalue;
@@ -1973,8 +2011,8 @@ void cmMakefile::AddGlobalLinkInformation(cmTarget& target)
default:;
}
- if (const char* linkLibsProp = this->GetProperty("LINK_LIBRARIES")) {
- std::vector<std::string> linkLibs = cmExpandedList(linkLibsProp);
+ if (cmProp linkLibsProp = this->GetProperty("LINK_LIBRARIES")) {
+ std::vector<std::string> linkLibs = cmExpandedList(*linkLibsProp);
for (auto j = linkLibs.begin(); j != linkLibs.end(); ++j) {
std::string libraryName = *j;
@@ -2043,11 +2081,11 @@ cmTarget* cmMakefile::AddExecutable(const std::string& exeName,
cmTarget* cmMakefile::AddNewTarget(cmStateEnums::TargetType type,
const std::string& name)
{
- auto it =
- this->Targets
- .emplace(name,
- cmTarget(name, type, cmTarget::VisibilityNormal, this, true))
- .first;
+ auto it = this->Targets
+ .emplace(name,
+ cmTarget(name, type, cmTarget::VisibilityNormal, this,
+ cmTarget::PerConfig::Yes))
+ .first;
this->OrderedTargets.push_back(&it->second);
this->GetGlobalGenerator()->IndexTarget(&it->second);
this->GetStateSnapshot().GetDirectory().AddNormalTargetName(name);
@@ -2366,11 +2404,11 @@ cmSourceGroup* cmMakefile::GetOrCreateSourceGroup(
cmSourceGroup* cmMakefile::GetOrCreateSourceGroup(const std::string& name)
{
- const char* delimiter = this->GetDefinition("SOURCE_GROUP_DELIMITER");
- if (delimiter == nullptr) {
- delimiter = "\\";
+ const char* delimiters = this->GetDefinition("SOURCE_GROUP_DELIMITER");
+ if (delimiters == nullptr) {
+ delimiters = "/\\";
}
- return this->GetOrCreateSourceGroup(cmTokenize(name, delimiter));
+ return this->GetOrCreateSourceGroup(cmTokenize(name, delimiters));
}
/**
@@ -2418,14 +2456,14 @@ void cmMakefile::ExpandVariablesCMP0019()
}
std::ostringstream w;
- const char* includeDirs = this->GetProperty("INCLUDE_DIRECTORIES");
- if (mightExpandVariablesCMP0019(includeDirs)) {
- std::string dirs = includeDirs;
+ cmProp includeDirs = this->GetProperty("INCLUDE_DIRECTORIES");
+ if (includeDirs && mightExpandVariablesCMP0019(includeDirs->c_str())) {
+ std::string dirs = *includeDirs;
this->ExpandVariablesInString(dirs, true, true);
- if (pol == cmPolicies::WARN && dirs != includeDirs) {
+ if (pol == cmPolicies::WARN && dirs != *includeDirs) {
/* clang-format off */
w << "Evaluated directory INCLUDE_DIRECTORIES\n"
- << " " << includeDirs << "\n"
+ << " " << *includeDirs << "\n"
<< "as\n"
<< " " << dirs << "\n";
/* clang-format on */
@@ -2441,13 +2479,13 @@ void cmMakefile::ExpandVariablesCMP0019()
continue;
}
includeDirs = t.GetProperty("INCLUDE_DIRECTORIES");
- if (mightExpandVariablesCMP0019(includeDirs)) {
- std::string dirs = includeDirs;
+ if (includeDirs && mightExpandVariablesCMP0019(includeDirs->c_str())) {
+ std::string dirs = *includeDirs;
this->ExpandVariablesInString(dirs, true, true);
- if (pol == cmPolicies::WARN && dirs != includeDirs) {
+ if (pol == cmPolicies::WARN && dirs != *includeDirs) {
/* clang-format off */
w << "Evaluated target " << t.GetName() << " INCLUDE_DIRECTORIES\n"
- << " " << includeDirs << "\n"
+ << " " << *includeDirs << "\n"
<< "as\n"
<< " " << dirs << "\n";
/* clang-format on */
@@ -2456,10 +2494,10 @@ void cmMakefile::ExpandVariablesCMP0019()
}
}
- if (const char* linkDirsProp = this->GetProperty("LINK_DIRECTORIES")) {
- if (mightExpandVariablesCMP0019(linkDirsProp)) {
- std::string d = linkDirsProp;
- std::string orig = linkDirsProp;
+ if (cmProp linkDirsProp = this->GetProperty("LINK_DIRECTORIES")) {
+ if (mightExpandVariablesCMP0019(linkDirsProp->c_str())) {
+ std::string d = *linkDirsProp;
+ const std::string orig = d;
this->ExpandVariablesInString(d, true, true);
if (pol == cmPolicies::WARN && d != orig) {
/* clang-format off */
@@ -2472,20 +2510,17 @@ void cmMakefile::ExpandVariablesCMP0019()
}
}
- if (const char* linkLibsProp = this->GetProperty("LINK_LIBRARIES")) {
- std::vector<std::string> linkLibs = cmExpandedList(linkLibsProp);
+ if (cmProp linkLibsProp = this->GetProperty("LINK_LIBRARIES")) {
+ std::vector<std::string> linkLibs = cmExpandedList(*linkLibsProp);
for (auto l = linkLibs.begin(); l != linkLibs.end(); ++l) {
std::string libName = *l;
- if (libName == "optimized") {
- ++l;
- libName = *l;
- } else if (libName == "debug") {
+ if (libName == "optimized"_s || libName == "debug"_s) {
++l;
libName = *l;
}
if (mightExpandVariablesCMP0019(libName.c_str())) {
- std::string orig = libName;
+ const std::string orig = libName;
this->ExpandVariablesInString(libName, true, true);
if (pol == cmPolicies::WARN && libName != orig) {
/* clang-format off */
@@ -2589,7 +2624,7 @@ cmMakefile::AppleSDK cmMakefile::GetAppleSDKType() const
};
for (auto const& entry : sdkDatabase) {
- if (sdkRoot.find(entry.name) == 0 ||
+ if (cmHasPrefix(sdkRoot, entry.name) ||
sdkRoot.find(std::string("/") + entry.name) != std::string::npos) {
return entry.sdk;
}
@@ -2647,7 +2682,7 @@ const std::string& cmMakefile::GetRequiredDefinition(
bool cmMakefile::IsDefinitionSet(const std::string& name) const
{
- const std::string* def = this->StateSnapshot.GetDefinition(name);
+ cmProp def = this->StateSnapshot.GetDefinition(name);
if (!def) {
def = this->GetState()->GetInitializedCacheValue(name);
}
@@ -2664,7 +2699,7 @@ bool cmMakefile::IsDefinitionSet(const std::string& name) const
const std::string* cmMakefile::GetDef(const std::string& name) const
{
- const std::string* def = this->StateSnapshot.GetDefinition(name);
+ cmProp def = this->StateSnapshot.GetDefinition(name);
if (!def) {
def = this->GetState()->GetInitializedCacheValue(name);
}
@@ -2998,7 +3033,7 @@ MessageType cmMakefile::ExpandVariablesInStringNew(
openstack.pop_back();
result.append(last, in - last);
std::string const& lookup = result.substr(var.loc);
- const char* value = nullptr;
+ cmProp value = nullptr;
std::string varresult;
std::string svalue;
switch (var.domain) {
@@ -3006,12 +3041,12 @@ MessageType cmMakefile::ExpandVariablesInStringNew(
if (filename && lookup == lineVar) {
varresult = std::to_string(line);
} else {
- value = this->GetDefinition(lookup);
+ value = this->GetDef(lookup);
}
break;
case ENVIRONMENT:
if (cmSystemTools::GetEnv(lookup, svalue)) {
- value = svalue.c_str();
+ value = &svalue;
}
break;
case CACHE:
@@ -3021,9 +3056,9 @@ MessageType cmMakefile::ExpandVariablesInStringNew(
// Get the string we're meant to append to.
if (value) {
if (escapeQuotes) {
- varresult = cmEscapeQuotes(value);
+ varresult = cmEscapeQuotes(*value);
} else {
- varresult = value;
+ varresult = *value;
}
} else if (!this->SuppressSideEffects) {
this->MaybeWarnUninitialized(lookup, filename);
@@ -4051,7 +4086,7 @@ void cmMakefile::AppendProperty(const std::string& prop,
this->Backtrace);
}
-const char* cmMakefile::GetProperty(const std::string& prop) const
+cmProp cmMakefile::GetProperty(const std::string& prop) const
{
// Check for computed properties.
static std::string output;
@@ -4064,20 +4099,21 @@ const char* cmMakefile::GetProperty(const std::string& prop) const
return pair.first;
});
output = cmJoin(keys, ";");
- return output.c_str();
+ return &output;
}
return this->StateSnapshot.GetDirectory().GetProperty(prop);
}
-const char* cmMakefile::GetProperty(const std::string& prop, bool chain) const
+cmProp cmMakefile::GetProperty(const std::string& prop, bool chain) const
{
return this->StateSnapshot.GetDirectory().GetProperty(prop, chain);
}
bool cmMakefile::GetPropertyAsBool(const std::string& prop) const
{
- return cmIsOn(this->GetProperty(prop));
+ cmProp p = this->GetProperty(prop);
+ return p && cmIsOn(*p);
}
std::vector<std::string> cmMakefile::GetPropertyKeys() const
@@ -4129,8 +4165,8 @@ void cmMakefile::GetTests(const std::string& config,
void cmMakefile::AddCMakeDependFilesFromUser()
{
std::vector<std::string> deps;
- if (const char* deps_str = this->GetProperty("CMAKE_CONFIGURE_DEPENDS")) {
- cmExpandList(deps_str, deps);
+ if (cmProp deps_str = this->GetProperty("CMAKE_CONFIGURE_DEPENDS")) {
+ cmExpandList(*deps_str, deps);
}
for (std::string const& dep : deps) {
if (cmSystemTools::FileIsFullPath(dep)) {
@@ -4225,7 +4261,7 @@ cmTarget* cmMakefile::AddImportedTarget(const std::string& name,
new cmTarget(name, type,
global ? cmTarget::VisibilityImportedGlobally
: cmTarget::VisibilityImported,
- this, true));
+ this, cmTarget::PerConfig::Yes));
// Add to the set of available imported targets.
this->ImportedTargets[name] = target.get();
@@ -4257,7 +4293,7 @@ cmTarget* cmMakefile::FindTargetToUse(const std::string& name,
bool cmMakefile::IsAlias(const std::string& name) const
{
- if (cmContains(this->AliasTargets, name)) {
+ if (cm::contains(this->AliasTargets, name)) {
return true;
}
return this->GetGlobalGenerator()->IsAlias(name);
@@ -4498,7 +4534,7 @@ bool cmMakefile::SetPolicy(cmPolicies::PolicyID id,
// Deprecate old policies, especially those that require a lot
// of code to maintain the old behavior.
- if (status == cmPolicies::OLD && id <= cmPolicies::CMP0069 &&
+ if (status == cmPolicies::OLD && id <= cmPolicies::CMP0071 &&
!(this->GetCMakeInstance()->GetIsInTryCompile() &&
(
// Policies set by cmCoreTryCompile::TryCompileCode.
@@ -4627,7 +4663,7 @@ bool cmMakefile::AddRequiredTargetFeature(cmTarget* target,
}
std::vector<std::string> availableFeatures = cmExpandedList(features);
- if (!cmContains(availableFeatures, feature)) {
+ if (!cm::contains(availableFeatures, feature)) {
std::ostringstream e;
e << "The compiler feature \"" << feature << "\" is not known to " << lang
<< " compiler\n\""
@@ -4763,8 +4799,8 @@ bool cmMakefile::HaveCStandardAvailable(cmTarget const* target,
const std::string& feature,
std::string const& lang) const
{
- const char* defaultCStandard =
- this->GetDefinition(cmStrCat("CMAKE_", lang, "_STANDARD_DEFAULT"));
+ cmProp defaultCStandard =
+ this->GetDef(cmStrCat("CMAKE_", lang, "_STANDARD_DEFAULT"));
if (!defaultCStandard) {
this->IssueMessage(
MessageType::INTERNAL_ERROR,
@@ -4775,11 +4811,11 @@ bool cmMakefile::HaveCStandardAvailable(cmTarget const* target,
return true;
}
if (std::find_if(cm::cbegin(C_STANDARDS), cm::cend(C_STANDARDS),
- cmStrCmp(defaultCStandard)) == cm::cend(C_STANDARDS)) {
+ cmStrCmp(*defaultCStandard)) == cm::cend(C_STANDARDS)) {
const std::string e = cmStrCat("The CMAKE_", lang,
"_STANDARD_DEFAULT variable contains an "
"invalid value: \"",
- defaultCStandard, "\".");
+ *defaultCStandard, "\".");
this->IssueMessage(MessageType::INTERNAL_ERROR, e);
return false;
}
@@ -4790,24 +4826,23 @@ bool cmMakefile::HaveCStandardAvailable(cmTarget const* target,
this->CheckNeededCLanguage(feature, lang, needC90, needC99, needC11);
- const char* existingCStandard =
- target->GetProperty(cmStrCat(lang, "_STANDARD"));
+ cmProp existingCStandard = target->GetProperty(cmStrCat(lang, "_STANDARD"));
if (!existingCStandard) {
existingCStandard = defaultCStandard;
}
if (std::find_if(cm::cbegin(C_STANDARDS), cm::cend(C_STANDARDS),
- cmStrCmp(existingCStandard)) == cm::cend(C_STANDARDS)) {
+ cmStrCmp(*existingCStandard)) == cm::cend(C_STANDARDS)) {
const std::string e = cmStrCat(
"The ", lang, "_STANDARD property on target \"", target->GetName(),
- "\" contained an invalid value: \"", existingCStandard, "\".");
+ "\" contained an invalid value: \"", *existingCStandard, "\".");
this->IssueMessage(MessageType::FATAL_ERROR, e);
return false;
}
const char* const* existingCIt = existingCStandard
? std::find_if(cm::cbegin(C_STANDARDS), cm::cend(C_STANDARDS),
- cmStrCmp(existingCStandard))
+ cmStrCmp(*existingCStandard))
: cm::cend(C_STANDARDS);
if (needC11 && existingCStandard &&
@@ -4858,8 +4893,8 @@ bool cmMakefile::HaveCxxStandardAvailable(cmTarget const* target,
const std::string& feature,
std::string const& lang) const
{
- const char* defaultCxxStandard =
- this->GetDefinition(cmStrCat("CMAKE_", lang, "_STANDARD_DEFAULT"));
+ cmProp defaultCxxStandard =
+ this->GetDef(cmStrCat("CMAKE_", lang, "_STANDARD_DEFAULT"));
if (!defaultCxxStandard) {
this->IssueMessage(
MessageType::INTERNAL_ERROR,
@@ -4870,10 +4905,10 @@ bool cmMakefile::HaveCxxStandardAvailable(cmTarget const* target,
return true;
}
if (std::find_if(cm::cbegin(CXX_STANDARDS), cm::cend(CXX_STANDARDS),
- cmStrCmp(defaultCxxStandard)) == cm::cend(CXX_STANDARDS)) {
+ cmStrCmp(*defaultCxxStandard)) == cm::cend(CXX_STANDARDS)) {
const std::string e =
cmStrCat("The CMAKE_", lang, "_STANDARD_DEFAULT variable contains an ",
- "invalid value: \"", defaultCxxStandard, "\".");
+ "invalid value: \"", *defaultCxxStandard, "\".");
this->IssueMessage(MessageType::INTERNAL_ERROR, e);
return false;
}
@@ -4886,7 +4921,7 @@ bool cmMakefile::HaveCxxStandardAvailable(cmTarget const* target,
this->CheckNeededCxxLanguage(feature, lang, needCxx98, needCxx11, needCxx14,
needCxx17, needCxx20);
- const char* existingCxxStandard =
+ cmProp existingCxxStandard =
target->GetProperty(cmStrCat(lang, "_STANDARD"));
if (!existingCxxStandard) {
existingCxxStandard = defaultCxxStandard;
@@ -4894,11 +4929,11 @@ bool cmMakefile::HaveCxxStandardAvailable(cmTarget const* target,
const char* const* existingCxxLevel =
std::find_if(cm::cbegin(CXX_STANDARDS), cm::cend(CXX_STANDARDS),
- cmStrCmp(existingCxxStandard));
+ cmStrCmp(*existingCxxStandard));
if (existingCxxLevel == cm::cend(CXX_STANDARDS)) {
const std::string e = cmStrCat(
"The ", lang, "_STANDARD property on target \"", target->GetName(),
- "\" contained an invalid value: \"", existingCxxStandard, "\".");
+ "\" contained an invalid value: \"", *existingCxxStandard, "\".");
this->IssueMessage(MessageType::FATAL_ERROR, e);
return false;
}
@@ -4925,27 +4960,27 @@ void cmMakefile::CheckNeededCxxLanguage(const std::string& feature,
if (const char* propCxx98 =
this->GetDefinition(cmStrCat("CMAKE_", lang, "98_COMPILE_FEATURES"))) {
std::vector<std::string> props = cmExpandedList(propCxx98);
- needCxx98 = cmContains(props, feature);
+ needCxx98 = cm::contains(props, feature);
}
if (const char* propCxx11 =
this->GetDefinition(cmStrCat("CMAKE_", lang, "11_COMPILE_FEATURES"))) {
std::vector<std::string> props = cmExpandedList(propCxx11);
- needCxx11 = cmContains(props, feature);
+ needCxx11 = cm::contains(props, feature);
}
if (const char* propCxx14 =
this->GetDefinition(cmStrCat("CMAKE_", lang, "14_COMPILE_FEATURES"))) {
std::vector<std::string> props = cmExpandedList(propCxx14);
- needCxx14 = cmContains(props, feature);
+ needCxx14 = cm::contains(props, feature);
}
if (const char* propCxx17 =
this->GetDefinition(cmStrCat("CMAKE_", lang, "17_COMPILE_FEATURES"))) {
std::vector<std::string> props = cmExpandedList(propCxx17);
- needCxx17 = cmContains(props, feature);
+ needCxx17 = cm::contains(props, feature);
}
if (const char* propCxx20 =
this->GetDefinition(cmStrCat("CMAKE_", lang, "20_COMPILE_FEATURES"))) {
std::vector<std::string> props = cmExpandedList(propCxx20);
- needCxx20 = cmContains(props, feature);
+ needCxx20 = cm::contains(props, feature);
}
}
@@ -4963,12 +4998,12 @@ bool cmMakefile::AddRequiredTargetCxxFeature(cmTarget* target,
this->CheckNeededCxxLanguage(feature, lang, needCxx98, needCxx11, needCxx14,
needCxx17, needCxx20);
- const char* existingCxxStandard =
+ cmProp existingCxxStandard =
target->GetProperty(cmStrCat(lang, "_STANDARD"));
if (existingCxxStandard == nullptr) {
- const char* defaultCxxStandard =
- this->GetDefinition(cmStrCat("CMAKE_", lang, "_STANDARD_DEFAULT"));
- if (defaultCxxStandard && *defaultCxxStandard) {
+ cmProp defaultCxxStandard =
+ this->GetDef(cmStrCat("CMAKE_", lang, "_STANDARD_DEFAULT"));
+ if (defaultCxxStandard && !defaultCxxStandard->empty()) {
existingCxxStandard = defaultCxxStandard;
}
}
@@ -4976,11 +5011,11 @@ bool cmMakefile::AddRequiredTargetCxxFeature(cmTarget* target,
if (existingCxxStandard) {
existingCxxLevel =
std::find_if(cm::cbegin(CXX_STANDARDS), cm::cend(CXX_STANDARDS),
- cmStrCmp(existingCxxStandard));
+ cmStrCmp(*existingCxxStandard));
if (existingCxxLevel == cm::cend(CXX_STANDARDS)) {
const std::string e = cmStrCat(
"The ", lang, "_STANDARD property on target \"", target->GetName(),
- "\" contained an invalid value: \"", existingCxxStandard, "\".");
+ "\" contained an invalid value: \"", *existingCxxStandard, "\".");
if (error) {
*error = e;
} else {
@@ -5016,8 +5051,8 @@ bool cmMakefile::HaveCudaStandardAvailable(cmTarget const* target,
const std::string& feature,
std::string const& lang) const
{
- const char* defaultCudaStandard =
- this->GetDefinition(cmStrCat("CMAKE_", lang, "_STANDARD_DEFAULT"));
+ cmProp defaultCudaStandard =
+ this->GetDef(cmStrCat("CMAKE_", lang, "_STANDARD_DEFAULT"));
if (!defaultCudaStandard) {
this->IssueMessage(
MessageType::INTERNAL_ERROR,
@@ -5028,11 +5063,11 @@ bool cmMakefile::HaveCudaStandardAvailable(cmTarget const* target,
return true;
}
if (std::find_if(cm::cbegin(CUDA_STANDARDS), cm::cend(CUDA_STANDARDS),
- cmStrCmp(defaultCudaStandard)) ==
+ cmStrCmp(*defaultCudaStandard)) ==
cm::cend(CUDA_STANDARDS)) {
const std::string e =
cmStrCat("The CMAKE_", lang, "_STANDARD_DEFAULT variable contains an ",
- "invalid value: \"", defaultCudaStandard, "\".");
+ "invalid value: \"", *defaultCudaStandard, "\".");
this->IssueMessage(MessageType::INTERNAL_ERROR, e);
return false;
}
@@ -5045,7 +5080,7 @@ bool cmMakefile::HaveCudaStandardAvailable(cmTarget const* target,
this->CheckNeededCudaLanguage(feature, lang, needCuda03, needCuda11,
needCuda14, needCuda17, needCuda20);
- const char* existingCudaStandard =
+ cmProp existingCudaStandard =
target->GetProperty(cmStrCat(lang, "_STANDARD"));
if (!existingCudaStandard) {
existingCudaStandard = defaultCudaStandard;
@@ -5053,11 +5088,11 @@ bool cmMakefile::HaveCudaStandardAvailable(cmTarget const* target,
const char* const* existingCudaLevel =
std::find_if(cm::cbegin(CUDA_STANDARDS), cm::cend(CUDA_STANDARDS),
- cmStrCmp(existingCudaStandard));
+ cmStrCmp(*existingCudaStandard));
if (existingCudaLevel == cm::cend(CUDA_STANDARDS)) {
const std::string e = cmStrCat(
"The ", lang, "_STANDARD property on target \"", target->GetName(),
- "\" contained an invalid value: \"", existingCudaStandard, "\".");
+ "\" contained an invalid value: \"", *existingCudaStandard, "\".");
this->IssueMessage(MessageType::FATAL_ERROR, e);
return false;
}
@@ -5084,27 +5119,27 @@ void cmMakefile::CheckNeededCudaLanguage(const std::string& feature,
if (const char* propCuda03 =
this->GetDefinition(cmStrCat("CMAKE_", lang, "03_COMPILE_FEATURES"))) {
std::vector<std::string> props = cmExpandedList(propCuda03);
- needCuda03 = cmContains(props, feature);
+ needCuda03 = cm::contains(props, feature);
}
if (const char* propCuda11 =
this->GetDefinition(cmStrCat("CMAKE_", lang, "11_COMPILE_FEATURES"))) {
std::vector<std::string> props = cmExpandedList(propCuda11);
- needCuda11 = cmContains(props, feature);
+ needCuda11 = cm::contains(props, feature);
}
if (const char* propCuda14 =
this->GetDefinition(cmStrCat("CMAKE_", lang, "14_COMPILE_FEATURES"))) {
std::vector<std::string> props = cmExpandedList(propCuda14);
- needCuda14 = cmContains(props, feature);
+ needCuda14 = cm::contains(props, feature);
}
if (const char* propCuda17 =
this->GetDefinition(cmStrCat("CMAKE_", lang, "17_COMPILE_FEATURES"))) {
std::vector<std::string> props = cmExpandedList(propCuda17);
- needCuda17 = cmContains(props, feature);
+ needCuda17 = cm::contains(props, feature);
}
if (const char* propCuda20 =
this->GetDefinition(cmStrCat("CMAKE_", lang, "20_COMPILE_FEATURES"))) {
std::vector<std::string> props = cmExpandedList(propCuda20);
- needCuda20 = cmContains(props, feature);
+ needCuda20 = cm::contains(props, feature);
}
}
@@ -5122,12 +5157,12 @@ bool cmMakefile::AddRequiredTargetCudaFeature(cmTarget* target,
this->CheckNeededCudaLanguage(feature, lang, needCuda03, needCuda11,
needCuda14, needCuda17, needCuda20);
- const char* existingCudaStandard =
+ cmProp existingCudaStandard =
target->GetProperty(cmStrCat(lang, "_STANDARD"));
if (existingCudaStandard == nullptr) {
- const char* defaultCudaStandard =
- this->GetDefinition(cmStrCat("CMAKE_", lang, "_STANDARD_DEFAULT"));
- if (defaultCudaStandard && *defaultCudaStandard) {
+ cmProp defaultCudaStandard =
+ this->GetDef(cmStrCat("CMAKE_", lang, "_STANDARD_DEFAULT"));
+ if (defaultCudaStandard && !defaultCudaStandard->empty()) {
existingCudaStandard = defaultCudaStandard;
}
}
@@ -5135,11 +5170,11 @@ bool cmMakefile::AddRequiredTargetCudaFeature(cmTarget* target,
if (existingCudaStandard) {
existingCudaLevel =
std::find_if(cm::cbegin(CUDA_STANDARDS), cm::cend(CUDA_STANDARDS),
- cmStrCmp(existingCudaStandard));
+ cmStrCmp(*existingCudaStandard));
if (existingCudaLevel == cm::cend(CUDA_STANDARDS)) {
const std::string e = cmStrCat(
"The ", lang, "_STANDARD property on target \"", target->GetName(),
- "\" contained an invalid value: \"", existingCudaStandard, "\".");
+ "\" contained an invalid value: \"", *existingCudaStandard, "\".");
if (error) {
*error = e;
} else {
@@ -5178,17 +5213,17 @@ void cmMakefile::CheckNeededCLanguage(const std::string& feature,
if (const char* propC90 =
this->GetDefinition(cmStrCat("CMAKE_", lang, "90_COMPILE_FEATURES"))) {
std::vector<std::string> props = cmExpandedList(propC90);
- needC90 = cmContains(props, feature);
+ needC90 = cm::contains(props, feature);
}
if (const char* propC99 =
this->GetDefinition(cmStrCat("CMAKE_", lang, "99_COMPILE_FEATURES"))) {
std::vector<std::string> props = cmExpandedList(propC99);
- needC99 = cmContains(props, feature);
+ needC99 = cm::contains(props, feature);
}
if (const char* propC11 =
this->GetDefinition(cmStrCat("CMAKE_", lang, "11_COMPILE_FEATURES"))) {
std::vector<std::string> props = cmExpandedList(propC11);
- needC11 = cmContains(props, feature);
+ needC11 = cm::contains(props, feature);
}
}
@@ -5203,21 +5238,20 @@ bool cmMakefile::AddRequiredTargetCFeature(cmTarget* target,
this->CheckNeededCLanguage(feature, lang, needC90, needC99, needC11);
- const char* existingCStandard =
- target->GetProperty(cmStrCat(lang, "_STANDARD"));
+ cmProp existingCStandard = target->GetProperty(cmStrCat(lang, "_STANDARD"));
if (existingCStandard == nullptr) {
- const char* defaultCStandard =
- this->GetDefinition(cmStrCat("CMAKE_", lang, "_STANDARD_DEFAULT"));
- if (defaultCStandard && *defaultCStandard) {
+ cmProp defaultCStandard =
+ this->GetDef(cmStrCat("CMAKE_", lang, "_STANDARD_DEFAULT"));
+ if (defaultCStandard && !defaultCStandard->empty()) {
existingCStandard = defaultCStandard;
}
}
if (existingCStandard) {
if (std::find_if(cm::cbegin(C_STANDARDS), cm::cend(C_STANDARDS),
- cmStrCmp(existingCStandard)) == cm::cend(C_STANDARDS)) {
+ cmStrCmp(*existingCStandard)) == cm::cend(C_STANDARDS)) {
const std::string e = cmStrCat(
"The ", lang, "_STANDARD property on target \"", target->GetName(),
- "\" contained an invalid value: \"", existingCStandard, "\".");
+ "\" contained an invalid value: \"", *existingCStandard, "\".");
if (error) {
*error = e;
} else {
@@ -5229,7 +5263,7 @@ bool cmMakefile::AddRequiredTargetCFeature(cmTarget* target,
}
const char* const* existingCIt = existingCStandard
? std::find_if(cm::cbegin(C_STANDARDS), cm::cend(C_STANDARDS),
- cmStrCmp(existingCStandard))
+ cmStrCmp(*existingCStandard))
: cm::cend(C_STANDARDS);
bool setC90 = needC90 && !existingCStandard;
diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h
index d918abe..04a1f2d 100644
--- a/Source/cmMakefile.h
+++ b/Source/cmMakefile.h
@@ -58,6 +58,8 @@ class cmTestGenerator;
class cmVariableWatch;
class cmake;
+using cmProp = const std::string*;
+
/** Flag if byproducts shall also be considered. */
enum class cmSourceOutputKind
{
@@ -117,6 +119,9 @@ public:
bool ReadListFile(const std::string& filename);
+ bool ReadListFileAsString(const std::string& content,
+ const std::string& virtualFileName);
+
bool ReadDependentFile(const std::string& filename,
bool noPolicyScope = true);
@@ -183,7 +188,8 @@ public:
const cmCustomCommandLines& commandLines, cmCustomCommandType type,
const char* comment, const char* workingDir, bool escapeOldStyle = true,
bool uses_terminal = false, const std::string& depfile = "",
- const std::string& job_pool = "", bool command_expand_lists = false);
+ const std::string& job_pool = "", bool command_expand_lists = false,
+ bool stdPipesUTF8 = false);
/**
* Called for each file with custom command.
@@ -200,7 +206,8 @@ public:
const char* workingDir, const CommandSourceCallback& callback = nullptr,
bool replace = false, bool escapeOldStyle = true,
bool uses_terminal = false, bool command_expand_lists = false,
- const std::string& depfile = "", const std::string& job_pool = "");
+ const std::string& depfile = "", const std::string& job_pool = "",
+ bool stdPipesUTF8 = false);
void AddCustomCommandToOutput(
const std::vector<std::string>& outputs,
const std::vector<std::string>& byproducts,
@@ -211,7 +218,8 @@ public:
const char* workingDir, const CommandSourceCallback& callback = nullptr,
bool replace = false, bool escapeOldStyle = true,
bool uses_terminal = false, bool command_expand_lists = false,
- const std::string& depfile = "", const std::string& job_pool = "");
+ const std::string& depfile = "", const std::string& job_pool = "",
+ bool stdPipesUTF8 = false);
void AddCustomCommandOldStyle(const std::string& target,
const std::vector<std::string>& outputs,
const std::vector<std::string>& depends,
@@ -279,7 +287,8 @@ public:
const std::vector<std::string>& depends,
const cmCustomCommandLines& commandLines, bool escapeOldStyle = true,
const char* comment = nullptr, bool uses_terminal = false,
- bool command_expand_lists = false, const std::string& job_pool = "");
+ bool command_expand_lists = false, const std::string& job_pool = "",
+ bool stdPipesUTF8 = false);
/**
* Add a subdirectory to the build.
@@ -314,6 +323,12 @@ public:
void AddCacheDefinition(const std::string& name, const char* value,
const char* doc, cmStateEnums::CacheEntryType type,
bool force = false);
+ void AddCacheDefinition(const std::string& name, const std::string& value,
+ const char* doc, cmStateEnums::CacheEntryType type,
+ bool force = false)
+ {
+ AddCacheDefinition(name, value.c_str(), doc, type, force);
+ }
/**
* Remove a variable definition from the build. This is not valid
@@ -408,7 +423,8 @@ public:
}
const char* GetIncludeRegularExpression() const
{
- return this->GetProperty("INCLUDE_REGULAR_EXPRESSION");
+ cmProp p = this->GetProperty("INCLUDE_REGULAR_EXPRESSION");
+ return p ? p->c_str() : nullptr;
}
/**
@@ -786,8 +802,8 @@ public:
void SetProperty(const std::string& prop, const char* value);
void AppendProperty(const std::string& prop, const std::string& value,
bool asString = false);
- const char* GetProperty(const std::string& prop) const;
- const char* GetProperty(const std::string& prop, bool chain) const;
+ cmProp GetProperty(const std::string& prop) const;
+ cmProp GetProperty(const std::string& prop, bool chain) const;
bool GetPropertyAsBool(const std::string& prop) const;
std::vector<std::string> GetPropertyKeys() const;
diff --git a/Source/cmMakefileExecutableTargetGenerator.cxx b/Source/cmMakefileExecutableTargetGenerator.cxx
index 0471a45..e15b016 100644
--- a/Source/cmMakefileExecutableTargetGenerator.cxx
+++ b/Source/cmMakefileExecutableTargetGenerator.cxx
@@ -122,31 +122,15 @@ void cmMakefileExecutableTargetGenerator::WriteDeviceExecutableRule(
}
// Build a list of compiler flags and linker flags.
- std::string flags;
+ std::string langFlags;
std::string linkFlags;
- // Add flags to create an executable.
- // Add symbol export flags if necessary.
- if (this->GeneratorTarget->IsExecutableWithExports()) {
- std::string export_flag_var =
- cmStrCat("CMAKE_EXE_EXPORTS_", linkLanguage, "_FLAG");
- this->LocalGenerator->AppendFlags(
- linkFlags, this->Makefile->GetSafeDefinition(export_flag_var));
- }
-
- this->LocalGenerator->AppendFlags(linkFlags,
- this->LocalGenerator->GetLinkLibsCMP0065(
- linkLanguage, *this->GeneratorTarget));
-
// Add language feature flags.
this->LocalGenerator->AddLanguageFlagsForLinking(
- flags, this->GeneratorTarget, linkLanguage, this->GetConfigName());
-
- this->LocalGenerator->AddArchitectureFlags(
- flags, this->GeneratorTarget, linkLanguage, this->GetConfigName());
+ langFlags, this->GeneratorTarget, linkLanguage, this->GetConfigName());
- // Add target-specific linker flags.
- this->GetTargetLinkFlags(linkFlags, linkLanguage);
+ // Add device-specific linker flags.
+ this->GetDeviceLinkFlags(linkFlags, linkLanguage);
// Construct a list of files associated with this executable that
// may need to be cleaned.
@@ -226,7 +210,7 @@ void cmMakefileExecutableTargetGenerator::WriteDeviceExecutableRule(
vars.ObjectDir = objectDir.c_str();
vars.Target = target.c_str();
vars.LinkLibraries = linkLibs.c_str();
- vars.Flags = flags.c_str();
+ vars.LanguageCompileFlags = langFlags.c_str();
vars.LinkFlags = linkFlags.c_str();
vars.TargetCompilePDB = targetOutPathCompilePDB.c_str();
@@ -547,7 +531,7 @@ void cmMakefileExecutableTargetGenerator::WriteExecutableRule(bool relink)
cmRulePlaceholderExpander::RuleVariables vars;
vars.CMTargetName = this->GeneratorTarget->GetName().c_str();
vars.CMTargetType =
- cmState::GetTargetTypeName(this->GeneratorTarget->GetType());
+ cmState::GetTargetTypeName(this->GeneratorTarget->GetType()).c_str();
vars.Language = linkLanguage.c_str();
vars.Objects = buildObjs.c_str();
std::string objectDir = this->GeneratorTarget->GetSupportDirectory();
diff --git a/Source/cmMakefileLibraryTargetGenerator.cxx b/Source/cmMakefileLibraryTargetGenerator.cxx
index d3f3a4f..2d360e6 100644
--- a/Source/cmMakefileLibraryTargetGenerator.cxx
+++ b/Source/cmMakefileLibraryTargetGenerator.cxx
@@ -141,8 +141,7 @@ void cmMakefileLibraryTargetGenerator::WriteStaticLibraryRules()
std::string extraFlags;
this->LocalGenerator->GetStaticLibraryFlags(
- extraFlags, cmSystemTools::UpperCase(this->GetConfigName()), linkLanguage,
- this->GeneratorTarget);
+ extraFlags, this->GetConfigName(), linkLanguage, this->GeneratorTarget);
this->WriteLibraryRules(linkRuleVar, extraFlags, false);
}
@@ -250,9 +249,14 @@ void cmMakefileLibraryTargetGenerator::WriteDeviceLibraryRules(
std::vector<std::string> depends;
this->AppendLinkDepends(depends, linkLanguage);
+ // Add language-specific flags.
+ std::string langFlags;
+ this->LocalGenerator->AddLanguageFlagsForLinking(
+ langFlags, this->GeneratorTarget, linkLanguage, this->GetConfigName());
+
// Create set of linking flags.
std::string linkFlags;
- this->GetTargetLinkFlags(linkFlags, linkLanguage);
+ this->GetDeviceLinkFlags(linkFlags, linkLanguage);
// Get the name of the device object to generate.
std::string const targetOutputReal =
@@ -345,16 +349,10 @@ void cmMakefileLibraryTargetGenerator::WriteDeviceLibraryRules(
vars.Target = target.c_str();
vars.LinkLibraries = linkLibs.c_str();
vars.ObjectsQuoted = buildObjs.c_str();
+ vars.LanguageCompileFlags = langFlags.c_str();
vars.LinkFlags = linkFlags.c_str();
vars.TargetCompilePDB = targetOutPathCompilePDB.c_str();
- // Add language-specific flags.
- std::string langFlags;
- this->LocalGenerator->AddLanguageFlagsForLinking(
- langFlags, this->GeneratorTarget, linkLanguage, this->GetConfigName());
-
- vars.LanguageCompileFlags = langFlags.c_str();
-
std::string launcher;
const char* val = this->LocalGenerator->GetRuleLauncher(
this->GeneratorTarget, "RULE_LAUNCH_LINK");
@@ -756,7 +754,7 @@ void cmMakefileLibraryTargetGenerator::WriteLibraryRules(
vars.CMTargetName = this->GeneratorTarget->GetName().c_str();
vars.CMTargetType =
- cmState::GetTargetTypeName(this->GeneratorTarget->GetType());
+ cmState::GetTargetTypeName(this->GeneratorTarget->GetType()).c_str();
vars.Language = linkLanguage.c_str();
vars.AIXExports = aixExports.c_str();
vars.Objects = buildObjs.c_str();
diff --git a/Source/cmMakefileProfilingData.cxx b/Source/cmMakefileProfilingData.cxx
new file mode 100644
index 0000000..e0150dc
--- /dev/null
+++ b/Source/cmMakefileProfilingData.cxx
@@ -0,0 +1,114 @@
+/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
+ file Copyright.txt or https://cmake.org/licensing for details. */
+#include "cmMakefileProfilingData.h"
+
+#include <chrono>
+#include <stdexcept>
+#include <vector>
+
+#include <cm3p/json/value.h>
+#include <cm3p/json/writer.h>
+
+#include "cmsys/FStream.hxx"
+#include "cmsys/SystemInformation.hxx"
+
+#include "cmListFileCache.h"
+#include "cmStringAlgorithms.h"
+#include "cmSystemTools.h"
+
+cmMakefileProfilingData::cmMakefileProfilingData(
+ const std::string& profileStream)
+{
+ std::ios::openmode omode = std::ios::out | std::ios::trunc;
+ this->ProfileStream.open(profileStream.c_str(), omode);
+ Json::StreamWriterBuilder wbuilder;
+ this->JsonWriter =
+ std::unique_ptr<Json::StreamWriter>(wbuilder.newStreamWriter());
+ if (!this->ProfileStream.good()) {
+ throw std::runtime_error(std::string("Unable to open: ") + profileStream);
+ }
+
+ this->ProfileStream << "[";
+};
+
+cmMakefileProfilingData::~cmMakefileProfilingData() noexcept
+{
+ if (this->ProfileStream.good()) {
+ try {
+ this->ProfileStream << "]";
+ this->ProfileStream.close();
+ } catch (...) {
+ cmSystemTools::Error("Error writing profiling output!");
+ }
+ }
+}
+
+void cmMakefileProfilingData::StartEntry(const cmListFileFunction& lff,
+ cmListFileContext const& lfc)
+{
+ /* Do not try again if we previously failed to write to output. */
+ if (!this->ProfileStream.good()) {
+ return;
+ }
+
+ try {
+ if (this->ProfileStream.tellp() > 1) {
+ this->ProfileStream << ",";
+ }
+ cmsys::SystemInformation info;
+ Json::Value v;
+ v["ph"] = "B";
+ v["name"] = lff.Name.Original;
+ v["cat"] = "cmake";
+ v["ts"] = Json::Value::UInt64(
+ std::chrono::duration_cast<std::chrono::microseconds>(
+ std::chrono::steady_clock::now().time_since_epoch())
+ .count());
+ v["pid"] = static_cast<int>(info.GetProcessId());
+ v["tid"] = 0;
+ Json::Value argsValue;
+ if (!lff.Arguments.empty()) {
+ std::string args;
+ for (const auto& a : lff.Arguments) {
+ args += (args.empty() ? "" : " ") + a.Value;
+ }
+ argsValue["functionArgs"] = args;
+ }
+ argsValue["location"] = lfc.FilePath + ":" + std::to_string(lfc.Line);
+ v["args"] = argsValue;
+
+ this->JsonWriter->write(v, &this->ProfileStream);
+ } catch (std::ios_base::failure& fail) {
+ cmSystemTools::Error(
+ cmStrCat("Failed to write to profiling output: ", fail.what()));
+ } catch (...) {
+ cmSystemTools::Error("Error writing profiling output!");
+ }
+}
+
+void cmMakefileProfilingData::StopEntry()
+{
+ /* Do not try again if we previously failed to write to output. */
+ if (!this->ProfileStream.good()) {
+ return;
+ }
+
+ try {
+ this->ProfileStream << ",";
+ cmsys::SystemInformation info;
+ Json::Value v;
+ v["ph"] = "E";
+ v["ts"] = Json::Value::UInt64(
+ std::chrono::duration_cast<std::chrono::microseconds>(
+ std::chrono::steady_clock::now().time_since_epoch())
+ .count());
+ v["pid"] = static_cast<int>(info.GetProcessId());
+ v["tid"] = 0;
+ this->JsonWriter->write(v, &this->ProfileStream);
+ } catch (std::ios_base::failure& fail) {
+ cmSystemTools::Error(
+ cmStrCat("Failed to write to profiling output:", fail.what()));
+ } catch (...) {
+ cmSystemTools::Error("Error writing profiling output!");
+ }
+}
diff --git a/Source/cmMakefileProfilingData.h b/Source/cmMakefileProfilingData.h
new file mode 100644
index 0000000..1babd97
--- /dev/null
+++ b/Source/cmMakefileProfilingData.h
@@ -0,0 +1,29 @@
+/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
+ file Copyright.txt or https://cmake.org/licensing for details. */
+#ifndef cmMakefileProfilingData_h
+#define cmMakefileProfilingData_h
+#include <memory>
+#include <string>
+
+#include "cmsys/FStream.hxx"
+
+namespace Json {
+class StreamWriter;
+}
+
+class cmListFileContext;
+struct cmListFileFunction;
+
+class cmMakefileProfilingData
+{
+public:
+ cmMakefileProfilingData(const std::string&);
+ ~cmMakefileProfilingData() noexcept;
+ void StartEntry(const cmListFileFunction& lff, cmListFileContext const& lfc);
+ void StopEntry();
+
+private:
+ cmsys::ofstream ProfileStream;
+ std::unique_ptr<Json::StreamWriter> JsonWriter;
+};
+#endif
diff --git a/Source/cmMakefileTargetGenerator.cxx b/Source/cmMakefileTargetGenerator.cxx
index a8769d8..04d4db7 100644
--- a/Source/cmMakefileTargetGenerator.cxx
+++ b/Source/cmMakefileTargetGenerator.cxx
@@ -5,6 +5,7 @@
#include <cassert>
#include <cstdio>
#include <sstream>
+#include <unordered_map>
#include <utility>
#include <cm/memory>
@@ -17,7 +18,7 @@
#include "cmGeneratorExpression.h"
#include "cmGeneratorTarget.h"
#include "cmGlobalUnixMakefileGenerator3.h"
-#include "cmLinkLineComputer.h"
+#include "cmLinkLineComputer.h" // IWYU pragma: keep
#include "cmLocalCommonGenerator.h"
#include "cmLocalUnixMakefileGenerator3.h"
#include "cmMakefile.h"
@@ -46,9 +47,8 @@ cmMakefileTargetGenerator::cmMakefileTargetGenerator(cmGeneratorTarget* target)
this->LocalGenerator->GetGlobalGenerator());
cmake* cm = this->GlobalGenerator->GetCMakeInstance();
this->NoRuleMessages = false;
- if (const char* ruleStatus =
- cm->GetState()->GetGlobalProperty("RULE_MESSAGES")) {
- this->NoRuleMessages = cmIsOff(ruleStatus);
+ if (cmProp ruleStatus = cm->GetState()->GetGlobalProperty("RULE_MESSAGES")) {
+ this->NoRuleMessages = cmIsOff(*ruleStatus);
}
MacOSXContentGenerator = cm::make_unique<MacOSXContentGeneratorType>(this);
}
@@ -87,6 +87,18 @@ std::string cmMakefileTargetGenerator::GetConfigName()
return configNames.front();
}
+void cmMakefileTargetGenerator::GetDeviceLinkFlags(
+ std::string& linkFlags, const std::string& linkLanguage)
+{
+ cmGeneratorTarget::DeviceLinkSetter setter(*this->GetGeneratorTarget());
+
+ std::vector<std::string> linkOpts;
+ this->GeneratorTarget->GetLinkOptions(linkOpts, this->GetConfigName(),
+ linkLanguage);
+ // LINK_OPTIONS are escaped.
+ this->LocalGenerator->AppendCompileOptions(linkFlags, linkOpts);
+}
+
void cmMakefileTargetGenerator::GetTargetLinkFlags(
std::string& flags, const std::string& linkLanguage)
{
@@ -155,7 +167,7 @@ void cmMakefileTargetGenerator::WriteTargetBuildRules()
// Evaluates generator expressions and expands prop_value
auto evaluatedFiles =
- [this](const char* prop_value) -> std::vector<std::string> {
+ [this](const std::string& prop_value) -> std::vector<std::string> {
std::vector<std::string> files;
cmExpandList(cmGeneratorExpression::Evaluate(
prop_value, this->LocalGenerator, this->GetConfigName(),
@@ -165,16 +177,16 @@ void cmMakefileTargetGenerator::WriteTargetBuildRules()
};
// Look for additional files registered for cleaning in this directory.
- if (const char* prop_value =
+ if (cmProp prop_value =
this->Makefile->GetProperty("ADDITIONAL_MAKE_CLEAN_FILES")) {
- std::vector<std::string> const files = evaluatedFiles(prop_value);
+ std::vector<std::string> const files = evaluatedFiles(*prop_value);
this->CleanFiles.insert(files.begin(), files.end());
}
// Look for additional files registered for cleaning in this target.
- if (const char* prop_value =
+ if (cmProp prop_value =
this->GeneratorTarget->GetProperty("ADDITIONAL_CLEAN_FILES")) {
- std::vector<std::string> const files = evaluatedFiles(prop_value);
+ std::vector<std::string> const files = evaluatedFiles(*prop_value);
// For relative path support
std::string const& binaryDir =
this->LocalGenerator->GetCurrentBinaryDirectory();
@@ -184,8 +196,8 @@ void cmMakefileTargetGenerator::WriteTargetBuildRules()
}
// add custom commands to the clean rules?
- const char* clean_no_custom = this->Makefile->GetProperty("CLEAN_NO_CUSTOM");
- bool clean = cmIsOff(clean_no_custom);
+ cmProp clean_no_custom = this->Makefile->GetProperty("CLEAN_NO_CUSTOM");
+ bool clean = clean_no_custom ? cmIsOff(*clean_no_custom) : true;
// First generate the object rule files. Save a list of all object
// files for this target.
@@ -300,8 +312,7 @@ void cmMakefileTargetGenerator::WriteCommonCodeRules()
dependFileNameFull, false, this->GlobalGenerator->GetMakefileEncoding());
depFileStream << "# Empty dependencies file for "
<< this->GeneratorTarget->GetName() << ".\n"
- << "# This may be replaced when dependencies are built."
- << std::endl;
+ << "# This may be replaced when dependencies are built.\n";
}
// Open the flags file. This should be copy-if-different because the
@@ -342,17 +353,32 @@ void cmMakefileTargetGenerator::WriteTargetLanguageFlags()
<< "\n";
}
+ bool const escapeOctothorpe = this->GlobalGenerator->CanEscapeOctothorpe();
+
for (std::string const& language : languages) {
- std::string flags = this->GetFlags(language, this->GetConfigName());
std::string defines = this->GetDefines(language, this->GetConfigName());
std::string includes = this->GetIncludes(language, this->GetConfigName());
- // Escape comment characters so they do not terminate assignment.
- cmSystemTools::ReplaceString(flags, "#", "\\#");
- cmSystemTools::ReplaceString(defines, "#", "\\#");
- cmSystemTools::ReplaceString(includes, "#", "\\#");
- *this->FlagFileStream << language << "_FLAGS = " << flags << "\n\n";
+ if (escapeOctothorpe) {
+ // Escape comment characters so they do not terminate assignment.
+ cmSystemTools::ReplaceString(defines, "#", "\\#");
+ cmSystemTools::ReplaceString(includes, "#", "\\#");
+ }
*this->FlagFileStream << language << "_DEFINES = " << defines << "\n\n";
*this->FlagFileStream << language << "_INCLUDES = " << includes << "\n\n";
+
+ std::vector<std::string> architectures;
+ this->GeneratorTarget->GetAppleArchs(this->GetConfigName(), architectures);
+ architectures.emplace_back();
+
+ for (const std::string& arch : architectures) {
+ std::string flags =
+ this->GetFlags(language, this->GetConfigName(), arch);
+ if (escapeOctothorpe) {
+ cmSystemTools::ReplaceString(flags, "#", "\\#");
+ }
+ *this->FlagFileStream << language << "_FLAGS" << arch << " = " << flags
+ << "\n\n";
+ }
}
}
@@ -465,17 +491,37 @@ void cmMakefileTargetGenerator::WriteObjectRuleFiles(
std::string configUpper = cmSystemTools::UpperCase(config);
// Add precompile headers dependencies
- const std::string pchSource =
- this->GeneratorTarget->GetPchSource(config, lang);
- if (!pchSource.empty() && !source.GetProperty("SKIP_PRECOMPILE_HEADERS")) {
- std::string const& pchHeader =
- this->GeneratorTarget->GetPchHeader(config, lang);
- depends.push_back(pchHeader);
- if (source.GetFullPath() != pchSource) {
- depends.push_back(this->GeneratorTarget->GetPchFile(config, lang));
+ std::vector<std::string> architectures;
+ this->GeneratorTarget->GetAppleArchs(config, architectures);
+ if (architectures.empty()) {
+ architectures.emplace_back();
+ }
+
+ std::string filterArch;
+ std::unordered_map<std::string, std::string> pchSources;
+ for (const std::string& arch : architectures) {
+ const std::string pchSource =
+ this->GeneratorTarget->GetPchSource(config, lang, arch);
+ if (pchSource == source.GetFullPath()) {
+ filterArch = arch;
+ }
+ if (!pchSource.empty()) {
+ pchSources.insert(std::make_pair(pchSource, arch));
+ }
+ }
+
+ if (!pchSources.empty() && !source.GetProperty("SKIP_PRECOMPILE_HEADERS")) {
+ for (const std::string& arch : architectures) {
+ std::string const& pchHeader =
+ this->GeneratorTarget->GetPchHeader(config, lang, arch);
+ depends.push_back(pchHeader);
+ if (pchSources.find(source.GetFullPath()) == pchSources.end()) {
+ depends.push_back(
+ this->GeneratorTarget->GetPchFile(config, lang, arch));
+ }
+ this->LocalGenerator->AddImplicitDepends(this->GeneratorTarget, lang,
+ objFullPath, pchHeader);
}
- this->LocalGenerator->AddImplicitDepends(this->GeneratorTarget, lang,
- objFullPath, pchHeader);
}
std::string relativeObj =
@@ -486,7 +532,7 @@ void cmMakefileTargetGenerator::WriteObjectRuleFiles(
std::string flags;
// Add language-specific flags.
- std::string langFlags = cmStrCat("$(", lang, "_FLAGS)");
+ std::string langFlags = cmStrCat("$(", lang, "_FLAGS", filterArch, ")");
this->LocalGenerator->AppendFlags(flags, langFlags);
cmGeneratorExpressionInterpreter genexInterpreter(
@@ -499,9 +545,9 @@ void cmMakefileTargetGenerator::WriteObjectRuleFiles(
// Add flags from source file properties.
const std::string COMPILE_FLAGS("COMPILE_FLAGS");
- if (const char* cflags = source.GetProperty(COMPILE_FLAGS)) {
+ if (cmProp cflags = source.GetProperty(COMPILE_FLAGS)) {
const std::string& evaluatedFlags =
- genexInterpreter.Evaluate(cflags, COMPILE_FLAGS);
+ genexInterpreter.Evaluate(*cflags, COMPILE_FLAGS);
this->LocalGenerator->AppendFlags(flags, evaluatedFlags);
*this->FlagFileStream << "# Custom flags: " << relativeObj
<< "_FLAGS = " << evaluatedFlags << "\n"
@@ -509,9 +555,9 @@ void cmMakefileTargetGenerator::WriteObjectRuleFiles(
}
const std::string COMPILE_OPTIONS("COMPILE_OPTIONS");
- if (const char* coptions = source.GetProperty(COMPILE_OPTIONS)) {
+ if (cmProp coptions = source.GetProperty(COMPILE_OPTIONS)) {
const std::string& evaluatedOptions =
- genexInterpreter.Evaluate(coptions, COMPILE_OPTIONS);
+ genexInterpreter.Evaluate(*coptions, COMPILE_OPTIONS);
this->LocalGenerator->AppendCompileOptions(flags, evaluatedOptions);
*this->FlagFileStream << "# Custom options: " << relativeObj
<< "_OPTIONS = " << evaluatedOptions << "\n"
@@ -519,11 +565,12 @@ void cmMakefileTargetGenerator::WriteObjectRuleFiles(
}
// Add precompile headers compile options.
- if (!pchSource.empty() && !source.GetProperty("SKIP_PRECOMPILE_HEADERS")) {
+ if (!pchSources.empty() && !source.GetProperty("SKIP_PRECOMPILE_HEADERS")) {
std::string pchOptions;
- if (source.GetFullPath() == pchSource) {
- pchOptions =
- this->GeneratorTarget->GetPchCreateCompileOptions(config, lang);
+ auto pchIt = pchSources.find(source.GetFullPath());
+ if (pchIt != pchSources.end()) {
+ pchOptions = this->GeneratorTarget->GetPchCreateCompileOptions(
+ config, lang, pchIt->second);
} else {
pchOptions =
this->GeneratorTarget->GetPchUseCompileOptions(config, lang);
@@ -542,9 +589,9 @@ void cmMakefileTargetGenerator::WriteObjectRuleFiles(
std::vector<std::string> includes;
const std::string INCLUDE_DIRECTORIES("INCLUDE_DIRECTORIES");
- if (const char* cincludes = source.GetProperty(INCLUDE_DIRECTORIES)) {
+ if (cmProp cincludes = source.GetProperty(INCLUDE_DIRECTORIES)) {
const std::string& evaluatedIncludes =
- genexInterpreter.Evaluate(cincludes, INCLUDE_DIRECTORIES);
+ genexInterpreter.Evaluate(*cincludes, INCLUDE_DIRECTORIES);
this->LocalGenerator->AppendIncludeDirectories(includes, evaluatedIncludes,
source);
*this->FlagFileStream << "# Custom include directories: " << relativeObj
@@ -558,18 +605,18 @@ void cmMakefileTargetGenerator::WriteObjectRuleFiles(
// Add source-specific preprocessor definitions.
const std::string COMPILE_DEFINITIONS("COMPILE_DEFINITIONS");
- if (const char* compile_defs = source.GetProperty(COMPILE_DEFINITIONS)) {
+ if (cmProp compile_defs = source.GetProperty(COMPILE_DEFINITIONS)) {
const std::string& evaluatedDefs =
- genexInterpreter.Evaluate(compile_defs, COMPILE_DEFINITIONS);
+ genexInterpreter.Evaluate(*compile_defs, COMPILE_DEFINITIONS);
this->LocalGenerator->AppendDefines(defines, evaluatedDefs);
*this->FlagFileStream << "# Custom defines: " << relativeObj
<< "_DEFINES = " << evaluatedDefs << "\n"
<< "\n";
}
std::string defPropName = cmStrCat("COMPILE_DEFINITIONS_", configUpper);
- if (const char* config_compile_defs = source.GetProperty(defPropName)) {
+ if (cmProp config_compile_defs = source.GetProperty(defPropName)) {
const std::string& evaluatedDefs =
- genexInterpreter.Evaluate(config_compile_defs, COMPILE_DEFINITIONS);
+ genexInterpreter.Evaluate(*config_compile_defs, COMPILE_DEFINITIONS);
this->LocalGenerator->AppendDefines(defines, evaluatedDefs);
*this->FlagFileStream << "# Custom defines: " << relativeObj << "_DEFINES_"
<< configUpper << " = " << evaluatedDefs << "\n"
@@ -639,7 +686,7 @@ void cmMakefileTargetGenerator::WriteObjectRuleFiles(
cmRulePlaceholderExpander::RuleVariables vars;
vars.CMTargetName = this->GeneratorTarget->GetName().c_str();
vars.CMTargetType =
- cmState::GetTargetTypeName(this->GeneratorTarget->GetType());
+ cmState::GetTargetTypeName(this->GeneratorTarget->GetType()).c_str();
vars.Language = lang.c_str();
vars.Target = targetOutPathReal.c_str();
vars.TargetPDB = targetOutPathPDB.c_str();
@@ -717,8 +764,8 @@ void cmMakefileTargetGenerator::WriteObjectRuleFiles(
// no launcher for CMAKE_EXPORT_COMPILE_COMMANDS
rulePlaceholderExpander->ExpandRuleVariables(this->LocalGenerator,
compileCommand, vars);
- std::string workingDirectory = cmSystemTools::CollapseFullPath(
- this->LocalGenerator->GetCurrentBinaryDirectory());
+ std::string workingDirectory =
+ this->LocalGenerator->GetCurrentBinaryDirectory();
compileCommand.replace(compileCommand.find(langFlags), langFlags.size(),
this->GetFlags(lang, this->GetConfigName()));
std::string langDefines = std::string("$(") + lang + "_DEFINES)";
@@ -750,25 +797,24 @@ void cmMakefileTargetGenerator::WriteObjectRuleFiles(
(lang == "C" || lang == "CXX" || lang == "Fortran" || lang == "CUDA" ||
lang == "OBJC" || lang == "OBJCXX")) {
std::string const clauncher_prop = lang + "_COMPILER_LAUNCHER";
- const char* clauncher =
- this->GeneratorTarget->GetProperty(clauncher_prop);
- if (clauncher && *clauncher) {
- compilerLauncher = clauncher;
+ cmProp clauncher = this->GeneratorTarget->GetProperty(clauncher_prop);
+ if (clauncher && !clauncher->empty()) {
+ compilerLauncher = *clauncher;
}
}
// Maybe insert an include-what-you-use runner.
if (!compileCommands.empty() && (lang == "C" || lang == "CXX")) {
std::string const iwyu_prop = lang + "_INCLUDE_WHAT_YOU_USE";
- const char* iwyu = this->GeneratorTarget->GetProperty(iwyu_prop);
+ cmProp iwyu = this->GeneratorTarget->GetProperty(iwyu_prop);
std::string const tidy_prop = lang + "_CLANG_TIDY";
- const char* tidy = this->GeneratorTarget->GetProperty(tidy_prop);
+ cmProp tidy = this->GeneratorTarget->GetProperty(tidy_prop);
std::string const cpplint_prop = lang + "_CPPLINT";
- const char* cpplint = this->GeneratorTarget->GetProperty(cpplint_prop);
+ cmProp cpplint = this->GeneratorTarget->GetProperty(cpplint_prop);
std::string const cppcheck_prop = lang + "_CPPCHECK";
- const char* cppcheck = this->GeneratorTarget->GetProperty(cppcheck_prop);
- if ((iwyu && *iwyu) || (tidy && *tidy) || (cpplint && *cpplint) ||
- (cppcheck && *cppcheck)) {
+ cmProp cppcheck = this->GeneratorTarget->GetProperty(cppcheck_prop);
+ if ((iwyu && !iwyu->empty()) || (tidy && !tidy->empty()) ||
+ (cpplint && !cpplint->empty()) || (cppcheck && !cppcheck->empty())) {
std::string run_iwyu = "$(CMAKE_COMMAND) -E __run_co_compile";
if (!compilerLauncher.empty()) {
// In __run_co_compile case the launcher command is supplied
@@ -777,11 +823,11 @@ void cmMakefileTargetGenerator::WriteObjectRuleFiles(
run_iwyu += this->LocalGenerator->EscapeForShell(compilerLauncher);
compilerLauncher.clear();
}
- if (iwyu && *iwyu) {
+ if (iwyu && !iwyu->empty()) {
run_iwyu += " --iwyu=";
- run_iwyu += this->LocalGenerator->EscapeForShell(iwyu);
+ run_iwyu += this->LocalGenerator->EscapeForShell(*iwyu);
}
- if (tidy && *tidy) {
+ if (tidy && !tidy->empty()) {
run_iwyu += " --tidy=";
const char* driverMode = this->Makefile->GetDefinition(
"CMAKE_" + lang + "_CLANG_TIDY_DRIVER_MODE");
@@ -789,18 +835,18 @@ void cmMakefileTargetGenerator::WriteObjectRuleFiles(
driverMode = lang == "C" ? "gcc" : "g++";
}
run_iwyu += this->LocalGenerator->EscapeForShell(
- cmStrCat(tidy, ";--extra-arg-before=--driver-mode=", driverMode));
+ cmStrCat(*tidy, ";--extra-arg-before=--driver-mode=", driverMode));
}
- if (cpplint && *cpplint) {
+ if (cpplint && !cpplint->empty()) {
run_iwyu += " --cpplint=";
- run_iwyu += this->LocalGenerator->EscapeForShell(cpplint);
+ run_iwyu += this->LocalGenerator->EscapeForShell(*cpplint);
}
- if (cppcheck && *cppcheck) {
+ if (cppcheck && !cppcheck->empty()) {
run_iwyu += " --cppcheck=";
- run_iwyu += this->LocalGenerator->EscapeForShell(cppcheck);
+ run_iwyu += this->LocalGenerator->EscapeForShell(*cppcheck);
}
- if ((tidy && *tidy) || (cpplint && *cpplint) ||
- (cppcheck && *cppcheck)) {
+ if ((tidy && !tidy->empty()) || (cpplint && !cpplint->empty()) ||
+ (cppcheck && !cppcheck->empty())) {
run_iwyu += " --source=";
run_iwyu += sourceFile;
}
@@ -848,10 +894,15 @@ void cmMakefileTargetGenerator::WriteObjectRuleFiles(
// Check for extra outputs created by the compilation.
std::vector<std::string> outputs(1, relativeObj);
- if (const char* extra_outputs_str = source.GetProperty("OBJECT_OUTPUTS")) {
- // Register these as extra files to clean.
- cmExpandList(extra_outputs_str, outputs);
- this->CleanFiles.insert(outputs.begin() + 1, outputs.end());
+ if (cmProp extra_outputs_str = source.GetProperty("OBJECT_OUTPUTS")) {
+ std::string evaluated_outputs = cmGeneratorExpression::Evaluate(
+ *extra_outputs_str, this->LocalGenerator, config);
+
+ if (!evaluated_outputs.empty()) {
+ // Register these as extra files to clean.
+ cmExpandList(evaluated_outputs, outputs);
+ this->CleanFiles.insert(outputs.begin() + 1, outputs.end());
+ }
}
// Write the rule.
@@ -1130,8 +1181,7 @@ void cmMakefileTargetGenerator::WriteTargetDependRules()
// translation table for the dependency scanning process.
depCmd << "cd "
<< (this->LocalGenerator->ConvertToOutputFormat(
- cmSystemTools::CollapseFullPath(
- this->LocalGenerator->GetBinaryDirectory()),
+ this->LocalGenerator->GetBinaryDirectory(),
cmOutputConverter::SHELL))
<< " && ";
#endif
@@ -1147,23 +1197,19 @@ void cmMakefileTargetGenerator::WriteTargetDependRules()
depCmd << "$(CMAKE_COMMAND) -E cmake_depends \""
<< this->GlobalGenerator->GetName() << "\" "
<< this->LocalGenerator->ConvertToOutputFormat(
- cmSystemTools::CollapseFullPath(
- this->LocalGenerator->GetSourceDirectory()),
+ this->LocalGenerator->GetSourceDirectory(),
cmOutputConverter::SHELL)
<< " "
<< this->LocalGenerator->ConvertToOutputFormat(
- cmSystemTools::CollapseFullPath(
- this->LocalGenerator->GetCurrentSourceDirectory()),
+ this->LocalGenerator->GetCurrentSourceDirectory(),
cmOutputConverter::SHELL)
<< " "
<< this->LocalGenerator->ConvertToOutputFormat(
- cmSystemTools::CollapseFullPath(
- this->LocalGenerator->GetBinaryDirectory()),
+ this->LocalGenerator->GetBinaryDirectory(),
cmOutputConverter::SHELL)
<< " "
<< this->LocalGenerator->ConvertToOutputFormat(
- cmSystemTools::CollapseFullPath(
- this->LocalGenerator->GetCurrentBinaryDirectory()),
+ this->LocalGenerator->GetCurrentBinaryDirectory(),
cmOutputConverter::SHELL)
<< " "
<< this->LocalGenerator->ConvertToOutputFormat(
@@ -1206,8 +1252,8 @@ void cmMakefileTargetGenerator::WriteObjectDependRules(
// Create the list of dependencies known at cmake time. These are
// shared between the object file and dependency scanning rule.
depends.push_back(source.GetFullPath());
- if (const char* objectDeps = source.GetProperty("OBJECT_DEPENDS")) {
- cmExpandList(objectDeps, depends);
+ if (cmProp objectDeps = source.GetProperty("OBJECT_DEPENDS")) {
+ cmExpandList(*objectDeps, depends);
}
}
@@ -1251,8 +1297,10 @@ void cmMakefileTargetGenerator::GenerateCustomRuleFile(
// Setup implicit dependency scanning.
for (auto const& idi : ccg.GetCC().GetImplicitDepends()) {
- std::string objFullPath = cmSystemTools::CollapseFullPath(outputs[0]);
- std::string srcFullPath = cmSystemTools::CollapseFullPath(idi.second);
+ std::string objFullPath = cmSystemTools::CollapseFullPath(
+ outputs[0], this->LocalGenerator->GetCurrentBinaryDirectory());
+ std::string srcFullPath = cmSystemTools::CollapseFullPath(
+ idi.second, this->LocalGenerator->GetCurrentBinaryDirectory());
this->LocalGenerator->AddImplicitDepends(this->GeneratorTarget, idi.first,
objFullPath, srcFullPath);
}
diff --git a/Source/cmMakefileTargetGenerator.h b/Source/cmMakefileTargetGenerator.h
index ec6b314..f38f862 100644
--- a/Source/cmMakefileTargetGenerator.h
+++ b/Source/cmMakefileTargetGenerator.h
@@ -60,6 +60,8 @@ public:
std::string GetConfigName();
protected:
+ void GetDeviceLinkFlags(std::string& linkFlags,
+ const std::string& linkLanguage);
void GetTargetLinkFlags(std::string& flags, const std::string& linkLanguage);
// create the file and directory etc
diff --git a/Source/cmMathCommand.cxx b/Source/cmMathCommand.cxx
index f11b906..56221bf 100644
--- a/Source/cmMathCommand.cxx
+++ b/Source/cmMathCommand.cxx
@@ -4,7 +4,7 @@
#include <cstdio>
-#include "cm_kwiml.h"
+#include <cm3p/kwiml/int.h>
#include "cmExecutionStatus.h"
#include "cmExprParserHelper.h"
diff --git a/Source/cmMessageCommand.cxx b/Source/cmMessageCommand.cxx
index bf8183b..c7bb9a7 100644
--- a/Source/cmMessageCommand.cxx
+++ b/Source/cmMessageCommand.cxx
@@ -6,8 +6,7 @@
#include <utility>
#include <cm/string_view>
-
-#include "cm_static_string_view.hxx"
+#include <cmext/string_view>
#include "cmExecutionStatus.h"
#include "cmMakefile.h"
diff --git a/Source/cmNinjaNormalTargetGenerator.cxx b/Source/cmNinjaNormalTargetGenerator.cxx
index 885703f..f87eba7 100644
--- a/Source/cmNinjaNormalTargetGenerator.cxx
+++ b/Source/cmNinjaNormalTargetGenerator.cxx
@@ -156,23 +156,25 @@ const char* cmNinjaNormalTargetGenerator::GetVisibleTypeName() const
std::string cmNinjaNormalTargetGenerator::LanguageLinkerRule(
const std::string& config) const
{
- return this->TargetLinkLanguage(config) + "_" +
- cmState::GetTargetTypeName(this->GetGeneratorTarget()->GetType()) +
- "_LINKER__" +
+ return cmStrCat(
+ this->TargetLinkLanguage(config), "_",
+ cmState::GetTargetTypeName(this->GetGeneratorTarget()->GetType()),
+ "_LINKER__",
cmGlobalNinjaGenerator::EncodeRuleName(
- this->GetGeneratorTarget()->GetName()) +
- "_" + config;
+ this->GetGeneratorTarget()->GetName()),
+ "_", config);
}
std::string cmNinjaNormalTargetGenerator::LanguageLinkerDeviceRule(
const std::string& config) const
{
- return this->TargetLinkLanguage(config) + "_" +
- cmState::GetTargetTypeName(this->GetGeneratorTarget()->GetType()) +
- "_DEVICE_LINKER__" +
+ return cmStrCat(
+ this->TargetLinkLanguage(config), "_",
+ cmState::GetTargetTypeName(this->GetGeneratorTarget()->GetType()),
+ "_DEVICE_LINKER__",
cmGlobalNinjaGenerator::EncodeRuleName(
- this->GetGeneratorTarget()->GetName()) +
- "_" + config;
+ this->GetGeneratorTarget()->GetName()),
+ "_", config);
}
struct cmNinjaRemoveNoOpCommands
@@ -191,7 +193,8 @@ void cmNinjaNormalTargetGenerator::WriteDeviceLinkRule(
cmRulePlaceholderExpander::RuleVariables vars;
vars.CMTargetName = this->GetGeneratorTarget()->GetName().c_str();
vars.CMTargetType =
- cmState::GetTargetTypeName(this->GetGeneratorTarget()->GetType());
+ cmState::GetTargetTypeName(this->GetGeneratorTarget()->GetType())
+ .c_str();
vars.Language = "CUDA";
@@ -230,11 +233,7 @@ void cmNinjaNormalTargetGenerator::WriteDeviceLinkRule(
vars.LinkFlags = "$LINK_FLAGS";
vars.Manifests = "$MANIFESTS";
- std::string langFlags;
- if (this->GetGeneratorTarget()->GetType() != cmStateEnums::EXECUTABLE) {
- langFlags += "$LANGUAGE_COMPILE_FLAGS $ARCH_FLAGS";
- vars.LanguageCompileFlags = langFlags.c_str();
- }
+ vars.LanguageCompileFlags = "$LANGUAGE_COMPILE_FLAGS";
std::string launcher;
const char* val = this->GetLocalGenerator()->GetRuleLauncher(
@@ -282,7 +281,7 @@ void cmNinjaNormalTargetGenerator::WriteLinkRule(bool useResponseFile,
cmNinjaRule rule(std::move(linkRuleName));
cmRulePlaceholderExpander::RuleVariables vars;
vars.CMTargetName = this->GetGeneratorTarget()->GetName().c_str();
- vars.CMTargetType = cmState::GetTargetTypeName(targetType);
+ vars.CMTargetType = cmState::GetTargetTypeName(targetType).c_str();
std::string lang = this->TargetLinkLanguage(config);
vars.Language = config.c_str();
@@ -587,8 +586,6 @@ void cmNinjaNormalTargetGenerator::WriteDeviceLinkStatement(
return;
}
- // Now we can do device linking
-
// First and very important step is to make sure while inside this
// step our link language is set to CUDA
std::string cudaLinkLanguage = "CUDA";
@@ -674,9 +671,9 @@ void cmNinjaNormalTargetGenerator::WriteDeviceLinkStatement(
linkLineComputer->SetUseWatcomQuote(useWatcomQuote);
linkLineComputer->SetUseNinjaMulti(globalGen->IsMultiConfig());
- localGen.GetTargetFlags(
- linkLineComputer.get(), config, vars["LINK_LIBRARIES"], vars["FLAGS"],
- vars["LINK_FLAGS"], frameworkPath, linkPath, genTarget);
+ localGen.GetDeviceLinkFlags(linkLineComputer.get(), config,
+ vars["LINK_LIBRARIES"], vars["LINK_FLAGS"],
+ frameworkPath, linkPath, genTarget);
this->addPoolNinjaVariable("JOB_POOL_LINK", genTarget, vars);
@@ -686,22 +683,12 @@ void cmNinjaNormalTargetGenerator::WriteDeviceLinkStatement(
vars["LINK_PATH"] = frameworkPath + linkPath;
- // Compute architecture specific link flags. Yes, these go into a different
- // variable for executables, probably due to a mistake made when duplicating
- // code between the Makefile executable and library generators.
- if (targetType == cmStateEnums::EXECUTABLE) {
- std::string t = vars["FLAGS"];
- localGen.AddArchitectureFlags(t, genTarget, cudaLinkLanguage, config);
- vars["FLAGS"] = t;
- } else {
- std::string t = vars["ARCH_FLAGS"];
- localGen.AddArchitectureFlags(t, genTarget, cudaLinkLanguage, config);
- vars["ARCH_FLAGS"] = t;
- t.clear();
- localGen.AddLanguageFlagsForLinking(t, genTarget, cudaLinkLanguage,
- config);
- vars["LANGUAGE_COMPILE_FLAGS"] = t;
- }
+ // Compute language specific link flags.
+ std::string langFlags;
+ localGen.AddLanguageFlagsForLinking(langFlags, genTarget, cudaLinkLanguage,
+ config);
+ vars["LANGUAGE_COMPILE_FLAGS"] = langFlags;
+
auto const tgtNames = this->TargetNames(config);
if (genTarget->HasSOName(config)) {
vars["SONAME_FLAG"] =
@@ -812,8 +799,20 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement(
targetOutputReal = this->ConvertToNinjaPath(targetOutputReal);
} else if (gt->IsFrameworkOnApple()) {
// Create the library framework.
+
+ cmOSXBundleGenerator::SkipParts bundleSkipParts;
+ if (globalGen->GetName() == "Ninja Multi-Config") {
+ const auto postFix = this->GeneratorTarget->GetFilePostfix(config);
+ // Skip creating Info.plist when there are multiple configurations, and
+ // the current configuration has a postfix. The non-postfix configuration
+ // Info.plist can be used by all the other configurations.
+ if (!postFix.empty()) {
+ bundleSkipParts.infoPlist = true;
+ }
+ }
+
this->OSXBundleGenerator->CreateFramework(
- tgtNames.Output, gt->GetDirectory(config), config);
+ tgtNames.Output, gt->GetDirectory(config), config, bundleSkipParts);
} else if (gt->IsCFBundleOnApple()) {
// Create the core foundation bundle.
this->OSXBundleGenerator->CreateCFBundle(tgtNames.Output,
@@ -848,8 +847,8 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement(
}();
vars["SWIFT_MODULE_NAME"] = [gt]() -> std::string {
- if (const char* name = gt->GetProperty("Swift_MODULE_NAME")) {
- return name;
+ if (cmProp name = gt->GetProperty("Swift_MODULE_NAME")) {
+ return *name;
}
return gt->GetName();
}();
@@ -857,15 +856,15 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement(
vars["SWIFT_MODULE"] = [this](const std::string& module) -> std::string {
std::string directory =
this->GetLocalGenerator()->GetCurrentBinaryDirectory();
- if (const char* prop = this->GetGeneratorTarget()->GetProperty(
+ if (cmProp prop = this->GetGeneratorTarget()->GetProperty(
"Swift_MODULE_DIRECTORY")) {
- directory = prop;
+ directory = *prop;
}
std::string name = module + ".swiftmodule";
- if (const char* prop =
+ if (cmProp prop =
this->GetGeneratorTarget()->GetProperty("Swift_MODULE")) {
- name = prop;
+ name = *prop;
}
return this->GetLocalGenerator()->ConvertToOutputFormat(
@@ -1025,7 +1024,7 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement(
std::string prefix;
std::string base;
std::string suffix;
- gt->GetFullNameComponents(prefix, base, suffix);
+ gt->GetFullNameComponents(prefix, base, suffix, config);
std::string dbg_suffix = ".dbg";
// TODO: Where to document?
if (mf->GetDefinition("CMAKE_DEBUG_SYMBOL_SUFFIX")) {
diff --git a/Source/cmNinjaTargetGenerator.cxx b/Source/cmNinjaTargetGenerator.cxx
index 486ed8d..f4ff51b 100644
--- a/Source/cmNinjaTargetGenerator.cxx
+++ b/Source/cmNinjaTargetGenerator.cxx
@@ -7,13 +7,15 @@
#include <iterator>
#include <map>
#include <ostream>
+#include <unordered_map>
+#include <unordered_set>
#include <utility>
#include <cm/memory>
#include <cmext/algorithm>
-#include "cm_jsoncpp_value.h"
-#include "cm_jsoncpp_writer.h"
+#include <cm3p/json/value.h>
+#include <cm3p/json/writer.h>
#include "cmComputeLinkInformation.h"
#include "cmCustomCommandGenerator.h"
@@ -94,17 +96,19 @@ cmGlobalNinjaGenerator* cmNinjaTargetGenerator::GetGlobalGenerator() const
std::string cmNinjaTargetGenerator::LanguageCompilerRule(
const std::string& lang, const std::string& config) const
{
- return lang + "_COMPILER__" +
- cmGlobalNinjaGenerator::EncodeRuleName(this->GeneratorTarget->GetName()) +
- "_" + config;
+ return cmStrCat(
+ lang, "_COMPILER__",
+ cmGlobalNinjaGenerator::EncodeRuleName(this->GeneratorTarget->GetName()),
+ '_', config);
}
std::string cmNinjaTargetGenerator::LanguagePreprocessRule(
std::string const& lang, const std::string& config) const
{
- return lang + "_PREPROCESS__" +
- cmGlobalNinjaGenerator::EncodeRuleName(this->GeneratorTarget->GetName()) +
- "_" + config;
+ return cmStrCat(
+ lang, "_PREPROCESS__",
+ cmGlobalNinjaGenerator::EncodeRuleName(this->GeneratorTarget->GetName()),
+ '_', config);
}
bool cmNinjaTargetGenerator::NeedExplicitPreprocessing(
@@ -129,9 +133,10 @@ bool cmNinjaTargetGenerator::CompilePreprocessedSourceWithDefines(
std::string cmNinjaTargetGenerator::LanguageDyndepRule(
const std::string& lang, const std::string& config) const
{
- return lang + "_DYNDEP__" +
- cmGlobalNinjaGenerator::EncodeRuleName(this->GeneratorTarget->GetName()) +
- "_" + config;
+ return cmStrCat(
+ lang, "_DYNDEP__",
+ cmGlobalNinjaGenerator::EncodeRuleName(this->GeneratorTarget->GetName()),
+ '_', config);
}
bool cmNinjaTargetGenerator::NeedDyndep(std::string const& lang) const
@@ -154,7 +159,26 @@ std::string cmNinjaTargetGenerator::ComputeFlagsForObject(
cmSourceFile const* source, const std::string& language,
const std::string& config)
{
- std::string flags = this->GetFlags(language, config);
+ std::vector<std::string> architectures;
+ std::unordered_map<std::string, std::string> pchSources;
+ this->GeneratorTarget->GetAppleArchs(config, architectures);
+ if (architectures.empty()) {
+ architectures.emplace_back();
+ }
+
+ std::string filterArch;
+ for (const std::string& arch : architectures) {
+ const std::string pchSource =
+ this->GeneratorTarget->GetPchSource(config, language, arch);
+ if (pchSource == source->GetFullPath()) {
+ filterArch = arch;
+ }
+ if (!pchSource.empty()) {
+ pchSources.insert(std::make_pair(pchSource, arch));
+ }
+ }
+
+ std::string flags = this->GetFlags(language, config, filterArch);
// Add Fortran format flags.
if (language == "Fortran") {
@@ -166,26 +190,24 @@ std::string cmNinjaTargetGenerator::ComputeFlagsForObject(
this->LocalGenerator, config, this->GeneratorTarget, language);
const std::string COMPILE_FLAGS("COMPILE_FLAGS");
- if (const char* cflags = source->GetProperty(COMPILE_FLAGS)) {
+ if (cmProp cflags = source->GetProperty(COMPILE_FLAGS)) {
this->LocalGenerator->AppendFlags(
- flags, genexInterpreter.Evaluate(cflags, COMPILE_FLAGS));
+ flags, genexInterpreter.Evaluate(*cflags, COMPILE_FLAGS));
}
const std::string COMPILE_OPTIONS("COMPILE_OPTIONS");
- if (const char* coptions = source->GetProperty(COMPILE_OPTIONS)) {
+ if (cmProp coptions = source->GetProperty(COMPILE_OPTIONS)) {
this->LocalGenerator->AppendCompileOptions(
- flags, genexInterpreter.Evaluate(coptions, COMPILE_OPTIONS));
+ flags, genexInterpreter.Evaluate(*coptions, COMPILE_OPTIONS));
}
// Add precompile headers compile options.
- const std::string pchSource =
- this->GeneratorTarget->GetPchSource(config, language);
-
- if (!pchSource.empty() && !source->GetProperty("SKIP_PRECOMPILE_HEADERS")) {
+ if (!pchSources.empty() && !source->GetProperty("SKIP_PRECOMPILE_HEADERS")) {
std::string pchOptions;
- if (source->GetFullPath() == pchSource) {
- pchOptions =
- this->GeneratorTarget->GetPchCreateCompileOptions(config, language);
+ auto pchIt = pchSources.find(source->GetFullPath());
+ if (pchIt != pchSources.end()) {
+ pchOptions = this->GeneratorTarget->GetPchCreateCompileOptions(
+ config, language, pchIt->second);
} else {
pchOptions =
this->GeneratorTarget->GetPchUseCompileOptions(config, language);
@@ -219,8 +241,8 @@ void cmNinjaTargetGenerator::AddIncludeFlags(std::string& languageFlags,
bool cmNinjaTargetGenerator::NeedDepTypeMSVC(const std::string& lang) const
{
- std::string const& deptype =
- this->GetMakefile()->GetSafeDefinition("CMAKE_NINJA_DEPTYPE_" + lang);
+ std::string const& deptype = this->GetMakefile()->GetSafeDefinition(
+ cmStrCat("CMAKE_NINJA_DEPTYPE_", lang));
if (deptype == "msvc") {
return true;
}
@@ -259,17 +281,17 @@ std::string cmNinjaTargetGenerator::ComputeDefines(cmSourceFile const* source,
}
const std::string COMPILE_DEFINITIONS("COMPILE_DEFINITIONS");
- if (const char* compile_defs = source->GetProperty(COMPILE_DEFINITIONS)) {
+ if (cmProp compile_defs = source->GetProperty(COMPILE_DEFINITIONS)) {
this->LocalGenerator->AppendDefines(
- defines, genexInterpreter.Evaluate(compile_defs, COMPILE_DEFINITIONS));
+ defines, genexInterpreter.Evaluate(*compile_defs, COMPILE_DEFINITIONS));
}
std::string defPropName =
cmStrCat("COMPILE_DEFINITIONS_", cmSystemTools::UpperCase(config));
- if (const char* config_compile_defs = source->GetProperty(defPropName)) {
+ if (cmProp config_compile_defs = source->GetProperty(defPropName)) {
this->LocalGenerator->AppendDefines(
defines,
- genexInterpreter.Evaluate(config_compile_defs, COMPILE_DEFINITIONS));
+ genexInterpreter.Evaluate(*config_compile_defs, COMPILE_DEFINITIONS));
}
std::string definesString = this->GetDefines(language, config);
@@ -287,9 +309,9 @@ std::string cmNinjaTargetGenerator::ComputeIncludes(
this->LocalGenerator, config, this->GeneratorTarget, language);
const std::string INCLUDE_DIRECTORIES("INCLUDE_DIRECTORIES");
- if (const char* cincludes = source->GetProperty(INCLUDE_DIRECTORIES)) {
+ if (cmProp cincludes = source->GetProperty(INCLUDE_DIRECTORIES)) {
this->LocalGenerator->AppendIncludeDirectories(
- includes, genexInterpreter.Evaluate(cincludes, INCLUDE_DIRECTORIES),
+ includes, genexInterpreter.Evaluate(*cincludes, INCLUDE_DIRECTORIES),
*source);
}
@@ -355,13 +377,12 @@ std::string cmNinjaTargetGenerator::GetObjectFilePath(
{
std::string path = this->LocalGenerator->GetHomeRelativeOutputPath();
if (!path.empty()) {
- path += "/";
+ path += '/';
}
std::string const& objectName = this->GeneratorTarget->GetObjectName(source);
- path += this->LocalGenerator->GetTargetDirectory(this->GeneratorTarget);
- path += this->GetGlobalGenerator()->ConfigDirectory(config);
- path += "/";
- path += objectName;
+ path += cmStrCat(
+ this->LocalGenerator->GetTargetDirectory(this->GeneratorTarget),
+ this->GetGlobalGenerator()->ConfigDirectory(config), '/', objectName);
return path;
}
@@ -389,16 +410,15 @@ std::string cmNinjaTargetGenerator::GetPreprocessedFilePath(
this->GetGlobalGenerator()->GetLanguageOutputExtension(*source);
assert(objName.size() >= objExt.size());
std::string const ppName =
- objName.substr(0, objName.size() - objExt.size()) + "-pp." + ppExt;
+ cmStrCat(objName.substr(0, objName.size() - objExt.size()), "-pp.", ppExt);
std::string path = this->LocalGenerator->GetHomeRelativeOutputPath();
if (!path.empty()) {
- path += "/";
+ path += '/';
}
- path += this->LocalGenerator->GetTargetDirectory(this->GeneratorTarget);
- path += this->GetGlobalGenerator()->ConfigDirectory(config);
- path += "/";
- path += ppName;
+ path +=
+ cmStrCat(this->LocalGenerator->GetTargetDirectory(this->GeneratorTarget),
+ this->GetGlobalGenerator()->ConfigDirectory(config), '/', ppName);
return path;
}
@@ -407,13 +427,11 @@ std::string cmNinjaTargetGenerator::GetDyndepFilePath(
{
std::string path = this->LocalGenerator->GetHomeRelativeOutputPath();
if (!path.empty()) {
- path += "/";
+ path += '/';
}
- path += this->LocalGenerator->GetTargetDirectory(this->GeneratorTarget);
- path += this->GetGlobalGenerator()->ConfigDirectory(config);
- path += "/";
- path += lang;
- path += ".dd";
+ path += cmStrCat(
+ this->LocalGenerator->GetTargetDirectory(this->GeneratorTarget),
+ this->GetGlobalGenerator()->ConfigDirectory(config), '/', lang, ".dd");
return path;
}
@@ -442,8 +460,7 @@ std::string cmNinjaTargetGenerator::GetTargetFilePath(
if (path.empty() || path == ".") {
return name;
}
- path += "/";
- path += name;
+ path += cmStrCat('/', name);
return path;
}
@@ -497,7 +514,7 @@ void cmNinjaTargetGenerator::WriteCompileRule(const std::string& lang,
cmRulePlaceholderExpander::RuleVariables vars;
vars.CMTargetName = this->GetGeneratorTarget()->GetName().c_str();
vars.CMTargetType =
- cmState::GetTargetTypeName(this->GetGeneratorTarget()->GetType());
+ cmState::GetTargetTypeName(this->GetGeneratorTarget()->GetType()).c_str();
vars.Language = lang.c_str();
vars.Source = "$in";
vars.Object = "$out";
@@ -522,7 +539,7 @@ void cmNinjaTargetGenerator::WriteCompileRule(const std::string& lang,
bool const lang_supports_response = lang != "RC";
if (lang_supports_response && this->ForceResponseFile()) {
std::string const responseFlagVar =
- "CMAKE_" + lang + "_RESPONSE_FILE_FLAG";
+ cmStrCat("CMAKE_", lang, "_RESPONSE_FILE_FLAG");
responseFlag = this->Makefile->GetSafeDefinition(responseFlagVar);
if (responseFlag.empty() && lang != "CUDA") {
responseFlag = "@";
@@ -587,7 +604,7 @@ void cmNinjaTargetGenerator::WriteCompileRule(const std::string& lang,
rule.RspFile = "$RSP_FILE";
rule.RspContent =
cmStrCat(' ', ppVars.Defines, ' ', ppVars.Includes, ' ', ppFlags);
- ppFlags = responseFlag + rule.RspFile;
+ ppFlags = cmStrCat(responseFlag, rule.RspFile);
ppVars.Defines = "";
ppVars.Includes = "";
}
@@ -658,7 +675,7 @@ void cmNinjaTargetGenerator::WriteCompileRule(const std::string& lang,
rule.RspFile = "$RSP_FILE";
rule.RspContent =
cmStrCat(' ', vars.Defines, ' ', vars.Includes, ' ', flags);
- flags = responseFlag + rule.RspFile;
+ flags = cmStrCat(responseFlag, rule.RspFile);
vars.Defines = "";
vars.Includes = "";
}
@@ -671,7 +688,7 @@ void cmNinjaTargetGenerator::WriteCompileRule(const std::string& lang,
rule.DepType = "msvc";
rule.DepFile.clear();
flags += " /showIncludes";
- } else if (mf->IsOn("CMAKE_NINJA_CMCLDEPS_" + lang)) {
+ } else if (mf->IsOn(cmStrCat("CMAKE_NINJA_CMCLDEPS_", lang))) {
// For the MS resource compiler we need cmcldeps, but skip dependencies
// for source-file try_compile cases because they are always fresh.
if (!mf->GetIsSourceFileTryCompile()) {
@@ -688,14 +705,14 @@ void cmNinjaTargetGenerator::WriteCompileRule(const std::string& lang,
} else {
rule.DepType = "gcc";
rule.DepFile = "$DEP_FILE";
- const std::string flagsName = "CMAKE_DEPFILE_FLAGS_" + lang;
+ const std::string flagsName = cmStrCat("CMAKE_DEPFILE_FLAGS_", lang);
std::string depfileFlags = mf->GetSafeDefinition(flagsName);
if (!depfileFlags.empty()) {
cmSystemTools::ReplaceString(depfileFlags, "<DEPFILE>", "$DEP_FILE");
cmSystemTools::ReplaceString(depfileFlags, "<OBJECT>", "$out");
cmSystemTools::ReplaceString(depfileFlags, "<CMAKE_C_COMPILER>",
mf->GetDefinition("CMAKE_C_COMPILER"));
- flags += " " + depfileFlags;
+ flags += cmStrCat(' ', depfileFlags);
}
}
@@ -718,7 +735,7 @@ void cmNinjaTargetGenerator::WriteCompileRule(const std::string& lang,
const std::string& compileCmd = mf->GetRequiredDefinition(cmdVar);
cmExpandList(compileCmd, compileCmds);
} else {
- const std::string cmdVar = "CMAKE_" + lang + "_COMPILE_OBJECT";
+ const std::string cmdVar = cmStrCat("CMAKE_", lang, "_COMPILE_OBJECT");
const std::string& compileCmd = mf->GetRequiredDefinition(cmdVar);
cmExpandList(compileCmd, compileCmds);
}
@@ -728,57 +745,59 @@ void cmNinjaTargetGenerator::WriteCompileRule(const std::string& lang,
if (!compileCmds.empty() &&
(lang == "C" || lang == "CXX" || lang == "Fortran" || lang == "CUDA" ||
lang == "OBJC" || lang == "OBJCXX")) {
- std::string const clauncher_prop = lang + "_COMPILER_LAUNCHER";
- const char* clauncher = this->GeneratorTarget->GetProperty(clauncher_prop);
- if (clauncher && *clauncher) {
- compilerLauncher = clauncher;
+ std::string const clauncher_prop = cmStrCat(lang, "_COMPILER_LAUNCHER");
+ cmProp clauncher = this->GeneratorTarget->GetProperty(clauncher_prop);
+ if (clauncher && !clauncher->empty()) {
+ compilerLauncher = *clauncher;
}
}
// Maybe insert an include-what-you-use runner.
if (!compileCmds.empty() && (lang == "C" || lang == "CXX")) {
- std::string const iwyu_prop = lang + "_INCLUDE_WHAT_YOU_USE";
- const char* iwyu = this->GeneratorTarget->GetProperty(iwyu_prop);
- std::string const tidy_prop = lang + "_CLANG_TIDY";
- const char* tidy = this->GeneratorTarget->GetProperty(tidy_prop);
- std::string const cpplint_prop = lang + "_CPPLINT";
- const char* cpplint = this->GeneratorTarget->GetProperty(cpplint_prop);
- std::string const cppcheck_prop = lang + "_CPPCHECK";
- const char* cppcheck = this->GeneratorTarget->GetProperty(cppcheck_prop);
- if ((iwyu && *iwyu) || (tidy && *tidy) || (cpplint && *cpplint) ||
- (cppcheck && *cppcheck)) {
+ std::string const iwyu_prop = cmStrCat(lang, "_INCLUDE_WHAT_YOU_USE");
+ cmProp iwyu = this->GeneratorTarget->GetProperty(iwyu_prop);
+ std::string const tidy_prop = cmStrCat(lang, "_CLANG_TIDY");
+ cmProp tidy = this->GeneratorTarget->GetProperty(tidy_prop);
+ std::string const cpplint_prop = cmStrCat(lang, "_CPPLINT");
+ cmProp cpplint = this->GeneratorTarget->GetProperty(cpplint_prop);
+ std::string const cppcheck_prop = cmStrCat(lang, "_CPPCHECK");
+ cmProp cppcheck = this->GeneratorTarget->GetProperty(cppcheck_prop);
+ if ((iwyu && !iwyu->empty()) || (tidy && !tidy->empty()) ||
+ (cpplint && !cpplint->empty()) || (cppcheck && !cppcheck->empty())) {
std::string run_iwyu = cmStrCat(cmakeCmd, " -E __run_co_compile");
if (!compilerLauncher.empty()) {
// In __run_co_compile case the launcher command is supplied
// via --launcher=<maybe-list> and consumed
- run_iwyu += " --launcher=";
- run_iwyu += this->LocalGenerator->EscapeForShell(compilerLauncher);
+ run_iwyu +=
+ cmStrCat(" --launcher=",
+ this->LocalGenerator->EscapeForShell(compilerLauncher));
compilerLauncher.clear();
}
- if (iwyu && *iwyu) {
- run_iwyu += " --iwyu=";
- run_iwyu += this->GetLocalGenerator()->EscapeForShell(iwyu);
+ if (iwyu && !iwyu->empty()) {
+ run_iwyu += cmStrCat(" --iwyu=",
+ this->GetLocalGenerator()->EscapeForShell(*iwyu));
}
- if (tidy && *tidy) {
+ if (tidy && !tidy->empty()) {
run_iwyu += " --tidy=";
const char* driverMode = this->Makefile->GetDefinition(
- "CMAKE_" + lang + "_CLANG_TIDY_DRIVER_MODE");
+ cmStrCat("CMAKE_", lang, "_CLANG_TIDY_DRIVER_MODE"));
if (!(driverMode && *driverMode)) {
driverMode = lang == "C" ? "gcc" : "g++";
}
run_iwyu += this->GetLocalGenerator()->EscapeForShell(
- cmStrCat(tidy, ";--extra-arg-before=--driver-mode=", driverMode));
+ cmStrCat(*tidy, ";--extra-arg-before=--driver-mode=", driverMode));
}
- if (cpplint && *cpplint) {
- run_iwyu += " --cpplint=";
- run_iwyu += this->GetLocalGenerator()->EscapeForShell(cpplint);
+ if (cpplint && !cpplint->empty()) {
+ run_iwyu += cmStrCat(
+ " --cpplint=", this->GetLocalGenerator()->EscapeForShell(*cpplint));
}
- if (cppcheck && *cppcheck) {
- run_iwyu += " --cppcheck=";
- run_iwyu += this->GetLocalGenerator()->EscapeForShell(cppcheck);
+ if (cppcheck && !cppcheck->empty()) {
+ run_iwyu +=
+ cmStrCat(" --cppcheck=",
+ this->GetLocalGenerator()->EscapeForShell(*cppcheck));
}
- if ((tidy && *tidy) || (cpplint && *cpplint) ||
- (cppcheck && *cppcheck)) {
+ if ((tidy && !tidy->empty()) || (cpplint && !cpplint->empty()) ||
+ (cppcheck && !cppcheck->empty())) {
run_iwyu += " --source=$in";
}
run_iwyu += " -- ";
@@ -797,7 +816,7 @@ void cmNinjaTargetGenerator::WriteCompileRule(const std::string& lang,
i = this->LocalGenerator->EscapeForShell(i);
}
}
- compileCmds.front().insert(0, cmJoin(args, " ") + " ");
+ compileCmds.front().insert(0, cmStrCat(cmJoin(args, " "), ' '));
}
if (!compileCmds.empty()) {
@@ -872,7 +891,8 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatements(
{
cmNinjaBuild build("phony");
- build.Comment = "Order-only phony target for " + this->GetTargetName();
+ build.Comment =
+ cmStrCat("Order-only phony target for ", this->GetTargetName());
build.Outputs.push_back(this->OrderDependsTargetForTarget(config));
cmNinjaDeps& orderOnlyDeps = build.OrderOnlyDeps;
@@ -957,12 +977,12 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatements(
"output-file-map.json");
std::string const targetSwiftDepsPath = [this, config]() -> std::string {
cmGeneratorTarget const* target = this->GeneratorTarget;
- if (const char* name = target->GetProperty("Swift_DEPENDENCIES_FILE")) {
- return name;
+ if (cmProp name = target->GetProperty("Swift_DEPENDENCIES_FILE")) {
+ return *name;
}
- return this->ConvertToNinjaPath(target->GetSupportDirectory() + "/" +
- config + "/" + target->GetName() +
- ".swiftdeps");
+ return this->ConvertToNinjaPath(
+ cmStrCat(target->GetSupportDirectory(), '/', config, '/',
+ target->GetName(), ".swiftdeps"));
}();
// build the global target dependencies
@@ -994,7 +1014,7 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatement(
std::string cmakeVarLang = cmStrCat("CMAKE_", language);
// build response file name
- std::string cmakeLinkVar = cmakeVarLang + "_RESPONSE_FILE_FLAG";
+ std::string cmakeLinkVar = cmStrCat(cmakeVarLang, "_RESPONSE_FILE_FLAG");
const char* flag = GetMakefile()->GetDefinition(cmakeLinkVar);
@@ -1019,14 +1039,15 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatement(
if (!replaceExt) {
// use original code
vars["DEP_FILE"] = this->GetLocalGenerator()->ConvertToOutputFormat(
- objectFileName + ".d", cmOutputConverter::SHELL);
+ cmStrCat(objectFileName, ".d"), cmOutputConverter::SHELL);
} else {
// Replace the original source file extension with the
// depend file extension.
- std::string dependFileName =
- cmSystemTools::GetFilenameWithoutLastExtension(objectFileName) + ".d";
+ std::string dependFileName = cmStrCat(
+ cmSystemTools::GetFilenameWithoutLastExtension(objectFileName), ".d");
vars["DEP_FILE"] = this->GetLocalGenerator()->ConvertToOutputFormat(
- objectFileDir + "/" + dependFileName, cmOutputConverter::SHELL);
+ cmStrCat(objectFileDir, '/', dependFileName),
+ cmOutputConverter::SHELL);
}
}
@@ -1049,17 +1070,35 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatement(
// Add precompile headers dependencies
std::vector<std::string> depList;
- const std::string pchSource =
- this->GeneratorTarget->GetPchSource(config, language);
- if (!pchSource.empty() && !source->GetProperty("SKIP_PRECOMPILE_HEADERS")) {
- depList.push_back(this->GeneratorTarget->GetPchHeader(config, language));
- if (source->GetFullPath() != pchSource) {
- depList.push_back(this->GeneratorTarget->GetPchFile(config, language));
+ std::vector<std::string> architectures;
+ this->GeneratorTarget->GetAppleArchs(config, architectures);
+ if (architectures.empty()) {
+ architectures.emplace_back();
+ }
+
+ std::unordered_set<std::string> pchSources;
+ for (const std::string& arch : architectures) {
+ const std::string pchSource =
+ this->GeneratorTarget->GetPchSource(config, language, arch);
+
+ if (!pchSource.empty()) {
+ pchSources.insert(pchSource);
}
}
- if (const char* objectDeps = source->GetProperty("OBJECT_DEPENDS")) {
- std::vector<std::string> objDepList = cmExpandedList(objectDeps);
+ if (!pchSources.empty() && !source->GetProperty("SKIP_PRECOMPILE_HEADERS")) {
+ for (const std::string& arch : architectures) {
+ depList.push_back(
+ this->GeneratorTarget->GetPchHeader(config, language, arch));
+ if (pchSources.find(source->GetFullPath()) == pchSources.end()) {
+ depList.push_back(
+ this->GeneratorTarget->GetPchFile(config, language, arch));
+ }
+ }
+ }
+
+ if (cmProp objectDeps = source->GetProperty("OBJECT_DEPENDS")) {
+ std::vector<std::string> objDepList = cmExpandedList(*objectDeps);
std::copy(objDepList.begin(), objDepList.end(),
std::back_inserter(depList));
}
@@ -1101,7 +1140,7 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatement(
this->ConvertToNinjaPath(this->GetPreprocessedFilePath(source, config));
ppBuild.Outputs.push_back(ppFileName);
- ppBuild.RspFile = ppFileName + ".rsp";
+ ppBuild.RspFile = cmStrCat(ppFileName, ".rsp");
bool const compilePP = this->UsePreprocessedSource(language);
bool const compilePPWithDefines =
@@ -1130,7 +1169,7 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatement(
// In case compilation requires flags that are incompatible with
// preprocessing, include them here.
std::string const& postFlag = this->Makefile->GetSafeDefinition(
- "CMAKE_" + language + "_POSTPROCESS_FLAG");
+ cmStrCat("CMAKE_", language, "_POSTPROCESS_FLAG"));
this->LocalGenerator->AppendFlags(vars["FLAGS"], postFlag);
}
@@ -1158,13 +1197,13 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatement(
sourceDirectory, this->GeneratorTarget, language, false, false,
config);
- vars["INCLUDES"] = sourceDirectoryFlag + " " + vars["INCLUDES"];
+ vars["INCLUDES"] = cmStrCat(sourceDirectoryFlag, ' ', vars["INCLUDES"]);
}
// Explicit preprocessing always uses a depfile.
ppBuild.Variables["DEP_FILE"] =
this->GetLocalGenerator()->ConvertToOutputFormat(
- objectFileName + ".pp.d", cmOutputConverter::SHELL);
+ cmStrCat(objectFileName, ".pp.d"), cmOutputConverter::SHELL);
if (compilePP) {
// The actual compilation does not need a depfile because it
// depends on the already-preprocessed source.
@@ -1177,7 +1216,7 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatement(
ppBuild.Variables["OBJ_FILE"] = objectFileName;
// Tell dependency scanner where to store dyndep intermediate results.
- std::string const ddiFile = objectFileName + ".ddi";
+ std::string const ddiFile = cmStrCat(objectFileName, ".ddi");
ppBuild.Variables["DYNDEP_INTERMEDIATE_FILE"] = ddiFile;
ppBuild.ImplicitOuts.push_back(ddiFile);
if (firstForConfig) {
@@ -1207,8 +1246,9 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatement(
this->addPoolNinjaVariable("JOB_POOL_COMPILE", this->GetGeneratorTarget(),
vars);
- if (!pchSource.empty() && !source->GetProperty("SKIP_PRECOMPILE_HEADERS")) {
- if (source->GetFullPath() == pchSource) {
+ if (!pchSources.empty() && !source->GetProperty("SKIP_PRECOMPILE_HEADERS")) {
+ auto pchIt = pchSources.find(source->GetFullPath());
+ if (pchIt != pchSources.end()) {
this->addPoolNinjaVariable("JOB_POOL_PRECOMPILE_HEADER",
this->GetGeneratorTarget(), vars);
}
@@ -1216,7 +1256,7 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatement(
this->SetMsvcTargetPdbVariable(vars, config);
- objBuild.RspFile = objectFileName + ".rsp";
+ objBuild.RspFile = cmStrCat(objectFileName, ".rsp");
if (language == "Swift") {
this->EmitSwiftDependencyInfo(source, config);
@@ -1225,15 +1265,20 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatement(
objBuild, commandLineLengthLimit);
}
- if (const char* objectOutputs = source->GetProperty("OBJECT_OUTPUTS")) {
- cmNinjaBuild build("phony");
- build.Comment = "Additional output files.";
- build.Outputs = cmExpandedList(objectOutputs);
- std::transform(build.Outputs.begin(), build.Outputs.end(),
- build.Outputs.begin(), MapToNinjaPath());
- build.ExplicitDeps = objBuild.Outputs;
- this->GetGlobalGenerator()->WriteBuild(this->GetImplFileStream(fileConfig),
- build);
+ if (cmProp objectOutputs = source->GetProperty("OBJECT_OUTPUTS")) {
+ std::string evaluatedObjectOutputs = cmGeneratorExpression::Evaluate(
+ *objectOutputs, this->LocalGenerator, config);
+
+ if (!evaluatedObjectOutputs.empty()) {
+ cmNinjaBuild build("phony");
+ build.Comment = "Additional output files.";
+ build.Outputs = cmExpandedList(evaluatedObjectOutputs);
+ std::transform(build.Outputs.begin(), build.Outputs.end(),
+ build.Outputs.begin(), MapToNinjaPath());
+ build.ExplicitDeps = objBuild.Outputs;
+ this->GetGlobalGenerator()->WriteBuild(
+ this->GetImplFileStream(fileConfig), build);
+ }
}
}
@@ -1242,8 +1287,8 @@ void cmNinjaTargetGenerator::WriteTargetDependInfo(std::string const& lang,
{
Json::Value tdi(Json::objectValue);
tdi["language"] = lang;
- tdi["compiler-id"] =
- this->Makefile->GetSafeDefinition("CMAKE_" + lang + "_COMPILER_ID");
+ tdi["compiler-id"] = this->Makefile->GetSafeDefinition(
+ cmStrCat("CMAKE_", lang, "_COMPILER_ID"));
if (lang == "Fortran") {
std::string mod_dir = this->GeneratorTarget->GetFortranModuleDirectory(
@@ -1292,16 +1337,16 @@ void cmNinjaTargetGenerator::EmitSwiftDependencyInfo(
std::string const objectFilePath =
this->ConvertToNinjaPath(this->GetObjectFilePath(source, config));
std::string const swiftDepsPath = [source, objectFilePath]() -> std::string {
- if (const char* name = source->GetProperty("Swift_DEPENDENCIES_FILE")) {
- return name;
+ if (cmProp name = source->GetProperty("Swift_DEPENDENCIES_FILE")) {
+ return *name;
}
- return objectFilePath + ".swiftdeps";
+ return cmStrCat(objectFilePath, ".swiftdeps");
}();
std::string const swiftDiaPath = [source, objectFilePath]() -> std::string {
- if (const char* name = source->GetProperty("Swift_DIAGNOSTICS_FILE")) {
- return name;
+ if (cmProp name = source->GetProperty("Swift_DIAGNOSTICS_FILE")) {
+ return *name;
}
- return objectFilePath + ".dia";
+ return cmStrCat(objectFilePath, ".dia");
}();
std::string const makeDepsPath = [this, source, config]() -> std::string {
cmLocalNinjaGenerator const* local = this->GetLocalGenerator();
@@ -1311,12 +1356,13 @@ void cmNinjaTargetGenerator::EmitSwiftDependencyInfo(
cmSystemTools::GetFilenamePath(objectFileName);
if (this->Makefile->IsOn("CMAKE_Swift_DEPFLE_EXTNSION_REPLACE")) {
- std::string dependFileName =
- cmSystemTools::GetFilenameWithoutLastExtension(objectFileName) + ".d";
- return local->ConvertToOutputFormat(objectFileDir + "/" + dependFileName,
- cmOutputConverter::SHELL);
+ std::string dependFileName = cmStrCat(
+ cmSystemTools::GetFilenameWithoutLastExtension(objectFileName), ".d");
+ return local->ConvertToOutputFormat(
+ cmStrCat(objectFileDir, '/', dependFileName),
+ cmOutputConverter::SHELL);
}
- return local->ConvertToOutputFormat(objectFileName + ".d",
+ return local->ConvertToOutputFormat(cmStrCat(objectFileName, ".d"),
cmOutputConverter::SHELL);
}();
@@ -1381,7 +1427,7 @@ void cmNinjaTargetGenerator::ExportObjectCompileCommand(
this->GetMakefile()->GetRequiredDefinition(cmdVar);
cmExpandList(compileCmd, compileCmds);
} else {
- const std::string cmdVar = "CMAKE_" + language + "_COMPILE_OBJECT";
+ const std::string cmdVar = cmStrCat("CMAKE_", language, "_COMPILE_OBJECT");
const std::string& compileCmd =
this->GetMakefile()->GetRequiredDefinition(cmdVar);
cmExpandList(compileCmd, compileCmds);
@@ -1404,11 +1450,11 @@ void cmNinjaTargetGenerator::ExportObjectCompileCommand(
void cmNinjaTargetGenerator::AdditionalCleanFiles(const std::string& config)
{
- if (const char* prop_value =
+ if (cmProp prop_value =
this->GeneratorTarget->GetProperty("ADDITIONAL_CLEAN_FILES")) {
cmLocalNinjaGenerator* lg = this->LocalGenerator;
std::vector<std::string> cleanFiles;
- cmExpandList(cmGeneratorExpression::Evaluate(prop_value, lg, config,
+ cmExpandList(cmGeneratorExpression::Evaluate(*prop_value, lg, config,
this->GeneratorTarget),
cleanFiles);
std::string const& binaryDir = lg->GetCurrentBinaryDirectory();
@@ -1494,9 +1540,9 @@ void cmNinjaTargetGenerator::addPoolNinjaVariable(
const std::string& pool_property, cmGeneratorTarget* target,
cmNinjaVars& vars)
{
- const char* pool = target->GetProperty(pool_property);
+ cmProp pool = target->GetProperty(pool_property);
if (pool) {
- vars["pool"] = pool;
+ vars["pool"] = *pool;
}
}
diff --git a/Source/cmNinjaTargetGenerator.h b/Source/cmNinjaTargetGenerator.h
index 8678dc3..1ac5683 100644
--- a/Source/cmNinjaTargetGenerator.h
+++ b/Source/cmNinjaTargetGenerator.h
@@ -12,7 +12,7 @@
#include <utility>
#include <vector>
-#include "cm_jsoncpp_value.h"
+#include <cm3p/json/value.h>
#include "cmCommonTargetGenerator.h"
#include "cmGlobalNinjaGenerator.h"
diff --git a/Source/cmNinjaUtilityTargetGenerator.cxx b/Source/cmNinjaUtilityTargetGenerator.cxx
index a42d65d..134924e 100644
--- a/Source/cmNinjaUtilityTargetGenerator.cxx
+++ b/Source/cmNinjaUtilityTargetGenerator.cxx
@@ -110,9 +110,9 @@ void cmNinjaUtilityTargetGenerator::Generate(const std::string& config)
std::string command =
lg->BuildCommandLine(commands, "utility", this->GeneratorTarget);
std::string desc;
- const char* echoStr = genTarget->GetProperty("EchoString");
+ cmProp echoStr = genTarget->GetProperty("EchoString");
if (echoStr) {
- desc = echoStr;
+ desc = *echoStr;
} else {
desc = "Running utility command for " + this->GetTargetName();
}
diff --git a/Source/cmOSXBundleGenerator.cxx b/Source/cmOSXBundleGenerator.cxx
index 382b563..7eea4b2 100644
--- a/Source/cmOSXBundleGenerator.cxx
+++ b/Source/cmOSXBundleGenerator.cxx
@@ -56,9 +56,9 @@ void cmOSXBundleGenerator::CreateAppBundle(const std::string& targetName,
outpath = out;
}
-void cmOSXBundleGenerator::CreateFramework(const std::string& targetName,
- const std::string& outpath,
- const std::string& config)
+void cmOSXBundleGenerator::CreateFramework(
+ const std::string& targetName, const std::string& outpath,
+ const std::string& config, const cmOSXBundleGenerator::SkipParts& skipParts)
{
if (this->MustSkip()) {
return;
@@ -77,16 +77,18 @@ void cmOSXBundleGenerator::CreateFramework(const std::string& targetName,
std::string frameworkVersion = this->GT->GetFrameworkVersion();
- // Configure the Info.plist file
- std::string plist = newoutpath;
- if (!this->Makefile->PlatformIsAppleEmbedded()) {
- // Put the Info.plist file into the Resources directory.
- this->MacContentFolders->insert("Resources");
- plist += "/Resources";
- }
- plist += "/Info.plist";
std::string name = cmSystemTools::GetFilenameName(targetName);
- this->LocalGenerator->GenerateFrameworkInfoPList(this->GT, name, plist);
+ if (!skipParts.infoPlist) {
+ // Configure the Info.plist file
+ std::string plist = newoutpath;
+ if (!this->Makefile->PlatformIsAppleEmbedded()) {
+ // Put the Info.plist file into the Resources directory.
+ this->MacContentFolders->insert("Resources");
+ plist += "/Resources";
+ }
+ plist += "/Info.plist";
+ this->LocalGenerator->GenerateFrameworkInfoPList(this->GT, name, plist);
+ }
// Generate Versions directory only for MacOSX frameworks
if (this->Makefile->PlatformIsAppleEmbedded()) {
diff --git a/Source/cmOSXBundleGenerator.h b/Source/cmOSXBundleGenerator.h
index 232be48..5bf1d98 100644
--- a/Source/cmOSXBundleGenerator.h
+++ b/Source/cmOSXBundleGenerator.h
@@ -19,6 +19,15 @@ class cmOSXBundleGenerator
public:
cmOSXBundleGenerator(cmGeneratorTarget* target);
+ struct SkipParts
+ {
+ SkipParts()
+ : infoPlist(false)
+ {
+ }
+ bool infoPlist; // NOLINT(modernize-use-default-member-init)
+ };
+
// create an app bundle at a given root, and return
// the directory within the bundle that contains the executable
void CreateAppBundle(const std::string& targetName, std::string& root,
@@ -26,7 +35,8 @@ public:
// create a framework at a given root
void CreateFramework(const std::string& targetName, const std::string& root,
- const std::string& config);
+ const std::string& config,
+ const SkipParts& skipParts = SkipParts());
// create a cf bundle at a given root
void CreateCFBundle(const std::string& targetName, const std::string& root,
diff --git a/Source/cmOptionCommand.cxx b/Source/cmOptionCommand.cxx
index 22e59ac..a9adf99 100644
--- a/Source/cmOptionCommand.cxx
+++ b/Source/cmOptionCommand.cxx
@@ -52,7 +52,7 @@ bool cmOptionCommand(std::vector<std::string> const& args,
// See if a cache variable with this name already exists
// If so just make sure the doc state is correct
cmState* state = status.GetMakefile().GetState();
- const char* existingValue = state->GetCacheEntryValue(args[0]);
+ cmProp existingValue = state->GetCacheEntryValue(args[0]);
if (existingValue &&
(state->GetCacheEntryType(args[0]) != cmStateEnums::UNINITIALIZED)) {
state->SetCacheEntryProperty(args[0], "HELPSTRING", args[1]);
@@ -60,7 +60,7 @@ bool cmOptionCommand(std::vector<std::string> const& args,
}
// Nothing in the cache so add it
- std::string initialValue = existingValue ? existingValue : "Off";
+ std::string initialValue = existingValue ? *existingValue : "Off";
if (args.size() == 3) {
initialValue = args[2];
}
diff --git a/Source/cmOutputConverter.cxx b/Source/cmOutputConverter.cxx
index 1c6fad1..dc324cc 100644
--- a/Source/cmOutputConverter.cxx
+++ b/Source/cmOutputConverter.cxx
@@ -26,7 +26,7 @@ std::string cmOutputConverter::ConvertToOutputForExisting(
// already exists, we can use a short-path to reference it without a
// space.
if (this->GetState()->UseWindowsShell() &&
- remote.find(' ') != std::string::npos &&
+ remote.find_first_of(" #") != std::string::npos &&
cmSystemTools::FileExists(remote)) {
std::string tmp;
if (cmSystemTools::GetShortPath(remote, tmp)) {
@@ -170,15 +170,6 @@ cmOutputConverter::FortranFormat cmOutputConverter::GetFortranFormat(
return format;
}
-cmOutputConverter::FortranFormat cmOutputConverter::GetFortranFormat(
- const char* value)
-{
- if (!value) {
- return FortranFormatNone;
- }
- return GetFortranFormat(cm::string_view(value));
-}
-
void cmOutputConverter::SetLinkScriptShell(bool linkScriptShell)
{
this->LinkScriptShell = linkScriptShell;
diff --git a/Source/cmOutputConverter.h b/Source/cmOutputConverter.h
index 6583ab5..28582df 100644
--- a/Source/cmOutputConverter.h
+++ b/Source/cmOutputConverter.h
@@ -94,7 +94,6 @@ public:
FortranFormatFree
};
static FortranFormat GetFortranFormat(cm::string_view value);
- static FortranFormat GetFortranFormat(const char* value);
private:
cmState* GetState() const;
diff --git a/Source/cmOutputRequiredFilesCommand.cxx b/Source/cmOutputRequiredFilesCommand.cxx
index 147f97f..b18c205 100644
--- a/Source/cmOutputRequiredFilesCommand.cxx
+++ b/Source/cmOutputRequiredFilesCommand.cxx
@@ -20,6 +20,8 @@
#include "cmSystemTools.h"
#include "cmTarget.h"
+using cmProp = const std::string*;
+
namespace {
/** \class cmDependInformation
* \brief Store dependency information for a single source file.
@@ -117,14 +119,13 @@ public:
std::set<std::string> uniqueIncludes;
std::vector<std::string> orderedAndUniqueIncludes;
for (auto const& target : this->Makefile->GetTargets()) {
- const char* incDirProp =
- target.second.GetProperty("INCLUDE_DIRECTORIES");
+ cmProp incDirProp = target.second.GetProperty("INCLUDE_DIRECTORIES");
if (!incDirProp) {
continue;
}
std::string incDirs = cmGeneratorExpression::Preprocess(
- incDirProp, cmGeneratorExpression::StripAllGeneratorExpressions);
+ *incDirProp, cmGeneratorExpression::StripAllGeneratorExpressions);
std::vector<std::string> includes = cmExpandedList(incDirs);
diff --git a/Source/cmPipeConnection.h b/Source/cmPipeConnection.h
index 81f8a49..1215716 100644
--- a/Source/cmPipeConnection.h
+++ b/Source/cmPipeConnection.h
@@ -6,7 +6,7 @@
#include <string>
-#include "cm_uv.h"
+#include <cm3p/uv.h>
#include "cmConnection.h"
#include "cmUVHandlePtr.h"
diff --git a/Source/cmPolicies.cxx b/Source/cmPolicies.cxx
index 5c8bc98..dea3f8a 100644
--- a/Source/cmPolicies.cxx
+++ b/Source/cmPolicies.cxx
@@ -72,6 +72,7 @@ static const char* idToVersion(cmPolicies::PolicyID id)
#define POLICY_CASE(ID, V_MAJOR, V_MINOR, V_PATCH) \
case cmPolicies::ID: \
return #V_MAJOR "." #V_MINOR "." #V_PATCH;
+ // NOLINTNEXTLINE(bugprone-branch-clone)
CM_FOR_EACH_POLICY_ID_VERSION(POLICY_CASE)
#undef POLICY_CASE
case cmPolicies::CMPCOUNT:
@@ -90,6 +91,7 @@ static bool isPolicyNewerThan(cmPolicies::PolicyID id, unsigned int majorV,
(majorV == (V_MAJOR) && minorV + 1 < (V_MINOR) + 1) || \
(majorV == (V_MAJOR) && minorV == (V_MINOR) && \
patchV + 1 < (V_PATCH) + 1));
+ // NOLINTNEXTLINE(bugprone-branch-clone)
CM_FOR_EACH_POLICY_ID_VERSION(POLICY_CASE)
#undef POLICY_CASE
case cmPolicies::CMPCOUNT:
diff --git a/Source/cmPolicies.h b/Source/cmPolicies.h
index 1366ff0..4abfa1f 100644
--- a/Source/cmPolicies.h
+++ b/Source/cmPolicies.h
@@ -305,7 +305,18 @@ class cmMakefile;
17, 0, cmPolicies::WARN) \
SELECT(POLICY, CMP0102, \
"mark_as_advanced() does nothing if a cache entry does not exist.", \
- 3, 17, 0, cmPolicies::WARN)
+ 3, 17, 0, cmPolicies::WARN) \
+ SELECT(POLICY, CMP0103, \
+ "Multiple export() with same FILE without APPEND is not allowed.", \
+ 3, 18, 0, cmPolicies::WARN) \
+ SELECT(POLICY, CMP0104, \
+ "CMAKE_CUDA_ARCHITECTURES now detected for NVCC, empty " \
+ "CUDA_ARCHITECTURES not allowed.", \
+ 3, 18, 0, cmPolicies::WARN) \
+ SELECT(POLICY, CMP0105, "Device link step uses the link options.", 3, 18, \
+ 0, cmPolicies::WARN) \
+ SELECT(POLICY, CMP0106, "The Documentation module is removed.", 3, 18, 0, \
+ cmPolicies::WARN)
#define CM_SELECT_ID(F, A1, A2, A3, A4, A5, A6) F(A1)
#define CM_FOR_EACH_POLICY_ID(POLICY) \
@@ -335,7 +346,9 @@ class cmMakefile;
F(CMP0081) \
F(CMP0083) \
F(CMP0095) \
- F(CMP0099)
+ F(CMP0099) \
+ F(CMP0104) \
+ F(CMP0105)
/** \class cmPolicies
* \brief Handles changes in CMake behavior and policies
diff --git a/Source/cmProcessOutput.cxx b/Source/cmProcessOutput.cxx
index e80ea5c..0fb4ff7 100644
--- a/Source/cmProcessOutput.cxx
+++ b/Source/cmProcessOutput.cxx
@@ -4,7 +4,10 @@
#include "cmProcessOutput.h"
#if defined(_WIN32)
+# include <cm/memory>
+
# include <windows.h>
+
unsigned int cmProcessOutput::defaultCodepage =
KWSYS_ENCODING_DEFAULT_CODEPAGE;
#endif
@@ -143,9 +146,9 @@ bool cmProcessOutput::DoDecodeText(std::string raw, std::string& decoded,
bool success = false;
const int wlength =
MultiByteToWideChar(codepage, 0, raw.c_str(), int(raw.size()), NULL, 0);
- wchar_t* wdata = new wchar_t[wlength];
- int r = MultiByteToWideChar(codepage, 0, raw.c_str(), int(raw.size()), wdata,
- wlength);
+ auto wdata = cm::make_unique<wchar_t[]>(wlength);
+ int r = MultiByteToWideChar(codepage, 0, raw.c_str(), int(raw.size()),
+ wdata.get(), wlength);
if (r > 0) {
if (lastChar) {
*lastChar = 0;
@@ -154,18 +157,16 @@ bool cmProcessOutput::DoDecodeText(std::string raw, std::string& decoded,
*lastChar = wdata[wlength - 1];
}
}
- int length = WideCharToMultiByte(defaultCodepage, 0, wdata, wlength, NULL,
- 0, NULL, NULL);
- char* data = new char[length];
- r = WideCharToMultiByte(defaultCodepage, 0, wdata, wlength, data, length,
- NULL, NULL);
+ int length = WideCharToMultiByte(defaultCodepage, 0, wdata.get(), wlength,
+ NULL, 0, NULL, NULL);
+ auto data = cm::make_unique<char[]>(length);
+ r = WideCharToMultiByte(defaultCodepage, 0, wdata.get(), wlength,
+ data.get(), length, NULL, NULL);
if (r > 0) {
- decoded = std::string(data, length);
+ decoded = std::string(data.get(), length);
success = true;
}
- delete[] data;
}
- delete[] wdata;
return success;
}
#endif
diff --git a/Source/cmProjectCommand.cxx b/Source/cmProjectCommand.cxx
index a25fd42..2ec66d9 100644
--- a/Source/cmProjectCommand.cxx
+++ b/Source/cmProjectCommand.cxx
@@ -47,10 +47,10 @@ bool cmProjectCommand(std::vector<std::string> const& args,
mf.SetProjectName(projectName);
mf.AddCacheDefinition(projectName + "_BINARY_DIR",
- mf.GetCurrentBinaryDirectory().c_str(),
+ mf.GetCurrentBinaryDirectory(),
"Value Computed by CMake", cmStateEnums::STATIC);
mf.AddCacheDefinition(projectName + "_SOURCE_DIR",
- mf.GetCurrentSourceDirectory().c_str(),
+ mf.GetCurrentSourceDirectory(),
"Value Computed by CMake", cmStateEnums::STATIC);
mf.AddDefinition("PROJECT_BINARY_DIR", mf.GetCurrentBinaryDirectory());
@@ -66,7 +66,7 @@ bool cmProjectCommand(std::vector<std::string> const& args,
// will work.
if (!mf.GetDefinition("CMAKE_PROJECT_NAME") || mf.IsRootMakefile()) {
mf.AddDefinition("CMAKE_PROJECT_NAME", projectName);
- mf.AddCacheDefinition("CMAKE_PROJECT_NAME", projectName.c_str(),
+ mf.AddCacheDefinition("CMAKE_PROJECT_NAME", projectName,
"Value Computed by CMake", cmStateEnums::STATIC);
}
@@ -379,7 +379,7 @@ static void TopLevelCMakeVarCondSet(cmMakefile& mf, std::string const& name,
// CMakeLists.txt file, then go with the last one.
if (!mf.GetDefinition(name) || mf.IsRootMakefile()) {
mf.AddDefinition(name, value);
- mf.AddCacheDefinition(name, value.c_str(), "Value Computed by CMake",
+ mf.AddCacheDefinition(name, value, "Value Computed by CMake",
cmStateEnums::STATIC);
}
}
diff --git a/Source/cmPropertyDefinition.cxx b/Source/cmPropertyDefinition.cxx
index 6a3174c..1796bb8 100644
--- a/Source/cmPropertyDefinition.cxx
+++ b/Source/cmPropertyDefinition.cxx
@@ -2,19 +2,38 @@
file Copyright.txt or https://cmake.org/licensing for details. */
#include "cmPropertyDefinition.h"
-void cmPropertyDefinition::DefineProperty(const std::string& name,
- cmProperty::ScopeType scope,
- const char* shortDescription,
- const char* fullDescription,
- bool chain)
+#include <tuple>
+
+cmPropertyDefinition::cmPropertyDefinition(std::string shortDescription,
+ std::string fullDescription,
+ bool chained)
+ : ShortDescription(std::move(shortDescription))
+ , FullDescription(std::move(fullDescription))
+ , Chained(chained)
+{
+}
+
+void cmPropertyDefinitionMap::DefineProperty(
+ const std::string& name, cmProperty::ScopeType scope,
+ const std::string& ShortDescription, const std::string& FullDescription,
+ bool chain)
{
- this->Name = name;
- this->Scope = scope;
- this->Chained = chain;
- if (shortDescription) {
- this->ShortDescription = shortDescription;
+ auto it = this->Map_.find(key_type(name, scope));
+ if (it == this->Map_.end()) {
+ // try_emplace() since C++17
+ this->Map_.emplace(
+ std::piecewise_construct, std::forward_as_tuple(name, scope),
+ std::forward_as_tuple(ShortDescription, FullDescription, chain));
}
- if (fullDescription) {
- this->FullDescription = fullDescription;
+}
+
+cmPropertyDefinition const* cmPropertyDefinitionMap::GetPropertyDefinition(
+ const std::string& name, cmProperty::ScopeType scope) const
+{
+ auto it = this->Map_.find(key_type(name, scope));
+ if (it != this->Map_.end()) {
+ return &it->second;
}
+
+ return nullptr;
}
diff --git a/Source/cmPropertyDefinition.h b/Source/cmPropertyDefinition.h
index 0d68c32..f83bc4f 100644
--- a/Source/cmPropertyDefinition.h
+++ b/Source/cmPropertyDefinition.h
@@ -5,7 +5,9 @@
#include "cmConfigure.h" // IWYU pragma: keep
+#include <map>
#include <string>
+#include <utility>
#include "cmProperty.h"
@@ -13,28 +15,19 @@
* \brief Property meta-information
*
* This class contains the following meta-information about property:
- * - Name;
* - Various documentation strings;
- * - The scope of the property;
* - If the property is chained.
*/
class cmPropertyDefinition
{
public:
- /// Define this property
- void DefineProperty(const std::string& name, cmProperty::ScopeType scope,
- const char* ShortDescription,
- const char* FullDescription, bool chained);
-
- /// Default constructor
- cmPropertyDefinition() { this->Chained = false; }
+ /// Constructor
+ cmPropertyDefinition(std::string shortDescription,
+ std::string fullDescription, bool chained);
/// Is the property chained?
bool IsChained() const { return this->Chained; }
- /// Get the scope
- cmProperty::ScopeType GetScope() const { return this->Scope; }
-
/// Get the documentation (short version)
const std::string& GetShortDescription() const
{
@@ -47,12 +40,30 @@ public:
return this->FullDescription;
}
-protected:
- std::string Name;
+private:
std::string ShortDescription;
std::string FullDescription;
- cmProperty::ScopeType Scope;
bool Chained;
};
+/** \class cmPropertyDefinitionMap
+ * \brief Map property name and scope to their definition
+ */
+class cmPropertyDefinitionMap
+{
+public:
+ // define the property
+ void DefineProperty(const std::string& name, cmProperty::ScopeType scope,
+ const std::string& ShortDescription,
+ const std::string& FullDescription, bool chain);
+
+ // get the property definition if present, otherwise nullptr
+ cmPropertyDefinition const* GetPropertyDefinition(
+ const std::string& name, cmProperty::ScopeType scope) const;
+
+private:
+ using key_type = std::pair<std::string, cmProperty::ScopeType>;
+ std::map<key_type, cmPropertyDefinition> Map_;
+};
+
#endif
diff --git a/Source/cmPropertyDefinitionMap.cxx b/Source/cmPropertyDefinitionMap.cxx
deleted file mode 100644
index f752ed7..0000000
--- a/Source/cmPropertyDefinitionMap.cxx
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
- file Copyright.txt or https://cmake.org/licensing for details. */
-#include "cmPropertyDefinitionMap.h"
-
-#include <utility>
-
-void cmPropertyDefinitionMap::DefineProperty(const std::string& name,
- cmProperty::ScopeType scope,
- const char* ShortDescription,
- const char* FullDescription,
- bool chain)
-{
- auto it = this->find(name);
- cmPropertyDefinition* prop;
- if (it == this->end()) {
- prop = &(*this)[name];
- prop->DefineProperty(name, scope, ShortDescription, FullDescription,
- chain);
- }
-}
-
-bool cmPropertyDefinitionMap::IsPropertyDefined(const std::string& name) const
-{
- return this->find(name) != this->end();
-}
-
-bool cmPropertyDefinitionMap::IsPropertyChained(const std::string& name) const
-{
- auto it = this->find(name);
- if (it == this->end()) {
- return false;
- }
-
- return it->second.IsChained();
-}
diff --git a/Source/cmPropertyDefinitionMap.h b/Source/cmPropertyDefinitionMap.h
deleted file mode 100644
index 8ec7910..0000000
--- a/Source/cmPropertyDefinitionMap.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
- file Copyright.txt or https://cmake.org/licensing for details. */
-#ifndef cmPropertyDefinitionMap_h
-#define cmPropertyDefinitionMap_h
-
-#include "cmConfigure.h" // IWYU pragma: keep
-
-#include <map>
-#include <string>
-
-#include "cmProperty.h"
-#include "cmPropertyDefinition.h"
-
-class cmPropertyDefinitionMap
- : public std::map<std::string, cmPropertyDefinition>
-{
-public:
- // define the property
- void DefineProperty(const std::string& name, cmProperty::ScopeType scope,
- const char* ShortDescription,
- const char* FullDescription, bool chain);
-
- // has a named property been defined
- bool IsPropertyDefined(const std::string& name) const;
-
- // is a named property set to chain
- bool IsPropertyChained(const std::string& name) const;
-};
-
-#endif
diff --git a/Source/cmPropertyMap.cxx b/Source/cmPropertyMap.cxx
index d4b3552..f22f36d 100644
--- a/Source/cmPropertyMap.cxx
+++ b/Source/cmPropertyMap.cxx
@@ -42,13 +42,11 @@ void cmPropertyMap::RemoveProperty(const std::string& name)
Map_.erase(name);
}
-const char* cmPropertyMap::GetPropertyValue(const std::string& name) const
+cmProp cmPropertyMap::GetPropertyValue(const std::string& name) const
{
- {
- auto it = Map_.find(name);
- if (it != Map_.end()) {
- return it->second.c_str();
- }
+ auto it = Map_.find(name);
+ if (it != Map_.end()) {
+ return &it->second;
}
return nullptr;
}
diff --git a/Source/cmPropertyMap.h b/Source/cmPropertyMap.h
index bea4372..40ac356 100644
--- a/Source/cmPropertyMap.h
+++ b/Source/cmPropertyMap.h
@@ -10,6 +10,8 @@
#include <utility>
#include <vector>
+using cmProp = const std::string*;
+
/** \class cmPropertyMap
* \brief String property map.
*/
@@ -31,7 +33,7 @@ public:
bool asString = false);
//! Get the property value
- const char* GetPropertyValue(const std::string& name) const;
+ cmProp GetPropertyValue(const std::string& name) const;
//! Remove the property @a name from the map
void RemoveProperty(const std::string& name);
diff --git a/Source/cmQTWrapCPPCommand.cxx b/Source/cmQTWrapCPPCommand.cxx
index cc4df8f..48c4b10 100644
--- a/Source/cmQTWrapCPPCommand.cxx
+++ b/Source/cmQTWrapCPPCommand.cxx
@@ -39,7 +39,8 @@ bool cmQTWrapCPPCommand(std::vector<std::string> const& args,
cmStrCat(mf.GetCurrentBinaryDirectory(), "/moc_", srcName, ".cxx");
cmSourceFile* sf = mf.GetOrCreateSource(newName, true);
if (curr) {
- sf->SetProperty("ABSTRACT", curr->GetProperty("ABSTRACT"));
+ cmProp p = curr->GetProperty("ABSTRACT");
+ sf->SetProperty("ABSTRACT", p ? p->c_str() : nullptr);
}
// Compute the name of the header from which to generate the file.
diff --git a/Source/cmQtAutoGen.cxx b/Source/cmQtAutoGen.cxx
index d5891c4..57fcd2d 100644
--- a/Source/cmQtAutoGen.cxx
+++ b/Source/cmQtAutoGen.cxx
@@ -13,7 +13,6 @@
#include "cmsys/FStream.hxx"
#include "cmsys/RegularExpression.hxx"
-#include "cmAlgorithms.h"
#include "cmDuration.h"
#include "cmProcessOutput.h"
#include "cmStringAlgorithms.h"
@@ -55,7 +54,7 @@ void MergeOptions(std::vector<std::string>& baseOpts,
}
}
// Test if this is a value option and change the existing value
- if (!optName.empty() && cmContains(valueOpts, optName)) {
+ if (!optName.empty() && cm::contains(valueOpts, optName)) {
const auto existItNext(existIt + 1);
const auto fitNext(fit + 1);
if ((existItNext != baseOpts.end()) && (fitNext != fitEnd)) {
diff --git a/Source/cmQtAutoGenGlobalInitializer.cxx b/Source/cmQtAutoGenGlobalInitializer.cxx
index 7a6cb42..a32f3e7 100644
--- a/Source/cmQtAutoGenGlobalInitializer.cxx
+++ b/Source/cmQtAutoGenGlobalInitializer.cxx
@@ -95,11 +95,11 @@ cmQtAutoGenGlobalInitializer::cmQtAutoGenGlobalInitializer(
bool const uic = target->GetPropertyAsBool(kw().AUTOUIC);
bool const rcc = target->GetPropertyAsBool(kw().AUTORCC);
if (moc || uic || rcc) {
- std::string const mocExec =
+ std::string const& mocExec =
target->GetSafeProperty(kw().AUTOMOC_EXECUTABLE);
- std::string const uicExec =
+ std::string const& uicExec =
target->GetSafeProperty(kw().AUTOUIC_EXECUTABLE);
- std::string const rccExec =
+ std::string const& rccExec =
target->GetSafeProperty(kw().AUTORCC_EXECUTABLE);
// We support Qt4, Qt5 and Qt6
@@ -164,10 +164,10 @@ void cmQtAutoGenGlobalInitializer::GetOrCreateGlobalTarget(
// Set FOLDER property in the target
{
- char const* folder =
+ cmProp folder =
makefile->GetState()->GetGlobalProperty("AUTOGEN_TARGETS_FOLDER");
if (folder != nullptr) {
- target->SetProperty("FOLDER", folder);
+ target->SetProperty("FOLDER", *folder);
}
}
}
diff --git a/Source/cmQtAutoGenInitializer.cxx b/Source/cmQtAutoGenInitializer.cxx
index 629367d..003a300 100644
--- a/Source/cmQtAutoGenInitializer.cxx
+++ b/Source/cmQtAutoGenInitializer.cxx
@@ -16,13 +16,13 @@
#include <cm/algorithm>
#include <cm/iterator>
#include <cm/memory>
+#include <cmext/algorithm>
-#include "cmsys/SystemInformation.hxx"
+#include <cm3p/json/value.h>
+#include <cm3p/json/writer.h>
-#include "cm_jsoncpp_value.h"
-#include "cm_jsoncpp_writer.h"
+#include "cmsys/SystemInformation.hxx"
-#include "cmAlgorithms.h"
#include "cmCustomCommand.h"
#include "cmCustomCommandLines.h"
#include "cmGeneratedFileStream.h"
@@ -339,7 +339,7 @@ bool cmQtAutoGenInitializer::InitCustomTargets()
// Targets FOLDER
{
- const char* folder =
+ cmProp folder =
this->Makefile->GetState()->GetGlobalProperty("AUTOMOC_TARGETS_FOLDER");
if (folder == nullptr) {
folder = this->Makefile->GetState()->GetGlobalProperty(
@@ -350,7 +350,7 @@ bool cmQtAutoGenInitializer::InitCustomTargets()
folder = this->GenTarget->GetProperty("FOLDER");
}
if (folder != nullptr) {
- this->TargetsFolder = folder;
+ this->TargetsFolder = *folder;
}
}
@@ -440,7 +440,8 @@ bool cmQtAutoGenInitializer::InitCustomTargets()
// Autogen target parallel processing
{
- std::string prop = this->GenTarget->GetSafeProperty("AUTOGEN_PARALLEL");
+ std::string const& prop =
+ this->GenTarget->GetSafeProperty("AUTOGEN_PARALLEL");
if (prop.empty() || (prop == "AUTO")) {
// Autodetect number of CPUs
this->AutogenTarget.Parallel = GetParallelCPUCount();
@@ -471,7 +472,7 @@ bool cmQtAutoGenInitializer::InitCustomTargets()
this->AutogenTarget.DependOrigin =
this->GenTarget->GetPropertyAsBool("AUTOGEN_ORIGIN_DEPENDS");
- std::string const deps =
+ std::string const& deps =
this->GenTarget->GetSafeProperty("AUTOGEN_TARGET_DEPENDS");
if (!deps.empty()) {
for (std::string const& depName : cmExpandedList(deps)) {
@@ -654,7 +655,7 @@ bool cmQtAutoGenInitializer::InitUic()
{
// Uic search paths
{
- std::string const usp =
+ std::string const& usp =
this->GenTarget->GetSafeProperty("AUTOUIC_SEARCH_PATHS");
if (!usp.empty()) {
this->Uic.SearchPaths =
@@ -847,7 +848,7 @@ bool cmQtAutoGenInitializer::InitScanFiles()
this->Makefile->GetSource(fullPath, locationKind);
if (sf != nullptr) {
// Check if we know about this header already
- if (cmContains(this->AutogenTarget.Headers, sf)) {
+ if (cm::contains(this->AutogenTarget.Headers, sf)) {
continue;
}
// We only accept not-GENERATED files that do exist.
@@ -895,14 +896,14 @@ bool cmQtAutoGenInitializer::InitScanFiles()
cmSystemTools::LowerCase(sf->GetExtension());
if (cm->IsHeaderExtension(extLower)) {
- if (!cmContains(this->AutogenTarget.Headers, sf.get())) {
+ if (!cm::contains(this->AutogenTarget.Headers, sf.get())) {
auto muf = makeMUFile(sf.get(), fullPath, false);
if (muf->SkipMoc || muf->SkipUic) {
addMUHeader(std::move(muf), extLower);
}
}
} else if (cm->IsSourceExtension(extLower)) {
- if (!cmContains(this->AutogenTarget.Sources, sf.get())) {
+ if (!cm::contains(this->AutogenTarget.Sources, sf.get())) {
auto muf = makeMUFile(sf.get(), fullPath, false);
if (muf->SkipMoc || muf->SkipUic) {
addMUSource(std::move(muf));
@@ -1094,6 +1095,7 @@ bool cmQtAutoGenInitializer::InitAutogenTarget()
// of fiddling with the include directories
std::vector<std::string> configs;
this->GlobalGen->GetQtAutoGenConfigs(configs);
+ bool stdPipesUTF8 = true;
cmCustomCommandLines commandLines;
for (auto const& config : configs) {
commandLines.push_back(cmMakeCommandLine(
@@ -1138,7 +1140,7 @@ bool cmQtAutoGenInitializer::InitAutogenTarget()
const std::vector<std::string> no_deps;
cmCustomCommand cc(no_output, autogenProvides, no_deps, commandLines,
this->Makefile->GetBacktrace(), autogenComment.c_str(),
- this->Dir.Work.c_str());
+ this->Dir.Work.c_str(), stdPipesUTF8);
cc.SetEscapeOldStyle(false);
cc.SetEscapeAllowMakeVars(true);
this->GenTarget->Target->AddPreBuildCommand(std::move(cc));
@@ -1208,7 +1210,8 @@ bool cmQtAutoGenInitializer::InitAutogenTarget()
autogenComment.c_str(), this->Dir.Work.c_str(), /*replace=*/false,
/*escapeOldStyle=*/false,
/*uses_terminal=*/false,
- /*command_expand_lists=*/false, this->AutogenTarget.DepFile);
+ /*command_expand_lists=*/false, this->AutogenTarget.DepFile, "",
+ stdPipesUTF8);
// Alter variables for the autogen target which now merely wraps the
// custom command
@@ -1279,6 +1282,7 @@ bool cmQtAutoGenInitializer::InitRccTargets()
ccDepends.push_back(qrc.QrcFile);
ccDepends.push_back(qrc.InfoFile);
+ bool stdPipesUTF8 = true;
cmCustomCommandLines commandLines;
if (this->MultiConfig) {
// Build for all configurations
@@ -1307,7 +1311,8 @@ bool cmQtAutoGenInitializer::InitRccTargets()
cmTarget* autoRccTarget = this->LocalGen->AddUtilityCommand(
ccName, true, this->Dir.Work.c_str(), ccOutput, ccDepends,
- commandLines, false, ccComment.c_str());
+ commandLines, false, ccComment.c_str(), false, false, "",
+ stdPipesUTF8);
// Create autogen generator target
this->LocalGen->AddGeneratorTarget(
@@ -1347,7 +1352,8 @@ bool cmQtAutoGenInitializer::InitRccTargets()
this->LocalGen->AddCustomCommandToOutput(
ccOutput, ccByproducts, ccDepends, no_main_dependency,
no_implicit_depends, commandLines, ccComment.c_str(),
- this->Dir.Work.c_str());
+ this->Dir.Work.c_str(), false, true, false, false, "", "",
+ stdPipesUTF8);
}
// Reconfigure when .qrc file changes
this->Makefile->AddCMakeDependFile(qrc.QrcFile);
@@ -1604,10 +1610,9 @@ void cmQtAutoGenInitializer::AddToSourceGroup(std::string const& fileName,
cmStrCat(genNameUpper, "_SOURCE_GROUP"), "AUTOGEN_SOURCE_GROUP"
};
for (std::string const& prop : props) {
- const char* propName =
- this->Makefile->GetState()->GetGlobalProperty(prop);
- if ((propName != nullptr) && (*propName != '\0')) {
- groupName = propName;
+ cmProp propName = this->Makefile->GetState()->GetGlobalProperty(prop);
+ if (propName && !propName->empty()) {
+ groupName = *propName;
property = prop;
break;
}
@@ -1668,6 +1673,13 @@ cmQtAutoGenInitializer::GetQtVersion(cmGeneratorTarget const* target)
}
return 0u;
};
+ auto toUInt2 = [](cmProp input) -> unsigned int {
+ unsigned long tmp = 0;
+ if (input != nullptr && cmStrToULong(*input, &tmp)) {
+ return static_cast<unsigned int>(tmp);
+ }
+ return 0u;
+ };
// Initialize return value to a default
std::pair<IntegerVersion, unsigned int> res(
@@ -1689,9 +1701,9 @@ cmQtAutoGenInitializer::GetQtVersion(cmGeneratorTarget const* target)
knownQtVersions.reserve(keys.size() * 2);
// Adds a version to the result (nullptr safe)
- auto addVersion = [&knownQtVersions, &toUInt](const char* major,
- const char* minor) {
- cmQtAutoGen::IntegerVersion ver(toUInt(major), toUInt(minor));
+ auto addVersion = [&knownQtVersions, &toUInt2](cmProp major,
+ cmProp minor) {
+ cmQtAutoGen::IntegerVersion ver(toUInt2(major), toUInt2(minor));
if (ver.Major != 0) {
knownQtVersions.emplace_back(ver);
}
@@ -1699,8 +1711,8 @@ cmQtAutoGenInitializer::GetQtVersion(cmGeneratorTarget const* target)
// Read versions from variables
for (auto const& keyPair : keys) {
- addVersion(target->Makefile->GetDefinition(std::string(keyPair.first)),
- target->Makefile->GetDefinition(std::string(keyPair.second)));
+ addVersion(target->Makefile->GetDef(std::string(keyPair.first)),
+ target->Makefile->GetDef(std::string(keyPair.second)));
}
// Read versions from directory properties
@@ -1783,7 +1795,7 @@ bool cmQtAutoGenInitializer::GetQtExecutable(GenVarsT& genVars,
// Custom executable
{
std::string const prop = cmStrCat(genVars.GenNameUpper, "_EXECUTABLE");
- std::string const val = this->GenTarget->Target->GetSafeProperty(prop);
+ std::string const& val = this->GenTarget->Target->GetSafeProperty(prop);
if (!val.empty()) {
// Evaluate generator expression
{
diff --git a/Source/cmQtAutoGenerator.cxx b/Source/cmQtAutoGenerator.cxx
index da96305..ee2bc09 100644
--- a/Source/cmQtAutoGenerator.cxx
+++ b/Source/cmQtAutoGenerator.cxx
@@ -2,9 +2,9 @@
file Copyright.txt or https://cmake.org/licensing for details. */
#include "cmQtAutoGenerator.h"
-#include "cmsys/FStream.hxx"
+#include <cm3p/json/reader.h>
-#include "cm_jsoncpp_reader.h"
+#include "cmsys/FStream.hxx"
#include "cmQtAutoGen.h"
#include "cmStringAlgorithms.h"
diff --git a/Source/cmQtAutoGenerator.h b/Source/cmQtAutoGenerator.h
index bbe6dd0..83fb3ed 100644
--- a/Source/cmQtAutoGenerator.h
+++ b/Source/cmQtAutoGenerator.h
@@ -13,7 +13,7 @@
#include <cm/string_view>
-#include "cm_jsoncpp_value.h"
+#include <cm3p/json/value.h>
#include "cmFileTime.h"
#include "cmQtAutoGen.h"
diff --git a/Source/cmQtAutoMocUic.cxx b/Source/cmQtAutoMocUic.cxx
index 893bd6b..9adcabb 100644
--- a/Source/cmQtAutoMocUic.cxx
+++ b/Source/cmQtAutoMocUic.cxx
@@ -18,11 +18,11 @@
#include <cm/string_view>
#include <cmext/algorithm>
+#include <cm3p/json/value.h>
+
#include "cmsys/FStream.hxx"
#include "cmsys/RegularExpression.hxx"
-#include "cm_jsoncpp_value.h"
-
#include "cmCryptoHash.h"
#include "cmFileTime.h"
#include "cmGccDepfileReader.h"
@@ -700,27 +700,27 @@ bool cmQtAutoMocUicT::ParseCacheT::WriteToFile(std::string const& fileName)
if (!ofs) {
return false;
}
- ofs << "# Generated by CMake. Changes will be overwritten." << std::endl;
+ ofs << "# Generated by CMake. Changes will be overwritten.\n";
for (auto const& pair : Map_) {
- ofs << pair.first << std::endl;
+ ofs << pair.first << '\n';
FileT const& file = *pair.second;
if (!file.Moc.Macro.empty()) {
- ofs << " mmc:" << file.Moc.Macro << std::endl;
+ ofs << " mmc:" << file.Moc.Macro << '\n';
}
for (IncludeKeyT const& item : file.Moc.Include.Underscore) {
- ofs << " miu:" << item.Key << std::endl;
+ ofs << " miu:" << item.Key << '\n';
}
for (IncludeKeyT const& item : file.Moc.Include.Dot) {
- ofs << " mid:" << item.Key << std::endl;
+ ofs << " mid:" << item.Key << '\n';
}
for (std::string const& item : file.Moc.Depends) {
- ofs << " mdp:" << item << std::endl;
+ ofs << " mdp:" << item << '\n';
}
for (IncludeKeyT const& item : file.Uic.Include) {
- ofs << " uic:" << item.Key << std::endl;
+ ofs << " uic:" << item.Key << '\n';
}
for (std::string const& item : file.Uic.Depends) {
- ofs << " udp:" << item << std::endl;
+ ofs << " udp:" << item << '\n';
}
}
return ofs.Close();
@@ -2211,9 +2211,9 @@ void cmQtAutoMocUicT::JobDepFilesMergeT::Process()
" for writing."));
return;
}
- ofs << BaseConst().DepFileRuleName << ": \\" << std::endl;
+ ofs << BaseConst().DepFileRuleName << ": \\\n";
for (const std::string& file : dependencies) {
- ofs << '\t' << escapeDependencyPath(file) << " \\" << std::endl;
+ ofs << '\t' << escapeDependencyPath(file) << " \\\n";
if (!ofs.good()) {
LogError(GenT::GEN,
cmStrCat("Writing depfile", MessagePath(BaseConst().DepFile),
@@ -2224,8 +2224,7 @@ void cmQtAutoMocUicT::JobDepFilesMergeT::Process()
// Add the CMake executable to re-new cache data if necessary.
// Also, this is the last entry, so don't add a backslash.
- ofs << '\t' << escapeDependencyPath(BaseConst().CMakeExecutable)
- << std::endl;
+ ofs << '\t' << escapeDependencyPath(BaseConst().CMakeExecutable) << '\n';
}
void cmQtAutoMocUicT::JobFinishT::Process()
diff --git a/Source/cmRST.cxx b/Source/cmRST.cxx
index 7f4abf9..26e93bb 100644
--- a/Source/cmRST.cxx
+++ b/Source/cmRST.cxx
@@ -89,7 +89,8 @@ void cmRST::ProcessModule(std::istream& is)
this->ProcessLine(line);
} else {
if (line[0] != '#') {
- this->ProcessLine(line.substr(0, pos));
+ line.resize(pos);
+ this->ProcessLine(line);
}
rst.clear();
this->Reset();
@@ -102,8 +103,9 @@ void cmRST::ProcessModule(std::istream& is)
this->ProcessLine("");
continue;
}
- if (line.substr(0, 2) == "# ") {
- this->ProcessLine(line.substr(2));
+ if (cmHasLiteralPrefix(line, "# ")) {
+ line.erase(0, 2);
+ this->ProcessLine(line);
continue;
}
rst.clear();
@@ -164,6 +166,8 @@ void cmRST::ProcessLine(std::string const& line)
this->Markup =
(line.find_first_not_of(" \t", 2) == std::string::npos ? MarkupEmpty
: MarkupNormal);
+ // XXX(clang-tidy): https://bugs.llvm.org/show_bug.cgi?id=44165
+ // NOLINTNEXTLINE(bugprone-branch-clone)
if (this->CMakeDirective.find(line)) {
// Output cmake domain directives and their content normally.
this->NormalLine(line);
diff --git a/Source/cmRulePlaceholderExpander.cxx b/Source/cmRulePlaceholderExpander.cxx
index 5ab1b3a..254131b 100644
--- a/Source/cmRulePlaceholderExpander.cxx
+++ b/Source/cmRulePlaceholderExpander.cxx
@@ -236,8 +236,7 @@ std::string cmRulePlaceholderExpander::ExpandRuleVariable(
}
if (variable == "CMAKE_COMMAND") {
return outputConverter->ConvertToOutputFormat(
- cmSystemTools::CollapseFullPath(cmSystemTools::GetCMakeCommand()),
- cmOutputConverter::SHELL);
+ cmSystemTools::GetCMakeCommand(), cmOutputConverter::SHELL);
}
auto compIt = this->Compilers.find(variable);
@@ -334,7 +333,17 @@ void cmRulePlaceholderExpander::ExpandRuleVariables(
std::string replace =
this->ExpandRuleVariable(outputConverter, var, replaceValues);
expandedInput += s.substr(pos, start - pos);
+
+ // Prevent consecutive whitespace in the output if the rule variable
+ // expands to an empty string.
+ bool consecutive = replace.empty() && start > 0 && s[start - 1] == ' ' &&
+ end + 1 < s.size() && s[end + 1] == ' ';
+ if (consecutive) {
+ expandedInput.pop_back();
+ }
+
expandedInput += replace;
+
// move to next one
start = s.find('<', start + var.size() + 2);
pos = end + 1;
diff --git a/Source/cmRuntimeDependencyArchive.cxx b/Source/cmRuntimeDependencyArchive.cxx
index 7a987c2..0781d29 100644
--- a/Source/cmRuntimeDependencyArchive.cxx
+++ b/Source/cmRuntimeDependencyArchive.cxx
@@ -39,7 +39,7 @@ static void AddVisualStudioPath(std::vector<std::string>& paths,
std::string vsloc;
bool found = false;
# ifndef CMAKE_BOOTSTRAP
- if (gg->GetName().find(prefix) == 0) {
+ if (cmHasPrefix(gg->GetName(), prefix)) {
cmGlobalVisualStudioVersionedGenerator* vsgen =
static_cast<cmGlobalVisualStudioVersionedGenerator*>(gg);
if (vsgen->GetVSInstance(vsloc)) {
@@ -218,6 +218,9 @@ bool cmRuntimeDependencyArchive::GetGetRuntimeDependenciesCommand(
// First see if it was supplied by the user
std::string toolCommand = this->GetMakefile()->GetSafeDefinition(
"CMAKE_GET_RUNTIME_DEPENDENCIES_COMMAND");
+ if (toolCommand.empty() && search == "objdump") {
+ toolCommand = this->GetMakefile()->GetSafeDefinition("CMAKE_OBJDUMP");
+ }
if (!toolCommand.empty()) {
cmExpandList(toolCommand, command);
return true;
diff --git a/Source/cmSeparateArgumentsCommand.cxx b/Source/cmSeparateArgumentsCommand.cxx
index 52bde7c..cfe3087 100644
--- a/Source/cmSeparateArgumentsCommand.cxx
+++ b/Source/cmSeparateArgumentsCommand.cxx
@@ -39,6 +39,8 @@ bool cmSeparateArgumentsCommand(std::vector<std::string> const& args,
if (doing == DoingVariable) {
var = arg;
doing = DoingMode;
+ // This will always clone one of the other blocks.
+ // NOLINTNEXTLINE(bugprone-branch-clone)
} else if (doing == DoingMode && arg == "NATIVE_COMMAND") {
#ifdef _WIN32
mode = ModeWindows;
diff --git a/Source/cmServer.cxx b/Source/cmServer.cxx
index 3b2e5f3..7f97406 100644
--- a/Source/cmServer.cxx
+++ b/Source/cmServer.cxx
@@ -4,6 +4,7 @@
#include <algorithm>
#include <cassert>
+#include <csignal>
#include <cstdint>
#include <iostream>
#include <mutex>
@@ -12,10 +13,10 @@
#include <cm/memory>
#include <cm/shared_mutex>
-#include "cmsys/FStream.hxx"
+#include <cm3p/json/reader.h>
+#include <cm3p/json/writer.h>
-#include "cm_jsoncpp_reader.h"
-#include "cm_jsoncpp_writer.h"
+#include "cmsys/FStream.hxx"
#include "cmConnection.h"
#include "cmFileMonitor.h"
@@ -59,16 +60,12 @@ cmServer::cmServer(cmConnection* conn, bool supportExperimental)
, SupportExperimental(supportExperimental)
{
// Register supported protocols:
- this->RegisterProtocol(new cmServerProtocol1);
+ this->RegisterProtocol(cm::make_unique<cmServerProtocol1>());
}
cmServer::~cmServer()
{
Close();
-
- for (cmServerProtocol* p : this->SupportedProtocols) {
- delete p;
- }
}
void cmServer::ProcessRequest(cmConnection* connection,
@@ -117,22 +114,22 @@ void cmServer::ProcessRequest(cmConnection* connection,
}
}
-void cmServer::RegisterProtocol(cmServerProtocol* protocol)
+void cmServer::RegisterProtocol(std::unique_ptr<cmServerProtocol> protocol)
{
if (protocol->IsExperimental() && !this->SupportExperimental) {
- delete protocol;
+ protocol.reset();
return;
}
auto version = protocol->ProtocolVersion();
assert(version.first >= 0);
assert(version.second >= 0);
- auto it = std::find_if(this->SupportedProtocols.begin(),
- this->SupportedProtocols.end(),
- [version](cmServerProtocol* p) {
- return p->ProtocolVersion() == version;
- });
+ auto it = std::find_if(
+ this->SupportedProtocols.begin(), this->SupportedProtocols.end(),
+ [version](const std::unique_ptr<cmServerProtocol>& p) {
+ return p->ProtocolVersion() == version;
+ });
if (it == this->SupportedProtocols.end()) {
- this->SupportedProtocols.push_back(protocol);
+ this->SupportedProtocols.push_back(std::move(protocol));
}
}
@@ -297,19 +294,20 @@ void cmServer::WriteJsonObject(cmConnection* connection,
}
cmServerProtocol* cmServer::FindMatchingProtocol(
- const std::vector<cmServerProtocol*>& protocols, int major, int minor)
+ const std::vector<std::unique_ptr<cmServerProtocol>>& protocols, int major,
+ int minor)
{
cmServerProtocol* bestMatch = nullptr;
- for (auto protocol : protocols) {
+ for (const auto& protocol : protocols) {
auto version = protocol->ProtocolVersion();
if (major != version.first) {
continue;
}
if (minor == version.second) {
- return protocol;
+ return protocol.get();
}
if (!bestMatch || bestMatch->ProtocolVersion().second < version.second) {
- bestMatch = protocol;
+ bestMatch = protocol.get();
}
}
return minor < 0 ? bestMatch : nullptr;
diff --git a/Source/cmServer.h b/Source/cmServer.h
index 3d7027b..9543329 100644
--- a/Source/cmServer.h
+++ b/Source/cmServer.h
@@ -10,8 +10,8 @@
#include <cm/shared_mutex>
-#include "cm_jsoncpp_value.h"
-#include "cm_uv.h"
+#include <cm3p/json/value.h>
+#include <cm3p/uv.h>
#include "cmUVHandlePtr.h"
@@ -103,7 +103,7 @@ public:
cmFileMonitor* FileMonitor() const;
private:
- void RegisterProtocol(cmServerProtocol* protocol);
+ void RegisterProtocol(std::unique_ptr<cmServerProtocol> protocol);
// Callbacks from cmServerConnection:
@@ -149,12 +149,13 @@ private:
const DebugInfo* debug) const;
static cmServerProtocol* FindMatchingProtocol(
- const std::vector<cmServerProtocol*>& protocols, int major, int minor);
+ const std::vector<std::unique_ptr<cmServerProtocol>>& protocols, int major,
+ int minor);
const bool SupportExperimental;
cmServerProtocol* Protocol = nullptr;
- std::vector<cmServerProtocol*> SupportedProtocols;
+ std::vector<std::unique_ptr<cmServerProtocol>> SupportedProtocols;
friend class cmServerProtocol;
friend class cmServerRequest;
diff --git a/Source/cmServerConnection.cxx b/Source/cmServerConnection.cxx
index 2791972..b4f41a0 100644
--- a/Source/cmServerConnection.cxx
+++ b/Source/cmServerConnection.cxx
@@ -4,7 +4,7 @@
#include "cmServerConnection.h"
-#include "cm_uv.h"
+#include <cm3p/uv.h>
#include "cmServer.h"
#include "cmServerDictionary.h"
diff --git a/Source/cmServerProtocol.cxx b/Source/cmServerProtocol.cxx
index 1d4ea01..6b32de3 100644
--- a/Source/cmServerProtocol.cxx
+++ b/Source/cmServerProtocol.cxx
@@ -10,10 +10,10 @@
#include <vector>
#include <cm/memory>
+#include <cmext/algorithm>
-#include "cm_uv.h"
+#include <cm3p/uv.h>
-#include "cmAlgorithms.h"
#include "cmExternalMakefileProjectGenerator.h"
#include "cmFileMonitor.h"
#include "cmGlobalGenerator.h"
@@ -26,6 +26,8 @@
#include "cmSystemTools.h"
#include "cmake.h"
+using cmProp = const std::string*; // just to silence IWYU
+
// Get rid of some windows macros:
#undef max
@@ -182,7 +184,7 @@ static bool getOrTestHomeDirectory(cmState* state, std::string& value,
std::string* errorMessage)
{
const std::string cachedValue =
- std::string(state->GetCacheEntryValue("CMAKE_HOME_DIRECTORY"));
+ *state->GetCacheEntryValue("CMAKE_HOME_DIRECTORY");
if (value.empty()) {
value = cachedValue;
return true;
@@ -205,9 +207,7 @@ static bool getOrTestValue(cmState* state, const std::string& key,
const std::string& keyDescription,
std::string* errorMessage)
{
- const char* entry = state->GetCacheEntryValue(key);
- const std::string cachedValue =
- entry == nullptr ? std::string() : std::string(entry);
+ const std::string cachedValue = state->GetSafeCacheEntryValue(key);
if (value.empty()) {
value = cachedValue;
}
@@ -435,7 +435,7 @@ cmServerResponse cmServerProtocol1::ProcessCache(
keys = allKeys;
} else {
for (auto const& i : keys) {
- if (!cmContains(allKeys, i)) {
+ if (!cm::contains(allKeys, i)) {
return request.ReportError("Key \"" + i + "\" not found in cache.");
}
}
@@ -452,7 +452,7 @@ cmServerResponse cmServerProtocol1::ProcessCache(
bool haveProperties = false;
for (auto const& prop : state->GetCacheEntryPropertyList(key)) {
haveProperties = true;
- props[prop] = state->GetCacheEntryProperty(key, prop);
+ props[prop] = *state->GetCacheEntryProperty(key, prop);
}
if (haveProperties) {
entry[kPROPERTIES_KEY] = props;
@@ -564,7 +564,7 @@ cmServerResponse cmServerProtocol1::ProcessConfigure(
if (cm->LoadCache(buildDir)) {
// build directory has been set up before
- const std::string* cachedSourceDir =
+ cmProp cachedSourceDir =
cm->GetState()->GetInitializedCacheValue("CMAKE_HOME_DIRECTORY");
if (!cachedSourceDir) {
return request.ReportError("No CMAKE_HOME_DIRECTORY found in cache.");
@@ -574,7 +574,7 @@ cmServerResponse cmServerProtocol1::ProcessConfigure(
cm->SetHomeDirectory(sourceDir);
}
- const std::string* cachedGenerator =
+ cmProp cachedGenerator =
cm->GetState()->GetInitializedCacheValue("CMAKE_GENERATOR");
if (cachedGenerator) {
if (gg && gg->GetName() != *cachedGenerator) {
diff --git a/Source/cmServerProtocol.h b/Source/cmServerProtocol.h
index 8446c3e..c71b7bf 100644
--- a/Source/cmServerProtocol.h
+++ b/Source/cmServerProtocol.h
@@ -8,7 +8,7 @@
#include <string>
#include <utility>
-#include "cm_jsoncpp_value.h"
+#include <cm3p/json/value.h>
#include "cmake.h"
diff --git a/Source/cmSetCommand.cxx b/Source/cmSetCommand.cxx
index 5e2a146..5c55427 100644
--- a/Source/cmSetCommand.cxx
+++ b/Source/cmSetCommand.cxx
@@ -135,7 +135,7 @@ bool cmSetCommand(std::vector<std::string> const& args,
// see if this is already in the cache
cmState* state = status.GetMakefile().GetState();
- const char* existingValue = state->GetCacheEntryValue(variable);
+ cmProp existingValue = state->GetCacheEntryValue(variable);
if (existingValue &&
(state->GetCacheEntryType(variable) != cmStateEnums::UNINITIALIZED)) {
// if the set is trying to CACHE the value but the value
@@ -149,8 +149,8 @@ bool cmSetCommand(std::vector<std::string> const& args,
// if it is meant to be in the cache then define it in the cache
if (cache) {
- status.GetMakefile().AddCacheDefinition(variable, value.c_str(), docstring,
- type, force);
+ status.GetMakefile().AddCacheDefinition(variable, value, docstring, type,
+ force);
} else {
// add the definition
status.GetMakefile().AddDefinition(variable, value);
diff --git a/Source/cmSetDirectoryPropertiesCommand.cxx b/Source/cmSetDirectoryPropertiesCommand.cxx
index 35daca6..07ad246 100644
--- a/Source/cmSetDirectoryPropertiesCommand.cxx
+++ b/Source/cmSetDirectoryPropertiesCommand.cxx
@@ -5,12 +5,6 @@
#include "cmExecutionStatus.h"
#include "cmMakefile.h"
-namespace {
-bool RunCommand(cmMakefile& mf, std::vector<std::string>::const_iterator ait,
- std::vector<std::string>::const_iterator aitend,
- std::string& errors);
-}
-
// cmSetDirectoryPropertiesCommand
bool cmSetDirectoryPropertiesCommand(std::vector<std::string> const& args,
cmExecutionStatus& status)
@@ -20,38 +14,26 @@ bool cmSetDirectoryPropertiesCommand(std::vector<std::string> const& args,
return false;
}
- std::string errors;
- bool ret =
- RunCommand(status.GetMakefile(), args.begin() + 1, args.end(), errors);
- if (!ret) {
- status.SetError(errors);
+ // PROPERTIES followed by prop value pairs
+ if (args.size() % 2 != 1) {
+ status.SetError("Wrong number of arguments");
+ return false;
}
- return ret;
-}
-namespace {
-bool RunCommand(cmMakefile& mf, std::vector<std::string>::const_iterator ait,
- std::vector<std::string>::const_iterator aitend,
- std::string& errors)
-{
- for (; ait != aitend; ait += 2) {
- if (ait + 1 == aitend) {
- errors = "Wrong number of arguments";
- return false;
- }
- const std::string& prop = *ait;
- const std::string& value = *(ait + 1);
+ for (auto iter = args.begin() + 1; iter != args.end(); iter += 2) {
+ const std::string& prop = *iter;
if (prop == "VARIABLES") {
- errors = "Variables and cache variables should be set using SET command";
+ status.SetError(
+ "Variables and cache variables should be set using SET command");
return false;
}
if (prop == "MACROS") {
- errors = "Commands and macros cannot be set using SET_CMAKE_PROPERTIES";
+ status.SetError(
+ "Commands and macros cannot be set using SET_CMAKE_PROPERTIES");
return false;
}
- mf.SetProperty(prop, value.c_str());
+ status.GetMakefile().SetProperty(prop, (iter + 1)->c_str());
}
return true;
}
-}
diff --git a/Source/cmSetPropertyCommand.cxx b/Source/cmSetPropertyCommand.cxx
index 3705727..07cb7c9 100644
--- a/Source/cmSetPropertyCommand.cxx
+++ b/Source/cmSetPropertyCommand.cxx
@@ -43,7 +43,9 @@ bool HandleSourceMode(cmExecutionStatus& status,
const std::set<std::string>& names,
const std::string& propertyName,
const std::string& propertyValue, bool appendAsString,
- bool appendMode, bool remove);
+ bool appendMode, bool remove,
+ const std::vector<cmMakefile*>& directory_makefiles,
+ bool source_file_paths_should_be_absolute);
bool HandleSource(cmSourceFile* sf, const std::string& propertyName,
const std::string& propertyValue, bool appendAsString,
bool appendMode, bool remove);
@@ -74,6 +76,131 @@ bool HandleInstall(cmInstalledFile* file, cmMakefile& makefile,
bool appendMode, bool remove);
}
+namespace SetPropertyCommand {
+bool HandleSourceFileDirectoryScopes(
+ cmExecutionStatus& status, std::vector<std::string>& source_file_directories,
+ std::vector<std::string>& source_file_target_directories,
+ std::vector<cmMakefile*>& directory_makefiles)
+{
+ cmMakefile* current_dir_mf = &status.GetMakefile();
+ if (!source_file_directories.empty()) {
+ for (const std::string& dir_path : source_file_directories) {
+ const std::string absolute_dir_path = cmSystemTools::CollapseFullPath(
+ dir_path, current_dir_mf->GetCurrentSourceDirectory());
+ cmMakefile* dir_mf =
+ status.GetMakefile().GetGlobalGenerator()->FindMakefile(
+ absolute_dir_path);
+ if (!dir_mf) {
+ status.SetError(cmStrCat("given non-existent DIRECTORY ", dir_path));
+ return false;
+ }
+ directory_makefiles.push_back(dir_mf);
+ }
+ } else if (!source_file_target_directories.empty()) {
+ for (const std::string& target_name : source_file_target_directories) {
+ cmTarget* target = current_dir_mf->FindTargetToUse(target_name);
+ if (!target) {
+ status.SetError(cmStrCat(
+ "given non-existent target for DIRECTORY_TARGET ", target_name));
+ return false;
+ }
+ cmProp target_source_dir = target->GetProperty("SOURCE_DIR");
+ cmMakefile* target_dir_mf =
+ status.GetMakefile().GetGlobalGenerator()->FindMakefile(
+ *target_source_dir);
+ directory_makefiles.push_back(target_dir_mf);
+ }
+ } else {
+ directory_makefiles.push_back(current_dir_mf);
+ }
+ return true;
+}
+
+bool HandleSourceFileDirectoryScopeValidation(
+ cmExecutionStatus& status, bool source_file_directory_option_enabled,
+ bool source_file_target_option_enabled,
+ std::vector<std::string>& source_file_directories,
+ std::vector<std::string>& source_file_target_directories)
+{
+ // Validate source file directory scopes.
+ if (source_file_directory_option_enabled &&
+ source_file_directories.empty()) {
+ std::string errors = "called with incorrect number of arguments "
+ "no value provided to the DIRECTORY option";
+ status.SetError(errors);
+ return false;
+ }
+ if (source_file_target_option_enabled &&
+ source_file_target_directories.empty()) {
+ std::string errors = "called with incorrect number of arguments "
+ "no value provided to the TARGET_DIRECTORY option";
+ status.SetError(errors);
+ return false;
+ }
+ return true;
+}
+
+bool HandleAndValidateSourceFileDirectortoryScopes(
+ cmExecutionStatus& status, bool source_file_directory_option_enabled,
+ bool source_file_target_option_enabled,
+ std::vector<std::string>& source_file_directories,
+ std::vector<std::string>& source_file_target_directories,
+ std::vector<cmMakefile*>& source_file_directory_makefiles)
+{
+ bool scope_options_valid =
+ SetPropertyCommand::HandleSourceFileDirectoryScopeValidation(
+ status, source_file_directory_option_enabled,
+ source_file_target_option_enabled, source_file_directories,
+ source_file_target_directories);
+ if (!scope_options_valid) {
+ return false;
+ }
+
+ scope_options_valid = SetPropertyCommand::HandleSourceFileDirectoryScopes(
+ status, source_file_directories, source_file_target_directories,
+ source_file_directory_makefiles);
+ return scope_options_valid;
+}
+
+std::string MakeSourceFilePathAbsoluteIfNeeded(
+ cmExecutionStatus& status, const std::string& source_file_path,
+ const bool needed)
+{
+ if (!needed) {
+ return source_file_path;
+ }
+ const std::string absolute_file_path = cmSystemTools::CollapseFullPath(
+ source_file_path, status.GetMakefile().GetCurrentSourceDirectory());
+ return absolute_file_path;
+}
+
+void MakeSourceFilePathsAbsoluteIfNeeded(
+ cmExecutionStatus& status,
+ std::vector<std::string>& source_files_absolute_paths,
+ std::vector<std::string>::const_iterator files_it_begin,
+ std::vector<std::string>::const_iterator files_it_end, const bool needed)
+{
+
+ // Make the file paths absolute, so that relative source file paths are
+ // picked up relative to the command calling site, regardless of the
+ // directory scope.
+ std::vector<std::string>::difference_type num_files =
+ files_it_end - files_it_begin;
+ source_files_absolute_paths.reserve(num_files);
+
+ if (!needed) {
+ source_files_absolute_paths.assign(files_it_begin, files_it_end);
+ return;
+ }
+
+ for (; files_it_begin != files_it_end; ++files_it_begin) {
+ const std::string absolute_file_path =
+ MakeSourceFilePathAbsoluteIfNeeded(status, *files_it_begin, true);
+ source_files_absolute_paths.push_back(absolute_file_path);
+ }
+}
+}
+
bool cmSetPropertyCommand(std::vector<std::string> const& args,
cmExecutionStatus& status)
{
@@ -114,13 +241,20 @@ bool cmSetPropertyCommand(std::vector<std::string> const& args,
std::string propertyName;
std::string propertyValue;
+ std::vector<std::string> source_file_directories;
+ std::vector<std::string> source_file_target_directories;
+ bool source_file_directory_option_enabled = false;
+ bool source_file_target_option_enabled = false;
+
// Parse the rest of the arguments up to the values.
enum Doing
{
DoingNone,
DoingNames,
DoingProperty,
- DoingValues
+ DoingValues,
+ DoingSourceDirectory,
+ DoingSourceTargetDirectory
};
Doing doing = DoingNames;
const char* sep = "";
@@ -137,8 +271,20 @@ bool cmSetPropertyCommand(std::vector<std::string> const& args,
appendMode = true;
remove = false;
appendAsString = true;
+ } else if (doing == DoingNames && scope == cmProperty::SOURCE_FILE &&
+ arg == "DIRECTORY") {
+ doing = DoingSourceDirectory;
+ source_file_directory_option_enabled = true;
+ } else if (doing == DoingNames && scope == cmProperty::SOURCE_FILE &&
+ arg == "TARGET_DIRECTORY") {
+ doing = DoingSourceTargetDirectory;
+ source_file_target_option_enabled = true;
} else if (doing == DoingNames) {
names.insert(arg);
+ } else if (doing == DoingSourceDirectory) {
+ source_file_directories.push_back(arg);
+ } else if (doing == DoingSourceTargetDirectory) {
+ source_file_target_directories.push_back(arg);
} else if (doing == DoingProperty) {
propertyName = arg;
doing = DoingValues;
@@ -159,6 +305,18 @@ bool cmSetPropertyCommand(std::vector<std::string> const& args,
return false;
}
+ std::vector<cmMakefile*> source_file_directory_makefiles;
+ bool file_scopes_handled =
+ SetPropertyCommand::HandleAndValidateSourceFileDirectortoryScopes(
+ status, source_file_directory_option_enabled,
+ source_file_target_option_enabled, source_file_directories,
+ source_file_target_directories, source_file_directory_makefiles);
+ if (!file_scopes_handled) {
+ return false;
+ }
+ bool source_file_paths_should_be_absolute =
+ source_file_directory_option_enabled || source_file_target_option_enabled;
+
// Dispatch property setting.
switch (scope) {
case cmProperty::GLOBAL:
@@ -172,7 +330,9 @@ bool cmSetPropertyCommand(std::vector<std::string> const& args,
appendAsString, appendMode, remove);
case cmProperty::SOURCE_FILE:
return HandleSourceMode(status, names, propertyName, propertyValue,
- appendAsString, appendMode, remove);
+ appendAsString, appendMode, remove,
+ source_file_directory_makefiles,
+ source_file_paths_should_be_absolute);
case cmProperty::TEST:
return HandleTestMode(status, names, propertyName, propertyValue,
appendAsString, appendMode, remove);
@@ -235,14 +395,8 @@ bool HandleDirectoryMode(cmExecutionStatus& status,
if (!names.empty()) {
// Construct the directory name. Interpret relative paths with
// respect to the current directory.
- std::string dir = *names.begin();
- if (!cmSystemTools::FileIsFullPath(dir)) {
- dir = cmStrCat(status.GetMakefile().GetCurrentSourceDirectory(), '/',
- *names.begin());
- }
-
- // The local generators are associated with collapsed paths.
- dir = cmSystemTools::CollapseFullPath(dir);
+ std::string dir = cmSystemTools::CollapseFullPath(
+ *names.begin(), status.GetMakefile().GetCurrentSourceDirectory());
mf = status.GetMakefile().GetGlobalGenerator()->FindMakefile(dir);
if (!mf) {
@@ -307,7 +461,7 @@ bool HandleTarget(cmTarget* target, cmMakefile& makefile,
if (remove) {
target->SetProperty(propertyName, nullptr);
} else {
- target->SetProperty(propertyName, propertyValue.c_str());
+ target->SetProperty(propertyName, propertyValue);
}
}
@@ -321,21 +475,32 @@ bool HandleSourceMode(cmExecutionStatus& status,
const std::set<std::string>& names,
const std::string& propertyName,
const std::string& propertyValue, bool appendAsString,
- bool appendMode, bool remove)
+ bool appendMode, bool remove,
+ const std::vector<cmMakefile*>& directory_makefiles,
+ const bool source_file_paths_should_be_absolute)
{
- for (std::string const& name : names) {
- // Get the source file.
- if (cmSourceFile* sf = status.GetMakefile().GetOrCreateSource(name)) {
- if (!HandleSource(sf, propertyName, propertyValue, appendAsString,
- appendMode, remove)) {
+ std::vector<std::string> files_absolute;
+ std::vector<std::string> unique_files(names.begin(), names.end());
+ SetPropertyCommand::MakeSourceFilePathsAbsoluteIfNeeded(
+ status, files_absolute, unique_files.begin(), unique_files.end(),
+ source_file_paths_should_be_absolute);
+
+ for (const auto mf : directory_makefiles) {
+ for (std::string const& name : files_absolute) {
+ // Get the source file.
+ if (cmSourceFile* sf = mf->GetOrCreateSource(name)) {
+ if (!HandleSource(sf, propertyName, propertyValue, appendAsString,
+ appendMode, remove)) {
+ return false;
+ }
+ } else {
+ status.SetError(cmStrCat(
+ "given SOURCE name that could not be found or created: ", name));
return false;
}
- } else {
- status.SetError(cmStrCat(
- "given SOURCE name that could not be found or created: ", name));
- return false;
}
}
+
return true;
}
@@ -438,7 +603,7 @@ bool HandleCacheMode(cmExecutionStatus& status,
for (std::string const& name : names) {
// Get the source file.
cmake* cm = status.GetMakefile().GetCMakeInstance();
- const char* existingValue = cm->GetState()->GetCacheEntryValue(name);
+ cmProp existingValue = cm->GetState()->GetCacheEntryValue(name);
if (existingValue) {
if (!HandleCacheEntry(name, status.GetMakefile(), propertyName,
propertyValue, appendAsString, appendMode,
@@ -460,16 +625,15 @@ bool HandleCacheEntry(std::string const& cacheKey, const cmMakefile& makefile,
bool appendMode, bool remove)
{
// Set or append the property.
- const char* value = propertyValue.c_str();
cmState* state = makefile.GetState();
if (remove) {
state->RemoveCacheEntryProperty(cacheKey, propertyName);
}
if (appendMode) {
- state->AppendCacheEntryProperty(cacheKey, propertyName, value,
+ state->AppendCacheEntryProperty(cacheKey, propertyName, propertyValue,
appendAsString);
} else {
- state->SetCacheEntryProperty(cacheKey, propertyName, value);
+ state->SetCacheEntryProperty(cacheKey, propertyName, propertyValue);
}
return true;
@@ -505,13 +669,13 @@ bool HandleInstall(cmInstalledFile* file, cmMakefile& makefile,
bool appendMode, bool remove)
{
// Set or append the property.
- const char* value = propertyValue.c_str();
if (remove) {
file->RemoveProperty(propertyName);
} else if (appendMode) {
- file->AppendProperty(&makefile, propertyName, value, appendAsString);
+ file->AppendProperty(&makefile, propertyName, propertyValue,
+ appendAsString);
} else {
- file->SetProperty(&makefile, propertyName, value);
+ file->SetProperty(&makefile, propertyName, propertyValue);
}
return true;
}
diff --git a/Source/cmSetPropertyCommand.h b/Source/cmSetPropertyCommand.h
index ec36f84..af566a3 100644
--- a/Source/cmSetPropertyCommand.h
+++ b/Source/cmSetPropertyCommand.h
@@ -8,9 +8,38 @@
#include <string>
#include <vector>
+class cmMakefile;
class cmExecutionStatus;
bool cmSetPropertyCommand(std::vector<std::string> const& args,
cmExecutionStatus& status);
+namespace SetPropertyCommand {
+bool HandleSourceFileDirectoryScopes(
+ cmExecutionStatus& status, std::vector<std::string>& source_file_directories,
+ std::vector<std::string>& source_file_target_directories,
+ std::vector<cmMakefile*>& directory_makefiles);
+
+bool HandleSourceFileDirectoryScopeValidation(
+ cmExecutionStatus& status, bool source_file_directory_option_enabled,
+ bool source_file_target_option_enabled,
+ std::vector<std::string>& source_file_directories,
+ std::vector<std::string>& source_file_target_directories);
+
+bool HandleAndValidateSourceFileDirectortoryScopes(
+ cmExecutionStatus& status, bool source_directories_option_encountered,
+ bool source_target_directories_option_encountered,
+ std::vector<std::string>& source_directories,
+ std::vector<std::string>& source_target_directories,
+ std::vector<cmMakefile*>& source_file_directory_makefiles);
+
+std::string MakeSourceFilePathAbsoluteIfNeeded(
+ cmExecutionStatus& status, const std::string& source_file_path, bool needed);
+void MakeSourceFilePathsAbsoluteIfNeeded(
+ cmExecutionStatus& status,
+ std::vector<std::string>& source_files_absolute_paths,
+ std::vector<std::string>::const_iterator files_it_begin,
+ std::vector<std::string>::const_iterator files_it_end, bool needed);
+}
+
#endif
diff --git a/Source/cmSetSourceFilesPropertiesCommand.cxx b/Source/cmSetSourceFilesPropertiesCommand.cxx
index 7ff604b..3135a06 100644
--- a/Source/cmSetSourceFilesPropertiesCommand.cxx
+++ b/Source/cmSetSourceFilesPropertiesCommand.cxx
@@ -2,17 +2,23 @@
file Copyright.txt or https://cmake.org/licensing for details. */
#include "cmSetSourceFilesPropertiesCommand.h"
+#include <algorithm>
+#include <iterator>
+
+#include <cm/string_view>
+#include <cmext/algorithm>
+
#include "cmExecutionStatus.h"
#include "cmMakefile.h"
+#include "cmSetPropertyCommand.h"
#include "cmSourceFile.h"
#include "cmStringAlgorithms.h"
-static bool RunCommand(cmMakefile* mf,
- std::vector<std::string>::const_iterator filebeg,
- std::vector<std::string>::const_iterator fileend,
- std::vector<std::string>::const_iterator propbeg,
- std::vector<std::string>::const_iterator propend,
- std::string& errors);
+static bool RunCommandForScope(
+ cmMakefile* mf, std::vector<std::string>::const_iterator file_begin,
+ std::vector<std::string>::const_iterator file_end,
+ std::vector<std::string>::const_iterator prop_begin,
+ std::vector<std::string>::const_iterator prop_end, std::string& errors);
bool cmSetSourceFilesPropertiesCommand(std::vector<std::string> const& args,
cmExecutionStatus& status)
@@ -23,56 +29,95 @@ bool cmSetSourceFilesPropertiesCommand(std::vector<std::string> const& args,
}
// break the arguments into source file names and properties
- int numFiles = 0;
- std::vector<std::string>::const_iterator j;
- j = args.begin();
// old style allows for specifier before PROPERTIES keyword
- while (j != args.end() && *j != "ABSTRACT" && *j != "WRAP_EXCLUDE" &&
- *j != "GENERATED" && *j != "COMPILE_FLAGS" &&
- *j != "OBJECT_DEPENDS" && *j != "PROPERTIES") {
- numFiles++;
- ++j;
+ static const cm::string_view prop_names[] = {
+ "ABSTRACT", "GENERATED", "WRAP_EXCLUDE", "COMPILE_FLAGS",
+ "OBJECT_DEPENDS", "PROPERTIES", "DIRECTORY", "TARGET_DIRECTORY"
+ };
+
+ auto isNotAPropertyKeyword =
+ [](const std::vector<std::string>::const_iterator& arg_it) {
+ return std::all_of(
+ std::begin(prop_names), std::end(prop_names),
+ [&arg_it](cm::string_view prop_name) { return *arg_it != prop_name; });
+ };
+
+ auto options_begin = std::find_first_of(
+ args.begin(), args.end(), std::begin(prop_names), std::end(prop_names));
+ auto options_it = options_begin;
+
+ // Handle directory options.
+ std::vector<std::string> source_file_directories;
+ std::vector<std::string> source_file_target_directories;
+ bool source_file_directory_option_enabled = false;
+ bool source_file_target_option_enabled = false;
+ std::vector<cmMakefile*> source_file_directory_makefiles;
+
+ if (options_it != args.end() && *options_it == "DIRECTORY") {
+ source_file_directory_option_enabled = true;
+ ++options_it;
+ while (options_it != args.end() && isNotAPropertyKeyword(options_it)) {
+ source_file_directories.push_back(*options_it);
+ ++options_it;
+ }
+ } else if (options_it != args.end() && *options_it == "TARGET_DIRECTORY") {
+ source_file_target_option_enabled = true;
+ ++options_it;
+ while (options_it != args.end() && isNotAPropertyKeyword(options_it)) {
+ source_file_target_directories.push_back(*options_it);
+ ++options_it;
+ }
+ }
+ const auto props_begin = options_it;
+
+ bool file_scopes_handled =
+ SetPropertyCommand::HandleAndValidateSourceFileDirectortoryScopes(
+ status, source_file_directory_option_enabled,
+ source_file_target_option_enabled, source_file_directories,
+ source_file_target_directories, source_file_directory_makefiles);
+ if (!file_scopes_handled) {
+ return false;
}
- cmMakefile& mf = status.GetMakefile();
+ std::vector<std::string> files;
+ bool source_file_paths_should_be_absolute =
+ source_file_directory_option_enabled || source_file_target_option_enabled;
+ SetPropertyCommand::MakeSourceFilePathsAbsoluteIfNeeded(
+ status, files, args.begin(), options_begin,
+ source_file_paths_should_be_absolute);
- // now call the worker function
+ // Now call the worker function for each directory scope represented by a
+ // cmMakefile instance.
std::string errors;
- bool ret = RunCommand(&mf, args.begin(), args.begin() + numFiles,
- args.begin() + numFiles, args.end(), errors);
- if (!ret) {
- status.SetError(errors);
+ for (const auto mf : source_file_directory_makefiles) {
+ bool ret = RunCommandForScope(mf, files.begin(), files.end(), props_begin,
+ args.end(), errors);
+ if (!ret) {
+ status.SetError(errors);
+ return ret;
+ }
}
- return ret;
+
+ return true;
}
-static bool RunCommand(cmMakefile* mf,
- std::vector<std::string>::const_iterator filebeg,
- std::vector<std::string>::const_iterator fileend,
- std::vector<std::string>::const_iterator propbeg,
- std::vector<std::string>::const_iterator propend,
- std::string& errors)
+static bool RunCommandForScope(
+ cmMakefile* mf, std::vector<std::string>::const_iterator file_begin,
+ std::vector<std::string>::const_iterator file_end,
+ std::vector<std::string>::const_iterator prop_begin,
+ std::vector<std::string>::const_iterator prop_end, std::string& errors)
{
std::vector<std::string> propertyPairs;
- bool generated = false;
- std::vector<std::string>::const_iterator j;
// build the property pairs
- for (j = propbeg; j != propend; ++j) {
- // old style allows for specifier before PROPERTIES keyword
- if (*j == "ABSTRACT") {
- propertyPairs.emplace_back("ABSTRACT");
- propertyPairs.emplace_back("1");
- } else if (*j == "WRAP_EXCLUDE") {
- propertyPairs.emplace_back("WRAP_EXCLUDE");
- propertyPairs.emplace_back("1");
- } else if (*j == "GENERATED") {
- generated = true;
- propertyPairs.emplace_back("GENERATED");
+ for (auto j = prop_begin; j != prop_end; ++j) {
+ // consume old style options
+ if (*j == "ABSTRACT" || *j == "GENERATED" || *j == "WRAP_EXCLUDE") {
+ propertyPairs.emplace_back(*j);
propertyPairs.emplace_back("1");
} else if (*j == "COMPILE_FLAGS") {
propertyPairs.emplace_back("COMPILE_FLAGS");
++j;
- if (j == propend) {
+ if (j == prop_end) {
errors = "called with incorrect number of arguments "
"COMPILE_FLAGS with no flags";
return false;
@@ -81,33 +126,22 @@ static bool RunCommand(cmMakefile* mf,
} else if (*j == "OBJECT_DEPENDS") {
propertyPairs.emplace_back("OBJECT_DEPENDS");
++j;
- if (j == propend) {
+ if (j == prop_end) {
errors = "called with incorrect number of arguments "
"OBJECT_DEPENDS with no dependencies";
return false;
}
propertyPairs.push_back(*j);
} else if (*j == "PROPERTIES") {
- // now loop through the rest of the arguments, new style
- ++j;
- while (j != propend) {
- propertyPairs.push_back(*j);
- if (*j == "GENERATED") {
- ++j;
- if (j != propend && cmIsOn(*j)) {
- generated = true;
- }
- } else {
- ++j;
- }
- if (j == propend) {
- errors = "called with incorrect number of arguments.";
- return false;
- }
- propertyPairs.push_back(*j);
- ++j;
+ // PROPERTIES is followed by new style prop value pairs
+ cmStringRange newStyleProps{ j + 1, prop_end };
+ if (newStyleProps.size() % 2 != 0) {
+ errors = "called with incorrect number of arguments.";
+ return false;
}
- // break out of the loop because j is already == end
+ // set newStyleProps as is.
+ cm::append(propertyPairs, newStyleProps);
+ // break out of the loop.
break;
} else {
errors = "called with illegal arguments, maybe missing a "
@@ -116,15 +150,13 @@ static bool RunCommand(cmMakefile* mf,
}
}
- // now loop over all the files
- for (j = filebeg; j != fileend; ++j) {
+ // loop over all the files
+ for (const std::string& sfname : cmStringRange{ file_begin, file_end }) {
// get the source file
- cmSourceFile* sf = mf->GetOrCreateSource(*j, generated);
- if (sf) {
- // now loop through all the props and set them
- unsigned int k;
- for (k = 0; k < propertyPairs.size(); k = k + 2) {
- sf->SetProperty(propertyPairs[k], propertyPairs[k + 1].c_str());
+ if (cmSourceFile* sf = mf->GetOrCreateSource(sfname)) {
+ // loop through the props and set them
+ for (auto k = propertyPairs.begin(); k != propertyPairs.end(); k += 2) {
+ sf->SetProperty(*k, (k + 1)->c_str());
}
}
}
diff --git a/Source/cmSetTargetPropertiesCommand.cxx b/Source/cmSetTargetPropertiesCommand.cxx
index cd0fa40..bdc84af 100644
--- a/Source/cmSetTargetPropertiesCommand.cxx
+++ b/Source/cmSetTargetPropertiesCommand.cxx
@@ -2,19 +2,14 @@
file Copyright.txt or https://cmake.org/licensing for details. */
#include "cmSetTargetPropertiesCommand.h"
+#include <algorithm>
#include <iterator>
-#include <cmext/algorithm>
-
#include "cmExecutionStatus.h"
#include "cmMakefile.h"
#include "cmStringAlgorithms.h"
#include "cmTarget.h"
-static bool SetOneTarget(const std::string& tname,
- std::vector<std::string>& propertyPairs,
- cmMakefile* mf);
-
bool cmSetTargetPropertiesCommand(std::vector<std::string> const& args,
cmExecutionStatus& status)
{
@@ -23,61 +18,38 @@ bool cmSetTargetPropertiesCommand(std::vector<std::string> const& args,
return false;
}
- // first collect up the list of files
- std::vector<std::string> propertyPairs;
- int numFiles = 0;
- for (auto j = args.begin(); j != args.end(); ++j) {
- if (*j == "PROPERTIES") {
- // now loop through the rest of the arguments, new style
- ++j;
- if (std::distance(j, args.end()) % 2 != 0) {
- status.SetError("called with incorrect number of arguments.");
- return false;
- }
- cm::append(propertyPairs, j, args.end());
- break;
- }
- numFiles++;
+ // first identify the properties arguments
+ auto propsIter = std::find(args.begin(), args.end(), "PROPERTIES");
+ if (propsIter == args.end() || propsIter + 1 == args.end()) {
+ status.SetError("called with illegal arguments, maybe missing a "
+ "PROPERTIES specifier?");
+ return false;
}
- if (propertyPairs.empty()) {
- status.SetError("called with illegal arguments, maybe missing "
- "a PROPERTIES specifier?");
+
+ if (std::distance(propsIter, args.end()) % 2 != 1) {
+ status.SetError("called with incorrect number of arguments.");
return false;
}
cmMakefile& mf = status.GetMakefile();
- // now loop over all the targets
- for (int i = 0; i < numFiles; ++i) {
- if (mf.IsAlias(args[i])) {
+ // loop over all the targets
+ for (const std::string& tname : cmStringRange{ args.begin(), propsIter }) {
+ if (mf.IsAlias(tname)) {
status.SetError("can not be used on an ALIAS target.");
return false;
}
- bool ret = SetOneTarget(args[i], propertyPairs, &mf);
- if (!ret) {
+ if (cmTarget* target = mf.FindTargetToUse(tname)) {
+ // loop through all the props and set them
+ for (auto k = propsIter + 1; k != args.end(); k += 2) {
+ target->SetProperty(*k, *(k + 1));
+ target->CheckProperty(*k, &mf);
+ }
+ } else {
status.SetError(
- cmStrCat("Can not find target to add properties to: ", args[i]));
+ cmStrCat("Can not find target to add properties to: ", tname));
return false;
}
}
return true;
}
-
-static bool SetOneTarget(const std::string& tname,
- std::vector<std::string>& propertyPairs,
- cmMakefile* mf)
-{
- if (cmTarget* target = mf->FindTargetToUse(tname)) {
- // now loop through all the props and set them
- unsigned int k;
- for (k = 0; k < propertyPairs.size(); k = k + 2) {
- target->SetProperty(propertyPairs[k], propertyPairs[k + 1]);
- target->CheckProperty(propertyPairs[k], mf);
- }
- }
- // if file is not already in the makefile, then add it
- else {
- return false;
- }
- return true;
-}
diff --git a/Source/cmSetTestsPropertiesCommand.cxx b/Source/cmSetTestsPropertiesCommand.cxx
index 2e7aeca..c4bff76 100644
--- a/Source/cmSetTestsPropertiesCommand.cxx
+++ b/Source/cmSetTestsPropertiesCommand.cxx
@@ -2,19 +2,14 @@
file Copyright.txt or https://cmake.org/licensing for details. */
#include "cmSetTestsPropertiesCommand.h"
+#include <algorithm>
#include <iterator>
-#include <cmext/algorithm>
-
#include "cmExecutionStatus.h"
#include "cmMakefile.h"
#include "cmStringAlgorithms.h"
#include "cmTest.h"
-static bool SetOneTest(const std::string& tname,
- std::vector<std::string>& propertyPairs, cmMakefile* mf,
- std::string& errors);
-
bool cmSetTestsPropertiesCommand(std::vector<std::string> const& args,
cmExecutionStatus& status)
{
@@ -23,61 +18,33 @@ bool cmSetTestsPropertiesCommand(std::vector<std::string> const& args,
return false;
}
- cmMakefile& mf = status.GetMakefile();
-
- // first collect up the list of files
- std::vector<std::string> propertyPairs;
- int numFiles = 0;
- std::vector<std::string>::const_iterator j;
- for (j = args.begin(); j != args.end(); ++j) {
- if (*j == "PROPERTIES") {
- // now loop through the rest of the arguments, new style
- ++j;
- if (std::distance(j, args.end()) % 2 != 0) {
- status.SetError("called with incorrect number of arguments.");
- return false;
- }
- cm::append(propertyPairs, j, args.end());
- break;
- }
- numFiles++;
- }
- if (propertyPairs.empty()) {
- status.SetError("called with illegal arguments, maybe "
- "missing a PROPERTIES specifier?");
+ // first identify the properties arguments
+ auto propsIter = std::find(args.begin(), args.end(), "PROPERTIES");
+ if (propsIter == args.end() || propsIter + 1 == args.end()) {
+ status.SetError("called with illegal arguments, maybe missing a "
+ "PROPERTIES specifier?");
return false;
}
- // now loop over all the targets
- int i;
- for (i = 0; i < numFiles; ++i) {
- std::string errors;
- bool ret = SetOneTest(args[i], propertyPairs, &mf, errors);
- if (!ret) {
- status.SetError(errors);
- return ret;
- }
+ if (std::distance(propsIter, args.end()) % 2 != 1) {
+ status.SetError("called with incorrect number of arguments.");
+ return false;
}
- return true;
-}
-
-static bool SetOneTest(const std::string& tname,
- std::vector<std::string>& propertyPairs, cmMakefile* mf,
- std::string& errors)
-{
- if (cmTest* test = mf->GetTest(tname)) {
- // now loop through all the props and set them
- unsigned int k;
- for (k = 0; k < propertyPairs.size(); k = k + 2) {
- if (!propertyPairs[k].empty()) {
- test->SetProperty(propertyPairs[k], propertyPairs[k + 1].c_str());
+ // loop over all the tests
+ for (const std::string& tname : cmStringRange{ args.begin(), propsIter }) {
+ if (cmTest* test = status.GetMakefile().GetTest(tname)) {
+ // loop through all the props and set them
+ for (auto k = propsIter + 1; k != args.end(); k += 2) {
+ if (!k->empty()) {
+ test->SetProperty(*k, (k + 1)->c_str());
+ }
}
+ } else {
+ status.SetError(
+ cmStrCat("Can not find test to add properties to: ", tname));
+ return false;
}
- } else {
- errors = cmStrCat("Can not find test to add properties to: ", tname);
- return false;
}
-
return true;
}
diff --git a/Source/cmSiteNameCommand.cxx b/Source/cmSiteNameCommand.cxx
index d47f121..b2d905e 100644
--- a/Source/cmSiteNameCommand.cxx
+++ b/Source/cmSiteNameCommand.cxx
@@ -72,8 +72,7 @@ bool cmSiteNameCommand(std::vector<std::string> const& args,
}
#endif
status.GetMakefile().AddCacheDefinition(
- args[0], siteName.c_str(),
- "Name of the computer/site where compile is being run",
+ args[0], siteName, "Name of the computer/site where compile is being run",
cmStateEnums::STRING);
return true;
diff --git a/Source/cmSourceFile.cxx b/Source/cmSourceFile.cxx
index fd9cacd..f525439 100644
--- a/Source/cmSourceFile.cxx
+++ b/Source/cmSourceFile.cxx
@@ -48,9 +48,9 @@ std::string cmSourceFile::GetObjectLibrary() const
std::string const& cmSourceFile::GetOrDetermineLanguage()
{
// If the language was set explicitly by the user then use it.
- if (const char* lang = this->GetProperty(propLANGUAGE)) {
+ if (cmProp lang = this->GetProperty(propLANGUAGE)) {
// Assign to member in order to return a reference.
- this->Language = lang;
+ this->Language = *lang;
return this->Language;
}
@@ -81,8 +81,8 @@ std::string const& cmSourceFile::GetOrDetermineLanguage()
std::string cmSourceFile::GetLanguage() const
{
// If the language was set explicitly by the user then use it.
- if (const char* lang = this->GetProperty(propLANGUAGE)) {
- return lang;
+ if (cmProp lang = this->GetProperty(propLANGUAGE)) {
+ return *lang;
}
// Use the language determined from the file extension.
@@ -317,17 +317,18 @@ const char* cmSourceFile::GetPropertyForUser(const std::string& prop)
}
// Perform the normal property lookup.
- return this->GetProperty(prop);
+ cmProp p = this->GetProperty(prop);
+ return p ? p->c_str() : nullptr;
}
-const char* cmSourceFile::GetProperty(const std::string& prop) const
+cmProp cmSourceFile::GetProperty(const std::string& prop) const
{
// Check for computed properties.
if (prop == propLOCATION) {
if (this->FullPath.empty()) {
return nullptr;
}
- return this->FullPath.c_str();
+ return &this->FullPath;
}
// Check for the properties with backtraces.
@@ -338,7 +339,7 @@ const char* cmSourceFile::GetProperty(const std::string& prop) const
static std::string output;
output = cmJoin(this->IncludeDirectories, ";");
- return output.c_str();
+ return &output;
}
if (prop == propCOMPILE_OPTIONS) {
@@ -348,7 +349,7 @@ const char* cmSourceFile::GetProperty(const std::string& prop) const
static std::string output;
output = cmJoin(this->CompileOptions, ";");
- return output.c_str();
+ return &output;
}
if (prop == propCOMPILE_DEFINITIONS) {
@@ -358,10 +359,10 @@ const char* cmSourceFile::GetProperty(const std::string& prop) const
static std::string output;
output = cmJoin(this->CompileDefinitions, ";");
- return output.c_str();
+ return &output;
}
- const char* retVal = this->Properties.GetPropertyValue(prop);
+ cmProp retVal = this->Properties.GetPropertyValue(prop);
if (!retVal) {
cmMakefile const* mf = this->Location.GetMakefile();
const bool chain =
@@ -369,6 +370,7 @@ const char* cmSourceFile::GetProperty(const std::string& prop) const
if (chain) {
return mf->GetProperty(prop, chain);
}
+ return nullptr;
}
return retVal;
@@ -376,16 +378,17 @@ const char* cmSourceFile::GetProperty(const std::string& prop) const
const char* cmSourceFile::GetSafeProperty(const std::string& prop) const
{
- const char* ret = this->GetProperty(prop);
+ cmProp ret = this->GetProperty(prop);
if (!ret) {
return "";
}
- return ret;
+ return ret->c_str();
}
bool cmSourceFile::GetPropertyAsBool(const std::string& prop) const
{
- return cmIsOn(this->GetProperty(prop));
+ cmProp p = this->GetProperty(prop);
+ return p && cmIsOn(*p);
}
void cmSourceFile::SetProperties(cmPropertyMap properties)
diff --git a/Source/cmSourceFile.h b/Source/cmSourceFile.h
index e22829f..e527069 100644
--- a/Source/cmSourceFile.h
+++ b/Source/cmSourceFile.h
@@ -17,6 +17,8 @@
class cmMakefile;
+using cmProp = const std::string*;
+
/** \class cmSourceFile
* \brief Represent a class loaded from a makefile.
*
@@ -45,7 +47,7 @@ public:
void AppendProperty(const std::string& prop, const std::string& value,
bool asString = false);
//! Might return a nullptr if the property is not set or invalid
- const char* GetProperty(const std::string& prop) const;
+ cmProp GetProperty(const std::string& prop) const;
//! Always returns a valid pointer
const char* GetSafeProperty(const std::string& prop) const;
bool GetPropertyAsBool(const std::string& prop) const;
diff --git a/Source/cmSourceFileLocation.cxx b/Source/cmSourceFileLocation.cxx
index 5f807b8..e852c05 100644
--- a/Source/cmSourceFileLocation.cxx
+++ b/Source/cmSourceFileLocation.cxx
@@ -4,6 +4,8 @@
#include <cassert>
+#include <cm/string_view>
+
#include "cmGlobalGenerator.h"
#include "cmMakefile.h"
#include "cmMessageType.h"
@@ -152,7 +154,7 @@ bool cmSourceFileLocation::MatchesAmbiguousExtension(
// Only a fixed set of extensions will be tried to match a file on
// disk. One of these must match if loc refers to this source file.
- std::string const& ext = this->Name.substr(loc.Name.size() + 1);
+ auto ext = cm::string_view(this->Name).substr(loc.Name.size() + 1);
cmMakefile const* mf = this->Makefile;
auto cm = mf->GetCMakeInstance();
return cm->IsSourceExtension(ext) || cm->IsHeaderExtension(ext);
diff --git a/Source/cmSourceGroup.cxx b/Source/cmSourceGroup.cxx
index 8c3ec9f..155068cb 100644
--- a/Source/cmSourceGroup.cxx
+++ b/Source/cmSourceGroup.cxx
@@ -4,6 +4,8 @@
#include <utility>
+#include <cm/memory>
+
#include "cmStringAlgorithms.h"
class cmSourceGroupInternals
@@ -16,7 +18,7 @@ cmSourceGroup::cmSourceGroup(std::string name, const char* regex,
const char* parentName)
: Name(std::move(name))
{
- this->Internal = new cmSourceGroupInternals;
+ this->Internal = cm::make_unique<cmSourceGroupInternals>();
this->SetGroupRegex(regex);
if (parentName) {
this->FullName = cmStrCat(parentName, '\\');
@@ -24,10 +26,7 @@ cmSourceGroup::cmSourceGroup(std::string name, const char* regex,
this->FullName += this->Name;
}
-cmSourceGroup::~cmSourceGroup()
-{
- delete this->Internal;
-}
+cmSourceGroup::~cmSourceGroup() = default;
cmSourceGroup::cmSourceGroup(cmSourceGroup const& r)
{
@@ -36,7 +35,7 @@ cmSourceGroup::cmSourceGroup(cmSourceGroup const& r)
this->GroupRegex = r.GroupRegex;
this->GroupFiles = r.GroupFiles;
this->SourceFiles = r.SourceFiles;
- this->Internal = new cmSourceGroupInternals(*r.Internal);
+ this->Internal = cm::make_unique<cmSourceGroupInternals>(*r.Internal);
}
cmSourceGroup& cmSourceGroup::operator=(cmSourceGroup const& r)
diff --git a/Source/cmSourceGroup.h b/Source/cmSourceGroup.h
index 581dc5d..623cded 100644
--- a/Source/cmSourceGroup.h
+++ b/Source/cmSourceGroup.h
@@ -5,6 +5,7 @@
#include "cmConfigure.h" // IWYU pragma: keep
+#include <memory>
#include <set>
#include <string>
#include <vector>
@@ -122,7 +123,7 @@ private:
*/
std::vector<const cmSourceFile*> SourceFiles;
- cmSourceGroupInternals* Internal;
+ std::unique_ptr<cmSourceGroupInternals> Internal;
};
#endif
diff --git a/Source/cmSourceGroupCommand.cxx b/Source/cmSourceGroupCommand.cxx
index cc62952..bb75a14 100644
--- a/Source/cmSourceGroupCommand.cxx
+++ b/Source/cmSourceGroupCommand.cxx
@@ -7,7 +7,8 @@
#include <set>
#include <utility>
-#include "cmAlgorithms.h"
+#include <cmext/algorithm>
+
#include "cmExecutionStatus.h"
#include "cmMakefile.h"
#include "cmSourceGroup.h"
@@ -30,18 +31,6 @@ std::vector<std::string> tokenizePath(const std::string& path)
return cmTokenize(path, "\\/");
}
-std::string getFullFilePath(const std::string& currentPath,
- const std::string& path)
-{
- std::string fullPath = path;
-
- if (!cmSystemTools::FileIsFullPath(path)) {
- fullPath = cmStrCat(currentPath, '/', path);
- }
-
- return cmSystemTools::CollapseFullPath(fullPath);
-}
-
std::set<std::string> getSourceGroupFilesPaths(
const std::string& root, const std::vector<std::string>& files)
{
@@ -124,7 +113,8 @@ bool addFilesToItsSourceGroups(const std::string& root,
errorMsg = "Could not create source group for file: " + sgFilesPath;
return false;
}
- const std::string fullPath = getFullFilePath(root, sgFilesPath);
+ const std::string fullPath =
+ cmSystemTools::CollapseFullPath(sgFilesPath, root);
sg->AddGroupFile(fullPath);
}
}
@@ -147,7 +137,7 @@ ExpectedOptions getExpectedOptions()
bool isExpectedOption(const std::string& argument,
const ExpectedOptions& expectedOptions)
{
- return cmContains(expectedOptions, argument);
+ return cm::contains(expectedOptions, argument);
}
void parseArguments(const std::vector<std::string>& args,
@@ -255,10 +245,8 @@ bool cmSourceGroupCommand(std::vector<std::string> const& args,
parsedArguments[kFilesOptionName];
for (auto const& filesArg : filesArguments) {
std::string src = filesArg;
- if (!cmSystemTools::FileIsFullPath(src)) {
- src = cmStrCat(mf.GetCurrentSourceDirectory(), '/', filesArg);
- }
- src = cmSystemTools::CollapseFullPath(src);
+ src =
+ cmSystemTools::CollapseFullPath(src, mf.GetCurrentSourceDirectory());
sg->AddGroupFile(src);
}
}
diff --git a/Source/cmStandardLexer.h b/Source/cmStandardLexer.h
index 13f7622..cc67ac2 100644
--- a/Source/cmStandardLexer.h
+++ b/Source/cmStandardLexer.h
@@ -3,6 +3,19 @@
#ifndef cmStandardLexer_h
#define cmStandardLexer_h
+#if !defined(_WIN32) && !defined(__sun)
+/* POSIX APIs are needed */
+# define _POSIX_C_SOURCE 200809L
+#endif
+#if defined(__sun) && defined(__GNUC__) && !defined(__cplusplus)
+/* C sources: for fileno and strdup */
+# define _XOPEN_SOURCE 600
+#endif
+#if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__NetBSD__)
+/* For isascii */
+# define _XOPEN_SOURCE 700
+#endif
+
#include "cmsys/Configure.h" // IWYU pragma: keep
/* Disable some warnings. */
@@ -50,7 +63,7 @@
#define YY_NO_UNPUT 1
#define ECHO
-#include "cm_kwiml.h"
+#include <cm3p/kwiml/int.h>
typedef KWIML_INT_int8_t flex_int8_t;
typedef KWIML_INT_uint8_t flex_uint8_t;
typedef KWIML_INT_int16_t flex_int16_t;
diff --git a/Source/cmState.cxx b/Source/cmState.cxx
index 9fc7615..18d8537 100644
--- a/Source/cmState.cxx
+++ b/Source/cmState.cxx
@@ -26,6 +26,8 @@
#include "cmSystemTools.h"
#include "cmake.h"
+using cmProp = const std::string*;
+
cmState::cmState()
{
this->CacheManager = cm::make_unique<cmCacheManager>();
@@ -34,30 +36,44 @@ cmState::cmState()
cmState::~cmState() = default;
-const char* cmState::GetTargetTypeName(cmStateEnums::TargetType targetType)
-{
+const std::string& cmState::GetTargetTypeName(
+ cmStateEnums::TargetType targetType)
+{
+#define MAKE_STATIC_PROP(PROP) static const std::string prop##PROP = #PROP
+ MAKE_STATIC_PROP(STATIC_LIBRARY);
+ MAKE_STATIC_PROP(MODULE_LIBRARY);
+ MAKE_STATIC_PROP(SHARED_LIBRARY);
+ MAKE_STATIC_PROP(OBJECT_LIBRARY);
+ MAKE_STATIC_PROP(EXECUTABLE);
+ MAKE_STATIC_PROP(UTILITY);
+ MAKE_STATIC_PROP(GLOBAL_TARGET);
+ MAKE_STATIC_PROP(INTERFACE_LIBRARY);
+ MAKE_STATIC_PROP(UNKNOWN_LIBRARY);
+ static const std::string propEmpty;
+#undef MAKE_STATIC_PROP
+
switch (targetType) {
case cmStateEnums::STATIC_LIBRARY:
- return "STATIC_LIBRARY";
+ return propSTATIC_LIBRARY;
case cmStateEnums::MODULE_LIBRARY:
- return "MODULE_LIBRARY";
+ return propMODULE_LIBRARY;
case cmStateEnums::SHARED_LIBRARY:
- return "SHARED_LIBRARY";
+ return propSHARED_LIBRARY;
case cmStateEnums::OBJECT_LIBRARY:
- return "OBJECT_LIBRARY";
+ return propOBJECT_LIBRARY;
case cmStateEnums::EXECUTABLE:
- return "EXECUTABLE";
+ return propEXECUTABLE;
case cmStateEnums::UTILITY:
- return "UTILITY";
+ return propUTILITY;
case cmStateEnums::GLOBAL_TARGET:
- return "GLOBAL_TARGET";
+ return propGLOBAL_TARGET;
case cmStateEnums::INTERFACE_LIBRARY:
- return "INTERFACE_LIBRARY";
+ return propINTERFACE_LIBRARY;
case cmStateEnums::UNKNOWN_LIBRARY:
- return "UNKNOWN_LIBRARY";
+ return propUNKNOWN_LIBRARY;
}
assert(false && "Unexpected target type");
- return nullptr;
+ return propEmpty;
}
static const std::array<std::string, 7> cmCacheEntryTypes = {
@@ -123,36 +139,23 @@ bool cmState::DeleteCache(const std::string& path)
std::vector<std::string> cmState::GetCacheEntryKeys() const
{
- std::vector<std::string> definitions;
- definitions.reserve(this->CacheManager->GetSize());
- cmCacheManager::CacheIterator cit = this->CacheManager->GetCacheIterator();
- for (cit.Begin(); !cit.IsAtEnd(); cit.Next()) {
- definitions.push_back(cit.GetName());
- }
- return definitions;
+ return this->CacheManager->GetCacheEntryKeys();
}
-const char* cmState::GetCacheEntryValue(std::string const& key) const
+cmProp cmState::GetCacheEntryValue(std::string const& key) const
{
- cmCacheManager::CacheEntry* e = this->CacheManager->GetCacheEntry(key);
- if (!e) {
- return nullptr;
- }
- return e->Value.c_str();
+ return this->CacheManager->GetCacheEntryValue(key);
}
std::string cmState::GetSafeCacheEntryValue(std::string const& key) const
{
- std::string retval;
- auto val = this->GetCacheEntryValue(key);
- if (val) {
- retval = val;
+ if (cmProp val = this->GetCacheEntryValue(key)) {
+ return *val;
}
- return retval;
+ return std::string();
}
-const std::string* cmState::GetInitializedCacheValue(
- std::string const& key) const
+cmProp cmState::GetInitializedCacheValue(std::string const& key) const
{
return this->CacheManager->GetInitializedCacheValue(key);
}
@@ -160,8 +163,7 @@ const std::string* cmState::GetInitializedCacheValue(
cmStateEnums::CacheEntryType cmState::GetCacheEntryType(
std::string const& key) const
{
- cmCacheManager::CacheIterator it = this->CacheManager->GetCacheIterator(key);
- return it.GetType();
+ return this->CacheManager->GetCacheEntryType(key);
}
void cmState::SetCacheEntryValue(std::string const& key,
@@ -174,40 +176,32 @@ void cmState::SetCacheEntryProperty(std::string const& key,
std::string const& propertyName,
std::string const& value)
{
- cmCacheManager::CacheIterator it = this->CacheManager->GetCacheIterator(key);
- it.SetProperty(propertyName, value.c_str());
+ this->CacheManager->SetCacheEntryProperty(key, propertyName, value);
}
void cmState::SetCacheEntryBoolProperty(std::string const& key,
std::string const& propertyName,
bool value)
{
- cmCacheManager::CacheIterator it = this->CacheManager->GetCacheIterator(key);
- it.SetProperty(propertyName, value);
+ this->CacheManager->SetCacheEntryBoolProperty(key, propertyName, value);
}
std::vector<std::string> cmState::GetCacheEntryPropertyList(
const std::string& key)
{
- cmCacheManager::CacheIterator it = this->CacheManager->GetCacheIterator(key);
- return it.GetPropertyList();
+ return this->CacheManager->GetCacheEntryPropertyList(key);
}
-const char* cmState::GetCacheEntryProperty(std::string const& key,
- std::string const& propertyName)
+cmProp cmState::GetCacheEntryProperty(std::string const& key,
+ std::string const& propertyName)
{
- cmCacheManager::CacheIterator it = this->CacheManager->GetCacheIterator(key);
- if (!it.PropertyExists(propertyName)) {
- return nullptr;
- }
- return it.GetProperty(propertyName);
+ return this->CacheManager->GetCacheEntryProperty(key, propertyName);
}
bool cmState::GetCacheEntryPropertyAsBool(std::string const& key,
std::string const& propertyName)
{
- return this->CacheManager->GetCacheIterator(key).GetPropertyAsBool(
- propertyName);
+ return this->CacheManager->GetCacheEntryPropertyAsBool(key, propertyName);
}
void cmState::AddCacheEntry(const std::string& key, const char* value,
@@ -259,20 +253,19 @@ void cmState::AppendCacheEntryProperty(const std::string& key,
const std::string& property,
const std::string& value, bool asString)
{
- this->CacheManager->GetCacheIterator(key).AppendProperty(property, value,
- asString);
+ this->CacheManager->AppendCacheEntryProperty(key, property, value, asString);
}
void cmState::RemoveCacheEntryProperty(std::string const& key,
std::string const& propertyName)
{
- this->CacheManager->GetCacheIterator(key).SetProperty(propertyName, nullptr);
+ this->CacheManager->RemoveCacheEntryProperty(key, propertyName);
}
cmStateSnapshot cmState::Reset()
{
this->GlobalProperties.Clear();
- this->PropertyDefinitions.clear();
+ this->PropertyDefinitions = {};
this->GlobVerificationManager->Reset();
cmStateDetail::PositionType pos = this->SnapshotData.Truncate();
@@ -335,42 +328,26 @@ cmStateSnapshot cmState::Reset()
void cmState::DefineProperty(const std::string& name,
cmProperty::ScopeType scope,
- const char* ShortDescription,
- const char* FullDescription, bool chained)
+ const std::string& ShortDescription,
+ const std::string& FullDescription, bool chained)
{
- this->PropertyDefinitions[scope].DefineProperty(
- name, scope, ShortDescription, FullDescription, chained);
+ this->PropertyDefinitions.DefineProperty(name, scope, ShortDescription,
+ FullDescription, chained);
}
cmPropertyDefinition const* cmState::GetPropertyDefinition(
const std::string& name, cmProperty::ScopeType scope) const
{
- if (this->IsPropertyDefined(name, scope)) {
- cmPropertyDefinitionMap const& defs =
- this->PropertyDefinitions.find(scope)->second;
- return &defs.find(name)->second;
- }
- return nullptr;
-}
-
-bool cmState::IsPropertyDefined(const std::string& name,
- cmProperty::ScopeType scope) const
-{
- auto it = this->PropertyDefinitions.find(scope);
- if (it == this->PropertyDefinitions.end()) {
- return false;
- }
- return it->second.IsPropertyDefined(name);
+ return this->PropertyDefinitions.GetPropertyDefinition(name, scope);
}
bool cmState::IsPropertyChained(const std::string& name,
cmProperty::ScopeType scope) const
{
- auto it = this->PropertyDefinitions.find(scope);
- if (it == this->PropertyDefinitions.end()) {
- return false;
+ if (auto def = this->GetPropertyDefinition(name, scope)) {
+ return def->IsChained();
}
- return it->second.IsPropertyChained(name);
+ return false;
}
void cmState::SetLanguageEnabled(std::string const& l)
@@ -573,7 +550,7 @@ void cmState::AppendGlobalProperty(const std::string& prop,
this->GlobalProperties.AppendProperty(prop, value, asString);
}
-const char* cmState::GetGlobalProperty(const std::string& prop)
+cmProp cmState::GetGlobalProperty(const std::string& prop)
{
if (prop == "CACHE_VARIABLES") {
std::vector<std::string> cacheKeys = this->GetCacheEntryKeys();
@@ -597,31 +574,49 @@ const char* cmState::GetGlobalProperty(const std::string& prop)
}
#define STRING_LIST_ELEMENT(F) ";" #F
if (prop == "CMAKE_C_KNOWN_FEATURES") {
- return &FOR_EACH_C_FEATURE(STRING_LIST_ELEMENT)[1];
+ static const std::string s_out(
+ &FOR_EACH_C_FEATURE(STRING_LIST_ELEMENT)[1]);
+ return &s_out;
}
if (prop == "CMAKE_C90_KNOWN_FEATURES") {
- return &FOR_EACH_C90_FEATURE(STRING_LIST_ELEMENT)[1];
+ static const std::string s_out(
+ &FOR_EACH_C90_FEATURE(STRING_LIST_ELEMENT)[1]);
+ return &s_out;
}
if (prop == "CMAKE_C99_KNOWN_FEATURES") {
- return &FOR_EACH_C99_FEATURE(STRING_LIST_ELEMENT)[1];
+ static const std::string s_out(
+ &FOR_EACH_C99_FEATURE(STRING_LIST_ELEMENT)[1]);
+ return &s_out;
}
if (prop == "CMAKE_C11_KNOWN_FEATURES") {
- return &FOR_EACH_C11_FEATURE(STRING_LIST_ELEMENT)[1];
+ static const std::string s_out(
+ &FOR_EACH_C11_FEATURE(STRING_LIST_ELEMENT)[1]);
+ return &s_out;
}
if (prop == "CMAKE_CXX_KNOWN_FEATURES") {
- return &FOR_EACH_CXX_FEATURE(STRING_LIST_ELEMENT)[1];
+ static const std::string s_out(
+ &FOR_EACH_CXX_FEATURE(STRING_LIST_ELEMENT)[1]);
+ return &s_out;
}
if (prop == "CMAKE_CXX98_KNOWN_FEATURES") {
- return &FOR_EACH_CXX98_FEATURE(STRING_LIST_ELEMENT)[1];
+ static const std::string s_out(
+ &FOR_EACH_CXX98_FEATURE(STRING_LIST_ELEMENT)[1]);
+ return &s_out;
}
if (prop == "CMAKE_CXX11_KNOWN_FEATURES") {
- return &FOR_EACH_CXX11_FEATURE(STRING_LIST_ELEMENT)[1];
+ static const std::string s_out(
+ &FOR_EACH_CXX11_FEATURE(STRING_LIST_ELEMENT)[1]);
+ return &s_out;
}
if (prop == "CMAKE_CXX14_KNOWN_FEATURES") {
- return &FOR_EACH_CXX14_FEATURE(STRING_LIST_ELEMENT)[1];
+ static const std::string s_out(
+ &FOR_EACH_CXX14_FEATURE(STRING_LIST_ELEMENT)[1]);
+ return &s_out;
}
if (prop == "CMAKE_CUDA_KNOWN_FEATURES") {
- return &FOR_EACH_CUDA_FEATURE(STRING_LIST_ELEMENT)[1];
+ static const std::string s_out(
+ &FOR_EACH_CUDA_FEATURE(STRING_LIST_ELEMENT)[1]);
+ return &s_out;
}
#undef STRING_LIST_ELEMENT
@@ -630,7 +625,8 @@ const char* cmState::GetGlobalProperty(const std::string& prop)
bool cmState::GetGlobalPropertyAsBool(const std::string& prop)
{
- return cmIsOn(this->GetGlobalProperty(prop));
+ cmProp p = this->GetGlobalProperty(prop);
+ return p && cmIsOn(*p);
}
void cmState::SetSourceDirectory(std::string const& sourceDirectory)
diff --git a/Source/cmState.h b/Source/cmState.h
index 6ee2b0c..f2bd32a 100644
--- a/Source/cmState.h
+++ b/Source/cmState.h
@@ -17,7 +17,7 @@
#include "cmListFileCache.h"
#include "cmPolicies.h"
#include "cmProperty.h"
-#include "cmPropertyDefinitionMap.h"
+#include "cmPropertyDefinition.h"
#include "cmPropertyMap.h"
#include "cmStatePrivate.h"
#include "cmStateTypes.h"
@@ -25,11 +25,12 @@
class cmCacheManager;
class cmCommand;
class cmGlobVerificationManager;
-class cmPropertyDefinition;
class cmStateSnapshot;
class cmMessenger;
class cmExecutionStatus;
+using cmProp = const std::string*;
+
class cmState
{
friend class cmStateSnapshot;
@@ -51,7 +52,8 @@ public:
CPack,
};
- static const char* GetTargetTypeName(cmStateEnums::TargetType targetType);
+ static const std::string& GetTargetTypeName(
+ cmStateEnums::TargetType targetType);
cmStateSnapshot CreateBaseSnapshot();
cmStateSnapshot CreateBuildsystemDirectorySnapshot(
@@ -87,9 +89,9 @@ public:
bool DeleteCache(const std::string& path);
std::vector<std::string> GetCacheEntryKeys() const;
- const char* GetCacheEntryValue(std::string const& key) const;
+ cmProp GetCacheEntryValue(std::string const& key) const;
std::string GetSafeCacheEntryValue(std::string const& key) const;
- const std::string* GetInitializedCacheValue(std::string const& key) const;
+ cmProp GetInitializedCacheValue(std::string const& key) const;
cmStateEnums::CacheEntryType GetCacheEntryType(std::string const& key) const;
void SetCacheEntryValue(std::string const& key, std::string const& value);
void SetCacheValue(std::string const& key, std::string const& value);
@@ -102,8 +104,8 @@ public:
void SetCacheEntryBoolProperty(std::string const& key,
std::string const& propertyName, bool value);
std::vector<std::string> GetCacheEntryPropertyList(std::string const& key);
- const char* GetCacheEntryProperty(std::string const& key,
- std::string const& propertyName);
+ cmProp GetCacheEntryProperty(std::string const& key,
+ std::string const& propertyName);
bool GetCacheEntryPropertyAsBool(std::string const& key,
std::string const& propertyName);
void AppendCacheEntryProperty(std::string const& key,
@@ -121,16 +123,13 @@ public:
cmStateSnapshot Reset();
// Define a property
void DefineProperty(const std::string& name, cmProperty::ScopeType scope,
- const char* ShortDescription,
- const char* FullDescription, bool chain = false);
+ const std::string& ShortDescription,
+ const std::string& FullDescription, bool chain = false);
// get property definition
cmPropertyDefinition const* GetPropertyDefinition(
const std::string& name, cmProperty::ScopeType scope) const;
- // Is a property defined?
- bool IsPropertyDefined(const std::string& name,
- cmProperty::ScopeType scope) const;
bool IsPropertyChained(const std::string& name,
cmProperty::ScopeType scope) const;
@@ -171,7 +170,7 @@ public:
void SetGlobalProperty(const std::string& prop, const char* value);
void AppendGlobalProperty(const std::string& prop, const std::string& value,
bool asString = false);
- const char* GetGlobalProperty(const std::string& prop);
+ cmProp GetGlobalProperty(const std::string& prop);
bool GetGlobalPropertyAsBool(const std::string& prop);
std::string const& GetSourceDirectory() const;
@@ -222,7 +221,7 @@ private:
const std::string& variable,
cmListFileBacktrace const& bt);
- std::map<cmProperty::ScopeType, cmPropertyDefinitionMap> PropertyDefinitions;
+ cmPropertyDefinitionMap PropertyDefinitions;
std::vector<std::string> EnabledLanguages;
std::map<std::string, Command> BuiltinCommands;
std::map<std::string, Command> ScriptedCommands;
diff --git a/Source/cmStateDirectory.cxx b/Source/cmStateDirectory.cxx
index 4f003ed..a4fe663 100644
--- a/Source/cmStateDirectory.cxx
+++ b/Source/cmStateDirectory.cxx
@@ -548,32 +548,31 @@ void cmStateDirectory::AppendProperty(const std::string& prop,
this->DirectoryState->Properties.AppendProperty(prop, value, asString);
}
-const char* cmStateDirectory::GetProperty(const std::string& prop) const
+cmProp cmStateDirectory::GetProperty(const std::string& prop) const
{
const bool chain =
this->Snapshot_.State->IsPropertyChained(prop, cmProperty::DIRECTORY);
return this->GetProperty(prop, chain);
}
-const char* cmStateDirectory::GetProperty(const std::string& prop,
- bool chain) const
+cmProp cmStateDirectory::GetProperty(const std::string& prop, bool chain) const
{
static std::string output;
output.clear();
if (prop == "PARENT_DIRECTORY") {
cmStateSnapshot parent = this->Snapshot_.GetBuildsystemDirectoryParent();
if (parent.IsValid()) {
- return parent.GetDirectory().GetCurrentSource().c_str();
+ return &parent.GetDirectory().GetCurrentSource();
}
- return "";
+ return &output;
}
if (prop == kBINARY_DIR) {
output = this->GetCurrentBinary();
- return output.c_str();
+ return &output;
}
if (prop == kSOURCE_DIR) {
output = this->GetCurrentSource();
- return output.c_str();
+ return &output;
}
if (prop == kSUBDIRECTORIES) {
std::vector<std::string> child_dirs;
@@ -584,11 +583,11 @@ const char* cmStateDirectory::GetProperty(const std::string& prop,
child_dirs.push_back(ci.GetDirectory().GetCurrentSource());
}
output = cmJoin(child_dirs, ";");
- return output.c_str();
+ return &output;
}
if (prop == kBUILDSYSTEM_TARGETS) {
output = cmJoin(this->DirectoryState->NormalTargetNames, ";");
- return output.c_str();
+ return &output;
}
if (prop == "LISTFILE_STACK") {
@@ -600,41 +599,41 @@ const char* cmStateDirectory::GetProperty(const std::string& prop,
}
std::reverse(listFiles.begin(), listFiles.end());
output = cmJoin(listFiles, ";");
- return output.c_str();
+ return &output;
}
if (prop == "CACHE_VARIABLES") {
output = cmJoin(this->Snapshot_.State->GetCacheEntryKeys(), ";");
- return output.c_str();
+ return &output;
}
if (prop == "VARIABLES") {
std::vector<std::string> res = this->Snapshot_.ClosureKeys();
cm::append(res, this->Snapshot_.State->GetCacheEntryKeys());
std::sort(res.begin(), res.end());
output = cmJoin(res, ";");
- return output.c_str();
+ return &output;
}
if (prop == "INCLUDE_DIRECTORIES") {
output = cmJoin(this->GetIncludeDirectoriesEntries(), ";");
- return output.c_str();
+ return &output;
}
if (prop == "COMPILE_OPTIONS") {
output = cmJoin(this->GetCompileOptionsEntries(), ";");
- return output.c_str();
+ return &output;
}
if (prop == "COMPILE_DEFINITIONS") {
output = cmJoin(this->GetCompileDefinitionsEntries(), ";");
- return output.c_str();
+ return &output;
}
if (prop == "LINK_OPTIONS") {
output = cmJoin(this->GetLinkOptionsEntries(), ";");
- return output.c_str();
+ return &output;
}
if (prop == "LINK_DIRECTORIES") {
output = cmJoin(this->GetLinkDirectoriesEntries(), ";");
- return output.c_str();
+ return &output;
}
- const char* retVal = this->DirectoryState->Properties.GetPropertyValue(prop);
+ cmProp retVal = this->DirectoryState->Properties.GetPropertyValue(prop);
if (!retVal && chain) {
cmStateSnapshot parentSnapshot =
this->Snapshot_.GetBuildsystemDirectoryParent();
@@ -649,7 +648,8 @@ const char* cmStateDirectory::GetProperty(const std::string& prop,
bool cmStateDirectory::GetPropertyAsBool(const std::string& prop) const
{
- return cmIsOn(this->GetProperty(prop));
+ cmProp p = this->GetProperty(prop);
+ return p && cmIsOn(*p);
}
std::vector<std::string> cmStateDirectory::GetPropertyKeys() const
diff --git a/Source/cmStateDirectory.h b/Source/cmStateDirectory.h
index 53a2d54..8144160 100644
--- a/Source/cmStateDirectory.h
+++ b/Source/cmStateDirectory.h
@@ -16,6 +16,8 @@
#include "cmStateSnapshot.h"
#include "cmStringAlgorithms.h"
+using cmProp = const std::string*;
+
class cmStateDirectory
{
cmStateDirectory(
@@ -86,8 +88,8 @@ public:
cmListFileBacktrace const& lfbt);
void AppendProperty(const std::string& prop, const std::string& value,
bool asString, cmListFileBacktrace const& lfbt);
- const char* GetProperty(const std::string& prop) const;
- const char* GetProperty(const std::string& prop, bool chain) const;
+ cmProp GetProperty(const std::string& prop) const;
+ cmProp GetProperty(const std::string& prop, bool chain) const;
bool GetPropertyAsBool(const std::string& prop) const;
std::vector<std::string> GetPropertyKeys() const;
diff --git a/Source/cmStateSnapshot.cxx b/Source/cmStateSnapshot.cxx
index 832e74e..d79df6f 100644
--- a/Source/cmStateSnapshot.cxx
+++ b/Source/cmStateSnapshot.cxx
@@ -411,11 +411,12 @@ void cmStateSnapshot::InitializeFromParent()
this->Position->BuildSystemDirectory->LinkDirectoriesBacktraces,
this->Position->LinkDirectoriesPosition);
- const char* include_regex =
+ cmProp include_regex =
parent->BuildSystemDirectory->Properties.GetPropertyValue(
"INCLUDE_REGULAR_EXPRESSION");
this->Position->BuildSystemDirectory->Properties.SetProperty(
- "INCLUDE_REGULAR_EXPRESSION", include_regex);
+ "INCLUDE_REGULAR_EXPRESSION",
+ include_regex ? include_regex->c_str() : nullptr);
}
cmState* cmStateSnapshot::GetState() const
diff --git a/Source/cmString.hxx b/Source/cmString.hxx
index 9e91986..87bfdff 100644
--- a/Source/cmString.hxx
+++ b/Source/cmString.hxx
@@ -16,8 +16,7 @@
#include <utility>
#include <cm/string_view>
-
-#include "cm_static_string_view.hxx"
+#include <cmext/string_view>
namespace cm {
diff --git a/Source/cmStringAlgorithms.cxx b/Source/cmStringAlgorithms.cxx
index bb6dcd7..71d28a4 100644
--- a/Source/cmStringAlgorithms.cxx
+++ b/Source/cmStringAlgorithms.cxx
@@ -4,7 +4,7 @@
#include <algorithm>
#include <cerrno>
-#include <cstddef>
+#include <cstddef> // IWYU pragma: keep
#include <cstdio>
#include <cstdlib>
diff --git a/Source/cmStringAlgorithms.h b/Source/cmStringAlgorithms.h
index 0e405de..a5ecca7 100644
--- a/Source/cmStringAlgorithms.h
+++ b/Source/cmStringAlgorithms.h
@@ -87,7 +87,7 @@ void cmExpandLists(InputIt first, InputIt last,
std::vector<std::string>& argsOut)
{
for (; first != last; ++first) {
- ExpandList(*first, argsOut);
+ cmExpandList(*first, argsOut);
}
}
diff --git a/Source/cmStringCommand.cxx b/Source/cmStringCommand.cxx
index 9212195..a7c21cc 100644
--- a/Source/cmStringCommand.cxx
+++ b/Source/cmStringCommand.cxx
@@ -11,11 +11,10 @@
#include <memory>
#include <cm/iterator>
+#include <cmext/string_view>
#include "cmsys/RegularExpression.hxx"
-#include "cm_static_string_view.hxx"
-
#include "cmCryptoHash.h"
#include "cmExecutionStatus.h"
#include "cmGeneratorExpression.h"
@@ -124,6 +123,27 @@ bool HandleAsciiCommand(std::vector<std::string> const& args,
return true;
}
+bool HandleHexCommand(std::vector<std::string> const& args,
+ cmExecutionStatus& status)
+{
+ if (args.size() != 3) {
+ status.SetError("Incorrect number of arguments");
+ return false;
+ }
+ auto const& instr = args[1];
+ auto const& outvar = args[2];
+ std::string output(instr.size() * 2, ' ');
+
+ std::string::size_type hexIndex = 0;
+ for (auto const& c : instr) {
+ sprintf(&output[hexIndex], "%.2x", static_cast<unsigned char>(c) & 0xFF);
+ hexIndex += 2;
+ }
+
+ status.GetMakefile().AddDefinition(outvar, output);
+ return true;
+}
+
bool HandleConfigureCommand(std::vector<std::string> const& args,
cmExecutionStatus& status)
{
@@ -936,6 +956,7 @@ bool cmStringCommand(std::vector<std::string> const& args,
{ "TOUPPER"_s, HandleToUpperCommand },
{ "COMPARE"_s, HandleCompareCommand },
{ "ASCII"_s, HandleAsciiCommand },
+ { "HEX"_s, HandleHexCommand },
{ "CONFIGURE"_s, HandleConfigureCommand },
{ "LENGTH"_s, HandleLengthCommand },
{ "APPEND"_s, HandleAppendCommand },
diff --git a/Source/cmSubcommandTable.h b/Source/cmSubcommandTable.h
index 65eb8c7..7deaaed 100644
--- a/Source/cmSubcommandTable.h
+++ b/Source/cmSubcommandTable.h
@@ -11,8 +11,7 @@
#include <vector>
#include <cm/string_view>
-
-#include "cm_static_string_view.hxx"
+#include <cmext/string_view>
class cmExecutionStatus;
diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx
index 9127c50..be799b0 100644
--- a/Source/cmSystemTools.cxx
+++ b/Source/cmSystemTools.cxx
@@ -1,10 +1,20 @@
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
+
+#if !defined(_WIN32) && !defined(__sun)
+// POSIX APIs are needed
+# define _POSIX_C_SOURCE 200809L
+#endif
+#if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__NetBSD__)
+// For isascii
+# define _XOPEN_SOURCE 700
+#endif
+
#include "cmSystemTools.h"
#include <cmext/algorithm>
-#include "cm_uv.h"
+#include <cm3p/uv.h>
#include "cmDuration.h"
#include "cmProcessOutput.h"
@@ -12,7 +22,8 @@
#include "cmStringAlgorithms.h"
#if !defined(CMAKE_BOOTSTRAP)
-# include "cm_libarchive.h"
+# include <cm3p/archive.h>
+# include <cm3p/archive_entry.h>
# include "cmArchiveWrite.h"
# include "cmLocale.h"
@@ -25,6 +36,9 @@
#endif
#if !defined(CMAKE_BOOTSTRAP)
+# if defined(_WIN32)
+# include <cm/memory>
+# endif
# include "cmCryptoHash.h"
#endif
@@ -908,7 +922,6 @@ std::string cmSystemTools::ComputeCertificateThumbprint(
std::string thumbprint;
#if !defined(CMAKE_BOOTSTRAP) && defined(_WIN32)
- BYTE* certData = NULL;
CRYPT_INTEGER_BLOB cryptBlob;
HCERTSTORE certStore = NULL;
PCCERT_CONTEXT certContext = NULL;
@@ -920,12 +933,12 @@ std::string cmSystemTools::ComputeCertificateThumbprint(
if (certFile != INVALID_HANDLE_VALUE && certFile != NULL) {
DWORD fileSize = GetFileSize(certFile, NULL);
if (fileSize != INVALID_FILE_SIZE) {
- certData = new BYTE[fileSize];
+ auto certData = cm::make_unique<BYTE[]>(fileSize);
if (certData != NULL) {
DWORD dwRead = 0;
- if (ReadFile(certFile, certData, fileSize, &dwRead, NULL)) {
+ if (ReadFile(certFile, certData.get(), fileSize, &dwRead, NULL)) {
cryptBlob.cbData = fileSize;
- cryptBlob.pbData = certData;
+ cryptBlob.pbData = certData.get();
// Verify that this is a valid cert
if (PFXIsPFXBlob(&cryptBlob)) {
@@ -961,7 +974,6 @@ std::string cmSystemTools::ComputeCertificateThumbprint(
}
}
}
- delete[] certData;
}
}
CloseHandle(certFile);
@@ -1054,8 +1066,7 @@ bool cmSystemTools::SimpleGlob(const std::string& glob,
if (type < 0 && !cmSystemTools::FileIsDirectory(fname)) {
continue;
}
- if (sfname.size() >= ppath.size() &&
- sfname.substr(0, ppath.size()) == ppath) {
+ if (cmHasPrefix(sfname, ppath)) {
files.push_back(fname);
res = true;
}
@@ -1311,6 +1322,7 @@ bool cmSystemTools::CreateTar(const std::string& outFileName,
cmArchiveWrite a(fout, compress, format.empty() ? "paxr" : format);
+ a.Open();
a.SetMTime(mtime);
a.SetVerbose(verbose);
bool tarCreatedSuccessfully = true;
diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx
index 1ad9fd1..e165f4c 100644
--- a/Source/cmTarget.cxx
+++ b/Source/cmTarget.cxx
@@ -78,7 +78,7 @@ const std::string& cmTargetPropertyComputer::ComputeLocation<cmTarget>(
}
template <>
-const char* cmTargetPropertyComputer::GetSources<cmTarget>(
+cmProp cmTargetPropertyComputer::GetSources<cmTarget>(
cmTarget const* tgt, cmMessenger* messenger,
cmListFileBacktrace const& context)
{
@@ -156,7 +156,7 @@ const char* cmTargetPropertyComputer::GetSources<cmTarget>(
}
static std::string srcs;
srcs = ss.str();
- return srcs.c_str();
+ return &srcs;
}
class cmTargetInternals
@@ -215,7 +215,7 @@ public:
};
cmTarget::cmTarget(std::string const& name, cmStateEnums::TargetType type,
- Visibility vis, cmMakefile* mf, bool perConfig)
+ Visibility vis, cmMakefile* mf, PerConfig perConfig)
: impl(cm::make_unique<cmTargetInternals>())
{
assert(mf);
@@ -231,7 +231,7 @@ cmTarget::cmTarget(std::string const& name, cmStateEnums::TargetType type,
(vis == VisibilityImported || vis == VisibilityImportedGlobally);
impl->ImportedGloballyVisible = vis == VisibilityImportedGlobally;
impl->BuildInterfaceIncludesAppended = false;
- impl->PerConfig = perConfig;
+ impl->PerConfig = (perConfig == PerConfig::Yes);
// Check whether this is a DLL platform.
impl->IsDLLPlatform =
@@ -303,6 +303,7 @@ cmTarget::cmTarget(std::string const& name, cmStateEnums::TargetType type,
initProp("PDB_OUTPUT_DIRECTORY");
initProp("COMPILE_PDB_OUTPUT_DIRECTORY");
initProp("FRAMEWORK");
+ initProp("FRAMEWORK_MULTI_CONFIG_POSTFIX");
initProp("Fortran_FORMAT");
initProp("Fortran_MODULE_DIRECTORY");
initProp("Fortran_COMPILER_LAUNCHER");
@@ -362,6 +363,7 @@ cmTarget::cmTarget(std::string const& name, cmStateEnums::TargetType type,
initProp("CUDA_SEPARABLE_COMPILATION");
initProp("CUDA_RESOLVE_DEVICE_SYMBOLS");
initProp("CUDA_RUNTIME_LIBRARY");
+ initProp("CUDA_ARCHITECTURES");
initProp("LINK_SEARCH_START_STATIC");
initProp("LINK_SEARCH_END_STATIC");
initProp("Swift_LANGUAGE_VERSION");
@@ -370,6 +372,8 @@ cmTarget::cmTarget(std::string const& name, cmStateEnums::TargetType type,
initProp("DISABLE_PRECOMPILE_HEADERS");
initProp("UNITY_BUILD");
initPropValue("UNITY_BUILD_BATCH_SIZE", "8");
+ initPropValue("UNITY_BUILD_MODE", "BATCH");
+ initPropValue("PCH_WARN_INVALID", "ON");
#ifdef __APPLE__
if (this->GetGlobalGenerator()->IsXcode()) {
initProp("XCODE_SCHEME_ADDRESS_SANITIZER");
@@ -438,6 +442,13 @@ cmTarget::cmTarget(std::string const& name, cmStateEnums::TargetType type,
cmStrCat(cmSystemTools::UpperCase(configName), "_POSTFIX");
initProp(property);
}
+
+ if (impl->TargetType == cmStateEnums::SHARED_LIBRARY ||
+ impl->TargetType == cmStateEnums::STATIC_LIBRARY) {
+ std::string property = cmStrCat("FRAMEWORK_MULTI_CONFIG_POSTFIX_",
+ cmSystemTools::UpperCase(configName));
+ initProp(property);
+ }
}
}
@@ -883,7 +894,7 @@ void cmTarget::GetTllSignatureTraces(std::ostream& s, TLLSignature sig) const
cmListFileContext lfc = cmd.second;
lfc.FilePath = cmDir.ConvertToRelPathIfNotContained(
impl->Makefile->GetState()->GetSourceDirectory(), lfc.FilePath);
- s << " * " << lfc << std::endl;
+ s << " * " << lfc << '\n';
}
}
}
@@ -1002,7 +1013,7 @@ void cmTarget::AddLinkLibrary(cmMakefile& mf, std::string const& lib,
dependencies += ";";
dependencies += lib;
dependencies += ";";
- mf.AddCacheDefinition(targetEntry, dependencies.c_str(),
+ mf.AddCacheDefinition(targetEntry, dependencies,
"Dependencies for the target", cmStateEnums::STATIC);
}
}
@@ -1295,8 +1306,8 @@ void cmTarget::SetProperty(const std::string& prop, const char* value)
reusedTarget->SetProperty("COMPILE_PDB_OUTPUT_DIRECTORY",
cmStrCat(reusedFrom, ".dir/"));
- this->SetProperty("COMPILE_PDB_NAME",
- reusedTarget->GetProperty("COMPILE_PDB_NAME"));
+ cmProp tmp = reusedTarget->GetProperty("COMPILE_PDB_NAME");
+ this->SetProperty("COMPILE_PDB_NAME", tmp ? tmp->c_str() : nullptr);
this->AddUtility(reusedFrom, false, impl->Makefile);
} else {
impl->Properties.SetProperty(prop, value);
@@ -1500,7 +1511,7 @@ void cmTarget::InsertPrecompileHeader(std::string const& entry,
}
static void cmTargetCheckLINK_INTERFACE_LIBRARIES(const std::string& prop,
- const char* value,
+ const std::string& value,
cmMakefile* context,
bool imported)
{
@@ -1538,7 +1549,7 @@ static void cmTargetCheckLINK_INTERFACE_LIBRARIES(const std::string& prop,
context->IssueMessage(MessageType::FATAL_ERROR, e.str());
}
-static void cmTargetCheckINTERFACE_LINK_LIBRARIES(const char* value,
+static void cmTargetCheckINTERFACE_LINK_LIBRARIES(const std::string& value,
cmMakefile* context)
{
// Look for link-type keywords in the value.
@@ -1583,18 +1594,18 @@ void cmTarget::CheckProperty(const std::string& prop,
{
// Certain properties need checking.
if (cmHasLiteralPrefix(prop, "LINK_INTERFACE_LIBRARIES")) {
- if (const char* value = this->GetProperty(prop)) {
- cmTargetCheckLINK_INTERFACE_LIBRARIES(prop, value, context, false);
+ if (cmProp value = this->GetProperty(prop)) {
+ cmTargetCheckLINK_INTERFACE_LIBRARIES(prop, *value, context, false);
}
}
if (cmHasLiteralPrefix(prop, "IMPORTED_LINK_INTERFACE_LIBRARIES")) {
- if (const char* value = this->GetProperty(prop)) {
- cmTargetCheckLINK_INTERFACE_LIBRARIES(prop, value, context, true);
+ if (cmProp value = this->GetProperty(prop)) {
+ cmTargetCheckLINK_INTERFACE_LIBRARIES(prop, *value, context, true);
}
}
if (prop == "INTERFACE_LINK_LIBRARIES") {
- if (const char* value = this->GetProperty(prop)) {
- cmTargetCheckINTERFACE_LINK_LIBRARIES(value, context);
+ if (cmProp value = this->GetProperty(prop)) {
+ cmTargetCheckINTERFACE_LINK_LIBRARIES(*value, context);
}
}
if (prop == "IMPORTED_GLOBAL") {
@@ -1604,14 +1615,14 @@ void cmTarget::CheckProperty(const std::string& prop,
}
}
-const char* cmTarget::GetComputedProperty(
- const std::string& prop, cmMessenger* messenger,
- cmListFileBacktrace const& context) const
+cmProp cmTarget::GetComputedProperty(const std::string& prop,
+ cmMessenger* messenger,
+ cmListFileBacktrace const& context) const
{
return cmTargetPropertyComputer::GetProperty(this, prop, messenger, context);
}
-const char* cmTarget::GetProperty(const std::string& prop) const
+cmProp cmTarget::GetProperty(const std::string& prop) const
{
#define MAKE_STATIC_PROP(PROP) static const std::string prop##PROP = #PROP
MAKE_STATIC_PROP(LINK_LIBRARIES);
@@ -1630,6 +1641,8 @@ const char* cmTarget::GetProperty(const std::string& prop) const
MAKE_STATIC_PROP(BINARY_DIR);
MAKE_STATIC_PROP(SOURCE_DIR);
MAKE_STATIC_PROP(SOURCES);
+ MAKE_STATIC_PROP(FALSE);
+ MAKE_STATIC_PROP(TRUE);
#undef MAKE_STATIC_PROP
static std::unordered_set<std::string> const specialProps{
propLINK_LIBRARIES,
@@ -1657,11 +1670,11 @@ const char* cmTarget::GetProperty(const std::string& prop) const
static std::string output;
output = cmJoin(impl->LinkImplementationPropertyEntries, ";");
- return output.c_str();
+ return &output;
}
// the type property returns what type the target is
if (prop == propTYPE) {
- return cmState::GetTargetTypeName(this->GetType());
+ return &cmState::GetTargetTypeName(this->GetType());
}
if (prop == propINCLUDE_DIRECTORIES) {
if (impl->IncludeDirectoriesEntries.empty()) {
@@ -1670,7 +1683,7 @@ const char* cmTarget::GetProperty(const std::string& prop) const
static std::string output;
output = cmJoin(impl->IncludeDirectoriesEntries, ";");
- return output.c_str();
+ return &output;
}
if (prop == propCOMPILE_FEATURES) {
if (impl->CompileFeaturesEntries.empty()) {
@@ -1679,7 +1692,7 @@ const char* cmTarget::GetProperty(const std::string& prop) const
static std::string output;
output = cmJoin(impl->CompileFeaturesEntries, ";");
- return output.c_str();
+ return &output;
}
if (prop == propCOMPILE_OPTIONS) {
if (impl->CompileOptionsEntries.empty()) {
@@ -1688,7 +1701,7 @@ const char* cmTarget::GetProperty(const std::string& prop) const
static std::string output;
output = cmJoin(impl->CompileOptionsEntries, ";");
- return output.c_str();
+ return &output;
}
if (prop == propCOMPILE_DEFINITIONS) {
if (impl->CompileDefinitionsEntries.empty()) {
@@ -1697,7 +1710,7 @@ const char* cmTarget::GetProperty(const std::string& prop) const
static std::string output;
output = cmJoin(impl->CompileDefinitionsEntries, ";");
- return output.c_str();
+ return &output;
}
if (prop == propLINK_OPTIONS) {
if (impl->LinkOptionsEntries.empty()) {
@@ -1706,7 +1719,7 @@ const char* cmTarget::GetProperty(const std::string& prop) const
static std::string output;
output = cmJoin(impl->LinkOptionsEntries, ";");
- return output.c_str();
+ return &output;
}
if (prop == propLINK_DIRECTORIES) {
if (impl->LinkDirectoriesEntries.empty()) {
@@ -1716,7 +1729,7 @@ const char* cmTarget::GetProperty(const std::string& prop) const
static std::string output;
output = cmJoin(impl->LinkDirectoriesEntries, ";");
- return output.c_str();
+ return &output;
}
if (prop == propMANUALLY_ADDED_DEPENDENCIES) {
if (impl->Utilities.empty()) {
@@ -1732,7 +1745,7 @@ const char* cmTarget::GetProperty(const std::string& prop) const
return item.Value.first;
});
output = cmJoin(utilities, ";");
- return output.c_str();
+ return &output;
}
if (prop == propPRECOMPILE_HEADERS) {
if (impl->PrecompileHeadersEntries.empty()) {
@@ -1741,32 +1754,30 @@ const char* cmTarget::GetProperty(const std::string& prop) const
static std::string output;
output = cmJoin(impl->PrecompileHeadersEntries, ";");
- return output.c_str();
+ return &output;
}
if (prop == propIMPORTED) {
- return this->IsImported() ? "TRUE" : "FALSE";
+ return this->IsImported() ? &propTRUE : &propFALSE;
}
if (prop == propIMPORTED_GLOBAL) {
- return this->IsImportedGloballyVisible() ? "TRUE" : "FALSE";
+ return this->IsImportedGloballyVisible() ? &propTRUE : &propFALSE;
}
if (prop == propNAME) {
- return this->GetName().c_str();
+ return &this->GetName();
}
if (prop == propBINARY_DIR) {
- return impl->Makefile->GetStateSnapshot()
- .GetDirectory()
- .GetCurrentBinary()
- .c_str();
+ return &impl->Makefile->GetStateSnapshot()
+ .GetDirectory()
+ .GetCurrentBinary();
}
if (prop == propSOURCE_DIR) {
- return impl->Makefile->GetStateSnapshot()
- .GetDirectory()
- .GetCurrentSource()
- .c_str();
+ return &impl->Makefile->GetStateSnapshot()
+ .GetDirectory()
+ .GetCurrentSource();
}
}
- const char* retVal = impl->Properties.GetPropertyValue(prop);
+ cmProp retVal = impl->Properties.GetPropertyValue(prop);
if (!retVal) {
const bool chain =
impl->Makefile->GetState()->IsPropertyChained(prop, cmProperty::TARGET);
@@ -1774,22 +1785,26 @@ const char* cmTarget::GetProperty(const std::string& prop) const
return impl->Makefile->GetStateSnapshot().GetDirectory().GetProperty(
prop, chain);
}
+ return nullptr;
}
return retVal;
}
-const char* cmTarget::GetSafeProperty(const std::string& prop) const
+std::string const& cmTarget::GetSafeProperty(std::string const& prop) const
{
- const char* ret = this->GetProperty(prop);
- if (!ret) {
- return "";
+ cmProp ret = this->GetProperty(prop);
+ if (ret) {
+ return *ret;
}
- return ret;
+
+ static std::string const s_empty;
+ return s_empty;
}
bool cmTarget::GetPropertyAsBool(const std::string& prop) const
{
- return cmIsOn(this->GetProperty(prop));
+ cmProp p = this->GetProperty(prop);
+ return p && cmIsOn(*p);
}
cmPropertyMap const& cmTarget::GetProperties() const
@@ -1918,38 +1933,37 @@ std::string cmTarget::ImportedGetFullPath(
std::string result;
- const char* loc = nullptr;
- const char* imp = nullptr;
+ cmProp loc = nullptr;
+ cmProp imp = nullptr;
std::string suffix;
if (this->GetType() != cmStateEnums::INTERFACE_LIBRARY &&
- this->GetMappedConfig(desired_config, &loc, &imp, suffix)) {
+ this->GetMappedConfig(desired_config, loc, imp, suffix)) {
switch (artifact) {
case cmStateEnums::RuntimeBinaryArtifact:
if (loc) {
- result = loc;
+ result = *loc;
} else {
std::string impProp = cmStrCat("IMPORTED_LOCATION", suffix);
- if (const char* config_location = this->GetProperty(impProp)) {
- result = config_location;
- } else if (const char* location =
+ if (cmProp config_location = this->GetProperty(impProp)) {
+ result = *config_location;
+ } else if (cmProp location =
this->GetProperty("IMPORTED_LOCATION")) {
- result = location;
+ result = *location;
}
}
break;
case cmStateEnums::ImportLibraryArtifact:
if (imp) {
- result = imp;
+ result = *imp;
} else if (this->GetType() == cmStateEnums::SHARED_LIBRARY ||
this->IsExecutableWithExports()) {
std::string impProp = cmStrCat("IMPORTED_IMPLIB", suffix);
- if (const char* config_implib = this->GetProperty(impProp)) {
- result = config_implib;
- } else if (const char* implib =
- this->GetProperty("IMPORTED_IMPLIB")) {
- result = implib;
+ if (cmProp config_implib = this->GetProperty(impProp)) {
+ result = *config_implib;
+ } else if (cmProp implib = this->GetProperty("IMPORTED_IMPLIB")) {
+ result = *implib;
}
}
break;
@@ -1992,9 +2006,8 @@ bool cmTargetInternals::CheckImportedLibName(std::string const& prop,
return true;
}
-bool cmTarget::GetMappedConfig(std::string const& desired_config,
- const char** loc, const char** imp,
- std::string& suffix) const
+bool cmTarget::GetMappedConfig(std::string const& desired_config, cmProp& loc,
+ cmProp& imp, std::string& suffix) const
{
std::string config_upper;
if (!desired_config.empty()) {
@@ -2016,8 +2029,8 @@ bool cmTarget::GetMappedConfig(std::string const& desired_config,
std::vector<std::string> mappedConfigs;
{
std::string mapProp = cmStrCat("MAP_IMPORTED_CONFIG_", config_upper);
- if (const char* mapValue = this->GetProperty(mapProp)) {
- cmExpandList(mapValue, mappedConfigs, true);
+ if (cmProp mapValue = this->GetProperty(mapProp)) {
+ cmExpandList(*mapValue, mappedConfigs, true);
}
}
@@ -2031,30 +2044,30 @@ bool cmTarget::GetMappedConfig(std::string const& desired_config,
// If a mapping was found, check its configurations.
for (auto mci = mappedConfigs.begin();
- !*loc && !*imp && mci != mappedConfigs.end(); ++mci) {
+ !loc && !imp && mci != mappedConfigs.end(); ++mci) {
// Look for this configuration.
if (mci->empty()) {
// An empty string in the mapping has a special meaning:
// look up the config-less properties.
- *loc = this->GetProperty(locPropBase);
+ loc = this->GetProperty(locPropBase);
if (allowImp) {
- *imp = this->GetProperty("IMPORTED_IMPLIB");
+ imp = this->GetProperty("IMPORTED_IMPLIB");
}
// If it was found, set the suffix.
- if (*loc || *imp) {
+ if (loc || imp) {
suffix.clear();
}
} else {
std::string mcUpper = cmSystemTools::UpperCase(*mci);
std::string locProp = cmStrCat(locPropBase, '_', mcUpper);
- *loc = this->GetProperty(locProp);
+ loc = this->GetProperty(locProp);
if (allowImp) {
std::string impProp = cmStrCat("IMPORTED_IMPLIB_", mcUpper);
- *imp = this->GetProperty(impProp);
+ imp = this->GetProperty(impProp);
}
// If it was found, use it for all properties below.
- if (*loc || *imp) {
+ if (loc || imp) {
suffix = cmStrCat('_', mcUpper);
}
}
@@ -2063,59 +2076,59 @@ bool cmTarget::GetMappedConfig(std::string const& desired_config,
// If we needed to find one of the mapped configurations but did not
// then the target location is not found. The project does not want
// any other configuration.
- if (!mappedConfigs.empty() && !*loc && !*imp) {
+ if (!mappedConfigs.empty() && !loc && !imp) {
// Interface libraries are always available because their
- // library name is optional so it is okay to leave *loc empty.
+ // library name is optional so it is okay to leave loc empty.
return this->GetType() == cmStateEnums::INTERFACE_LIBRARY;
}
// If we have not yet found it then there are no mapped
// configurations. Look for an exact-match.
- if (!*loc && !*imp) {
+ if (!loc && !imp) {
std::string locProp = cmStrCat(locPropBase, suffix);
- *loc = this->GetProperty(locProp);
+ loc = this->GetProperty(locProp);
if (allowImp) {
std::string impProp = cmStrCat("IMPORTED_IMPLIB", suffix);
- *imp = this->GetProperty(impProp);
+ imp = this->GetProperty(impProp);
}
}
// If we have not yet found it then there are no mapped
// configurations and no exact match.
- if (!*loc && !*imp) {
+ if (!loc && !imp) {
// The suffix computed above is not useful.
suffix.clear();
// Look for a configuration-less location. This may be set by
// manually-written code.
- *loc = this->GetProperty(locPropBase);
+ loc = this->GetProperty(locPropBase);
if (allowImp) {
- *imp = this->GetProperty("IMPORTED_IMPLIB");
+ imp = this->GetProperty("IMPORTED_IMPLIB");
}
}
// If we have not yet found it then the project is willing to try
// any available configuration.
- if (!*loc && !*imp) {
+ if (!loc && !imp) {
std::vector<std::string> availableConfigs;
- if (const char* iconfigs = this->GetProperty("IMPORTED_CONFIGURATIONS")) {
- cmExpandList(iconfigs, availableConfigs);
+ if (cmProp iconfigs = this->GetProperty("IMPORTED_CONFIGURATIONS")) {
+ cmExpandList(*iconfigs, availableConfigs);
}
for (auto aci = availableConfigs.begin();
- !*loc && !*imp && aci != availableConfigs.end(); ++aci) {
+ !loc && !imp && aci != availableConfigs.end(); ++aci) {
suffix = cmStrCat('_', cmSystemTools::UpperCase(*aci));
std::string locProp = cmStrCat(locPropBase, suffix);
- *loc = this->GetProperty(locProp);
+ loc = this->GetProperty(locProp);
if (allowImp) {
std::string impProp = cmStrCat("IMPORTED_IMPLIB", suffix);
- *imp = this->GetProperty(impProp);
+ imp = this->GetProperty(impProp);
}
}
}
// If we have not yet found it then the target location is not available.
- if (!*loc && !*imp) {
+ if (!loc && !imp) {
// Interface libraries are always available because their
- // library name is optional so it is okay to leave *loc empty.
+ // library name is optional so it is okay to leave loc empty.
return this->GetType() == cmStateEnums::INTERFACE_LIBRARY;
}
diff --git a/Source/cmTarget.h b/Source/cmTarget.h
index 286933b..6bd47f7 100644
--- a/Source/cmTarget.h
+++ b/Source/cmTarget.h
@@ -28,6 +28,8 @@ class cmPropertyMap;
class cmSourceFile;
class cmTargetInternals;
+using cmProp = const std::string*;
+
/** \class cmTarget
* \brief Represent a library or executable target loaded from a makefile.
*
@@ -43,8 +45,14 @@ public:
VisibilityImportedGlobally
};
+ enum class PerConfig
+ {
+ Yes,
+ No
+ };
+
cmTarget(std::string const& name, cmStateEnums::TargetType type,
- Visibility vis, cmMakefile* mf, bool perConfig);
+ Visibility vis, cmMakefile* mf, PerConfig perConfig);
cmTarget(cmTarget const&) = delete;
cmTarget(cmTarget&&) noexcept;
@@ -170,14 +178,13 @@ public:
void AppendProperty(const std::string& prop, const std::string& value,
bool asString = false);
//! Might return a nullptr if the property is not set or invalid
- const char* GetProperty(const std::string& prop) const;
+ cmProp GetProperty(const std::string& prop) const;
//! Always returns a valid pointer
- const char* GetSafeProperty(const std::string& prop) const;
+ std::string const& GetSafeProperty(std::string const& prop) const;
bool GetPropertyAsBool(const std::string& prop) const;
void CheckProperty(const std::string& prop, cmMakefile* context) const;
- const char* GetComputedProperty(const std::string& prop,
- cmMessenger* messenger,
- cmListFileBacktrace const& context) const;
+ cmProp GetComputedProperty(const std::string& prop, cmMessenger* messenger,
+ cmListFileBacktrace const& context) const;
//! Get all properties
cmPropertyMap const& GetProperties() const;
@@ -191,8 +198,8 @@ public:
bool IsImportedGloballyVisible() const;
bool IsPerConfig() const;
- bool GetMappedConfig(std::string const& desired_config, const char** loc,
- const char** imp, std::string& suffix) const;
+ bool GetMappedConfig(std::string const& desired_config, cmProp& loc,
+ cmProp& imp, std::string& suffix) const;
//! Return whether this target is an executable with symbol exports enabled.
bool IsExecutableWithExports() const;
diff --git a/Source/cmTargetPropCommandBase.cxx b/Source/cmTargetPropCommandBase.cxx
index 0de8d6d..6325837 100644
--- a/Source/cmTargetPropCommandBase.cxx
+++ b/Source/cmTargetPropCommandBase.cxx
@@ -9,6 +9,8 @@
#include "cmTarget.h"
#include "cmake.h"
+using cmProp = const std::string*;
+
cmTargetPropCommandBase::cmTargetPropCommandBase(cmExecutionStatus& status)
: Makefile(&status.GetMakefile())
, Status(status)
@@ -157,9 +159,9 @@ void cmTargetPropCommandBase::HandleInterfaceContent(
{
if (prepend) {
const std::string propName = std::string("INTERFACE_") + this->Property;
- const char* propValue = tgt->GetProperty(propName);
- const std::string totalContent = this->Join(content) +
- (propValue ? std::string(";") + propValue : std::string());
+ cmProp propValue = tgt->GetProperty(propName);
+ const std::string totalContent =
+ this->Join(content) + (propValue ? (";" + *propValue) : std::string());
tgt->SetProperty(propName, totalContent);
} else {
tgt->AppendProperty("INTERFACE_" + this->Property, this->Join(content));
diff --git a/Source/cmTargetPropertyComputer.h b/Source/cmTargetPropertyComputer.h
index df34f18..5387e00 100644
--- a/Source/cmTargetPropertyComputer.h
+++ b/Source/cmTargetPropertyComputer.h
@@ -14,15 +14,17 @@
class cmMessenger;
+using cmProp = const std::string*;
+
class cmTargetPropertyComputer
{
public:
template <typename Target>
- static const char* GetProperty(Target const* tgt, const std::string& prop,
- cmMessenger* messenger,
- cmListFileBacktrace const& context)
+ static cmProp GetProperty(Target const* tgt, const std::string& prop,
+ cmMessenger* messenger,
+ cmListFileBacktrace const& context)
{
- if (const char* loc = GetLocation(tgt, prop, messenger, context)) {
+ if (cmProp loc = GetLocation(tgt, prop, messenger, context)) {
return loc;
}
if (cmSystemTools::GetFatalErrorOccured()) {
@@ -52,9 +54,9 @@ private:
std::string const& config);
template <typename Target>
- static const char* GetLocation(Target const* tgt, std::string const& prop,
- cmMessenger* messenger,
- cmListFileBacktrace const& context)
+ static cmProp GetLocation(Target const* tgt, std::string const& prop,
+ cmMessenger* messenger,
+ cmListFileBacktrace const& context)
{
// Watch for special "computed" properties that are dependent on
@@ -71,7 +73,7 @@ private:
context)) {
return nullptr;
}
- return ComputeLocationForBuild(tgt).c_str();
+ return &ComputeLocationForBuild(tgt);
}
// Support "LOCATION_<CONFIG>".
@@ -82,7 +84,7 @@ private:
return nullptr;
}
std::string configName = prop.substr(9);
- return ComputeLocation(tgt, configName).c_str();
+ return &ComputeLocation(tgt, configName);
}
// Support "<CONFIG>_LOCATION".
@@ -95,7 +97,7 @@ private:
context)) {
return nullptr;
}
- return ComputeLocation(tgt, configName).c_str();
+ return &ComputeLocation(tgt, configName);
}
}
}
@@ -103,8 +105,8 @@ private:
}
template <typename Target>
- static const char* GetSources(Target const* tgt, cmMessenger* messenger,
- cmListFileBacktrace const& context);
+ static cmProp GetSources(Target const* tgt, cmMessenger* messenger,
+ cmListFileBacktrace const& context);
};
#endif
diff --git a/Source/cmTest.cxx b/Source/cmTest.cxx
index 3b731cc..a26bef3 100644
--- a/Source/cmTest.cxx
+++ b/Source/cmTest.cxx
@@ -34,15 +34,18 @@ void cmTest::SetCommand(std::vector<std::string> const& command)
const char* cmTest::GetProperty(const std::string& prop) const
{
- const char* retVal = this->Properties.GetPropertyValue(prop);
+ cmProp retVal = this->Properties.GetPropertyValue(prop);
if (!retVal) {
const bool chain =
this->Makefile->GetState()->IsPropertyChained(prop, cmProperty::TEST);
if (chain) {
- return this->Makefile->GetProperty(prop, chain);
+ if (cmProp p = this->Makefile->GetProperty(prop, chain)) {
+ return p->c_str();
+ }
}
+ return nullptr;
}
- return retVal;
+ return retVal->c_str();
}
bool cmTest::GetPropertyAsBool(const std::string& prop) const
diff --git a/Source/cmTestGenerator.cxx b/Source/cmTestGenerator.cxx
index 333d4d5..4e41993 100644
--- a/Source/cmTestGenerator.cxx
+++ b/Source/cmTestGenerator.cxx
@@ -76,7 +76,7 @@ void cmTestGenerator::GenerateScriptForConfig(std::ostream& os,
cmGeneratorExpression ge(this->Test->GetBacktrace());
// Start the test command.
- os << indent << "add_test(" << this->Test->GetName() << " ";
+ os << indent << "add_test(\"" << this->Test->GetName() << "\" ";
// Evaluate command line arguments
std::vector<std::string> argv =
@@ -100,9 +100,9 @@ void cmTestGenerator::GenerateScriptForConfig(std::ostream& os,
exe = target->GetFullPath(config);
// Prepend with the emulator when cross compiling if required.
- const char* emulator = target->GetProperty("CROSSCOMPILING_EMULATOR");
- if (emulator != nullptr && *emulator) {
- std::vector<std::string> emulatorWithArgs = cmExpandedList(emulator);
+ cmProp emulator = target->GetProperty("CROSSCOMPILING_EMULATOR");
+ if (emulator != nullptr && !emulator->empty()) {
+ std::vector<std::string> emulatorWithArgs = cmExpandedList(*emulator);
std::string emulatorExe(emulatorWithArgs[0]);
cmSystemTools::ConvertToUnixSlashes(emulatorExe);
os << cmOutputConverter::EscapeForCMake(emulatorExe) << " ";
@@ -126,20 +126,21 @@ void cmTestGenerator::GenerateScriptForConfig(std::ostream& os,
os << ")\n";
// Output properties for the test.
- os << indent << "set_tests_properties(" << this->Test->GetName()
- << " PROPERTIES ";
+ os << indent << "set_tests_properties(\"" << this->Test->GetName()
+ << "\" PROPERTIES ";
for (auto const& i : this->Test->GetProperties().GetList()) {
os << " " << i.first << " "
<< cmOutputConverter::EscapeForCMake(
ge.Parse(i.second)->Evaluate(this->LG, config));
}
this->GenerateInternalProperties(os);
- os << ")" << std::endl;
+ os << ")\n";
}
void cmTestGenerator::GenerateScriptNoConfig(std::ostream& os, Indent indent)
{
- os << indent << "add_test(" << this->Test->GetName() << " NOT_AVAILABLE)\n";
+ os << indent << "add_test(\"" << this->Test->GetName()
+ << "\" NOT_AVAILABLE)\n";
}
bool cmTestGenerator::NeedsScriptNoConfig() const
@@ -159,9 +160,8 @@ void cmTestGenerator::GenerateOldStyle(std::ostream& fout, Indent indent)
std::string exe = command[0];
cmSystemTools::ConvertToUnixSlashes(exe);
- fout << indent;
- fout << "add_test(";
- fout << this->Test->GetName() << " \"" << exe << "\"";
+ fout << indent << "add_test(\"" << this->Test->GetName() << "\" \"" << exe
+ << "\"";
for (std::string const& arg : cmMakeRange(command).advance(1)) {
// Just double-quote all arguments so they are re-parsed
@@ -176,9 +176,9 @@ void cmTestGenerator::GenerateOldStyle(std::ostream& fout, Indent indent)
}
fout << c;
}
- fout << "\"";
+ fout << '"';
}
- fout << ")" << std::endl;
+ fout << ")\n";
// Output properties for the test.
fout << indent << "set_tests_properties(" << this->Test->GetName()
@@ -188,7 +188,7 @@ void cmTestGenerator::GenerateOldStyle(std::ostream& fout, Indent indent)
<< cmOutputConverter::EscapeForCMake(i.second);
}
this->GenerateInternalProperties(fout);
- fout << ")" << std::endl;
+ fout << ")\n";
}
void cmTestGenerator::GenerateInternalProperties(std::ostream& os)
@@ -213,7 +213,7 @@ void cmTestGenerator::GenerateInternalProperties(std::ostream& os)
prependTripleSeparator = true;
}
- os << "\"";
+ os << '"';
}
std::vector<std::string> cmTestGenerator::EvaluateCommandLineArguments(
diff --git a/Source/cmTimestamp.cxx b/Source/cmTimestamp.cxx
index 390fd16..13f73dc 100644
--- a/Source/cmTimestamp.cxx
+++ b/Source/cmTimestamp.cxx
@@ -1,5 +1,15 @@
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
+
+#if !defined(_WIN32) && !defined(__sun)
+// POSIX APIs are needed
+# define _POSIX_C_SOURCE 200809L
+#endif
+#if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__NetBSD__)
+// For isascii
+# define _XOPEN_SOURCE 700
+#endif
+
#include "cmTimestamp.h"
#include <cstdlib>
diff --git a/Source/cmTryRunCommand.cxx b/Source/cmTryRunCommand.cxx
index 0e8e986..329b3b9 100644
--- a/Source/cmTryRunCommand.cxx
+++ b/Source/cmTryRunCommand.cxx
@@ -242,8 +242,7 @@ void cmTryRunCommand::DoNotRunExecutable(const std::string& runArgs,
comment.c_str(), cmStateEnums::STRING);
cmState* state = this->Makefile->GetState();
- const char* existingValue =
- state->GetCacheEntryValue(this->RunResultVariable);
+ cmProp existingValue = state->GetCacheEntryValue(this->RunResultVariable);
if (existingValue) {
state->SetCacheEntryProperty(this->RunResultVariable, "ADVANCED", "1");
}
@@ -265,7 +264,7 @@ void cmTryRunCommand::DoNotRunExecutable(const std::string& runArgs,
internalRunOutputName, "PLEASE_FILL_OUT-NOTFOUND", comment.c_str(),
cmStateEnums::STRING);
cmState* state = this->Makefile->GetState();
- const char* existing = state->GetCacheEntryValue(internalRunOutputName);
+ cmProp existing = state->GetCacheEntryValue(internalRunOutputName);
if (existing) {
state->SetCacheEntryProperty(internalRunOutputName, "ADVANCED", "1");
}
diff --git a/Source/cmUVHandlePtr.cxx b/Source/cmUVHandlePtr.cxx
index 23dabb7..df2f64e 100644
--- a/Source/cmUVHandlePtr.cxx
+++ b/Source/cmUVHandlePtr.cxx
@@ -7,7 +7,7 @@
#include <cstdlib>
#include <mutex>
-#include "cm_uv.h"
+#include <cm3p/uv.h>
namespace cm {
diff --git a/Source/cmUVHandlePtr.h b/Source/cmUVHandlePtr.h
index 3083b60..d9de7f3 100644
--- a/Source/cmUVHandlePtr.h
+++ b/Source/cmUVHandlePtr.h
@@ -8,7 +8,7 @@
#include <memory>
#include <type_traits>
-#include "cm_uv.h"
+#include <cm3p/uv.h>
#if defined(__SUNPRO_CC)
diff --git a/Source/cmUVProcessChain.cxx b/Source/cmUVProcessChain.cxx
index 543c330..6040fd8 100644
--- a/Source/cmUVProcessChain.cxx
+++ b/Source/cmUVProcessChain.cxx
@@ -9,7 +9,7 @@
#include <cm/memory>
-#include "cm_uv.h"
+#include <cm3p/uv.h>
#include "cmGetPipes.h"
#include "cmUVHandlePtr.h"
diff --git a/Source/cmUVProcessChain.h b/Source/cmUVProcessChain.h
index 05a7cc8..b5ccb19 100644
--- a/Source/cmUVProcessChain.h
+++ b/Source/cmUVProcessChain.h
@@ -4,14 +4,14 @@
#define cmUVProcessChain_h
#include <array>
-#include <cstddef>
+#include <cstddef> // IWYU pragma: keep
#include <cstdint>
#include <iosfwd>
#include <memory>
#include <string>
#include <vector>
-#include "cm_uv.h"
+#include <cm3p/uv.h>
class cmUVProcessChain;
diff --git a/Source/cmUVSignalHackRAII.h b/Source/cmUVSignalHackRAII.h
index 63599db..60e4ca8 100644
--- a/Source/cmUVSignalHackRAII.h
+++ b/Source/cmUVSignalHackRAII.h
@@ -3,7 +3,7 @@
#pragma once
#include "cmConfigure.h" // IWYU pragma: keep
-#include "cm_uv.h"
+#include <cm3p/uv.h>
#if defined(CMAKE_USE_SYSTEM_LIBUV) && !defined(_WIN32) && \
UV_VERSION_MAJOR == 1 && UV_VERSION_MINOR < 19
diff --git a/Source/cmUVStreambuf.h b/Source/cmUVStreambuf.h
index 1c8a771..50faede 100644
--- a/Source/cmUVStreambuf.h
+++ b/Source/cmUVStreambuf.h
@@ -8,7 +8,7 @@
#include <streambuf>
#include <vector>
-#include "cm_uv.h"
+#include <cm3p/uv.h>
#include "cmUVHandlePtr.h"
diff --git a/Source/cmUtilitySourceCommand.cxx b/Source/cmUtilitySourceCommand.cxx
index a43165c..5865a19 100644
--- a/Source/cmUtilitySourceCommand.cxx
+++ b/Source/cmUtilitySourceCommand.cxx
@@ -102,15 +102,15 @@ bool cmUtilitySourceCommand(std::vector<std::string> const& args,
cmSystemTools::ReplaceString(utilityExecutable, "/./", "/");
// Enter the value into the cache.
- status.GetMakefile().AddCacheDefinition(
- cacheEntry, utilityExecutable.c_str(), "Path to an internal program.",
- cmStateEnums::FILEPATH);
+ status.GetMakefile().AddCacheDefinition(cacheEntry, utilityExecutable,
+ "Path to an internal program.",
+ cmStateEnums::FILEPATH);
// add a value into the cache that maps from the
// full path to the name of the project
cmSystemTools::ConvertToUnixSlashes(utilityExecutable);
- status.GetMakefile().AddCacheDefinition(
- utilityExecutable, utilityName.c_str(), "Executable to project name.",
- cmStateEnums::INTERNAL);
+ status.GetMakefile().AddCacheDefinition(utilityExecutable, utilityName,
+ "Executable to project name.",
+ cmStateEnums::INTERNAL);
return true;
}
diff --git a/Source/cmVSSetupHelper.h b/Source/cmVSSetupHelper.h
index 0980cef..a2fd3d5 100644
--- a/Source/cmVSSetupHelper.h
+++ b/Source/cmVSSetupHelper.h
@@ -8,13 +8,12 @@
#endif
// Published by Visual Studio Setup team
+#include <cm3p/Setup.Configuration.h>
#include <string>
#include <vector>
#include <windows.h>
-#include "cmvssetup/Setup.Configuration.h"
-
template <class T>
class SmartCOMPtr
{
diff --git a/Source/cmVariableWatchCommand.cxx b/Source/cmVariableWatchCommand.cxx
index 35b9a1d..ecae16d 100644
--- a/Source/cmVariableWatchCommand.cxx
+++ b/Source/cmVariableWatchCommand.cxx
@@ -42,7 +42,7 @@ void cmVariableWatchCommandVariableAccessed(const std::string& variable,
/// Ultra bad!!
cmMakefile* makefile = const_cast<cmMakefile*>(mf);
- std::string stack = makefile->GetProperty("LISTFILE_STACK");
+ std::string stack = *mf->GetProperty("LISTFILE_STACK");
if (!data->Command.empty()) {
cmListFileFunction newLFF;
const char* const currentListFile =
diff --git a/Source/cmVersion.h b/Source/cmVersion.h
index bfd994d..932ef04 100644
--- a/Source/cmVersion.h
+++ b/Source/cmVersion.h
@@ -3,7 +3,7 @@
#ifndef cmVersion_h
#define cmVersion_h
-#include "cm_kwiml.h"
+#include <cm3p/kwiml/int.h>
/** \class cmVersion
* \brief Helper class for providing CMake and CTest version information.
diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx
index 163ff19..97f7093 100644
--- a/Source/cmVisualStudio10TargetGenerator.cxx
+++ b/Source/cmVisualStudio10TargetGenerator.cxx
@@ -6,11 +6,12 @@
#include <set>
#include <cm/memory>
+#include <cm/string_view>
#include <cm/vector>
+#include <cmext/algorithm>
#include "windows.h"
-#include "cmAlgorithms.h"
#include "cmComputeLinkInformation.h"
#include "cmCustomCommand.h"
#include "cmCustomCommandGenerator.h"
@@ -22,6 +23,7 @@
#include "cmLocalVisualStudio10Generator.h"
#include "cmMakefile.h"
#include "cmSourceFile.h"
+#include "cmStringAlgorithms.h"
#include "cmSystemTools.h"
#include "cmVisualStudioGeneratorOptions.h"
@@ -61,10 +63,10 @@ struct cmVisualStudio10TargetGenerator::Elem
this->StartElement();
}
Elem(const Elem&) = delete;
- Elem(Elem& par, const std::string& tag)
+ Elem(Elem& par, cm::string_view tag)
: S(par.S)
, Indent(par.Indent + 1)
- , Tag(tag)
+ , Tag(std::string(tag))
{
par.SetHasElements();
this->StartElement();
@@ -78,22 +80,22 @@ struct cmVisualStudio10TargetGenerator::Elem
}
std::ostream& WriteString(const char* line);
void StartElement() { this->WriteString("<") << this->Tag; }
- void Element(const std::string& tag, const std::string& val)
+ void Element(cm::string_view tag, std::string val)
{
- Elem(*this, tag).Content(val);
+ Elem(*this, tag).Content(std::move(val));
}
- Elem& Attribute(const char* an, const std::string& av)
+ Elem& Attribute(const char* an, std::string av)
{
- this->S << " " << an << "=\"" << cmVS10EscapeAttr(av) << "\"";
+ this->S << " " << an << "=\"" << cmVS10EscapeAttr(std::move(av)) << "\"";
return *this;
}
- void Content(const std::string& val)
+ void Content(std::string val)
{
if (!this->HasContent) {
this->S << ">";
this->HasContent = true;
}
- this->S << cmVS10EscapeXML(val);
+ this->S << cmVS10EscapeXML(std::move(val));
}
~Elem()
{
@@ -246,6 +248,7 @@ cmVisualStudio10TargetGenerator::cmVisualStudio10TargetGenerator(
this->LocalGenerator->GetTargetDirectory(this->GeneratorTarget);
this->InSourceBuild = (this->Makefile->GetCurrentSourceDirectory() ==
this->Makefile->GetCurrentBinaryDirectory());
+ this->ClassifyAllConfigSources();
}
cmVisualStudio10TargetGenerator::~cmVisualStudio10TargetGenerator()
@@ -429,32 +432,32 @@ void cmVisualStudio10TargetGenerator::Generate()
this->VerifyNecessaryFiles();
}
- const char* vsProjectTypes =
+ cmProp vsProjectTypes =
this->GeneratorTarget->GetProperty("VS_GLOBAL_PROJECT_TYPES");
if (vsProjectTypes) {
const char* tagName = "ProjectTypes";
if (this->ProjectType == csproj) {
tagName = "ProjectTypeGuids";
}
- e1.Element(tagName, vsProjectTypes);
+ e1.Element(tagName, *vsProjectTypes);
}
- const char* vsProjectName =
+ cmProp vsProjectName =
this->GeneratorTarget->GetProperty("VS_SCC_PROJECTNAME");
- const char* vsLocalPath =
+ cmProp vsLocalPath =
this->GeneratorTarget->GetProperty("VS_SCC_LOCALPATH");
- const char* vsProvider =
+ cmProp vsProvider =
this->GeneratorTarget->GetProperty("VS_SCC_PROVIDER");
if (vsProjectName && vsLocalPath && vsProvider) {
- e1.Element("SccProjectName", vsProjectName);
- e1.Element("SccLocalPath", vsLocalPath);
- e1.Element("SccProvider", vsProvider);
+ e1.Element("SccProjectName", *vsProjectName);
+ e1.Element("SccLocalPath", *vsLocalPath);
+ e1.Element("SccProvider", *vsProvider);
- const char* vsAuxPath =
+ cmProp vsAuxPath =
this->GeneratorTarget->GetProperty("VS_SCC_AUXPATH");
if (vsAuxPath) {
- e1.Element("SccAuxPath", vsAuxPath);
+ e1.Element("SccAuxPath", *vsAuxPath);
}
}
@@ -462,45 +465,44 @@ void cmVisualStudio10TargetGenerator::Generate()
e1.Element("WinMDAssembly", "true");
}
- const char* vsGlobalKeyword =
+ cmProp vsGlobalKeyword =
this->GeneratorTarget->GetProperty("VS_GLOBAL_KEYWORD");
if (!vsGlobalKeyword) {
e1.Element("Keyword", "Win32Proj");
} else {
- e1.Element("Keyword", vsGlobalKeyword);
+ e1.Element("Keyword", *vsGlobalKeyword);
}
- const char* vsGlobalRootNamespace =
+ cmProp vsGlobalRootNamespace =
this->GeneratorTarget->GetProperty("VS_GLOBAL_ROOTNAMESPACE");
if (vsGlobalRootNamespace) {
- e1.Element("RootNamespace", vsGlobalRootNamespace);
+ e1.Element("RootNamespace", *vsGlobalRootNamespace);
}
e1.Element("Platform", this->Platform);
- const char* projLabel =
- this->GeneratorTarget->GetProperty("PROJECT_LABEL");
+ cmProp projLabel = this->GeneratorTarget->GetProperty("PROJECT_LABEL");
if (!projLabel) {
- projLabel = this->Name.c_str();
+ projLabel = &this->Name;
}
- e1.Element("ProjectName", projLabel);
+ e1.Element("ProjectName", *projLabel);
{
- const char* targetFramework =
+ cmProp targetFramework =
this->GeneratorTarget->GetProperty("DOTNET_TARGET_FRAMEWORK");
if (targetFramework) {
- if (std::strchr(targetFramework, ';') != nullptr) {
- e1.Element("TargetFrameworks", targetFramework);
+ if (std::strchr(targetFramework->c_str(), ';') != nullptr) {
+ e1.Element("TargetFrameworks", *targetFramework);
} else {
- e1.Element("TargetFramework", targetFramework);
+ e1.Element("TargetFramework", *targetFramework);
}
} else {
// TODO: add deprecation warning for VS_* property?
- const char* targetFrameworkVersion =
- this->GeneratorTarget->GetProperty(
- "VS_DOTNET_TARGET_FRAMEWORK_VERSION");
- if (!targetFrameworkVersion) {
- targetFrameworkVersion = this->GeneratorTarget->GetProperty(
+ cmProp p = this->GeneratorTarget->GetProperty(
+ "VS_DOTNET_TARGET_FRAMEWORK_VERSION");
+ if (!p) {
+ p = this->GeneratorTarget->GetProperty(
"DOTNET_TARGET_FRAMEWORK_VERSION");
}
+ const char* targetFrameworkVersion = p ? p->c_str() : nullptr;
if (!targetFrameworkVersion && this->ProjectType == csproj &&
this->GlobalGenerator->TargetsWindowsCE() &&
this->GlobalGenerator->GetVersion() ==
@@ -519,18 +521,15 @@ void cmVisualStudio10TargetGenerator::Generate()
}
if (this->ProjectType == csproj &&
this->GlobalGenerator->TargetsWindowsCE()) {
- const char* targetFrameworkId = this->GeneratorTarget->GetProperty(
+ cmProp targetFrameworkId = this->GeneratorTarget->GetProperty(
"VS_TARGET_FRAMEWORK_IDENTIFIER");
- if (!targetFrameworkId) {
- targetFrameworkId = "WindowsEmbeddedCompact";
- }
- e1.Element("TargetFrameworkIdentifier", targetFrameworkId);
- const char* targetFrameworkVer = this->GeneratorTarget->GetProperty(
+ e1.Element("TargetFrameworkIdentifier",
+ targetFrameworkId ? *targetFrameworkId
+ : "WindowsEmbeddedCompact");
+ cmProp targetFrameworkVer = this->GeneratorTarget->GetProperty(
"VS_TARGET_FRAMEWORKS_TARGET_VERSION");
- if (!targetFrameworkVer) {
- targetFrameworkVer = "v8.0";
- }
- e1.Element("TargetFrameworkTargetsVersion", targetFrameworkVer);
+ e1.Element("TargetFrameworkTargetsVersion",
+ targetFrameworkVer ? *targetFrameworkVer : "v8.0");
}
if (!this->GlobalGenerator->GetPlatformToolsetCudaCustomDirString()
.empty()) {
@@ -556,19 +555,20 @@ void cmVisualStudio10TargetGenerator::Generate()
std::vector<std::string> keys = this->GeneratorTarget->GetPropertyKeys();
for (std::string const& keyIt : keys) {
- static const char* prefix = "VS_GLOBAL_";
- if (keyIt.find(prefix) != 0)
+ static const cm::string_view prefix = "VS_GLOBAL_";
+ if (!cmHasPrefix(keyIt, prefix))
continue;
- std::string globalKey = keyIt.substr(strlen(prefix));
+ cm::string_view globalKey =
+ cm::string_view(keyIt).substr(prefix.length());
// Skip invalid or separately-handled properties.
if (globalKey.empty() || globalKey == "PROJECT_TYPES" ||
globalKey == "ROOTNAMESPACE" || globalKey == "KEYWORD") {
continue;
}
- const char* value = this->GeneratorTarget->GetProperty(keyIt);
+ cmProp value = this->GeneratorTarget->GetProperty(keyIt);
if (!value)
continue;
- e1.Element(globalKey, value);
+ e1.Element(globalKey, *value);
}
if (this->Managed) {
@@ -673,9 +673,8 @@ void cmVisualStudio10TargetGenerator::Generate()
props = VS10_CSharp_USER_PROPS;
break;
}
- if (const char* p =
- this->GeneratorTarget->GetProperty("VS_USER_PROPS")) {
- props = p;
+ if (cmProp p = this->GeneratorTarget->GetProperty("VS_USER_PROPS")) {
+ props = *p;
}
if (!props.empty()) {
ConvertToWindowsSlash(props);
@@ -781,50 +780,41 @@ void cmVisualStudio10TargetGenerator::Generate()
void cmVisualStudio10TargetGenerator::WritePackageReferences(Elem& e0)
{
std::vector<std::string> packageReferences;
- if (const char* vsPackageReferences =
+ if (cmProp vsPackageReferences =
this->GeneratorTarget->GetProperty("VS_PACKAGE_REFERENCES")) {
- cmExpandList(vsPackageReferences, packageReferences);
+ cmExpandList(*vsPackageReferences, packageReferences);
}
if (!packageReferences.empty()) {
Elem e1(e0, "ItemGroup");
for (std::string const& ri : packageReferences) {
size_t versionIndex = ri.find_last_of('_');
if (versionIndex != std::string::npos) {
- WritePackageReference(e1, ri.substr(0, versionIndex),
- ri.substr(versionIndex + 1));
+ Elem e2(e1, "PackageReference");
+ e2.Attribute("Include", ri.substr(0, versionIndex));
+ e2.Attribute("Version", ri.substr(versionIndex + 1));
}
}
}
}
-void cmVisualStudio10TargetGenerator::WritePackageReference(
- Elem& e1, std::string const& ref, std::string const& version)
-{
- Elem e2(e1, "PackageReference");
- e2.Attribute("Include", ref);
- e2.Attribute("Version", version);
-}
-
void cmVisualStudio10TargetGenerator::WriteDotNetReferences(Elem& e0)
{
std::vector<std::string> references;
- if (const char* vsDotNetReferences =
+ if (cmProp vsDotNetReferences =
this->GeneratorTarget->GetProperty("VS_DOTNET_REFERENCES")) {
- cmExpandList(vsDotNetReferences, references);
+ cmExpandList(*vsDotNetReferences, references);
}
cmPropertyMap const& props = this->GeneratorTarget->Target->GetProperties();
for (auto const& i : props.GetList()) {
- if (i.first.find("VS_DOTNET_REFERENCE_") == 0) {
- std::string name = i.first.substr(20);
- if (!name.empty()) {
- std::string path = i.second;
- if (!cmsys::SystemTools::FileIsFullPath(path)) {
- path = this->Makefile->GetCurrentSourceDirectory() + "/" + path;
- }
- ConvertToWindowsSlash(path);
- this->DotNetHintReferences[""].push_back(
- DotNetHintReference(name, path));
+ static const cm::string_view vsDnRef = "VS_DOTNET_REFERENCE_";
+ if (cmHasPrefix(i.first, vsDnRef)) {
+ std::string path = i.second;
+ if (!cmsys::SystemTools::FileIsFullPath(path)) {
+ path = this->Makefile->GetCurrentSourceDirectory() + "/" + path;
}
+ ConvertToWindowsSlash(path);
+ this->DotNetHintReferences[""].emplace_back(
+ DotNetHintReference(i.first.substr(vsDnRef.length()), path));
}
}
if (!references.empty() || !this->DotNetHintReferences.empty()) {
@@ -837,7 +827,7 @@ void cmVisualStudio10TargetGenerator::WriteDotNetReferences(Elem& e0)
cmsys::SystemTools::GetFilenameWithoutLastExtension(ri);
std::string path = ri;
ConvertToWindowsSlash(path);
- this->DotNetHintReferences[""].push_back(
+ this->DotNetHintReferences[""].emplace_back(
DotNetHintReference(name, path));
} else {
this->WriteDotNetReference(e1, ri, "", "");
@@ -869,9 +859,9 @@ void cmVisualStudio10TargetGenerator::WriteDotNetReference(
e2.Element("ReferenceOutputAssembly", "true");
if (!hint.empty()) {
const char* privateReference = "True";
- if (const char* value = this->GeneratorTarget->GetProperty(
+ if (cmProp value = this->GeneratorTarget->GetProperty(
"VS_DOTNET_REFERENCES_COPY_LOCAL")) {
- if (cmIsOff(value)) {
+ if (cmIsOff(*value)) {
privateReference = "False";
}
}
@@ -883,11 +873,10 @@ void cmVisualStudio10TargetGenerator::WriteDotNetReference(
void cmVisualStudio10TargetGenerator::WriteImports(Elem& e0)
{
- const char* imports =
+ cmProp imports =
this->GeneratorTarget->Target->GetProperty("VS_PROJECT_IMPORT");
if (imports) {
- std::vector<std::string> argsSplit =
- cmExpandedList(std::string(imports), false);
+ std::vector<std::string> argsSplit = cmExpandedList(*imports, false);
for (auto& path : argsSplit) {
if (!cmsys::SystemTools::FileIsFullPath(path)) {
path = this->Makefile->GetCurrentSourceDirectory() + "/" + path;
@@ -910,12 +899,8 @@ void cmVisualStudio10TargetGenerator::WriteDotNetReferenceCustomTags(
CustomTags tags;
cmPropertyMap const& props = this->GeneratorTarget->Target->GetProperties();
for (const auto& i : props.GetList()) {
- if (i.first.find(refPropFullPrefix) == 0) {
- std::string refTag = i.first.substr(refPropFullPrefix.length());
- std::string refVal = i.second;
- if (!refTag.empty() && !refVal.empty()) {
- tags[refTag] = refVal;
- }
+ if (cmHasPrefix(i.first, refPropFullPrefix) && !i.second.empty()) {
+ tags[i.first.substr(refPropFullPrefix.length())] = i.second;
}
}
for (auto const& tag : tags) {
@@ -925,7 +910,7 @@ void cmVisualStudio10TargetGenerator::WriteDotNetReferenceCustomTags(
void cmVisualStudio10TargetGenerator::WriteDotNetDocumentationFile(Elem& e0)
{
- std::string const documentationFile =
+ std::string const& documentationFile =
this->GeneratorTarget->GetSafeProperty("VS_DOTNET_DOCUMENTATION_FILE");
if (this->ProjectType == csproj && !documentationFile.empty()) {
@@ -937,13 +922,11 @@ void cmVisualStudio10TargetGenerator::WriteDotNetDocumentationFile(Elem& e0)
void cmVisualStudio10TargetGenerator::WriteEmbeddedResourceGroup(Elem& e0)
{
- std::vector<cmSourceFile const*> resxObjs;
- this->GeneratorTarget->GetResxSources(resxObjs, "");
- if (!resxObjs.empty()) {
+ if (!this->ResxObjs.empty()) {
Elem e1(e0, "ItemGroup");
std::string srcDir = this->Makefile->GetCurrentSourceDirectory();
ConvertToWindowsSlash(srcDir);
- for (cmSourceFile const* oi : resxObjs) {
+ for (cmSourceFile const* oi : this->ResxObjs) {
std::string obj = oi->GetFullPath();
ConvertToWindowsSlash(obj);
bool useRelativePath = false;
@@ -952,7 +935,7 @@ void cmVisualStudio10TargetGenerator::WriteEmbeddedResourceGroup(Elem& e0)
// subdirectory
// of the .csproj file, we have to use relative pathnames, otherwise
// visual studio does not show the file in the IDE. Sorry.
- if (obj.find(srcDir) == 0) {
+ if (cmHasPrefix(obj, srcDir)) {
obj = this->ConvertPath(obj, true);
ConvertToWindowsSlash(obj);
useRelativePath = true;
@@ -981,17 +964,11 @@ void cmVisualStudio10TargetGenerator::WriteEmbeddedResourceGroup(Elem& e0)
// If the resource was NOT added using a relative path (which should
// be the default), we have to provide a link here
if (!useRelativePath) {
- std::string link;
- if (obj.find(srcDir) == 0) {
- link = obj.substr(srcDir.length() + 1);
- } else if (obj.find(binDir) == 0) {
- link = obj.substr(binDir.length() + 1);
- } else {
+ std::string link = this->GetCSharpSourceLink(oi);
+ if (link.empty()) {
link = cmsys::SystemTools::GetFilenameName(obj);
}
- if (!link.empty()) {
- e2.Element("Link", link);
- }
+ e2.Element("Link", link);
}
// Determine if this is a generated resource from a .Designer.cs file
std::string designerResource =
@@ -1000,15 +977,15 @@ void cmVisualStudio10TargetGenerator::WriteEmbeddedResourceGroup(Elem& e0)
".Designer.cs";
if (cmsys::SystemTools::FileExists(designerResource)) {
std::string generator = "PublicResXFileCodeGenerator";
- if (const char* g = oi->GetProperty("VS_RESOURCE_GENERATOR")) {
- generator = g;
+ if (cmProp g = oi->GetProperty("VS_RESOURCE_GENERATOR")) {
+ generator = *g;
}
if (!generator.empty()) {
e2.Element("Generator", generator);
- if (designerResource.find(srcDir) == 0) {
- designerResource = designerResource.substr(srcDir.length() + 1);
- } else if (designerResource.find(binDir) == 0) {
- designerResource = designerResource.substr(binDir.length() + 1);
+ if (cmHasPrefix(designerResource, srcDir)) {
+ designerResource.erase(0, srcDir.length());
+ } else if (cmHasPrefix(designerResource, binDir)) {
+ designerResource.erase(0, binDir.length());
} else {
designerResource =
cmsys::SystemTools::GetFilenameName(designerResource);
@@ -1019,11 +996,12 @@ void cmVisualStudio10TargetGenerator::WriteEmbeddedResourceGroup(Elem& e0)
}
const cmPropertyMap& props = oi->GetProperties();
for (const std::string& p : props.GetKeys()) {
- static const std::string propNamePrefix = "VS_CSHARP_";
- if (p.find(propNamePrefix) == 0) {
- std::string tagName = p.substr(propNamePrefix.length());
+ static const cm::string_view propNamePrefix = "VS_CSHARP_";
+ if (cmHasPrefix(p, propNamePrefix)) {
+ cm::string_view tagName =
+ cm::string_view(p).substr(propNamePrefix.length());
if (!tagName.empty()) {
- std::string value = props.GetPropertyValue(p);
+ const std::string& value = *props.GetPropertyValue(p);
if (!value.empty()) {
e2.Element(tagName, value);
}
@@ -1037,16 +1015,14 @@ void cmVisualStudio10TargetGenerator::WriteEmbeddedResourceGroup(Elem& e0)
void cmVisualStudio10TargetGenerator::WriteXamlFilesGroup(Elem& e0)
{
- std::vector<cmSourceFile const*> xamlObjs;
- this->GeneratorTarget->GetXamlSources(xamlObjs, "");
- if (!xamlObjs.empty()) {
+ if (!this->XamlObjs.empty()) {
Elem e1(e0, "ItemGroup");
- for (cmSourceFile const* oi : xamlObjs) {
+ for (cmSourceFile const* oi : this->XamlObjs) {
std::string obj = oi->GetFullPath();
- const char* xamlType;
- const char* xamlTypeProperty = oi->GetProperty("VS_XAML_TYPE");
+ std::string xamlType;
+ cmProp xamlTypeProperty = oi->GetProperty("VS_XAML_TYPE");
if (xamlTypeProperty) {
- xamlType = xamlTypeProperty;
+ xamlType = *xamlTypeProperty;
} else {
xamlType = "Page";
}
@@ -1054,25 +1030,6 @@ void cmVisualStudio10TargetGenerator::WriteXamlFilesGroup(Elem& e0)
Elem e2(e1, xamlType);
this->WriteSource(e2, oi);
e2.SetHasElements();
- if (this->ProjectType == csproj && !this->InSourceBuild) {
- // add <Link> tag to written XAML source if necessary
- const std::string& srcDir =
- this->Makefile->GetCurrentSourceDirectory();
- const std::string& binDir =
- this->Makefile->GetCurrentBinaryDirectory();
- std::string link;
- if (obj.find(srcDir) == 0) {
- link = obj.substr(srcDir.length() + 1);
- } else if (obj.find(binDir) == 0) {
- link = obj.substr(binDir.length() + 1);
- } else {
- link = cmsys::SystemTools::GetFilenameName(obj);
- }
- if (!link.empty()) {
- ConvertToWindowsSlash(link);
- e2.Element("Link", link);
- }
- }
e2.Element("SubType", "Designer");
}
}
@@ -1117,9 +1074,9 @@ void cmVisualStudio10TargetGenerator::WriteTargetsFileReferences(Elem& e1)
void cmVisualStudio10TargetGenerator::WriteWinRTReferences(Elem& e0)
{
std::vector<std::string> references;
- if (const char* vsWinRTReferences =
+ if (cmProp vsWinRTReferences =
this->GeneratorTarget->GetProperty("VS_WINRT_REFERENCES")) {
- cmExpandList(vsWinRTReferences, references);
+ cmExpandList(*vsWinRTReferences, references);
}
if (this->GlobalGenerator->TargetsWindowsPhone() &&
@@ -1160,9 +1117,9 @@ void cmVisualStudio10TargetGenerator::WriteProjectConfigurationValues(Elem& e0)
if (this->ProjectType != csproj) {
std::string configType;
- if (const char* vsConfigurationType =
+ if (cmProp vsConfigurationType =
this->GeneratorTarget->GetProperty("VS_CONFIGURATION_TYPE")) {
- configType = cmGeneratorExpression::Evaluate(vsConfigurationType,
+ configType = cmGeneratorExpression::Evaluate(*vsConfigurationType,
this->LocalGenerator, c);
} else {
switch (this->GeneratorTarget->GetType()) {
@@ -1218,9 +1175,9 @@ void cmVisualStudio10TargetGenerator::WriteCEDebugProjectConfigurationValues(
if (!this->GlobalGenerator->TargetsWindowsCE()) {
return;
}
- const char* additionalFiles =
+ cmProp additionalFiles =
this->GeneratorTarget->GetProperty("DEPLOYMENT_ADDITIONAL_FILES");
- const char* remoteDirectory =
+ cmProp remoteDirectory =
this->GeneratorTarget->GetProperty("DEPLOYMENT_REMOTE_DIRECTORY");
if (!(additionalFiles || remoteDirectory)) {
return;
@@ -1230,10 +1187,10 @@ void cmVisualStudio10TargetGenerator::WriteCEDebugProjectConfigurationValues(
e1.Attribute("Condition", this->CalcCondition(c));
if (remoteDirectory) {
- e1.Element("RemoteDirectory", remoteDirectory);
+ e1.Element("RemoteDirectory", *remoteDirectory);
}
if (additionalFiles) {
- e1.Element("CEAdditionalFiles", additionalFiles);
+ e1.Element("CEAdditionalFiles", *additionalFiles);
}
}
}
@@ -1271,7 +1228,10 @@ void cmVisualStudio10TargetGenerator::WriteMSToolConfigurationValues(
} else {
e1.Element("CharacterSet", "MultiByte");
}
- if (const char* toolset = gg->GetPlatformToolset()) {
+ if (cmProp projectToolsetOverride =
+ this->GeneratorTarget->GetProperty("VS_PLATFORM_TOOLSET")) {
+ e1.Element("PlatformToolset", *projectToolsetOverride);
+ } else if (const char* toolset = gg->GetPlatformToolset()) {
e1.Element("PlatformToolset", toolset);
}
if (this->GeneratorTarget->GetPropertyAsBool("VS_WINRT_COMPONENT") ||
@@ -1314,7 +1274,10 @@ void cmVisualStudio10TargetGenerator::WriteMSToolConfigurationValuesManaged(
o.RemoveFlag("Platform");
}
- if (const char* toolset = gg->GetPlatformToolset()) {
+ if (cmProp projectToolsetOverride =
+ this->GeneratorTarget->GetProperty("VS_PLATFORM_TOOLSET")) {
+ e1.Element("PlatformToolset", *projectToolsetOverride);
+ } else if (const char* toolset = gg->GetPlatformToolset()) {
e1.Element("PlatformToolset", toolset);
}
@@ -1322,8 +1285,8 @@ void cmVisualStudio10TargetGenerator::WriteMSToolConfigurationValuesManaged(
cmStrCat(cmSystemTools::UpperCase(config), "_POSTFIX");
std::string assemblyName = this->GeneratorTarget->GetOutputName(
config, cmStateEnums::RuntimeBinaryArtifact);
- if (const char* postfix = this->GeneratorTarget->GetProperty(postfixName)) {
- assemblyName += postfix;
+ if (cmProp postfix = this->GeneratorTarget->GetProperty(postfixName)) {
+ assemblyName += *postfix;
}
e1.Element("AssemblyName", assemblyName);
@@ -1343,43 +1306,47 @@ void cmVisualStudio10TargetGenerator::WriteNsightTegraConfigurationValues(
cmGlobalVisualStudio10Generator* gg = this->GlobalGenerator;
const char* toolset = gg->GetPlatformToolset();
e1.Element("NdkToolchainVersion", toolset ? toolset : "Default");
- if (const char* minApi =
- this->GeneratorTarget->GetProperty("ANDROID_API_MIN")) {
- e1.Element("AndroidMinAPI", "android-" + std::string(minApi));
+ if (cmProp minApi = this->GeneratorTarget->GetProperty("ANDROID_API_MIN")) {
+ e1.Element("AndroidMinAPI", "android-" + *minApi);
}
- if (const char* api = this->GeneratorTarget->GetProperty("ANDROID_API")) {
- e1.Element("AndroidTargetAPI", "android-" + std::string(api));
+ if (cmProp api = this->GeneratorTarget->GetProperty("ANDROID_API")) {
+ e1.Element("AndroidTargetAPI", "android-" + *api);
}
- if (const char* cpuArch =
- this->GeneratorTarget->GetProperty("ANDROID_ARCH")) {
- e1.Element("AndroidArch", cpuArch);
+ if (cmProp cpuArch = this->GeneratorTarget->GetProperty("ANDROID_ARCH")) {
+ e1.Element("AndroidArch", *cpuArch);
}
- if (const char* stlType =
+ if (cmProp stlType =
this->GeneratorTarget->GetProperty("ANDROID_STL_TYPE")) {
- e1.Element("AndroidStlType", stlType);
+ e1.Element("AndroidStlType", *stlType);
}
}
void cmVisualStudio10TargetGenerator::WriteCustomCommands(Elem& e0)
{
this->CSharpCustomCommandNames.clear();
- std::vector<cmSourceFile const*> customCommands;
- this->GeneratorTarget->GetCustomCommands(customCommands, "");
- for (cmSourceFile const* si : customCommands) {
- this->WriteCustomCommand(e0, si);
+
+ cmSourceFile const* srcCMakeLists =
+ this->LocalGenerator->CreateVCProjBuildRule();
+
+ for (cmGeneratorTarget::AllConfigSource const& si :
+ this->GeneratorTarget->GetAllConfigSources()) {
+ if (si.Source == srcCMakeLists) {
+ // Skip explicit reference to CMakeLists.txt source.
+ continue;
+ }
+ this->WriteCustomCommand(e0, si.Source);
}
// Add CMakeLists.txt file with rule to re-run CMake for user convenience.
if (this->GeneratorTarget->GetType() != cmStateEnums::GLOBAL_TARGET &&
this->GeneratorTarget->GetName() != CMAKE_CHECK_BUILD_SYSTEM_TARGET) {
- if (cmSourceFile const* sf =
- this->LocalGenerator->CreateVCProjBuildRule()) {
+ if (srcCMakeLists) {
// Write directly rather than through WriteCustomCommand because
// we do not want the de-duplication and it has no dependencies.
- if (cmCustomCommand const* command = sf->GetCustomCommand()) {
- this->WriteCustomRule(e0, sf, *command);
+ if (cmCustomCommand const* command = srcCMakeLists->GetCustomCommand()) {
+ this->WriteCustomRule(e0, srcCMakeLists, *command);
}
}
}
@@ -1439,16 +1406,14 @@ void cmVisualStudio10TargetGenerator::WriteCustomRule(
spe2 = cm::make_unique<Elem>(*spe1, "CustomBuild");
this->WriteSource(*spe2, source);
spe2->SetHasElements();
+ if (command.GetStdPipesUTF8()) {
+ this->WriteStdOutEncodingUtf8(*spe2);
+ }
} else {
Elem e1(e0, "ItemGroup");
Elem e2(e1, "None");
- std::string link;
- this->GetCSharpSourceLink(source, link);
this->WriteSource(e2, source);
e2.SetHasElements();
- if (!link.empty()) {
- e2.Element("Link", link);
- }
}
for (std::string const& c : this->Configurations) {
cmCustomCommandGenerator ccg(command, c, lg);
@@ -1662,11 +1627,9 @@ void cmVisualStudio10TargetGenerator::WriteGroups()
}
}
- std::vector<cmSourceFile const*> resxObjs;
- this->GeneratorTarget->GetResxSources(resxObjs, "");
- if (!resxObjs.empty()) {
+ if (!this->ResxObjs.empty()) {
Elem e1(e0, "ItemGroup");
- for (cmSourceFile const* oi : resxObjs) {
+ for (cmSourceFile const* oi : this->ResxObjs) {
std::string obj = oi->GetFullPath();
ConvertToWindowsSlash(obj);
Elem e2(e1, "EmbeddedResource");
@@ -1694,7 +1657,7 @@ void cmVisualStudio10TargetGenerator::WriteGroups()
}
}
- if (!resxObjs.empty() || !this->AddedFiles.empty()) {
+ if (!this->ResxObjs.empty() || !this->AddedFiles.empty()) {
std::string guidName = "SG_Filter_Resource Files";
std::string guid = this->GlobalGenerator->GetGUID(guidName);
Elem e2(e1, "Filter");
@@ -1779,9 +1742,63 @@ void cmVisualStudio10TargetGenerator::WriteHeaderSource(Elem& e1,
if (this->IsResxHeader(fileName)) {
e2.Element("FileType", "CppForm");
} else if (this->IsXamlHeader(fileName)) {
- std::string xamlFileName = fileName.substr(0, fileName.find_last_of("."));
- e2.Element("DependentUpon", xamlFileName);
+ e2.Element("DependentUpon",
+ fileName.substr(0, fileName.find_last_of(".")));
+ }
+}
+
+void cmVisualStudio10TargetGenerator::ParseSettingsProperty(
+ const std::string& settingsPropertyValue, ConfigToSettings& toolSettings)
+{
+ if (!settingsPropertyValue.empty()) {
+ cmGeneratorExpression ge;
+
+ std::unique_ptr<cmCompiledGeneratorExpression> cge =
+ ge.Parse(settingsPropertyValue);
+
+ for (const std::string& config : this->Configurations) {
+ std::string evaluated = cge->Evaluate(this->LocalGenerator, config);
+
+ std::vector<std::string> settings = cmExpandedList(evaluated);
+ for (const std::string& setting : settings) {
+ const std::string::size_type assignment = setting.find('=');
+ if (assignment != std::string::npos) {
+ const std::string propName = setting.substr(0, assignment);
+ const std::string propValue = setting.substr(assignment + 1);
+
+ if (!propValue.empty()) {
+ toolSettings[config][propName] = propValue;
+ }
+ }
+ }
+ }
+ }
+}
+
+bool cmVisualStudio10TargetGenerator::PropertyIsSameInAllConfigs(
+ const ConfigToSettings& toolSettings, const std::string& propName)
+{
+ std::string firstPropValue = "";
+ for (const auto& configToSettings : toolSettings) {
+ const std::unordered_map<std::string, std::string>& settings =
+ configToSettings.second;
+
+ if (firstPropValue.empty()) {
+ if (settings.find(propName) != settings.end()) {
+ firstPropValue = settings.find(propName)->second;
+ }
+ }
+
+ if (settings.find(propName) == settings.end()) {
+ return false;
+ }
+
+ if (settings.find(propName)->second != firstPropValue) {
+ return false;
+ }
}
+
+ return true;
}
void cmVisualStudio10TargetGenerator::WriteExtraSource(Elem& e1,
@@ -1789,15 +1806,6 @@ void cmVisualStudio10TargetGenerator::WriteExtraSource(Elem& e1,
{
bool toolHasSettings = false;
const char* tool = "None";
- std::string shaderType;
- std::string shaderEntryPoint;
- std::string shaderModel;
- std::string shaderAdditionalFlags;
- std::string shaderDisableOptimizations;
- std::string shaderEnableDebug;
- std::string shaderObjectFileName;
- std::string outputHeaderFile;
- std::string variableName;
std::string settingsGenerator;
std::string settingsLastGenOutput;
std::string sourceLink;
@@ -1805,76 +1813,84 @@ void cmVisualStudio10TargetGenerator::WriteExtraSource(Elem& e1,
std::string copyToOutDir;
std::string includeInVsix;
std::string ext = cmSystemTools::LowerCase(sf->GetExtension());
- if (this->ProjectType == csproj) {
- // EVERY extra source file must have a <Link>, otherwise it might not
- // be visible in Visual Studio at all. The path relative to current
- // source- or binary-dir is used within the link, if the file is
- // in none of these paths, it is added with the plain filename without
- // any path. This means the file will show up at root-level of the csproj
- // (where CMakeLists.txt etc. are).
- if (!this->InSourceBuild) {
- toolHasSettings = true;
- std::string fullFileName = sf->GetFullPath();
- std::string srcDir = this->Makefile->GetCurrentSourceDirectory();
- std::string binDir = this->Makefile->GetCurrentBinaryDirectory();
- if (fullFileName.find(binDir) != std::string::npos) {
- sourceLink.clear();
- } else if (fullFileName.find(srcDir) != std::string::npos) {
- sourceLink = fullFileName.substr(srcDir.length() + 1);
- } else {
- // fallback: add plain filename without any path
- sourceLink = cmsys::SystemTools::GetFilenameName(fullFileName);
- }
- if (!sourceLink.empty()) {
- ConvertToWindowsSlash(sourceLink);
- }
- }
+ ConfigToSettings toolSettings;
+ for (const auto& config : this->Configurations) {
+ toolSettings[config];
+ }
+
+ if (this->ProjectType == csproj && !this->InSourceBuild) {
+ toolHasSettings = true;
}
if (ext == "hlsl") {
tool = "FXCompile";
// Figure out the type of shader compiler to use.
- if (const char* st = sf->GetProperty("VS_SHADER_TYPE")) {
- shaderType = st;
- toolHasSettings = true;
+ if (cmProp st = sf->GetProperty("VS_SHADER_TYPE")) {
+ for (const std::string& config : this->Configurations) {
+ toolSettings[config]["ShaderType"] = *st;
+ }
}
// Figure out which entry point to use if any
- if (const char* se = sf->GetProperty("VS_SHADER_ENTRYPOINT")) {
- shaderEntryPoint = se;
- toolHasSettings = true;
+ if (cmProp se = sf->GetProperty("VS_SHADER_ENTRYPOINT")) {
+ for (const std::string& config : this->Configurations) {
+ toolSettings[config]["EntryPointName"] = *se;
+ }
}
// Figure out which shader model to use if any
- if (const char* sm = sf->GetProperty("VS_SHADER_MODEL")) {
- shaderModel = sm;
- toolHasSettings = true;
+ if (cmProp sm = sf->GetProperty("VS_SHADER_MODEL")) {
+ for (const std::string& config : this->Configurations) {
+ toolSettings[config]["ShaderModel"] = *sm;
+ }
}
// Figure out which output header file to use if any
- if (const char* ohf = sf->GetProperty("VS_SHADER_OUTPUT_HEADER_FILE")) {
- outputHeaderFile = ohf;
- toolHasSettings = true;
+ if (cmProp ohf = sf->GetProperty("VS_SHADER_OUTPUT_HEADER_FILE")) {
+ for (const std::string& config : this->Configurations) {
+ toolSettings[config]["HeaderFileOutput"] = *ohf;
+ }
}
// Figure out which variable name to use if any
- if (const char* vn = sf->GetProperty("VS_SHADER_VARIABLE_NAME")) {
- variableName = vn;
- toolHasSettings = true;
+ if (cmProp vn = sf->GetProperty("VS_SHADER_VARIABLE_NAME")) {
+ for (const std::string& config : this->Configurations) {
+ toolSettings[config]["VariableName"] = *vn;
+ }
}
// Figure out if there's any additional flags to use
- if (const char* saf = sf->GetProperty("VS_SHADER_FLAGS")) {
- shaderAdditionalFlags = saf;
- toolHasSettings = true;
+ if (cmProp saf = sf->GetProperty("VS_SHADER_FLAGS")) {
+ for (const std::string& config : this->Configurations) {
+ toolSettings[config]["AdditionalOptions"] = *saf;
+ }
}
// Figure out if debug information should be generated
- if (const char* sed = sf->GetProperty("VS_SHADER_ENABLE_DEBUG")) {
- shaderEnableDebug = sed;
- toolHasSettings = true;
+ if (cmProp sed = sf->GetProperty("VS_SHADER_ENABLE_DEBUG")) {
+ cmGeneratorExpression ge;
+ std::unique_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(*sed);
+
+ for (const std::string& config : this->Configurations) {
+ std::string evaluated = cge->Evaluate(this->LocalGenerator, config);
+
+ if (!evaluated.empty()) {
+ toolSettings[config]["EnableDebuggingInformation"] =
+ cmIsOn(evaluated) ? "true" : "false";
+ }
+ }
}
// Figure out if optimizations should be disabled
- if (const char* sdo = sf->GetProperty("VS_SHADER_DISABLE_OPTIMIZATIONS")) {
- shaderDisableOptimizations = sdo;
- toolHasSettings = true;
+ if (cmProp sdo = sf->GetProperty("VS_SHADER_DISABLE_OPTIMIZATIONS")) {
+ cmGeneratorExpression ge;
+ std::unique_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(*sdo);
+
+ for (const std::string& config : this->Configurations) {
+ std::string evaluated = cge->Evaluate(this->LocalGenerator, config);
+
+ if (!evaluated.empty()) {
+ toolSettings[config]["DisableOptimizations"] =
+ cmIsOn(evaluated) ? "true" : "false";
+ }
+ }
}
- if (const char* sofn = sf->GetProperty("VS_SHADER_OBJECT_FILE_NAME")) {
- shaderObjectFileName = sofn;
- toolHasSettings = true;
+ if (cmProp sofn = sf->GetProperty("VS_SHADER_OBJECT_FILE_NAME")) {
+ for (const std::string& config : this->Configurations) {
+ toolSettings[config]["ObjectFileOutput"] = *sofn;
+ }
}
} else if (ext == "jpg" || ext == "png") {
tool = "Image";
@@ -1894,9 +1910,9 @@ void cmVisualStudio10TargetGenerator::WriteExtraSource(Elem& e1,
} else if (ext == "vsixmanifest") {
subType = "Designer";
}
- if (const char* c = sf->GetProperty("VS_COPY_TO_OUT_DIR")) {
+ if (cmProp c = sf->GetProperty("VS_COPY_TO_OUT_DIR")) {
tool = "Content";
- copyToOutDir = c;
+ copyToOutDir = *c;
toolHasSettings = true;
}
if (sf->GetPropertyAsBool("VS_INCLUDE_IN_VSIX")) {
@@ -1923,32 +1939,79 @@ void cmVisualStudio10TargetGenerator::WriteExtraSource(Elem& e1,
}
}
- const char* toolOverride = sf->GetProperty("VS_TOOL_OVERRIDE");
- if (toolOverride && *toolOverride) {
- tool = toolOverride;
+ cmProp toolOverride = sf->GetProperty("VS_TOOL_OVERRIDE");
+ if (toolOverride && !toolOverride->empty()) {
+ tool = toolOverride->c_str();
}
std::string deployContent;
std::string deployLocation;
if (this->GlobalGenerator->TargetsWindowsPhone() ||
this->GlobalGenerator->TargetsWindowsStore()) {
- const char* content = sf->GetProperty("VS_DEPLOYMENT_CONTENT");
- if (content && *content) {
+ cmProp content = sf->GetProperty("VS_DEPLOYMENT_CONTENT");
+ if (content && !content->empty()) {
toolHasSettings = true;
- deployContent = content;
+ deployContent = *content;
- const char* location = sf->GetProperty("VS_DEPLOYMENT_LOCATION");
- if (location && *location) {
- deployLocation = location;
+ cmProp location = sf->GetProperty("VS_DEPLOYMENT_LOCATION");
+ if (location && !location->empty()) {
+ deployLocation = *location;
}
}
}
+ if (ParsedToolTargetSettings.find(tool) == ParsedToolTargetSettings.end()) {
+ cmProp toolTargetProperty = this->GeneratorTarget->Target->GetProperty(
+ "VS_SOURCE_SETTINGS_" + std::string(tool));
+ ConfigToSettings toolTargetSettings;
+ if (toolTargetProperty) {
+ ParseSettingsProperty(*toolTargetProperty, toolTargetSettings);
+ }
+
+ ParsedToolTargetSettings[tool] = toolTargetSettings;
+ }
+
+ for (const auto& configToSetting : ParsedToolTargetSettings[tool]) {
+ for (const auto& setting : configToSetting.second) {
+ toolSettings[configToSetting.first][setting.first] = setting.second;
+ }
+ }
+
+ if (cmProp p = sf->GetProperty("VS_SETTINGS")) {
+ ParseSettingsProperty(*p, toolSettings);
+ }
+
+ if (!toolSettings.empty()) {
+ toolHasSettings = true;
+ }
+
Elem e2(e1, tool);
this->WriteSource(e2, sf);
if (toolHasSettings) {
e2.SetHasElements();
+ std::vector<std::string> writtenSettings;
+ for (const auto& configSettings : toolSettings) {
+ for (const auto& setting : configSettings.second) {
+
+ if (std::find(writtenSettings.begin(), writtenSettings.end(),
+ setting.first) != writtenSettings.end()) {
+ continue;
+ }
+
+ if (PropertyIsSameInAllConfigs(toolSettings, setting.first)) {
+ e2.Element(setting.first, setting.second);
+ writtenSettings.push_back(setting.first);
+ } else {
+ e2.WritePlatformConfigTag(setting.first,
+ "'$(Configuration)|$(Platform)'=='" +
+ configSettings.first + "|" +
+ this->Platform + "'",
+ setting.second);
+ }
+ }
+ }
+
if (!deployContent.empty()) {
cmGeneratorExpression ge;
std::unique_ptr<cmCompiledGeneratorExpression> cge =
@@ -1974,82 +2037,13 @@ void cmVisualStudio10TargetGenerator::WriteExtraSource(Elem& e1,
}
}
}
- if (!shaderType.empty()) {
- e2.Element("ShaderType", shaderType);
- }
- if (!shaderEntryPoint.empty()) {
- e2.Element("EntryPointName", shaderEntryPoint);
- }
- if (!shaderModel.empty()) {
- e2.Element("ShaderModel", shaderModel);
- }
- if (!outputHeaderFile.empty()) {
- for (size_t i = 0; i != this->Configurations.size(); ++i) {
- e2.WritePlatformConfigTag("HeaderFileOutput",
- "'$(Configuration)|$(Platform)'=='" +
- this->Configurations[i] + "|" +
- this->Platform + "'",
- outputHeaderFile);
- }
- }
- if (!variableName.empty()) {
- for (size_t i = 0; i != this->Configurations.size(); ++i) {
- e2.WritePlatformConfigTag("VariableName",
- "'$(Configuration)|$(Platform)'=='" +
- this->Configurations[i] + "|" +
- this->Platform + "'",
- variableName);
- }
- }
- if (!shaderEnableDebug.empty()) {
- cmGeneratorExpression ge;
- std::unique_ptr<cmCompiledGeneratorExpression> cge =
- ge.Parse(shaderEnableDebug);
-
- for (size_t i = 0; i != this->Configurations.size(); ++i) {
- const std::string& enableDebug =
- cge->Evaluate(this->LocalGenerator, this->Configurations[i]);
- if (!enableDebug.empty()) {
- e2.WritePlatformConfigTag("EnableDebuggingInformation",
- "'$(Configuration)|$(Platform)'=='" +
- this->Configurations[i] + "|" +
- this->Platform + "'",
- cmIsOn(enableDebug) ? "true" : "false");
- }
- }
- }
- if (!shaderDisableOptimizations.empty()) {
- cmGeneratorExpression ge;
- std::unique_ptr<cmCompiledGeneratorExpression> cge =
- ge.Parse(shaderDisableOptimizations);
- for (size_t i = 0; i != this->Configurations.size(); ++i) {
- const std::string& disableOptimizations =
- cge->Evaluate(this->LocalGenerator, this->Configurations[i]);
- if (!disableOptimizations.empty()) {
- e2.WritePlatformConfigTag(
- "DisableOptimizations",
- "'$(Configuration)|$(Platform)'=='" + this->Configurations[i] +
- "|" + this->Platform + "'",
- (cmIsOn(disableOptimizations) ? "true" : "false"));
- }
- }
- }
- if (!shaderObjectFileName.empty()) {
- e2.Element("ObjectFileOutput", shaderObjectFileName);
- }
- if (!shaderAdditionalFlags.empty()) {
- e2.Element("AdditionalOptions", shaderAdditionalFlags);
- }
if (!settingsGenerator.empty()) {
e2.Element("Generator", settingsGenerator);
}
if (!settingsLastGenOutput.empty()) {
e2.Element("LastGenOutput", settingsLastGenOutput);
}
- if (!sourceLink.empty()) {
- e2.Element("Link", sourceLink);
- }
if (!subType.empty()) {
e2.Element("SubType", subType);
}
@@ -2102,6 +2096,20 @@ void cmVisualStudio10TargetGenerator::WriteSource(Elem& e2,
ConvertToWindowsSlash(sourceFile);
e2.Attribute("Include", sourceFile);
+ if (this->ProjectType == csproj && !this->InSourceBuild) {
+ // For out of source projects we have to provide a link (if not specified
+ // via property) for every source file (besides .cs files) otherwise they
+ // will not be visible in VS at all.
+ // First we check if the file is in a source group, then we check if the
+ // file path is relative to current source- or binary-dir, otherwise it is
+ // added with the plain filename without any path. This means the file will
+ // show up at root-level of the csproj (where CMakeLists.txt etc. are).
+ std::string link = this->GetCSharpSourceLink(sf);
+ if (link.empty())
+ link = cmsys::SystemTools::GetFilenameName(sf->GetFullPath());
+ e2.Element("Link", link);
+ }
+
ToolSource toolSource = { sf, forceRelative };
this->Tools[e2.Tag].push_back(toolSource);
}
@@ -2202,10 +2210,10 @@ void cmVisualStudio10TargetGenerator::WriteAllSources(Elem& e0)
}
} break;
case cmGeneratorTarget::SourceKindResx:
- // Handled elsewhere.
+ this->ResxObjs.push_back(si.Source);
break;
case cmGeneratorTarget::SourceKindXaml:
- // Handled elsewhere.
+ this->XamlObjs.push_back(si.Source);
break;
}
@@ -2245,7 +2253,7 @@ void cmVisualStudio10TargetGenerator::WriteAllSources(Elem& e0)
e2.Attribute("CustomUnityFile", "true");
std::string unityDir = cmSystemTools::GetFilenamePath(
- si.Source->GetProperty("UNITY_SOURCE_FILE"));
+ *si.Source->GetProperty("UNITY_SOURCE_FILE"));
e2.Attribute("UnityFilesDirectory", unityDir);
} else {
// Visual Studio versions prior to 2017 15.8 do not know about unity
@@ -2290,41 +2298,33 @@ void cmVisualStudio10TargetGenerator::OutputSourceSpecificFlags(
bool configDependentDefines = false;
std::string includes;
bool configDependentIncludes = false;
- if (const char* cflags = sf.GetProperty("COMPILE_FLAGS")) {
+ if (cmProp cflags = sf.GetProperty("COMPILE_FLAGS")) {
configDependentFlags =
- cmGeneratorExpression::Find(cflags) != std::string::npos;
- flags += cflags;
+ cmGeneratorExpression::Find(*cflags) != std::string::npos;
+ flags += *cflags;
}
- if (const char* coptions = sf.GetProperty("COMPILE_OPTIONS")) {
+ if (cmProp coptions = sf.GetProperty("COMPILE_OPTIONS")) {
configDependentOptions =
- cmGeneratorExpression::Find(coptions) != std::string::npos;
- options += coptions;
+ cmGeneratorExpression::Find(*coptions) != std::string::npos;
+ options += *coptions;
}
- if (const char* cdefs = sf.GetProperty("COMPILE_DEFINITIONS")) {
+ if (cmProp cdefs = sf.GetProperty("COMPILE_DEFINITIONS")) {
configDependentDefines =
- cmGeneratorExpression::Find(cdefs) != std::string::npos;
- defines += cdefs;
+ cmGeneratorExpression::Find(*cdefs) != std::string::npos;
+ defines += *cdefs;
}
- if (const char* cincludes = sf.GetProperty("INCLUDE_DIRECTORIES")) {
+ if (cmProp cincludes = sf.GetProperty("INCLUDE_DIRECTORIES")) {
configDependentIncludes =
- cmGeneratorExpression::Find(cincludes) != std::string::npos;
- includes += cincludes;
+ cmGeneratorExpression::Find(*cincludes) != std::string::npos;
+ includes += *cincludes;
}
- std::string lang =
- this->GlobalGenerator->GetLanguageFromExtension(sf.GetExtension().c_str());
- std::string sourceLang = this->LocalGenerator->GetSourceFileLanguage(sf);
- const std::string& linkLanguage =
- this->GeneratorTarget->GetLinkerLanguage("");
- bool needForceLang = false;
- // source file does not match its extension language
- if (lang != sourceLang) {
- needForceLang = true;
- lang = sourceLang;
- }
- // if the source file does not match the linker language
- // then force c or c++
+
+ // Force language if the file extension does not match.
+ std::string lang = this->LocalGenerator->GetSourceFileLanguage(sf);
const char* compileAs = 0;
- if (needForceLang || (linkLanguage != lang)) {
+ if (lang !=
+ this->GlobalGenerator->GetLanguageFromExtension(
+ sf.GetExtension().c_str())) {
if (lang == "CXX") {
// force a C++ file type
compileAs = "CompileAsCpp";
@@ -2333,6 +2333,7 @@ void cmVisualStudio10TargetGenerator::OutputSourceSpecificFlags(
compileAs = "CompileAsC";
}
}
+
bool noWinRT = this->TargetCompileAsWinRT && lang == "C";
// for the first time we need a new line if there is something
// produced here.
@@ -2347,13 +2348,13 @@ void cmVisualStudio10TargetGenerator::OutputSourceSpecificFlags(
std::string configUpper = cmSystemTools::UpperCase(config);
std::string configDefines = defines;
std::string defPropName = cmStrCat("COMPILE_DEFINITIONS_", configUpper);
- if (const char* ccdefs = sf.GetProperty(defPropName)) {
+ if (cmProp ccdefs = sf.GetProperty(defPropName)) {
if (!configDefines.empty()) {
configDefines += ";";
}
configDependentDefines |=
- cmGeneratorExpression::Find(ccdefs) != std::string::npos;
- configDefines += ccdefs;
+ cmGeneratorExpression::Find(*ccdefs) != std::string::npos;
+ configDefines += *ccdefs;
}
// Add precompile headers compile options.
@@ -2454,19 +2455,13 @@ void cmVisualStudio10TargetGenerator::OutputSourceSpecificFlags(
}
if (this->IsXamlSource(source->GetFullPath())) {
const std::string& fileName = source->GetFullPath();
- std::string xamlFileName = fileName.substr(0, fileName.find_last_of("."));
- e2.Element("DependentUpon", xamlFileName);
+ e2.Element("DependentUpon",
+ fileName.substr(0, fileName.find_last_of(".")));
}
if (this->ProjectType == csproj) {
std::string f = source->GetFullPath();
using CsPropMap = std::map<std::string, std::string>;
CsPropMap sourceFileTags;
- // set <Link> tag if necessary
- std::string link;
- this->GetCSharpSourceLink(source, link);
- if (!link.empty()) {
- sourceFileTags["Link"] = link;
- }
this->GetCSharpSourceProperties(&sf, sourceFileTags);
// write source file specific tags
if (!sourceFileTags.empty()) {
@@ -2504,34 +2499,34 @@ void cmVisualStudio10TargetGenerator::WritePathAndIncrementalLinkOptions(
const std::string cond = this->CalcCondition(config);
if (ttype <= cmStateEnums::UTILITY) {
- if (const char* workingDir = this->GeneratorTarget->GetProperty(
+ if (cmProp workingDir = this->GeneratorTarget->GetProperty(
"VS_DEBUGGER_WORKING_DIRECTORY")) {
std::string genWorkingDir = cmGeneratorExpression::Evaluate(
- workingDir, this->LocalGenerator, config);
+ *workingDir, this->LocalGenerator, config);
e1.WritePlatformConfigTag("LocalDebuggerWorkingDirectory", cond,
genWorkingDir);
}
- if (const char* environment =
+ if (cmProp environment =
this->GeneratorTarget->GetProperty("VS_DEBUGGER_ENVIRONMENT")) {
std::string genEnvironment = cmGeneratorExpression::Evaluate(
- environment, this->LocalGenerator, config);
+ *environment, this->LocalGenerator, config);
e1.WritePlatformConfigTag("LocalDebuggerEnvironment", cond,
genEnvironment);
}
- if (const char* debuggerCommand =
+ if (cmProp debuggerCommand =
this->GeneratorTarget->GetProperty("VS_DEBUGGER_COMMAND")) {
std::string genDebuggerCommand = cmGeneratorExpression::Evaluate(
- debuggerCommand, this->LocalGenerator, config);
+ *debuggerCommand, this->LocalGenerator, config);
e1.WritePlatformConfigTag("LocalDebuggerCommand", cond,
genDebuggerCommand);
}
- if (const char* commandArguments = this->GeneratorTarget->GetProperty(
+ if (cmProp commandArguments = this->GeneratorTarget->GetProperty(
"VS_DEBUGGER_COMMAND_ARGUMENTS")) {
std::string genCommandArguments = cmGeneratorExpression::Evaluate(
- commandArguments, this->LocalGenerator, config);
+ *commandArguments, this->LocalGenerator, config);
e1.WritePlatformConfigTag("LocalDebuggerCommandArguments", cond,
genCommandArguments);
}
@@ -2716,7 +2711,7 @@ bool cmVisualStudio10TargetGenerator::ComputeClOptions(
std::string langForClCompile;
if (this->ProjectType == csproj) {
langForClCompile = "CSharp";
- } else if (cmContains(clLangs, linkLanguage)) {
+ } else if (cm::contains(clLangs, linkLanguage)) {
langForClCompile = linkLanguage;
} else {
std::set<std::string> languages;
@@ -2735,13 +2730,6 @@ bool cmVisualStudio10TargetGenerator::ComputeClOptions(
this->LocalGenerator->AddCompileOptions(flags, this->GeneratorTarget,
langForClCompile, configName);
}
- // set the correct language
- if (linkLanguage == "C") {
- clOptions.AddFlag("CompileAs", "CompileAsC");
- }
- if (linkLanguage == "CXX") {
- clOptions.AddFlag("CompileAs", "CompileAsCpp");
- }
// Put the IPO enabled configurations into a set.
if (this->GeneratorTarget->IsIPOEnabled(linkLanguage, configName)) {
@@ -2791,9 +2779,9 @@ bool cmVisualStudio10TargetGenerator::ComputeClOptions(
this->Makefile->IssueMessage(MessageType::WARNING, message);
}
}
- if (auto* clr =
+ if (cmProp clr =
this->GeneratorTarget->GetProperty("COMMON_LANGUAGE_RUNTIME")) {
- std::string clrString = clr;
+ std::string clrString = *clr;
if (!clrString.empty()) {
clrString = ":" + clrString;
}
@@ -2911,9 +2899,9 @@ void cmVisualStudio10TargetGenerator::WriteClOptions(
oh.OutputPreprocessorDefinitions(this->LangForClCompile);
if (this->NsightTegra) {
- if (const char* processMax =
+ if (cmProp processMax =
this->GeneratorTarget->GetProperty("ANDROID_PROCESS_MAX")) {
- e2.Element("ProcessMax", processMax);
+ e2.Element("ProcessMax", *processMax);
}
}
@@ -3182,6 +3170,8 @@ bool cmVisualStudio10TargetGenerator::ComputeCudaLinkOptions(
this->LocalGenerator, Options::CudaCompiler, gg->GetCudaFlagTable());
Options& cudaLinkOptions = *pOptions;
+ cmGeneratorTarget::DeviceLinkSetter setter(*this->GeneratorTarget);
+
// Determine if we need to do a device link
const bool doDeviceLinking = requireDeviceLinking(
*this->GeneratorTarget, *this->LocalGenerator, configName);
@@ -3189,12 +3179,20 @@ bool cmVisualStudio10TargetGenerator::ComputeCudaLinkOptions(
cudaLinkOptions.AddFlag("PerformDeviceLink",
doDeviceLinking ? "true" : "false");
- // Suppress deprecation warnings for default GPU targets during device link.
- if (cmSystemTools::VersionCompareGreaterEq(
- this->GlobalGenerator->GetPlatformToolsetCudaString(), "8.0")) {
- cudaLinkOptions.AppendFlagString("AdditionalOptions",
- "-Wno-deprecated-gpu-targets");
- }
+ // Add extra flags for device linking
+ cudaLinkOptions.AppendFlagString(
+ "AdditionalOptions",
+ this->Makefile->GetSafeDefinition("_CMAKE_CUDA_EXTRA_FLAGS"));
+ cudaLinkOptions.AppendFlagString(
+ "AdditionalOptions",
+ this->Makefile->GetSafeDefinition("_CMAKE_CUDA_EXTRA_DEVICE_LINK_FLAGS"));
+
+ std::vector<std::string> linkOpts;
+ std::string linkFlags;
+ this->GeneratorTarget->GetLinkOptions(linkOpts, configName, "CUDA");
+ // LINK_OPTIONS are escaped.
+ this->LocalGenerator->AppendCompileOptions(linkFlags, linkOpts);
+ cudaLinkOptions.AppendFlagString("AdditionalOptions", linkFlags);
// For static libraries that have device linking enabled compute
// the libraries
@@ -3412,9 +3410,8 @@ void cmVisualStudio10TargetGenerator::WriteLibOptions(
this->GeneratorTarget->GetLinkClosure(config)->LinkerLanguage;
std::string libflags;
- this->LocalGenerator->GetStaticLibraryFlags(
- libflags, cmSystemTools::UpperCase(config), linkLanguage,
- this->GeneratorTarget);
+ this->LocalGenerator->GetStaticLibraryFlags(libflags, config, linkLanguage,
+ this->GeneratorTarget);
if (!libflags.empty()) {
Elem e2(e1, "Lib");
cmGlobalVisualStudio10Generator* gg = this->GlobalGenerator;
@@ -3449,7 +3446,7 @@ void cmVisualStudio10TargetGenerator::WriteManifestOptions(
std::vector<cmSourceFile const*> manifest_srcs;
this->GeneratorTarget->GetManifests(manifest_srcs, config);
- const char* dpiAware = this->GeneratorTarget->GetProperty("VS_DPI_AWARE");
+ cmProp dpiAware = this->GeneratorTarget->GetProperty("VS_DPI_AWARE");
if (!manifest_srcs.empty() || dpiAware) {
Elem e2(e1, "Manifest");
@@ -3463,15 +3460,14 @@ void cmVisualStudio10TargetGenerator::WriteManifestOptions(
e2.Element("AdditionalManifestFiles", oss.str());
}
if (dpiAware) {
- if (!strcmp(dpiAware, "PerMonitor")) {
+ if (*dpiAware == "PerMonitor") {
e2.Element("EnableDpiAwareness", "PerMonitorHighDPIAware");
- } else if (cmIsOn(dpiAware)) {
+ } else if (cmIsOn(*dpiAware)) {
e2.Element("EnableDpiAwareness", "true");
- } else if (cmIsOff(dpiAware)) {
+ } else if (cmIsOff(*dpiAware)) {
e2.Element("EnableDpiAwareness", "false");
} else {
- cmSystemTools::Error("Bad parameter for VS_DPI_AWARE: " +
- std::string(dpiAware));
+ cmSystemTools::Error("Bad parameter for VS_DPI_AWARE: " + *dpiAware);
}
}
}
@@ -3484,12 +3480,12 @@ void cmVisualStudio10TargetGenerator::WriteAntBuildOptions(
// its location as the root source directory.
std::string rootDir = this->LocalGenerator->GetCurrentSourceDirectory();
{
- std::vector<cmSourceFile const*> extraSources;
- this->GeneratorTarget->GetExtraSources(extraSources, "");
- for (cmSourceFile const* si : extraSources) {
- if ("androidmanifest.xml" ==
- cmSystemTools::LowerCase(si->GetLocation().GetName())) {
- rootDir = si->GetLocation().GetDirectory();
+ for (cmGeneratorTarget::AllConfigSource const& source :
+ this->GeneratorTarget->GetAllConfigSources()) {
+ if (source.Kind == cmGeneratorTarget::SourceKindExtra &&
+ "androidmanifest.xml" ==
+ cmSystemTools::LowerCase(source.Source->GetLocation().GetName())) {
+ rootDir = source.Source->GetLocation().GetDirectory();
break;
}
}
@@ -3511,51 +3507,51 @@ void cmVisualStudio10TargetGenerator::WriteAntBuildOptions(
e2.Element("EnableProGuard", "true");
}
- if (const char* proGuardConfigLocation =
+ if (cmProp proGuardConfigLocation =
this->GeneratorTarget->GetProperty("ANDROID_PROGUARD_CONFIG_PATH")) {
- e2.Element("ProGuardConfigLocation", proGuardConfigLocation);
+ e2.Element("ProGuardConfigLocation", *proGuardConfigLocation);
}
- if (const char* securePropertiesLocation =
+ if (cmProp securePropertiesLocation =
this->GeneratorTarget->GetProperty("ANDROID_SECURE_PROPS_PATH")) {
- e2.Element("SecurePropertiesLocation", securePropertiesLocation);
+ e2.Element("SecurePropertiesLocation", *securePropertiesLocation);
}
- if (const char* nativeLibDirectoriesExpression =
+ if (cmProp nativeLibDirectoriesExpression =
this->GeneratorTarget->GetProperty("ANDROID_NATIVE_LIB_DIRECTORIES")) {
std::string nativeLibDirs = cmGeneratorExpression::Evaluate(
- nativeLibDirectoriesExpression, this->LocalGenerator, configName);
+ *nativeLibDirectoriesExpression, this->LocalGenerator, configName);
e2.Element("NativeLibDirectories", nativeLibDirs);
}
- if (const char* nativeLibDependenciesExpression =
+ if (cmProp nativeLibDependenciesExpression =
this->GeneratorTarget->GetProperty(
"ANDROID_NATIVE_LIB_DEPENDENCIES")) {
std::string nativeLibDeps = cmGeneratorExpression::Evaluate(
- nativeLibDependenciesExpression, this->LocalGenerator, configName);
+ *nativeLibDependenciesExpression, this->LocalGenerator, configName);
e2.Element("NativeLibDependencies", nativeLibDeps);
}
- if (const char* javaSourceDir =
+ if (cmProp javaSourceDir =
this->GeneratorTarget->GetProperty("ANDROID_JAVA_SOURCE_DIR")) {
- e2.Element("JavaSourceDir", javaSourceDir);
+ e2.Element("JavaSourceDir", *javaSourceDir);
}
- if (const char* jarDirectoriesExpression =
+ if (cmProp jarDirectoriesExpression =
this->GeneratorTarget->GetProperty("ANDROID_JAR_DIRECTORIES")) {
std::string jarDirectories = cmGeneratorExpression::Evaluate(
- jarDirectoriesExpression, this->LocalGenerator, configName);
+ *jarDirectoriesExpression, this->LocalGenerator, configName);
e2.Element("JarDirectories", jarDirectories);
}
- if (const char* jarDeps =
+ if (cmProp jarDeps =
this->GeneratorTarget->GetProperty("ANDROID_JAR_DEPENDENCIES")) {
- e2.Element("JarDependencies", jarDeps);
+ e2.Element("JarDependencies", *jarDeps);
}
- if (const char* assetsDirectories =
+ if (cmProp assetsDirectories =
this->GeneratorTarget->GetProperty("ANDROID_ASSETS_DIRECTORIES")) {
- e2.Element("AssetsDirectories", assetsDirectories);
+ e2.Element("AssetsDirectories", *assetsDirectories);
}
{
@@ -3564,10 +3560,10 @@ void cmVisualStudio10TargetGenerator::WriteAntBuildOptions(
e2.Element("AndroidManifestLocation", manifest_xml);
}
- if (const char* antAdditionalOptions =
+ if (cmProp antAdditionalOptions =
this->GeneratorTarget->GetProperty("ANDROID_ANT_ADDITIONAL_OPTIONS")) {
e2.Element("AdditionalOptions",
- std::string(antAdditionalOptions) + " %(AdditionalOptions)");
+ *antAdditionalOptions + " %(AdditionalOptions)");
}
}
@@ -3619,17 +3615,15 @@ bool cmVisualStudio10TargetGenerator::ComputeLinkOptions(
std::string linkFlagVar = linkFlagVarBase + "_" + CONFIG;
flags += " ";
flags += this->Makefile->GetRequiredDefinition(linkFlagVar);
- const char* targetLinkFlags =
- this->GeneratorTarget->GetProperty("LINK_FLAGS");
+ cmProp targetLinkFlags = this->GeneratorTarget->GetProperty("LINK_FLAGS");
if (targetLinkFlags) {
flags += " ";
- flags += targetLinkFlags;
+ flags += *targetLinkFlags;
}
std::string flagsProp = cmStrCat("LINK_FLAGS_", CONFIG);
- if (const char* flagsConfig =
- this->GeneratorTarget->GetProperty(flagsProp)) {
+ if (cmProp flagsConfig = this->GeneratorTarget->GetProperty(flagsProp)) {
flags += " ";
- flags += flagsConfig;
+ flags += *flagsConfig;
}
std::vector<std::string> opts;
@@ -3650,7 +3644,7 @@ bool cmVisualStudio10TargetGenerator::ComputeLinkOptions(
std::vector<std::string> libVec;
std::vector<std::string> vsTargetVec;
this->AddLibraries(cli, libVec, vsTargetVec, config);
- if (cmContains(linkClosure->Languages, "CUDA") &&
+ if (cm::contains(linkClosure->Languages, "CUDA") &&
this->CudaOptions[config] != nullptr) {
this->CudaOptions[config]->FixCudaRuntime(this->GeneratorTarget);
}
@@ -3924,7 +3918,7 @@ void cmVisualStudio10TargetGenerator::AddTargetsFileAndConfigPair(
{
for (TargetsFileAndConfigs& i : this->TargetsFileAndConfigsVec) {
if (cmSystemTools::ComparePath(targetsFile, i.File)) {
- if (!cmContains(i.Configs, config)) {
+ if (!cm::contains(i.Configs, config)) {
i.Configs.push_back(config);
}
return;
@@ -4052,6 +4046,7 @@ void cmVisualStudio10TargetGenerator::WriteEvent(
std::string script;
const char* pre = "";
std::string comment;
+ bool stdPipesUTF8 = false;
for (cmCustomCommand const& cc : commands) {
cmCustomCommandGenerator ccg(cc, configName, lg);
if (!ccg.HasOnlyEmptyCommandLines()) {
@@ -4060,11 +4055,16 @@ void cmVisualStudio10TargetGenerator::WriteEvent(
script += pre;
pre = "\n";
script += lg->ConstructScript(ccg);
+
+ stdPipesUTF8 = stdPipesUTF8 || cc.GetStdPipesUTF8();
}
}
comment = cmVS10EscapeComment(comment);
if (this->ProjectType != csproj) {
Elem e2(e1, name);
+ if (stdPipesUTF8) {
+ this->WriteStdOutEncodingUtf8(e2);
+ }
e2.Element("Message", comment);
e2.Element("Command", script);
} else {
@@ -4102,9 +4102,9 @@ void cmVisualStudio10TargetGenerator::WriteProjectReferences(Elem& e0)
cmLocalGenerator* lg = dt->GetLocalGenerator();
std::string name = dt->GetName();
std::string path;
- const char* p = dt->GetProperty("EXTERNAL_MSPROJECT");
+ cmProp p = dt->GetProperty("EXTERNAL_MSPROJECT");
if (p) {
- path = p;
+ path = *p;
} else {
path = cmStrCat(lg->GetCurrentBinaryDirectory(), '/', dt->GetName(),
computeProjectFileExtension(dt));
@@ -4120,7 +4120,8 @@ void cmVisualStudio10TargetGenerator::WriteProjectReferences(Elem& e0)
}
// Don't reference targets that don't produce any output.
- if (dt->GetManagedType("") == cmGeneratorTarget::ManagedType::Undefined) {
+ if (dt->GetManagedType(this->Configurations[0]) ==
+ cmGeneratorTarget::ManagedType::Undefined) {
e2.Element("ReferenceOutputAssembly", "false");
e2.Element("CopyToOutputDirectory", "Never");
}
@@ -4132,17 +4133,17 @@ void cmVisualStudio10TargetGenerator::WritePlatformExtensions(Elem& e1)
// This only applies to Windows 10 apps
if (this->GlobalGenerator->TargetsWindowsStore() &&
cmHasLiteralPrefix(this->GlobalGenerator->GetSystemVersion(), "10.0")) {
- const char* desktopExtensionsVersion =
+ cmProp desktopExtensionsVersion =
this->GeneratorTarget->GetProperty("VS_DESKTOP_EXTENSIONS_VERSION");
if (desktopExtensionsVersion) {
this->WriteSinglePlatformExtension(e1, "WindowsDesktop",
- desktopExtensionsVersion);
+ *desktopExtensionsVersion);
}
- const char* mobileExtensionsVersion =
+ cmProp mobileExtensionsVersion =
this->GeneratorTarget->GetProperty("VS_MOBILE_EXTENSIONS_VERSION");
if (mobileExtensionsVersion) {
this->WriteSinglePlatformExtension(e1, "WindowsMobile",
- mobileExtensionsVersion);
+ *mobileExtensionsVersion);
}
}
}
@@ -4167,9 +4168,9 @@ void cmVisualStudio10TargetGenerator::WriteSDKReferences(Elem& e0)
{
std::vector<std::string> sdkReferences;
std::unique_ptr<Elem> spe1;
- if (const char* vsSDKReferences =
+ if (cmProp vsSDKReferences =
this->GeneratorTarget->GetProperty("VS_SDK_REFERENCES")) {
- cmExpandList(vsSDKReferences, sdkReferences);
+ cmExpandList(*vsSDKReferences, sdkReferences);
spe1 = cm::make_unique<Elem>(e0, "ItemGroup");
for (std::string const& ri : sdkReferences) {
Elem(*spe1, "SDKReference").Attribute("Include", ri);
@@ -4179,11 +4180,11 @@ void cmVisualStudio10TargetGenerator::WriteSDKReferences(Elem& e0)
// This only applies to Windows 10 apps
if (this->GlobalGenerator->TargetsWindowsStore() &&
cmHasLiteralPrefix(this->GlobalGenerator->GetSystemVersion(), "10.0")) {
- const char* desktopExtensionsVersion =
+ cmProp desktopExtensionsVersion =
this->GeneratorTarget->GetProperty("VS_DESKTOP_EXTENSIONS_VERSION");
- const char* mobileExtensionsVersion =
+ cmProp mobileExtensionsVersion =
this->GeneratorTarget->GetProperty("VS_MOBILE_EXTENSIONS_VERSION");
- const char* iotExtensionsVersion =
+ cmProp iotExtensionsVersion =
this->GeneratorTarget->GetProperty("VS_IOT_EXTENSIONS_VERSION");
if (desktopExtensionsVersion || mobileExtensionsVersion ||
@@ -4193,15 +4194,15 @@ void cmVisualStudio10TargetGenerator::WriteSDKReferences(Elem& e0)
}
if (desktopExtensionsVersion) {
this->WriteSingleSDKReference(*spe1, "WindowsDesktop",
- desktopExtensionsVersion);
+ *desktopExtensionsVersion);
}
if (mobileExtensionsVersion) {
this->WriteSingleSDKReference(*spe1, "WindowsMobile",
- mobileExtensionsVersion);
+ *mobileExtensionsVersion);
}
if (iotExtensionsVersion) {
this->WriteSingleSDKReference(*spe1, "WindowsIoT",
- iotExtensionsVersion);
+ *iotExtensionsVersion);
}
}
}
@@ -4221,12 +4222,13 @@ void cmVisualStudio10TargetGenerator::WriteWinRTPackageCertificateKeyFile(
this->GlobalGenerator->TargetsWindowsPhone()) &&
(cmStateEnums::EXECUTABLE == this->GeneratorTarget->GetType())) {
std::string pfxFile;
- std::vector<cmSourceFile const*> certificates;
- this->GeneratorTarget->GetCertificates(certificates, "");
- for (cmSourceFile const* si : certificates) {
- pfxFile = this->ConvertPath(si->GetFullPath(), false);
- ConvertToWindowsSlash(pfxFile);
- break;
+ for (cmGeneratorTarget::AllConfigSource const& source :
+ this->GeneratorTarget->GetAllConfigSources()) {
+ if (source.Kind == cmGeneratorTarget::SourceKindCertificate) {
+ pfxFile = this->ConvertPath(source.Source->GetFullPath(), false);
+ ConvertToWindowsSlash(pfxFile);
+ break;
+ }
}
if (this->IsMissingFiles &&
@@ -4272,28 +4274,61 @@ void cmVisualStudio10TargetGenerator::WriteWinRTPackageCertificateKeyFile(
}
}
+void cmVisualStudio10TargetGenerator::ClassifyAllConfigSources()
+{
+ for (cmGeneratorTarget::AllConfigSource const& source :
+ this->GeneratorTarget->GetAllConfigSources()) {
+ this->ClassifyAllConfigSource(source);
+ }
+}
+
+void cmVisualStudio10TargetGenerator::ClassifyAllConfigSource(
+ cmGeneratorTarget::AllConfigSource const& acs)
+{
+ switch (acs.Kind) {
+ case cmGeneratorTarget::SourceKindResx: {
+ // Build and save the name of the corresponding .h file
+ // This relationship will be used later when building the project files.
+ // Both names would have been auto generated from Visual Studio
+ // where the user supplied the file name and Visual Studio
+ // appended the suffix.
+ std::string resx = acs.Source->ResolveFullPath();
+ std::string hFileName = resx.substr(0, resx.find_last_of('.')) + ".h";
+ this->ExpectedResxHeaders.insert(hFileName);
+ } break;
+ case cmGeneratorTarget::SourceKindXaml: {
+ // Build and save the name of the corresponding .h and .cpp file
+ // This relationship will be used later when building the project files.
+ // Both names would have been auto generated from Visual Studio
+ // where the user supplied the file name and Visual Studio
+ // appended the suffix.
+ std::string xaml = acs.Source->ResolveFullPath();
+ std::string hFileName = xaml + ".h";
+ std::string cppFileName = xaml + ".cpp";
+ this->ExpectedXamlHeaders.insert(hFileName);
+ this->ExpectedXamlSources.insert(cppFileName);
+ } break;
+ default:
+ break;
+ }
+}
+
bool cmVisualStudio10TargetGenerator::IsResxHeader(
const std::string& headerFile)
{
- std::set<std::string> expectedResxHeaders;
- this->GeneratorTarget->GetExpectedResxHeaders(expectedResxHeaders, "");
- return expectedResxHeaders.count(headerFile) > 0;
+ return this->ExpectedResxHeaders.count(headerFile) > 0;
}
bool cmVisualStudio10TargetGenerator::IsXamlHeader(
const std::string& headerFile)
{
- std::set<std::string> expectedXamlHeaders;
- this->GeneratorTarget->GetExpectedXamlHeaders(expectedXamlHeaders, "");
- return expectedXamlHeaders.count(headerFile) > 0;
+ return this->ExpectedXamlHeaders.count(headerFile) > 0;
}
bool cmVisualStudio10TargetGenerator::IsXamlSource(
const std::string& sourceFile)
{
- std::set<std::string> expectedXamlSources;
- this->GeneratorTarget->GetExpectedXamlSources(expectedXamlSources, "");
- return expectedXamlSources.count(sourceFile) > 0;
+ return this->ExpectedXamlSources.count(sourceFile) > 0;
}
void cmVisualStudio10TargetGenerator::WriteApplicationTypeSettings(Elem& e1)
@@ -4352,10 +4387,10 @@ void cmVisualStudio10TargetGenerator::WriteApplicationTypeSettings(Elem& e1)
if (!targetPlatformVersion.empty()) {
e1.Element("WindowsTargetPlatformVersion", targetPlatformVersion);
}
- const char* targetPlatformMinVersion = this->GeneratorTarget->GetProperty(
+ cmProp targetPlatformMinVersion = this->GeneratorTarget->GetProperty(
"VS_WINDOWS_TARGET_PLATFORM_MIN_VERSION");
if (targetPlatformMinVersion) {
- e1.Element("WindowsTargetPlatformMinVersion", targetPlatformMinVersion);
+ e1.Element("WindowsTargetPlatformMinVersion", *targetPlatformMinVersion);
} else if (isWindowsStore && rev == "10.0") {
// If the min version is not set, then use the TargetPlatformVersion
if (!targetPlatformVersion.empty()) {
@@ -4374,39 +4409,38 @@ void cmVisualStudio10TargetGenerator::VerifyNecessaryFiles()
// For Windows and Windows Phone executables, we will assume that if a
// manifest is not present that we need to add all the necessary files
if (this->GeneratorTarget->GetType() == cmStateEnums::EXECUTABLE) {
- std::vector<cmSourceFile const*> manifestSources;
- this->GeneratorTarget->GetAppManifest(manifestSources, "");
- {
- std::string const& v = this->GlobalGenerator->GetSystemVersion();
- if (this->GlobalGenerator->TargetsWindowsPhone()) {
- if (v == "8.0") {
- // Look through the sources for WMAppManifest.xml
- std::vector<cmSourceFile const*> extraSources;
- this->GeneratorTarget->GetExtraSources(extraSources, "");
- bool foundManifest = false;
- for (cmSourceFile const* si : extraSources) {
- // Need to do a lowercase comparison on the filename
- if ("wmappmanifest.xml" ==
- cmSystemTools::LowerCase(si->GetLocation().GetName())) {
- foundManifest = true;
- break;
- }
- }
- if (!foundManifest) {
- this->IsMissingFiles = true;
- }
- } else if (v == "8.1") {
- if (manifestSources.empty()) {
- this->IsMissingFiles = true;
+ std::vector<cmGeneratorTarget::AllConfigSource> manifestSources =
+ this->GeneratorTarget->GetAllConfigSources(
+ cmGeneratorTarget::SourceKindAppManifest);
+ std::string const& v = this->GlobalGenerator->GetSystemVersion();
+ if (this->GlobalGenerator->TargetsWindowsPhone()) {
+ if (v == "8.0") {
+ // Look through the sources for WMAppManifest.xml
+ bool foundManifest = false;
+ for (cmGeneratorTarget::AllConfigSource const& source :
+ this->GeneratorTarget->GetAllConfigSources()) {
+ if (source.Kind == cmGeneratorTarget::SourceKindExtra &&
+ "wmappmanifest.xml" ==
+ cmSystemTools::LowerCase(
+ source.Source->GetLocation().GetName())) {
+ foundManifest = true;
+ break;
}
}
- } else if (this->GlobalGenerator->TargetsWindowsStore()) {
+ if (!foundManifest) {
+ this->IsMissingFiles = true;
+ }
+ } else if (v == "8.1") {
if (manifestSources.empty()) {
- if (v == "8.0") {
- this->IsMissingFiles = true;
- } else if (v == "8.1" || cmHasLiteralPrefix(v, "10.0")) {
- this->IsMissingFiles = true;
- }
+ this->IsMissingFiles = true;
+ }
+ }
+ } else if (this->GlobalGenerator->TargetsWindowsStore()) {
+ if (manifestSources.empty()) {
+ if (v == "8.0") {
+ this->IsMissingFiles = true;
+ } else if (v == "8.1" || cmHasLiteralPrefix(v, "10.0")) {
+ this->IsMissingFiles = true;
}
}
}
@@ -4845,11 +4879,11 @@ void cmVisualStudio10TargetGenerator::GetCSharpSourceProperties(
if (this->ProjectType == csproj) {
const cmPropertyMap& props = sf->GetProperties();
for (const std::string& p : props.GetKeys()) {
- static const std::string propNamePrefix = "VS_CSHARP_";
- if (p.find(propNamePrefix) == 0) {
+ static const cm::string_view propNamePrefix = "VS_CSHARP_";
+ if (cmHasPrefix(p, propNamePrefix)) {
std::string tagName = p.substr(propNamePrefix.length());
if (!tagName.empty()) {
- const std::string val = props.GetPropertyValue(p);
+ const std::string& val = *props.GetPropertyValue(p);
if (!val.empty()) {
tags[tagName] = val;
} else {
@@ -4869,24 +4903,34 @@ void cmVisualStudio10TargetGenerator::WriteCSharpSourceProperties(
}
}
-void cmVisualStudio10TargetGenerator::GetCSharpSourceLink(
- cmSourceFile const* sf, std::string& link)
+std::string cmVisualStudio10TargetGenerator::GetCSharpSourceLink(
+ cmSourceFile const* source)
{
- std::string const& sourceFilePath = sf->GetFullPath();
- std::string const& binaryDir = LocalGenerator->GetCurrentBinaryDirectory();
-
- if (!cmSystemTools::IsSubDirectory(sourceFilePath, binaryDir)) {
- const std::string& stripFromPath =
- this->Makefile->GetCurrentSourceDirectory();
- if (sourceFilePath.find(stripFromPath) == 0) {
- if (const char* l = sf->GetProperty("VS_CSHARP_Link")) {
- link = l;
- } else {
- link = sourceFilePath.substr(stripFromPath.length() + 1);
- }
- ConvertToWindowsSlash(link);
- }
- }
+ // For out of source files, we first check if a matching source group
+ // for this file exists, otherwise we check if the path relative to current
+ // source- or binary-dir is used within the link and return that
+ std::string link;
+ std::string const& fullFileName = source->GetFullPath();
+ std::string const& srcDir = this->Makefile->GetCurrentSourceDirectory();
+ std::string const& binDir = this->Makefile->GetCurrentBinaryDirectory();
+ // unfortunately we have to copy the source groups, because
+ // FindSourceGroup uses a regex which is modifying the group
+ std::vector<cmSourceGroup> sourceGroups = this->Makefile->GetSourceGroups();
+ cmSourceGroup* sourceGroup =
+ this->Makefile->FindSourceGroup(fullFileName, sourceGroups);
+ if (sourceGroup && !sourceGroup->GetFullName().empty()) {
+ link = sourceGroup->GetFullName() + "/" +
+ cmsys::SystemTools::GetFilenameName(fullFileName);
+ } else if (cmHasPrefix(fullFileName, srcDir)) {
+ link = fullFileName.substr(srcDir.length() + 1);
+ } else if (cmHasPrefix(fullFileName, binDir)) {
+ link = fullFileName.substr(binDir.length() + 1);
+ } else if (cmProp l = source->GetProperty("VS_CSHARP_Link")) {
+ link = *l;
+ }
+
+ ConvertToWindowsSlash(link);
+ return link;
}
std::string cmVisualStudio10TargetGenerator::GetCMakeFilePath(
@@ -4899,3 +4943,8 @@ std::string cmVisualStudio10TargetGenerator::GetCMakeFilePath(
return path;
}
+
+void cmVisualStudio10TargetGenerator::WriteStdOutEncodingUtf8(Elem& e1)
+{
+ e1.Element("StdOutEncoding", "UTF-8");
+}
diff --git a/Source/cmVisualStudio10TargetGenerator.h b/Source/cmVisualStudio10TargetGenerator.h
index 30027c9..7c71de3 100644
--- a/Source/cmVisualStudio10TargetGenerator.h
+++ b/Source/cmVisualStudio10TargetGenerator.h
@@ -10,12 +10,14 @@
#include <memory>
#include <set>
#include <string>
+#include <unordered_map>
#include <vector>
+#include "cmGeneratorTarget.h"
+
class cmComputeLinkInformation;
class cmCustomCommand;
class cmGeneratedFileStream;
-class cmGeneratorTarget;
class cmGlobalVisualStudio10Generator;
class cmLocalVisualStudio10Generator;
class cmMakefile;
@@ -73,8 +75,6 @@ private:
std::vector<size_t> const& exclude_configs);
void WriteAllSources(Elem& e0);
void WritePackageReferences(Elem& e0);
- void WritePackageReference(Elem& e1, std::string const& ref,
- std::string const& version);
void WriteDotNetReferences(Elem& e0);
void WriteDotNetReference(Elem& e1, std::string const& ref,
std::string const& hint,
@@ -183,7 +183,9 @@ private:
std::map<std::string, std::string>& tags);
void WriteCSharpSourceProperties(
Elem& e2, const std::map<std::string, std::string>& tags);
- void GetCSharpSourceLink(cmSourceFile const* sf, std::string& link);
+ std::string GetCSharpSourceLink(cmSourceFile const* source);
+
+ void WriteStdOutEncodingUtf8(Elem& e1);
private:
friend class cmVS10GeneratorOptions;
@@ -236,6 +238,23 @@ private:
using ToolSourceMap = std::map<std::string, ToolSources>;
ToolSourceMap Tools;
+
+ std::set<std::string> ExpectedResxHeaders;
+ std::set<std::string> ExpectedXamlHeaders;
+ std::set<std::string> ExpectedXamlSources;
+ std::vector<cmSourceFile const*> ResxObjs;
+ std::vector<cmSourceFile const*> XamlObjs;
+ void ClassifyAllConfigSources();
+ void ClassifyAllConfigSource(cmGeneratorTarget::AllConfigSource const& acs);
+
+ using ConfigToSettings =
+ std::unordered_map<std::string,
+ std::unordered_map<std::string, std::string>>;
+ std::unordered_map<std::string, ConfigToSettings> ParsedToolTargetSettings;
+ bool PropertyIsSameInAllConfigs(const ConfigToSettings& toolSettings,
+ const std::string& propName);
+ void ParseSettingsProperty(const std::string& settingsPropertyValue,
+ ConfigToSettings& toolSettings);
std::string GetCMakeFilePath(const char* name) const;
};
diff --git a/Source/cmVisualStudioGeneratorOptions.cxx b/Source/cmVisualStudioGeneratorOptions.cxx
index 4004b66..7775f62 100644
--- a/Source/cmVisualStudioGeneratorOptions.cxx
+++ b/Source/cmVisualStudioGeneratorOptions.cxx
@@ -157,12 +157,11 @@ void cmVisualStudioGeneratorOptions::FixCudaRuntime(cmGeneratorTarget* target)
this->FlagMap.find("CudaRuntime");
if (i == this->FlagMap.end()) {
// User didn't provide am override so get the property value
- const char* runtimeLibraryValue =
- target->GetProperty("CUDA_RUNTIME_LIBRARY");
+ cmProp runtimeLibraryValue = target->GetProperty("CUDA_RUNTIME_LIBRARY");
if (runtimeLibraryValue) {
std::string cudaRuntime =
cmSystemTools::UpperCase(cmGeneratorExpression::Evaluate(
- runtimeLibraryValue, this->LocalGenerator, this->Configuration,
+ *runtimeLibraryValue, this->LocalGenerator, this->Configuration,
target));
if (cudaRuntime == "STATIC") {
this->AddFlag("CudaRuntime", "Static");
diff --git a/Source/cmVisualStudioSlnParser.cxx b/Source/cmVisualStudioSlnParser.cxx
index 4533e9b..d7822b1 100644
--- a/Source/cmVisualStudioSlnParser.cxx
+++ b/Source/cmVisualStudioSlnParser.cxx
@@ -517,7 +517,7 @@ bool cmVisualStudioSlnParser::ParseMultiValueTag(const std::string& line,
State& state)
{
size_t idxEqualSign = line.find('=');
- const std::string& fullTag = line.substr(0, idxEqualSign);
+ auto fullTag = cm::string_view(line).substr(0, idxEqualSign);
if (!this->ParseTag(fullTag, parsedLine, state))
return false;
if (idxEqualSign != line.npos) {
@@ -560,7 +560,7 @@ bool cmVisualStudioSlnParser::ParseSingleValueTag(const std::string& line,
State& state)
{
size_t idxEqualSign = line.find('=');
- const std::string& fullTag = line.substr(0, idxEqualSign);
+ auto fullTag = cm::string_view(line).substr(0, idxEqualSign);
if (!this->ParseTag(fullTag, parsedLine, state))
return false;
if (idxEqualSign != line.npos) {
@@ -586,17 +586,17 @@ bool cmVisualStudioSlnParser::ParseKeyValuePair(const std::string& line,
return true;
}
-bool cmVisualStudioSlnParser::ParseTag(const std::string& fullTag,
+bool cmVisualStudioSlnParser::ParseTag(cm::string_view fullTag,
ParsedLine& parsedLine, State& state)
{
size_t idxLeftParen = fullTag.find('(');
- if (idxLeftParen == fullTag.npos) {
+ if (idxLeftParen == cm::string_view::npos) {
parsedLine.SetTag(cmTrimWhitespace(fullTag));
return true;
}
parsedLine.SetTag(cmTrimWhitespace(fullTag.substr(0, idxLeftParen)));
size_t idxRightParen = fullTag.rfind(')');
- if (idxRightParen == fullTag.npos) {
+ if (idxRightParen == cm::string_view::npos) {
this->LastResult.SetError(ResultErrorInputStructure,
state.GetCurrentLine());
return false;
diff --git a/Source/cmVisualStudioSlnParser.h b/Source/cmVisualStudioSlnParser.h
index 6c05633..4557cdb 100644
--- a/Source/cmVisualStudioSlnParser.h
+++ b/Source/cmVisualStudioSlnParser.h
@@ -9,6 +9,8 @@
#include <iosfwd>
#include <string>
+#include <cm/string_view>
+
#include <stddef.h>
class cmSlnData;
@@ -97,8 +99,7 @@ protected:
bool ParseKeyValuePair(const std::string& line, ParsedLine& parsedLine,
State& state);
- bool ParseTag(const std::string& fullTag, ParsedLine& parsedLine,
- State& state);
+ bool ParseTag(cm::string_view fullTag, ParsedLine& parsedLine, State& state);
bool ParseValue(const std::string& value, ParsedLine& parsedLine);
};
diff --git a/Source/cmWhileCommand.cxx b/Source/cmWhileCommand.cxx
index 26e7c75..0d8e894 100644
--- a/Source/cmWhileCommand.cxx
+++ b/Source/cmWhileCommand.cxx
@@ -7,8 +7,7 @@
#include <cm/memory>
#include <cm/string_view>
-
-#include "cm_static_string_view.hxx"
+#include <cmext/string_view>
#include "cmConditionEvaluator.h"
#include "cmExecutionStatus.h"
diff --git a/Source/cmWorkerPool.cxx b/Source/cmWorkerPool.cxx
index aa0d6b3..9fec936 100644
--- a/Source/cmWorkerPool.cxx
+++ b/Source/cmWorkerPool.cxx
@@ -13,7 +13,7 @@
#include <cm/memory>
-#include "cm_uv.h"
+#include <cm3p/uv.h>
#include "cmRange.h"
#include "cmStringAlgorithms.h"
diff --git a/Source/cmWorkingDirectory.h b/Source/cmWorkingDirectory.h
index d4a164d..4c7576d 100644
--- a/Source/cmWorkingDirectory.h
+++ b/Source/cmWorkingDirectory.h
@@ -37,6 +37,8 @@ public:
*/
int GetLastResult() const { return ResultCode; }
+ std::string const& GetOldDirectory() const { return this->OldDir; }
+
private:
std::string OldDir;
int ResultCode;
diff --git a/Source/cmWriteFileCommand.cxx b/Source/cmWriteFileCommand.cxx
index 34e21b2..666ba87 100644
--- a/Source/cmWriteFileCommand.cxx
+++ b/Source/cmWriteFileCommand.cxx
@@ -72,7 +72,7 @@ bool cmWriteFileCommand(std::vector<std::string> const& args,
status.SetError(error);
return false;
}
- file << message << std::endl;
+ file << message << '\n';
file.close();
if (mode && !writable) {
cmSystemTools::SetPermissions(fileName.c_str(), mode);
diff --git a/Source/cmXCode21Object.cxx b/Source/cmXCode21Object.cxx
index a9bb2ef..6b133a9 100644
--- a/Source/cmXCode21Object.cxx
+++ b/Source/cmXCode21Object.cxx
@@ -30,11 +30,12 @@ void cmXCode21Object::PrintComment(std::ostream& out)
out << " */";
}
-void cmXCode21Object::PrintList(std::vector<cmXCodeObject*> const& v,
- std::ostream& out, PBXType t)
+void cmXCode21Object::PrintList(
+ std::vector<std::unique_ptr<cmXCodeObject>> const& v, std::ostream& out,
+ PBXType t)
{
bool hasOne = false;
- for (auto obj : v) {
+ for (const auto& obj : v) {
if (obj->GetType() == OBJECT && obj->GetIsA() == t) {
hasOne = true;
break;
@@ -44,7 +45,7 @@ void cmXCode21Object::PrintList(std::vector<cmXCodeObject*> const& v,
return;
}
out << "\n/* Begin " << PBXTypeNames[t] << " section */\n";
- for (auto obj : v) {
+ for (const auto& obj : v) {
if (obj->GetType() == OBJECT && obj->GetIsA() == t) {
obj->Print(out);
}
@@ -52,8 +53,8 @@ void cmXCode21Object::PrintList(std::vector<cmXCodeObject*> const& v,
out << "/* End " << PBXTypeNames[t] << " section */\n";
}
-void cmXCode21Object::PrintList(std::vector<cmXCodeObject*> const& v,
- std::ostream& out)
+void cmXCode21Object::PrintList(
+ std::vector<std::unique_ptr<cmXCodeObject>> const& v, std::ostream& out)
{
cmXCodeObject::Indent(1, out);
out << "objects = {\n";
diff --git a/Source/cmXCode21Object.h b/Source/cmXCode21Object.h
index 8e4b80f..76fad23 100644
--- a/Source/cmXCode21Object.h
+++ b/Source/cmXCode21Object.h
@@ -6,6 +6,7 @@
#include "cmConfigure.h" // IWYU pragma: keep
#include <iosfwd>
+#include <memory>
#include <vector>
#include "cmXCodeObject.h"
@@ -15,8 +16,9 @@ class cmXCode21Object : public cmXCodeObject
public:
cmXCode21Object(PBXType ptype, Type type);
void PrintComment(std::ostream&) override;
- static void PrintList(std::vector<cmXCodeObject*> const&, std::ostream& out,
- PBXType t);
- static void PrintList(std::vector<cmXCodeObject*> const&, std::ostream& out);
+ static void PrintList(std::vector<std::unique_ptr<cmXCodeObject>> const&,
+ std::ostream& out, PBXType t);
+ static void PrintList(std::vector<std::unique_ptr<cmXCodeObject>> const&,
+ std::ostream& out);
};
#endif
diff --git a/Source/cmXCodeObject.h b/Source/cmXCodeObject.h
index d9be3d2..24ecaa2 100644
--- a/Source/cmXCodeObject.h
+++ b/Source/cmXCodeObject.h
@@ -12,7 +12,7 @@
#include <utility>
#include <vector>
-#include "cmAlgorithms.h"
+#include <cmext/algorithm>
class cmGeneratorTarget;
@@ -82,10 +82,13 @@ public:
void SetObject(cmXCodeObject* value) { this->Object = value; }
cmXCodeObject* GetObject() { return this->Object; }
void AddObject(cmXCodeObject* value) { this->List.push_back(value); }
- bool HasObject(cmXCodeObject* o) const { return cmContains(this->List, o); }
+ bool HasObject(cmXCodeObject* o) const
+ {
+ return cm::contains(this->List, o);
+ }
void AddUniqueObject(cmXCodeObject* value)
{
- if (!cmContains(this->List, value)) {
+ if (!cm::contains(this->List, value)) {
this->List.push_back(value);
}
}
diff --git a/Source/cmXCodeScheme.cxx b/Source/cmXCodeScheme.cxx
index b34c2f6..f4c2f2d 100644
--- a/Source/cmXCodeScheme.cxx
+++ b/Source/cmXCodeScheme.cxx
@@ -7,6 +7,8 @@
#include <sstream>
#include <utility>
+#include <cmext/algorithm>
+
#include "cmGeneratedFileStream.h"
#include "cmGeneratorExpression.h"
#include "cmGeneratorTarget.h"
@@ -202,14 +204,14 @@ void cmXCodeScheme::WriteLaunchAction(cmXMLWriter& xout,
// Info tab begin
- if (const char* exe =
+ if (cmProp exe =
this->Target->GetTarget()->GetProperty("XCODE_SCHEME_EXECUTABLE")) {
xout.StartElement("PathRunnable");
xout.BreakAttributes();
xout.Attribute("runnableDebuggingMode", "0");
- xout.Attribute("FilePath", exe);
+ xout.Attribute("FilePath", *exe);
xout.EndElement(); // PathRunnable
}
@@ -218,9 +220,9 @@ void cmXCodeScheme::WriteLaunchAction(cmXMLWriter& xout,
// Arguments tab begin
- if (const char* argList =
+ if (cmProp argList =
this->Target->GetTarget()->GetProperty("XCODE_SCHEME_ARGUMENTS")) {
- std::vector<std::string> arguments = cmExpandedList(argList);
+ std::vector<std::string> arguments = cmExpandedList(*argList);
if (!arguments.empty()) {
xout.StartElement("CommandLineArguments");
@@ -238,9 +240,9 @@ void cmXCodeScheme::WriteLaunchAction(cmXMLWriter& xout,
}
}
- if (const char* envList =
+ if (cmProp envList =
this->Target->GetTarget()->GetProperty("XCODE_SCHEME_ENVIRONMENT")) {
- std::vector<std::string> envs = cmExpandedList(envList);
+ std::vector<std::string> envs = cmExpandedList(*envList);
if (!envs.empty()) {
xout.StartElement("EnvironmentVariables");
@@ -321,8 +323,9 @@ bool cmXCodeScheme::WriteLaunchActionBooleanAttribute(
cmXMLWriter& xout, const std::string& attrName, const std::string& varName,
bool defaultValue)
{
- auto property = Target->GetTarget()->GetProperty(varName);
- bool isOn = (property == nullptr && defaultValue) || cmIsOn(property);
+ cmProp property = Target->GetTarget()->GetProperty(varName);
+ bool isOn =
+ (property == nullptr && defaultValue) || (property && cmIsOn(*property));
if (isOn) {
xout.Attribute(attrName.c_str(), "YES");
@@ -393,7 +396,8 @@ void cmXCodeScheme::WriteBuildableReference(cmXMLWriter& xout,
xout.BreakAttributes();
xout.Attribute("BuildableIdentifier", "primary");
xout.Attribute("BlueprintIdentifier", xcObj->GetId());
- xout.Attribute("BuildableName", xcObj->GetTarget()->GetFullName());
+ std::string const noConfig; // FIXME: What config to use here?
+ xout.Attribute("BuildableName", xcObj->GetTarget()->GetFullName(noConfig));
xout.Attribute("BlueprintName", xcObj->GetTarget()->GetName());
xout.Attribute("ReferencedContainer", "container:" + container);
xout.EndElement();
@@ -402,8 +406,9 @@ void cmXCodeScheme::WriteBuildableReference(cmXMLWriter& xout,
void cmXCodeScheme::WriteCustomWorkingDirectory(
cmXMLWriter& xout, const std::string& configuration)
{
- std::string propertyValue = this->Target->GetTarget()->GetSafeProperty(
- "XCODE_SCHEME_WORKING_DIRECTORY");
+ std::string const& propertyValue =
+ this->Target->GetTarget()->GetSafeProperty(
+ "XCODE_SCHEME_WORKING_DIRECTORY");
if (propertyValue.empty()) {
xout.Attribute("useCustomWorkingDirectory", "NO");
} else {
@@ -427,7 +432,7 @@ std::string cmXCodeScheme::FindConfiguration(const std::string& name)
// Try to find the desired configuration by name,
// and if it's not found return first from the list
//
- if (!cmContains(this->ConfigList, name) && !this->ConfigList.empty()) {
+ if (!cm::contains(this->ConfigList, name) && !this->ConfigList.empty()) {
return this->ConfigList[0];
}
diff --git a/Source/cmXMLParser.cxx b/Source/cmXMLParser.cxx
index ad5c4ba..24da8c6 100644
--- a/Source/cmXMLParser.cxx
+++ b/Source/cmXMLParser.cxx
@@ -7,9 +7,9 @@
#include <iostream>
#include <sstream>
-#include "cmsys/FStream.hxx"
+#include <cm3p/expat.h>
-#include "cm_expat.h"
+#include "cmsys/FStream.hxx"
cmXMLParser::cmXMLParser()
{
diff --git a/Source/cmXMLWriter.h b/Source/cmXMLWriter.h
index bc445aa..00ea08c 100644
--- a/Source/cmXMLWriter.h
+++ b/Source/cmXMLWriter.h
@@ -6,7 +6,7 @@
#include "cmConfigure.h" // IWYU pragma: keep
#include <chrono>
-#include <cstddef>
+#include <cstddef> // IWYU pragma: keep
#include <ctime>
#include <ostream>
#include <stack>
diff --git a/Source/cm_get_date.c b/Source/cm_get_date.c
index 4bef803..49f5577 100644
--- a/Source/cm_get_date.c
+++ b/Source/cm_get_date.c
@@ -2,6 +2,10 @@
file Copyright.txt or https://cmake.org/licensing for details. */
#include "cm_get_date.h"
+// FIXME: This suppresses use of localtime_r because archive_getdate.c
+// depends the rest of libarchive's checks for that.
+#define CM_GET_DATE
+
#define __archive_get_date cm_get_date
#include "../Utilities/cmlibarchive/libarchive/archive_getdate.c"
diff --git a/Source/cmake.cxx b/Source/cmake.cxx
index a99d9a6..65d5f10 100644
--- a/Source/cmake.cxx
+++ b/Source/cmake.cxx
@@ -9,6 +9,7 @@
#include <initializer_list>
#include <iostream>
#include <sstream>
+#include <stdexcept>
#include <utility>
#include <cm/memory>
@@ -18,6 +19,7 @@
#endif
#include <cmext/algorithm>
+#include <cmext/string_view>
#include "cmsys/FStream.hxx"
#include "cmsys/Glob.hxx"
@@ -25,7 +27,6 @@
#include "cm_sys_stat.h"
-#include "cmAlgorithms.h"
#include "cmCommands.h"
#include "cmDocumentation.h"
#include "cmDocumentationEntry.h"
@@ -39,6 +40,9 @@
#include "cmLinkLineComputer.h"
#include "cmLocalGenerator.h"
#include "cmMakefile.h"
+#if !defined(CMAKE_BOOTSTRAP)
+# include "cmMakefileProfilingData.h"
+#endif
#include "cmMessenger.h"
#include "cmState.h"
#include "cmStateDirectory.h"
@@ -53,7 +57,7 @@
#if !defined(CMAKE_BOOTSTRAP)
# include <unordered_map>
-# include "cm_jsoncpp_writer.h"
+# include <cm3p/json/writer.h>
# include "cmFileAPI.h"
# include "cmGraphVizWriter.h"
@@ -134,6 +138,7 @@ using JsonValueMapType = std::unordered_map<std::string, Json::Value>;
static bool cmakeCheckStampFile(const std::string& stampName);
static bool cmakeCheckStampList(const std::string& stampList);
+#ifndef CMAKE_BOOTSTRAP
static void cmWarnUnusedCliWarning(const std::string& variable, int /*unused*/,
void* ctx, const char* /*unused*/,
const cmMakefile* /*unused*/)
@@ -141,6 +146,7 @@ static void cmWarnUnusedCliWarning(const std::string& variable, int /*unused*/,
cmake* cm = reinterpret_cast<cmake*>(ctx);
cm->MarkCliAsUsed(variable);
}
+#endif
cmake::cmake(Role role, cmState::Mode mode)
: FileTimeCache(cm::make_unique<cmFileTimeCache>())
@@ -285,10 +291,11 @@ void cmake::CleanupCommandsAndMacros()
// Parse the args
bool cmake::SetCacheArgs(const std::vector<std::string>& args)
{
- bool findPackageMode = false;
+ auto findPackageMode = false;
+ auto seenScriptOption = false;
for (unsigned int i = 1; i < args.size(); ++i) {
std::string const& arg = args[i];
- if (arg.find("-D", 0) == 0) {
+ if (cmHasLiteralPrefix(arg, "-D")) {
std::string entry = arg.substr(2);
if (entry.empty()) {
++i;
@@ -309,8 +316,7 @@ bool cmake::SetCacheArgs(const std::vector<std::string>& args)
bool haveValue = false;
std::string cachedValue;
if (this->WarnUnusedCli) {
- if (const std::string* v =
- this->State->GetInitializedCacheValue(var)) {
+ if (cmProp v = this->State->GetInitializedCacheValue(var)) {
haveValue = true;
cachedValue = *v;
}
@@ -377,7 +383,7 @@ bool cmake::SetCacheArgs(const std::vector<std::string>& args)
// -Wno-error=<name>
this->DiagLevels[name] = std::min(this->DiagLevels[name], DIAG_WARN);
}
- } else if (arg.find("-U", 0) == 0) {
+ } else if (cmHasLiteralPrefix(arg, "-U")) {
std::string entryPattern = arg.substr(2);
if (entryPattern.empty()) {
++i;
@@ -407,7 +413,7 @@ bool cmake::SetCacheArgs(const std::vector<std::string>& args)
for (std::string const& currentEntry : entriesToDelete) {
this->State->RemoveCacheEntry(currentEntry);
}
- } else if (arg.find("-C", 0) == 0) {
+ } else if (cmHasLiteralPrefix(arg, "-C")) {
std::string path = arg.substr(2);
if (path.empty()) {
++i;
@@ -422,7 +428,7 @@ bool cmake::SetCacheArgs(const std::vector<std::string>& args)
// Resolve script path specified on command line relative to $PWD.
path = cmSystemTools::CollapseFullPath(path);
this->ReadListFile(args, path);
- } else if (arg.find("-P", 0) == 0) {
+ } else if (cmHasLiteralPrefix(arg, "-P")) {
i++;
if (i >= args.size()) {
cmSystemTools::Error("-P must be followed by a file name.");
@@ -441,7 +447,12 @@ bool cmake::SetCacheArgs(const std::vector<std::string>& args)
this->SetHomeOutputDirectory(
cmSystemTools::GetCurrentWorkingDirectory());
this->ReadListFile(args, path);
- } else if (arg.find("--find-package", 0) == 0) {
+ seenScriptOption = true;
+ } else if (arg == "--" && seenScriptOption) {
+ // Stop processing CMake args and avoid possible errors
+ // when arbitrary args are given to CMake script.
+ break;
+ } else if (cmHasLiteralPrefix(arg, "--find-package")) {
findPackageMode = true;
}
}
@@ -520,11 +531,11 @@ bool cmake::FindPackage(const std::vector<std::string>& args)
if (!quiet) {
printf("%s not found.\n", packageName.c_str());
}
- } else if (mode == "EXIST") {
+ } else if (mode == "EXIST"_s) {
if (!quiet) {
printf("%s found.\n", packageName.c_str());
}
- } else if (mode == "COMPILE") {
+ } else if (mode == "COMPILE"_s) {
std::string includes = mf->GetSafeDefinition("PACKAGE_INCLUDE_DIRS");
std::vector<std::string> includeDirs = cmExpandedList(includes);
@@ -535,7 +546,7 @@ bool cmake::FindPackage(const std::vector<std::string>& args)
std::string definitions = mf->GetSafeDefinition("PACKAGE_DEFINITIONS");
printf("%s %s\n", includeFlags.c_str(), definitions.c_str());
- } else if (mode == "LINK") {
+ } else if (mode == "LINK"_s) {
const char* targetName = "dummy";
std::vector<std::string> srcs;
cmTarget* tgt = mf->AddExecutable(targetName, srcs, true);
@@ -613,9 +624,13 @@ void cmake::SetArgs(const std::vector<std::string>& args)
{
bool haveToolset = false;
bool havePlatform = false;
+#if !defined(CMAKE_BOOTSTRAP)
+ std::string profilingFormat;
+ std::string profilingOutput;
+#endif
for (unsigned int i = 1; i < args.size(); ++i) {
std::string const& arg = args[i];
- if (arg.find("-H", 0) == 0 || arg.find("-S", 0) == 0) {
+ if (cmHasLiteralPrefix(arg, "-H") || cmHasLiteralPrefix(arg, "-S")) {
std::string path = arg.substr(2);
if (path.empty()) {
++i;
@@ -633,9 +648,11 @@ void cmake::SetArgs(const std::vector<std::string>& args)
path = cmSystemTools::CollapseFullPath(path);
cmSystemTools::ConvertToUnixSlashes(path);
this->SetHomeDirectory(path);
- } else if (arg.find("-O", 0) == 0) {
+ // XXX(clang-tidy): https://bugs.llvm.org/show_bug.cgi?id=44165
+ // NOLINTNEXTLINE(bugprone-branch-clone)
+ } else if (cmHasLiteralPrefix(arg, "-O")) {
// There is no local generate anymore. Ignore -O option.
- } else if (arg.find("-B", 0) == 0) {
+ } else if (cmHasLiteralPrefix(arg, "-B")) {
std::string path = arg.substr(2);
if (path.empty()) {
++i;
@@ -654,54 +671,43 @@ void cmake::SetArgs(const std::vector<std::string>& args)
cmSystemTools::ConvertToUnixSlashes(path);
this->SetHomeOutputDirectory(path);
} else if ((i < args.size() - 2) &&
- (arg.find("--check-build-system", 0) == 0)) {
+ cmHasLiteralPrefix(arg, "--check-build-system")) {
this->CheckBuildSystemArgument = args[++i];
this->ClearBuildSystem = (atoi(args[++i].c_str()) > 0);
} else if ((i < args.size() - 1) &&
- (arg.find("--check-stamp-file", 0) == 0)) {
+ cmHasLiteralPrefix(arg, "--check-stamp-file")) {
this->CheckStampFile = args[++i];
} else if ((i < args.size() - 1) &&
- (arg.find("--check-stamp-list", 0) == 0)) {
+ cmHasLiteralPrefix(arg, "--check-stamp-list")) {
this->CheckStampList = args[++i];
- } else if (arg == "--regenerate-during-build") {
+ } else if (arg == "--regenerate-during-build"_s) {
this->RegenerateDuringBuild = true;
}
#if defined(CMAKE_HAVE_VS_GENERATORS)
else if ((i < args.size() - 1) &&
- (arg.find("--vs-solution-file", 0) == 0)) {
+ cmHasLiteralPrefix(arg, "--vs-solution-file")) {
this->VSSolutionFile = args[++i];
}
#endif
- else if (arg.find("-D", 0) == 0) {
- // skip for now
- // in case '-D var=val' is given, also skip the next
- // in case '-Dvar=val' is given, don't skip the next
- if (arg.size() == 2) {
- ++i;
- }
- } else if (arg.find("-U", 0) == 0) {
- // skip for now
- // in case '-U var' is given, also skip the next
- // in case '-Uvar' is given, don't skip the next
- if (arg.size() == 2) {
- ++i;
- }
- } else if (arg.find("-C", 0) == 0) {
+ else if (cmHasLiteralPrefix(arg, "-D") || cmHasLiteralPrefix(arg, "-U") ||
+ cmHasLiteralPrefix(arg, "-C")) {
// skip for now
- // in case '-C path' is given, also skip the next
- // in case '-Cpath' is given, don't skip the next
+ // in case '-[DUC] argval' var' is given, also skip the next
+ // in case '-[DUC]argval' is given, don't skip the next
if (arg.size() == 2) {
++i;
}
- } else if (arg.find("-P", 0) == 0) {
+ // XXX(clang-tidy): https://bugs.llvm.org/show_bug.cgi?id=44165
+ // NOLINTNEXTLINE(bugprone-branch-clone)
+ } else if (cmHasLiteralPrefix(arg, "-P")) {
// skip for now
i++;
- } else if (arg.find("--find-package", 0) == 0) {
+ } else if (cmHasLiteralPrefix(arg, "--find-package")) {
// skip for now
i++;
- } else if (arg.find("-W", 0) == 0) {
+ } else if (cmHasLiteralPrefix(arg, "-W")) {
// skip for now
- } else if (arg.find("--graphviz=", 0) == 0) {
+ } else if (cmHasLiteralPrefix(arg, "--graphviz=")) {
std::string path = arg.substr(strlen("--graphviz="));
path = cmSystemTools::CollapseFullPath(path);
cmSystemTools::ConvertToUnixSlashes(path);
@@ -710,13 +716,13 @@ void cmake::SetArgs(const std::vector<std::string>& args)
cmSystemTools::Error("No file specified for --graphviz");
return;
}
- } else if (arg.find("--debug-trycompile", 0) == 0) {
+ } else if (cmHasLiteralPrefix(arg, "--debug-trycompile")) {
std::cout << "debug trycompile on\n";
this->DebugTryCompileOn();
- } else if (arg.find("--debug-output", 0) == 0) {
+ } else if (cmHasLiteralPrefix(arg, "--debug-output")) {
std::cout << "Running with debug output on.\n";
this->SetDebugOutputOn(true);
- } else if (arg.find("--log-level=", 0) == 0) {
+ } else if (cmHasLiteralPrefix(arg, "--log-level=")) {
const auto logLevel =
StringToLogLevel(arg.substr(sizeof("--log-level=") - 1));
if (logLevel == LogLevel::LOG_UNDEFINED) {
@@ -725,7 +731,7 @@ void cmake::SetArgs(const std::vector<std::string>& args)
}
this->SetLogLevel(logLevel);
this->LogLevelWasSetViaCLI = true;
- } else if (arg.find("--loglevel=", 0) == 0) {
+ } else if (cmHasLiteralPrefix(arg, "--loglevel=")) {
// This is supported for backward compatibility. This option only
// appeared in the 3.15.x release series and was renamed to
// --log-level in 3.16.0
@@ -737,16 +743,16 @@ void cmake::SetArgs(const std::vector<std::string>& args)
}
this->SetLogLevel(logLevel);
this->LogLevelWasSetViaCLI = true;
- } else if (arg == "--log-context") {
+ } else if (arg == "--log-context"_s) {
this->SetShowLogContext(true);
- } else if (arg.find("--debug-find", 0) == 0) {
+ } else if (cmHasLiteralPrefix(arg, "--debug-find")) {
std::cout << "Running with debug output on for the `find` commands.\n";
this->SetDebugFindOutputOn(true);
- } else if (arg.find("--trace-expand", 0) == 0) {
+ } else if (cmHasLiteralPrefix(arg, "--trace-expand")) {
std::cout << "Running with expanded trace output on.\n";
this->SetTrace(true);
this->SetTraceExpand(true);
- } else if (arg.find("--trace-format=", 0) == 0) {
+ } else if (cmHasLiteralPrefix(arg, "--trace-format=")) {
this->SetTrace(true);
const auto traceFormat =
StringToTraceFormat(arg.substr(strlen("--trace-format=")));
@@ -756,35 +762,35 @@ void cmake::SetArgs(const std::vector<std::string>& args)
return;
}
this->SetTraceFormat(traceFormat);
- } else if (arg.find("--trace-source=", 0) == 0) {
+ } else if (cmHasLiteralPrefix(arg, "--trace-source=")) {
std::string file = arg.substr(strlen("--trace-source="));
cmSystemTools::ConvertToUnixSlashes(file);
this->AddTraceSource(file);
this->SetTrace(true);
- } else if (arg.find("--trace-redirect=", 0) == 0) {
+ } else if (cmHasLiteralPrefix(arg, "--trace-redirect=")) {
std::string file = arg.substr(strlen("--trace-redirect="));
cmSystemTools::ConvertToUnixSlashes(file);
this->SetTraceFile(file);
this->SetTrace(true);
- } else if (arg.find("--trace", 0) == 0) {
+ } else if (cmHasLiteralPrefix(arg, "--trace")) {
std::cout << "Running with trace output on.\n";
this->SetTrace(true);
this->SetTraceExpand(false);
- } else if (arg.find("--warn-uninitialized", 0) == 0) {
+ } else if (cmHasLiteralPrefix(arg, "--warn-uninitialized")) {
std::cout << "Warn about uninitialized values.\n";
this->SetWarnUninitialized(true);
- } else if (arg.find("--warn-unused-vars", 0) == 0) {
+ } else if (cmHasLiteralPrefix(arg, "--warn-unused-vars")) {
std::cout << "Finding unused variables.\n";
this->SetWarnUnused(true);
- } else if (arg.find("--no-warn-unused-cli", 0) == 0) {
+ } else if (cmHasLiteralPrefix(arg, "--no-warn-unused-cli")) {
std::cout << "Not searching for unused variables given on the "
<< "command line.\n";
this->SetWarnUnusedCli(false);
- } else if (arg.find("--check-system-vars", 0) == 0) {
+ } else if (cmHasLiteralPrefix(arg, "--check-system-vars")) {
std::cout << "Also check system files when warning about unused and "
<< "uninitialized variables.\n";
this->SetCheckSystemVars(true);
- } else if (arg.find("-A", 0) == 0) {
+ } else if (cmHasLiteralPrefix(arg, "-A")) {
std::string value = arg.substr(2);
if (value.empty()) {
++i;
@@ -800,7 +806,7 @@ void cmake::SetArgs(const std::vector<std::string>& args)
}
this->SetGeneratorPlatform(value);
havePlatform = true;
- } else if (arg.find("-T", 0) == 0) {
+ } else if (cmHasLiteralPrefix(arg, "-T")) {
std::string value = arg.substr(2);
if (value.empty()) {
++i;
@@ -816,7 +822,7 @@ void cmake::SetArgs(const std::vector<std::string>& args)
}
this->SetGeneratorToolset(value);
haveToolset = true;
- } else if (arg.find("-G", 0) == 0) {
+ } else if (cmHasLiteralPrefix(arg, "-G")) {
std::string value = arg.substr(2);
if (value.empty()) {
++i;
@@ -840,6 +846,20 @@ void cmake::SetArgs(const std::vector<std::string>& args)
return;
}
this->SetGlobalGenerator(std::move(gen));
+#if !defined(CMAKE_BOOTSTRAP)
+ } else if (cmHasLiteralPrefix(arg, "--profiling-format")) {
+ profilingFormat = arg.substr(strlen("--profiling-format="));
+ if (profilingFormat.empty()) {
+ cmSystemTools::Error("No format specified for --profiling-format");
+ }
+ } else if (cmHasLiteralPrefix(arg, "--profiling-output")) {
+ profilingOutput = arg.substr(strlen("--profiling-output="));
+ profilingOutput = cmSystemTools::CollapseFullPath(profilingOutput);
+ cmSystemTools::ConvertToUnixSlashes(profilingOutput);
+ if (profilingOutput.empty()) {
+ cmSystemTools::Error("No path specified for --profiling-output");
+ }
+#endif
}
// no option assume it is the path to the source or an existing build
else {
@@ -857,6 +877,29 @@ void cmake::SetArgs(const std::vector<std::string>& args)
}
}
+#if !defined(CMAKE_BOOTSTRAP)
+ if (!profilingOutput.empty() || !profilingFormat.empty()) {
+ if (profilingOutput.empty()) {
+ cmSystemTools::Error(
+ "--profiling-format specified but no --profiling-output!");
+ return;
+ }
+ if (profilingFormat == "google-trace"_s) {
+ try {
+ this->ProfilingOutput =
+ cm::make_unique<cmMakefileProfilingData>(profilingOutput);
+ } catch (std::runtime_error& e) {
+ cmSystemTools::Error(
+ cmStrCat("Could not start profiling: ", e.what()));
+ return;
+ }
+ } else {
+ cmSystemTools::Error("Invalid format specified for --profiling-format");
+ return;
+ }
+ }
+#endif
+
const bool haveSourceDir = !this->GetHomeDirectory().empty();
const bool haveBinaryDir = !this->GetHomeOutputDirectory().empty();
@@ -992,9 +1035,9 @@ void cmake::SetDirectoriesFromFile(const std::string& arg)
std::string fullPath = cmSystemTools::CollapseFullPath(arg);
std::string name = cmSystemTools::GetFilenameName(fullPath);
name = cmSystemTools::LowerCase(name);
- if (name == "cmakecache.txt") {
+ if (name == "cmakecache.txt"_s) {
cachePath = cmSystemTools::GetFilenamePath(fullPath);
- } else if (name == "cmakelists.txt") {
+ } else if (name == "cmakelists.txt"_s) {
listPath = cmSystemTools::GetFilenamePath(fullPath);
}
} else {
@@ -1003,7 +1046,7 @@ void cmake::SetDirectoriesFromFile(const std::string& arg)
std::string fullPath = cmSystemTools::CollapseFullPath(arg);
std::string name = cmSystemTools::GetFilenameName(fullPath);
name = cmSystemTools::LowerCase(name);
- if (name == "cmakecache.txt" || name == "cmakelists.txt") {
+ if (name == "cmakecache.txt"_s || name == "cmakelists.txt"_s) {
argIsFile = true;
listPath = cmSystemTools::GetFilenamePath(fullPath);
} else {
@@ -1014,11 +1057,11 @@ void cmake::SetDirectoriesFromFile(const std::string& arg)
// If there is a CMakeCache.txt file, use its settings.
if (!cachePath.empty()) {
if (this->LoadCache(cachePath)) {
- const char* existingValue =
+ cmProp existingValue =
this->State->GetCacheEntryValue("CMAKE_HOME_DIRECTORY");
if (existingValue) {
this->SetHomeOutputDirectory(cachePath);
- this->SetHomeDirectory(existingValue);
+ this->SetHomeDirectory(*existingValue);
return;
}
}
@@ -1361,12 +1404,12 @@ int cmake::HandleDeleteCacheVariables(const std::string& var)
i++;
save.value = *i;
warning << *i << "\n";
- const char* existingValue = this->State->GetCacheEntryValue(save.key);
+ cmProp existingValue = this->State->GetCacheEntryValue(save.key);
if (existingValue) {
save.type = this->State->GetCacheEntryType(save.key);
- if (const char* help =
+ if (cmProp help =
this->State->GetCacheEntryProperty(save.key, "HELPSTRING")) {
- save.help = help;
+ save.help = *help;
}
}
saved.push_back(std::move(save));
@@ -1411,9 +1454,9 @@ int cmake::Configure()
if (this->DiagLevels.count("dev") == 1) {
bool setDeprecatedVariables = false;
- const char* cachedWarnDeprecated =
+ cmProp cachedWarnDeprecated =
this->State->GetCacheEntryValue("CMAKE_WARN_DEPRECATED");
- const char* cachedErrorDeprecated =
+ cmProp cachedErrorDeprecated =
this->State->GetCacheEntryValue("CMAKE_ERROR_DEPRECATED");
// don't overwrite deprecated warning setting from a previous invocation
@@ -1452,23 +1495,23 @@ int cmake::Configure()
// Cache variables may have already been set by a previous invocation,
// so we cannot rely on command line options alone. Always ensure our
// messenger is in sync with the cache.
- const char* value = this->State->GetCacheEntryValue("CMAKE_WARN_DEPRECATED");
- this->Messenger->SetSuppressDeprecatedWarnings(value && cmIsOff(value));
+ cmProp value = this->State->GetCacheEntryValue("CMAKE_WARN_DEPRECATED");
+ this->Messenger->SetSuppressDeprecatedWarnings(value && cmIsOff(*value));
value = this->State->GetCacheEntryValue("CMAKE_ERROR_DEPRECATED");
- this->Messenger->SetDeprecatedWarningsAsErrors(cmIsOn(value));
+ this->Messenger->SetDeprecatedWarningsAsErrors(value && cmIsOn(*value));
value = this->State->GetCacheEntryValue("CMAKE_SUPPRESS_DEVELOPER_WARNINGS");
- this->Messenger->SetSuppressDevWarnings(cmIsOn(value));
+ this->Messenger->SetSuppressDevWarnings(value && cmIsOn(*value));
value = this->State->GetCacheEntryValue("CMAKE_SUPPRESS_DEVELOPER_ERRORS");
- this->Messenger->SetDevWarningsAsErrors(value && cmIsOff(value));
+ this->Messenger->SetDevWarningsAsErrors(value && cmIsOff(*value));
int ret = this->ActualConfigure();
- const char* delCacheVars =
+ cmProp delCacheVars =
this->State->GetGlobalProperty("__CMAKE_DELETE_CACHE_CHANGE_VARS_");
- if (delCacheVars && delCacheVars[0] != 0) {
- return this->HandleDeleteCacheVariables(delCacheVars);
+ if (delCacheVars && !delCacheVars->empty()) {
+ return this->HandleDeleteCacheVariables(*delCacheVars);
}
return ret;
}
@@ -1493,9 +1536,8 @@ int cmake::ActualConfigure()
// no generator specified on the command line
if (!this->GlobalGenerator) {
- const std::string* genName =
- this->State->GetInitializedCacheValue("CMAKE_GENERATOR");
- const std::string* extraGenName =
+ cmProp genName = this->State->GetInitializedCacheValue("CMAKE_GENERATOR");
+ cmProp extraGenName =
this->State->GetInitializedCacheValue("CMAKE_EXTRA_GENERATOR");
if (genName) {
std::string fullName =
@@ -1518,8 +1560,7 @@ int cmake::ActualConfigure()
}
}
- const std::string* genName =
- this->State->GetInitializedCacheValue("CMAKE_GENERATOR");
+ cmProp genName = this->State->GetInitializedCacheValue("CMAKE_GENERATOR");
if (genName) {
if (!this->GlobalGenerator->MatchesGeneratorName(*genName)) {
std::string message =
@@ -1541,7 +1582,7 @@ int cmake::ActualConfigure()
cmStateEnums::INTERNAL);
}
- if (const std::string* instance =
+ if (cmProp instance =
this->State->GetInitializedCacheValue("CMAKE_GENERATOR_INSTANCE")) {
if (this->GeneratorInstanceSet && this->GeneratorInstance != *instance) {
std::string message =
@@ -1558,7 +1599,7 @@ int cmake::ActualConfigure()
"Generator instance identifier.", cmStateEnums::INTERNAL);
}
- if (const std::string* platformName =
+ if (cmProp platformName =
this->State->GetInitializedCacheValue("CMAKE_GENERATOR_PLATFORM")) {
if (this->GeneratorPlatformSet &&
this->GeneratorPlatform != *platformName) {
@@ -1576,7 +1617,7 @@ int cmake::ActualConfigure()
"Name of generator platform.", cmStateEnums::INTERNAL);
}
- if (const std::string* tsName =
+ if (cmProp tsName =
this->State->GetInitializedCacheValue("CMAKE_GENERATOR_TOOLSET")) {
if (this->GeneratorToolsetSet && this->GeneratorToolset != *tsName) {
std::string message =
@@ -1891,13 +1932,13 @@ void cmake::AddCacheEntry(const std::string& key, const char* value,
cmStateEnums::CacheEntryType(type));
this->UnwatchUnusedCli(key);
- if (key == "CMAKE_WARN_DEPRECATED") {
+ if (key == "CMAKE_WARN_DEPRECATED"_s) {
this->Messenger->SetSuppressDeprecatedWarnings(value && cmIsOff(value));
- } else if (key == "CMAKE_ERROR_DEPRECATED") {
+ } else if (key == "CMAKE_ERROR_DEPRECATED"_s) {
this->Messenger->SetDeprecatedWarningsAsErrors(cmIsOn(value));
- } else if (key == "CMAKE_SUPPRESS_DEVELOPER_WARNINGS") {
+ } else if (key == "CMAKE_SUPPRESS_DEVELOPER_WARNINGS"_s) {
this->Messenger->SetSuppressDevWarnings(cmIsOn(value));
- } else if (key == "CMAKE_SUPPRESS_DEVELOPER_ERRORS") {
+ } else if (key == "CMAKE_SUPPRESS_DEVELOPER_ERRORS"_s) {
this->Messenger->SetDevWarningsAsErrors(value && cmIsOff(value));
}
}
@@ -1933,9 +1974,10 @@ std::string cmake::StripExtension(const std::string& file) const
{
auto dotpos = file.rfind('.');
if (dotpos != std::string::npos) {
- auto ext = file.substr(dotpos + 1);
#if defined(_WIN32) || defined(__APPLE__)
- ext = cmSystemTools::LowerCase(ext);
+ auto ext = cmSystemTools::LowerCase(file.substr(dotpos + 1));
+#else
+ auto ext = cm::string_view(file).substr(dotpos + 1);
#endif
if (this->IsSourceExtension(ext) || this->IsHeaderExtension(ext)) {
return file.substr(0, dotpos);
@@ -1946,7 +1988,7 @@ std::string cmake::StripExtension(const std::string& file) const
const char* cmake::GetCacheDefinition(const std::string& name) const
{
- const std::string* p = this->State->GetInitializedCacheValue(name);
+ cmProp p = this->State->GetInitializedCacheValue(name);
return p ? p->c_str() : nullptr;
}
@@ -2153,7 +2195,7 @@ void cmake::PrintGeneratorList()
void cmake::UpdateConversionPathTable()
{
// Update the path conversion table with any specified file:
- const std::string* tablepath =
+ cmProp tablepath =
this->State->GetInitializedCacheValue("CMAKE_PATH_TRANSLATION_FILE");
if (tablepath) {
@@ -2383,7 +2425,7 @@ void cmake::AppendProperty(const std::string& prop, const std::string& value,
this->State->AppendGlobalProperty(prop, value, asString);
}
-const char* cmake::GetProperty(const std::string& prop)
+cmProp cmake::GetProperty(const std::string& prop)
{
return this->State->GetGlobalProperty(prop);
}
@@ -2435,7 +2477,7 @@ int cmake::GetSystemInformation(std::vector<std::string>& args)
bool writeToStdout = true;
for (unsigned int i = 1; i < args.size(); ++i) {
std::string const& arg = args[i];
- if (arg.find("-G", 0) == 0) {
+ if (cmHasLiteralPrefix(arg, "-G")) {
std::string value = arg.substr(2);
if (value.empty()) {
++i;
@@ -2624,10 +2666,10 @@ void cmake::IssueMessage(MessageType t, std::string const& text,
std::vector<std::string> cmake::GetDebugConfigs()
{
std::vector<std::string> configs;
- if (const char* config_list =
+ if (cmProp config_list =
this->State->GetGlobalProperty("DEBUG_CONFIGURATIONS")) {
// Expand the specified list and convert to upper-case.
- cmExpandList(config_list, configs);
+ cmExpandList(*config_list, configs);
std::transform(configs.begin(), configs.end(), configs.begin(),
cmSystemTools::UpperCase);
}
@@ -2657,59 +2699,58 @@ int cmake::Build(int jobs, const std::string& dir,
std::cerr << "Error: could not load cache\n";
return 1;
}
- const char* cachedGenerator =
- this->State->GetCacheEntryValue("CMAKE_GENERATOR");
+ cmProp cachedGenerator = this->State->GetCacheEntryValue("CMAKE_GENERATOR");
if (!cachedGenerator) {
std::cerr << "Error: could not find CMAKE_GENERATOR in Cache\n";
return 1;
}
- auto gen = this->CreateGlobalGenerator(cachedGenerator);
+ auto gen = this->CreateGlobalGenerator(*cachedGenerator);
if (!gen) {
- std::cerr << "Error: could create CMAKE_GENERATOR \"" << cachedGenerator
+ std::cerr << "Error: could create CMAKE_GENERATOR \"" << *cachedGenerator
<< "\"\n";
return 1;
}
this->SetGlobalGenerator(std::move(gen));
- const char* cachedGeneratorInstance =
+ cmProp cachedGeneratorInstance =
this->State->GetCacheEntryValue("CMAKE_GENERATOR_INSTANCE");
if (cachedGeneratorInstance) {
cmMakefile mf(this->GetGlobalGenerator(), this->GetCurrentSnapshot());
- if (!this->GlobalGenerator->SetGeneratorInstance(cachedGeneratorInstance,
+ if (!this->GlobalGenerator->SetGeneratorInstance(*cachedGeneratorInstance,
&mf)) {
return 1;
}
}
- const char* cachedGeneratorPlatform =
+ cmProp cachedGeneratorPlatform =
this->State->GetCacheEntryValue("CMAKE_GENERATOR_PLATFORM");
if (cachedGeneratorPlatform) {
cmMakefile mf(this->GetGlobalGenerator(), this->GetCurrentSnapshot());
- if (!this->GlobalGenerator->SetGeneratorPlatform(cachedGeneratorPlatform,
+ if (!this->GlobalGenerator->SetGeneratorPlatform(*cachedGeneratorPlatform,
&mf)) {
return 1;
}
}
- const char* cachedGeneratorToolset =
+ cmProp cachedGeneratorToolset =
this->State->GetCacheEntryValue("CMAKE_GENERATOR_TOOLSET");
if (cachedGeneratorToolset) {
cmMakefile mf(this->GetGlobalGenerator(), this->GetCurrentSnapshot());
- if (!this->GlobalGenerator->SetGeneratorToolset(cachedGeneratorToolset,
+ if (!this->GlobalGenerator->SetGeneratorToolset(*cachedGeneratorToolset,
true, &mf)) {
return 1;
}
}
std::string output;
std::string projName;
- const char* cachedProjectName =
+ cmProp cachedProjectName =
this->State->GetCacheEntryValue("CMAKE_PROJECT_NAME");
if (!cachedProjectName) {
std::cerr << "Error: could not find CMAKE_PROJECT_NAME in Cache\n";
return 1;
}
- projName = cachedProjectName;
+ projName = *cachedProjectName;
- const char* cachedVerbose =
+ cmProp cachedVerbose =
this->State->GetCacheEntryValue("CMAKE_VERBOSE_MAKEFILE");
- if (cmIsOn(cachedVerbose)) {
+ if (cachedVerbose && cmIsOn(*cachedVerbose)) {
verbose = true;
}
@@ -2793,16 +2834,16 @@ bool cmake::Open(const std::string& dir, bool dryRun)
std::cerr << "Error: could not load cache\n";
return false;
}
- const char* genName = this->State->GetCacheEntryValue("CMAKE_GENERATOR");
+ cmProp genName = this->State->GetCacheEntryValue("CMAKE_GENERATOR");
if (!genName) {
std::cerr << "Error: could not find CMAKE_GENERATOR in Cache\n";
return false;
}
- const std::string* extraGenName =
+ cmProp extraGenName =
this->State->GetInitializedCacheValue("CMAKE_EXTRA_GENERATOR");
std::string fullName =
cmExternalMakefileProjectGenerator::CreateFullGeneratorName(
- genName, extraGenName ? *extraGenName : "");
+ *genName, extraGenName ? *extraGenName : "");
std::unique_ptr<cmGlobalGenerator> gen =
this->CreateGlobalGenerator(fullName);
@@ -2812,21 +2853,21 @@ bool cmake::Open(const std::string& dir, bool dryRun)
return false;
}
- const char* cachedProjectName =
+ cmProp cachedProjectName =
this->State->GetCacheEntryValue("CMAKE_PROJECT_NAME");
if (!cachedProjectName) {
std::cerr << "Error: could not find CMAKE_PROJECT_NAME in Cache\n";
return false;
}
- return gen->Open(dir, cachedProjectName, dryRun);
+ return gen->Open(dir, *cachedProjectName, dryRun);
}
void cmake::WatchUnusedCli(const std::string& var)
{
#ifndef CMAKE_BOOTSTRAP
this->VariableWatch->AddWatch(var, cmWarnUnusedCliWarning, this);
- if (!cmContains(this->UsedCliVariables, var)) {
+ if (!cm::contains(this->UsedCliVariables, var)) {
this->UsedCliVariables[var] = false;
}
#endif
@@ -2953,3 +2994,15 @@ void cmake::SetDeprecatedWarningsAsErrors(bool b)
" and functions.",
cmStateEnums::INTERNAL);
}
+
+#if !defined(CMAKE_BOOTSTRAP)
+cmMakefileProfilingData& cmake::GetProfilingOutput()
+{
+ return *(this->ProfilingOutput);
+}
+
+bool cmake::IsProfilingEnabled() const
+{
+ return static_cast<bool>(this->ProfilingOutput);
+}
+#endif
diff --git a/Source/cmake.h b/Source/cmake.h
index 35425ec..cd152cb 100644
--- a/Source/cmake.h
+++ b/Source/cmake.h
@@ -16,6 +16,8 @@
#include <utility>
#include <vector>
+#include <cm/string_view>
+
#include "cmGeneratedFileStream.h"
#include "cmInstalledFile.h"
#include "cmListFileCache.h"
@@ -25,7 +27,7 @@
#include "cmStateTypes.h"
#if !defined(CMAKE_BOOTSTRAP)
-# include "cm_jsoncpp_value.h"
+# include <cm3p/json/value.h>
#endif
class cmExternalMakefileProjectGeneratorFactory;
@@ -34,6 +36,9 @@ class cmFileTimeCache;
class cmGlobalGenerator;
class cmGlobalGeneratorFactory;
class cmMakefile;
+#if !defined(CMAKE_BOOTSTRAP)
+class cmMakefileProfilingData;
+#endif
class cmMessenger;
class cmVariableWatch;
struct cmDocumentationEntry;
@@ -135,13 +140,13 @@ public:
struct FileExtensions
{
- bool Test(std::string const& ext) const
+ bool Test(cm::string_view ext) const
{
return (this->unordered.find(ext) != this->unordered.end());
}
std::vector<std::string> ordered;
- std::unordered_set<std::string> unordered;
+ std::unordered_set<cm::string_view> unordered;
};
using InstalledFilesMap = std::map<std::string, cmInstalledFile>;
@@ -263,7 +268,7 @@ public:
return this->SourceFileExtensions.ordered;
}
- bool IsSourceExtension(const std::string& ext) const
+ bool IsSourceExtension(cm::string_view ext) const
{
return this->SourceFileExtensions.Test(ext);
}
@@ -273,7 +278,7 @@ public:
return this->HeaderFileExtensions.ordered;
}
- bool IsHeaderExtension(const std::string& ext) const
+ bool IsHeaderExtension(cm::string_view ext) const
{
return this->HeaderFileExtensions.Test(ext);
}
@@ -283,7 +288,7 @@ public:
return this->CudaFileExtensions.ordered;
}
- bool IsCudaExtension(const std::string& ext) const
+ bool IsCudaExtension(cm::string_view ext) const
{
return this->CudaFileExtensions.Test(ext);
}
@@ -293,7 +298,7 @@ public:
return this->FortranFileExtensions.ordered;
}
- bool IsFortranExtension(const std::string& ext) const
+ bool IsFortranExtension(cm::string_view ext) const
{
return this->FortranFileExtensions.Test(ext);
}
@@ -361,7 +366,7 @@ public:
void SetProperty(const std::string& prop, const char* value);
void AppendProperty(const std::string& prop, const std::string& value,
bool asString = false);
- const char* GetProperty(const std::string& prop);
+ cmProp GetProperty(const std::string& prop);
bool GetPropertyAsBool(const std::string& prop);
//! Get or create an cmInstalledFile instance and return a pointer to it
@@ -549,6 +554,11 @@ public:
bool GetRegenerateDuringBuild() const { return this->RegenerateDuringBuild; }
+#if !defined(CMAKE_BOOTSTRAP)
+ cmMakefileProfilingData& GetProfilingOutput();
+ bool IsProfilingEnabled() const;
+#endif
+
protected:
void RunCheckForUnusedVariables();
int HandleDeleteCacheVariables(const std::string& var);
@@ -657,6 +667,10 @@ private:
void AppendGlobalGeneratorsDocumentation(std::vector<cmDocumentationEntry>&);
void AppendExtraGeneratorsDocumentation(std::vector<cmDocumentationEntry>&);
+
+#if !defined(CMAKE_BOOTSTRAP)
+ std::unique_ptr<cmMakefileProfilingData> ProfilingOutput;
+#endif
};
#define CMAKE_STANDARD_OPTIONS_TABLE \
diff --git a/Source/cmakemain.cxx b/Source/cmakemain.cxx
index 494d5d9..b12990b 100644
--- a/Source/cmakemain.cxx
+++ b/Source/cmakemain.cxx
@@ -1,6 +1,8 @@
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
+#include "cmConfigure.h" // IWYU pragma: keep
+
#include <cassert>
#include <cctype>
#include <climits>
@@ -11,6 +13,8 @@
#include <cmext/algorithm>
+#include <cm3p/uv.h>
+
#include "cmDocumentationEntry.h" // IWYU pragma: keep
#include "cmGlobalGenerator.h"
#include "cmMakefile.h"
@@ -27,8 +31,6 @@
#endif
#include "cmsys/Encoding.hxx"
-
-#include "cm_uv.h"
#if defined(_WIN32) && !defined(CMAKE_BOOTSTRAP)
# include "cmsys/ConsoleBuf.hxx"
#endif
@@ -93,6 +95,12 @@ const char* cmDocumentationOptions[][2] = {
{ "--check-system-vars",
"Find problems with variable usage in system "
"files." },
+# if !defined(CMAKE_BOOTSTRAP)
+ { "--profiling-format=<fmt>", "Output data for profiling CMake scripts." },
+ { "--profiling-output=<file>",
+ "Select an output path for the profiling data enabled through "
+ "--profiling-format." },
+# endif
{ nullptr, nullptr }
};
@@ -286,16 +294,16 @@ int do_cmake(int ac, char const* const* av)
cmStateEnums::CacheEntryType t = cm.GetState()->GetCacheEntryType(k);
if (t != cmStateEnums::INTERNAL && t != cmStateEnums::STATIC &&
t != cmStateEnums::UNINITIALIZED) {
- const char* advancedProp =
+ cmProp advancedProp =
cm.GetState()->GetCacheEntryProperty(k, "ADVANCED");
if (list_all_cached || !advancedProp) {
if (list_help) {
- std::cout << "// "
- << cm.GetState()->GetCacheEntryProperty(k, "HELPSTRING")
- << std::endl;
+ cmProp help =
+ cm.GetState()->GetCacheEntryProperty(k, "HELPSTRING");
+ std::cout << "// " << (help ? *help : "") << std::endl;
}
std::cout << k << ":" << cmState::CacheEntryTypeToString(t) << "="
- << cm.GetState()->GetCacheEntryValue(k) << std::endl;
+ << cm.GetState()->GetSafeCacheEntryValue(k) << std::endl;
if (list_help) {
std::cout << std::endl;
}
@@ -312,6 +320,7 @@ int do_cmake(int ac, char const* const* av)
return 0;
}
+#ifndef CMAKE_BOOTSTRAP
int extract_job_number(int& index, char const* current, char const* next,
int len_of_flag)
{
@@ -341,6 +350,7 @@ int extract_job_number(int& index, char const* current, char const* next,
}
return jobs;
}
+#endif
int do_build(int ac, char const* const* av)
{
diff --git a/Source/cmcldeps.cxx b/Source/cmcldeps.cxx
index caf6453..5c27ac1 100644
--- a/Source/cmcldeps.cxx
+++ b/Source/cmcldeps.cxx
@@ -25,6 +25,7 @@
#include "cmsys/Encoding.hxx"
+#include "cmStringAlgorithms.h"
#include "cmSystemTools.h"
// We don't want any wildcard expansion.
@@ -63,7 +64,7 @@ static void usage(const char* msg)
msg);
}
-static std::string trimLeadingSpace(const std::string& cmdline)
+static cm::string_view trimLeadingSpace(cm::string_view cmdline)
{
int i = 0;
for (; cmdline[i] == ' '; ++i)
@@ -81,34 +82,30 @@ static void replaceAll(std::string& str, const std::string& search,
}
}
-bool startsWith(const std::string& str, const std::string& what)
-{
- return str.compare(0, what.size(), what) == 0;
-}
-
// Strips one argument from the cmdline and returns it. "surrounding quotes"
// are removed from the argument if there were any.
static std::string getArg(std::string& cmdline)
{
- std::string ret;
bool in_quoted = false;
unsigned int i = 0;
- cmdline = trimLeadingSpace(cmdline);
+ cm::string_view cmdview = trimLeadingSpace(cmdline);
+ size_t spaceCnt = cmdline.size() - cmdview.size();
for (;; ++i) {
- if (i >= cmdline.size())
+ if (i >= cmdview.size())
usage("Couldn't parse arguments.");
- if (!in_quoted && cmdline[i] == ' ')
+ if (!in_quoted && cmdview[i] == ' ')
break; // "a b" "x y"
- if (cmdline[i] == '"')
+ if (cmdview[i] == '"')
in_quoted = !in_quoted;
}
- ret = cmdline.substr(0, i);
- if (ret[0] == '"' && ret[i - 1] == '"')
- ret = ret.substr(1, ret.size() - 2);
- cmdline = cmdline.substr(i);
+ cmdview = cmdview.substr(0, i);
+ if (cmdview[0] == '"' && cmdview[i - 1] == '"')
+ cmdview = cmdview.substr(1, i - 2);
+ std::string ret(cmdview);
+ cmdline.erase(0, spaceCnt + i);
return ret;
}
@@ -127,7 +124,7 @@ static void parseCommandLine(LPWSTR wincmdline, std::string& lang,
prefix = getArg(cmdline);
clpath = getArg(cmdline);
binpath = getArg(cmdline);
- rest = trimLeadingSpace(cmdline);
+ rest = std::string(trimLeadingSpace(cmdline));
}
// Not all backslashes need to be escaped in a depfile, but it's easier that
@@ -169,8 +166,8 @@ static void outputDepFile(const std::string& dfile, const std::string& objfile,
// build.ninja file. Therefore we need to canonicalize the path to use
// backward slashes and relativize the path to the build directory.
replaceAll(tmp, "/", "\\");
- if (startsWith(tmp, cwd))
- tmp = tmp.substr(cwd.size());
+ if (cmHasPrefix(tmp, cwd))
+ tmp.erase(0, cwd.size());
escapePath(tmp);
fprintf(out, "%s \\\n", tmp.c_str());
}
@@ -194,7 +191,7 @@ std::string replace(const std::string& str, const std::string& what,
return replaced.replace(pos, what.size(), replacement);
}
-static int process(const std::string& srcfilename, const std::string& dfile,
+static int process(cm::string_view srcfilename, const std::string& dfile,
const std::string& objfile, const std::string& prefix,
const std::string& cmd, const std::string& dir = "",
bool quiet = false)
@@ -221,13 +218,14 @@ static int process(const std::string& srcfilename, const std::string& dfile,
std::vector<std::string> includes;
bool isFirstLine = true; // cl prints always first the source filename
while (std::getline(ss, line)) {
- if (startsWith(line, prefix)) {
- std::string inc = trimLeadingSpace(line.substr(prefix.size()).c_str());
+ cm::string_view inc(line);
+ if (cmHasPrefix(inc, prefix)) {
+ inc = trimLeadingSpace(inc.substr(prefix.size()));
if (inc.back() == '\r') // blech, stupid \r\n
inc = inc.substr(0, inc.size() - 1);
- includes.push_back(inc);
+ includes.emplace_back(std::string(inc));
} else {
- if (!isFirstLine || !startsWith(line, srcfilename)) {
+ if (!isFirstLine || !cmHasPrefix(inc, srcfilename)) {
if (!quiet || exit_code != 0) {
fprintf(stdout, "%s\n", line.c_str());
}
@@ -258,14 +256,10 @@ int main()
cl, binpath, rest);
// needed to suppress filename output of msvc tools
- std::string srcfilename;
- {
- std::string::size_type pos = srcfile.rfind('\\');
- if (pos == std::string::npos) {
- srcfilename = srcfile;
- } else {
- srcfilename = srcfile.substr(pos + 1);
- }
+ cm::string_view srcfilename(srcfile);
+ std::string::size_type pos = srcfile.rfind('\\');
+ if (pos != std::string::npos) {
+ srcfilename = srcfilename.substr(pos + 1);
}
std::string nol = " /nologo ";
@@ -286,7 +280,7 @@ int main()
// call cl in object dir so the .i is generated there
std::string objdir;
{
- std::string::size_type pos = objfile.rfind("\\");
+ pos = objfile.rfind("\\");
if (pos != std::string::npos) {
objdir = objfile.substr(0, pos);
}
diff --git a/Source/cmcmd.cxx b/Source/cmcmd.cxx
index 2b8ea24..de76d73 100644
--- a/Source/cmcmd.cxx
+++ b/Source/cmcmd.cxx
@@ -4,11 +4,9 @@
#include <cmext/algorithm>
+#include <cm3p/uv.h>
#include <fcntl.h>
-#include "cm_uv.h"
-
-#include "cmAlgorithms.h"
#include "cmDuration.h"
#include "cmGlobalGenerator.h"
#include "cmLocalGenerator.h"
@@ -90,6 +88,7 @@ void CMakeCommandUsage(const char* program)
<< "Available commands: \n"
<< " capabilities - Report capabilities built into cmake "
"in JSON format\n"
+ << " cat <files>... - concat the files and print them to the standard output\n"
<< " chdir dir cmd [args...] - run command in a given directory\n"
<< " compare_files [--ignore-eol] file1 file2\n"
<< " - check if file1 is same as file2\n"
@@ -180,6 +179,13 @@ static bool cmTarFilesFrom(std::string const& file,
return true;
}
+static void cmCatFile(const std::string& fileToAppend)
+{
+ cmsys::ifstream source(fileToAppend.c_str(),
+ (std::ios::binary | std::ios::in));
+ std::cout << source.rdbuf();
+}
+
static bool cmRemoveDirectory(const std::string& dir, bool recursive = true)
{
if (cmSystemTools::FileIsSymlink(dir)) {
@@ -678,7 +684,7 @@ int cmcmd::ExecuteCMakeCommand(std::vector<std::string> const& args)
} else if (!a.empty() && a[0] == '-') {
// Environment variable and command names cannot start in '-',
// so this must be an unknown option.
- std::cerr << "cmake -E env: unknown option '" << a << "'"
+ std::cerr << "cmake -E env: unknown option '" << a << '\''
<< std::endl;
return 1;
} else if (a.find('=') != std::string::npos) {
@@ -927,6 +933,33 @@ int cmcmd::ExecuteCMakeCommand(std::vector<std::string> const& args)
return HashSumFile(args, cmCryptoHash::AlgoSHA512);
}
+ // Command to concat files into one
+ if (args[1] == "cat" && args.size() >= 3) {
+ int return_value = 0;
+ for (auto const& arg : cmMakeRange(args).advance(2)) {
+ if (cmHasLiteralPrefix(arg, "-")) {
+ if (arg != "--") {
+ cmSystemTools::Error(arg + ": option not handled");
+ return_value = 1;
+ }
+ } else if (!cmSystemTools::TestFileAccess(arg,
+ cmsys::TEST_FILE_READ) &&
+ cmSystemTools::TestFileAccess(arg, cmsys::TEST_FILE_OK)) {
+ cmSystemTools::Error(arg + ": permission denied (ignoring)");
+ return_value = 1;
+ } else if (cmSystemTools::FileIsDirectory(arg)) {
+ cmSystemTools::Error(arg + ": is a directory (ignoring)");
+ return_value = 1;
+ } else if (!cmSystemTools::FileExists(arg)) {
+ cmSystemTools::Error(arg + ": no such file or directory (ignoring)");
+ return_value = 1;
+ } else {
+ cmCatFile(arg);
+ }
+ }
+ return return_value;
+ }
+
// Command to change directory and run a program.
if (args[1] == "chdir" && args.size() >= 4) {
std::string const& directory = args[2];
@@ -1054,8 +1087,7 @@ int cmcmd::ExecuteCMakeCommand(std::vector<std::string> const& args)
homeOutDir = args[5];
startOutDir = args[6];
depInfo = args[7];
- if (args.size() >= 9 && args[8].length() >= 8 &&
- args[8].substr(0, 8) == "--color=") {
+ if (args.size() >= 9 && cmHasLiteralPrefix(args[8], "--color=")) {
// Enable or disable color based on the switch value.
color = (args[8].size() == 8 || cmIsOn(args[8].substr(8)));
}
@@ -1186,7 +1218,7 @@ int cmcmd::ExecuteCMakeCommand(std::vector<std::string> const& args)
}
} else if (cmHasLiteralPrefix(arg, "--format=")) {
format = arg.substr(9);
- if (!cmContains(knownFormats, format)) {
+ if (!cm::contains(knownFormats, format)) {
cmSystemTools::Error("Unknown -E tar --format= argument: " +
format);
return 1;
@@ -1304,7 +1336,7 @@ int cmcmd::ExecuteCMakeCommand(std::vector<std::string> const& args)
} else if (arg == "--debug") {
pipe.clear();
isDebug = true;
- } else if (arg.substr(0, pipePrefix.size()) == pipePrefix) {
+ } else if (cmHasPrefix(arg, pipePrefix)) {
isDebug = false;
pipe = arg.substr(pipePrefix.size());
if (pipe.empty()) {
@@ -1511,7 +1543,7 @@ int cmcmd::ExecuteEchoColor(std::vector<std::string> const& args)
bool newline = true;
std::string progressDir;
for (auto const& arg : cmMakeRange(args).advance(2)) {
- if (arg.find("--switch=") == 0) {
+ if (cmHasLiteralPrefix(arg, "--switch=")) {
// Enable or disable color based on the switch value.
std::string value = arg.substr(9);
if (!value.empty()) {
@@ -1566,7 +1598,7 @@ int cmcmd::ExecuteLinkScript(std::vector<std::string> const& args)
// args[3] == --verbose=?
bool verbose = false;
if (args.size() >= 4) {
- if (args[3].find("--verbose=") == 0) {
+ if (cmHasLiteralPrefix(args[3], "--verbose=")) {
if (!cmIsOff(args[3].substr(10))) {
verbose = true;
}
@@ -1654,11 +1686,13 @@ int cmcmd::WindowsCEEnvironment(const char* version, const std::string& name)
cmVisualStudioWCEPlatformParser parser(name.c_str());
parser.ParseVersion(version);
if (parser.Found()) {
- std::cout << "@echo off" << std::endl;
- std::cout << "echo Environment Selection: " << name << std::endl;
- std::cout << "set PATH=" << parser.GetPathDirectories() << std::endl;
- std::cout << "set INCLUDE=" << parser.GetIncludeDirectories() << std::endl;
- std::cout << "set LIB=" << parser.GetLibraryDirectories() << std::endl;
+ /* clang-format off */
+ std::cout << "@echo off\n"
+ "echo Environment Selection: " << name << "\n"
+ "set PATH=" << parser.GetPathDirectories() << "\n"
+ "set INCLUDE=" << parser.GetIncludeDirectories() << "\n"
+ "set LIB=" << parser.GetLibraryDirectories() << std::endl;
+ /* clang-format on */
return 0;
}
#else
@@ -1845,7 +1879,7 @@ int cmcmd::VisualStudioLink(std::vector<std::string> const& args, int type)
std::vector<std::string> expandedArgs;
for (std::string const& i : args) {
// check for nmake temporary files
- if (i[0] == '@' && i.find("@CMakeFiles") != 0) {
+ if (i[0] == '@' && !cmHasLiteralPrefix(i, "@CMakeFiles")) {
cmsys::ifstream fin(i.substr(1).c_str());
std::string line;
while (cmSystemTools::GetLineFromStream(fin, line)) {
@@ -1971,9 +2005,8 @@ bool cmVSLink::Parse(std::vector<std::string>::const_iterator argBeg,
// Parse the link command to extract information we need.
for (; arg != argEnd; ++arg) {
- if (cmSystemTools::Strucmp(arg->c_str(), "/INCREMENTAL:YES") == 0) {
- this->Incremental = true;
- } else if (cmSystemTools::Strucmp(arg->c_str(), "/INCREMENTAL") == 0) {
+ if (cmSystemTools::Strucmp(arg->c_str(), "/INCREMENTAL:YES") == 0 ||
+ cmSystemTools::Strucmp(arg->c_str(), "/INCREMENTAL") == 0) {
this->Incremental = true;
} else if (cmSystemTools::Strucmp(arg->c_str(), "/MANIFEST:NO") == 0) {
this->LinkGeneratesManifest = false;
@@ -2083,12 +2116,18 @@ int cmVSLink::LinkIncremental()
}
// If we have not previously generated a manifest file,
- // generate an empty one so the resource compiler succeeds.
+ // generate a manifest file so the resource compiler succeeds.
if (!cmSystemTools::FileExists(this->ManifestFile)) {
if (this->Verbose) {
std::cout << "Create empty: " << this->ManifestFile << "\n";
}
- cmsys::ofstream foutTmp(this->ManifestFile.c_str());
+ if (this->UserManifests.empty()) {
+ // generate an empty manifest because there are no user provided
+ // manifest files.
+ cmsys::ofstream foutTmp(this->ManifestFile.c_str());
+ } else {
+ this->RunMT("/out:" + this->ManifestFile, false);
+ }
}
// Compile the resource file.
@@ -2156,7 +2195,10 @@ int cmVSLink::RunMT(std::string const& out, bool notify)
mtCommand.push_back(this->MtPath.empty() ? "mt" : this->MtPath);
mtCommand.emplace_back("/nologo");
mtCommand.emplace_back("/manifest");
- if (this->LinkGeneratesManifest) {
+
+ // add the linker generated manifest if the file exists.
+ if (this->LinkGeneratesManifest &&
+ cmSystemTools::FileExists(this->LinkerManifestFile)) {
mtCommand.push_back(this->LinkerManifestFile);
}
cm::append(mtCommand, this->UserManifests);
diff --git a/Source/ctest.cxx b/Source/ctest.cxx
index fbdf75a..3b5bf8c 100644
--- a/Source/ctest.cxx
+++ b/Source/ctest.cxx
@@ -35,6 +35,7 @@ static const char* cmDocumentationOptions[][2] = {
{ "--output-on-failure",
"Output anything outputted by the test program "
"if the test should fail." },
+ { "--stop-on-failure", "Stop running the tests after one has failed." },
{ "--test-output-size-passed <size>",
"Limit the output for passed tests "
"to <size> bytes" },
diff --git a/Source/kwsys/Base64.c b/Source/kwsys/Base64.c
index bf876f2..4265018 100644
--- a/Source/kwsys/Base64.c
+++ b/Source/kwsys/Base64.c
@@ -130,7 +130,10 @@ size_t kwsysBase64_Encode(const unsigned char* input, size_t length,
/* Decode 4 bytes into a 3 byte string. */
int kwsysBase64_Decode3(const unsigned char* src, unsigned char* dest)
{
- unsigned char d0, d1, d2, d3;
+ unsigned char d0;
+ unsigned char d1;
+ unsigned char d2;
+ unsigned char d3;
d0 = kwsysBase64DecodeChar(src[0]);
d1 = kwsysBase64DecodeChar(src[1]);
diff --git a/Source/kwsys/CMakeLists.txt b/Source/kwsys/CMakeLists.txt
index 09bcdb9..d8f7e57 100644
--- a/Source/kwsys/CMakeLists.txt
+++ b/Source/kwsys/CMakeLists.txt
@@ -11,9 +11,9 @@
# be used. All classes are disabled by default. The CMake listfile
# above this one configures the library as follows:
#
-# SET(KWSYS_NAMESPACE foosys)
-# SET(KWSYS_USE_Directory 1) # Enable Directory class.
-# SUBDIRS(kwsys)
+# set(KWSYS_NAMESPACE foosys)
+# set(KWSYS_USE_Directory 1) # Enable Directory class.
+# add_subdirectory(kwsys)
#
# Optional settings are as follows:
#
@@ -39,8 +39,8 @@
#
# Example:
#
-# SET(KWSYS_HEADER_ROOT ${PROJECT_BINARY_DIR})
-# INCLUDE_DIRECTORIES(${PROJECT_BINARY_DIR})
+# set(KWSYS_HEADER_ROOT ${PROJECT_BINARY_DIR})
+# include_directories(${PROJECT_BINARY_DIR})
#
# KWSYS_CXX_STANDARD = A value for CMAKE_CXX_STANDARD within KWSys.
# Set to empty string to use no default value.
@@ -65,11 +65,11 @@
#
# Example:
#
-# SET(KWSYS_INSTALL_BIN_DIR bin)
-# SET(KWSYS_INSTALL_LIB_DIR lib)
-# SET(KWSYS_INSTALL_INCLUDE_DIR include)
-# SET(KWSYS_INSTALL_COMPONENT_NAME_RUNTIME Runtime)
-# SET(KWSYS_INSTALL_COMPONENT_NAME_DEVELOPMENT Development)
+# set(KWSYS_INSTALL_BIN_DIR bin)
+# set(KWSYS_INSTALL_LIB_DIR lib)
+# set(KWSYS_INSTALL_INCLUDE_DIR include)
+# set(KWSYS_INSTALL_COMPONENT_NAME_RUNTIME Runtime)
+# set(KWSYS_INSTALL_COMPONENT_NAME_DEVELOPMENT Development)
# Once configured, kwsys should be used as follows from C or C++ code:
#
@@ -86,33 +86,33 @@
# any outside mailing list and no documentation of the change will be
# written.
-CMAKE_MINIMUM_REQUIRED(VERSION 3.1 FATAL_ERROR)
-FOREACH(p
+cmake_minimum_required(VERSION 3.1 FATAL_ERROR)
+foreach(p
CMP0056 # CMake 3.2, Honor link flags in try_compile() source-file signature.
CMP0063 # CMake 3.3, Honor visibility properties for all target types.
CMP0067 # CMake 3.8, Honor language standard in try_compile source-file signature.
CMP0069 # CMake 3.9, INTERPROCEDURAL_OPTIMIZATION is enforced when enabled.
)
- IF(POLICY ${p})
- CMAKE_POLICY(SET ${p} NEW)
- ENDIF()
-ENDFOREACH()
+ if(POLICY ${p})
+ cmake_policy(SET ${p} NEW)
+ endif()
+endforeach()
#-----------------------------------------------------------------------------
# If a namespace is not specified, use "kwsys" and enable testing.
# This should be the case only when kwsys is not included inside
# another project and is being tested.
-IF(NOT KWSYS_NAMESPACE)
- SET(KWSYS_NAMESPACE "kwsys")
- SET(KWSYS_STANDALONE 1)
-ENDIF()
+if(NOT KWSYS_NAMESPACE)
+ set(KWSYS_NAMESPACE "kwsys")
+ set(KWSYS_STANDALONE 1)
+endif()
#-----------------------------------------------------------------------------
# The project name is that of the specified namespace.
-PROJECT(${KWSYS_NAMESPACE})
+project(${KWSYS_NAMESPACE})
# Tell CMake how to follow dependencies of sources in this directory.
-SET_PROPERTY(DIRECTORY
+set_property(DIRECTORY
PROPERTY IMPLICIT_DEPENDS_INCLUDE_TRANSFORM
"KWSYS_HEADER(%)=<${KWSYS_NAMESPACE}/%>"
)
@@ -131,229 +131,229 @@ elseif(NOT DEFINED CMAKE_CXX_STANDARD AND NOT DEFINED KWSYS_CXX_STANDARD)
endif()
# Select library components.
-IF(KWSYS_STANDALONE OR CMake_SOURCE_DIR)
- SET(KWSYS_ENABLE_C 1)
+if(KWSYS_STANDALONE OR CMake_SOURCE_DIR)
+ set(KWSYS_ENABLE_C 1)
# Enable all components.
- SET(KWSYS_USE_Base64 1)
- SET(KWSYS_USE_Directory 1)
- SET(KWSYS_USE_DynamicLoader 1)
- SET(KWSYS_USE_Encoding 1)
- SET(KWSYS_USE_Glob 1)
- SET(KWSYS_USE_MD5 1)
- SET(KWSYS_USE_Process 1)
- SET(KWSYS_USE_RegularExpression 1)
- SET(KWSYS_USE_System 1)
- SET(KWSYS_USE_SystemTools 1)
- SET(KWSYS_USE_CommandLineArguments 1)
- SET(KWSYS_USE_Terminal 1)
- SET(KWSYS_USE_IOStream 1)
- SET(KWSYS_USE_FStream 1)
- SET(KWSYS_USE_String 1)
- SET(KWSYS_USE_SystemInformation 1)
- SET(KWSYS_USE_ConsoleBuf 1)
-ENDIF()
+ set(KWSYS_USE_Base64 1)
+ set(KWSYS_USE_Directory 1)
+ set(KWSYS_USE_DynamicLoader 1)
+ set(KWSYS_USE_Encoding 1)
+ set(KWSYS_USE_Glob 1)
+ set(KWSYS_USE_MD5 1)
+ set(KWSYS_USE_Process 1)
+ set(KWSYS_USE_RegularExpression 1)
+ set(KWSYS_USE_System 1)
+ set(KWSYS_USE_SystemTools 1)
+ set(KWSYS_USE_CommandLineArguments 1)
+ set(KWSYS_USE_Terminal 1)
+ set(KWSYS_USE_IOStream 1)
+ set(KWSYS_USE_FStream 1)
+ set(KWSYS_USE_String 1)
+ set(KWSYS_USE_SystemInformation 1)
+ set(KWSYS_USE_ConsoleBuf 1)
+endif()
# Enforce component dependencies.
-IF(KWSYS_USE_SystemTools)
- SET(KWSYS_USE_Directory 1)
- SET(KWSYS_USE_FStream 1)
- SET(KWSYS_USE_Encoding 1)
-ENDIF()
-IF(KWSYS_USE_Glob)
- SET(KWSYS_USE_Directory 1)
- SET(KWSYS_USE_SystemTools 1)
- SET(KWSYS_USE_RegularExpression 1)
- SET(KWSYS_USE_FStream 1)
- SET(KWSYS_USE_Encoding 1)
-ENDIF()
-IF(KWSYS_USE_Process)
- SET(KWSYS_USE_System 1)
- SET(KWSYS_USE_Encoding 1)
-ENDIF()
-IF(KWSYS_USE_SystemInformation)
- SET(KWSYS_USE_Process 1)
-ENDIF()
-IF(KWSYS_USE_System)
- SET(KWSYS_USE_Encoding 1)
-ENDIF()
-IF(KWSYS_USE_Directory)
- SET(KWSYS_USE_Encoding 1)
-ENDIF()
-IF(KWSYS_USE_DynamicLoader)
- SET(KWSYS_USE_Encoding 1)
-ENDIF()
-IF(KWSYS_USE_FStream)
- SET(KWSYS_USE_Encoding 1)
-ENDIF()
-IF(KWSYS_USE_ConsoleBuf)
- SET(KWSYS_USE_Encoding 1)
-ENDIF()
+if(KWSYS_USE_SystemTools)
+ set(KWSYS_USE_Directory 1)
+ set(KWSYS_USE_FStream 1)
+ set(KWSYS_USE_Encoding 1)
+endif()
+if(KWSYS_USE_Glob)
+ set(KWSYS_USE_Directory 1)
+ set(KWSYS_USE_SystemTools 1)
+ set(KWSYS_USE_RegularExpression 1)
+ set(KWSYS_USE_FStream 1)
+ set(KWSYS_USE_Encoding 1)
+endif()
+if(KWSYS_USE_Process)
+ set(KWSYS_USE_System 1)
+ set(KWSYS_USE_Encoding 1)
+endif()
+if(KWSYS_USE_SystemInformation)
+ set(KWSYS_USE_Process 1)
+endif()
+if(KWSYS_USE_System)
+ set(KWSYS_USE_Encoding 1)
+endif()
+if(KWSYS_USE_Directory)
+ set(KWSYS_USE_Encoding 1)
+endif()
+if(KWSYS_USE_DynamicLoader)
+ set(KWSYS_USE_Encoding 1)
+endif()
+if(KWSYS_USE_FStream)
+ set(KWSYS_USE_Encoding 1)
+endif()
+if(KWSYS_USE_ConsoleBuf)
+ set(KWSYS_USE_Encoding 1)
+endif()
# Specify default 8 bit encoding for Windows
-IF(NOT KWSYS_ENCODING_DEFAULT_CODEPAGE)
- SET(KWSYS_ENCODING_DEFAULT_CODEPAGE CP_ACP)
-ENDIF()
+if(NOT KWSYS_ENCODING_DEFAULT_CODEPAGE)
+ set(KWSYS_ENCODING_DEFAULT_CODEPAGE CP_ACP)
+endif()
# Enable testing if building standalone.
-IF(KWSYS_STANDALONE)
- INCLUDE(Dart)
- MARK_AS_ADVANCED(BUILD_TESTING DART_ROOT TCL_TCLSH)
- IF(BUILD_TESTING)
- ENABLE_TESTING()
- ENDIF()
-ENDIF()
+if(KWSYS_STANDALONE)
+ include(Dart)
+ mark_as_advanced(BUILD_TESTING DART_ROOT TCL_TCLSH)
+ if(BUILD_TESTING)
+ enable_testing()
+ endif()
+endif()
# Choose default shared/static build if not specified.
-IF(NOT DEFINED KWSYS_BUILD_SHARED)
- SET(KWSYS_BUILD_SHARED ${BUILD_SHARED_LIBS})
-ENDIF()
+if(NOT DEFINED KWSYS_BUILD_SHARED)
+ set(KWSYS_BUILD_SHARED ${BUILD_SHARED_LIBS})
+endif()
# Include helper macros.
-INCLUDE(${CMAKE_CURRENT_SOURCE_DIR}/kwsysPlatformTests.cmake)
-INCLUDE(CheckTypeSize)
+include(${CMAKE_CURRENT_SOURCE_DIR}/kwsysPlatformTests.cmake)
+include(CheckTypeSize)
# Do full dependency headers.
-INCLUDE_REGULAR_EXPRESSION("^.*$")
+include_regular_expression("^.*$")
# Use new KWSYS_INSTALL_*_DIR variable names to control installation.
# Take defaults from the old names. Note that there was no old name
# for the bin dir, so we take the old lib dir name so DLLs will be
# installed in a compatible way for old code.
-IF(NOT KWSYS_INSTALL_INCLUDE_DIR)
- STRING(REGEX REPLACE "^/" "" KWSYS_INSTALL_INCLUDE_DIR
+if(NOT KWSYS_INSTALL_INCLUDE_DIR)
+ string(REGEX REPLACE "^/" "" KWSYS_INSTALL_INCLUDE_DIR
"${KWSYS_HEADER_INSTALL_DIR}")
-ENDIF()
-IF(NOT KWSYS_INSTALL_LIB_DIR)
- STRING(REGEX REPLACE "^/" "" KWSYS_INSTALL_LIB_DIR
+endif()
+if(NOT KWSYS_INSTALL_LIB_DIR)
+ string(REGEX REPLACE "^/" "" KWSYS_INSTALL_LIB_DIR
"${KWSYS_LIBRARY_INSTALL_DIR}")
-ENDIF()
-IF(NOT KWSYS_INSTALL_BIN_DIR)
- STRING(REGEX REPLACE "^/" "" KWSYS_INSTALL_BIN_DIR
+endif()
+if(NOT KWSYS_INSTALL_BIN_DIR)
+ string(REGEX REPLACE "^/" "" KWSYS_INSTALL_BIN_DIR
"${KWSYS_LIBRARY_INSTALL_DIR}")
-ENDIF()
+endif()
# Setup header install rules.
-SET(KWSYS_INSTALL_INCLUDE_OPTIONS)
-IF(KWSYS_INSTALL_COMPONENT_NAME_DEVELOPMENT)
- SET(KWSYS_INSTALL_INCLUDE_OPTIONS ${KWSYS_INSTALL_INCLUDE_OPTIONS}
+set(KWSYS_INSTALL_INCLUDE_OPTIONS)
+if(KWSYS_INSTALL_COMPONENT_NAME_DEVELOPMENT)
+ set(KWSYS_INSTALL_INCLUDE_OPTIONS ${KWSYS_INSTALL_INCLUDE_OPTIONS}
COMPONENT ${KWSYS_INSTALL_COMPONENT_NAME_DEVELOPMENT}
)
-ENDIF()
+endif()
# Setup library install rules.
-SET(KWSYS_INSTALL_LIBRARY_RULE)
-SET(KWSYS_INSTALL_NAMELINK_RULE)
-IF(KWSYS_INSTALL_LIB_DIR)
- IF(KWSYS_INSTALL_EXPORT_NAME)
- LIST(APPEND KWSYS_INSTALL_LIBRARY_RULE EXPORT ${KWSYS_INSTALL_EXPORT_NAME})
- ENDIF()
+set(KWSYS_INSTALL_LIBRARY_RULE)
+set(KWSYS_INSTALL_NAMELINK_RULE)
+if(KWSYS_INSTALL_LIB_DIR)
+ if(KWSYS_INSTALL_EXPORT_NAME)
+ list(APPEND KWSYS_INSTALL_LIBRARY_RULE EXPORT ${KWSYS_INSTALL_EXPORT_NAME})
+ endif()
# Install the shared library to the lib directory.
- SET(KWSYS_INSTALL_LIBRARY_RULE ${KWSYS_INSTALL_LIBRARY_RULE}
+ set(KWSYS_INSTALL_LIBRARY_RULE ${KWSYS_INSTALL_LIBRARY_RULE}
LIBRARY DESTINATION ${KWSYS_INSTALL_LIB_DIR} NAMELINK_SKIP
)
# Assign the shared library to the runtime component.
- IF(KWSYS_INSTALL_COMPONENT_NAME_RUNTIME)
- SET(KWSYS_INSTALL_LIBRARY_RULE ${KWSYS_INSTALL_LIBRARY_RULE}
+ if(KWSYS_INSTALL_COMPONENT_NAME_RUNTIME)
+ set(KWSYS_INSTALL_LIBRARY_RULE ${KWSYS_INSTALL_LIBRARY_RULE}
COMPONENT ${KWSYS_INSTALL_COMPONENT_NAME_RUNTIME}
)
- ENDIF()
- IF(KWSYS_BUILD_SHARED)
- SET(KWSYS_INSTALL_NAMELINK_RULE ${KWSYS_INSTALL_NAMELINK_RULE}
+ endif()
+ if(KWSYS_BUILD_SHARED)
+ set(KWSYS_INSTALL_NAMELINK_RULE ${KWSYS_INSTALL_NAMELINK_RULE}
LIBRARY DESTINATION ${KWSYS_INSTALL_LIB_DIR} NAMELINK_ONLY
)
# Assign the namelink to the development component.
- IF(KWSYS_INSTALL_COMPONENT_NAME_DEVELOPMENT)
- SET(KWSYS_INSTALL_NAMELINK_RULE ${KWSYS_INSTALL_NAMELINK_RULE}
+ if(KWSYS_INSTALL_COMPONENT_NAME_DEVELOPMENT)
+ set(KWSYS_INSTALL_NAMELINK_RULE ${KWSYS_INSTALL_NAMELINK_RULE}
COMPONENT ${KWSYS_INSTALL_COMPONENT_NAME_DEVELOPMENT}
)
- ENDIF()
- ENDIF()
+ endif()
+ endif()
# Install the archive to the lib directory.
- SET(KWSYS_INSTALL_LIBRARY_RULE ${KWSYS_INSTALL_LIBRARY_RULE}
+ set(KWSYS_INSTALL_LIBRARY_RULE ${KWSYS_INSTALL_LIBRARY_RULE}
ARCHIVE DESTINATION ${KWSYS_INSTALL_LIB_DIR}
)
# Assign the archive to the development component.
- IF(KWSYS_INSTALL_COMPONENT_NAME_DEVELOPMENT)
- SET(KWSYS_INSTALL_LIBRARY_RULE ${KWSYS_INSTALL_LIBRARY_RULE}
+ if(KWSYS_INSTALL_COMPONENT_NAME_DEVELOPMENT)
+ set(KWSYS_INSTALL_LIBRARY_RULE ${KWSYS_INSTALL_LIBRARY_RULE}
COMPONENT ${KWSYS_INSTALL_COMPONENT_NAME_DEVELOPMENT}
)
- ENDIF()
-ENDIF()
-IF(KWSYS_INSTALL_BIN_DIR)
+ endif()
+endif()
+if(KWSYS_INSTALL_BIN_DIR)
# Install the runtime library to the bin directory.
- SET(KWSYS_INSTALL_LIBRARY_RULE ${KWSYS_INSTALL_LIBRARY_RULE}
+ set(KWSYS_INSTALL_LIBRARY_RULE ${KWSYS_INSTALL_LIBRARY_RULE}
RUNTIME DESTINATION ${KWSYS_INSTALL_BIN_DIR}
)
# Assign the runtime library to the runtime component.
- IF(KWSYS_INSTALL_COMPONENT_NAME_RUNTIME)
- SET(KWSYS_INSTALL_LIBRARY_RULE ${KWSYS_INSTALL_LIBRARY_RULE}
+ if(KWSYS_INSTALL_COMPONENT_NAME_RUNTIME)
+ set(KWSYS_INSTALL_LIBRARY_RULE ${KWSYS_INSTALL_LIBRARY_RULE}
COMPONENT ${KWSYS_INSTALL_COMPONENT_NAME_RUNTIME}
)
- ENDIF()
-ENDIF()
+ endif()
+endif()
# Do not support old KWSYS_*a_INSTALL_DIR variable names.
-SET(KWSYS_HEADER_INSTALL_DIR)
-SET(KWSYS_LIBRARY_INSTALL_DIR)
+set(KWSYS_HEADER_INSTALL_DIR)
+set(KWSYS_LIBRARY_INSTALL_DIR)
# Generated source files will need this header.
-STRING(COMPARE EQUAL "${PROJECT_SOURCE_DIR}" "${PROJECT_BINARY_DIR}"
+string(COMPARE EQUAL "${PROJECT_SOURCE_DIR}" "${PROJECT_BINARY_DIR}"
KWSYS_IN_SOURCE_BUILD)
-IF(NOT KWSYS_IN_SOURCE_BUILD)
- CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/kwsysPrivate.h
+if(NOT KWSYS_IN_SOURCE_BUILD)
+ configure_file(${PROJECT_SOURCE_DIR}/kwsysPrivate.h
${PROJECT_BINARY_DIR}/kwsysPrivate.h COPYONLY IMMEDIATE)
-ENDIF()
+endif()
# Select plugin module file name convention.
-IF(NOT KWSYS_DynamicLoader_PREFIX)
- SET(KWSYS_DynamicLoader_PREFIX ${CMAKE_SHARED_MODULE_PREFIX})
-ENDIF()
-IF(NOT KWSYS_DynamicLoader_SUFFIX)
- SET(KWSYS_DynamicLoader_SUFFIX ${CMAKE_SHARED_MODULE_SUFFIX})
-ENDIF()
+if(NOT KWSYS_DynamicLoader_PREFIX)
+ set(KWSYS_DynamicLoader_PREFIX ${CMAKE_SHARED_MODULE_PREFIX})
+endif()
+if(NOT KWSYS_DynamicLoader_SUFFIX)
+ set(KWSYS_DynamicLoader_SUFFIX ${CMAKE_SHARED_MODULE_SUFFIX})
+endif()
#-----------------------------------------------------------------------------
# We require ANSI support from the C compiler. Add any needed flags.
-IF(CMAKE_ANSI_CFLAGS)
- SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_ANSI_CFLAGS}")
-ENDIF()
+if(CMAKE_ANSI_CFLAGS)
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_ANSI_CFLAGS}")
+endif()
#-----------------------------------------------------------------------------
# Adjust compiler flags for some platforms.
-IF(NOT CMAKE_COMPILER_IS_GNUCXX)
- IF(CMAKE_SYSTEM MATCHES "OSF1-V.*")
- STRING(REGEX MATCH "-timplicit_local"
+if(NOT CMAKE_COMPILER_IS_GNUCXX)
+ if(CMAKE_SYSTEM MATCHES "OSF1-V.*")
+ string(REGEX MATCH "-timplicit_local"
KWSYS_CXX_FLAGS_HAVE_IMPLICIT_LOCAL "${CMAKE_CXX_FLAGS}")
- STRING(REGEX MATCH "-no_implicit_include"
+ string(REGEX MATCH "-no_implicit_include"
KWSYS_CXX_FLAGS_HAVE_NO_IMPLICIT_INCLUDE "${CMAKE_CXX_FLAGS}")
- IF(NOT KWSYS_CXX_FLAGS_HAVE_IMPLICIT_LOCAL)
- SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -timplicit_local")
- ENDIF()
- IF(NOT KWSYS_CXX_FLAGS_HAVE_NO_IMPLICIT_INCLUDE)
- SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -no_implicit_include")
- ENDIF()
- ENDIF()
- IF(CMAKE_SYSTEM MATCHES "HP-UX")
- SET(KWSYS_PLATFORM_CXX_TEST_EXTRA_FLAGS "+p")
- IF(CMAKE_CXX_COMPILER_ID MATCHES "HP")
+ if(NOT KWSYS_CXX_FLAGS_HAVE_IMPLICIT_LOCAL)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -timplicit_local")
+ endif()
+ if(NOT KWSYS_CXX_FLAGS_HAVE_NO_IMPLICIT_INCLUDE)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -no_implicit_include")
+ endif()
+ endif()
+ if(CMAKE_SYSTEM MATCHES "HP-UX")
+ set(KWSYS_PLATFORM_CXX_TEST_EXTRA_FLAGS "+p")
+ if(CMAKE_CXX_COMPILER_ID MATCHES "HP")
# it is known that version 3.85 fails and 6.25 works without these flags
- IF(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4)
+ if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4)
# use new C++ library and improved template support
- SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -AA +hpxstd98")
- ENDIF()
- ENDIF()
- ENDIF()
-ENDIF()
-IF(KWSYS_STANDALONE)
- IF(CMAKE_CXX_COMPILER_ID STREQUAL SunPro)
- IF(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.13)
- SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++03")
- ELSE()
- SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -library=stlport4")
- ENDIF()
- ENDIF()
-ENDIF()
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -AA +hpxstd98")
+ endif()
+ endif()
+ endif()
+endif()
+if(KWSYS_STANDALONE)
+ if(CMAKE_CXX_COMPILER_ID STREQUAL SunPro)
+ if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.13)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++03")
+ else()
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -library=stlport4")
+ endif()
+ endif()
+endif()
#-----------------------------------------------------------------------------
# Configure the standard library header wrappers based on compiler's
@@ -365,75 +365,75 @@ KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_LONG_LONG
"Checking whether C++ compiler has 'long long'" DIRECT)
KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS___INT64
"Checking whether C++ compiler has '__int64'" DIRECT)
-IF(KWSYS_CXX_HAS___INT64)
+if(KWSYS_CXX_HAS___INT64)
KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_SAME_LONG_AND___INT64
"Checking whether long and __int64 are the same type" DIRECT)
- IF(KWSYS_CXX_HAS_LONG_LONG)
+ if(KWSYS_CXX_HAS_LONG_LONG)
KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_SAME_LONG_LONG_AND___INT64
"Checking whether long long and __int64 are the same type" DIRECT)
- ENDIF()
-ENDIF()
+ endif()
+endif()
# Enable the "long long" type if it is available. It is standard in
# C99 and C++03 but not in earlier standards.
-IF(KWSYS_CXX_HAS_LONG_LONG)
- SET(KWSYS_USE_LONG_LONG 1)
-ELSE()
- SET(KWSYS_USE_LONG_LONG 0)
-ENDIF()
+if(KWSYS_CXX_HAS_LONG_LONG)
+ set(KWSYS_USE_LONG_LONG 1)
+else()
+ set(KWSYS_USE_LONG_LONG 0)
+endif()
# Enable the "__int64" type if it is available and unique. It is not
# standard.
-SET(KWSYS_USE___INT64 0)
-IF(KWSYS_CXX_HAS___INT64)
- IF(NOT KWSYS_CXX_SAME_LONG_AND___INT64)
- IF(NOT KWSYS_CXX_SAME_LONG_LONG_AND___INT64)
- SET(KWSYS_USE___INT64 1)
- ENDIF()
- ENDIF()
-ENDIF()
-
-IF(KWSYS_USE_Encoding)
+set(KWSYS_USE___INT64 0)
+if(KWSYS_CXX_HAS___INT64)
+ if(NOT KWSYS_CXX_SAME_LONG_AND___INT64)
+ if(NOT KWSYS_CXX_SAME_LONG_LONG_AND___INT64)
+ set(KWSYS_USE___INT64 1)
+ endif()
+ endif()
+endif()
+
+if(KWSYS_USE_Encoding)
# Look for type size helper macros.
KWSYS_PLATFORM_CXX_TEST(KWSYS_STL_HAS_WSTRING
"Checking whether wstring is available" DIRECT)
-ENDIF()
+endif()
-IF(KWSYS_USE_IOStream)
+if(KWSYS_USE_IOStream)
# Determine whether iostreams support long long.
- IF(KWSYS_CXX_HAS_LONG_LONG)
+ if(KWSYS_CXX_HAS_LONG_LONG)
KWSYS_PLATFORM_CXX_TEST(KWSYS_IOS_HAS_ISTREAM_LONG_LONG
"Checking if istream supports long long" DIRECT)
KWSYS_PLATFORM_CXX_TEST(KWSYS_IOS_HAS_OSTREAM_LONG_LONG
"Checking if ostream supports long long" DIRECT)
- ELSE()
- SET(KWSYS_IOS_HAS_ISTREAM_LONG_LONG 0)
- SET(KWSYS_IOS_HAS_OSTREAM_LONG_LONG 0)
- ENDIF()
- IF(KWSYS_CXX_HAS___INT64)
+ else()
+ set(KWSYS_IOS_HAS_ISTREAM_LONG_LONG 0)
+ set(KWSYS_IOS_HAS_OSTREAM_LONG_LONG 0)
+ endif()
+ if(KWSYS_CXX_HAS___INT64)
KWSYS_PLATFORM_CXX_TEST(KWSYS_IOS_HAS_ISTREAM___INT64
"Checking if istream supports __int64" DIRECT)
KWSYS_PLATFORM_CXX_TEST(KWSYS_IOS_HAS_OSTREAM___INT64
"Checking if ostream supports __int64" DIRECT)
- ELSE()
- SET(KWSYS_IOS_HAS_ISTREAM___INT64 0)
- SET(KWSYS_IOS_HAS_OSTREAM___INT64 0)
- ENDIF()
-ENDIF()
-
-IF(KWSYS_NAMESPACE MATCHES "^kwsys$")
- SET(KWSYS_NAME_IS_KWSYS 1)
-ELSE()
- SET(KWSYS_NAME_IS_KWSYS 0)
-ENDIF()
-
-IF(KWSYS_BUILD_SHARED)
- SET(KWSYS_BUILD_SHARED 1)
- SET(KWSYS_LIBRARY_TYPE SHARED)
-ELSE()
- SET(KWSYS_BUILD_SHARED 0)
- SET(KWSYS_LIBRARY_TYPE STATIC)
-ENDIF()
+ else()
+ set(KWSYS_IOS_HAS_ISTREAM___INT64 0)
+ set(KWSYS_IOS_HAS_OSTREAM___INT64 0)
+ endif()
+endif()
+
+if(KWSYS_NAMESPACE MATCHES "^kwsys$")
+ set(KWSYS_NAME_IS_KWSYS 1)
+else()
+ set(KWSYS_NAME_IS_KWSYS 0)
+endif()
+
+if(KWSYS_BUILD_SHARED)
+ set(KWSYS_BUILD_SHARED 1)
+ set(KWSYS_LIBRARY_TYPE SHARED)
+else()
+ set(KWSYS_BUILD_SHARED 0)
+ set(KWSYS_LIBRARY_TYPE STATIC)
+endif()
if(NOT DEFINED KWSYS_BUILD_PIC)
set(KWSYS_BUILD_PIC 0)
@@ -446,32 +446,32 @@ KWSYS_PLATFORM_C_TEST(KWSYS_C_HAS_PTRDIFF_T
"Checking whether C compiler has ptrdiff_t in stddef.h" DIRECT)
KWSYS_PLATFORM_C_TEST(KWSYS_C_HAS_SSIZE_T
"Checking whether C compiler has ssize_t in unistd.h" DIRECT)
-IF(KWSYS_USE_Process)
+if(KWSYS_USE_Process)
KWSYS_PLATFORM_C_TEST(KWSYS_C_HAS_CLOCK_GETTIME_MONOTONIC
"Checking whether C compiler has clock_gettime" DIRECT)
-ENDIF()
+endif()
-SET_SOURCE_FILES_PROPERTIES(ProcessUNIX.c System.c PROPERTIES
+set_source_files_properties(ProcessUNIX.c System.c PROPERTIES
COMPILE_FLAGS "-DKWSYS_C_HAS_PTRDIFF_T=${KWSYS_C_HAS_PTRDIFF_T} -DKWSYS_C_HAS_SSIZE_T=${KWSYS_C_HAS_SSIZE_T} -DKWSYS_C_HAS_CLOCK_GETTIME_MONOTONIC=${KWSYS_C_HAS_CLOCK_GETTIME_MONOTONIC}"
)
-IF(DEFINED KWSYS_PROCESS_USE_SELECT)
- GET_PROPERTY(ProcessUNIX_FLAGS SOURCE ProcessUNIX.c PROPERTY COMPILE_FLAGS)
- SET_PROPERTY(SOURCE ProcessUNIX.c PROPERTY COMPILE_FLAGS "${ProcessUNIX_FLAGS} -DKWSYSPE_USE_SELECT=${KWSYSPE_USE_SELECT}")
-ENDIF()
-
-IF(KWSYS_USE_DynamicLoader)
- GET_PROPERTY(KWSYS_SUPPORTS_SHARED_LIBS GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS)
- IF(KWSYS_SUPPORTS_SHARED_LIBS)
- SET(KWSYS_SUPPORTS_SHARED_LIBS 1)
- ELSE()
- SET(KWSYS_SUPPORTS_SHARED_LIBS 0)
- ENDIF()
- SET_PROPERTY(SOURCE DynamicLoader.cxx APPEND PROPERTY COMPILE_DEFINITIONS
+if(DEFINED KWSYS_PROCESS_USE_SELECT)
+ get_property(ProcessUNIX_FLAGS SOURCE ProcessUNIX.c PROPERTY COMPILE_FLAGS)
+ set_property(SOURCE ProcessUNIX.c PROPERTY COMPILE_FLAGS "${ProcessUNIX_FLAGS} -DKWSYSPE_USE_SELECT=${KWSYSPE_USE_SELECT}")
+endif()
+
+if(KWSYS_USE_DynamicLoader)
+ get_property(KWSYS_SUPPORTS_SHARED_LIBS GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS)
+ if(KWSYS_SUPPORTS_SHARED_LIBS)
+ set(KWSYS_SUPPORTS_SHARED_LIBS 1)
+ else()
+ set(KWSYS_SUPPORTS_SHARED_LIBS 0)
+ endif()
+ set_property(SOURCE DynamicLoader.cxx APPEND PROPERTY COMPILE_DEFINITIONS
KWSYS_SUPPORTS_SHARED_LIBS=${KWSYS_SUPPORTS_SHARED_LIBS})
-ENDIF()
+endif()
-IF(KWSYS_USE_SystemTools)
+if(KWSYS_USE_SystemTools)
if (NOT DEFINED KWSYS_SYSTEMTOOLS_USE_TRANSLATION_MAP)
set(KWSYS_SYSTEMTOOLS_USE_TRANSLATION_MAP 1)
endif ()
@@ -494,7 +494,7 @@ IF(KWSYS_USE_SystemTools)
"Checking whether CXX compiler struct stat has st_mtim member" DIRECT)
KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_STAT_HAS_ST_MTIMESPEC
"Checking whether CXX compiler struct stat has st_mtimespec member" DIRECT)
- SET_PROPERTY(SOURCE SystemTools.cxx APPEND PROPERTY COMPILE_DEFINITIONS
+ set_property(SOURCE SystemTools.cxx APPEND PROPERTY COMPILE_DEFINITIONS
KWSYS_CXX_HAS_SETENV=${KWSYS_CXX_HAS_SETENV}
KWSYS_CXX_HAS_UNSETENV=${KWSYS_CXX_HAS_UNSETENV}
KWSYS_CXX_HAS_ENVIRON_IN_STDLIB_H=${KWSYS_CXX_HAS_ENVIRON_IN_STDLIB_H}
@@ -503,623 +503,623 @@ IF(KWSYS_USE_SystemTools)
KWSYS_CXX_STAT_HAS_ST_MTIM=${KWSYS_CXX_STAT_HAS_ST_MTIM}
KWSYS_CXX_STAT_HAS_ST_MTIMESPEC=${KWSYS_CXX_STAT_HAS_ST_MTIMESPEC}
)
- IF(NOT WIN32)
- IF(KWSYS_STANDALONE)
- OPTION(KWSYS_SYSTEMTOOLS_SUPPORT_WINDOWS_SLASHES "If true, Windows paths will be supported on Unix as well" ON)
- ENDIF()
- IF(KWSYS_SYSTEMTOOLS_SUPPORT_WINDOWS_SLASHES)
- SET_PROPERTY(SOURCE SystemTools.cxx testSystemTools.cxx APPEND PROPERTY COMPILE_DEFINITIONS
+ if(NOT WIN32)
+ if(KWSYS_STANDALONE)
+ option(KWSYS_SYSTEMTOOLS_SUPPORT_WINDOWS_SLASHES "If true, Windows paths will be supported on Unix as well" ON)
+ endif()
+ if(KWSYS_SYSTEMTOOLS_SUPPORT_WINDOWS_SLASHES)
+ set_property(SOURCE SystemTools.cxx testSystemTools.cxx APPEND PROPERTY COMPILE_DEFINITIONS
KWSYS_SYSTEMTOOLS_SUPPORT_WINDOWS_SLASHES
)
- ENDIF()
- ENDIF()
+ endif()
+ endif()
# Disable getpwnam for static linux builds since it depends on shared glibc
- GET_PROPERTY(SHARED_LIBS_SUPPORTED GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS)
- IF(CMAKE_SYSTEM_NAME MATCHES "Linux" AND NOT SHARED_LIBS_SUPPORTED)
- SET_PROPERTY(SOURCE SystemTools.cxx APPEND PROPERTY COMPILE_DEFINITIONS
+ get_property(SHARED_LIBS_SUPPORTED GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS)
+ if(CMAKE_SYSTEM_NAME MATCHES "Linux" AND NOT SHARED_LIBS_SUPPORTED)
+ set_property(SOURCE SystemTools.cxx APPEND PROPERTY COMPILE_DEFINITIONS
HAVE_GETPWNAM=0
)
- ENDIF()
-ENDIF()
+ endif()
+endif()
-IF(KWSYS_USE_SystemInformation)
- SET_PROPERTY(SOURCE SystemInformation.cxx APPEND PROPERTY
+if(KWSYS_USE_SystemInformation)
+ set_property(SOURCE SystemInformation.cxx APPEND PROPERTY
COMPILE_DEFINITIONS SIZEOF_VOID_P=${CMAKE_SIZEOF_VOID_P})
- IF(NOT CYGWIN)
- INCLUDE(CheckIncludeFiles)
+ if(NOT CYGWIN)
+ include(CheckIncludeFiles)
CHECK_INCLUDE_FILES("sys/types.h;ifaddrs.h" KWSYS_SYS_HAS_IFADDRS_H)
- IF(KWSYS_SYS_HAS_IFADDRS_H)
- SET_PROPERTY(SOURCE SystemInformation.cxx APPEND PROPERTY
+ if(KWSYS_SYS_HAS_IFADDRS_H)
+ set_property(SOURCE SystemInformation.cxx APPEND PROPERTY
COMPILE_DEFINITIONS KWSYS_SYS_HAS_IFADDRS_H=1)
- ENDIF()
- ENDIF()
- IF(WIN32)
- INCLUDE(CheckSymbolExists)
- SET(CMAKE_REQUIRED_LIBRARIES Psapi)
+ endif()
+ endif()
+ if(WIN32)
+ include(CheckSymbolExists)
+ set(CMAKE_REQUIRED_LIBRARIES psapi)
CHECK_SYMBOL_EXISTS(GetProcessMemoryInfo "windows.h;psapi.h" KWSYS_SYS_HAS_PSAPI)
- UNSET(CMAKE_REQUIRED_LIBRARIES)
- IF(KWSYS_SYS_HAS_PSAPI)
- SET_PROPERTY(SOURCE SystemInformation.cxx APPEND PROPERTY
+ unset(CMAKE_REQUIRED_LIBRARIES)
+ if(KWSYS_SYS_HAS_PSAPI)
+ set_property(SOURCE SystemInformation.cxx APPEND PROPERTY
COMPILE_DEFINITIONS KWSYS_SYS_HAS_PSAPI=1)
- IF(MSVC70 OR MSVC71)
+ if(MSVC70 OR MSVC71)
# Suppress LNK4089: all references to 'PSAPI.DLL' discarded by /OPT:REF
- SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /IGNORE:4089")
- ENDIF()
- ENDIF()
- ENDIF()
- IF(CMAKE_SYSTEM MATCHES "HP-UX")
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /IGNORE:4089")
+ endif()
+ endif()
+ endif()
+ if(CMAKE_SYSTEM MATCHES "HP-UX")
CHECK_INCLUDE_FILES("sys/mpctl.h" KWSYS_SYS_HAS_MPCTL_H)
- IF(KWSYS_SYS_HAS_MPCTL_H)
- SET_PROPERTY(SOURCE SystemInformation.cxx APPEND PROPERTY
+ if(KWSYS_SYS_HAS_MPCTL_H)
+ set_property(SOURCE SystemInformation.cxx APPEND PROPERTY
COMPILE_DEFINITIONS KWSYS_SYS_HAS_MPCTL_H=1)
- ENDIF()
- ENDIF()
- IF(CMAKE_SYSTEM MATCHES "BSD")
+ endif()
+ endif()
+ if(CMAKE_SYSTEM MATCHES "BSD")
CHECK_INCLUDE_FILES("machine/cpu.h" KWSYS_SYS_HAS_MACHINE_CPU_H)
- IF(KWSYS_SYS_HAS_MACHINE_CPU_H)
- SET_PROPERTY(SOURCE SystemInformation.cxx APPEND PROPERTY
+ if(KWSYS_SYS_HAS_MACHINE_CPU_H)
+ set_property(SOURCE SystemInformation.cxx APPEND PROPERTY
COMPILE_DEFINITIONS KWSYS_SYS_HAS_MACHINE_CPU_H=1)
- ENDIF()
- ENDIF()
+ endif()
+ endif()
KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_RLIMIT64
"Checking whether CXX compiler has rlimit64" DIRECT)
- SET(KWSYS_PLATFORM_CXX_TEST_DEFINES)
- IF(KWSYS_CXX_HAS_RLIMIT64)
- SET_PROPERTY(SOURCE SystemInformation.cxx APPEND PROPERTY
+ set(KWSYS_PLATFORM_CXX_TEST_DEFINES)
+ if(KWSYS_CXX_HAS_RLIMIT64)
+ set_property(SOURCE SystemInformation.cxx APPEND PROPERTY
COMPILE_DEFINITIONS KWSYS_CXX_HAS_RLIMIT64=1)
- ENDIF()
+ endif()
KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_ATOL
"Checking whether CXX compiler has atol" DIRECT)
- IF(KWSYS_CXX_HAS_ATOL)
- SET_PROPERTY(SOURCE SystemInformation.cxx APPEND PROPERTY
+ if(KWSYS_CXX_HAS_ATOL)
+ set_property(SOURCE SystemInformation.cxx APPEND PROPERTY
COMPILE_DEFINITIONS KWSYS_CXX_HAS_ATOL=1)
- ENDIF()
+ endif()
KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_ATOLL
"Checking whether CXX compiler has atoll" DIRECT)
- IF(KWSYS_CXX_HAS_ATOLL)
- SET_PROPERTY(SOURCE SystemInformation.cxx APPEND PROPERTY
+ if(KWSYS_CXX_HAS_ATOLL)
+ set_property(SOURCE SystemInformation.cxx APPEND PROPERTY
COMPILE_DEFINITIONS KWSYS_CXX_HAS_ATOLL=1)
- ENDIF()
+ endif()
KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS__ATOI64
"Checking whether CXX compiler has _atoi64" DIRECT)
- IF(KWSYS_CXX_HAS__ATOI64)
- SET_PROPERTY(SOURCE SystemInformation.cxx APPEND PROPERTY
+ if(KWSYS_CXX_HAS__ATOI64)
+ set_property(SOURCE SystemInformation.cxx APPEND PROPERTY
COMPILE_DEFINITIONS KWSYS_CXX_HAS__ATOI64=1)
- ENDIF()
- IF(UNIX)
- INCLUDE(CheckIncludeFileCXX)
+ endif()
+ if(UNIX)
+ include(CheckIncludeFileCXX)
# check for simple stack trace
# usually it's in libc but on FreeBSD
# it's in libexecinfo
- FIND_LIBRARY(EXECINFO_LIB "execinfo")
- MARK_AS_ADVANCED(EXECINFO_LIB)
- IF (NOT EXECINFO_LIB)
- SET(EXECINFO_LIB "")
- ENDIF()
+ find_library(EXECINFO_LIB "execinfo")
+ mark_as_advanced(EXECINFO_LIB)
+ if (NOT EXECINFO_LIB)
+ set(EXECINFO_LIB "")
+ endif()
CHECK_INCLUDE_FILE_CXX("execinfo.h" KWSYS_CXX_HAS_EXECINFOH)
- IF (KWSYS_CXX_HAS_EXECINFOH)
+ if (KWSYS_CXX_HAS_EXECINFOH)
# we have the backtrace header check if it
# can be used with this compiler
- SET(KWSYS_PLATFORM_CXX_TEST_LINK_LIBRARIES ${EXECINFO_LIB})
+ set(KWSYS_PLATFORM_CXX_TEST_LINK_LIBRARIES ${EXECINFO_LIB})
KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_BACKTRACE
"Checking whether backtrace works with this C++ compiler" DIRECT)
- SET(KWSYS_PLATFORM_CXX_TEST_LINK_LIBRARIES)
- IF (KWSYS_CXX_HAS_BACKTRACE)
+ set(KWSYS_PLATFORM_CXX_TEST_LINK_LIBRARIES)
+ if (KWSYS_CXX_HAS_BACKTRACE)
# backtrace is supported by this system and compiler.
# now check for the more advanced capabilities.
- SET_PROPERTY(SOURCE SystemInformation.cxx APPEND PROPERTY
+ set_property(SOURCE SystemInformation.cxx APPEND PROPERTY
COMPILE_DEFINITIONS KWSYS_SYSTEMINFORMATION_HAS_BACKTRACE=1)
# check for symbol lookup using dladdr
CHECK_INCLUDE_FILE_CXX("dlfcn.h" KWSYS_CXX_HAS_DLFCNH)
- IF (KWSYS_CXX_HAS_DLFCNH)
+ if (KWSYS_CXX_HAS_DLFCNH)
# we have symbol lookup libraries and headers
# check if they can be used with this compiler
- SET(KWSYS_PLATFORM_CXX_TEST_LINK_LIBRARIES ${CMAKE_DL_LIBS})
+ set(KWSYS_PLATFORM_CXX_TEST_LINK_LIBRARIES ${CMAKE_DL_LIBS})
KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_DLADDR
"Checking whether dladdr works with this C++ compiler" DIRECT)
- SET(KWSYS_PLATFORM_CXX_TEST_LINK_LIBRARIES)
- IF (KWSYS_CXX_HAS_DLADDR)
+ set(KWSYS_PLATFORM_CXX_TEST_LINK_LIBRARIES)
+ if (KWSYS_CXX_HAS_DLADDR)
# symbol lookup is supported by this system
# and compiler.
- SET_PROPERTY(SOURCE SystemInformation.cxx APPEND PROPERTY
+ set_property(SOURCE SystemInformation.cxx APPEND PROPERTY
COMPILE_DEFINITIONS KWSYS_SYSTEMINFORMATION_HAS_SYMBOL_LOOKUP=1)
- ENDIF()
- ENDIF()
+ endif()
+ endif()
# c++ demangling support
# check for cxxabi headers
CHECK_INCLUDE_FILE_CXX("cxxabi.h" KWSYS_CXX_HAS_CXXABIH)
- IF (KWSYS_CXX_HAS_CXXABIH)
+ if (KWSYS_CXX_HAS_CXXABIH)
# check if cxxabi can be used with this
# system and compiler.
KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_CXXABI
"Checking whether cxxabi works with this C++ compiler" DIRECT)
- IF (KWSYS_CXX_HAS_CXXABI)
+ if (KWSYS_CXX_HAS_CXXABI)
# c++ demangle using cxxabi is supported with
# this system and compiler
- SET_PROPERTY(SOURCE SystemInformation.cxx APPEND PROPERTY
+ set_property(SOURCE SystemInformation.cxx APPEND PROPERTY
COMPILE_DEFINITIONS KWSYS_SYSTEMINFORMATION_HAS_CPP_DEMANGLE=1)
- ENDIF()
- ENDIF()
+ endif()
+ endif()
# basic backtrace works better with release build
# don't bother with advanced features for release
- SET_PROPERTY(SOURCE SystemInformation.cxx APPEND PROPERTY
+ set_property(SOURCE SystemInformation.cxx APPEND PROPERTY
COMPILE_DEFINITIONS_DEBUG KWSYS_SYSTEMINFORMATION_HAS_DEBUG_BUILD=1)
- SET_PROPERTY(SOURCE SystemInformation.cxx APPEND PROPERTY
+ set_property(SOURCE SystemInformation.cxx APPEND PROPERTY
COMPILE_DEFINITIONS_RELWITHDEBINFO KWSYS_SYSTEMINFORMATION_HAS_DEBUG_BUILD=1)
- ENDIF()
- ENDIF()
- ENDIF()
- IF(BORLAND)
+ endif()
+ endif()
+ endif()
+ if(BORLAND)
KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_BORLAND_ASM
"Checking whether Borland CXX compiler supports assembler instructions" DIRECT)
- IF(KWSYS_CXX_HAS_BORLAND_ASM)
- SET_PROPERTY(SOURCE SystemInformation.cxx APPEND PROPERTY
+ if(KWSYS_CXX_HAS_BORLAND_ASM)
+ set_property(SOURCE SystemInformation.cxx APPEND PROPERTY
COMPILE_DEFINITIONS KWSYS_CXX_HAS_BORLAND_ASM=1)
KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_BORLAND_ASM_CPUID
"Checking whether Borland CXX compiler supports CPUID assembler instruction" DIRECT)
- IF(KWSYS_CXX_HAS_BORLAND_ASM_CPUID)
- SET_PROPERTY(SOURCE SystemInformation.cxx APPEND PROPERTY
+ if(KWSYS_CXX_HAS_BORLAND_ASM_CPUID)
+ set_property(SOURCE SystemInformation.cxx APPEND PROPERTY
COMPILE_DEFINITIONS KWSYS_CXX_HAS_BORLAND_ASM_CPUID=1)
- ENDIF()
- ENDIF()
- ENDIF()
- IF(KWSYS_USE___INT64)
- SET_PROPERTY(SOURCE SystemInformation.cxx testSystemInformation.cxx APPEND PROPERTY
+ endif()
+ endif()
+ endif()
+ if(KWSYS_USE___INT64)
+ set_property(SOURCE SystemInformation.cxx testSystemInformation.cxx APPEND PROPERTY
COMPILE_DEFINITIONS KWSYS_USE___INT64=1)
- ENDIF()
- IF(KWSYS_USE_LONG_LONG)
- SET_PROPERTY(SOURCE SystemInformation.cxx testSystemInformation.cxx APPEND PROPERTY
+ endif()
+ if(KWSYS_USE_LONG_LONG)
+ set_property(SOURCE SystemInformation.cxx testSystemInformation.cxx APPEND PROPERTY
COMPILE_DEFINITIONS KWSYS_USE_LONG_LONG=1)
- ENDIF()
- IF(KWSYS_IOS_HAS_OSTREAM_LONG_LONG)
- SET_PROPERTY(SOURCE SystemInformation.cxx testSystemInformation.cxx APPEND PROPERTY
+ endif()
+ if(KWSYS_IOS_HAS_OSTREAM_LONG_LONG)
+ set_property(SOURCE SystemInformation.cxx testSystemInformation.cxx APPEND PROPERTY
COMPILE_DEFINITIONS KWSYS_IOS_HAS_OSTREAM_LONG_LONG=1)
- ENDIF()
- IF(KWSYS_IOS_HAS_OSTREAM___INT64)
- SET_PROPERTY(SOURCE SystemInformation.cxx testSystemInformation.cxx APPEND PROPERTY
+ endif()
+ if(KWSYS_IOS_HAS_OSTREAM___INT64)
+ set_property(SOURCE SystemInformation.cxx testSystemInformation.cxx APPEND PROPERTY
COMPILE_DEFINITIONS KWSYS_IOS_HAS_OSTREAM___INT64=1)
- ENDIF()
- IF(KWSYS_BUILD_SHARED)
- SET_PROPERTY(SOURCE SystemInformation.cxx APPEND PROPERTY
+ endif()
+ if(KWSYS_BUILD_SHARED)
+ set_property(SOURCE SystemInformation.cxx APPEND PROPERTY
COMPILE_DEFINITIONS KWSYS_BUILD_SHARED=1)
- ENDIF()
+ endif()
- IF(UNIX AND NOT CYGWIN)
+ if(UNIX AND NOT CYGWIN)
KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_GETLOADAVG
"Checking whether CXX compiler has getloadavg" DIRECT)
- IF(KWSYS_CXX_HAS_GETLOADAVG)
- SET_PROPERTY(SOURCE SystemInformation.cxx APPEND PROPERTY
+ if(KWSYS_CXX_HAS_GETLOADAVG)
+ set_property(SOURCE SystemInformation.cxx APPEND PROPERTY
COMPILE_DEFINITIONS KWSYS_CXX_HAS_GETLOADAVG=1)
- ENDIF()
- ENDIF()
-ENDIF()
+ endif()
+ endif()
+endif()
-IF(KWSYS_USE_FStream)
+if(KWSYS_USE_FStream)
KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_EXT_STDIO_FILEBUF_H
"Checking whether <ext/stdio_filebuf.h> is available" DIRECT)
-ENDIF()
+endif()
#-----------------------------------------------------------------------------
# Choose a directory for the generated headers.
-IF(NOT KWSYS_HEADER_ROOT)
- SET(KWSYS_HEADER_ROOT "${PROJECT_BINARY_DIR}")
-ENDIF()
-SET(KWSYS_HEADER_DIR "${KWSYS_HEADER_ROOT}/${KWSYS_NAMESPACE}")
-INCLUDE_DIRECTORIES(${KWSYS_HEADER_ROOT})
+if(NOT KWSYS_HEADER_ROOT)
+ set(KWSYS_HEADER_ROOT "${PROJECT_BINARY_DIR}")
+endif()
+set(KWSYS_HEADER_DIR "${KWSYS_HEADER_ROOT}/${KWSYS_NAMESPACE}")
+include_directories(${KWSYS_HEADER_ROOT})
#-----------------------------------------------------------------------------
-IF(KWSYS_INSTALL_DOC_DIR)
+if(KWSYS_INSTALL_DOC_DIR)
# Assign the license to the runtime component since it must be
# distributed with binary forms of this software.
- IF(KWSYS_INSTALL_COMPONENT_NAME_RUNTIME)
- SET(KWSYS_INSTALL_LICENSE_OPTIONS ${KWSYS_INSTALL_LICENSE_OPTIONS}
+ if(KWSYS_INSTALL_COMPONENT_NAME_RUNTIME)
+ set(KWSYS_INSTALL_LICENSE_OPTIONS ${KWSYS_INSTALL_LICENSE_OPTIONS}
COMPONENT ${KWSYS_INSTALL_COMPONENT_NAME_RUNTIME}
)
- ENDIF()
+ endif()
# Install the license under the documentation directory.
- INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/Copyright.txt
+ install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/Copyright.txt
DESTINATION ${KWSYS_INSTALL_DOC_DIR}/${KWSYS_NAMESPACE}
${KWSYS_INSTALL_LICENSE_OPTIONS})
-ENDIF()
+endif()
#-----------------------------------------------------------------------------
# Build a list of classes and headers we need to implement the
# selected components. Initialize with required components.
-SET(KWSYS_CLASSES)
-SET(KWSYS_H_FILES Configure SharedForward)
-SET(KWSYS_HXX_FILES Configure String)
+set(KWSYS_CLASSES)
+set(KWSYS_H_FILES Configure SharedForward)
+set(KWSYS_HXX_FILES Configure String)
-IF(NOT CMake_SOURCE_DIR)
- SET(KWSYS_HXX_FILES ${KWSYS_HXX_FILES}
+if(NOT CMake_SOURCE_DIR)
+ set(KWSYS_HXX_FILES ${KWSYS_HXX_FILES}
hashtable hash_fun hash_map hash_set
)
-ENDIF()
+endif()
# Add selected C++ classes.
-SET(cppclasses
+set(cppclasses
Directory DynamicLoader Encoding Glob RegularExpression SystemTools
CommandLineArguments IOStream FStream SystemInformation ConsoleBuf
)
-FOREACH(cpp ${cppclasses})
- IF(KWSYS_USE_${cpp})
+foreach(cpp ${cppclasses})
+ if(KWSYS_USE_${cpp})
# Use the corresponding class.
- SET(KWSYS_CLASSES ${KWSYS_CLASSES} ${cpp})
+ set(KWSYS_CLASSES ${KWSYS_CLASSES} ${cpp})
# Load component-specific CMake code.
- IF(EXISTS ${PROJECT_SOURCE_DIR}/kwsys${cpp}.cmake)
- INCLUDE(${PROJECT_SOURCE_DIR}/kwsys${cpp}.cmake)
- ENDIF()
- ENDIF()
-ENDFOREACH()
+ if(EXISTS ${PROJECT_SOURCE_DIR}/kwsys${cpp}.cmake)
+ include(${PROJECT_SOURCE_DIR}/kwsys${cpp}.cmake)
+ endif()
+ endif()
+endforeach()
# Add selected C components.
-FOREACH(c
+foreach(c
Process Base64 Encoding MD5 Terminal System String
)
- IF(KWSYS_USE_${c})
+ if(KWSYS_USE_${c})
# Use the corresponding header file.
- SET(KWSYS_H_FILES ${KWSYS_H_FILES} ${c})
+ set(KWSYS_H_FILES ${KWSYS_H_FILES} ${c})
# Load component-specific CMake code.
- IF(EXISTS ${PROJECT_SOURCE_DIR}/kwsys${c}.cmake)
- INCLUDE(${PROJECT_SOURCE_DIR}/kwsys${c}.cmake)
- ENDIF()
- ENDIF()
-ENDFOREACH()
+ if(EXISTS ${PROJECT_SOURCE_DIR}/kwsys${c}.cmake)
+ include(${PROJECT_SOURCE_DIR}/kwsys${c}.cmake)
+ endif()
+ endif()
+endforeach()
#-----------------------------------------------------------------------------
# Build a list of sources for the library based on components that are
# included.
-SET(KWSYS_C_SRCS)
-SET(KWSYS_CXX_SRCS)
+set(KWSYS_C_SRCS)
+set(KWSYS_CXX_SRCS)
# Add the proper sources for this platform's Process implementation.
-IF(KWSYS_USE_Process)
- IF(NOT UNIX)
+if(KWSYS_USE_Process)
+ if(NOT UNIX)
# Use the Windows implementation.
- SET(KWSYS_C_SRCS ${KWSYS_C_SRCS} ProcessWin32.c)
- ELSE()
+ set(KWSYS_C_SRCS ${KWSYS_C_SRCS} ProcessWin32.c)
+ else()
# Use the UNIX implementation.
- SET(KWSYS_C_SRCS ${KWSYS_C_SRCS} ProcessUNIX.c)
- ENDIF()
-ENDIF()
+ set(KWSYS_C_SRCS ${KWSYS_C_SRCS} ProcessUNIX.c)
+ endif()
+endif()
# Add selected C sources.
-FOREACH(c Base64 Encoding MD5 Terminal System String)
- IF(KWSYS_USE_${c})
- IF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${c}C.c)
- LIST(APPEND KWSYS_C_SRCS ${c}C.c)
- ELSE()
- LIST(APPEND KWSYS_C_SRCS ${c}.c)
- ENDIF()
- ENDIF()
-ENDFOREACH()
+foreach(c Base64 Encoding MD5 Terminal System String)
+ if(KWSYS_USE_${c})
+ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${c}C.c)
+ list(APPEND KWSYS_C_SRCS ${c}C.c)
+ else()
+ list(APPEND KWSYS_C_SRCS ${c}.c)
+ endif()
+ endif()
+endforeach()
# Configure headers of C++ classes and construct the list of sources.
-FOREACH(c ${KWSYS_CLASSES})
+foreach(c ${KWSYS_CLASSES})
# Add this source to the list of source files for the library.
- IF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${c}CXX.cxx)
- LIST(APPEND KWSYS_CXX_SRCS ${c}CXX.cxx)
- ELSEIF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${c}.cxx)
- LIST(APPEND KWSYS_CXX_SRCS ${c}.cxx)
- ENDIF()
+ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${c}CXX.cxx)
+ list(APPEND KWSYS_CXX_SRCS ${c}CXX.cxx)
+ elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${c}.cxx)
+ list(APPEND KWSYS_CXX_SRCS ${c}.cxx)
+ endif()
# Configure the header for this class.
- CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/${c}.hxx.in ${KWSYS_HEADER_DIR}/${c}.hxx
+ configure_file(${PROJECT_SOURCE_DIR}/${c}.hxx.in ${KWSYS_HEADER_DIR}/${c}.hxx
@ONLY IMMEDIATE)
- SET(KWSYS_CXX_SRCS ${KWSYS_CXX_SRCS} ${KWSYS_HEADER_DIR}/${c}.hxx)
+ set(KWSYS_CXX_SRCS ${KWSYS_CXX_SRCS} ${KWSYS_HEADER_DIR}/${c}.hxx)
# Create an install target for the header.
- IF(KWSYS_INSTALL_INCLUDE_DIR)
- INSTALL(FILES ${KWSYS_HEADER_DIR}/${c}.hxx
+ if(KWSYS_INSTALL_INCLUDE_DIR)
+ install(FILES ${KWSYS_HEADER_DIR}/${c}.hxx
DESTINATION ${KWSYS_INSTALL_INCLUDE_DIR}/${KWSYS_NAMESPACE}
${KWSYS_INSTALL_INCLUDE_OPTIONS})
- ENDIF()
-ENDFOREACH()
+ endif()
+endforeach()
# Configure C headers.
-FOREACH(h ${KWSYS_H_FILES})
+foreach(h ${KWSYS_H_FILES})
# Configure the header into the given directory.
- CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/${h}.h.in ${KWSYS_HEADER_DIR}/${h}.h
+ configure_file(${PROJECT_SOURCE_DIR}/${h}.h.in ${KWSYS_HEADER_DIR}/${h}.h
@ONLY IMMEDIATE)
- SET(KWSYS_C_SRCS ${KWSYS_C_SRCS} ${KWSYS_HEADER_DIR}/${h}.h)
+ set(KWSYS_C_SRCS ${KWSYS_C_SRCS} ${KWSYS_HEADER_DIR}/${h}.h)
# Create an install target for the header.
- IF(KWSYS_INSTALL_INCLUDE_DIR)
- INSTALL(FILES ${KWSYS_HEADER_DIR}/${h}.h
+ if(KWSYS_INSTALL_INCLUDE_DIR)
+ install(FILES ${KWSYS_HEADER_DIR}/${h}.h
DESTINATION ${KWSYS_INSTALL_INCLUDE_DIR}/${KWSYS_NAMESPACE}
${KWSYS_INSTALL_INCLUDE_OPTIONS})
- ENDIF()
-ENDFOREACH()
+ endif()
+endforeach()
# Configure other C++ headers.
-FOREACH(h ${KWSYS_HXX_FILES})
+foreach(h ${KWSYS_HXX_FILES})
# Configure the header into the given directory.
- CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/${h}.hxx.in ${KWSYS_HEADER_DIR}/${h}.hxx
+ configure_file(${PROJECT_SOURCE_DIR}/${h}.hxx.in ${KWSYS_HEADER_DIR}/${h}.hxx
@ONLY IMMEDIATE)
- SET(KWSYS_CXX_SRCS ${KWSYS_CXX_SRCS} ${KWSYS_HEADER_DIR}/${h}.hxx)
+ set(KWSYS_CXX_SRCS ${KWSYS_CXX_SRCS} ${KWSYS_HEADER_DIR}/${h}.hxx)
# Create an install target for the header.
- IF(KWSYS_INSTALL_INCLUDE_DIR)
- INSTALL(FILES ${KWSYS_HEADER_DIR}/${h}.hxx
+ if(KWSYS_INSTALL_INCLUDE_DIR)
+ install(FILES ${KWSYS_HEADER_DIR}/${h}.hxx
DESTINATION ${KWSYS_INSTALL_INCLUDE_DIR}/${KWSYS_NAMESPACE}
${KWSYS_INSTALL_INCLUDE_OPTIONS})
- ENDIF()
-ENDFOREACH()
+ endif()
+endforeach()
#-----------------------------------------------------------------------------
# Add the library with the configured name and list of sources.
-IF(KWSYS_C_SRCS OR KWSYS_CXX_SRCS)
- IF(KWSYS_SPLIT_OBJECTS_FROM_INTERFACE)
- SET(KWSYS_TARGET_INTERFACE ${KWSYS_NAMESPACE})
- SET(KWSYS_TARGET_OBJECT ${KWSYS_NAMESPACE}_objects)
- SET(KWSYS_TARGET_LINK ${KWSYS_NAMESPACE}_private)
- SET(KWSYS_TARGET_INSTALL ${KWSYS_TARGET_INTERFACE} ${KWSYS_TARGET_LINK})
- SET(KWSYS_LINK_DEPENDENCY INTERFACE)
- ADD_LIBRARY(${KWSYS_TARGET_OBJECT} OBJECT
+if(KWSYS_C_SRCS OR KWSYS_CXX_SRCS)
+ if(KWSYS_SPLIT_OBJECTS_FROM_INTERFACE)
+ set(KWSYS_TARGET_INTERFACE ${KWSYS_NAMESPACE})
+ set(KWSYS_TARGET_OBJECT ${KWSYS_NAMESPACE}_objects)
+ set(KWSYS_TARGET_LINK ${KWSYS_NAMESPACE}_private)
+ set(KWSYS_TARGET_INSTALL ${KWSYS_TARGET_INTERFACE} ${KWSYS_TARGET_LINK})
+ set(KWSYS_LINK_DEPENDENCY INTERFACE)
+ add_library(${KWSYS_TARGET_OBJECT} OBJECT
${KWSYS_C_SRCS} ${KWSYS_CXX_SRCS})
- IF(KWSYS_BUILD_SHARED OR KWSYS_BUILD_PIC)
- SET_PROPERTY(TARGET ${KWSYS_TARGET_OBJECT} PROPERTY
+ if(KWSYS_BUILD_SHARED OR KWSYS_BUILD_PIC)
+ set_property(TARGET ${KWSYS_TARGET_OBJECT} PROPERTY
POSITION_INDEPENDENT_CODE TRUE)
- ENDIF()
- ADD_LIBRARY(${KWSYS_TARGET_INTERFACE} INTERFACE)
- ADD_LIBRARY(${KWSYS_TARGET_LINK} INTERFACE)
- TARGET_LINK_LIBRARIES(${KWSYS_TARGET_LINK} INTERFACE
+ endif()
+ add_library(${KWSYS_TARGET_INTERFACE} INTERFACE)
+ add_library(${KWSYS_TARGET_LINK} INTERFACE)
+ target_link_libraries(${KWSYS_TARGET_LINK} INTERFACE
${KWSYS_TARGET_INTERFACE})
- TARGET_SOURCES(${KWSYS_TARGET_LINK} INTERFACE
+ target_sources(${KWSYS_TARGET_LINK} INTERFACE
$<TARGET_OBJECTS:${KWSYS_TARGET_OBJECT}>)
target_compile_features(${KWSYS_TARGET_OBJECT} PRIVATE ${KWSYS_CXX_COMPILE_FEATURES})
target_compile_features(${KWSYS_TARGET_INTERFACE} INTERFACE ${KWSYS_CXX_COMPILE_FEATURES})
- ELSE()
- SET(KWSYS_TARGET_INTERFACE ${KWSYS_NAMESPACE})
- SET(KWSYS_TARGET_OBJECT ${KWSYS_NAMESPACE})
- SET(KWSYS_TARGET_LINK ${KWSYS_NAMESPACE})
+ else()
+ set(KWSYS_TARGET_INTERFACE ${KWSYS_NAMESPACE})
+ set(KWSYS_TARGET_OBJECT ${KWSYS_NAMESPACE})
+ set(KWSYS_TARGET_LINK ${KWSYS_NAMESPACE})
set(KWSYS_TARGET_INSTALL ${KWSYS_TARGET_LINK})
- SET(KWSYS_LINK_DEPENDENCY PUBLIC)
- ADD_LIBRARY(${KWSYS_TARGET_INTERFACE} ${KWSYS_LIBRARY_TYPE}
+ set(KWSYS_LINK_DEPENDENCY PUBLIC)
+ add_library(${KWSYS_TARGET_INTERFACE} ${KWSYS_LIBRARY_TYPE}
${KWSYS_C_SRCS} ${KWSYS_CXX_SRCS})
target_compile_features(${KWSYS_TARGET_INTERFACE} PUBLIC ${KWSYS_CXX_COMPILE_FEATURES})
- ENDIF()
+ endif()
if (KWSYS_ALIAS_TARGET)
add_library(${KWSYS_ALIAS_TARGET} ALIAS ${KWSYS_TARGET_INTERFACE})
endif ()
- SET_TARGET_PROPERTIES(${KWSYS_TARGET_OBJECT} PROPERTIES
+ set_target_properties(${KWSYS_TARGET_OBJECT} PROPERTIES
C_CLANG_TIDY ""
CXX_CLANG_TIDY ""
C_INCLUDE_WHAT_YOU_USE ""
CXX_INCLUDE_WHAT_YOU_USE ""
LABELS "${KWSYS_LABELS_LIB}")
- IF(KWSYS_USE_DynamicLoader)
- IF(UNIX)
- TARGET_LINK_LIBRARIES(${KWSYS_TARGET_INTERFACE} ${KWSYS_LINK_DEPENDENCY}
+ if(KWSYS_USE_DynamicLoader)
+ if(UNIX)
+ target_link_libraries(${KWSYS_TARGET_INTERFACE} ${KWSYS_LINK_DEPENDENCY}
${CMAKE_DL_LIBS})
- ENDIF()
- ENDIF()
+ endif()
+ endif()
- IF(KWSYS_USE_SystemInformation)
- IF(WIN32)
- TARGET_LINK_LIBRARIES(${KWSYS_TARGET_INTERFACE} ${KWSYS_LINK_DEPENDENCY} ws2_32)
+ if(KWSYS_USE_SystemInformation)
+ if(WIN32)
+ target_link_libraries(${KWSYS_TARGET_INTERFACE} ${KWSYS_LINK_DEPENDENCY} ws2_32)
# link in dbghelp.dll for symbol lookup if MSVC 1800 or later
# Note that the dbghelp runtime is part of MS Windows OS
- IF(MSVC_VERSION AND NOT MSVC_VERSION VERSION_LESS 1800)
- TARGET_LINK_LIBRARIES(${KWSYS_TARGET_INTERFACE} ${KWSYS_LINK_DEPENDENCY} dbghelp)
- ENDIF()
- IF(KWSYS_SYS_HAS_PSAPI)
- TARGET_LINK_LIBRARIES(${KWSYS_TARGET_INTERFACE} ${KWSYS_LINK_DEPENDENCY}
- Psapi)
- ENDIF()
- ELSEIF(UNIX)
- IF (EXECINFO_LIB AND KWSYS_CXX_HAS_BACKTRACE)
+ if(MSVC_VERSION AND NOT MSVC_VERSION VERSION_LESS 1800)
+ target_link_libraries(${KWSYS_TARGET_INTERFACE} ${KWSYS_LINK_DEPENDENCY} dbghelp)
+ endif()
+ if(KWSYS_SYS_HAS_PSAPI)
+ target_link_libraries(${KWSYS_TARGET_INTERFACE} ${KWSYS_LINK_DEPENDENCY}
+ psapi)
+ endif()
+ elseif(UNIX)
+ if (EXECINFO_LIB AND KWSYS_CXX_HAS_BACKTRACE)
# backtrace on FreeBSD is not in libc
- TARGET_LINK_LIBRARIES(${KWSYS_TARGET_INTERFACE} ${KWSYS_LINK_DEPENDENCY}
+ target_link_libraries(${KWSYS_TARGET_INTERFACE} ${KWSYS_LINK_DEPENDENCY}
${EXECINFO_LIB})
- ENDIF()
- IF (KWSYS_CXX_HAS_DLADDR)
+ endif()
+ if (KWSYS_CXX_HAS_DLADDR)
# for symbol lookup using dladdr
- TARGET_LINK_LIBRARIES(${KWSYS_TARGET_INTERFACE} ${KWSYS_LINK_DEPENDENCY}
+ target_link_libraries(${KWSYS_TARGET_INTERFACE} ${KWSYS_LINK_DEPENDENCY}
${CMAKE_DL_LIBS})
- ENDIF()
- IF (CMAKE_SYSTEM_NAME STREQUAL "SunOS")
- TARGET_LINK_LIBRARIES(${KWSYS_TARGET_INTERFACE} ${KWSYS_LINK_DEPENDENCY}
+ endif()
+ if (CMAKE_SYSTEM_NAME STREQUAL "SunOS")
+ target_link_libraries(${KWSYS_TARGET_INTERFACE} ${KWSYS_LINK_DEPENDENCY}
socket)
- ENDIF()
- ENDIF()
- ENDIF()
+ endif()
+ endif()
+ endif()
# Apply user-defined target properties to the library.
- IF(KWSYS_PROPERTIES_CXX)
- SET_TARGET_PROPERTIES(${KWSYS_TARGET_INTERFACE} PROPERTIES
+ if(KWSYS_PROPERTIES_CXX)
+ set_target_properties(${KWSYS_TARGET_INTERFACE} PROPERTIES
${KWSYS_PROPERTIES_CXX})
- ENDIF()
+ endif()
# Set up include usage requirement
- IF(COMMAND TARGET_INCLUDE_DIRECTORIES)
- TARGET_INCLUDE_DIRECTORIES(${KWSYS_TARGET_INTERFACE} INTERFACE
+ if(COMMAND TARGET_INCLUDE_DIRECTORIES)
+ target_include_directories(${KWSYS_TARGET_INTERFACE} INTERFACE
$<BUILD_INTERFACE:${KWSYS_HEADER_ROOT}>)
- IF(KWSYS_INSTALL_INCLUDE_DIR)
- TARGET_INCLUDE_DIRECTORIES(${KWSYS_TARGET_INTERFACE} INTERFACE
+ if(KWSYS_INSTALL_INCLUDE_DIR)
+ target_include_directories(${KWSYS_TARGET_INTERFACE} INTERFACE
$<INSTALL_INTERFACE:${KWSYS_INSTALL_INCLUDE_DIR}>)
- ENDIF()
- ENDIF()
+ endif()
+ endif()
# Create an install target for the library.
- IF(KWSYS_INSTALL_LIBRARY_RULE)
- INSTALL(TARGETS ${KWSYS_TARGET_INSTALL} ${KWSYS_INSTALL_LIBRARY_RULE})
- ENDIF()
- IF(KWSYS_INSTALL_NAMELINK_RULE)
- INSTALL(TARGETS ${KWSYS_TARGET_INSTALL} ${KWSYS_INSTALL_NAMELINK_RULE})
- ENDIF()
-ENDIF()
+ if(KWSYS_INSTALL_LIBRARY_RULE)
+ install(TARGETS ${KWSYS_TARGET_INSTALL} ${KWSYS_INSTALL_LIBRARY_RULE})
+ endif()
+ if(KWSYS_INSTALL_NAMELINK_RULE)
+ install(TARGETS ${KWSYS_TARGET_INSTALL} ${KWSYS_INSTALL_NAMELINK_RULE})
+ endif()
+endif()
# Add a C-only library if requested.
-IF(KWSYS_ENABLE_C AND KWSYS_C_SRCS)
- IF(KWSYS_SPLIT_OBJECTS_FROM_INTERFACE)
- SET(KWSYS_TARGET_C_INTERFACE ${KWSYS_NAMESPACE}_c)
- SET(KWSYS_TARGET_C_OBJECT ${KWSYS_NAMESPACE}_c_objects)
- SET(KWSYS_TARGET_C_LINK ${KWSYS_NAMESPACE}_c_private)
- SET(KWSYS_TARGET_C_INSTALL
+if(KWSYS_ENABLE_C AND KWSYS_C_SRCS)
+ if(KWSYS_SPLIT_OBJECTS_FROM_INTERFACE)
+ set(KWSYS_TARGET_C_INTERFACE ${KWSYS_NAMESPACE}_c)
+ set(KWSYS_TARGET_C_OBJECT ${KWSYS_NAMESPACE}_c_objects)
+ set(KWSYS_TARGET_C_LINK ${KWSYS_NAMESPACE}_c_private)
+ set(KWSYS_TARGET_C_INSTALL
${KWSYS_TARGET_C_INTERFACE} ${KWSYS_TARGET_C_LINK})
- SET(KWSYS_LINK_DEPENDENCY INTERFACE)
- ADD_LIBRARY(${KWSYS_TARGET_C_OBJECT} OBJECT ${KWSYS_C_SRCS})
- IF(KWSYS_BUILD_SHARED OR KWSYS_BUILD_PIC)
- SET_PROPERTY(TARGET ${KWSYS_TARGET_C_OBJECT} PROPERTY
+ set(KWSYS_LINK_DEPENDENCY INTERFACE)
+ add_library(${KWSYS_TARGET_C_OBJECT} OBJECT ${KWSYS_C_SRCS})
+ if(KWSYS_BUILD_SHARED OR KWSYS_BUILD_PIC)
+ set_property(TARGET ${KWSYS_TARGET_C_OBJECT} PROPERTY
POSITION_INDEPENDENT_CODE TRUE)
- ENDIF()
- ADD_LIBRARY(${KWSYS_TARGET_C_INTERFACE} INTERFACE)
- ADD_LIBRARY(${KWSYS_TARGET_C_LINK} INTERFACE)
- TARGET_LINK_LIBRARIES(${KWSYS_TARGET_C_LINK} INTERFACE
+ endif()
+ add_library(${KWSYS_TARGET_C_INTERFACE} INTERFACE)
+ add_library(${KWSYS_TARGET_C_LINK} INTERFACE)
+ target_link_libraries(${KWSYS_TARGET_C_LINK} INTERFACE
${KWSYS_TARGET_C_INTERFACE})
- TARGET_SOURCES(${KWSYS_TARGET_C_LINK} INTERFACE
+ target_sources(${KWSYS_TARGET_C_LINK} INTERFACE
$<TARGET_OBJECTS:${KWSYS_TARGET_C_OBJECT}>)
- ELSE()
- SET(KWSYS_TARGET_C_INTERFACE ${KWSYS_NAMESPACE}_c)
- SET(KWSYS_TARGET_C_OBJECT ${KWSYS_NAMESPACE}_c)
- SET(KWSYS_TARGET_C_LINK ${KWSYS_NAMESPACE}_c)
- SET(KWSYS_TARGET_C_INSTALL ${KWSYS_TARGET_C_LINK})
- SET(KWSYS_LINK_DEPENDENCY PUBLIC)
- ADD_LIBRARY(${KWSYS_TARGET_C_INTERFACE} ${KWSYS_LIBRARY_TYPE}
+ else()
+ set(KWSYS_TARGET_C_INTERFACE ${KWSYS_NAMESPACE}_c)
+ set(KWSYS_TARGET_C_OBJECT ${KWSYS_NAMESPACE}_c)
+ set(KWSYS_TARGET_C_LINK ${KWSYS_NAMESPACE}_c)
+ set(KWSYS_TARGET_C_INSTALL ${KWSYS_TARGET_C_LINK})
+ set(KWSYS_LINK_DEPENDENCY PUBLIC)
+ add_library(${KWSYS_TARGET_C_INTERFACE} ${KWSYS_LIBRARY_TYPE}
${KWSYS_C_SRCS})
- ENDIF()
- SET_TARGET_PROPERTIES(${KWSYS_TARGET_C_OBJECT} PROPERTIES
+ endif()
+ set_target_properties(${KWSYS_TARGET_C_OBJECT} PROPERTIES
LABELS "${KWSYS_LABELS_LIB}")
# Apply user-defined target properties to the library.
- IF(KWSYS_PROPERTIES_C)
- SET_TARGET_PROPERTIES(${KWSYS_TARGET_C_INTERFACE} PROPERTIES
+ if(KWSYS_PROPERTIES_C)
+ set_target_properties(${KWSYS_TARGET_C_INTERFACE} PROPERTIES
${KWSYS_PROPERTIES_C})
- ENDIF()
+ endif()
# Set up include usage requirement
- IF(COMMAND TARGET_INCLUDE_DIRECTORIES)
- TARGET_INCLUDE_DIRECTORIES(${KWSYS_TARGET_C_INTERFACE} INTERFACE
+ if(COMMAND TARGET_INCLUDE_DIRECTORIES)
+ target_include_directories(${KWSYS_TARGET_C_INTERFACE} INTERFACE
$<BUILD_INTERFACE:${KWSYS_HEADER_ROOT}>)
- IF(KWSYS_INSTALL_INCLUDE_DIR)
- TARGET_INCLUDE_DIRECTORIES(${KWSYS_TARGET_C_INTERFACE} INTERFACE
+ if(KWSYS_INSTALL_INCLUDE_DIR)
+ target_include_directories(${KWSYS_TARGET_C_INTERFACE} INTERFACE
$<INSTALL_INTERFACE:${KWSYS_INSTALL_INCLUDE_DIR}>)
- ENDIF()
- ENDIF()
+ endif()
+ endif()
# Create an install target for the library.
- IF(KWSYS_INSTALL_LIBRARY_RULE)
- INSTALL(TARGETS ${KWSYS_TARGET_C_INSTALL})
- ENDIF()
-ENDIF()
+ if(KWSYS_INSTALL_LIBRARY_RULE)
+ install(TARGETS ${KWSYS_TARGET_C_INSTALL})
+ endif()
+endif()
# For building kwsys itself, we use a macro defined on the command
# line to configure the namespace in the C and C++ source files.
-ADD_DEFINITIONS("-DKWSYS_NAMESPACE=${KWSYS_NAMESPACE}")
+add_definitions("-DKWSYS_NAMESPACE=${KWSYS_NAMESPACE}")
# Disable deprecation warnings for standard C functions.
-IF(MSVC OR (WIN32 AND (CMAKE_C_COMPILER_ID STREQUAL "Intel" OR
+if(MSVC OR (WIN32 AND (CMAKE_C_COMPILER_ID STREQUAL "Intel" OR
(CMAKE_C_COMPILER_ID STREQUAL "Clang" AND CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC"))))
- ADD_DEFINITIONS(
+ add_definitions(
-D_CRT_NONSTDC_NO_DEPRECATE
-D_CRT_SECURE_NO_DEPRECATE
-D_CRT_SECURE_NO_WARNINGS
-D_SCL_SECURE_NO_DEPRECATE
)
-ENDIF()
+endif()
-IF(WIN32)
+if(WIN32)
# Help enforce the use of wide Windows apis.
- ADD_DEFINITIONS(-DUNICODE -D_UNICODE)
-ENDIF()
+ add_definitions(-DUNICODE -D_UNICODE)
+endif()
-IF(KWSYS_USE_String)
+if(KWSYS_USE_String)
# Activate code in "String.c". See the comment in the source.
- SET_SOURCE_FILES_PROPERTIES(String.c PROPERTIES
+ set_source_files_properties(String.c PROPERTIES
COMPILE_FLAGS "-DKWSYS_STRING_C")
-ENDIF()
+endif()
-IF(KWSYS_USE_Encoding)
+if(KWSYS_USE_Encoding)
# Set default 8 bit encoding in "EndcodingC.c".
- SET_PROPERTY(SOURCE EncodingC.c EncodingCXX.cxx APPEND PROPERTY COMPILE_DEFINITIONS
+ set_property(SOURCE EncodingC.c EncodingCXX.cxx APPEND PROPERTY COMPILE_DEFINITIONS
KWSYS_ENCODING_DEFAULT_CODEPAGE=${KWSYS_ENCODING_DEFAULT_CODEPAGE})
-ENDIF()
+endif()
#-----------------------------------------------------------------------------
# Setup testing if not being built as part of another project.
-IF(KWSYS_STANDALONE OR CMake_SOURCE_DIR)
- IF(BUILD_TESTING)
+if(KWSYS_STANDALONE OR CMake_SOURCE_DIR)
+ if(BUILD_TESTING)
# Compute the location of executables.
- SET(EXEC_DIR "${CMAKE_CURRENT_BINARY_DIR}")
- IF(EXECUTABLE_OUTPUT_PATH)
- SET(EXEC_DIR "${EXECUTABLE_OUTPUT_PATH}")
- ENDIF()
+ set(EXEC_DIR "${CMAKE_CURRENT_BINARY_DIR}")
+ if(CMAKE_RUNTIME_OUTPUT_DIRECTORY)
+ set(EXEC_DIR "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}")
+ endif()
# C tests
- SET(KWSYS_C_TESTS
+ set(KWSYS_C_TESTS
testEncode.c
testTerminal.c
)
- IF(KWSYS_STANDALONE)
- SET(KWSYS_C_TESTS ${KWSYS_C_TESTS} testFail.c)
- ENDIF()
- CREATE_TEST_SOURCELIST(
+ if(KWSYS_STANDALONE)
+ set(KWSYS_C_TESTS ${KWSYS_C_TESTS} testFail.c)
+ endif()
+ create_test_sourcelist(
KWSYS_C_TEST_SRCS ${KWSYS_NAMESPACE}TestsC.c
${KWSYS_C_TESTS}
)
- ADD_EXECUTABLE(${KWSYS_NAMESPACE}TestsC ${KWSYS_C_TEST_SRCS})
- SET_PROPERTY(TARGET ${KWSYS_NAMESPACE}TestsC PROPERTY LABELS ${KWSYS_LABELS_EXE})
- TARGET_LINK_LIBRARIES(${KWSYS_NAMESPACE}TestsC ${KWSYS_TARGET_C_LINK})
- FOREACH(testfile ${KWSYS_C_TESTS})
+ add_executable(${KWSYS_NAMESPACE}TestsC ${KWSYS_C_TEST_SRCS})
+ set_property(TARGET ${KWSYS_NAMESPACE}TestsC PROPERTY LABELS ${KWSYS_LABELS_EXE})
+ target_link_libraries(${KWSYS_NAMESPACE}TestsC ${KWSYS_TARGET_C_LINK})
+ foreach(testfile ${KWSYS_C_TESTS})
get_filename_component(test "${testfile}" NAME_WE)
- ADD_TEST(kwsys.${test} ${EXEC_DIR}/${KWSYS_NAMESPACE}TestsC ${test} ${KWSYS_TEST_ARGS_${test}})
- SET_PROPERTY(TEST kwsys.${test} PROPERTY LABELS ${KWSYS_LABELS_TEST})
- ENDFOREACH()
+ add_test(kwsys.${test} ${EXEC_DIR}/${KWSYS_NAMESPACE}TestsC ${test} ${KWSYS_TEST_ARGS_${test}})
+ set_property(TEST kwsys.${test} PROPERTY LABELS ${KWSYS_LABELS_TEST})
+ endforeach()
# C++ tests
- IF(NOT WATCOM AND NOT CMake_SOURCE_DIR)
- SET(KWSYS_CXX_TESTS
+ if(NOT WATCOM AND NOT CMake_SOURCE_DIR)
+ set(KWSYS_CXX_TESTS
testHashSTL.cxx
)
- ENDIF()
- SET(KWSYS_CXX_TESTS ${KWSYS_CXX_TESTS}
+ endif()
+ set(KWSYS_CXX_TESTS ${KWSYS_CXX_TESTS}
testConfigure.cxx
testSystemTools.cxx
testCommandLineArguments.cxx
testCommandLineArguments1.cxx
testDirectory.cxx
)
- IF(KWSYS_STL_HAS_WSTRING)
- SET(KWSYS_CXX_TESTS ${KWSYS_CXX_TESTS}
+ if(KWSYS_STL_HAS_WSTRING)
+ set(KWSYS_CXX_TESTS ${KWSYS_CXX_TESTS}
testEncoding.cxx
)
- ENDIF()
- IF(KWSYS_USE_FStream)
- SET(KWSYS_CXX_TESTS ${KWSYS_CXX_TESTS}
+ endif()
+ if(KWSYS_USE_FStream)
+ set(KWSYS_CXX_TESTS ${KWSYS_CXX_TESTS}
testFStream.cxx
)
- ENDIF()
- IF(KWSYS_USE_ConsoleBuf)
- ADD_EXECUTABLE(testConsoleBufChild testConsoleBufChild.cxx)
- SET_PROPERTY(TARGET testConsoleBufChild PROPERTY C_CLANG_TIDY "")
- SET_PROPERTY(TARGET testConsoleBufChild PROPERTY CXX_CLANG_TIDY "")
- SET_PROPERTY(TARGET testConsoleBufChild PROPERTY C_INCLUDE_WHAT_YOU_USE "")
- SET_PROPERTY(TARGET testConsoleBufChild PROPERTY CXX_INCLUDE_WHAT_YOU_USE "")
- SET_PROPERTY(TARGET testConsoleBufChild PROPERTY LABELS ${KWSYS_LABELS_EXE})
- TARGET_LINK_LIBRARIES(testConsoleBufChild ${KWSYS_TARGET_LINK})
- SET(KWSYS_CXX_TESTS ${KWSYS_CXX_TESTS}
+ endif()
+ if(KWSYS_USE_ConsoleBuf)
+ add_executable(testConsoleBufChild testConsoleBufChild.cxx)
+ set_property(TARGET testConsoleBufChild PROPERTY C_CLANG_TIDY "")
+ set_property(TARGET testConsoleBufChild PROPERTY CXX_CLANG_TIDY "")
+ set_property(TARGET testConsoleBufChild PROPERTY C_INCLUDE_WHAT_YOU_USE "")
+ set_property(TARGET testConsoleBufChild PROPERTY CXX_INCLUDE_WHAT_YOU_USE "")
+ set_property(TARGET testConsoleBufChild PROPERTY LABELS ${KWSYS_LABELS_EXE})
+ target_link_libraries(testConsoleBufChild ${KWSYS_TARGET_LINK})
+ set(KWSYS_CXX_TESTS ${KWSYS_CXX_TESTS}
testConsoleBuf.cxx
)
- IF(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC" AND
+ if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC" AND
CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "19.0.23506")
set_property(SOURCE testConsoleBuf.cxx testConsoleBufChild.cxx PROPERTY COMPILE_FLAGS /utf-8)
- ENDIF()
- SET_PROPERTY(SOURCE testConsoleBuf.cxx APPEND PROPERTY COMPILE_DEFINITIONS
+ endif()
+ set_property(SOURCE testConsoleBuf.cxx APPEND PROPERTY COMPILE_DEFINITIONS
KWSYS_ENCODING_DEFAULT_CODEPAGE=${KWSYS_ENCODING_DEFAULT_CODEPAGE})
- ENDIF()
- IF(KWSYS_USE_SystemInformation)
- SET(KWSYS_CXX_TESTS ${KWSYS_CXX_TESTS} testSystemInformation.cxx)
- ENDIF()
- IF(KWSYS_USE_DynamicLoader)
- SET(KWSYS_CXX_TESTS ${KWSYS_CXX_TESTS} testDynamicLoader.cxx)
+ endif()
+ if(KWSYS_USE_SystemInformation)
+ set(KWSYS_CXX_TESTS ${KWSYS_CXX_TESTS} testSystemInformation.cxx)
+ endif()
+ if(KWSYS_USE_DynamicLoader)
+ set(KWSYS_CXX_TESTS ${KWSYS_CXX_TESTS} testDynamicLoader.cxx)
# If kwsys contains the DynamicLoader, need extra library
- ADD_LIBRARY(${KWSYS_NAMESPACE}TestDynload MODULE testDynload.c)
- SET_PROPERTY(TARGET ${KWSYS_NAMESPACE}TestDynload PROPERTY LABELS ${KWSYS_LABELS_LIB})
- ADD_DEPENDENCIES(${KWSYS_NAMESPACE}TestDynload ${KWSYS_TARGET_INTERFACE})
+ add_library(${KWSYS_NAMESPACE}TestDynload MODULE testDynload.c)
+ set_property(TARGET ${KWSYS_NAMESPACE}TestDynload PROPERTY LABELS ${KWSYS_LABELS_LIB})
+ add_dependencies(${KWSYS_NAMESPACE}TestDynload ${KWSYS_TARGET_INTERFACE})
if (WIN32)
# Windows tests supported flags.
@@ -1134,33 +1134,33 @@ IF(KWSYS_STANDALONE OR CMake_SOURCE_DIR)
add_dependencies(${KWSYS_NAMESPACE}TestDynloadUse ${KWSYS_TARGET_INTERFACE})
target_link_libraries(${KWSYS_NAMESPACE}TestDynloadUse PRIVATE ${KWSYS_NAMESPACE}TestDynloadImpl)
endif ()
- ENDIF()
- CREATE_TEST_SOURCELIST(
+ endif()
+ create_test_sourcelist(
KWSYS_CXX_TEST_SRCS ${KWSYS_NAMESPACE}TestsCxx.cxx
${KWSYS_CXX_TESTS}
)
- ADD_EXECUTABLE(${KWSYS_NAMESPACE}TestsCxx ${KWSYS_CXX_TEST_SRCS})
- SET_PROPERTY(TARGET ${KWSYS_NAMESPACE}TestsCxx PROPERTY C_CLANG_TIDY "")
- SET_PROPERTY(TARGET ${KWSYS_NAMESPACE}TestsCxx PROPERTY CXX_CLANG_TIDY "")
- SET_PROPERTY(TARGET ${KWSYS_NAMESPACE}TestsCxx PROPERTY C_INCLUDE_WHAT_YOU_USE "")
- SET_PROPERTY(TARGET ${KWSYS_NAMESPACE}TestsCxx PROPERTY CXX_INCLUDE_WHAT_YOU_USE "")
- SET_PROPERTY(TARGET ${KWSYS_NAMESPACE}TestsCxx PROPERTY LABELS ${KWSYS_LABELS_EXE})
- TARGET_LINK_LIBRARIES(${KWSYS_NAMESPACE}TestsCxx ${KWSYS_TARGET_LINK})
-
- SET(TEST_SYSTEMTOOLS_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
- SET(TEST_SYSTEMTOOLS_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}")
- CONFIGURE_FILE(
+ add_executable(${KWSYS_NAMESPACE}TestsCxx ${KWSYS_CXX_TEST_SRCS})
+ set_property(TARGET ${KWSYS_NAMESPACE}TestsCxx PROPERTY C_CLANG_TIDY "")
+ set_property(TARGET ${KWSYS_NAMESPACE}TestsCxx PROPERTY CXX_CLANG_TIDY "")
+ set_property(TARGET ${KWSYS_NAMESPACE}TestsCxx PROPERTY C_INCLUDE_WHAT_YOU_USE "")
+ set_property(TARGET ${KWSYS_NAMESPACE}TestsCxx PROPERTY CXX_INCLUDE_WHAT_YOU_USE "")
+ set_property(TARGET ${KWSYS_NAMESPACE}TestsCxx PROPERTY LABELS ${KWSYS_LABELS_EXE})
+ target_link_libraries(${KWSYS_NAMESPACE}TestsCxx ${KWSYS_TARGET_LINK})
+
+ set(TEST_SYSTEMTOOLS_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
+ set(TEST_SYSTEMTOOLS_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}")
+ configure_file(
${PROJECT_SOURCE_DIR}/testSystemTools.h.in
${PROJECT_BINARY_DIR}/testSystemTools.h)
- INCLUDE_DIRECTORIES(${PROJECT_BINARY_DIR})
+ include_directories(${PROJECT_BINARY_DIR})
- IF(CTEST_TEST_KWSYS)
- CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/ExtraTest.cmake.in"
+ if(CTEST_TEST_KWSYS)
+ configure_file("${CMAKE_CURRENT_SOURCE_DIR}/ExtraTest.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/ExtraTest.cmake")
- SET_DIRECTORY_PROPERTIES(PROPERTIES TEST_INCLUDE_FILE "${CMAKE_CURRENT_BINARY_DIR}/ExtraTest.cmake")
- ENDIF()
+ set_directory_properties(PROPERTIES TEST_INCLUDE_FILE "${CMAKE_CURRENT_BINARY_DIR}/ExtraTest.cmake")
+ endif()
- SET(KWSYS_TEST_ARGS_testCommandLineArguments
+ set(KWSYS_TEST_ARGS_testCommandLineArguments
--another-bool-variable
--long3=opt
--set-bool-arg1
@@ -1179,7 +1179,7 @@ IF(KWSYS_STANDALONE OR CMake_SOURCE_DIR)
-C=test
--long2 hello
)
- SET(KWSYS_TEST_ARGS_testCommandLineArguments1
+ set(KWSYS_TEST_ARGS_testCommandLineArguments1
--ignored
-n 24
--second-ignored
@@ -1188,73 +1188,71 @@ IF(KWSYS_STANDALONE OR CMake_SOURCE_DIR)
-p
some junk at the end
)
- FOREACH(testfile ${KWSYS_CXX_TESTS})
+ foreach(testfile ${KWSYS_CXX_TESTS})
get_filename_component(test "${testfile}" NAME_WE)
- ADD_TEST(kwsys.${test} ${EXEC_DIR}/${KWSYS_NAMESPACE}TestsCxx ${test} ${KWSYS_TEST_ARGS_${test}})
- SET_PROPERTY(TEST kwsys.${test} PROPERTY LABELS ${KWSYS_LABELS_TEST})
- ENDFOREACH()
+ add_test(kwsys.${test} ${EXEC_DIR}/${KWSYS_NAMESPACE}TestsCxx ${test} ${KWSYS_TEST_ARGS_${test}})
+ set_property(TEST kwsys.${test} PROPERTY LABELS ${KWSYS_LABELS_TEST})
+ endforeach()
# Process tests.
- ADD_EXECUTABLE(${KWSYS_NAMESPACE}TestProcess testProcess.c)
- SET_PROPERTY(TARGET ${KWSYS_NAMESPACE}TestProcess PROPERTY LABELS ${KWSYS_LABELS_EXE})
- TARGET_LINK_LIBRARIES(${KWSYS_NAMESPACE}TestProcess ${KWSYS_TARGET_C_LINK})
- IF(NOT CYGWIN)
- SET(KWSYS_TEST_PROCESS_7 7)
- ENDIF()
- FOREACH(n 1 2 3 4 5 6 ${KWSYS_TEST_PROCESS_7} 9 10)
- ADD_TEST(kwsys.testProcess-${n} ${EXEC_DIR}/${KWSYS_NAMESPACE}TestProcess ${n})
- SET_PROPERTY(TEST kwsys.testProcess-${n} PROPERTY LABELS ${KWSYS_LABELS_TEST})
- SET_TESTS_PROPERTIES(kwsys.testProcess-${n} PROPERTIES TIMEOUT 120)
- ENDFOREACH()
-
- SET(testProcess_COMPILE_FLAGS "")
+ add_executable(${KWSYS_NAMESPACE}TestProcess testProcess.c)
+ set_property(TARGET ${KWSYS_NAMESPACE}TestProcess PROPERTY LABELS ${KWSYS_LABELS_EXE})
+ target_link_libraries(${KWSYS_NAMESPACE}TestProcess ${KWSYS_TARGET_C_LINK})
+ #set(KWSYS_TEST_PROCESS_7 7) # uncomment to run timing-sensitive test locally
+ foreach(n 1 2 3 4 5 6 ${KWSYS_TEST_PROCESS_7} 9 10)
+ add_test(kwsys.testProcess-${n} ${EXEC_DIR}/${KWSYS_NAMESPACE}TestProcess ${n})
+ set_property(TEST kwsys.testProcess-${n} PROPERTY LABELS ${KWSYS_LABELS_TEST})
+ set_tests_properties(kwsys.testProcess-${n} PROPERTIES TIMEOUT 120)
+ endforeach()
+
+ set(testProcess_COMPILE_FLAGS "")
# Some Apple compilers produce bad optimizations in this source.
- IF(APPLE AND CMAKE_C_COMPILER_ID MATCHES "^(GNU|LLVM)$")
- SET(testProcess_COMPILE_FLAGS "${testProcess_COMPILE_FLAGS} -O0")
- ELSEIF(CMAKE_C_COMPILER_ID STREQUAL "XL")
+ if(APPLE AND CMAKE_C_COMPILER_ID MATCHES "^(GNU|LLVM)$")
+ set(testProcess_COMPILE_FLAGS "${testProcess_COMPILE_FLAGS} -O0")
+ elseif(CMAKE_C_COMPILER_ID STREQUAL "XL")
# Tell IBM XL not to warn about our test infinite loop
- IF(CMAKE_SYSTEM MATCHES "Linux.*ppc64le"
+ if(CMAKE_SYSTEM MATCHES "Linux.*ppc64le"
AND CMAKE_C_COMPILER_VERSION VERSION_LESS "16.1.0"
AND NOT CMAKE_C_COMPILER_VERSION VERSION_LESS "13.1.1")
# v13.1.[1-6] on Linux ppc64le is clang based and does not accept
# the -qsuppress option, so just suppress all warnings.
- SET(testProcess_COMPILE_FLAGS "${testProcess_COMPILE_FLAGS} -w")
- ELSE()
- SET(testProcess_COMPILE_FLAGS "${testProcess_COMPILE_FLAGS} -qsuppress=1500-010")
- ENDIF()
- ENDIF()
- IF(CMAKE_C_FLAGS MATCHES "-fsanitize=")
- SET(testProcess_COMPILE_FLAGS "${testProcess_COMPILE_FLAGS} -DCRASH_USING_ABORT")
- ENDIF()
- SET_PROPERTY(SOURCE testProcess.c PROPERTY COMPILE_FLAGS "${testProcess_COMPILE_FLAGS}")
+ set(testProcess_COMPILE_FLAGS "${testProcess_COMPILE_FLAGS} -w")
+ else()
+ set(testProcess_COMPILE_FLAGS "${testProcess_COMPILE_FLAGS} -qsuppress=1500-010")
+ endif()
+ endif()
+ if(CMAKE_C_FLAGS MATCHES "-fsanitize=")
+ set(testProcess_COMPILE_FLAGS "${testProcess_COMPILE_FLAGS} -DCRASH_USING_ABORT")
+ endif()
+ set_property(SOURCE testProcess.c PROPERTY COMPILE_FLAGS "${testProcess_COMPILE_FLAGS}")
# Test SharedForward
- CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/testSharedForward.c.in
+ configure_file(${PROJECT_SOURCE_DIR}/testSharedForward.c.in
${PROJECT_BINARY_DIR}/testSharedForward.c @ONLY IMMEDIATE)
- ADD_EXECUTABLE(${KWSYS_NAMESPACE}TestSharedForward
+ add_executable(${KWSYS_NAMESPACE}TestSharedForward
${PROJECT_BINARY_DIR}/testSharedForward.c)
- SET_PROPERTY(TARGET ${KWSYS_NAMESPACE}TestSharedForward PROPERTY LABELS ${KWSYS_LABELS_EXE})
- ADD_DEPENDENCIES(${KWSYS_NAMESPACE}TestSharedForward ${KWSYS_TARGET_C_LINK})
- ADD_TEST(kwsys.testSharedForward ${EXEC_DIR}/${KWSYS_NAMESPACE}TestSharedForward 1)
- SET_PROPERTY(TEST kwsys.testSharedForward PROPERTY LABELS ${KWSYS_LABELS_TEST})
+ set_property(TARGET ${KWSYS_NAMESPACE}TestSharedForward PROPERTY LABELS ${KWSYS_LABELS_EXE})
+ add_dependencies(${KWSYS_NAMESPACE}TestSharedForward ${KWSYS_TARGET_C_LINK})
+ add_test(kwsys.testSharedForward ${EXEC_DIR}/${KWSYS_NAMESPACE}TestSharedForward 1)
+ set_property(TEST kwsys.testSharedForward PROPERTY LABELS ${KWSYS_LABELS_TEST})
# Configure some test properties.
- IF(KWSYS_STANDALONE)
+ if(KWSYS_STANDALONE)
# We expect test to fail
- SET_TESTS_PROPERTIES(kwsys.testFail PROPERTIES WILL_FAIL ON)
- GET_TEST_PROPERTY(kwsys.testFail WILL_FAIL wfv)
- SET_TESTS_PROPERTIES(kwsys.testFail PROPERTIES MEASUREMENT "Some Key=Some Value")
- MESSAGE(STATUS "GET_TEST_PROPERTY returned: ${wfv}")
- ENDIF()
+ set_tests_properties(kwsys.testFail PROPERTIES WILL_FAIL ON)
+ get_test_property(kwsys.testFail WILL_FAIL wfv)
+ set_tests_properties(kwsys.testFail PROPERTIES MEASUREMENT "Some Key=Some Value")
+ message(STATUS "GET_TEST_PROPERTY returned: ${wfv}")
+ endif()
# Set up ctest custom configuration file.
- CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/CTestCustom.cmake.in
+ configure_file(${PROJECT_SOURCE_DIR}/CTestCustom.cmake.in
${PROJECT_BINARY_DIR}/CTestCustom.cmake @ONLY)
# Suppress known consistent failures on buggy systems.
- IF(KWSYS_TEST_BOGUS_FAILURES)
- SET_TESTS_PROPERTIES(${KWSYS_TEST_BOGUS_FAILURES} PROPERTIES WILL_FAIL ON)
- ENDIF()
+ if(KWSYS_TEST_BOGUS_FAILURES)
+ set_tests_properties(${KWSYS_TEST_BOGUS_FAILURES} PROPERTIES WILL_FAIL ON)
+ endif()
- ENDIF()
-ENDIF()
+ endif()
+endif()
diff --git a/Source/kwsys/CommandLineArguments.cxx b/Source/kwsys/CommandLineArguments.cxx
index 3fd1955..e45db36 100644
--- a/Source/kwsys/CommandLineArguments.cxx
+++ b/Source/kwsys/CommandLineArguments.cxx
@@ -20,9 +20,9 @@
#include <sstream>
#include <vector>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
#ifdef _MSC_VER
# pragma warning(disable : 4786)
@@ -66,26 +66,21 @@ class CommandLineArgumentsMapOfStrucs
class CommandLineArgumentsInternal
{
public:
- CommandLineArgumentsInternal()
- : UnknownArgumentCallback{ nullptr }
- , ClientData{ nullptr }
- , LastArgument{ 0 }
- {
- }
+ CommandLineArgumentsInternal() = default;
- typedef CommandLineArgumentsVectorOfStrings VectorOfStrings;
- typedef CommandLineArgumentsMapOfStrucs CallbacksMap;
- typedef kwsys::String String;
- typedef CommandLineArgumentsSetOfStrings SetOfStrings;
+ using VectorOfStrings = CommandLineArgumentsVectorOfStrings;
+ using CallbacksMap = CommandLineArgumentsMapOfStrucs;
+ using String = kwsys::String;
+ using SetOfStrings = CommandLineArgumentsSetOfStrings;
VectorOfStrings Argv;
String Argv0;
CallbacksMap Callbacks;
- CommandLineArguments::ErrorCallbackType UnknownArgumentCallback;
- void* ClientData;
+ CommandLineArguments::ErrorCallbackType UnknownArgumentCallback{ nullptr };
+ void* ClientData{ nullptr };
- VectorOfStrings::size_type LastArgument;
+ VectorOfStrings::size_type LastArgument{ 0 };
VectorOfStrings UnusedArguments;
};
@@ -424,8 +419,7 @@ void CommandLineArguments::SetUnknownArgumentCallback(
const char* CommandLineArguments::GetHelp(const char* arg)
{
- CommandLineArguments::Internal::CallbacksMap::iterator it =
- this->Internals->Callbacks.find(arg);
+ auto it = this->Internals->Callbacks.find(arg);
if (it == this->Internals->Callbacks.end()) {
return nullptr;
}
@@ -434,8 +428,7 @@ const char* CommandLineArguments::GetHelp(const char* arg)
// one point to if this one is pointing to another argument.
CommandLineArgumentsCallbackStructure* cs = &(it->second);
for (;;) {
- CommandLineArguments::Internal::CallbacksMap::iterator hit =
- this->Internals->Callbacks.find(cs->Help);
+ auto hit = this->Internals->Callbacks.find(cs->Help);
if (hit == this->Internals->Callbacks.end()) {
break;
}
@@ -470,9 +463,8 @@ void CommandLineArguments::GenerateHelp()
// Collapse all arguments into the map of vectors of all arguments that do
// the same thing.
CommandLineArguments::Internal::CallbacksMap::iterator it;
- typedef std::map<CommandLineArguments::Internal::String,
- CommandLineArguments::Internal::SetOfStrings>
- MapArgs;
+ using MapArgs = std::map<CommandLineArguments::Internal::String,
+ CommandLineArguments::Internal::SetOfStrings>;
MapArgs mp;
MapArgs::iterator mpit, smpit;
for (it = this->Internals->Callbacks.begin();
@@ -709,7 +701,7 @@ bool CommandLineArguments::PopulateVariable(
if (cs->Callback) {
if (!cs->Callback(cs->Argument, value, cs->CallData)) {
this->Internals->LastArgument--;
- return 0;
+ return false;
}
}
CommandLineArguments_DEBUG("Set argument: " << cs->Argument << " to "
@@ -759,10 +751,10 @@ bool CommandLineArguments::PopulateVariable(
std::cerr << "Got unknown variable type: \"" << cs->VariableType
<< "\"" << std::endl;
this->Internals->LastArgument--;
- return 0;
+ return false;
}
}
- return 1;
+ return true;
}
} // namespace KWSYS_NAMESPACE
diff --git a/Source/kwsys/Directory.cxx b/Source/kwsys/Directory.cxx
index e379182..be9158e 100644
--- a/Source/kwsys/Directory.cxx
+++ b/Source/kwsys/Directory.cxx
@@ -35,6 +35,18 @@ Directory::Directory()
this->Internal = new DirectoryInternals;
}
+Directory::Directory(Directory&& other)
+{
+ this->Internal = other.Internal;
+ other.Internal = nullptr;
+}
+
+Directory& Directory::operator=(Directory&& other)
+{
+ std::swap(this->Internal, other.Internal);
+ return *this;
+}
+
Directory::~Directory()
{
delete this->Internal;
@@ -91,7 +103,7 @@ void Directory::Clear()
namespace KWSYS_NAMESPACE {
-bool Directory::Load(const std::string& name)
+bool Directory::Load(const std::string& name, std::string* errorMessage)
{
this->Clear();
# if (defined(_MSC_VER) && _MSC_VER < 1300) || defined(__BORLANDC__)
@@ -134,7 +146,8 @@ bool Directory::Load(const std::string& name)
return _findclose(srchHandle) != -1;
}
-unsigned long Directory::GetNumberOfFilesInDirectory(const std::string& name)
+unsigned long Directory::GetNumberOfFilesInDirectory(const std::string& name,
+ std::string* errorMessage)
{
# if (defined(_MSC_VER) && _MSC_VER < 1300) || defined(__BORLANDC__)
// Older Visual C++ and Embarcadero compilers.
@@ -180,6 +193,8 @@ unsigned long Directory::GetNumberOfFilesInDirectory(const std::string& name)
# include <sys/types.h>
# include <dirent.h>
+# include <errno.h>
+# include <string.h>
// PGI with glibc has trouble with dirent and large file support:
// http://www.pgroup.com/userforum/viewtopic.php?
@@ -197,29 +212,46 @@ unsigned long Directory::GetNumberOfFilesInDirectory(const std::string& name)
namespace KWSYS_NAMESPACE {
-bool Directory::Load(const std::string& name)
+bool Directory::Load(const std::string& name, std::string* errorMessage)
{
this->Clear();
+ errno = 0;
DIR* dir = opendir(name.c_str());
if (!dir) {
- return 0;
+ if (errorMessage != nullptr) {
+ *errorMessage = std::string(strerror(errno));
+ }
+ return false;
}
+ errno = 0;
for (kwsys_dirent* d = readdir(dir); d; d = readdir(dir)) {
- this->Internal->Files.push_back(d->d_name);
+ this->Internal->Files.emplace_back(d->d_name);
+ }
+ if (errno != 0) {
+ if (errorMessage != nullptr) {
+ *errorMessage = std::string(strerror(errno));
+ }
+ return false;
}
+
this->Internal->Path = name;
closedir(dir);
- return 1;
+ return true;
}
-unsigned long Directory::GetNumberOfFilesInDirectory(const std::string& name)
+unsigned long Directory::GetNumberOfFilesInDirectory(const std::string& name,
+ std::string* errorMessage)
{
+ errno = 0;
DIR* dir = opendir(name.c_str());
if (!dir) {
+ if (errorMessage != nullptr) {
+ *errorMessage = std::string(strerror(errno));
+ }
return 0;
}
@@ -227,6 +259,13 @@ unsigned long Directory::GetNumberOfFilesInDirectory(const std::string& name)
for (kwsys_dirent* d = readdir(dir); d; d = readdir(dir)) {
count++;
}
+ if (errno != 0) {
+ if (errorMessage != nullptr) {
+ *errorMessage = std::string(strerror(errno));
+ }
+ return false;
+ }
+
closedir(dir);
return count;
}
diff --git a/Source/kwsys/Directory.hxx.in b/Source/kwsys/Directory.hxx.in
index ad8c51b..7bc9db0 100644
--- a/Source/kwsys/Directory.hxx.in
+++ b/Source/kwsys/Directory.hxx.in
@@ -23,6 +23,11 @@ class @KWSYS_NAMESPACE@_EXPORT Directory
{
public:
Directory();
+ Directory(Directory&& other);
+ Directory(const Directory&) = delete;
+ Directory& operator=(const Directory&) = delete;
+ Directory& operator=(Directory&& other);
+ bool operator==(const Directory&) = delete;
~Directory();
/**
@@ -30,7 +35,7 @@ public:
* in that directory. 0 is returned if the directory can not be
* opened, 1 if it is opened.
*/
- bool Load(const std::string&);
+ bool Load(const std::string&, std::string* errorMessage = nullptr);
/**
* Return the number of files in the current directory.
@@ -41,7 +46,8 @@ public:
* Return the number of files in the specified directory.
* A higher performance static method.
*/
- static unsigned long GetNumberOfFilesInDirectory(const std::string&);
+ static unsigned long GetNumberOfFilesInDirectory(
+ const std::string&, std::string* errorMessage = nullptr);
/**
* Return the file at the given index, the indexing is 0 based
@@ -62,10 +68,7 @@ public:
private:
// Private implementation details.
DirectoryInternals* Internal;
-
- Directory(const Directory&); // Not implemented.
- void operator=(const Directory&); // Not implemented.
-}; // End Class: Directory
+}; // End Class: Directory
} // namespace @KWSYS_NAMESPACE@
diff --git a/Source/kwsys/EncodingCXX.cxx b/Source/kwsys/EncodingCXX.cxx
index 5cad934..c68c73c 100644
--- a/Source/kwsys/EncodingCXX.cxx
+++ b/Source/kwsys/EncodingCXX.cxx
@@ -17,8 +17,8 @@
# include "Encoding.hxx.in"
#endif
-#include <stdlib.h>
-#include <string.h>
+#include <cstdlib>
+#include <cstring>
#include <vector>
#ifdef _MSC_VER
diff --git a/Source/kwsys/ExtraTest.cmake.in b/Source/kwsys/ExtraTest.cmake.in
index e8c0a1c..4cec9e2 100644
--- a/Source/kwsys/ExtraTest.cmake.in
+++ b/Source/kwsys/ExtraTest.cmake.in
@@ -1 +1 @@
-MESSAGE("*** This message is generated by message inside a file that is included in DartTestfile.txt ***")
+message("*** This message is generated by message inside a file that is included in DartTestfile.txt ***")
diff --git a/Source/kwsys/Glob.cxx b/Source/kwsys/Glob.cxx
index 34bb0d0..5452f73 100644
--- a/Source/kwsys/Glob.cxx
+++ b/Source/kwsys/Glob.cxx
@@ -23,9 +23,9 @@
#include <string>
#include <vector>
-#include <ctype.h>
-#include <stdio.h>
-#include <string.h>
+#include <cctype>
+#include <cstdio>
+#include <cstring>
namespace KWSYS_NAMESPACE {
#if defined(_WIN32) || defined(__APPLE__) || defined(__CYGWIN__)
// On Windows and Apple, no difference between lower and upper case
@@ -182,7 +182,15 @@ bool Glob::RecurseDirectory(std::string::size_type start,
const std::string& dir, GlobMessages* messages)
{
kwsys::Directory d;
- if (!d.Load(dir)) {
+ std::string errorMessage;
+ if (!d.Load(dir, &errorMessage)) {
+ if (messages) {
+ if (!errorMessage.empty()) {
+ messages->push_back(Message(Glob::warning,
+ "Error listing directory '" + dir +
+ "'! Reason: '" + errorMessage + "'"));
+ }
+ }
return true;
}
unsigned long cc;
@@ -278,7 +286,9 @@ void Glob::ProcessDirectory(std::string::size_type start,
// std::cout << "ProcessDirectory: " << dir << std::endl;
bool last = (start == this->Internals->Expressions.size() - 1);
if (last && this->Recurse) {
- this->RecurseDirectory(start, dir, messages);
+ if (kwsys::SystemTools::FileIsDirectory(dir)) {
+ this->RecurseDirectory(start, dir, messages);
+ }
return;
}
@@ -385,10 +395,9 @@ bool Glob::FindFiles(const std::string& inexpr, GlobMessages* messages)
}
if (skip > 0) {
- expr = expr.substr(skip);
+ expr.erase(0, skip);
}
- cexpr = "";
for (cc = 0; cc < expr.size(); cc++) {
int ch = expr[cc];
if (ch == '/') {
@@ -415,8 +424,7 @@ bool Glob::FindFiles(const std::string& inexpr, GlobMessages* messages)
void Glob::AddExpression(const std::string& expr)
{
- this->Internals->Expressions.push_back(
- kwsys::RegularExpression(this->PatternToRegex(expr)));
+ this->Internals->Expressions.emplace_back(this->PatternToRegex(expr));
}
void Glob::SetRelative(const char* dir)
diff --git a/Source/kwsys/Glob.hxx.in b/Source/kwsys/Glob.hxx.in
index 170766f..b5a34d5 100644
--- a/Source/kwsys/Glob.hxx.in
+++ b/Source/kwsys/Glob.hxx.in
@@ -28,6 +28,7 @@ public:
enum MessageType
{
error,
+ warning,
cyclicRecursion
};
diff --git a/Source/kwsys/MD5.c b/Source/kwsys/MD5.c
index 97cf9ba..fb18a5b 100644
--- a/Source/kwsys/MD5.c
+++ b/Source/kwsys/MD5.c
@@ -171,8 +171,10 @@ typedef struct md5_state_s
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 a = pms->abcd[0];
+ md5_word_t b = pms->abcd[1];
+ md5_word_t c = pms->abcd[2];
+ md5_word_t d = pms->abcd[3];
md5_word_t t;
#if BYTE_ORDER > 0
/* Define storage only for big-endian CPUs. */
@@ -227,9 +229,10 @@ static void md5_process(md5_state_t* pms, const md5_byte_t* data /*[64]*/)
# else
# define xbuf X /* (static only) */
# endif
- for (i = 0; i < 16; ++i, xp += 4)
+ for (i = 0; i < 16; ++i, xp += 4) {
xbuf[i] =
(md5_word_t)(xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24));
+ }
}
#endif
}
@@ -367,34 +370,39 @@ static void md5_append(md5_state_t* pms, const md5_byte_t* data, size_t nbytes)
size_t offset = (pms->count[0] >> 3) & 63;
md5_word_t nbits = (md5_word_t)(nbytes << 3);
- if (nbytes <= 0)
+ if (nbytes <= 0) {
return;
+ }
/* Update the message length. */
pms->count[1] += (md5_word_t)(nbytes >> 29);
pms->count[0] += nbits;
- if (pms->count[0] < nbits)
+ if (pms->count[0] < nbits) {
pms->count[1]++;
+ }
/* Process an initial partial block. */
if (offset) {
size_t copy = (offset + nbytes > 64 ? 64 - offset : nbytes);
memcpy(pms->buf + offset, p, copy);
- if (offset + copy < 64)
+ if (offset + copy < 64) {
return;
+ }
p += copy;
left -= copy;
md5_process(pms, pms->buf);
}
/* Process full blocks. */
- for (; left >= 64; p += 64, left -= 64)
+ for (; left >= 64; p += 64, left -= 64) {
md5_process(pms, p);
+ }
/* Process a final partial block. */
- if (left)
+ if (left) {
memcpy(pms->buf, p, left);
+ }
}
/* Finish the message and return the digest. */
@@ -409,14 +417,16 @@ static void md5_finish(md5_state_t* pms, md5_byte_t digest[16])
int i;
/* Save the length before padding. */
- for (i = 0; i < 8; ++i)
+ 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)
+ for (i = 0; i < 16; ++i) {
digest[i] = (md5_byte_t)(pms->abcd[i >> 2] >> ((i & 3) << 3));
+ }
}
#if defined(__clang__) && !defined(__INTEL_COMPILER)
diff --git a/Source/kwsys/Process.h.in b/Source/kwsys/Process.h.in
index 73ea9db..9f2162b 100644
--- a/Source/kwsys/Process.h.in
+++ b/Source/kwsys/Process.h.in
@@ -180,8 +180,8 @@ kwsysEXPORT void kwsysProcess_SetPipeShared(kwsysProcess* cp, int pipe,
* write end of the pipe will be closed in the parent process and the
* read end will be closed in the child process.
*/
-kwsysEXPORT void kwsysProcess_SetPipeNative(kwsysProcess* cp, int pipe,
- kwsysProcess_Pipe_Handle p[2]);
+kwsysEXPORT void kwsysProcess_SetPipeNative(
+ kwsysProcess* cp, int pipe, const kwsysProcess_Pipe_Handle p[2]);
/**
* Get/Set a possibly platform-specific option. Possible options are:
diff --git a/Source/kwsys/ProcessUNIX.c b/Source/kwsys/ProcessUNIX.c
index f65690b..cc45529 100644
--- a/Source/kwsys/ProcessUNIX.c
+++ b/Source/kwsys/ProcessUNIX.c
@@ -152,10 +152,11 @@ static int kwsysProcessCreate(kwsysProcess* cp, int prIndex,
static void kwsysProcessDestroy(kwsysProcess* cp);
static int kwsysProcessSetupOutputPipeFile(int* p, const char* name);
static int kwsysProcessSetupOutputPipeNative(int* p, int des[2]);
-static int kwsysProcessGetTimeoutTime(kwsysProcess* cp, double* userTimeout,
+static int kwsysProcessGetTimeoutTime(kwsysProcess* cp,
+ const double* userTimeout,
kwsysProcessTime* timeoutTime);
static int kwsysProcessGetTimeoutLeft(kwsysProcessTime* timeoutTime,
- double* userTimeout,
+ const double* userTimeout,
kwsysProcessTimeNative* timeoutLength,
int zeroIsExpired);
static kwsysProcessTime kwsysProcessTimeGetCurrent(void);
@@ -431,8 +432,8 @@ int kwsysProcess_AddCommand(kwsysProcess* cp, char const* const* command)
char const* const* c = command;
kwsysProcess_ptrdiff_t n = 0;
kwsysProcess_ptrdiff_t i = 0;
- while (*c++)
- ;
+ while (*c++) {
+ }
n = c - command - 1;
newCommands[cp->NumberOfCommands] =
(char**)malloc((size_t)(n + 1) * sizeof(char*));
@@ -571,7 +572,7 @@ void kwsysProcess_SetPipeShared(kwsysProcess* cp, int prPipe, int shared)
}
}
-void kwsysProcess_SetPipeNative(kwsysProcess* cp, int prPipe, int p[2])
+void kwsysProcess_SetPipeNative(kwsysProcess* cp, int prPipe, const int p[2])
{
int* pPipeNative = 0;
@@ -684,7 +685,8 @@ const char* kwsysProcess_GetErrorString(kwsysProcess* cp)
{
if (!cp) {
return "Process management structure could not be allocated";
- } else if (cp->State == kwsysProcess_State_Error) {
+ }
+ if (cp->State == kwsysProcess_State_Error) {
return cp->ErrorMessage;
}
return "Success";
@@ -694,7 +696,8 @@ const char* kwsysProcess_GetExceptionString(kwsysProcess* cp)
{
if (!(cp && cp->ProcessResults && (cp->NumberOfCommands > 0))) {
return "GetExceptionString called with NULL process management structure";
- } else if (cp->State == kwsysProcess_State_Exception) {
+ }
+ if (cp->State == kwsysProcess_State_Exception) {
return cp->ProcessResults[cp->NumberOfCommands - 1].ExitExceptionString;
}
return "No exception";
@@ -786,8 +789,8 @@ void kwsysProcess_Execute(kwsysProcess* cp)
/* Some platforms specify that the chdir call may be
interrupted. Repeat the call until it finishes. */
- while (((r = chdir(cp->WorkingDirectory)) < 0) && (errno == EINTR))
- ;
+ while (((r = chdir(cp->WorkingDirectory)) < 0) && (errno == EINTR)) {
+ }
if (r < 0) {
kwsysProcessCleanup(cp, 1);
return;
@@ -1013,8 +1016,8 @@ void kwsysProcess_Execute(kwsysProcess* cp)
if (cp->RealWorkingDirectory) {
/* Some platforms specify that the chdir call may be
interrupted. Repeat the call until it finishes. */
- while ((chdir(cp->RealWorkingDirectory) < 0) && (errno == EINTR))
- ;
+ while ((chdir(cp->RealWorkingDirectory) < 0) && (errno == EINTR)) {
+ }
free(cp->RealWorkingDirectory);
cp->RealWorkingDirectory = 0;
}
@@ -1099,22 +1102,22 @@ int kwsysProcess_WaitForData(kwsysProcess* cp, char** data, int* length,
if (wd.PipeId) {
/* Data are ready on a pipe. */
return wd.PipeId;
- } else if (wd.Expired) {
+ }
+ if (wd.Expired) {
/* A timeout has expired. */
if (wd.User) {
/* The user timeout has expired. It has no time left. */
return kwsysProcess_Pipe_Timeout;
- } else {
- /* The process timeout has expired. Kill the children now. */
- kwsysProcess_Kill(cp);
- cp->Killed = 0;
- cp->TimeoutExpired = 1;
- return kwsysProcess_Pipe_None;
}
- } else {
- /* No pipes are left open. */
+
+ /* The process timeout has expired. Kill the children now. */
+ kwsysProcess_Kill(cp);
+ cp->Killed = 0;
+ cp->TimeoutExpired = 1;
return kwsysProcess_Pipe_None;
}
+ /* No pipes are left open. */
+ return kwsysProcess_Pipe_None;
}
static int kwsysProcessWaitForPipe(kwsysProcess* cp, char** data, int* length,
@@ -1144,8 +1147,8 @@ static int kwsysProcessWaitForPipe(kwsysProcess* cp, char** data, int* length,
read until the operation is not interrupted. */
while (((n = read(cp->PipeReadEnds[i], cp->PipeBuffer,
KWSYSPE_PIPE_BUFFER_SIZE)) < 0) &&
- (errno == EINTR))
- ;
+ (errno == EINTR)) {
+ }
if (n > 0) {
/* We have data on this pipe. */
if (i == KWSYSPE_PIPE_SIGNAL) {
@@ -1183,7 +1186,7 @@ static int kwsysProcessWaitForPipe(kwsysProcess* cp, char** data, int* length,
/* Make sure the set is empty (it should always be empty here
anyway). */
- FD_ZERO(&cp->PipeSet);
+ FD_ZERO(&cp->PipeSet); // NOLINT(readability-isolate-declaration)
/* Setup a timeout if required. */
if (wd->TimeoutTime.tv_sec < 0) {
@@ -1218,15 +1221,16 @@ static int kwsysProcessWaitForPipe(kwsysProcess* cp, char** data, int* length,
/* Run select to block until data are available. Repeat call
until it is not interrupted. */
while (((numReady = select(max + 1, &cp->PipeSet, 0, 0, timeout)) < 0) &&
- (errno == EINTR))
- ;
+ (errno == EINTR)) {
+ }
/* Check result of select. */
if (numReady == 0) {
/* Select's timeout expired. */
wd->Expired = 1;
return 1;
- } else if (numReady < 0) {
+ }
+ if (numReady < 0) {
/* Select returned an error. Leave the error description in the
pipe buffer. */
strncpy(cp->ErrorMessage, strerror(errno), KWSYSPE_PIPE_BUFFER_SIZE);
@@ -1366,11 +1370,13 @@ int kwsysProcess_WaitForExit(kwsysProcess* cp, double* userTimeout)
cp->ProcessResults[prPipe].State = kwsysProcess_StateByIndex_Exited;
cp->ProcessResults[prPipe].ExitException = kwsysProcess_Exception_None;
cp->ProcessResults[prPipe].ExitValue =
+ // NOLINTNEXTLINE(google-readability-casting)
(int)WEXITSTATUS(cp->ProcessResults[prPipe].ExitCode);
} else if (WIFSIGNALED(cp->ProcessResults[prPipe].ExitCode)) {
/* The child received an unhandled signal. */
cp->ProcessResults[prPipe].State = kwsysProcess_State_Exception;
kwsysProcessSetExitExceptionByIndex(
+ // NOLINTNEXTLINE(google-readability-casting)
cp, (int)WTERMSIG(cp->ProcessResults[prPipe].ExitCode), prPipe);
} else {
/* Error getting the child return code. */
@@ -1449,8 +1455,8 @@ void kwsysProcess_Kill(kwsysProcess* cp)
/* Reap the child. Keep trying until the call is not
interrupted. */
- while ((waitpid(cp->ForkPIDs[i], &status, 0) < 0) && (errno == EINTR))
- ;
+ while ((waitpid(cp->ForkPIDs[i], &status, 0) < 0) && (errno == EINTR)) {
+ }
}
}
@@ -1501,7 +1507,7 @@ static int kwsysProcessInitialize(kwsysProcess* cp)
cp->PipesLeft = 0;
cp->CommandsLeft = 0;
#if KWSYSPE_USE_SELECT
- FD_ZERO(&cp->PipeSet);
+ FD_ZERO(&cp->PipeSet); // NOLINT(readability-isolate-declaration)
#endif
cp->State = kwsysProcess_State_Starting;
cp->Killed = 0;
@@ -1590,16 +1596,16 @@ static void kwsysProcessCleanup(kwsysProcess* cp, int error)
/* Reap the child. Keep trying until the call is not
interrupted. */
while ((waitpid(cp->ForkPIDs[i], &status, 0) < 0) &&
- (errno == EINTR))
- ;
+ (errno == EINTR)) {
+ }
}
}
}
/* Restore the working directory. */
if (cp->RealWorkingDirectory) {
- while ((chdir(cp->RealWorkingDirectory) < 0) && (errno == EINTR))
- ;
+ while ((chdir(cp->RealWorkingDirectory) < 0) && (errno == EINTR)) {
+ }
}
}
@@ -1635,8 +1641,8 @@ static void kwsysProcessCleanupDescriptor(int* pfd)
if (pfd && *pfd > 2) {
/* Keep trying to close until it is not interrupted by a
* signal. */
- while ((close(*pfd) < 0) && (errno == EINTR))
- ;
+ while ((close(*pfd) < 0) && (errno == EINTR)) {
+ }
*pfd = -1;
}
}
@@ -1661,8 +1667,8 @@ static void kwsysProcessClosePipes(kwsysProcess* cp)
read until the operation is not interrupted. */
while ((read(cp->PipeReadEnds[i], cp->PipeBuffer,
KWSYSPE_PIPE_BUFFER_SIZE) < 0) &&
- (errno == EINTR))
- ;
+ (errno == EINTR)) {
+ }
}
#endif
@@ -1689,7 +1695,8 @@ int decc$set_child_standard_streams(int fd1, int fd2, int fd3);
static int kwsysProcessCreate(kwsysProcess* cp, int prIndex,
kwsysProcessCreateInformation* si)
{
- sigset_t mask, old_mask;
+ sigset_t mask;
+ sigset_t old_mask;
int pgidPipe[2];
char tmp;
ssize_t readRes;
@@ -1817,8 +1824,8 @@ static int kwsysProcessCreate(kwsysProcess* cp, int prIndex,
/* Make sure the child is in the process group before we proceed. This
avoids race conditions with calls to the kill function that we make for
signalling process groups. */
- while ((readRes = read(pgidPipe[0], &tmp, 1)) > 0)
- ;
+ while ((readRes = read(pgidPipe[0], &tmp, 1)) > 0) {
+ }
if (readRes < 0) {
sigprocmask(SIG_SETMASK, &old_mask, 0);
kwsysProcessCleanupDescriptor(&si->ErrorPipe[0]);
@@ -1846,8 +1853,8 @@ static int kwsysProcessCreate(kwsysProcess* cp, int prIndex,
/* Keep trying to read until the operation is not interrupted. */
while (((n = read(si->ErrorPipe[0], cp->ErrorMessage + total,
(size_t)(KWSYSPE_PIPE_BUFFER_SIZE - total))) < 0) &&
- (errno == EINTR))
- ;
+ (errno == EINTR)) {
+ }
if (n > 0) {
total += n;
}
@@ -1872,7 +1879,8 @@ static void kwsysProcessDestroy(kwsysProcess* cp)
int i;
/* Temporarily disable signals that access ForkPIDs. We don't want them to
read a reaped PID, and writes to ForkPIDs are not atomic. */
- sigset_t mask, old_mask;
+ sigset_t mask;
+ sigset_t old_mask;
sigemptyset(&mask);
sigaddset(&mask, SIGINT);
sigaddset(&mask, SIGTERM);
@@ -1885,8 +1893,8 @@ static void kwsysProcessDestroy(kwsysProcess* cp)
int result;
while (((result = waitpid(cp->ForkPIDs[i], &cp->CommandExitCodes[i],
WNOHANG)) < 0) &&
- (errno == EINTR))
- ;
+ (errno == EINTR)) {
+ }
if (result > 0) {
/* This child has termianted. */
cp->ForkPIDs[i] = 0;
@@ -1959,7 +1967,8 @@ static int kwsysProcessSetupOutputPipeNative(int* p, int des[2])
/* Get the time at which either the process or user timeout will
expire. Returns 1 if the user timeout is first, and 0 otherwise. */
-static int kwsysProcessGetTimeoutTime(kwsysProcess* cp, double* userTimeout,
+static int kwsysProcessGetTimeoutTime(kwsysProcess* cp,
+ const double* userTimeout,
kwsysProcessTime* timeoutTime)
{
/* The first time this is called, we need to calculate the time at
@@ -1991,35 +2000,33 @@ static int kwsysProcessGetTimeoutTime(kwsysProcess* cp, double* userTimeout,
/* Get the length of time before the given timeout time arrives.
Returns 1 if the time has already arrived, and 0 otherwise. */
static int kwsysProcessGetTimeoutLeft(kwsysProcessTime* timeoutTime,
- double* userTimeout,
+ const double* userTimeout,
kwsysProcessTimeNative* timeoutLength,
int zeroIsExpired)
{
if (timeoutTime->tv_sec < 0) {
/* No timeout time has been requested. */
return 0;
- } else {
- /* Calculate the remaining time. */
- kwsysProcessTime currentTime = kwsysProcessTimeGetCurrent();
- kwsysProcessTime timeLeft =
- kwsysProcessTimeSubtract(*timeoutTime, currentTime);
- if (timeLeft.tv_sec < 0 && userTimeout && *userTimeout <= 0) {
- /* Caller has explicitly requested a zero timeout. */
- timeLeft.tv_sec = 0;
- timeLeft.tv_usec = 0;
- }
+ }
+ /* Calculate the remaining time. */
+ kwsysProcessTime currentTime = kwsysProcessTimeGetCurrent();
+ kwsysProcessTime timeLeft =
+ kwsysProcessTimeSubtract(*timeoutTime, currentTime);
+ if (timeLeft.tv_sec < 0 && userTimeout && *userTimeout <= 0) {
+ /* Caller has explicitly requested a zero timeout. */
+ timeLeft.tv_sec = 0;
+ timeLeft.tv_usec = 0;
+ }
- if (timeLeft.tv_sec < 0 ||
- (timeLeft.tv_sec == 0 && timeLeft.tv_usec == 0 && zeroIsExpired)) {
- /* Timeout has already expired. */
- return 1;
- } else {
- /* There is some time left. */
- timeoutLength->tv_sec = timeLeft.tv_sec;
- timeoutLength->tv_usec = timeLeft.tv_usec;
- return 0;
- }
+ if (timeLeft.tv_sec < 0 ||
+ (timeLeft.tv_sec == 0 && timeLeft.tv_usec == 0 && zeroIsExpired)) {
+ /* Timeout has already expired. */
+ return 1;
}
+ /* There is some time left. */
+ timeoutLength->tv_sec = timeLeft.tv_sec;
+ timeoutLength->tv_usec = timeLeft.tv_usec;
+ return 0;
}
static kwsysProcessTime kwsysProcessTimeGetCurrent(void)
@@ -2424,41 +2431,39 @@ static pid_t kwsysProcessFork(kwsysProcess* cp,
if (middle_pid < 0) {
/* Fork failed. Return as if we were not detaching. */
return middle_pid;
- } else if (middle_pid == 0) {
+ }
+ if (middle_pid == 0) {
/* This is the intermediate process. Create the real child. */
pid_t child_pid = fork();
if (child_pid == 0) {
/* This is the real child process. There is nothing to do here. */
return 0;
- } else {
- /* Use the error pipe to report the pid to the real parent. */
- while ((write(si->ErrorPipe[1], &child_pid, sizeof(child_pid)) < 0) &&
- (errno == EINTR))
- ;
-
- /* Exit without cleanup. The parent holds all resources. */
- kwsysProcessExit();
- return 0; /* Never reached, but avoids SunCC warning. */
}
- } else {
- /* This is the original parent process. The intermediate
- process will use the error pipe to report the pid of the
- detached child. */
- pid_t child_pid;
- int status;
- while ((read(si->ErrorPipe[0], &child_pid, sizeof(child_pid)) < 0) &&
- (errno == EINTR))
- ;
+ /* Use the error pipe to report the pid to the real parent. */
+ while ((write(si->ErrorPipe[1], &child_pid, sizeof(child_pid)) < 0) &&
+ (errno == EINTR)) {
+ }
- /* Wait for the intermediate process to exit and clean it up. */
- while ((waitpid(middle_pid, &status, 0) < 0) && (errno == EINTR))
- ;
- return child_pid;
+ /* Exit without cleanup. The parent holds all resources. */
+ kwsysProcessExit();
+ return 0; /* Never reached, but avoids SunCC warning. */
}
- } else {
- /* Not creating a detached process. Use normal fork. */
- return fork();
+ /* This is the original parent process. The intermediate
+ process will use the error pipe to report the pid of the
+ detached child. */
+ pid_t child_pid;
+ int status;
+ while ((read(si->ErrorPipe[0], &child_pid, sizeof(child_pid)) < 0) &&
+ (errno == EINTR)) {
+ }
+
+ /* Wait for the intermediate process to exit and clean it up. */
+ while ((waitpid(middle_pid, &status, 0) < 0) && (errno == EINTR)) {
+ }
+ return child_pid;
}
+ /* Not creating a detached process. Use normal fork. */
+ return fork();
}
#endif
@@ -2563,7 +2568,8 @@ static void kwsysProcessKill(pid_t process_id)
/* Make sure the process started and provided a valid header. */
if (ps && fscanf(ps, "%*[^\n]\n") != EOF) {
/* Look for processes whose parent is the process being killed. */
- int pid, ppid;
+ int pid;
+ int ppid;
while (fscanf(ps, KWSYSPE_PS_FORMAT, &pid, &ppid) == 2) {
if (ppid == process_id) {
/* Recursively kill this child and its children. */
@@ -2725,8 +2731,8 @@ static int kwsysProcessesAdd(kwsysProcess* cp)
sigemptyset(&newSigAction.sa_mask);
while ((sigaction(SIGCHLD, &newSigAction,
&kwsysProcessesOldSigChldAction) < 0) &&
- (errno == EINTR))
- ;
+ (errno == EINTR)) {
+ }
/* Install our handler for SIGINT / SIGTERM. Repeat call until
it is not interrupted. */
@@ -2734,15 +2740,15 @@ static int kwsysProcessesAdd(kwsysProcess* cp)
sigaddset(&newSigAction.sa_mask, SIGTERM);
while ((sigaction(SIGINT, &newSigAction,
&kwsysProcessesOldSigIntAction) < 0) &&
- (errno == EINTR))
- ;
+ (errno == EINTR)) {
+ }
sigemptyset(&newSigAction.sa_mask);
sigaddset(&newSigAction.sa_mask, SIGINT);
while ((sigaction(SIGTERM, &newSigAction,
&kwsysProcessesOldSigIntAction) < 0) &&
- (errno == EINTR))
- ;
+ (errno == EINTR)) {
+ }
}
}
@@ -2773,14 +2779,14 @@ static void kwsysProcessesRemove(kwsysProcess* cp)
/* Restore the signal handlers. Repeat call until it is not
interrupted. */
while ((sigaction(SIGCHLD, &kwsysProcessesOldSigChldAction, 0) < 0) &&
- (errno == EINTR))
- ;
+ (errno == EINTR)) {
+ }
while ((sigaction(SIGINT, &kwsysProcessesOldSigIntAction, 0) < 0) &&
- (errno == EINTR))
- ;
+ (errno == EINTR)) {
+ }
while ((sigaction(SIGTERM, &kwsysProcessesOldSigTermAction, 0) < 0) &&
- (errno == EINTR))
- ;
+ (errno == EINTR)) {
+ }
/* Free the table of process pointers since it is now empty.
This is safe because the signal handler has been removed. */
@@ -2806,7 +2812,10 @@ static void kwsysProcessesSignalHandler(int signum
#endif
)
{
- int i, j, procStatus, old_errno = errno;
+ int i;
+ int j;
+ int procStatus;
+ int old_errno = errno;
#if KWSYSPE_USE_SIGINFO
(void)info;
(void)ucontext;
@@ -2863,8 +2872,8 @@ static void kwsysProcessesSignalHandler(int signum
memset(&defSigAction, 0, sizeof(defSigAction));
defSigAction.sa_handler = SIG_DFL;
sigemptyset(&defSigAction.sa_mask);
- while ((sigaction(signum, &defSigAction, 0) < 0) && (errno == EINTR))
- ;
+ while ((sigaction(signum, &defSigAction, 0) < 0) && (errno == EINTR)) {
+ }
/* Unmask the signal. */
sigemptyset(&unblockSet);
sigaddset(&unblockSet, signum);
diff --git a/Source/kwsys/ProcessWin32.c b/Source/kwsys/ProcessWin32.c
index 68c5218..56bbd20 100644
--- a/Source/kwsys/ProcessWin32.c
+++ b/Source/kwsys/ProcessWin32.c
@@ -761,7 +761,7 @@ void kwsysProcess_SetPipeShared(kwsysProcess* cp, int pipe, int shared)
}
}
-void kwsysProcess_SetPipeNative(kwsysProcess* cp, int pipe, HANDLE p[2])
+void kwsysProcess_SetPipeNative(kwsysProcess* cp, int pipe, const HANDLE p[2])
{
HANDLE* pPipeNative = 0;
diff --git a/Source/kwsys/RegularExpression.cxx b/Source/kwsys/RegularExpression.cxx
index 5e6f8da..4f74eba 100644
--- a/Source/kwsys/RegularExpression.cxx
+++ b/Source/kwsys/RegularExpression.cxx
@@ -28,8 +28,8 @@
# include "RegularExpression.hxx.in"
#endif
-#include <stdio.h>
-#include <string.h>
+#include <cstdio>
+#include <cstring>
namespace KWSYS_NAMESPACE {
@@ -367,8 +367,7 @@ bool RegularExpression::compile(const char* exp)
// Allocate space.
//#ifndef _WIN32
- if (this->program != nullptr)
- delete[] this->program;
+ delete[] this->program;
//#endif
this->program = new char[comp.regsize];
this->progsize = static_cast<int>(comp.regsize);
diff --git a/Source/kwsys/System.c b/Source/kwsys/System.c
index d43cc6f..dbfd2fd 100644
--- a/Source/kwsys/System.c
+++ b/Source/kwsys/System.c
@@ -22,7 +22,7 @@ typedef ptrdiff_t kwsysSystem_ptrdiff_t;
typedef int kwsysSystem_ptrdiff_t;
#endif
-static int kwsysSystem__AppendByte(char* local, char** begin, char** end,
+static int kwsysSystem__AppendByte(const char* local, char** begin, char** end,
int* size, char c)
{
/* Allocate space for the character. */
diff --git a/Source/kwsys/SystemInformation.cxx b/Source/kwsys/SystemInformation.cxx
index 6ec6e48..c565823 100644
--- a/Source/kwsys/SystemInformation.cxx
+++ b/Source/kwsys/SystemInformation.cxx
@@ -64,9 +64,9 @@ typedef int siginfo_t;
#else
# include <sys/types.h>
-# include <errno.h> // extern int errno;
+# include <cerrno> // extern int errno;
+# include <csignal>
# include <fcntl.h>
-# include <signal.h>
# include <sys/resource.h> // getrlimit
# include <sys/time.h>
# include <sys/utsname.h> // int uname(struct utsname *buf);
@@ -132,7 +132,7 @@ typedef int siginfo_t;
# endif
# endif
# if defined(KWSYS_CXX_HAS_RLIMIT64)
-typedef struct rlimit64 ResourceLimitType;
+using ResourceLimitType = struct rlimit64;
# define GetResourceLimit getrlimit64
# else
typedef struct rlimit ResourceLimitType;
@@ -163,11 +163,11 @@ typedef struct rlimit ResourceLimitType;
# undef KWSYS_SYSTEMINFORMATION_HAS_SYMBOL_LOOKUP
#endif
-#include <ctype.h> // int isdigit(int c);
+#include <cctype> // int isdigit(int c);
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
#include <memory.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
#if defined(KWSYS_USE_LONG_LONG)
# if defined(KWSYS_IOS_HAS_OSTREAM_LONG_LONG)
@@ -204,7 +204,8 @@ typedef struct rlimit ResourceLimitType;
# define USE_ASM_INSTRUCTIONS 0
#endif
-#if defined(_MSC_VER) && (_MSC_VER >= 1400) && !defined(__clang__)
+#if defined(_MSC_VER) && (_MSC_VER >= 1400) && !defined(__clang__) && \
+ !defined(_M_ARM64)
# include <intrin.h>
# define USE_CPUID_INTRINSICS 1
#else
@@ -303,34 +304,34 @@ T min(T a, T b)
}
extern "C" {
-typedef void (*SigAction)(int, siginfo_t*, void*);
+using SigAction = void (*)(int, siginfo_t*, void*);
}
// Define SystemInformationImplementation class
-typedef void (*DELAY_FUNC)(unsigned int uiMS);
+using DELAY_FUNC = void (*)(unsigned int);
class SystemInformationImplementation
{
public:
- typedef SystemInformation::LongLong LongLong;
+ using LongLong = SystemInformation::LongLong;
SystemInformationImplementation();
- ~SystemInformationImplementation();
+ ~SystemInformationImplementation() = default;
- const char* GetVendorString();
+ const char* GetVendorString() const;
const char* GetVendorID();
- std::string GetTypeID();
- std::string GetFamilyID();
- std::string GetModelID();
- std::string GetModelName();
- std::string GetSteppingCode();
- const char* GetExtendedProcessorName();
- const char* GetProcessorSerialNumber();
- int GetProcessorCacheSize();
- unsigned int GetLogicalProcessorsPerPhysical();
- float GetProcessorClockFrequency();
- int GetProcessorAPICID();
- int GetProcessorCacheXSize(long int);
- bool DoesCPUSupportFeature(long int);
+ std::string GetTypeID() const;
+ std::string GetFamilyID() const;
+ std::string GetModelID() const;
+ std::string GetModelName() const;
+ std::string GetSteppingCode() const;
+ const char* GetExtendedProcessorName() const;
+ const char* GetProcessorSerialNumber() const;
+ int GetProcessorCacheSize() const;
+ unsigned int GetLogicalProcessorsPerPhysical() const;
+ float GetProcessorClockFrequency() const;
+ int GetProcessorAPICID() const;
+ int GetProcessorCacheXSize(long int) const;
+ bool DoesCPUSupportFeature(long int) const;
const char* GetOSName();
const char* GetHostname();
@@ -339,24 +340,24 @@ public:
const char* GetOSVersion();
const char* GetOSPlatform();
- bool Is64Bits();
+ bool Is64Bits() const;
- unsigned int GetNumberOfLogicalCPU(); // per physical cpu
- unsigned int GetNumberOfPhysicalCPU();
+ unsigned int GetNumberOfLogicalCPU() const; // per physical cpu
+ unsigned int GetNumberOfPhysicalCPU() const;
bool DoesCPUSupportCPUID();
// Retrieve memory information in MiB.
- size_t GetTotalVirtualMemory();
- size_t GetAvailableVirtualMemory();
- size_t GetTotalPhysicalMemory();
- size_t GetAvailablePhysicalMemory();
+ size_t GetTotalVirtualMemory() const;
+ size_t GetAvailableVirtualMemory() const;
+ size_t GetTotalPhysicalMemory() const;
+ size_t GetAvailablePhysicalMemory() const;
LongLong GetProcessId();
// Retrieve memory information in KiB.
LongLong GetHostMemoryTotal();
- LongLong GetHostMemoryAvailable(const char* envVarName);
+ LongLong GetHostMemoryAvailable(const char* hostLimitEnvVarName);
LongLong GetHostMemoryUsed();
LongLong GetProcMemoryAvailable(const char* hostLimitEnvVarName,
@@ -377,60 +378,103 @@ public:
void RunMemoryCheck();
public:
- typedef struct tagID
+ using ID = struct tagID
+
{
+
int Type;
+
int Family;
+
int Model;
+
int Revision;
+
int ExtendedFamily;
+
int ExtendedModel;
+
std::string ProcessorName;
+
std::string Vendor;
+
std::string SerialNumber;
+
std::string ModelName;
- } ID;
+ };
+
+ using CPUPowerManagement = struct tagCPUPowerManagement
- typedef struct tagCPUPowerManagement
{
+
bool HasVoltageID;
+
bool HasFrequencyID;
+
bool HasTempSenseDiode;
- } CPUPowerManagement;
+ };
+
+ using CPUExtendedFeatures = struct tagCPUExtendedFeatures
- typedef struct tagCPUExtendedFeatures
{
+
bool Has3DNow;
+
bool Has3DNowPlus;
+
bool SupportsMP;
+
bool HasMMXPlus;
+
bool HasSSEMMX;
+
unsigned int LogicalProcessorsPerPhysical;
+
int APIC_ID;
+
CPUPowerManagement PowerManagement;
- } CPUExtendedFeatures;
+ };
+
+ using CPUFeatures = struct CPUtagFeatures
- typedef struct CPUtagFeatures
{
+
bool HasFPU;
+
bool HasTSC;
+
bool HasMMX;
+
bool HasSSE;
+
bool HasSSEFP;
+
bool HasSSE2;
+
bool HasIA64;
+
bool HasAPIC;
+
bool HasCMOV;
+
bool HasMTRR;
+
bool HasACPI;
+
bool HasSerial;
+
bool HasThermal;
+
int CPUSpeed;
+
int L1CacheSize;
+
int L2CacheSize;
+
int L3CacheSize;
+
CPUExtendedFeatures ExtendedFeatures;
- } CPUFeatures;
+ };
enum Manufacturer
{
@@ -476,7 +520,7 @@ protected:
void CPUCountWindows(); // For windows
unsigned char GetAPICId(); // For windows
- bool IsSMTSupported();
+ bool IsSMTSupported() const;
static LongLong GetCyclesDifference(DELAY_FUNC, unsigned int); // For windows
// For Linux and Cygwin, /proc/cpuinfo formats are slightly different
@@ -885,7 +929,7 @@ int LoadLines(FILE* file, std::vector<std::string>& lines)
*pBuf = '\0';
pBuf += 1;
}
- lines.push_back(buf);
+ lines.emplace_back(buf);
++nRead;
}
if (ferror(file)) {
@@ -899,7 +943,7 @@ int LoadLines(FILE* file, std::vector<std::string>& lines)
int LoadLines(const char* fileName, std::vector<std::string>& lines)
{
FILE* file = fopen(fileName, "r");
- if (file == 0) {
+ if (file == nullptr) {
return 0;
}
int nRead = LoadLines(file, lines);
@@ -1322,9 +1366,9 @@ std::string SymbolProperties::GetFileName(const std::string& path) const
{
std::string file(path);
if (!this->ReportPath) {
- size_t at = file.rfind("/");
+ size_t at = file.rfind('/');
if (at != std::string::npos) {
- file = file.substr(at + 1);
+ file.erase(0, at + 1);
}
}
return file;
@@ -1464,10 +1508,6 @@ SystemInformationImplementation::SystemInformationImplementation()
this->OSIs64Bit = (sizeof(void*) == 8);
}
-SystemInformationImplementation::~SystemInformationImplementation()
-{
-}
-
void SystemInformationImplementation::RunCPUCheck()
{
#ifdef _WIN32
@@ -1564,7 +1604,7 @@ void SystemInformationImplementation::RunMemoryCheck()
}
/** Get the vendor string */
-const char* SystemInformationImplementation::GetVendorString()
+const char* SystemInformationImplementation::GetVendorString() const
{
return this->ChipID.Vendor.c_str();
}
@@ -1760,7 +1800,7 @@ const char* SystemInformationImplementation::GetVendorID()
}
/** Return the type ID of the CPU */
-std::string SystemInformationImplementation::GetTypeID()
+std::string SystemInformationImplementation::GetTypeID() const
{
std::ostringstream str;
str << this->ChipID.Type;
@@ -1768,7 +1808,7 @@ std::string SystemInformationImplementation::GetTypeID()
}
/** Return the family of the CPU present */
-std::string SystemInformationImplementation::GetFamilyID()
+std::string SystemInformationImplementation::GetFamilyID() const
{
std::ostringstream str;
str << this->ChipID.Family;
@@ -1776,7 +1816,7 @@ std::string SystemInformationImplementation::GetFamilyID()
}
// Return the model of CPU present */
-std::string SystemInformationImplementation::GetModelID()
+std::string SystemInformationImplementation::GetModelID() const
{
std::ostringstream str;
str << this->ChipID.Model;
@@ -1784,13 +1824,13 @@ std::string SystemInformationImplementation::GetModelID()
}
// Return the model name of CPU present */
-std::string SystemInformationImplementation::GetModelName()
+std::string SystemInformationImplementation::GetModelName() const
{
return this->ChipID.ModelName;
}
/** Return the stepping code of the CPU present. */
-std::string SystemInformationImplementation::GetSteppingCode()
+std::string SystemInformationImplementation::GetSteppingCode() const
{
std::ostringstream str;
str << this->ChipID.Revision;
@@ -1798,44 +1838,46 @@ std::string SystemInformationImplementation::GetSteppingCode()
}
/** Return the stepping code of the CPU present. */
-const char* SystemInformationImplementation::GetExtendedProcessorName()
+const char* SystemInformationImplementation::GetExtendedProcessorName() const
{
return this->ChipID.ProcessorName.c_str();
}
/** Return the serial number of the processor
* in hexadecimal: xxxx-xxxx-xxxx-xxxx-xxxx-xxxx. */
-const char* SystemInformationImplementation::GetProcessorSerialNumber()
+const char* SystemInformationImplementation::GetProcessorSerialNumber() const
{
return this->ChipID.SerialNumber.c_str();
}
/** Return the logical processors per physical */
unsigned int SystemInformationImplementation::GetLogicalProcessorsPerPhysical()
+ const
{
return this->Features.ExtendedFeatures.LogicalProcessorsPerPhysical;
}
/** Return the processor clock frequency. */
-float SystemInformationImplementation::GetProcessorClockFrequency()
+float SystemInformationImplementation::GetProcessorClockFrequency() const
{
return this->CPUSpeedInMHz;
}
/** Return the APIC ID. */
-int SystemInformationImplementation::GetProcessorAPICID()
+int SystemInformationImplementation::GetProcessorAPICID() const
{
return this->Features.ExtendedFeatures.APIC_ID;
}
/** Return the L1 cache size. */
-int SystemInformationImplementation::GetProcessorCacheSize()
+int SystemInformationImplementation::GetProcessorCacheSize() const
{
return this->Features.L1CacheSize;
}
/** Return the chosen cache size. */
-int SystemInformationImplementation::GetProcessorCacheXSize(long int dwCacheID)
+int SystemInformationImplementation::GetProcessorCacheXSize(
+ long int dwCacheID) const
{
switch (dwCacheID) {
case SystemInformation::CPU_FEATURE_L1CACHE:
@@ -1848,7 +1890,8 @@ int SystemInformationImplementation::GetProcessorCacheXSize(long int dwCacheID)
return -1;
}
-bool SystemInformationImplementation::DoesCPUSupportFeature(long int dwFeature)
+bool SystemInformationImplementation::DoesCPUSupportFeature(
+ long int dwFeature) const
{
bool bHasFeature = false;
@@ -2128,7 +2171,7 @@ void SystemInformationImplementation::FindManufacturer(
this->ChipManufacturer = HP; // Hewlett-Packard
else if (this->ChipID.Vendor == "Motorola")
this->ChipManufacturer = Motorola; // Motorola Microelectronics
- else if (family.substr(0, 7) == "PA-RISC")
+ else if (family.compare(0, 7, "PA-RISC") == 0)
this->ChipManufacturer = HP; // Hewlett-Packard
else
this->ChipManufacturer = UnknownManufacturer; // Unknown manufacturer
@@ -2843,7 +2886,7 @@ static void SystemInformationStripLeadingSpace(std::string& str)
// post-process the name.
std::string::size_type pos = str.find_first_not_of(" ");
if (pos != std::string::npos) {
- str = str.substr(pos);
+ str.erase(0, pos);
}
}
#endif
@@ -3344,8 +3387,8 @@ std::string SystemInformationImplementation::ExtractValueFromCpuInfoFile(
size_t pos = buffer.find(word, init);
if (pos != std::string::npos) {
this->CurrentPositionInFile = pos;
- pos = buffer.find(":", pos);
- size_t pos2 = buffer.find("\n", pos);
+ pos = buffer.find(':', pos);
+ size_t pos2 = buffer.find('\n', pos);
if (pos != std::string::npos && pos2 != std::string::npos) {
// It may happen that the beginning matches, but this is still not the
// requested key.
@@ -3358,7 +3401,9 @@ std::string SystemInformationImplementation::ExtractValueFromCpuInfoFile(
return this->ExtractValueFromCpuInfoFile(buffer, word, pos2);
}
}
- return buffer.substr(pos + 2, pos2 - pos - 2);
+ buffer.erase(0, pos + 2);
+ buffer.resize(pos2 - pos - 2);
+ return buffer;
}
}
this->CurrentPositionInFile = std::string::npos;
@@ -3409,7 +3454,7 @@ bool SystemInformationImplementation::RetreiveInformationFromCpuInfoFile()
// We want to record the total number of cores in this->NumberOfPhysicalCPU
// (checking only the first proc)
std::string Cores = this->ExtractValueFromCpuInfoFile(buffer, "cpu cores");
- unsigned int NumberOfCoresPerSocket = (unsigned int)atoi(Cores.c_str());
+ auto NumberOfCoresPerSocket = (unsigned int)atoi(Cores.c_str());
NumberOfCoresPerSocket = std::max(NumberOfCoresPerSocket, 1u);
this->NumberOfPhysicalCPU =
NumberOfCoresPerSocket * (unsigned int)NumberOfSockets;
@@ -3441,7 +3486,7 @@ bool SystemInformationImplementation::RetreiveInformationFromCpuInfoFile()
// Linux Sparc: CPU speed is in Hz and encoded in hexadecimal
CPUSpeed = this->ExtractValueFromCpuInfoFile(buffer, "Cpu0ClkTck");
this->CPUSpeedInMHz =
- static_cast<float>(strtoull(CPUSpeed.c_str(), 0, 16)) / 1000000.0f;
+ static_cast<float>(strtoull(CPUSpeed.c_str(), nullptr, 16)) / 1000000.0f;
}
#endif
@@ -3502,13 +3547,12 @@ bool SystemInformationImplementation::RetreiveInformationFromCpuInfoFile()
cachename.push_back("D-cache"); // e.g. PA-RISC
this->Features.L1CacheSize = 0;
- for (size_t index = 0; index < cachename.size(); index++) {
- std::string cacheSize =
- this->ExtractValueFromCpuInfoFile(buffer, cachename[index]);
+ for (auto& index : cachename) {
+ std::string cacheSize = this->ExtractValueFromCpuInfoFile(buffer, index);
if (!cacheSize.empty()) {
pos = cacheSize.find(" KB");
if (pos != std::string::npos) {
- cacheSize = cacheSize.substr(0, pos);
+ cacheSize.resize(pos);
}
this->Features.L1CacheSize += atoi(cacheSize.c_str());
}
@@ -3893,7 +3937,7 @@ std::string SystemInformationImplementation::GetProgramStack(int firstFrame,
int wholePath)
{
std::ostringstream oss;
- std::string programStack = "";
+ std::string programStack;
#ifdef KWSYS_SYSTEMINFORMATION_HAS_DBGHELP
(void)wholePath;
@@ -4249,24 +4293,24 @@ bool SystemInformationImplementation::QueryMemory()
}
/** */
-size_t SystemInformationImplementation::GetTotalVirtualMemory()
+size_t SystemInformationImplementation::GetTotalVirtualMemory() const
{
return this->TotalVirtualMemory;
}
/** */
-size_t SystemInformationImplementation::GetAvailableVirtualMemory()
+size_t SystemInformationImplementation::GetAvailableVirtualMemory() const
{
return this->AvailableVirtualMemory;
}
-size_t SystemInformationImplementation::GetTotalPhysicalMemory()
+size_t SystemInformationImplementation::GetTotalPhysicalMemory() const
{
return this->TotalPhysicalMemory;
}
/** */
-size_t SystemInformationImplementation::GetAvailablePhysicalMemory()
+size_t SystemInformationImplementation::GetAvailablePhysicalMemory() const
{
return this->AvailablePhysicalMemory;
}
@@ -4279,9 +4323,15 @@ SystemInformationImplementation::GetCyclesDifference(DELAY_FUNC DelayFunction,
#if defined(_MSC_VER) && (_MSC_VER >= 1400)
unsigned __int64 stamp1, stamp2;
+# ifdef _M_ARM64
+ stamp1 = _ReadStatusReg(ARM64_PMCCNTR_EL0);
+ DelayFunction(uiParameter);
+ stamp2 = _ReadStatusReg(ARM64_PMCCNTR_EL0);
+# else
stamp1 = __rdtsc();
DelayFunction(uiParameter);
stamp2 = __rdtsc();
+# endif
return stamp2 - stamp1;
#elif USE_ASM_INSTRUCTIONS
@@ -4350,7 +4400,7 @@ void SystemInformationImplementation::DelayOverhead(unsigned int uiMS)
}
/** Works only for windows */
-bool SystemInformationImplementation::IsSMTSupported()
+bool SystemInformationImplementation::IsSMTSupported() const
{
return this->Features.ExtendedFeatures.LogicalProcessorsPerPhysical > 1;
}
@@ -4432,13 +4482,13 @@ void SystemInformationImplementation::CPUCountWindows()
}
/** Return the number of logical CPUs on the system */
-unsigned int SystemInformationImplementation::GetNumberOfLogicalCPU()
+unsigned int SystemInformationImplementation::GetNumberOfLogicalCPU() const
{
return this->NumberOfLogicalCPU;
}
/** Return the number of physical CPUs on the system */
-unsigned int SystemInformationImplementation::GetNumberOfPhysicalCPU()
+unsigned int SystemInformationImplementation::GetNumberOfPhysicalCPU() const
{
return this->NumberOfPhysicalCPU;
}
@@ -4638,7 +4688,7 @@ std::string SystemInformationImplementation::ExtractValueFromSysCtl(
size_t pos = this->SysCtlBuffer.find(word);
if (pos != std::string::npos) {
pos = this->SysCtlBuffer.find(": ", pos);
- size_t pos2 = this->SysCtlBuffer.find("\n", pos);
+ size_t pos2 = this->SysCtlBuffer.find('\n', pos);
if (pos != std::string::npos && pos2 != std::string::npos) {
return this->SysCtlBuffer.substr(pos + 2, pos2 - pos - 2);
}
@@ -4733,14 +4783,15 @@ std::string SystemInformationImplementation::ParseValueFromKStat(
}
pos = command.find(' ', pos + 1);
}
- args_string.push_back(command.substr(start + 1, command.size() - start - 1));
+ command.erase(0, start + 1);
+ args_string.push_back(command);
std::vector<const char*> args;
args.reserve(3 + args_string.size());
args.push_back("kstat");
args.push_back("-p");
- for (size_t i = 0; i < args_string.size(); ++i) {
- args.push_back(args_string[i].c_str());
+ for (auto& i : args_string) {
+ args.push_back(i.c_str());
}
args.push_back(nullptr);
@@ -4922,7 +4973,9 @@ bool SystemInformationImplementation::QueryQNXMemory()
while (buffer[pos] == ' ')
pos++;
- this->TotalPhysicalMemory = atoi(buffer.substr(pos, pos2 - pos).c_str());
+ buffer.erase(0, pos);
+ buffer.resize(pos2);
+ this->TotalPhysicalMemory = atoi(buffer.c_str());
return true;
#endif
return false;
@@ -5447,19 +5500,19 @@ void SystemInformationImplementation::TrimNewline(std::string& output)
{
// remove \r
std::string::size_type pos = 0;
- while ((pos = output.find("\r", pos)) != std::string::npos) {
+ while ((pos = output.find('\r', pos)) != std::string::npos) {
output.erase(pos);
}
// remove \n
pos = 0;
- while ((pos = output.find("\n", pos)) != std::string::npos) {
+ while ((pos = output.find('\n', pos)) != std::string::npos) {
output.erase(pos);
}
}
/** Return true if the machine is 64 bits */
-bool SystemInformationImplementation::Is64Bits()
+bool SystemInformationImplementation::Is64Bits() const
{
return this->OSIs64Bit;
}
diff --git a/Source/kwsys/SystemTools.cxx b/Source/kwsys/SystemTools.cxx
index d27081b..a6d210f 100644
--- a/Source/kwsys/SystemTools.cxx
+++ b/Source/kwsys/SystemTools.cxx
@@ -24,6 +24,7 @@
#include KWSYS_HEADER(Encoding.h)
#include KWSYS_HEADER(Encoding.hxx)
+#include <algorithm>
#include <fstream>
#include <iostream>
#include <set>
@@ -49,15 +50,15 @@
# pragma set woff 1375 /* base class destructor not virtual */
#endif
-#include <ctype.h>
-#include <errno.h>
+#include <cctype>
+#include <cerrno>
#ifdef __QNX__
# include <malloc.h> /* for malloc/free on QNX */
#endif
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
+#include <ctime>
#if defined(_WIN32) && !defined(_MSC_VER) && defined(__GNUC__)
# include <strings.h> /* for strcasecmp */
@@ -69,7 +70,7 @@
// support for realpath call
#ifndef _WIN32
-# include <limits.h>
+# include <climits>
# include <pwd.h>
# include <sys/ioctl.h>
# include <sys/time.h>
@@ -80,7 +81,7 @@
# include <sys/param.h>
# include <termios.h>
# endif
-# include <signal.h> /* sigprocmask */
+# include <csignal> /* sigprocmask */
#endif
#ifdef __linux
@@ -123,9 +124,9 @@ extern char** environ;
#define VTK_URL_PROTOCOL_REGEX "([a-zA-Z0-9]*)://(.*)"
#define VTK_URL_REGEX \
- "([a-zA-Z0-9]*)://(([A-Za-z0-9]+)(:([^:@]+))?@)?([^:@/]+)(:([0-9]+))?/" \
+ "([a-zA-Z0-9]*)://(([A-Za-z0-9]+)(:([^:@]+))?@)?([^:@/]*)(:([0-9]+))?/" \
"(.+)?"
-
+#define VTK_URL_BYTE_REGEX "%[0-9a-fA-F][0-9a-fA-F]"
#ifdef _MSC_VER
# include <sys/utime.h>
#else
@@ -221,11 +222,17 @@ static time_t windows_filetime_to_posix_time(const FILETIME& ft)
#ifdef KWSYS_WINDOWS_DIRS
# include <wctype.h>
+# ifdef _MSC_VER
+typedef KWSYS_NAMESPACE::SystemTools::mode_t mode_t;
+# endif
-inline int Mkdir(const std::string& dir)
+inline int Mkdir(const std::string& dir, const mode_t* mode)
{
- return _wmkdir(
- KWSYS_NAMESPACE::Encoding::ToWindowsExtendedPath(dir).c_str());
+ int ret =
+ _wmkdir(KWSYS_NAMESPACE::Encoding::ToWindowsExtendedPath(dir).c_str());
+ if (ret == 0 && mode)
+ KWSYS_NAMESPACE::SystemTools::SetPermissions(dir, *mode);
+ return ret;
}
inline int Rmdir(const std::string& dir)
{
@@ -295,9 +302,9 @@ inline void Realpath(const std::string& path, std::string& resolved_path,
# include <fcntl.h>
# include <unistd.h>
-inline int Mkdir(const std::string& dir)
+inline int Mkdir(const std::string& dir, const mode_t* mode)
{
- return mkdir(dir.c_str(), 00777);
+ return mkdir(dir.c_str(), mode ? *mode : 00777);
}
inline int Rmdir(const std::string& dir)
{
@@ -350,7 +357,7 @@ extern int putenv(char* __string) __THROW;
namespace KWSYS_NAMESPACE {
-double SystemTools::GetTime(void)
+double SystemTools::GetTime()
{
#if defined(_WIN32) && !defined(__CYGWIN__)
FILETIME ft;
@@ -368,7 +375,7 @@ double SystemTools::GetTime(void)
#if defined(_WIN32)
typedef wchar_t envchar;
#else
-typedef char envchar;
+using envchar = char;
#endif
/* Order by environment key only (VAR from VAR=VALUE). */
@@ -421,7 +428,7 @@ public:
const envchar* Release(const envchar* env)
{
const envchar* old = nullptr;
- iterator i = this->find(env);
+ auto i = this->find(env);
if (i != this->end()) {
old = *i;
this->erase(i);
@@ -452,7 +459,7 @@ struct SystemToolsPathCaseCmp
class SystemToolsStatic
{
public:
- typedef std::map<std::string, std::string> StringMap;
+ using StringMap = std::map<std::string, std::string>;
#if KWSYS_SYSTEMTOOLS_USE_TRANSLATION_MAP
/**
* Path translation table from dir to refdir
@@ -488,10 +495,13 @@ public:
*/
static std::string FindName(
const std::string& name,
- const std::vector<std::string>& path = std::vector<std::string>(),
+ const std::vector<std::string>& userPaths = std::vector<std::string>(),
bool no_system_path = false);
};
+// Do NOT initialize. Default initialization to zero is necessary.
+static SystemToolsStatic* SystemToolsStatics;
+
#ifdef _WIN32
std::string SystemToolsStatic::GetCasePathName(std::string const& pathIn)
{
@@ -566,7 +576,7 @@ std::string SystemToolsStatic::GetActualCaseForPathCached(std::string const& p)
{
// Check to see if actual case has already been called
// for this path, and the result is stored in the PathCaseMap
- auto& pcm = SystemTools::Statics->PathCaseMap;
+ auto& pcm = SystemToolsStatics->PathCaseMap;
{
auto itr = pcm.find(p);
if (itr != pcm.end()) {
@@ -613,8 +623,7 @@ void SystemTools::GetPath(std::vector<std::string>& path, const char* env)
done = true;
}
}
- for (std::vector<std::string>::iterator i = path.begin() + old_size;
- i != path.end(); ++i) {
+ for (auto i = path.begin() + old_size; i != path.end(); ++i) {
SystemTools::ConvertToUnixSlashes(*i);
}
}
@@ -624,7 +633,7 @@ const char* SystemToolsStatic::GetEnvBuffered(const char* key)
{
std::string env;
if (SystemTools::GetEnv(key, env)) {
- std::string& menv = SystemTools::Statics->EnvMap[key];
+ std::string& menv = SystemToolsStatics->EnvMap[key];
if (menv != env) {
menv = std::move(env);
}
@@ -884,8 +893,12 @@ const char* SystemTools::GetExecutableExtension()
FILE* SystemTools::Fopen(const std::string& file, const char* mode)
{
#ifdef _WIN32
+ // Remove any 'e', which is supported on UNIX, but not Windows.
+ std::wstring trimmedMode = Encoding::ToWide(mode);
+ trimmedMode.erase(std::remove(trimmedMode.begin(), trimmedMode.end(), L'e'),
+ trimmedMode.end());
return _wfopen(Encoding::ToWindowsExtendedPath(file).c_str(),
- Encoding::ToWide(mode).c_str());
+ trimmedMode.c_str());
#else
return fopen(file.c_str(), mode);
#endif
@@ -913,16 +926,17 @@ bool SystemTools::MakeDirectory(const std::string& path, const mode_t* mode)
std::string::size_type pos = 0;
std::string topdir;
while ((pos = dir.find('/', pos)) != std::string::npos) {
- topdir = dir.substr(0, pos);
+ // all underlying functions use C strings, so temporarily
+ // end the string here
+ dir[pos] = '\0';
- if (Mkdir(topdir) == 0 && mode != nullptr) {
- SystemTools::SetPermissions(topdir, *mode);
- }
+ Mkdir(dir, mode);
+ dir[pos] = '/';
++pos;
}
topdir = dir;
- if (Mkdir(topdir) != 0) {
+ if (Mkdir(topdir, mode) != 0) {
// There is a bug in the Borland Run time library which makes MKDIR
// return EACCES when it should return EEXISTS
// if it is some other error besides directory exists
@@ -934,8 +948,6 @@ bool SystemTools::MakeDirectory(const std::string& path, const mode_t* mode)
) {
return false;
}
- } else if (mode != nullptr) {
- SystemTools::SetPermissions(topdir, *mode);
}
return true;
@@ -1011,38 +1023,40 @@ void SystemToolsStatic::ReplaceString(std::string& source, const char* replace,
# define KWSYS_ST_KEY_WOW64_64KEY 0x0100
# endif
-static bool SystemToolsParseRegistryKey(const std::string& key,
- HKEY& primaryKey, std::string& second,
- std::string& valuename)
+static bool hasPrefix(const std::string& s, const char* pattern,
+ std::string::size_type spos)
{
- std::string primary = key;
+ size_t plen = strlen(pattern);
+ if (spos != plen)
+ return false;
+ return s.compare(0, plen, pattern) == 0;
+}
- size_t start = primary.find('\\');
+static bool SystemToolsParseRegistryKey(const std::string& key,
+ HKEY& primaryKey, std::wstring& second,
+ std::string* valuename)
+{
+ size_t start = key.find('\\');
if (start == std::string::npos) {
return false;
}
- size_t valuenamepos = primary.find(';');
- if (valuenamepos != std::string::npos) {
- valuename = primary.substr(valuenamepos + 1);
+ size_t valuenamepos = key.find(';');
+ if (valuenamepos != std::string::npos && valuename) {
+ *valuename = key.substr(valuenamepos + 1);
}
- second = primary.substr(start + 1, valuenamepos - start - 1);
- primary = primary.substr(0, start);
+ second = Encoding::ToWide(key.substr(start + 1, valuenamepos - start - 1));
- if (primary == "HKEY_CURRENT_USER") {
+ if (hasPrefix(key, "HKEY_CURRENT_USER", start)) {
primaryKey = HKEY_CURRENT_USER;
- }
- if (primary == "HKEY_CURRENT_CONFIG") {
+ } else if (hasPrefix(key, "HKEY_CURRENT_CONFIG", start)) {
primaryKey = HKEY_CURRENT_CONFIG;
- }
- if (primary == "HKEY_CLASSES_ROOT") {
+ } else if (hasPrefix(key, "HKEY_CLASSES_ROOT", start)) {
primaryKey = HKEY_CLASSES_ROOT;
- }
- if (primary == "HKEY_LOCAL_MACHINE") {
+ } else if (hasPrefix(key, "HKEY_LOCAL_MACHINE", start)) {
primaryKey = HKEY_LOCAL_MACHINE;
- }
- if (primary == "HKEY_USERS") {
+ } else if (hasPrefix(key, "HKEY_USERS", start)) {
primaryKey = HKEY_USERS;
}
@@ -1074,14 +1088,13 @@ bool SystemTools::GetRegistrySubKeys(const std::string& key,
KeyWOW64 view)
{
HKEY primaryKey = HKEY_CURRENT_USER;
- std::string second;
- std::string valuename;
- if (!SystemToolsParseRegistryKey(key, primaryKey, second, valuename)) {
+ std::wstring second;
+ if (!SystemToolsParseRegistryKey(key, primaryKey, second, nullptr)) {
return false;
}
HKEY hKey;
- if (RegOpenKeyExW(primaryKey, Encoding::ToWide(second).c_str(), 0,
+ if (RegOpenKeyExW(primaryKey, second.c_str(), 0,
SystemToolsMakeRegistryMode(KEY_READ, view),
&hKey) != ERROR_SUCCESS) {
return false;
@@ -1121,14 +1134,14 @@ bool SystemTools::ReadRegistryValue(const std::string& key, std::string& value,
{
bool valueset = false;
HKEY primaryKey = HKEY_CURRENT_USER;
- std::string second;
+ std::wstring second;
std::string valuename;
- if (!SystemToolsParseRegistryKey(key, primaryKey, second, valuename)) {
+ if (!SystemToolsParseRegistryKey(key, primaryKey, second, &valuename)) {
return false;
}
HKEY hKey;
- if (RegOpenKeyExW(primaryKey, Encoding::ToWide(second).c_str(), 0,
+ if (RegOpenKeyExW(primaryKey, second.c_str(), 0,
SystemToolsMakeRegistryMode(KEY_READ, view),
&hKey) != ERROR_SUCCESS) {
return false;
@@ -1175,16 +1188,16 @@ bool SystemTools::WriteRegistryValue(const std::string& key,
const std::string& value, KeyWOW64 view)
{
HKEY primaryKey = HKEY_CURRENT_USER;
- std::string second;
+ std::wstring second;
std::string valuename;
- if (!SystemToolsParseRegistryKey(key, primaryKey, second, valuename)) {
+ if (!SystemToolsParseRegistryKey(key, primaryKey, second, &valuename)) {
return false;
}
HKEY hKey;
DWORD dwDummy;
wchar_t lpClass[] = L"";
- if (RegCreateKeyExW(primaryKey, Encoding::ToWide(second).c_str(), 0, lpClass,
+ if (RegCreateKeyExW(primaryKey, second.c_str(), 0, lpClass,
REG_OPTION_NON_VOLATILE,
SystemToolsMakeRegistryMode(KEY_WRITE, view), nullptr,
&hKey, &dwDummy) != ERROR_SUCCESS) {
@@ -1219,14 +1232,14 @@ bool SystemTools::WriteRegistryValue(const std::string&, const std::string&,
bool SystemTools::DeleteRegistryValue(const std::string& key, KeyWOW64 view)
{
HKEY primaryKey = HKEY_CURRENT_USER;
- std::string second;
+ std::wstring second;
std::string valuename;
- if (!SystemToolsParseRegistryKey(key, primaryKey, second, valuename)) {
+ if (!SystemToolsParseRegistryKey(key, primaryKey, second, &valuename)) {
return false;
}
HKEY hKey;
- if (RegOpenKeyExW(primaryKey, Encoding::ToWide(second).c_str(), 0,
+ if (RegOpenKeyExW(primaryKey, second.c_str(), 0,
SystemToolsMakeRegistryMode(KEY_WRITE, view),
&hKey) != ERROR_SUCCESS) {
return false;
@@ -1448,15 +1461,15 @@ int SystemTools::Stat(const std::string& path, SystemTools::Stat_t* buf)
#ifdef __CYGWIN__
bool SystemTools::PathCygwinToWin32(const char* path, char* win32_path)
{
- auto itr = SystemTools::Statics->Cyg2Win32Map.find(path);
- if (itr != SystemTools::Statics->Cyg2Win32Map.end()) {
+ auto itr = SystemToolsStatics->Cyg2Win32Map.find(path);
+ if (itr != SystemToolsStatics->Cyg2Win32Map.end()) {
strncpy(win32_path, itr->second.c_str(), MAX_PATH);
} else {
if (cygwin_conv_path(CCP_POSIX_TO_WIN_A, path, win32_path, MAX_PATH) !=
0) {
win32_path[0] = 0;
}
- SystemTools::Statics->Cyg2Win32Map.insert(
+ SystemToolsStatics->Cyg2Win32Map.insert(
SystemToolsStatic::StringMap::value_type(path, win32_path));
}
return win32_path[0] != 0;
@@ -1858,7 +1871,7 @@ char* SystemTools::DuplicateString(const char* str)
// Return a cropped string
std::string SystemTools::CropString(const std::string& s, size_t max_len)
{
- if (!s.size() || max_len == 0 || max_len >= s.size()) {
+ if (s.empty() || max_len == 0 || max_len >= s.size()) {
return s;
}
@@ -1867,7 +1880,7 @@ std::string SystemTools::CropString(const std::string& s, size_t max_len)
size_t middle = max_len / 2;
- n += s.substr(0, middle);
+ n.assign(s, 0, middle);
n += s.substr(s.size() - (max_len - middle));
if (max_len > 2) {
@@ -1893,10 +1906,10 @@ std::vector<std::string> SystemTools::SplitString(const std::string& p,
}
if (isPath && path[0] == '/') {
path.erase(path.begin());
- paths.push_back("/");
+ paths.emplace_back("/");
}
std::string::size_type pos1 = 0;
- std::string::size_type pos2 = path.find(sep, pos1 + 1);
+ std::string::size_type pos2 = path.find(sep, pos1);
while (pos2 != std::string::npos) {
paths.push_back(path.substr(pos1, pos2 - pos1));
pos1 = pos2 + 1;
@@ -2065,8 +2078,10 @@ void SystemTools::ConvertToUnixSlashes(std::string& path)
#ifdef HAVE_GETPWNAM
else if (pathCString[0] == '~') {
std::string::size_type idx = path.find_first_of("/\0");
- std::string user = path.substr(1, idx - 1);
- passwd* pw = getpwnam(user.c_str());
+ char oldch = path[idx];
+ path[idx] = '\0';
+ passwd* pw = getpwnam(path.c_str() + 1);
+ path[idx] = oldch;
if (pw) {
path.replace(0, idx, pw->pw_dir);
}
@@ -2103,7 +2118,7 @@ std::string SystemTools::ConvertToUnixOutputPath(const std::string& path)
ret.erase(pos, 1);
}
// escape spaces and () in the path
- if (ret.find_first_of(" ") != std::string::npos) {
+ if (ret.find_first_of(' ') != std::string::npos) {
std::string result;
char lastch = 1;
for (const char* ch = ret.c_str(); *ch != '\0'; ++ch) {
@@ -2501,8 +2516,8 @@ bool SystemTools::CopyADirectory(const std::string& source,
return false;
}
for (fileNum = 0; fileNum < dir.GetNumberOfFiles(); ++fileNum) {
- if (strcmp(dir.GetFile(static_cast<unsigned long>(fileNum)), ".") &&
- strcmp(dir.GetFile(static_cast<unsigned long>(fileNum)), "..")) {
+ if (strcmp(dir.GetFile(static_cast<unsigned long>(fileNum)), ".") != 0 &&
+ strcmp(dir.GetFile(static_cast<unsigned long>(fileNum)), "..") != 0) {
std::string fullPath = source;
fullPath += "/";
fullPath += dir.GetFile(static_cast<unsigned long>(fileNum));
@@ -2664,8 +2679,8 @@ bool SystemTools::RemoveADirectory(const std::string& source)
dir.Load(source);
size_t fileNum;
for (fileNum = 0; fileNum < dir.GetNumberOfFiles(); ++fileNum) {
- if (strcmp(dir.GetFile(static_cast<unsigned long>(fileNum)), ".") &&
- strcmp(dir.GetFile(static_cast<unsigned long>(fileNum)), "..")) {
+ if (strcmp(dir.GetFile(static_cast<unsigned long>(fileNum)), ".") != 0 &&
+ strcmp(dir.GetFile(static_cast<unsigned long>(fileNum)), "..") != 0) {
std::string fullPath = source;
fullPath += "/";
fullPath += dir.GetFile(static_cast<unsigned long>(fileNum));
@@ -2797,7 +2812,7 @@ std::string SystemTools::FindProgram(const std::string& name,
for (std::string const& ext : extensions) {
tryPath = name;
tryPath += ext;
- if (SystemTools::FileExists(tryPath, true)) {
+ if (SystemTools::FileIsExecutable(tryPath)) {
return SystemTools::CollapseFullPath(tryPath);
}
}
@@ -2805,7 +2820,7 @@ std::string SystemTools::FindProgram(const std::string& name,
#endif
// now try just the name
- if (SystemTools::FileExists(name, true)) {
+ if (SystemTools::FileIsExecutable(name)) {
return SystemTools::CollapseFullPath(name);
}
// now construct the path
@@ -2835,7 +2850,7 @@ std::string SystemTools::FindProgram(const std::string& name,
tryPath = p;
tryPath += name;
tryPath += ext;
- if (SystemTools::FileExists(tryPath, true)) {
+ if (SystemTools::FileIsExecutable(tryPath)) {
return SystemTools::CollapseFullPath(tryPath);
}
}
@@ -2843,7 +2858,7 @@ std::string SystemTools::FindProgram(const std::string& name,
// now try it without them
tryPath = p;
tryPath += name;
- if (SystemTools::FileExists(tryPath, true)) {
+ if (SystemTools::FileIsExecutable(tryPath)) {
return SystemTools::CollapseFullPath(tryPath);
}
}
@@ -2998,6 +3013,15 @@ bool SystemTools::FileIsDirectory(const std::string& inName)
}
}
+bool SystemTools::FileIsExecutable(const std::string& name)
+{
+#if defined(_WIN32)
+ return SystemTools::FileExists(name, true);
+#else
+ return !FileIsDirectory(name) && TestFileAccess(name, TEST_FILE_EXECUTE);
+#endif
+}
+
bool SystemTools::FileIsSymlink(const std::string& name)
{
#if defined(_WIN32)
@@ -3107,16 +3131,14 @@ int SystemTools::ChangeDirectory(const std::string& dir)
return Chdir(dir);
}
-std::string SystemTools::GetCurrentWorkingDirectory(bool collapse)
+std::string SystemTools::GetCurrentWorkingDirectory()
{
char buf[2048];
const char* cwd = Getcwd(buf, 2048);
std::string path;
if (cwd) {
path = cwd;
- }
- if (collapse) {
- return SystemTools::CollapseFullPath(path);
+ SystemTools::ConvertToUnixSlashes(path);
}
return path;
}
@@ -3132,17 +3154,17 @@ bool SystemTools::SplitProgramPath(const std::string& in_name,
std::string& dir, std::string& file, bool)
{
dir = in_name;
- file = "";
+ file.clear();
SystemTools::ConvertToUnixSlashes(dir);
if (!SystemTools::FileIsDirectory(dir)) {
- std::string::size_type slashPos = dir.rfind("/");
+ std::string::size_type slashPos = dir.rfind('/');
if (slashPos != std::string::npos) {
file = dir.substr(slashPos + 1);
- dir = dir.substr(0, slashPos);
+ dir.resize(slashPos);
} else {
file = dir;
- dir = "";
+ dir.clear();
}
}
if (!(dir.empty()) && !SystemTools::FileIsDirectory(dir)) {
@@ -3164,7 +3186,7 @@ bool SystemTools::FindProgramPath(const char* argv0, std::string& pathOut,
failures.push_back(self);
SystemTools::ConvertToUnixSlashes(self);
self = SystemTools::FindProgram(self);
- if (!SystemTools::FileExists(self)) {
+ if (!SystemTools::FileIsExecutable(self)) {
if (buildDir) {
std::string intdir = ".";
#ifdef CMAKE_INTDIR
@@ -3179,14 +3201,14 @@ bool SystemTools::FindProgramPath(const char* argv0, std::string& pathOut,
}
}
if (installPrefix) {
- if (!SystemTools::FileExists(self)) {
+ if (!SystemTools::FileIsExecutable(self)) {
failures.push_back(self);
self = installPrefix;
self += "/bin/";
self += exeName;
}
}
- if (!SystemTools::FileExists(self)) {
+ if (!SystemTools::FileIsExecutable(self)) {
failures.push_back(self);
std::ostringstream msg;
msg << "Can not find the command line program ";
@@ -3208,11 +3230,6 @@ bool SystemTools::FindProgramPath(const char* argv0, std::string& pathOut,
return true;
}
-std::string SystemTools::CollapseFullPath(const std::string& in_relative)
-{
- return SystemTools::CollapseFullPath(in_relative, nullptr);
-}
-
#if KWSYS_SYSTEMTOOLS_USE_TRANSLATION_MAP
void SystemTools::AddTranslationPath(const std::string& a,
const std::string& b)
@@ -3237,7 +3254,7 @@ void SystemTools::AddTranslationPath(const std::string& a,
path_b += '/';
}
if (!(path_a == path_b)) {
- SystemTools::Statics->TranslationMap.insert(
+ SystemToolsStatics->TranslationMap.insert(
SystemToolsStatic::StringMap::value_type(std::move(path_a),
std::move(path_b)));
}
@@ -3267,9 +3284,9 @@ void SystemTools::CheckTranslationPath(std::string& path)
// In case a file was specified we still have to go through this:
// Now convert any path found in the table back to the one desired:
- for (auto const& pair : SystemTools::Statics->TranslationMap) {
+ for (auto const& pair : SystemToolsStatics->TranslationMap) {
// We need to check of the path is a substring of the other path
- if (path.find(pair.first) == 0) {
+ if (path.compare(0, pair.first.size(), pair.first) == 0) {
path = path.replace(0, pair.first.size(), pair.second);
}
}
@@ -3302,25 +3319,10 @@ static void SystemToolsAppendComponents(
}
}
-std::string SystemTools::CollapseFullPath(const std::string& in_path,
- const char* in_base)
-{
- // Use the current working directory as a base path.
- char buf[2048];
- const char* res_in_base = in_base;
- if (!res_in_base) {
- if (const char* cwd = Getcwd(buf, 2048)) {
- res_in_base = cwd;
- } else {
- res_in_base = "";
- }
- }
-
- return SystemTools::CollapseFullPath(in_path, std::string(res_in_base));
-}
+namespace {
-std::string SystemTools::CollapseFullPath(const std::string& in_path,
- const std::string& in_base)
+std::string CollapseFullPathImpl(std::string const& in_path,
+ std::string const* in_base)
{
// Collect the output path components.
std::vector<std::string> out_components;
@@ -3333,8 +3335,15 @@ std::string SystemTools::CollapseFullPath(const std::string& in_path,
// If the input path is relative, start with a base path.
if (path_components[0].empty()) {
std::vector<std::string> base_components;
- // Use the given base path.
- SystemTools::SplitPath(in_base, base_components);
+
+ if (in_base) {
+ // Use the given base path.
+ SystemTools::SplitPath(*in_base, base_components);
+ } else {
+ // Use the current working directory as a base path.
+ std::string cwd = SystemTools::GetCurrentWorkingDirectory();
+ SystemTools::SplitPath(cwd, base_components);
+ }
// Append base path components to the output path.
out_components.push_back(base_components[0]);
@@ -3367,12 +3376,34 @@ std::string SystemTools::CollapseFullPath(const std::string& in_path,
SystemTools::CheckTranslationPath(newPath);
#endif
#ifdef _WIN32
- newPath = SystemTools::Statics->GetActualCaseForPathCached(newPath);
+ newPath = SystemToolsStatics->GetActualCaseForPathCached(newPath);
SystemTools::ConvertToUnixSlashes(newPath);
#endif
// Return the reconstructed path.
return newPath;
}
+}
+
+std::string SystemTools::CollapseFullPath(std::string const& in_path)
+{
+ return CollapseFullPathImpl(in_path, nullptr);
+}
+
+std::string SystemTools::CollapseFullPath(std::string const& in_path,
+ const char* in_base)
+{
+ if (!in_base) {
+ return CollapseFullPathImpl(in_path, nullptr);
+ }
+ std::string tmp_base = in_base;
+ return CollapseFullPathImpl(in_path, &tmp_base);
+}
+
+std::string SystemTools::CollapseFullPath(std::string const& in_path,
+ std::string const& in_base)
+{
+ return CollapseFullPathImpl(in_path, &in_base);
+}
// compute the relative path from here to there
std::string SystemTools::RelativePath(const std::string& local,
@@ -3541,7 +3572,7 @@ void SystemTools::SplitPath(const std::string& p,
// Expand home directory references if requested.
if (expand_home_dir && !root.empty() && root[0] == '~') {
std::string homedir;
- root = root.substr(0, root.size() - 1);
+ root.resize(root.size() - 1);
if (root.size() == 1) {
#if defined(_WIN32) && !defined(__CYGWIN__)
if (!SystemTools::GetEnv("USERPROFILE", homedir))
@@ -3571,14 +3602,14 @@ void SystemTools::SplitPath(const std::string& p,
for (; *last; ++last) {
if (*last == '/' || *last == '\\') {
// End of a component. Save it.
- components.push_back(std::string(first, last));
+ components.emplace_back(first, last);
first = last + 1;
}
}
// Save the last component unless there were no components.
if (last != c) {
- components.push_back(std::string(first, last));
+ components.emplace_back(first, last);
}
}
@@ -3594,7 +3625,7 @@ std::string SystemTools::JoinPath(
// Construct result in a single string.
std::string result;
size_t len = 0;
- for (std::vector<std::string>::const_iterator i = first; i != last; ++i) {
+ for (auto i = first; i != last; ++i) {
len += 1 + i->size();
}
result.reserve(len);
@@ -3685,19 +3716,20 @@ std::string SystemTools::GetFilenamePath(const std::string& filename)
std::string fn = filename;
SystemTools::ConvertToUnixSlashes(fn);
- std::string::size_type slash_pos = fn.rfind("/");
- if (slash_pos != std::string::npos) {
- std::string ret = fn.substr(0, slash_pos);
- if (ret.size() == 2 && ret[1] == ':') {
- return ret + '/';
- }
- if (ret.empty()) {
- return "/";
- }
- return ret;
- } else {
+ std::string::size_type slash_pos = fn.rfind('/');
+ if (slash_pos == 0) {
+ return "/";
+ }
+ if (slash_pos == 2 && fn[1] == ':') {
+ // keep the / after a drive letter
+ fn.resize(3);
+ return fn;
+ }
+ if (slash_pos == std::string::npos) {
return "";
}
+ fn.resize(slash_pos);
+ return fn;
}
/**
@@ -3727,7 +3759,8 @@ std::string SystemTools::GetFilenameExtension(const std::string& filename)
std::string name = SystemTools::GetFilenameName(filename);
std::string::size_type dot_pos = name.find('.');
if (dot_pos != std::string::npos) {
- return name.substr(dot_pos);
+ name.erase(0, dot_pos);
+ return name;
} else {
return "";
}
@@ -3742,7 +3775,8 @@ std::string SystemTools::GetFilenameLastExtension(const std::string& filename)
std::string name = SystemTools::GetFilenameName(filename);
std::string::size_type dot_pos = name.rfind('.');
if (dot_pos != std::string::npos) {
- return name.substr(dot_pos);
+ name.erase(0, dot_pos);
+ return name;
} else {
return "";
}
@@ -3758,10 +3792,9 @@ std::string SystemTools::GetFilenameWithoutExtension(
std::string name = SystemTools::GetFilenameName(filename);
std::string::size_type dot_pos = name.find('.');
if (dot_pos != std::string::npos) {
- return name.substr(0, dot_pos);
- } else {
- return name;
+ name.resize(dot_pos);
}
+ return name;
}
/**
@@ -3775,10 +3808,9 @@ std::string SystemTools::GetFilenameWithoutLastExtension(
std::string name = SystemTools::GetFilenameName(filename);
std::string::size_type dot_pos = name.rfind('.');
if (dot_pos != std::string::npos) {
- return name.substr(0, dot_pos);
- } else {
- return name;
+ name.resize(dot_pos);
}
+ return name;
}
bool SystemTools::FileHasSignature(const char* filename, const char* signature,
@@ -3828,7 +3860,7 @@ SystemTools::FileTypeEnum SystemTools::DetectFileType(const char* filename,
// Allocate buffer and read bytes
- unsigned char* buffer = new unsigned char[length];
+ auto* buffer = new unsigned char[length];
size_t read_length = fread(buffer, 1, length, fp);
fclose(fp);
if (read_length == 0) {
@@ -4000,7 +4032,8 @@ bool SystemTools::GetShortPath(const std::string& path, std::string& shortPath)
// if the path passed in has quotes around it, first remove the quotes
if (!path.empty() && path[0] == '"' && path.back() == '"') {
- tempPath = path.substr(1, path.length() - 2);
+ tempPath.resize(path.length() - 1);
+ tempPath.erase(0, 1);
}
std::wstring wtempPath = Encoding::ToWide(tempPath);
@@ -4219,8 +4252,8 @@ bool SystemTools::IsSubDirectory(const std::string& cSubdir,
if (subdir[expectedSlashPosition] != '/') {
return false;
}
- std::string s = subdir.substr(0, dir.size());
- return SystemTools::ComparePath(s, dir);
+ subdir.resize(dir.size());
+ return SystemTools::ComparePath(subdir, dir);
}
void SystemTools::Delay(unsigned int msec)
@@ -4516,7 +4549,7 @@ std::string SystemTools::GetOperatingSystemNameAndVersion()
bool SystemTools::ParseURLProtocol(const std::string& URL,
std::string& protocol,
- std::string& dataglom)
+ std::string& dataglom, bool decode)
{
// match 0 entire url
// match 1 protocol
@@ -4529,13 +4562,17 @@ bool SystemTools::ParseURLProtocol(const std::string& URL,
protocol = urlRe.match(1);
dataglom = urlRe.match(2);
+ if (decode) {
+ dataglom = DecodeURL(dataglom);
+ }
+
return true;
}
bool SystemTools::ParseURL(const std::string& URL, std::string& protocol,
std::string& username, std::string& password,
std::string& hostname, std::string& dataport,
- std::string& database)
+ std::string& database, bool decode)
{
kwsys::RegularExpression urlRe(VTK_URL_REGEX);
if (!urlRe.find(URL))
@@ -4559,13 +4596,37 @@ bool SystemTools::ParseURL(const std::string& URL, std::string& protocol,
dataport = urlRe.match(8);
database = urlRe.match(9);
+ if (decode) {
+ username = DecodeURL(username);
+ password = DecodeURL(password);
+ hostname = DecodeURL(hostname);
+ dataport = DecodeURL(dataport);
+ database = DecodeURL(database);
+ }
+
return true;
}
-// These must NOT be initialized. Default initialization to zero is
-// necessary.
+// ----------------------------------------------------------------------
+std::string SystemTools::DecodeURL(const std::string& url)
+{
+ kwsys::RegularExpression urlByteRe(VTK_URL_BYTE_REGEX);
+ std::string ret;
+ for (size_t i = 0; i < url.length(); i++) {
+ if (urlByteRe.find(url.substr(i, 3))) {
+ char bytes[] = { url[i + 1], url[i + 2], '\0' };
+ ret += static_cast<char>(strtoul(bytes, nullptr, 16));
+ i += 2;
+ } else {
+ ret += url[i];
+ }
+ }
+ return ret;
+}
+
+// ----------------------------------------------------------------------
+// Do NOT initialize. Default initialization to zero is necessary.
static unsigned int SystemToolsManagerCount;
-SystemToolsStatic* SystemTools::Statics;
// SystemToolsManager manages the SystemTools singleton.
// SystemToolsManager should be included in any translation unit
@@ -4608,7 +4669,7 @@ void SystemTools::ClassInitialize()
#endif
// Create statics singleton instance
- SystemTools::Statics = new SystemToolsStatic;
+ SystemToolsStatics = new SystemToolsStatic;
#if KWSYS_SYSTEMTOOLS_USE_TRANSLATION_MAP
// Add some special translation paths for unix. These are not added
@@ -4658,7 +4719,7 @@ void SystemTools::ClassInitialize()
void SystemTools::ClassFinalize()
{
- delete SystemTools::Statics;
+ delete SystemToolsStatics;
}
} // namespace KWSYS_NAMESPACE
diff --git a/Source/kwsys/SystemTools.hxx.in b/Source/kwsys/SystemTools.hxx.in
index c4ab9d4..ae08e57 100644
--- a/Source/kwsys/SystemTools.hxx.in
+++ b/Source/kwsys/SystemTools.hxx.in
@@ -411,11 +411,11 @@ public:
* (which defaults to the current working directory). The full path
* is returned.
*/
- static std::string CollapseFullPath(const std::string& in_relative);
- static std::string CollapseFullPath(const std::string& in_relative,
+ static std::string CollapseFullPath(std::string const& in_path);
+ static std::string CollapseFullPath(std::string const& in_path,
const char* in_base);
- static std::string CollapseFullPath(const std::string& in_relative,
- const std::string& in_base);
+ static std::string CollapseFullPath(std::string const& in_path,
+ std::string const& in_base);
/**
* Get the real path for a given path, removing all symlinks. In
@@ -549,7 +549,8 @@ public:
*/
/**
- * Open a file considering unicode.
+ * Open a file considering unicode. On Windows, if 'e' is present in
+ * mode it is first discarded.
*/
static FILE* Fopen(const std::string& file, const char* mode);
@@ -677,6 +678,11 @@ public:
static bool FileIsDirectory(const std::string& name);
/**
+ * Return true if the file is an executable
+ */
+ static bool FileIsExecutable(const std::string& name);
+
+ /**
* Return true if the file is a symlink
*/
static bool FileIsSymlink(const std::string& name);
@@ -869,7 +875,7 @@ public:
/**
* Get current working directory CWD
*/
- static std::string GetCurrentWorkingDirectory(bool collapse = true);
+ static std::string GetCurrentWorkingDirectory();
/**
* Change directory to the directory specified
@@ -935,22 +941,32 @@ public:
* Parse a character string :
* protocol://dataglom
* and fill protocol as appropriate.
+ * decode the dataglom using DecodeURL if set to true.
* Return false if the URL does not have the required form, true otherwise.
*/
static bool ParseURLProtocol(const std::string& URL, std::string& protocol,
- std::string& dataglom);
+ std::string& dataglom, bool decode = false);
/**
* Parse a string (a URL without protocol prefix) with the form:
* protocol://[[username[':'password]'@']hostname[':'dataport]]'/'[datapath]
* and fill protocol, username, password, hostname, dataport, and datapath
* when values are found.
+ * decode all string except the protocol using DecodeUrl if set to true.
* Return true if the string matches the format; false otherwise.
*/
static bool ParseURL(const std::string& URL, std::string& protocol,
std::string& username, std::string& password,
std::string& hostname, std::string& dataport,
- std::string& datapath);
+ std::string& datapath, bool decode = false);
+
+ /**
+ * Decode the percent-encoded string from an URL or an URI
+ * into their correct char values.
+ * Does not perform any other sort of validation.
+ * Return the decoded string
+ */
+ static std::string DecodeURL(const std::string& url);
private:
/**
@@ -971,7 +987,6 @@ private:
return &SystemToolsManagerInstance;
}
- static SystemToolsStatic* Statics;
friend class SystemToolsStatic;
friend class SystemToolsManager;
};
diff --git a/Source/kwsys/kwsysPlatformTests.cmake b/Source/kwsys/kwsysPlatformTests.cmake
index 28d3f68..89be4b8 100644
--- a/Source/kwsys/kwsysPlatformTests.cmake
+++ b/Source/kwsys/kwsysPlatformTests.cmake
@@ -1,185 +1,185 @@
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file Copyright.txt or https://cmake.org/licensing#kwsys for details.
-SET(KWSYS_PLATFORM_TEST_FILE_C kwsysPlatformTestsC.c)
-SET(KWSYS_PLATFORM_TEST_FILE_CXX kwsysPlatformTestsCXX.cxx)
+set(KWSYS_PLATFORM_TEST_FILE_C kwsysPlatformTestsC.c)
+set(KWSYS_PLATFORM_TEST_FILE_CXX kwsysPlatformTestsCXX.cxx)
-MACRO(KWSYS_PLATFORM_TEST lang var description invert)
- IF(NOT DEFINED ${var}_COMPILED)
- MESSAGE(STATUS "${description}")
+macro(KWSYS_PLATFORM_TEST lang var description invert)
+ if(NOT DEFINED ${var}_COMPILED)
+ message(STATUS "${description}")
set(maybe_cxx_standard "")
if(CMAKE_VERSION VERSION_LESS 3.8 AND CMAKE_CXX_STANDARD)
set(maybe_cxx_standard "-DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}")
endif()
- TRY_COMPILE(${var}_COMPILED
+ try_compile(${var}_COMPILED
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/${KWSYS_PLATFORM_TEST_FILE_${lang}}
COMPILE_DEFINITIONS -DTEST_${var} ${KWSYS_PLATFORM_TEST_DEFINES} ${KWSYS_PLATFORM_TEST_EXTRA_FLAGS}
CMAKE_FLAGS "-DLINK_LIBRARIES:STRING=${KWSYS_PLATFORM_TEST_LINK_LIBRARIES}"
${maybe_cxx_standard}
OUTPUT_VARIABLE OUTPUT)
- IF(${var}_COMPILED)
- FILE(APPEND
+ if(${var}_COMPILED)
+ file(APPEND
${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
"${description} compiled with the following output:\n${OUTPUT}\n\n")
- ELSE()
- FILE(APPEND
+ else()
+ file(APPEND
${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
"${description} failed to compile with the following output:\n${OUTPUT}\n\n")
- ENDIF()
- IF(${invert} MATCHES INVERT)
- IF(${var}_COMPILED)
- MESSAGE(STATUS "${description} - no")
- ELSE()
- MESSAGE(STATUS "${description} - yes")
- ENDIF()
- ELSE()
- IF(${var}_COMPILED)
- MESSAGE(STATUS "${description} - yes")
- ELSE()
- MESSAGE(STATUS "${description} - no")
- ENDIF()
- ENDIF()
- ENDIF()
- IF(${invert} MATCHES INVERT)
- IF(${var}_COMPILED)
- SET(${var} 0)
- ELSE()
- SET(${var} 1)
- ENDIF()
- ELSE()
- IF(${var}_COMPILED)
- SET(${var} 1)
- ELSE()
- SET(${var} 0)
- ENDIF()
- ENDIF()
-ENDMACRO()
+ endif()
+ if(${invert} MATCHES INVERT)
+ if(${var}_COMPILED)
+ message(STATUS "${description} - no")
+ else()
+ message(STATUS "${description} - yes")
+ endif()
+ else()
+ if(${var}_COMPILED)
+ message(STATUS "${description} - yes")
+ else()
+ message(STATUS "${description} - no")
+ endif()
+ endif()
+ endif()
+ if(${invert} MATCHES INVERT)
+ if(${var}_COMPILED)
+ set(${var} 0)
+ else()
+ set(${var} 1)
+ endif()
+ else()
+ if(${var}_COMPILED)
+ set(${var} 1)
+ else()
+ set(${var} 0)
+ endif()
+ endif()
+endmacro()
-MACRO(KWSYS_PLATFORM_TEST_RUN lang var description invert)
- IF(NOT DEFINED ${var})
- MESSAGE(STATUS "${description}")
- TRY_RUN(${var} ${var}_COMPILED
+macro(KWSYS_PLATFORM_TEST_RUN lang var description invert)
+ if(NOT DEFINED ${var})
+ message(STATUS "${description}")
+ try_run(${var} ${var}_COMPILED
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/${KWSYS_PLATFORM_TEST_FILE_${lang}}
COMPILE_DEFINITIONS -DTEST_${var} ${KWSYS_PLATFORM_TEST_DEFINES} ${KWSYS_PLATFORM_TEST_EXTRA_FLAGS}
OUTPUT_VARIABLE OUTPUT)
# Note that ${var} will be a 0 return value on success.
- IF(${var}_COMPILED)
- IF(${var})
- FILE(APPEND
+ if(${var}_COMPILED)
+ if(${var})
+ file(APPEND
${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
"${description} compiled but failed to run with the following output:\n${OUTPUT}\n\n")
- ELSE()
- FILE(APPEND
+ else()
+ file(APPEND
${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
"${description} compiled and ran with the following output:\n${OUTPUT}\n\n")
- ENDIF()
- ELSE()
- FILE(APPEND
+ endif()
+ else()
+ file(APPEND
${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
"${description} failed to compile with the following output:\n${OUTPUT}\n\n")
- SET(${var} -1 CACHE INTERNAL "${description} failed to compile.")
- ENDIF()
+ set(${var} -1 CACHE INTERNAL "${description} failed to compile.")
+ endif()
- IF(${invert} MATCHES INVERT)
- IF(${var}_COMPILED)
- IF(${var})
- MESSAGE(STATUS "${description} - yes")
- ELSE()
- MESSAGE(STATUS "${description} - no")
- ENDIF()
- ELSE()
- MESSAGE(STATUS "${description} - failed to compile")
- ENDIF()
- ELSE()
- IF(${var}_COMPILED)
- IF(${var})
- MESSAGE(STATUS "${description} - no")
- ELSE()
- MESSAGE(STATUS "${description} - yes")
- ENDIF()
- ELSE()
- MESSAGE(STATUS "${description} - failed to compile")
- ENDIF()
- ENDIF()
- ENDIF()
+ if(${invert} MATCHES INVERT)
+ if(${var}_COMPILED)
+ if(${var})
+ message(STATUS "${description} - yes")
+ else()
+ message(STATUS "${description} - no")
+ endif()
+ else()
+ message(STATUS "${description} - failed to compile")
+ endif()
+ else()
+ if(${var}_COMPILED)
+ if(${var})
+ message(STATUS "${description} - no")
+ else()
+ message(STATUS "${description} - yes")
+ endif()
+ else()
+ message(STATUS "${description} - failed to compile")
+ endif()
+ endif()
+ endif()
- IF(${invert} MATCHES INVERT)
- IF(${var}_COMPILED)
- IF(${var})
- SET(${var} 1)
- ELSE()
- SET(${var} 0)
- ENDIF()
- ELSE()
- SET(${var} 1)
- ENDIF()
- ELSE()
- IF(${var}_COMPILED)
- IF(${var})
- SET(${var} 0)
- ELSE()
- SET(${var} 1)
- ENDIF()
- ELSE()
- SET(${var} 0)
- ENDIF()
- ENDIF()
-ENDMACRO()
+ if(${invert} MATCHES INVERT)
+ if(${var}_COMPILED)
+ if(${var})
+ set(${var} 1)
+ else()
+ set(${var} 0)
+ endif()
+ else()
+ set(${var} 1)
+ endif()
+ else()
+ if(${var}_COMPILED)
+ if(${var})
+ set(${var} 0)
+ else()
+ set(${var} 1)
+ endif()
+ else()
+ set(${var} 0)
+ endif()
+ endif()
+endmacro()
-MACRO(KWSYS_PLATFORM_C_TEST var description invert)
- SET(KWSYS_PLATFORM_TEST_DEFINES ${KWSYS_PLATFORM_C_TEST_DEFINES})
- SET(KWSYS_PLATFORM_TEST_EXTRA_FLAGS ${KWSYS_PLATFORM_C_TEST_EXTRA_FLAGS})
+macro(KWSYS_PLATFORM_C_TEST var description invert)
+ set(KWSYS_PLATFORM_TEST_DEFINES ${KWSYS_PLATFORM_C_TEST_DEFINES})
+ set(KWSYS_PLATFORM_TEST_EXTRA_FLAGS ${KWSYS_PLATFORM_C_TEST_EXTRA_FLAGS})
KWSYS_PLATFORM_TEST(C "${var}" "${description}" "${invert}")
- SET(KWSYS_PLATFORM_TEST_DEFINES)
- SET(KWSYS_PLATFORM_TEST_EXTRA_FLAGS)
-ENDMACRO()
+ set(KWSYS_PLATFORM_TEST_DEFINES)
+ set(KWSYS_PLATFORM_TEST_EXTRA_FLAGS)
+endmacro()
-MACRO(KWSYS_PLATFORM_C_TEST_RUN var description invert)
- SET(KWSYS_PLATFORM_TEST_DEFINES ${KWSYS_PLATFORM_C_TEST_DEFINES})
- SET(KWSYS_PLATFORM_TEST_EXTRA_FLAGS ${KWSYS_PLATFORM_C_TEST_EXTRA_FLAGS})
+macro(KWSYS_PLATFORM_C_TEST_RUN var description invert)
+ set(KWSYS_PLATFORM_TEST_DEFINES ${KWSYS_PLATFORM_C_TEST_DEFINES})
+ set(KWSYS_PLATFORM_TEST_EXTRA_FLAGS ${KWSYS_PLATFORM_C_TEST_EXTRA_FLAGS})
KWSYS_PLATFORM_TEST_RUN(C "${var}" "${description}" "${invert}")
- SET(KWSYS_PLATFORM_TEST_DEFINES)
- SET(KWSYS_PLATFORM_TEST_EXTRA_FLAGS)
-ENDMACRO()
+ set(KWSYS_PLATFORM_TEST_DEFINES)
+ set(KWSYS_PLATFORM_TEST_EXTRA_FLAGS)
+endmacro()
-MACRO(KWSYS_PLATFORM_CXX_TEST var description invert)
- SET(KWSYS_PLATFORM_TEST_DEFINES ${KWSYS_PLATFORM_CXX_TEST_DEFINES})
- SET(KWSYS_PLATFORM_TEST_EXTRA_FLAGS ${KWSYS_PLATFORM_CXX_TEST_EXTRA_FLAGS})
- SET(KWSYS_PLATFORM_TEST_LINK_LIBRARIES ${KWSYS_PLATFORM_CXX_TEST_LINK_LIBRARIES})
+macro(KWSYS_PLATFORM_CXX_TEST var description invert)
+ set(KWSYS_PLATFORM_TEST_DEFINES ${KWSYS_PLATFORM_CXX_TEST_DEFINES})
+ set(KWSYS_PLATFORM_TEST_EXTRA_FLAGS ${KWSYS_PLATFORM_CXX_TEST_EXTRA_FLAGS})
+ set(KWSYS_PLATFORM_TEST_LINK_LIBRARIES ${KWSYS_PLATFORM_CXX_TEST_LINK_LIBRARIES})
KWSYS_PLATFORM_TEST(CXX "${var}" "${description}" "${invert}")
- SET(KWSYS_PLATFORM_TEST_DEFINES)
- SET(KWSYS_PLATFORM_TEST_EXTRA_FLAGS)
- SET(KWSYS_PLATFORM_TEST_LINK_LIBRARIES)
-ENDMACRO()
+ set(KWSYS_PLATFORM_TEST_DEFINES)
+ set(KWSYS_PLATFORM_TEST_EXTRA_FLAGS)
+ set(KWSYS_PLATFORM_TEST_LINK_LIBRARIES)
+endmacro()
-MACRO(KWSYS_PLATFORM_CXX_TEST_RUN var description invert)
- SET(KWSYS_PLATFORM_TEST_DEFINES ${KWSYS_PLATFORM_CXX_TEST_DEFINES})
- SET(KWSYS_PLATFORM_TEST_EXTRA_FLAGS ${KWSYS_PLATFORM_CXX_TEST_EXTRA_FLAGS})
+macro(KWSYS_PLATFORM_CXX_TEST_RUN var description invert)
+ set(KWSYS_PLATFORM_TEST_DEFINES ${KWSYS_PLATFORM_CXX_TEST_DEFINES})
+ set(KWSYS_PLATFORM_TEST_EXTRA_FLAGS ${KWSYS_PLATFORM_CXX_TEST_EXTRA_FLAGS})
KWSYS_PLATFORM_TEST_RUN(CXX "${var}" "${description}" "${invert}")
- SET(KWSYS_PLATFORM_TEST_DEFINES)
- SET(KWSYS_PLATFORM_TEST_EXTRA_FLAGS)
-ENDMACRO()
+ set(KWSYS_PLATFORM_TEST_DEFINES)
+ set(KWSYS_PLATFORM_TEST_EXTRA_FLAGS)
+endmacro()
#-----------------------------------------------------------------------------
# KWSYS_PLATFORM_INFO_TEST(lang var description)
#
# Compile test named by ${var} and store INFO strings extracted from binary.
-MACRO(KWSYS_PLATFORM_INFO_TEST lang var description)
+macro(KWSYS_PLATFORM_INFO_TEST lang var description)
# We can implement this macro on CMake 2.6 and above.
- IF("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" LESS 2.6)
- SET(${var} "")
- ELSE()
+ if("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" LESS 2.6)
+ set(${var} "")
+ else()
# Choose a location for the result binary.
- SET(KWSYS_PLATFORM_INFO_FILE
+ set(KWSYS_PLATFORM_INFO_FILE
${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/${var}.bin)
# Compile the test binary.
- IF(NOT EXISTS ${KWSYS_PLATFORM_INFO_FILE})
- MESSAGE(STATUS "${description}")
- TRY_COMPILE(${var}_COMPILED
+ if(NOT EXISTS ${KWSYS_PLATFORM_INFO_FILE})
+ message(STATUS "${description}")
+ try_compile(${var}_COMPILED
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/${KWSYS_PLATFORM_TEST_FILE_${lang}}
COMPILE_DEFINITIONS -DTEST_${var}
@@ -188,29 +188,29 @@ MACRO(KWSYS_PLATFORM_INFO_TEST lang var description)
OUTPUT_VARIABLE OUTPUT
COPY_FILE ${KWSYS_PLATFORM_INFO_FILE}
)
- IF(${var}_COMPILED)
- FILE(APPEND
+ if(${var}_COMPILED)
+ file(APPEND
${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
"${description} compiled with the following output:\n${OUTPUT}\n\n")
- ELSE()
- FILE(APPEND
+ else()
+ file(APPEND
${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
"${description} failed to compile with the following output:\n${OUTPUT}\n\n")
- ENDIF()
- IF(${var}_COMPILED)
- MESSAGE(STATUS "${description} - compiled")
- ELSE()
- MESSAGE(STATUS "${description} - failed")
- ENDIF()
- ENDIF()
+ endif()
+ if(${var}_COMPILED)
+ message(STATUS "${description} - compiled")
+ else()
+ message(STATUS "${description} - failed")
+ endif()
+ endif()
# Parse info strings out of the compiled binary.
- IF(${var}_COMPILED)
- FILE(STRINGS ${KWSYS_PLATFORM_INFO_FILE} ${var} REGEX "INFO:[A-Za-z0-9]+\\[[^]]*\\]")
- ELSE()
- SET(${var} "")
- ENDIF()
+ if(${var}_COMPILED)
+ file(STRINGS ${KWSYS_PLATFORM_INFO_FILE} ${var} REGEX "INFO:[A-Za-z0-9]+\\[[^]]*\\]")
+ else()
+ set(${var} "")
+ endif()
- SET(KWSYS_PLATFORM_INFO_FILE)
- ENDIF()
-ENDMACRO()
+ set(KWSYS_PLATFORM_INFO_FILE)
+ endif()
+endmacro()
diff --git a/Source/kwsys/testCommandLineArguments.cxx b/Source/kwsys/testCommandLineArguments.cxx
index 1778a9b..0786751 100644
--- a/Source/kwsys/testCommandLineArguments.cxx
+++ b/Source/kwsys/testCommandLineArguments.cxx
@@ -12,8 +12,8 @@
#include <iostream>
#include <vector>
-#include <stddef.h> /* size_t */
-#include <string.h> /* strcmp */
+#include <cstddef> /* size_t */
+#include <cstring> /* strcmp */
static void* random_ptr = reinterpret_cast<void*>(0x123);
@@ -98,7 +98,7 @@ int testCommandLineArguments(int argc, char* argv[])
std::vector<std::string> stl_strings_argument;
std::string valid_stl_strings[] = { "ken", "brad", "bill", "andy" };
- typedef kwsys::CommandLineArguments argT;
+ using argT = kwsys::CommandLineArguments;
arg.AddArgument("--some-int-variable", argT::SPACE_ARGUMENT,
&some_int_variable, "Set some random int variable");
diff --git a/Source/kwsys/testCommandLineArguments1.cxx b/Source/kwsys/testCommandLineArguments1.cxx
index 64561b1..2f6b735 100644
--- a/Source/kwsys/testCommandLineArguments1.cxx
+++ b/Source/kwsys/testCommandLineArguments1.cxx
@@ -12,8 +12,8 @@
#include <iostream>
#include <vector>
-#include <assert.h> /* assert */
-#include <string.h> /* strcmp */
+#include <cassert> /* assert */
+#include <cstring> /* strcmp */
int testCommandLineArguments1(int argc, char* argv[])
{
@@ -25,7 +25,7 @@ int testCommandLineArguments1(int argc, char* argv[])
std::string p;
int res = 0;
- typedef kwsys::CommandLineArguments argT;
+ using argT = kwsys::CommandLineArguments;
arg.AddArgument("-n", argT::SPACE_ARGUMENT, &n, "Argument N");
arg.AddArgument("-m", argT::EQUAL_ARGUMENT, &m, "Argument M");
arg.AddBooleanArgument("-p", &p, "Argument P");
@@ -51,9 +51,7 @@ int testCommandLineArguments1(int argc, char* argv[])
std::cout << "Value of N: " << n << std::endl;
std::cout << "Value of M: " << m << std::endl;
std::cout << "Value of P: " << p << std::endl;
- if (m) {
- delete[] m;
- }
+ delete[] m;
char** newArgv = nullptr;
int newArgc = 0;
diff --git a/Source/kwsys/testDirectory.cxx b/Source/kwsys/testDirectory.cxx
index b1ab0c8..eb3ca32 100644
--- a/Source/kwsys/testDirectory.cxx
+++ b/Source/kwsys/testDirectory.cxx
@@ -57,7 +57,11 @@ int _doLongPathTest()
Directory testdir;
// Set res to failure if the directory doesn't load
- res += !testdir.Load(testdirpath);
+ std::string errorMessage = "";
+ res += !testdir.Load(testdirpath, &errorMessage);
+ if (errorMessage != "") {
+ std::cerr << "Failed to list directory: " << errorMessage << std::endl;
+ }
// Increment res failure if the directory appears empty
res += testdir.GetNumberOfFiles() == 0;
// Increment res failures if the path has changed from
@@ -73,6 +77,34 @@ int _doLongPathTest()
return res;
}
+int _nonExistentDirectoryTest()
+{
+ using namespace kwsys;
+ int res = 0;
+ std::string testdirpath(TEST_SYSTEMTOOLS_BINARY_DIR
+ "/directory_testing/doesnt_exist/");
+ std::string errorMessage;
+ Directory testdir;
+
+ errorMessage = "foo";
+ // Increment res failure if directory lists
+ res += testdir.Load(testdirpath, &errorMessage);
+#if !defined(_WIN32) || defined(__CYGWIN__)
+ // Increment res failure if errorMessage is unmodified
+ res += (errorMessage == "foo");
+#endif
+
+ errorMessage = "foo";
+ // Increment res failure if directory has files
+ res += (testdir.GetNumberOfFilesInDirectory(testdirpath, &errorMessage) > 0);
+#if !defined(_WIN32) || defined(__CYGWIN__)
+ // Increment res failure if errorMessage is unmodified
+ res += (errorMessage == "foo");
+#endif
+
+ return res;
+}
+
int _copyDirectoryTest()
{
using namespace kwsys;
@@ -106,5 +138,6 @@ int _copyDirectoryTest()
int testDirectory(int, char* [])
{
- return _doLongPathTest() + _copyDirectoryTest();
+ return _doLongPathTest() + _nonExistentDirectoryTest() +
+ _copyDirectoryTest();
}
diff --git a/Source/kwsys/testDynamicLoader.cxx b/Source/kwsys/testDynamicLoader.cxx
index 2421ac0..703ad4d 100644
--- a/Source/kwsys/testDynamicLoader.cxx
+++ b/Source/kwsys/testDynamicLoader.cxx
@@ -25,7 +25,7 @@ static std::string GetLibName(const char* lname, const char* subdir = nullptr)
{
// Construct proper name of lib
std::string slname;
- slname = EXECUTABLE_OUTPUT_PATH;
+ slname = RUNTIME_OUTPUT_DIRECTORY;
if (subdir) {
slname += "/";
slname += subdir;
diff --git a/Source/kwsys/testDynload.c b/Source/kwsys/testDynload.c
index c49f747..33a431e 100644
--- a/Source/kwsys/testDynload.c
+++ b/Source/kwsys/testDynload.c
@@ -8,6 +8,6 @@
DL_EXPORT int TestDynamicLoaderData = 0;
-DL_EXPORT void TestDynamicLoaderSymbolPointer()
+DL_EXPORT void TestDynamicLoaderSymbolPointer(void)
{
}
diff --git a/Source/kwsys/testEncoding.cxx b/Source/kwsys/testEncoding.cxx
index 988697b..ee93e8d 100644
--- a/Source/kwsys/testEncoding.cxx
+++ b/Source/kwsys/testEncoding.cxx
@@ -10,10 +10,10 @@
#include KWSYS_HEADER(Encoding.h)
#include <algorithm>
+#include <clocale>
+#include <cstdlib>
+#include <cstring>
#include <iostream>
-#include <locale.h>
-#include <stdlib.h>
-#include <string.h>
// Work-around CMake dependency scanning limitation. This must
// duplicate the above list of headers.
@@ -59,7 +59,7 @@ static int testHelloWorldEncoding()
std::string str2 = kwsys::Encoding::ToNarrow(wstr);
wchar_t* c_wstr = kwsysEncoding_DupToWide(str.c_str());
char* c_str2 = kwsysEncoding_DupToNarrow(c_wstr);
- if (!wstr.empty() && (str != str2 || strcmp(c_str2, str.c_str()))) {
+ if (!wstr.empty() && (str != str2 || strcmp(c_str2, str.c_str()) != 0)) {
std::cout << "converted string was different: " << str2 << std::endl;
std::cout << "converted string was different: " << c_str2 << std::endl;
ret++;
@@ -85,7 +85,7 @@ static int testRobustEncoding()
std::wstring wstr = kwsys::Encoding::ToWide(cstr);
wstr = kwsys::Encoding::ToWide(nullptr);
- if (wstr != L"") {
+ if (!wstr.empty()) {
const wchar_t* wcstr = wstr.c_str();
std::cout << "ToWide(NULL) returned";
for (size_t i = 0; i < wstr.size(); i++) {
@@ -95,7 +95,7 @@ static int testRobustEncoding()
ret++;
}
wstr = kwsys::Encoding::ToWide("");
- if (wstr != L"") {
+ if (!wstr.empty()) {
const wchar_t* wcstr = wstr.c_str();
std::cout << "ToWide(\"\") returned";
for (size_t i = 0; i < wstr.size(); i++) {
@@ -113,13 +113,13 @@ static int testRobustEncoding()
#endif
std::string str = kwsys::Encoding::ToNarrow(nullptr);
- if (str != "") {
+ if (!str.empty()) {
std::cout << "ToNarrow(NULL) returned " << str << std::endl;
ret++;
}
str = kwsys::Encoding::ToNarrow(L"");
- if (wstr != L"") {
+ if (!wstr.empty()) {
std::cout << "ToNarrow(\"\") returned " << str << std::endl;
ret++;
}
@@ -140,14 +140,13 @@ static int testWithNulls()
strings.push_back(std::string("k") + '\0' + '\0');
strings.push_back(std::string("\0\0\0\0", 4) + "lmn" +
std::string("\0\0\0\0", 4));
- for (std::vector<std::string>::iterator it = strings.begin();
- it != strings.end(); ++it) {
- std::wstring wstr = kwsys::Encoding::ToWide(*it);
+ for (auto& string : strings) {
+ std::wstring wstr = kwsys::Encoding::ToWide(string);
std::string str = kwsys::Encoding::ToNarrow(wstr);
- std::string s(*it);
+ std::string s(string);
std::replace(s.begin(), s.end(), '\0', ' ');
- std::cout << "'" << s << "' (" << it->size() << ")" << std::endl;
- if (str != *it) {
+ std::cout << "'" << s << "' (" << string.size() << ")" << std::endl;
+ if (str != string) {
std::replace(str.begin(), str.end(), '\0', ' ');
std::cout << "string with null was different: '" << str << "' ("
<< str.size() << ")" << std::endl;
diff --git a/Source/kwsys/testFStream.cxx b/Source/kwsys/testFStream.cxx
index 5009e98..5762378 100644
--- a/Source/kwsys/testFStream.cxx
+++ b/Source/kwsys/testFStream.cxx
@@ -7,7 +7,7 @@
#endif
#include KWSYS_HEADER(FStream.hxx)
-#include <string.h>
+#include <cstring>
#ifdef __BORLANDC__
# include <mem.h> /* memcmp */
#endif
diff --git a/Source/kwsys/testHashSTL.cxx b/Source/kwsys/testHashSTL.cxx
index 4ed2f89..18cae7f 100644
--- a/Source/kwsys/testHashSTL.cxx
+++ b/Source/kwsys/testHashSTL.cxx
@@ -27,30 +27,30 @@ template class kwsys::hash_set<int>;
static bool test_hash_map()
{
- typedef kwsys::hash_map<const char*, int> mtype;
+ using mtype = kwsys::hash_map<const char*, int>;
mtype m;
const char* keys[] = { "hello", "world" };
m[keys[0]] = 1;
m.insert(mtype::value_type(keys[1], 2));
int sum = 0;
- for (mtype::iterator mi = m.begin(); mi != m.end(); ++mi) {
- std::cout << "Found entry [" << mi->first << "," << mi->second << "]"
+ for (auto& mi : m) {
+ std::cout << "Found entry [" << mi.first << "," << mi.second << "]"
<< std::endl;
- sum += mi->second;
+ sum += mi.second;
}
return sum == 3;
}
static bool test_hash_set()
{
- typedef kwsys::hash_set<int> stype;
+ using stype = kwsys::hash_set<int>;
stype s;
s.insert(1);
s.insert(2);
int sum = 0;
- for (stype::iterator si = s.begin(); si != s.end(); ++si) {
- std::cout << "Found entry [" << *si << "]" << std::endl;
- sum += *si;
+ for (int si : s) {
+ std::cout << "Found entry [" << si << "]" << std::endl;
+ sum += si;
}
return sum == 3;
}
diff --git a/Source/kwsys/testProcess.c b/Source/kwsys/testProcess.c
index 39aaa23..5507dfb 100644
--- a/Source/kwsys/testProcess.c
+++ b/Source/kwsys/testProcess.c
@@ -631,7 +631,8 @@ int main(int argc, const char* argv[])
}
fprintf(stderr, "Invalid test number %d.\n", n);
return 1;
- } else if (n >= 1 && n <= 10) {
+ }
+ if (n >= 1 && n <= 10) {
/* This is the parent process for a requested test number. */
int states[10] = {
kwsysProcess_State_Exited, kwsysProcess_State_Exited,
@@ -709,7 +710,8 @@ int main(int argc, const char* argv[])
free(argv0);
#endif
return r;
- } else if (argc > 2 && strcmp(argv[1], "0") == 0) {
+ }
+ if (argc > 2 && strcmp(argv[1], "0") == 0) {
/* This is the special debugging test to run a given command
line. */
const char** cmd = argv + 2;
@@ -720,9 +722,8 @@ int main(int argc, const char* argv[])
int r =
runChild(cmd, state, exception, value, 0, 1, 0, timeout, 0, 1, 0, 0, 0);
return r;
- } else {
- /* Improper usage. */
- fprintf(stdout, "Usage: %s <test number>\n", argv[0]);
- return 1;
}
+ /* Improper usage. */
+ fprintf(stdout, "Usage: %s <test number>\n", argv[0]);
+ return 1;
}
diff --git a/Source/kwsys/testSystemTools.cxx b/Source/kwsys/testSystemTools.cxx
index 3f6eeb8..ff8e2b2 100644
--- a/Source/kwsys/testSystemTools.cxx
+++ b/Source/kwsys/testSystemTools.cxx
@@ -20,10 +20,10 @@
// left on disk.
#include <testSystemTools.h>
+#include <cstdlib> /* free */
+#include <cstring> /* strcmp */
#include <iostream>
#include <sstream>
-#include <stdlib.h> /* free */
-#include <string.h> /* strcmp */
#if defined(_WIN32) && !defined(__CYGWIN__)
# include <io.h> /* _umask (MSVC) / umask (Borland) */
# ifdef _MSC_VER
@@ -328,7 +328,14 @@ static bool CheckFileOperations()
}
// While we're at it, check proper TestFileAccess functionality.
- if (kwsys::SystemTools::TestFileAccess(testNewFile,
+ bool do_write_test = true;
+#if defined(__linux__)
+ // If we are running as root on linux ignore this check, as
+ // root can always write to files
+ do_write_test = (getuid() != 0);
+#endif
+ if (do_write_test &&
+ kwsys::SystemTools::TestFileAccess(testNewFile,
kwsys::TEST_FILE_WRITE)) {
std::cerr
<< "TestFileAccess incorrectly indicated that this is a writable file:"
@@ -500,7 +507,7 @@ static bool CheckStringOperations()
char* cres =
kwsys::SystemTools::AppendStrings("Mary Had A", " Little Lamb.");
- if (strcmp(cres, "Mary Had A Little Lamb.")) {
+ if (strcmp(cres, "Mary Had A Little Lamb.") != 0) {
std::cerr << "Problem with AppendStrings "
<< "\"Mary Had A\" \" Little Lamb.\"" << std::endl;
res = false;
@@ -508,7 +515,7 @@ static bool CheckStringOperations()
delete[] cres;
cres = kwsys::SystemTools::AppendStrings("Mary Had", " A ", "Little Lamb.");
- if (strcmp(cres, "Mary Had A Little Lamb.")) {
+ if (strcmp(cres, "Mary Had A Little Lamb.") != 0) {
std::cerr << "Problem with AppendStrings "
<< "\"Mary Had\" \" A \" \"Little Lamb.\"" << std::endl;
res = false;
@@ -522,7 +529,7 @@ static bool CheckStringOperations()
}
cres = kwsys::SystemTools::RemoveChars("Mary Had A Little Lamb.", "aeiou");
- if (strcmp(cres, "Mry Hd A Lttl Lmb.")) {
+ if (strcmp(cres, "Mry Hd A Lttl Lmb.") != 0) {
std::cerr << "Problem with RemoveChars "
<< "\"Mary Had A Little Lamb.\"" << std::endl;
res = false;
@@ -530,7 +537,7 @@ static bool CheckStringOperations()
delete[] cres;
cres = kwsys::SystemTools::RemoveCharsButUpperHex("Mary Had A Little Lamb.");
- if (strcmp(cres, "A")) {
+ if (strcmp(cres, "A") != 0) {
std::cerr << "Problem with RemoveCharsButUpperHex "
<< "\"Mary Had A Little Lamb.\"" << std::endl;
res = false;
@@ -539,7 +546,7 @@ static bool CheckStringOperations()
char* cres2 = strdup("Mary Had A Little Lamb.");
kwsys::SystemTools::ReplaceChars(cres2, "aeiou", 'X');
- if (strcmp(cres2, "MXry HXd A LXttlX LXmb.")) {
+ if (strcmp(cres2, "MXry HXd A LXttlX LXmb.") != 0) {
std::cerr << "Problem with ReplaceChars "
<< "\"Mary Had A Little Lamb.\"" << std::endl;
res = false;
@@ -561,7 +568,7 @@ static bool CheckStringOperations()
}
cres = kwsys::SystemTools::DuplicateString("Mary Had A Little Lamb.");
- if (strcmp(cres, "Mary Had A Little Lamb.")) {
+ if (strcmp(cres, "Mary Had A Little Lamb.") != 0) {
std::cerr << "Problem with DuplicateString "
<< "\"Mary Had A Little Lamb.\"" << std::endl;
res = false;
@@ -721,8 +728,7 @@ static std::string StringVectorToString(const std::vector<std::string>& vec)
{
std::stringstream ss;
ss << "vector(";
- for (std::vector<std::string>::const_iterator i = vec.begin();
- i != vec.end(); ++i) {
+ for (auto i = vec.begin(); i != vec.end(); ++i) {
if (i != vec.begin()) {
ss << ", ";
}
@@ -743,16 +749,16 @@ static bool CheckGetPath()
const char* registryPath = "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MyApp; MyKey]";
std::vector<std::string> originalPaths;
- originalPaths.push_back(registryPath);
+ originalPaths.emplace_back(registryPath);
std::vector<std::string> expectedPaths;
- expectedPaths.push_back(registryPath);
+ expectedPaths.emplace_back(registryPath);
#ifdef _WIN32
expectedPaths.push_back("C:/Somewhere/something");
expectedPaths.push_back("D:/Temp");
#else
- expectedPaths.push_back("/Somewhere/something");
- expectedPaths.push_back("/tmp");
+ expectedPaths.emplace_back("/Somewhere/something");
+ expectedPaths.emplace_back("/tmp");
#endif
bool res = true;
@@ -817,7 +823,7 @@ static bool CheckFind()
}
std::vector<std::string> searchPaths;
- searchPaths.push_back(TEST_SYSTEMTOOLS_BINARY_DIR);
+ searchPaths.emplace_back(TEST_SYSTEMTOOLS_BINARY_DIR);
if (kwsys::SystemTools::FindFile(testFindFileName, searchPaths, true)
.empty()) {
std::cerr << "Problem with FindFile without system paths for: "
@@ -1086,6 +1092,70 @@ static bool CheckCopyFileIfDifferent()
return ret;
}
+static bool CheckURLParsing()
+{
+ bool ret = true;
+ std::string url = "http://user:pw@hostname:42/full/url.com";
+
+ std::string protocol, username, password, hostname, dataport, database;
+ kwsys::SystemTools::ParseURL(url, protocol, username, password, hostname,
+ dataport, database);
+ if (protocol != "http" || username != "user" || password != "pw" ||
+ hostname != "hostname" || dataport != "42" ||
+ database != "full/url.com") {
+ std::cerr << "Incorrect URL parsing" << std::endl;
+ ret = false;
+ }
+
+ std::string uri =
+ "file://hostname/path/to/"
+ "a%20file%20with%20str%C3%A0ng%C3%A8%20ch%40r%20and%20s%C2%B5aces";
+ kwsys::SystemTools::ParseURL(uri, protocol, username, password, hostname,
+ dataport, database, true);
+ if (protocol != "file" || hostname != "hostname" ||
+ database != "path/to/a file with stràngè ch@r and sµaces") {
+ std::cerr << "Incorrect URL parsing or decoding" << std::endl;
+ ret = false;
+ }
+ return ret;
+}
+
+static bool CheckSplitString()
+{
+ bool ret = true;
+
+ auto check_split = [](std::string const& input,
+ std::initializer_list<const char*> expected) -> bool {
+ auto const components = kwsys::SystemTools::SplitString(input, '/');
+ if (components.size() != expected.size()) {
+ std::cerr << "Incorrect split count for " << input << ": "
+ << components.size() << std::endl;
+ return false;
+ }
+ size_t i = 0;
+ for (auto& part : expected) {
+ if (components[i] != part) {
+ std::cerr << "Incorrect split component " << i << " for " << input
+ << ": " << components[i] << std::endl;
+ return false;
+ }
+ ++i;
+ }
+ return true;
+ };
+
+ // No separators
+ ret &= check_split("nosep", { "nosep" });
+ // Simple
+ ret &= check_split("first/second", { "first", "second" });
+ // Separator at beginning
+ ret &= check_split("/starts/sep", { "", "starts", "sep" });
+ // Separator at end
+ ret &= check_split("ends/sep/", { "ends", "sep", "" });
+
+ return ret;
+}
+
int testSystemTools(int, char* [])
{
bool res = true;
@@ -1133,5 +1203,9 @@ int testSystemTools(int, char* [])
res &= CheckCopyFileIfDifferent();
+ res &= CheckURLParsing();
+
+ res &= CheckSplitString();
+
return res ? 0 : 1;
}
diff --git a/Source/kwsys/testSystemTools.h.in b/Source/kwsys/testSystemTools.h.in
index 022e36e..e4b89a7 100644
--- a/Source/kwsys/testSystemTools.h.in
+++ b/Source/kwsys/testSystemTools.h.in
@@ -3,7 +3,7 @@
#ifndef @KWSYS_NAMESPACE@_testSystemtools_h
#define @KWSYS_NAMESPACE@_testSystemtools_h
-#define EXECUTABLE_OUTPUT_PATH "@CMAKE_CURRENT_BINARY_DIR@"
+#define RUNTIME_OUTPUT_DIRECTORY "@CMAKE_CURRENT_BINARY_DIR@"
#define TEST_SYSTEMTOOLS_SOURCE_DIR "@TEST_SYSTEMTOOLS_SOURCE_DIR@"
#define TEST_SYSTEMTOOLS_BINARY_DIR "@TEST_SYSTEMTOOLS_BINARY_DIR@"
diff --git a/Templates/TestDriver.cxx.in b/Templates/TestDriver.cxx.in
index 846a828..053f1ee 100644
--- a/Templates/TestDriver.cxx.in
+++ b/Templates/TestDriver.cxx.in
@@ -45,7 +45,8 @@ static const int NumTests = CM_CAST(int,
(note that it has to be free'd manually) */
static char* lowercase(const char* string)
{
- char *new_string, *p;
+ char *new_string;
+ char *p;
size_t stringSize;
stringSize = CM_CAST(size_t, strlen(string) + 1);
@@ -63,7 +64,9 @@ static char* lowercase(const char* string)
int main(int ac, char* av[])
{
- int i, testNum = 0, partial_match;
+ int i;
+ int testNum = 0;
+ int partial_match;
char *arg;
int testToRun = -1;
diff --git a/Tests/BuildDepends/CMakeLists.txt b/Tests/BuildDepends/CMakeLists.txt
index c1ad17c..5ddae83 100644
--- a/Tests/BuildDepends/CMakeLists.txt
+++ b/Tests/BuildDepends/CMakeLists.txt
@@ -368,6 +368,28 @@ is not newer than dependency
${TEST_LINK_DEPENDS}
")
endif()
+
+ set(linkdep3 ${BuildDepends_BINARY_DIR}/Project/linkdep3${CMAKE_EXECUTABLE_SUFFIX})
+ if(${linkdep3} IS_NEWER_THAN ${TEST_LINK_DEPENDS})
+ message("$<LINK_LANGUAGE> in LINK_DEPENDS worked")
+ else()
+ message(SEND_ERROR "$<LINK_LANGUAGE> in LINK_DEPENDS failed. Executable
+ ${linkdep3}
+is not newer than dependency
+ ${TEST_LINK_DEPENDS}
+")
+ endif()
+
+ set(linkdep4 ${BuildDepends_BINARY_DIR}/Project/linkdep4${CMAKE_EXECUTABLE_SUFFIX})
+ if(${linkdep4} IS_NEWER_THAN ${TEST_LINK_DEPENDS})
+ message("$<LINK_LANGUAGE> in INTERFACE_LINK_DEPENDS worked")
+ else()
+ message(SEND_ERROR "$<LINK_LANGUAGE> in INTERFACE_LINK_DEPENDS failed. Executable
+ ${linkdep4}
+is not newer than dependency
+ ${TEST_LINK_DEPENDS}
+")
+ endif()
endif()
if(EXISTS "${link_depends_no_shared_check_txt}")
diff --git a/Tests/BuildDepends/Project/CMakeLists.txt b/Tests/BuildDepends/Project/CMakeLists.txt
index 8338800..83583c9 100644
--- a/Tests/BuildDepends/Project/CMakeLists.txt
+++ b/Tests/BuildDepends/Project/CMakeLists.txt
@@ -118,6 +118,14 @@ if(TEST_LINK_DEPENDS)
set_property(TARGET foo_interface PROPERTY INTERFACE_LINK_DEPENDS $<1:${TEST_LINK_DEPENDS}>)
add_executable(linkdep2 linkdep.cxx)
target_link_libraries(linkdep2 PRIVATE foo_interface)
+
+ add_executable(linkdep3 linkdep.cxx)
+ set_property(TARGET linkdep3 PROPERTY LINK_DEPENDS $<$<LINK_LANGUAGE:CXX>:${TEST_LINK_DEPENDS}>)
+
+ add_library(foo_interface2 INTERFACE)
+ set_property(TARGET foo_interface2 PROPERTY INTERFACE_LINK_DEPENDS $<$<LINK_LANGUAGE:CXX>:${TEST_LINK_DEPENDS}>)
+ add_executable(linkdep4 linkdep.cxx)
+ target_link_libraries(linkdep4 PRIVATE foo_interface2)
endif()
add_library(link_depends_no_shared_lib SHARED link_depends_no_shared_lib.c
diff --git a/Tests/CMakeLib/testArgumentParser.cxx b/Tests/CMakeLib/testArgumentParser.cxx
index 20f98c2..965690c 100644
--- a/Tests/CMakeLib/testArgumentParser.cxx
+++ b/Tests/CMakeLib/testArgumentParser.cxx
@@ -7,8 +7,7 @@
#include <vector>
#include <cm/string_view>
-
-#include "cm_static_string_view.hxx"
+#include <cmext/string_view>
#include "cmArgumentParser.h"
diff --git a/Tests/CMakeLib/testCTestBinPacker.cxx b/Tests/CMakeLib/testCTestBinPacker.cxx
index 6f09af2..abdbefb 100644
--- a/Tests/CMakeLib/testCTestBinPacker.cxx
+++ b/Tests/CMakeLib/testCTestBinPacker.cxx
@@ -1,4 +1,4 @@
-#include <cstddef>
+#include <cstddef> // IWYU pragma: keep
#include <iostream>
#include <map>
#include <string>
diff --git a/Tests/CMakeLib/testGccDepfileReader.cxx b/Tests/CMakeLib/testGccDepfileReader.cxx
index 924d87b..e79f047 100644
--- a/Tests/CMakeLib/testGccDepfileReader.cxx
+++ b/Tests/CMakeLib/testGccDepfileReader.cxx
@@ -1,4 +1,4 @@
-#include <cstddef>
+#include <cstddef> // IWYU pragma: keep
#include <iostream>
#include <memory>
#include <string>
diff --git a/Tests/CMakeLib/testString.cxx b/Tests/CMakeLib/testString.cxx
index 1fd3f38..ad800cf 100644
--- a/Tests/CMakeLib/testString.cxx
+++ b/Tests/CMakeLib/testString.cxx
@@ -1,7 +1,7 @@
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
-#include <cstddef>
+#include <cstddef> // IWYU pragma: keep
#include <cstring>
#include <iostream>
#include <iterator>
@@ -12,8 +12,7 @@
#include <utility>
#include <cm/string_view>
-
-#include "cm_static_string_view.hxx"
+#include <cmext/string_view>
#include "cmString.hxx"
diff --git a/Tests/CMakeLib/testUVProcessChain.cxx b/Tests/CMakeLib/testUVProcessChain.cxx
index 71a1764..61a77cf 100644
--- a/Tests/CMakeLib/testUVProcessChain.cxx
+++ b/Tests/CMakeLib/testUVProcessChain.cxx
@@ -8,7 +8,7 @@
#include <cm/memory>
-#include "cm_uv.h"
+#include <cm3p/uv.h>
#include "cmGetPipes.h"
#include "cmUVHandlePtr.h"
diff --git a/Tests/CMakeLib/testUVRAII.cxx b/Tests/CMakeLib/testUVRAII.cxx
index cb05ace..0607f44 100644
--- a/Tests/CMakeLib/testUVRAII.cxx
+++ b/Tests/CMakeLib/testUVRAII.cxx
@@ -3,7 +3,7 @@
#include <thread>
#include <utility>
-#include "cm_uv.h"
+#include <cm3p/uv.h>
#include "cmUVHandlePtr.h"
diff --git a/Tests/CMakeLib/testUVStreambuf.cxx b/Tests/CMakeLib/testUVStreambuf.cxx
index cd9c9d4..b86ed76 100644
--- a/Tests/CMakeLib/testUVStreambuf.cxx
+++ b/Tests/CMakeLib/testUVStreambuf.cxx
@@ -3,10 +3,9 @@
#include <string>
#include <vector>
+#include <cm3p/uv.h>
#include <stdint.h>
-#include "cm_uv.h"
-
#include "cmGetPipes.h"
#include "cmUVHandlePtr.h"
#include "cmUVStreambuf.h"
diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt
index aff7383..0c8a639 100644
--- a/Tests/CMakeLists.txt
+++ b/Tests/CMakeLists.txt
@@ -363,7 +363,10 @@ if(BUILD_TESTING)
add_test_macro(VSResourceNinjaForceRSP VSResourceNinjaForceRSP)
endif ()
endif()
- ADD_TEST_MACRO(MSManifest MSManifest)
+ if(_isMultiConfig)
+ set(MSManifest_CTEST_OPTIONS -C $<CONFIGURATION>)
+ endif()
+ ADD_TEST_MACRO(MSManifest ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>)
ADD_TEST_MACRO(Simple Simple)
ADD_TEST_MACRO(PreOrder PreOrder)
ADD_TEST_MACRO(MissingSourceFile MissingSourceFile)
@@ -787,13 +790,8 @@ ${CMake_SOURCE_DIR}/Utilities/Release/push.bash --dir dev -- '${CMake_BUILD_NIGH
endif()
endmacro()
if(CMake_BUILD_NIGHTLY_RELEASES)
- ADD_NIGHTLY_BUILD_TEST(CMakeNightlyWin32
- win32_release.cmake)
- ADD_NIGHTLY_BUILD_TEST(CMakeNightlyWin64
- win64_release.cmake)
ADD_NIGHTLY_BUILD_TEST(CMakeNightlyOSX
osx_release.cmake)
- set_property(TEST CMakeNightlyWin64 PROPERTY DEPENDS CMakeNightlyWin32)
endif()
# add tests with more complex invocations
@@ -1411,6 +1409,7 @@ ${CMake_SOURCE_DIR}/Utilities/Release/push.bash --dir dev -- '${CMake_BUILD_NIGH
foreach(_mod IN ITEMS
ALSA
Boost
+ BLAS
BZip2
CURL
Cups
@@ -1430,12 +1429,14 @@ ${CMake_SOURCE_DIR}/Utilities/Release/push.bash --dir dev -- '${CMake_BUILD_NIGH
ICU
JPEG
JsonCpp
+ LAPACK
LibArchive
LibLZMA
LibRHash
Libinput
LibUV
LibXml2
+ LibXslt
LTTngUST
ODBC
OpenACC
@@ -1471,7 +1472,7 @@ ${CMake_SOURCE_DIR}/Utilities/Release/push.bash --dir dev -- '${CMake_BUILD_NIGH
endif()
if(CMake_TEST_FindPython OR CMake_TEST_FindPython_NumPy
- OR CMake_TEST_FindPython_Conda OR CMake_TEST_FindPython_IronPython)
+ OR CMake_TEST_FindPython_Conda OR CMake_TEST_FindPython_IronPython OR CMake_TEST_FindPython_PyPy)
add_subdirectory(FindPython)
endif()
@@ -1479,6 +1480,10 @@ ${CMake_SOURCE_DIR}/Utilities/Release/push.bash --dir dev -- '${CMake_BUILD_NIGH
add_subdirectory(UseSWIG)
endif()
+ if(CMake_TEST_FindRuby)
+ add_subdirectory(FindRuby)
+ endif()
+
add_subdirectory(FindThreads)
# Matlab module
@@ -1606,7 +1611,7 @@ ${CMake_SOURCE_DIR}/Utilities/Release/push.bash --dir dev -- '${CMake_BUILD_NIGH
DEPENDS ExternalProjectUpdateSetup )
# do each of the tutorial steps
- function(add_tutorial_test step_name use_mymath)
+ function(add_tutorial_test step_name use_mymath tutorial_arg pass_regex)
set(tutorial_test_name Tutorial${step_name})
set(tutorial_build_dir "${CMake_BINARY_DIR}/Tests/Tutorial/${step_name}")
if (use_mymath)
@@ -1624,19 +1629,28 @@ ${CMake_SOURCE_DIR}/Utilities/Release/push.bash --dir dev -- '${CMake_BUILD_NIGH
${build_generator_args}
--build-project Tutorial
--build-options ${tutorial_build_options}
- --test-command Tutorial 25.0)
+ --test-command Tutorial ${tutorial_arg})
+ set_tests_properties(${tutorial_test_name} PROPERTIES
+ PASS_REGULAR_EXPRESSION ${pass_regex})
+
list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/${tutorial_build_dir}_Build")
endfunction()
if(NOT CMake_TEST_EXTERNAL_CMAKE)
foreach(STP RANGE 2 12)
- add_tutorial_test(Step${STP} TRUE)
+ if (STP EQUAL 6)
+ set(pass_regex ".*using log and exp")
+ else()
+ set(pass_regex "The square root of 25 is 5")
+ endif()
+ add_tutorial_test(Step${STP} TRUE 25 ${pass_regex})
endforeach()
- add_tutorial_test(Complete TRUE)
+ set(pass_regex "The square root of 25 is 5")
+ add_tutorial_test(Complete TRUE 25 ${pass_regex})
foreach(STP RANGE 3 12)
- add_tutorial_test(Step${STP} FALSE)
+ add_tutorial_test(Step${STP} FALSE 25 ${pass_regex})
endforeach()
- add_tutorial_test(Complete FALSE)
+ add_tutorial_test(Complete FALSE 25 ${pass_regex})
endif()
add_test(testing ${CMAKE_CTEST_COMMAND} -C \${CTEST_CONFIGURATION_TYPE}
@@ -2676,9 +2690,6 @@ ${CMake_SOURCE_DIR}/Utilities/Release/push.bash --dir dev -- '${CMake_BUILD_NIGH
-S "${CMake_BINARY_DIR}/Tests/CTestCoverageCollectGCOV/test.cmake" -VV
--output-log "${CMake_BINARY_DIR}/Tests/CTestCoverageCollectGCOV/testOut.log"
)
- set_tests_properties(CTestCoverageCollectGCOV PROPERTIES
- PASS_REGULAR_EXPRESSION
- "PASSED with correct output.*Testing/CoverageInfo/main.cpp.gcov")
set_property(TEST CTestCoverageCollectGCOV PROPERTY ENVIRONMENT CTEST_PARALLEL_LEVEL=)
configure_file(
@@ -3465,6 +3476,8 @@ ${CMake_SOURCE_DIR}/Utilities/Release/push.bash --dir dev -- '${CMake_BUILD_NIGH
--build-two-config
${build_generator_args}
--build-project IncludeDirectories
+ --build-options
+ -DMAKE_SUPPORTS_SPACES=${MAKE_SUPPORTS_SPACES}
--test-command IncludeDirectories)
list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/IncludeDirectories")
diff --git a/Tests/CMakeOnly/AllFindModules/CMakeLists.txt b/Tests/CMakeOnly/AllFindModules/CMakeLists.txt
index a53e441..49a4041 100644
--- a/Tests/CMakeOnly/AllFindModules/CMakeLists.txt
+++ b/Tests/CMakeOnly/AllFindModules/CMakeLists.txt
@@ -86,7 +86,7 @@ foreach(VTEST ALSA ARMADILLO BZIP2 CUPS CURL EXPAT FREETYPE GETTEXT GIT HG
endforeach()
foreach(VTEST BISON Boost CUDA DOXYGEN FLEX GIF GTK2
- HDF5 JPEG LibArchive OPENSCENEGRAPH RUBY SWIG Protobuf)
+ HDF5 JPEG LibArchive OPENSCENEGRAPH Ruby RUBY SWIG Protobuf)
check_version_string(${VTEST} ${VTEST}_VERSION)
endforeach()
diff --git a/Tests/CMakeTests/ListTest.cmake.in b/Tests/CMakeTests/ListTest.cmake.in
index f517e64..785f41d 100644
--- a/Tests/CMakeTests/ListTest.cmake.in
+++ b/Tests/CMakeTests/ListTest.cmake.in
@@ -85,6 +85,9 @@ set(result ken bill andy brad)
list(SORT result)
TEST("SORT result" "andy;bill;brad;ken")
+list(SORT result COMPARE NATURAL)
+TEST("SORT result COMPARE NATURAL" "andy;bill;brad;ken")
+
set(result andy bill brad ken)
list(REVERSE result)
TEST("REVERSE result" "ken;brad;bill;andy")
@@ -104,6 +107,26 @@ TEST("REVERSE empty result" "")
list(SORT result)
TEST("SORT empty result" "")
+list(SORT result COMPARE NATURAL)
+TEST("SORT result COMPARE NATURAL" "")
+
+set(result 1.1 10.0 11.0 12.0 12.1 2.0 2.1 3.0 3.1 3.2 8.0 9.0)
+
+list(SORT result COMPARE NATURAL)
+TEST("SORT result COMPARE NATURAL" "1.1;2.0;2.1;3.0;3.1;3.2;8.0;9.0;10.0;11.0;12.0;12.1")
+
+list(SORT result)
+TEST("SORT result" "1.1;10.0;11.0;12.0;12.1;2.0;2.1;3.0;3.1;3.2;8.0;9.0")
+
+list(SORT result COMPARE NATURAL ORDER DESCENDING)
+TEST("SORT result COMPARE NATURAL ORDER DESCENDING" "12.1;12.0;11.0;10.0;9.0;8.0;3.2;3.1;3.0;2.1;2.0;1.1")
+
+set(result b-1.1 a-10.0 c-2.0 d 1 00 0)
+
+list(SORT result COMPARE NATURAL)
+TEST("SORT result COMPARE NATURAL" "00;0;1;a-10.0;b-1.1;c-2.0;d")
+
+
# these trigger top-level condition
foreach(cmd IN ITEMS Append Find Get Insert Length Reverse Remove_At Remove_Duplicates Remove_Item Sort)
set(${cmd}-No-Arguments-RESULT 1)
diff --git a/Tests/CPackNSISGenerator/CMakeLists.txt b/Tests/CPackNSISGenerator/CMakeLists.txt
index b8b2ed6..8ed4d59 100644
--- a/Tests/CPackNSISGenerator/CMakeLists.txt
+++ b/Tests/CPackNSISGenerator/CMakeLists.txt
@@ -16,5 +16,6 @@ set(CPACK_NSIS_MUI_ICON "${PROJECT_SOURCE_DIR}\\\\install.ico")
set(CPACK_NSIS_MUI_UNIICON "${PROJECT_SOURCE_DIR}\\\\uninstall.ico")
set(CPACK_GENERATOR "NSIS")
set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON)
+set(CPACK_NSIS_MANIFEST_DPI_AWARE ON)
include(CPack)
diff --git a/Tests/CPackNSISGenerator/RunCPackVerifyResult.cmake b/Tests/CPackNSISGenerator/RunCPackVerifyResult.cmake
index 01b37c5..bfbcf9c 100644
--- a/Tests/CPackNSISGenerator/RunCPackVerifyResult.cmake
+++ b/Tests/CPackNSISGenerator/RunCPackVerifyResult.cmake
@@ -44,3 +44,11 @@ message(STATUS "Found the bitmap at index ${output_index}")
if("${output_index}" EQUAL "-1")
message(FATAL_ERROR "MUI_HEADERIMAGE_BITMAP not found in the project")
endif()
+
+file(STRINGS "${project_file}" line REGEX "^ManifestDPIAware true")
+string(FIND "${line}" "true" output_index)
+if("${output_index}" EQUAL "-1")
+ message(FATAL_ERROR "ManifestDPIAware true not found in the project")
+else()
+ message(STATUS "Found DPI-aware")
+endif()
diff --git a/Tests/CPackWiXGenerator/myotherapp.cpp b/Tests/CPackWiXGenerator/myotherapp.cpp
index 0eefc1c..5047a34 100644
--- a/Tests/CPackWiXGenerator/myotherapp.cpp
+++ b/Tests/CPackWiXGenerator/myotherapp.cpp
@@ -1,3 +1,3 @@
int main()
{
-} \ No newline at end of file
+}
diff --git a/Tests/CSharpOnly/CMakeLists.txt b/Tests/CSharpOnly/CMakeLists.txt
index 82049c7..42cbe2e 100644
--- a/Tests/CSharpOnly/CMakeLists.txt
+++ b/Tests/CSharpOnly/CMakeLists.txt
@@ -2,7 +2,9 @@
project (CSharpOnly CSharp)
# C# does not make any difference between STATIC and SHARED libs
-add_library(lib1 STATIC lib1.cs)
+add_library(lib1 STATIC lib1.cs nested/lib1.cs)
+#without the source group this test will fail to compile
+source_group(nested FILES nested/lib1.cs)
add_library(lib2 SHARED lib2.cs)
add_executable(CSharpOnly csharponly.cs)
diff --git a/Tests/CSharpOnly/csharponly.cs b/Tests/CSharpOnly/csharponly.cs
index ad4641a..3890c82 100644
--- a/Tests/CSharpOnly/csharponly.cs
+++ b/Tests/CSharpOnly/csharponly.cs
@@ -5,10 +5,8 @@ namespace CSharpOnly
public static void Main(string[] args)
{
int val = Lib1.getResult();
-
Lib2 l = new Lib2();
- val = l.myVal;
-
+ val = val + l.myVal + nested.Lib1.getResult();
return;
}
}
diff --git a/Tests/CSharpOnly/nested/lib1.cs b/Tests/CSharpOnly/nested/lib1.cs
new file mode 100644
index 0000000..c2fde4b
--- /dev/null
+++ b/Tests/CSharpOnly/nested/lib1.cs
@@ -0,0 +1,13 @@
+namespace CSharpOnly
+{
+ namespace nested
+ {
+ public class Lib1
+ {
+ public static int getResult()
+ {
+ return 23;
+ }
+ }
+ }
+}
diff --git a/Tests/CTestCoverageCollectGCOV/test.cmake.in b/Tests/CTestCoverageCollectGCOV/test.cmake.in
index 2c98876..1818888 100644
--- a/Tests/CTestCoverageCollectGCOV/test.cmake.in
+++ b/Tests/CTestCoverageCollectGCOV/test.cmake.in
@@ -3,13 +3,15 @@ set(CTEST_SOURCE_DIRECTORY "@CMake_SOURCE_DIR@/Tests/CTestCoverageCollectGCOV/Te
set(CTEST_BINARY_DIRECTORY "@CMake_BINARY_DIR@/Tests/CTestCoverageCollectGCOV/TestProject")
set(CTEST_CMAKE_GENERATOR "@CMAKE_GENERATOR@")
-ctest_empty_binary_directory(${CTEST_BINARY_DIRECTORY})
-
ctest_start(Experimental)
ctest_configure()
ctest_build()
ctest_test()
+#------------------------------------------------------------------------------#
+# Common setup for all tests.
+#------------------------------------------------------------------------------#
+
list(APPEND CTEST_CUSTOM_COVERAGE_EXCLUDE
"/foo/something"
"/3rdparty/"
@@ -17,15 +19,118 @@ list(APPEND CTEST_CUSTOM_COVERAGE_EXCLUDE
"/CMakeFiles/"
)
list(APPEND CTEST_EXTRA_COVERAGE_GLOB "*.cpp")
-
include(CTestCoverageCollectGCOV)
+set(expected_out
+ CMakeFiles/myexecutable.dir/Labels.json
+ Testing/CoverageInfo/data.json
+ Testing/CoverageInfo/extra.cpp.gcov
+ Testing/CoverageInfo/main.cpp.gcov
+ uncovered/extra/uncovered1.cpp
+ uncovered/uncovered2.cpp
+)
+
+#------------------------------------------------------------------------------#
+# Test 1: with standard arguments
+#------------------------------------------------------------------------------#
+
+set(tar_file ${CTEST_BINARY_DIRECTORY}/gcov.tbz)
+ctest_coverage_collect_gcov(
+ TARBALL "${tar_file}"
+ SOURCE "${CTEST_SOURCE_DIRECTORY}"
+ BUILD "${CTEST_BINARY_DIRECTORY}"
+ GCOV_COMMAND "${CMAKE_COMMAND}"
+ GCOV_OPTIONS -P "@CMake_SOURCE_DIR@/Tests/CTestCoverageCollectGCOV/fakegcov.cmake")
+file(REMOVE_RECURSE "${CTEST_BINARY_DIRECTORY}/uncovered")
+
+execute_process(COMMAND
+ ${CMAKE_COMMAND} -E tar tf ${tar_file}
+ OUTPUT_VARIABLE out
+ WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+)
+
+string(REPLACE "\n" ";" out "${out}")
+list(SORT out)
+
+if("${out}" STREQUAL "${expected_out}")
+ message("PASSED with correct output: ${out}")
+else()
+ message(FATAL_ERROR "FAILED: expected:\n${expected_out}\nGot:\n${out}")
+endif()
+
+#------------------------------------------------------------------------------#
+# Test 2: with optional argument: TARBALL_COMPRESSION "GZIP"
+#------------------------------------------------------------------------------#
+
+set(tar_file ${CTEST_BINARY_DIRECTORY}/gcov.tgz)
+ctest_coverage_collect_gcov(
+ TARBALL "${tar_file}"
+ TARBALL_COMPRESSION "GZIP"
+ SOURCE "${CTEST_SOURCE_DIRECTORY}"
+ BUILD "${CTEST_BINARY_DIRECTORY}"
+ GCOV_COMMAND "${CMAKE_COMMAND}"
+ GCOV_OPTIONS -P "@CMake_SOURCE_DIR@/Tests/CTestCoverageCollectGCOV/fakegcov.cmake")
+file(REMOVE_RECURSE "${CTEST_BINARY_DIRECTORY}/uncovered")
+
+execute_process(COMMAND
+ ${CMAKE_COMMAND} -E tar tf ${tar_file}
+ OUTPUT_VARIABLE out
+ WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+)
+
+string(REPLACE "\n" ";" out "${out}")
+list(SORT out)
+
+if("${out}" STREQUAL "${expected_out}")
+ message("PASSED with correct output: ${out}")
+else()
+ message(FATAL_ERROR "FAILED: expected:\n${expected_out}\nGot:\n${out}")
+endif()
+
+#------------------------------------------------------------------------------#
+# Test 3: with optional argument: TARBALL_COMPRESSION "FROM_EXT"
+#------------------------------------------------------------------------------#
+
+set(tar_file ${CTEST_BINARY_DIRECTORY}/gcov.txz)
+ctest_coverage_collect_gcov(
+ TARBALL "${tar_file}"
+ TARBALL_COMPRESSION "FROM_EXT"
+ SOURCE "${CTEST_SOURCE_DIRECTORY}"
+ BUILD "${CTEST_BINARY_DIRECTORY}"
+ GCOV_COMMAND "${CMAKE_COMMAND}"
+ GCOV_OPTIONS -P "@CMake_SOURCE_DIR@/Tests/CTestCoverageCollectGCOV/fakegcov.cmake")
+file(REMOVE_RECURSE "${CTEST_BINARY_DIRECTORY}/uncovered")
+
+execute_process(COMMAND
+ ${CMAKE_COMMAND} -E tar tf ${tar_file}
+ OUTPUT_VARIABLE out
+ WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+)
+
+string(REPLACE "\n" ";" out "${out}")
+list(SORT out)
+
+if("${out}" STREQUAL "${expected_out}")
+ message("PASSED with correct output: ${out}")
+else()
+ message(FATAL_ERROR "FAILED: expected:\n${expected_out}\nGot:\n${out}")
+endif()
+
+#------------------------------------------------------------------------------#
+# Test 4: with optional argument: TARBALL_COMPRESSION "FALSE"
+#------------------------------------------------------------------------------#
+
set(tar_file ${CTEST_BINARY_DIRECTORY}/gcov.tar)
ctest_coverage_collect_gcov(
TARBALL "${tar_file}"
+ TARBALL_COMPRESSION "FALSE"
SOURCE "${CTEST_SOURCE_DIRECTORY}"
BUILD "${CTEST_BINARY_DIRECTORY}"
GCOV_COMMAND "${CMAKE_COMMAND}"
GCOV_OPTIONS -P "@CMake_SOURCE_DIR@/Tests/CTestCoverageCollectGCOV/fakegcov.cmake")
+file(REMOVE_RECURSE "${CTEST_BINARY_DIRECTORY}/uncovered")
execute_process(COMMAND
${CMAKE_COMMAND} -E tar tf ${tar_file}
@@ -37,15 +142,36 @@ execute_process(COMMAND
string(REPLACE "\n" ";" out "${out}")
list(SORT out)
-set(expected_out
- CMakeFiles/myexecutable.dir/Labels.json
- Testing/CoverageInfo/data.json
- Testing/CoverageInfo/extra.cpp.gcov
- Testing/CoverageInfo/main.cpp.gcov
- uncovered/extra/uncovered1.cpp
- uncovered/uncovered2.cpp
+if("${out}" STREQUAL "${expected_out}")
+ message("PASSED with correct output: ${out}")
+else()
+ message(FATAL_ERROR "FAILED: expected:\n${expected_out}\nGot:\n${out}")
+endif()
+
+#------------------------------------------------------------------------------#
+# Test 5: with optional argument: TARBALL_COMPRESSION "ZSTD"
+#------------------------------------------------------------------------------#
+
+set(tar_file ${CTEST_BINARY_DIRECTORY}/gcov.zstd)
+ctest_coverage_collect_gcov(
+ TARBALL "${tar_file}"
+ TARBALL_COMPRESSION "ZSTD"
+ SOURCE "${CTEST_SOURCE_DIRECTORY}"
+ BUILD "${CTEST_BINARY_DIRECTORY}"
+ GCOV_COMMAND "${CMAKE_COMMAND}"
+ GCOV_OPTIONS -P "@CMake_SOURCE_DIR@/Tests/CTestCoverageCollectGCOV/fakegcov.cmake")
+file(REMOVE_RECURSE "${CTEST_BINARY_DIRECTORY}/uncovered")
+
+execute_process(COMMAND
+ ${CMAKE_COMMAND} -E tar tf ${tar_file}
+ OUTPUT_VARIABLE out
+ WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
+ OUTPUT_STRIP_TRAILING_WHITESPACE
)
+string(REPLACE "\n" ";" out "${out}")
+list(SORT out)
+
if("${out}" STREQUAL "${expected_out}")
message("PASSED with correct output: ${out}")
else()
diff --git a/Tests/ConfigSources/CMakeLists.txt b/Tests/ConfigSources/CMakeLists.txt
index f5dd276..6e69e8b 100644
--- a/Tests/ConfigSources/CMakeLists.txt
+++ b/Tests/ConfigSources/CMakeLists.txt
@@ -1,6 +1,17 @@
cmake_minimum_required(VERSION 3.0)
+get_property(_isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
+if(NOT _isMultiConfig AND NOT CMAKE_BUILD_TYPE)
+ set(CMAKE_BUILD_TYPE Debug CACHE STRING "Choose the type of build")
+endif()
project(ConfigSources CXX)
+# Source file(s) named with the configuration(s).
+file(GENERATE
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/config_$<CONFIG>.cpp"
+ CONTENT "void config_$<CONFIG>() {}\n"
+ )
+
+# Per-config sources via INTERFACE_SOURCES.
add_library(iface INTERFACE)
target_sources(iface INTERFACE
"${CMAKE_CURRENT_SOURCE_DIR}/iface_src.cpp"
@@ -12,10 +23,56 @@ target_compile_definitions(iface INTERFACE
"$<$<CONFIG:Debug>:CFG_DEBUG>"
"$<$<NOT:$<CONFIG:Debug>>:CFG_OTHER>"
)
-
add_executable(ConfigSources
$<$<CONFIG:Debug>:main_debug.cpp>
$<$<NOT:$<CONFIG:Debug>>:main_other.cpp>
$<$<CONFIG:NotAConfig>:does_not_exist.cpp>
+ ${CMAKE_CURRENT_BINARY_DIR}/config_$<CONFIG>.cpp
)
target_link_libraries(ConfigSources iface)
+
+# Per-config sources via LINK_LIBRARIES.
+add_library(iface_debug INTERFACE)
+target_sources(iface_debug INTERFACE
+ "${CMAKE_CURRENT_SOURCE_DIR}/iface_src.cpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/iface_debug_src.cpp"
+ )
+add_library(iface_other INTERFACE)
+target_sources(iface_other INTERFACE
+ "${CMAKE_CURRENT_SOURCE_DIR}/iface_src.cpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/iface_other_src.cpp"
+ )
+add_executable(ConfigSourcesLink main.cpp)
+target_compile_definitions(ConfigSourcesLink PRIVATE
+ "$<$<CONFIG:Debug>:CFG_DEBUG>"
+ "$<$<NOT:$<CONFIG:Debug>>:CFG_OTHER>"
+ )
+target_link_libraries(ConfigSourcesLink PRIVATE
+ "$<$<CONFIG:Debug>:iface_debug>"
+ "$<$<NOT:$<CONFIG:Debug>>:iface_other>"
+ "$<$<CONFIG:NotAConfig>:iface_does_not_exist>"
+ )
+
+# Per-config sources via INTERFACE_LINK_LIBRARIES.
+add_library(ConfigSourcesIface INTERFACE)
+target_link_libraries(ConfigSourcesIface INTERFACE
+ "$<$<CONFIG:Debug>:iface_debug>"
+ "$<$<NOT:$<CONFIG:Debug>>:iface_other>"
+ "$<$<CONFIG:NotAConfig>:iface_does_not_exist>"
+ )
+add_executable(ConfigSourcesLinkIface main.cpp)
+target_compile_definitions(ConfigSourcesLinkIface PRIVATE
+ "$<$<CONFIG:Debug>:CFG_DEBUG>"
+ "$<$<NOT:$<CONFIG:Debug>>:CFG_OTHER>"
+ )
+target_link_libraries(ConfigSourcesLinkIface ConfigSourcesIface)
+
+# A target with sources in only one configuration that is not the
+# first in CMAKE_CONFIGURATION_TYPES.
+if(CMAKE_CONFIGURATION_TYPES MATCHES ";([^;]+)")
+ set(one_config "${CMAKE_MATCH_1}")
+else()
+ set(one_config "${CMAKE_BUILD_TYPE}")
+endif()
+add_library(OneConfigOnly OBJECT "$<$<CONFIG:${one_config}>:${CMAKE_CURRENT_SOURCE_DIR}/iface_src.cpp>")
+set_property(TARGET OneConfigOnly PROPERTY LINKER_LANGUAGE CXX)
diff --git a/Tests/ConfigSources/main.cpp b/Tests/ConfigSources/main.cpp
new file mode 100644
index 0000000..c1cd3b2
--- /dev/null
+++ b/Tests/ConfigSources/main.cpp
@@ -0,0 +1,9 @@
+#if !defined(CFG_DEBUG) && !defined(CFG_OTHER)
+# error "Neither CFG_DEBUG or CFG_OTHER is defined."
+#endif
+#ifdef CFG_DEBUG
+# include "main_debug.cpp"
+#endif
+#ifdef CFG_OTHER
+# include "main_other.cpp"
+#endif
diff --git a/Tests/Contracts/VTK/Dashboard.cmake.in b/Tests/Contracts/VTK/Dashboard.cmake.in
index c3d10f4..ae760bc 100644
--- a/Tests/Contracts/VTK/Dashboard.cmake.in
+++ b/Tests/Contracts/VTK/Dashboard.cmake.in
@@ -24,8 +24,8 @@ set(CTEST_BUILD_COMMAND "@CMAKE_MAKE_PROGRAM@ -j9 -i")
ctest_empty_binary_directory(${CTEST_BINARY_DIRECTORY})
file(WRITE "${CTEST_BINARY_DIRECTORY}/CMakeCache.txt" "
- BUILD_EXAMPLES:BOOL=ON
- BUILD_TESTING:BOOL=ON
+ VTK_BUILD_EXAMPLES:BOOL=ON
+ VTK_BUILD_TESTING:STRING=WANT
VTK_WRAP_PYTHON:BOOL=ON
ExternalData_OBJECT_STORES:FILEPATH=@base_dir@/ExternalData
")
diff --git a/Tests/Cuda/CMakeLists.txt b/Tests/Cuda/CMakeLists.txt
index 58b9b03..630cea2 100644
--- a/Tests/Cuda/CMakeLists.txt
+++ b/Tests/Cuda/CMakeLists.txt
@@ -1,5 +1,4 @@
-ADD_TEST_MACRO(Cuda.Complex CudaComplex)
ADD_TEST_MACRO(Cuda.ConsumeCompileFeatures CudaConsumeCompileFeatures)
ADD_TEST_MACRO(Cuda.CXXStandardSetTwice CXXStandardSetTwice)
ADD_TEST_MACRO(Cuda.ObjectLibrary CudaObjectLibrary)
@@ -12,10 +11,16 @@ ADD_TEST_MACRO(Cuda.NotEnabled CudaNotEnabled)
ADD_TEST_MACRO(Cuda.SeparableCompCXXOnly SeparableCompCXXOnly)
ADD_TEST_MACRO(Cuda.Toolkit Toolkit)
ADD_TEST_MACRO(Cuda.IncludePathNoToolkit IncludePathNoToolkit)
-ADD_TEST_MACRO(Cuda.ProperDeviceLibraries ProperDeviceLibraries)
-ADD_TEST_MACRO(Cuda.ProperLinkFlags ProperLinkFlags)
ADD_TEST_MACRO(Cuda.SharedRuntimePlusToolkit SharedRuntimePlusToolkit)
+# Separable compilation is currently only supported on NVCC. Disable tests
+# using it for other compilers.
+if(CMake_TEST_CUDA AND NOT CMake_TEST_CUDA STREQUAL "Clang")
+ ADD_TEST_MACRO(Cuda.Complex CudaComplex)
+ ADD_TEST_MACRO(Cuda.ProperDeviceLibraries ProperDeviceLibraries)
+ ADD_TEST_MACRO(Cuda.ProperLinkFlags ProperLinkFlags)
+endif()
+
# The CUDA only ships the shared version of the toolkit libraries
# on windows
if(NOT WIN32)
diff --git a/Tests/Cuda/CXXStandardSetTwice/CMakeLists.txt b/Tests/Cuda/CXXStandardSetTwice/CMakeLists.txt
index 1941c49..f4ad83a 100644
--- a/Tests/Cuda/CXXStandardSetTwice/CMakeLists.txt
+++ b/Tests/Cuda/CXXStandardSetTwice/CMakeLists.txt
@@ -1,9 +1,8 @@
cmake_minimum_required(VERSION 3.7)
project(CXXStandardSetTwice CXX CUDA)
-string(APPEND CMAKE_CUDA_FLAGS " -gencode arch=compute_30,code=compute_30")
-
set(CMAKE_CXX_STANDARD 11)
+set(CMAKE_CUDA_ARCHITECTURES 30)
add_executable(CXXStandardSetTwice main.cu)
target_compile_features(CXXStandardSetTwice PUBLIC cxx_std_11)
diff --git a/Tests/Cuda/Complex/CMakeLists.txt b/Tests/Cuda/Complex/CMakeLists.txt
index 08d1e16..265bd85 100644
--- a/Tests/Cuda/Complex/CMakeLists.txt
+++ b/Tests/Cuda/Complex/CMakeLists.txt
@@ -15,7 +15,7 @@ project (Complex CXX CUDA)
#and also building cpp targets that need cuda implicit libraries
#verify that we can pass explicit cuda arch flags
-string(APPEND CMAKE_CUDA_FLAGS " -gencode arch=compute_30,code=compute_30")
+set(CMAKE_CUDA_ARCHITECTURES 30)
set(CMAKE_CUDA_STANDARD 11)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CUDA_STANDARD_REQUIRED TRUE)
diff --git a/Tests/Cuda/MixedStandardLevels1/CMakeLists.txt b/Tests/Cuda/MixedStandardLevels1/CMakeLists.txt
index b03e51e..e40ffa6 100644
--- a/Tests/Cuda/MixedStandardLevels1/CMakeLists.txt
+++ b/Tests/Cuda/MixedStandardLevels1/CMakeLists.txt
@@ -1,10 +1,9 @@
cmake_minimum_required(VERSION 3.7)
project(MixedStandardLevels1 CXX CUDA)
-string(APPEND CMAKE_CUDA_FLAGS " -gencode arch=compute_30,code=compute_30")
-
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CUDA_STANDARD 11)
+set(CMAKE_CUDA_ARCHITECTURES 30)
add_executable(MixedStandardLevels1 main.cu lib.cpp)
diff --git a/Tests/Cuda/MixedStandardLevels2/CMakeLists.txt b/Tests/Cuda/MixedStandardLevels2/CMakeLists.txt
index 12dd328..7af8081 100644
--- a/Tests/Cuda/MixedStandardLevels2/CMakeLists.txt
+++ b/Tests/Cuda/MixedStandardLevels2/CMakeLists.txt
@@ -1,9 +1,8 @@
cmake_minimum_required(VERSION 3.7)
project(MixedStandardLevels2 CXX CUDA)
-string(APPEND CMAKE_CUDA_FLAGS " -gencode arch=compute_30,code=compute_30")
-
set(CMAKE_CXX_STANDARD 17) #this can decay
+set(CMAKE_CUDA_ARCHITECTURES 30)
add_executable(MixedStandardLevels2 main.cu lib.cpp)
target_compile_features(MixedStandardLevels2 PUBLIC cuda_std_11)
diff --git a/Tests/Cuda/MixedStandardLevels3/CMakeLists.txt b/Tests/Cuda/MixedStandardLevels3/CMakeLists.txt
index 2b611be..2c42003 100644
--- a/Tests/Cuda/MixedStandardLevels3/CMakeLists.txt
+++ b/Tests/Cuda/MixedStandardLevels3/CMakeLists.txt
@@ -1,7 +1,7 @@
cmake_minimum_required(VERSION 3.7)
project(MixedStandardLevels3 CXX CUDA)
-string(APPEND CMAKE_CUDA_FLAGS " -gencode arch=compute_30,code=compute_30")
+set(CMAKE_CUDA_ARCHITECTURES 30)
add_executable(MixedStandardLevels3 main.cu lib.cpp)
target_compile_features(MixedStandardLevels3 PUBLIC cuda_std_03 cxx_std_14)
diff --git a/Tests/Cuda/MixedStandardLevels4/CMakeLists.txt b/Tests/Cuda/MixedStandardLevels4/CMakeLists.txt
index faf6869..230230d 100644
--- a/Tests/Cuda/MixedStandardLevels4/CMakeLists.txt
+++ b/Tests/Cuda/MixedStandardLevels4/CMakeLists.txt
@@ -1,9 +1,8 @@
cmake_minimum_required(VERSION 3.7)
project(MixedStandardLevels4 CXX CUDA)
-string(APPEND CMAKE_CUDA_FLAGS " -gencode arch=compute_30,code=compute_30")
-
set(CMAKE_CUDA_STANDARD 03)
+set(CMAKE_CUDA_ARCHITECTURES 30)
add_executable(MixedStandardLevels4 main.cu lib.cpp)
target_compile_features(MixedStandardLevels4 PUBLIC cxx_std_14)
diff --git a/Tests/Cuda/MixedStandardLevels5/CMakeLists.txt b/Tests/Cuda/MixedStandardLevels5/CMakeLists.txt
index 7209f60..5f5ee06 100644
--- a/Tests/Cuda/MixedStandardLevels5/CMakeLists.txt
+++ b/Tests/Cuda/MixedStandardLevels5/CMakeLists.txt
@@ -1,9 +1,8 @@
cmake_minimum_required(VERSION 3.7)
project(MixedStandardLevels5 CXX CUDA)
-string(APPEND CMAKE_CUDA_FLAGS " -gencode arch=compute_30,code=compute_30")
-
set(CMAKE_CXX_STANDARD 98)
+set(CMAKE_CUDA_ARCHITECTURES 30)
add_executable(MixedStandardLevels5 main.cu lib.cpp)
diff --git a/Tests/Cuda/ProperDeviceLibraries/CMakeLists.txt b/Tests/Cuda/ProperDeviceLibraries/CMakeLists.txt
index cb47b09..fe28c3e 100644
--- a/Tests/Cuda/ProperDeviceLibraries/CMakeLists.txt
+++ b/Tests/Cuda/ProperDeviceLibraries/CMakeLists.txt
@@ -1,8 +1,8 @@
cmake_minimum_required(VERSION 3.13)
project(ProperDeviceLibraries CXX CUDA)
-string(APPEND CMAKE_CUDA_FLAGS " -gencode arch=compute_35,code=compute_35 -gencode arch=compute_35,code=sm_35")
set(CMAKE_CUDA_STANDARD 11)
+set(CMAKE_CUDA_ARCHITECTURES 35)
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads)
diff --git a/Tests/Cuda/ProperLinkFlags/CMakeLists.txt b/Tests/Cuda/ProperLinkFlags/CMakeLists.txt
index b6e0e39..d38da6d 100644
--- a/Tests/Cuda/ProperLinkFlags/CMakeLists.txt
+++ b/Tests/Cuda/ProperLinkFlags/CMakeLists.txt
@@ -9,11 +9,17 @@ project (ProperLinkFlags CUDA CXX)
#Specify a set of valid CUDA flags and an invalid set of CXX flags ( for CUDA )
#to make sure we don't use the CXX flags when linking CUDA executables
-string(APPEND CMAKE_CUDA_FLAGS " -arch=sm_35 --use_fast_math")
+if(CMAKE_CUDA_COMPILER_ID STREQUAL "NVIDIA")
+ string(APPEND CMAKE_CUDA_FLAGS "--use_fast_math")
+elseif(CMAKE_CUDA_COMPILER_ID STREQUAL "Clang")
+ string(APPEND CMAKE_CUDA_FLAGS "-ffast-math")
+endif()
+
set(CMAKE_CXX_FLAGS "-Wall")
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CUDA_STANDARD 11)
+set(CMAKE_CUDA_ARCHITECTURES 35)
add_executable(ProperLinkFlags file1.cu main.cxx)
set_target_properties( ProperLinkFlags
diff --git a/Tests/Cuda/WithC/CMakeLists.txt b/Tests/Cuda/WithC/CMakeLists.txt
index 69aa3f9..049cbce 100644
--- a/Tests/Cuda/WithC/CMakeLists.txt
+++ b/Tests/Cuda/WithC/CMakeLists.txt
@@ -1,7 +1,7 @@
cmake_minimum_required(VERSION 3.7)
project(WithC CUDA C)
-string(APPEND CMAKE_CUDA_FLAGS " -gencode arch=compute_30,code=compute_30")
+set(CMAKE_CUDA_ARCHITECTURES 30)
add_executable(CudaWithC main.c cuda.cu)
diff --git a/Tests/CudaOnly/Architecture/CMakeLists.txt b/Tests/CudaOnly/Architecture/CMakeLists.txt
new file mode 100644
index 0000000..7270b56
--- /dev/null
+++ b/Tests/CudaOnly/Architecture/CMakeLists.txt
@@ -0,0 +1,5 @@
+cmake_minimum_required(VERSION 3.17)
+project(Architecture CUDA)
+
+set(CMAKE_CUDA_ARCHITECTURES 52)
+add_executable(Architecture main.cu)
diff --git a/Tests/CudaOnly/Architecture/main.cu b/Tests/CudaOnly/Architecture/main.cu
new file mode 100644
index 0000000..8c817d5
--- /dev/null
+++ b/Tests/CudaOnly/Architecture/main.cu
@@ -0,0 +1,9 @@
+#ifdef __CUDA_ARCH__
+# if __CUDA_ARCH__ != 520
+# error "Passed architecture 52, but got something else."
+# endif
+#endif
+
+int main()
+{
+}
diff --git a/Tests/CudaOnly/CMakeLists.txt b/Tests/CudaOnly/CMakeLists.txt
index 3e3e44c..8244b91 100644
--- a/Tests/CudaOnly/CMakeLists.txt
+++ b/Tests/CudaOnly/CMakeLists.txt
@@ -1,16 +1,37 @@
-ADD_TEST_MACRO(CudaOnly.CircularLinkLine CudaOnlyCircularLinkLine)
+ADD_TEST_MACRO(CudaOnly.Architecture Architecture)
+ADD_TEST_MACRO(CudaOnly.CompileFlags CudaOnlyCompileFlags)
ADD_TEST_MACRO(CudaOnly.EnableStandard CudaOnlyEnableStandard)
ADD_TEST_MACRO(CudaOnly.ExportPTX CudaOnlyExportPTX)
-ADD_TEST_MACRO(CudaOnly.GPUDebugFlag CudaOnlyGPUDebugFlag)
-ADD_TEST_MACRO(CudaOnly.ResolveDeviceSymbols CudaOnlyResolveDeviceSymbols)
-ADD_TEST_MACRO(CudaOnly.SeparateCompilation CudaOnlySeparateCompilation)
ADD_TEST_MACRO(CudaOnly.SharedRuntimePlusToolkit CudaOnlySharedRuntimePlusToolkit)
-ADD_TEST_MACRO(CudaOnly.SharedRuntimeViaCUDAFlags CudaOnlySharedRuntimeViaCUDAFlags)
ADD_TEST_MACRO(CudaOnly.Standard98 CudaOnlyStandard98)
ADD_TEST_MACRO(CudaOnly.Toolkit CudaOnlyToolkit)
ADD_TEST_MACRO(CudaOnly.WithDefs CudaOnlyWithDefs)
+if(CMake_TEST_CUDA AND NOT CMake_TEST_CUDA STREQUAL "Clang")
+ ADD_TEST_MACRO(CudaOnly.SharedRuntimeViaCUDAFlags CudaOnlySharedRuntimeViaCUDAFlags)
+
+ # Separable compilation is currently only supported on NVCC. Disable tests
+ # using it for other compilers.
+ ADD_TEST_MACRO(CudaOnly.CircularLinkLine CudaOnlyCircularLinkLine)
+ ADD_TEST_MACRO(CudaOnly.ResolveDeviceSymbols CudaOnlyResolveDeviceSymbols)
+ ADD_TEST_MACRO(CudaOnly.SeparateCompilation CudaOnlySeparateCompilation)
+
+ add_test(NAME CudaOnly.DontResolveDeviceSymbols COMMAND
+ ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
+ --build-and-test
+ "${CMAKE_CURRENT_SOURCE_DIR}/DontResolveDeviceSymbols/"
+ "${CMAKE_CURRENT_BINARY_DIR}/DontResolveDeviceSymbols/"
+ ${build_generator_args}
+ --build-project DontResolveDeviceSymbols
+ --build-options ${build_options}
+ --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
+ )
+
+ # Only NVCC defines __CUDACC_DEBUG__ when compiling in debug mode.
+ ADD_TEST_MACRO(CudaOnly.GPUDebugFlag CudaOnlyGPUDebugFlag)
+endif()
+
# The CUDA only ships the shared version of the toolkit libraries
# on windows
if(NOT WIN32)
@@ -21,17 +42,6 @@ if(MSVC)
ADD_TEST_MACRO(CudaOnly.PDB CudaOnlyPDB)
endif()
-add_test(NAME CudaOnly.DontResolveDeviceSymbols COMMAND
- ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
- --build-and-test
- "${CMAKE_CURRENT_SOURCE_DIR}/DontResolveDeviceSymbols/"
- "${CMAKE_CURRENT_BINARY_DIR}/DontResolveDeviceSymbols/"
- ${build_generator_args}
- --build-project DontResolveDeviceSymbols
- --build-options ${build_options}
- --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
- )
-
add_test(NAME CudaOnly.RuntimeControls COMMAND
${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
--build-and-test
diff --git a/Tests/CudaOnly/CircularLinkLine/CMakeLists.txt b/Tests/CudaOnly/CircularLinkLine/CMakeLists.txt
index 5e6f7ab..e10a348 100644
--- a/Tests/CudaOnly/CircularLinkLine/CMakeLists.txt
+++ b/Tests/CudaOnly/CircularLinkLine/CMakeLists.txt
@@ -5,9 +5,9 @@ project (CircularLinkLine CUDA)
# Verify that we de-duplicate the device link line
# Verify that a de-duplicated link line still works with circular static libraries
-string(APPEND CMAKE_CUDA_FLAGS " -gencode arch=compute_30,code=[compute_30]")
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CUDA_STANDARD 11)
+set(CMAKE_CUDA_ARCHITECTURES 30)
add_library(CUDACircularDeviceLinking1 STATIC file1.cu)
add_library(CUDACircularDeviceLinking2 STATIC file2.cu)
diff --git a/Tests/CudaOnly/CompileFlags/CMakeLists.txt b/Tests/CudaOnly/CompileFlags/CMakeLists.txt
new file mode 100644
index 0000000..5e8a8e4
--- /dev/null
+++ b/Tests/CudaOnly/CompileFlags/CMakeLists.txt
@@ -0,0 +1,15 @@
+cmake_minimum_required(VERSION 3.17)
+project(CompileFlags CUDA)
+
+add_executable(CudaOnlyCompileFlags main.cu)
+
+# Try passing CUDA architecture flags explicitly.
+if(CMAKE_CUDA_COMPILER_ID STREQUAL "NVIDIA")
+ target_compile_options(CudaOnlyCompileFlags PRIVATE
+ -gencode arch=compute_50,code=compute_50
+ )
+else()
+ set_property(TARGET CudaOnlyCompileFlags PROPERTY CUDA_ARCHITECTURES 50-real)
+endif()
+
+target_compile_options(CudaOnlyCompileFlags PRIVATE -DALWAYS_DEFINE)
diff --git a/Tests/CudaOnly/CompileFlags/main.cu b/Tests/CudaOnly/CompileFlags/main.cu
new file mode 100644
index 0000000..999c056
--- /dev/null
+++ b/Tests/CudaOnly/CompileFlags/main.cu
@@ -0,0 +1,13 @@
+#ifdef __CUDA_ARCH__
+# if __CUDA_ARCH__ != 500
+# error "Passed architecture 50, but got something else."
+# endif
+#endif
+
+#ifndef ALWAYS_DEFINE
+# error "ALWAYS_DEFINE not defined!"
+#endif
+
+int main()
+{
+}
diff --git a/Tests/CudaOnly/DontResolveDeviceSymbols/CMakeLists.txt b/Tests/CudaOnly/DontResolveDeviceSymbols/CMakeLists.txt
index 6e3697f..1265660 100644
--- a/Tests/CudaOnly/DontResolveDeviceSymbols/CMakeLists.txt
+++ b/Tests/CudaOnly/DontResolveDeviceSymbols/CMakeLists.txt
@@ -24,9 +24,9 @@ endif()
# Don't resolve the device symbols in the static library
# Don't resolve the device symbols in the executable library
# Verify that we can't use those device symbols from anything
-string(APPEND CMAKE_CUDA_FLAGS " -gencode arch=compute_30,code=[compute_30] -gencode arch=compute_50,code=\\\"compute_50\\\"")
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CUDA_STANDARD 11)
+set(CMAKE_CUDA_ARCHITECTURES 30 50)
set(CMAKE_CUDA_RESOLVE_DEVICE_SYMBOLS OFF)
add_library(CUDANoDeviceResolve SHARED file1.cu)
diff --git a/Tests/CudaOnly/ExportPTX/CMakeLists.txt b/Tests/CudaOnly/ExportPTX/CMakeLists.txt
index ff6e77c..ee5f54d 100644
--- a/Tests/CudaOnly/ExportPTX/CMakeLists.txt
+++ b/Tests/CudaOnly/ExportPTX/CMakeLists.txt
@@ -34,16 +34,15 @@ static std::string ptx_paths = "$<TARGET_OBJECTS:CudaPTX>";
# need to also pass the --name option
set(output_file ${CMAKE_CURRENT_BINARY_DIR}/embedded_objs.h)
-get_filename_component(cuda_compiler_bin "${CMAKE_CUDA_COMPILER}" DIRECTORY)
+find_package(CUDAToolkit REQUIRED)
find_program(bin_to_c
NAMES bin2c
- PATHS ${cuda_compiler_bin}
+ PATHS ${CUDAToolkit_BIN_DIR}
)
if(NOT bin_to_c)
message(FATAL_ERROR
"bin2c not found:\n"
- " CMAKE_CUDA_COMPILER='${CMAKE_CUDA_COMPILER}'\n"
- " cuda_compiler_bin='${cuda_compiler_bin}'\n"
+ " CUDAToolkit_BIN_DIR='${CUDAToolkit_BIN_DIR}'\n"
)
endif()
diff --git a/Tests/CudaOnly/GPUDebugFlag/CMakeLists.txt b/Tests/CudaOnly/GPUDebugFlag/CMakeLists.txt
index fbef15f..6675655 100644
--- a/Tests/CudaOnly/GPUDebugFlag/CMakeLists.txt
+++ b/Tests/CudaOnly/GPUDebugFlag/CMakeLists.txt
@@ -2,18 +2,19 @@
cmake_minimum_required(VERSION 3.7)
project (GPUDebugFlag CUDA)
-#Goal for this example:
-#verify that -G enables gpu debug flags
-string(APPEND CMAKE_CUDA_FLAGS " -gencode=arch=compute_30,code=compute_30")
-string(APPEND CMAKE_CUDA_FLAGS " -G")
set(CMAKE_CUDA_STANDARD 11)
+set(CMAKE_CUDA_ARCHITECTURES 30)
+
+# Goal for this example:
+# Verify that enabling device debug works.
+string(APPEND CMAKE_CUDA_FLAGS " -G")
add_executable(CudaOnlyGPUDebugFlag main.cu)
+#CUDA's __CUDACC_DEBUG__ define was added in NVCC 9.0
+#so if we are below 9.0.0 we will manually add the define so that the test
+#passes
if(CMAKE_CUDA_COMPILER_VERSION VERSION_LESS 9.0.0)
- #CUDA's __CUDACC_DEBUG__ define was added in 9.0
- #so if we are below 9.0.0 we will manually add the define so that the test
- #passes
target_compile_definitions(CudaOnlyGPUDebugFlag PRIVATE "__CUDACC_DEBUG__")
endif()
diff --git a/Tests/CudaOnly/ResolveDeviceSymbols/CMakeLists.txt b/Tests/CudaOnly/ResolveDeviceSymbols/CMakeLists.txt
index 57aa0b9..bd94ec8 100644
--- a/Tests/CudaOnly/ResolveDeviceSymbols/CMakeLists.txt
+++ b/Tests/CudaOnly/ResolveDeviceSymbols/CMakeLists.txt
@@ -21,7 +21,7 @@ endif()
# confirming that the first static library is on the device link line
# 3. Verify that we can't use those device symbols from anything that links
# to the static library
-string(APPEND CMAKE_CUDA_FLAGS " -gencode arch=compute_30,code=[sm_30] -gencode arch=compute_50,code=\\\"compute_50\\\"")
+set(CMAKE_CUDA_ARCHITECTURES 30 50)
add_library(CUDAResolveDeviceDepsA STATIC file1.cu)
add_library(CUDAResolveDeviceDepsB STATIC file2.cu)
diff --git a/Tests/CudaOnly/RuntimeControls/CMakeLists.txt b/Tests/CudaOnly/RuntimeControls/CMakeLists.txt
index 8b58fec..0da5739 100644
--- a/Tests/CudaOnly/RuntimeControls/CMakeLists.txt
+++ b/Tests/CudaOnly/RuntimeControls/CMakeLists.txt
@@ -15,9 +15,8 @@ else()
endif()
endif()
-string(APPEND CMAKE_CUDA_FLAGS " -gencode arch=compute_30,code=[compute_30]")
-
set(CMAKE_CUDA_STANDARD 11)
+set(CMAKE_CUDA_ARCHITECTURES 30)
set(CMAKE_CUDA_RUNTIME_LIBRARY static)
if(NOT "x${CMAKE_CUDA_SIMULATE_ID}" STREQUAL "xMSVC")
diff --git a/Tests/CudaOnly/SeparateCompilation/CMakeLists.txt b/Tests/CudaOnly/SeparateCompilation/CMakeLists.txt
index c1bd64a..586be81 100644
--- a/Tests/CudaOnly/SeparateCompilation/CMakeLists.txt
+++ b/Tests/CudaOnly/SeparateCompilation/CMakeLists.txt
@@ -9,9 +9,7 @@ project (SeparateCompilation CUDA)
#and executables.
#We complicate the matter by also testing that multiple static libraries
#all containing cuda separable compilation code links properly
-string(APPEND CMAKE_CUDA_FLAGS " -gencode arch=compute_30,code=\\\"compute_30,sm_30,sm_35\\\"")
-string(APPEND CMAKE_CUDA_FLAGS " --generate-code=arch=compute_50,code=[compute_50,sm_50,sm_52]")
-
+set(CMAKE_CUDA_ARCHITECTURES 30 35 50 52)
set(CMAKE_CUDA_SEPARABLE_COMPILATION ON)
add_library(CUDASeparateLibA STATIC file1.cu file2.cu file3.cu)
target_compile_features(CUDASeparateLibA PRIVATE cuda_std_11)
diff --git a/Tests/CudaOnly/Standard98/CMakeLists.txt b/Tests/CudaOnly/Standard98/CMakeLists.txt
index ef9a685..3ba0360 100644
--- a/Tests/CudaOnly/Standard98/CMakeLists.txt
+++ b/Tests/CudaOnly/Standard98/CMakeLists.txt
@@ -1,7 +1,7 @@
cmake_minimum_required(VERSION 3.7)
project(CudaOnlyStandard98 CUDA)
-string(APPEND CMAKE_CUDA_FLAGS " -gencode arch=compute_30,code=compute_30")
+set(CMAKE_CUDA_ARCHITECTURES 30)
# Support setting CUDA Standard to 98 which internally gets transformed to
# CUDA03
diff --git a/Tests/CudaOnly/WithDefs/CMakeLists.txt b/Tests/CudaOnly/WithDefs/CMakeLists.txt
index ba9bf04..0ed81d8 100644
--- a/Tests/CudaOnly/WithDefs/CMakeLists.txt
+++ b/Tests/CudaOnly/WithDefs/CMakeLists.txt
@@ -3,17 +3,7 @@ cmake_minimum_required(VERSION 3.7)
project (WithDefs CUDA)
#verify that we can pass explicit cuda arch flags
-string(APPEND CMAKE_CUDA_FLAGS " -gencode arch=compute_30,code=compute_30")
-if(CMAKE_CUDA_COMPILER_VERSION VERSION_GREATER_EQUAL 9)
- set(debug_compile_flags --generate-code arch=compute_32,code=sm_32)
-else()
- set(debug_compile_flags --generate-code arch=compute_20,code=sm_20)
-endif()
-if(CMAKE_CUDA_SIMULATE_ID STREQUAL "MSVC")
- list(APPEND debug_compile_flags -Xcompiler=-WX)
-else()
- list(APPEND debug_compile_flags -Xcompiler=-Werror)
-endif()
+set(CMAKE_CUDA_ARCHITECTURES 30)
set(release_compile_defs DEFREL)
#Goal for this example:
@@ -28,8 +18,7 @@ target_compile_options(CudaOnlyWithDefs
PRIVATE
-DFLAG_COMPILE_LANG_$<COMPILE_LANGUAGE>
-DFLAG_LANG_IS_CUDA=$<COMPILE_LANGUAGE:CUDA>
- --compiler-options=-DHOST_DEFINE
- $<$<CONFIG:DEBUG>:$<BUILD_INTERFACE:${debug_compile_flags}>>
+ $<$<CUDA_COMPILER_ID:NVIDIA>:--compiler-options=-DHOST_DEFINE> # Host-only defines are possible only on NVCC.
)
target_compile_definitions(CudaOnlyWithDefs
diff --git a/Tests/CudaOnly/WithDefs/main.notcu b/Tests/CudaOnly/WithDefs/main.notcu
index a5f4ed6..9119eba 100644
--- a/Tests/CudaOnly/WithDefs/main.notcu
+++ b/Tests/CudaOnly/WithDefs/main.notcu
@@ -7,8 +7,10 @@
# error "INC_CUDA not defined!"
#endif
-#ifndef HOST_DEFINE
-# error "HOST_DEFINE not defined!"
+#ifdef __NVCC__
+# ifndef HOST_DEFINE
+# error "HOST_DEFINE not defined!"
+# endif
#endif
#ifndef PACKED_DEFINE
diff --git a/Tests/FindBLAS/CMakeLists.txt b/Tests/FindBLAS/CMakeLists.txt
new file mode 100644
index 0000000..667195d
--- /dev/null
+++ b/Tests/FindBLAS/CMakeLists.txt
@@ -0,0 +1,10 @@
+add_test(NAME FindBLAS.Test COMMAND
+ ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
+ --build-and-test
+ "${CMake_SOURCE_DIR}/Tests/FindBLAS/Test"
+ "${CMake_BINARY_DIR}/Tests/FindBLAS/Test"
+ ${build_generator_args}
+ --build-project TestFindBLAS
+ --build-options ${build_options}
+ --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
+ )
diff --git a/Tests/FindBLAS/Test/CMakeLists.txt b/Tests/FindBLAS/Test/CMakeLists.txt
new file mode 100644
index 0000000..59418f3
--- /dev/null
+++ b/Tests/FindBLAS/Test/CMakeLists.txt
@@ -0,0 +1,13 @@
+cmake_minimum_required(VERSION 3.4)
+project(TestFindBLAS C)
+include(CTest)
+
+find_package(BLAS REQUIRED)
+
+add_executable(test_tgt main.c)
+target_link_libraries(test_tgt BLAS::BLAS)
+add_test(NAME test_tgt COMMAND test_tgt)
+
+add_executable(test_var main.c)
+target_link_libraries(test_var PRIVATE ${BLAS_LIBRARIES})
+add_test(NAME test_var COMMAND test_var)
diff --git a/Tests/FindBLAS/Test/main.c b/Tests/FindBLAS/Test/main.c
new file mode 100644
index 0000000..7360dee
--- /dev/null
+++ b/Tests/FindBLAS/Test/main.c
@@ -0,0 +1,14 @@
+#include <assert.h>
+#include <string.h>
+
+// declare what parts of the blas C-API we need
+void cblas_dswap(const int N, double* X, const int incX, double* Y,
+ const int incY);
+
+int main()
+{
+ double x[4] = { 1, 2, 3, 4 };
+ double y[4] = { 8, 7, 7, 6 };
+ cblas_dswap(4, x, 1, y, 1);
+ return 0;
+}
diff --git a/Tests/FindDoxygen/SimpleTest/CMakeLists.txt b/Tests/FindDoxygen/SimpleTest/CMakeLists.txt
index 332cecc..deec4fd 100644
--- a/Tests/FindDoxygen/SimpleTest/CMakeLists.txt
+++ b/Tests/FindDoxygen/SimpleTest/CMakeLists.txt
@@ -22,6 +22,7 @@ else()
message(FATAL_ERROR "Import target Doxygen::doxygen not defined")
endif()
+set(DOXYGEN_OUTPUT_DIRECTORY noArgs)
doxygen_add_docs(docsNoArgs)
if(NOT EXISTS "${PROJECT_BINARY_DIR}/Doxyfile.docsNoArgs")
message(FATAL_ERROR "Missing generated file: Doxyfile.docsNoArgs")
@@ -30,6 +31,7 @@ if(NOT TARGET docsNoArgs)
message(FATAL_ERROR "Target docsNoArgs not created")
endif()
+set(DOXYGEN_OUTPUT_DIRECTORY withArgs)
configure_file(spaces_in_name.cpp.in "spaces in name.cpp" COPYONLY)
doxygen_add_docs(docsWithArgs
"${CMAKE_CURRENT_BINARY_DIR}/spaces in name.cpp"
diff --git a/Tests/FindDoxygen/StampFile/CMakeLists.txt b/Tests/FindDoxygen/StampFile/CMakeLists.txt
index 2d06540..ed2bfbb 100644
--- a/Tests/FindDoxygen/StampFile/CMakeLists.txt
+++ b/Tests/FindDoxygen/StampFile/CMakeLists.txt
@@ -3,22 +3,41 @@ project(TestFindDoxygen VERSION 1.0 LANGUAGES NONE)
find_package(Doxygen REQUIRED)
+set(DOXYGEN_OUTPUT_DIRECTORY noFiles)
doxygen_add_docs(docsWithoutFilesWithStamp USE_STAMP_FILE)
if(NOT EXISTS "${PROJECT_BINARY_DIR}/Doxyfile.docsWithoutFilesWithStamp")
- message(FATAL_ERROR "Missing generated file: Doxyfile.docsWithoutFilesWithStamp")
+ message(FATAL_ERROR "Missing generated file: Doxyfile.docsWithoutFilesWithStamp")
endif()
if(NOT TARGET docsWithoutFilesWithStamp)
- message(FATAL_ERROR "Target docsWithoutFilesWithStamp not created")
+ message(FATAL_ERROR "Target docsWithoutFilesWithStamp not created")
endif()
+set(DOXYGEN_OUTPUT_DIRECTORY withFiles)
doxygen_add_docs(docsWithFilesWithStamp main.cpp main2.cpp USE_STAMP_FILE)
if(NOT EXISTS "${PROJECT_BINARY_DIR}/Doxyfile.docsWithFilesWithStamp")
- message(FATAL_ERROR "Missing generated file: Doxyfile.docsWithFilesWithStamp")
+ message(FATAL_ERROR "Missing generated file: Doxyfile.docsWithFilesWithStamp")
endif()
if(NOT TARGET docsWithFilesWithStamp)
- message(FATAL_ERROR "Target docsWithFilesWithStamp not created")
+ message(FATAL_ERROR "Target docsWithFilesWithStamp not created")
endif()
+# Confirm that doxygen_add_docs() doesn't cause a fatal error if given a
+# source file that is generated at build time
+file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/genDox.cpp)
+add_custom_command(OUTPUT genDox.cpp
+ COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/main2.cpp genDox.cpp
+ DEPENDS main2.cpp
+)
+set(DOXYGEN_OUTPUT_DIRECTORY withGenFiles)
+doxygen_add_docs(docsWithGenFilesWithStamp
+ main.cpp
+ ${CMAKE_CURRENT_BINARY_DIR}/genDox.cpp
+ USE_STAMP_FILE
+)
add_custom_target(allDocTargets)
-add_dependencies(allDocTargets docsWithoutFilesWithStamp docsWithFilesWithStamp)
+add_dependencies(allDocTargets
+ docsWithoutFilesWithStamp
+ docsWithFilesWithStamp
+ docsWithGenFilesWithStamp
+)
diff --git a/Tests/FindLAPACK/CMakeLists.txt b/Tests/FindLAPACK/CMakeLists.txt
new file mode 100644
index 0000000..2081d59
--- /dev/null
+++ b/Tests/FindLAPACK/CMakeLists.txt
@@ -0,0 +1,10 @@
+add_test(NAME FindLAPACK.Test COMMAND
+ ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
+ --build-and-test
+ "${CMake_SOURCE_DIR}/Tests/FindLAPACK/Test"
+ "${CMake_BINARY_DIR}/Tests/FindLAPACK/Test"
+ ${build_generator_args}
+ --build-project TestFindLAPACK
+ --build-options ${build_options}
+ --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
+ )
diff --git a/Tests/FindLAPACK/Test/CMakeLists.txt b/Tests/FindLAPACK/Test/CMakeLists.txt
new file mode 100644
index 0000000..8afa36a
--- /dev/null
+++ b/Tests/FindLAPACK/Test/CMakeLists.txt
@@ -0,0 +1,13 @@
+cmake_minimum_required(VERSION 3.4)
+project(TestFindLAPACK C)
+include(CTest)
+
+find_package(LAPACK REQUIRED)
+
+add_executable(test_tgt main.c)
+target_link_libraries(test_tgt LAPACK::LAPACK)
+add_test(NAME test_tgt COMMAND test_tgt)
+
+add_executable(test_var main.c)
+target_link_libraries(test_var PRIVATE ${LAPACK_LIBRARIES})
+add_test(NAME test_var COMMAND test_var)
diff --git a/Tests/FindLAPACK/Test/main.c b/Tests/FindLAPACK/Test/main.c
new file mode 100644
index 0000000..5873e7b
--- /dev/null
+++ b/Tests/FindLAPACK/Test/main.c
@@ -0,0 +1,20 @@
+#include <assert.h>
+#include <string.h>
+
+// declare what parts of the lapack C-API we need
+void dgesv_(int*, int*, double*, int*, int*, double*, int*, int*);
+
+int main()
+{
+ double A[8] = {
+ 0, 1, 2, 3, 4, 5, 6, 7,
+ };
+ double B[2] = { 0, 5 };
+ int ipiv[2] = { 0, 0 };
+ int info = 0;
+
+ int dim = 2;
+ int numCols = 1;
+ dgesv_(&dim, &numCols, A, &dim, ipiv, B, &dim, &info);
+ return 0;
+}
diff --git a/Tests/FindLibXslt/CMakeLists.txt b/Tests/FindLibXslt/CMakeLists.txt
new file mode 100644
index 0000000..8a550b2
--- /dev/null
+++ b/Tests/FindLibXslt/CMakeLists.txt
@@ -0,0 +1,10 @@
+add_test(NAME FindLibXslt.Test COMMAND
+ ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
+ --build-and-test
+ "${CMake_SOURCE_DIR}/Tests/FindLibXslt/Test"
+ "${CMake_BINARY_DIR}/Tests/FindLibXslt/Test"
+ ${build_generator_args}
+ --build-project TestFindLibXslt
+ --build-options ${build_options}
+ --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
+)
diff --git a/Tests/FindLibXslt/Test/CMakeLists.txt b/Tests/FindLibXslt/Test/CMakeLists.txt
new file mode 100644
index 0000000..e932661
--- /dev/null
+++ b/Tests/FindLibXslt/Test/CMakeLists.txt
@@ -0,0 +1,45 @@
+cmake_minimum_required(VERSION 3.4)
+project(TestFindLibXslt C)
+include(CTest)
+
+find_package(Iconv)
+find_package(LibXml2 REQUIRED)
+find_package(LibXslt REQUIRED)
+
+add_definitions(-DCMAKE_EXPECTED_LibXslt_VERSION="${LIBXSLT_VERSION_STRING}")
+
+add_executable(libxslt_tgt libxslt.c)
+if(Iconv_FOUND)
+ target_link_libraries(libxslt_tgt Iconv::Iconv)
+endif()
+target_link_libraries(libxslt_tgt LibXml2::LibXml2 LibXslt::LibXslt)
+add_test(NAME libxslt_tgt COMMAND libxslt_tgt)
+
+add_executable(libxslt_var libxslt.c)
+if(Iconv_FOUND)
+ target_include_directories(libxslt_var PRIVATE ${Iconv_INCLUDE_DIRS})
+ target_link_libraries(libxslt_var PRIVATE ${Iconv_LIBRARIES})
+endif()
+target_include_directories(libxslt_var PRIVATE ${LIBXML2_INCLUDE_DIRS} ${LIBXSLT_INCLUDE_DIR})
+target_link_libraries(libxslt_var PRIVATE ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES})
+add_test(NAME libxslt_var COMMAND libxslt_var)
+
+add_executable(libexslt_tgt libexslt.c)
+if(Iconv_FOUND)
+ target_link_libraries(libexslt_tgt Iconv::Iconv)
+endif()
+target_link_libraries(libexslt_tgt LibXml2::LibXml2 LibXslt::LibXslt LibXslt::LibExslt)
+add_test(NAME libexslt_tgt COMMAND libexslt_tgt)
+
+add_executable(libexslt_var libexslt.c)
+if(Iconv_FOUND)
+ target_include_directories(libexslt_var PRIVATE ${Iconv_INCLUDE_DIRS})
+ target_link_libraries(libexslt_var PRIVATE ${Iconv_LIBRARIES})
+endif()
+target_include_directories(libexslt_var PRIVATE ${LIBXML2_INCLUDE_DIRS} ${LIBXSLT_INCLUDE_DIR} ${LIBXSLT_EXSLT_INCLUDE_DIR})
+target_link_libraries(libexslt_var PRIVATE ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${LIBXSLT_EXSLT_LIBRARIES})
+add_test(NAME libexslt_var COMMAND libexslt_var)
+
+add_test(NAME xsltproc_tgt COMMAND LibXslt::xsltproc --version)
+
+add_test(NAME xsltproc_var COMMAND ${LIBXSLT_XSLTPROC_EXECUTABLE} --version)
diff --git a/Tests/FindLibXslt/Test/libexslt.c b/Tests/FindLibXslt/Test/libexslt.c
new file mode 100644
index 0000000..ea6eb3d
--- /dev/null
+++ b/Tests/FindLibXslt/Test/libexslt.c
@@ -0,0 +1,16 @@
+#include <libexslt/exslt.h>
+#include <libxslt/xslt.h>
+#include <libxslt/xsltInternals.h>
+
+int main()
+{
+ xsltInit();
+
+ xsltStylesheet* style = xsltNewStylesheet();
+ exsltRegisterAll();
+ xsltFreeStylesheet(style);
+
+ xsltCleanupGlobals();
+
+ return 0;
+}
diff --git a/Tests/FindLibXslt/Test/libxslt.c b/Tests/FindLibXslt/Test/libxslt.c
new file mode 100644
index 0000000..5b3d766
--- /dev/null
+++ b/Tests/FindLibXslt/Test/libxslt.c
@@ -0,0 +1,24 @@
+#include <libxslt/xslt.h>
+#include <libxslt/xsltInternals.h>
+#include <libxslt/xsltconfig.h>
+#include <stdio.h>
+#include <string.h>
+
+int main()
+{
+ xsltInit();
+
+ xsltStylesheet* style = xsltNewStylesheet();
+ xsltFreeStylesheet(style);
+
+ if (0 != strcmp(CMAKE_EXPECTED_LibXslt_VERSION, LIBXSLT_DOTTED_VERSION)) {
+ printf("CMAKE_EXPECTED_LibXslt_VERSION: '%s'\n",
+ CMAKE_EXPECTED_LibXslt_VERSION);
+ printf("LIBXSLT_DOTTED_VERSION: '%s'\n", LIBXSLT_DOTTED_VERSION);
+ return 1;
+ }
+
+ xsltCleanupGlobals();
+
+ return 0;
+}
diff --git a/Tests/FindPython/ArtifactsInteractive/CMakeLists.txt b/Tests/FindPython/ArtifactsInteractive/CMakeLists.txt
new file mode 100644
index 0000000..524be92
--- /dev/null
+++ b/Tests/FindPython/ArtifactsInteractive/CMakeLists.txt
@@ -0,0 +1,24 @@
+cmake_minimum_required(VERSION 3.1)
+
+project(TestArtifactsInteractive LANGUAGES C)
+
+set (components Interpreter Development)
+if (CMake_TEST_FindPython_NumPy)
+ list (APPEND components NumPy)
+endif()
+
+find_package(Python3 REQUIRED COMPONENTS ${components})
+
+if (Python3_ARTIFACTS_INTERACTIVE)
+ if (NOT DEFINED CACHE{Python3_EXECUTABLE}
+ OR NOT DEFINED CACHE{Python3_LIBRARY} OR NOT DEFINED CACHE{Python3_INCLUDE_DIR}
+ OR (CMake_TEST_FindPython_NumPy AND NOT DEFINED CACHE{Python3_NumPy_INCLUDE_DIR}))
+ message (FATAL_ERROR "Python3_ARTIFACTS_INTERACTIVE=ON Failed.")
+ endif()
+else()
+ if (DEFINED CACHE{Python3_EXECUTABLE}
+ OR DEFINED CACHE{Python3_LIBRARY} OR DEFINED CACHE{Python3_INCLUDE_DIR}
+ OR (CMake_TEST_FindPython_NumPy AND DEFINED CACHE{Python3_NumPy_INCLUDE_DIR}))
+ message (FATAL_ERROR "Python3_ARTIFACTS_INTERACTIVE=OFF Failed.")
+ endif()
+endif()
diff --git a/Tests/FindPython/CMakeLists.txt b/Tests/FindPython/CMakeLists.txt
index 9b89832..fdfa36e 100644
--- a/Tests/FindPython/CMakeLists.txt
+++ b/Tests/FindPython/CMakeLists.txt
@@ -20,6 +20,17 @@ if(CMake_TEST_FindPython)
--test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
)
+ add_test(NAME FindPython.Python2.Development.Module COMMAND
+ ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
+ --build-and-test
+ "${CMake_SOURCE_DIR}/Tests/FindPython/Python2Module"
+ "${CMake_BINARY_DIR}/Tests/FindPython/Python2Module"
+ ${build_generator_args}
+ --build-project TestPython2Module
+ --build-options ${build_options}
+ --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
+ )
+
add_test(NAME FindPython.Python2Fail COMMAND
${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
--build-and-test
@@ -54,6 +65,17 @@ if(CMake_TEST_FindPython)
--test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
)
+ add_test(NAME FindPython.Python3.Development.Module COMMAND
+ ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
+ --build-and-test
+ "${CMake_SOURCE_DIR}/Tests/FindPython/Python3Module"
+ "${CMake_BINARY_DIR}/Tests/FindPython/Python3Module"
+ ${build_generator_args}
+ --build-project TestPython3Module
+ --build-options ${build_options}
+ --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
+ )
+
add_test(NAME FindPython.Python3Fail COMMAND
${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
--build-and-test
@@ -277,6 +299,35 @@ if(CMake_TEST_FindPython)
--test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
)
+ add_test(NAME FindPython.ArtifactsInteractive.ON COMMAND
+ ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
+ --build-and-test
+ "${CMake_SOURCE_DIR}/Tests/FindPython/ArtifactsInteractive"
+ "${CMake_BINARY_DIR}/Tests/FindPython/ArtifactsInteractive.ON"
+ ${build_generator_args}
+ --build-project TestArtifactsScope
+ --build-options ${build_options} "-Dbuild_generator_args=${build_generator_args}"
+ "-DCMake_SOURCE_DIR=${CMake_SOURCE_DIR}"
+ "-DCMake_BINARY_DIR=${CMake_BINARY_DIR}"
+ "-DCMake_TEST_FindPython_NumPy=${CMake_TEST_FindPython_NumPy}"
+ "-DPython3_ARTIFACTS_INTERACTIVE=ON"
+ --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
+ )
+ add_test(NAME FindPython.ArtifactsInteractive.OFF COMMAND
+ ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
+ --build-and-test
+ "${CMake_SOURCE_DIR}/Tests/FindPython/ArtifactsInteractive"
+ "${CMake_BINARY_DIR}/Tests/FindPython/ArtifactsInteractive.OFF"
+ ${build_generator_args}
+ --build-project TestArtifactsScope
+ --build-options ${build_options} "-Dbuild_generator_args=${build_generator_args}"
+ "-DCMake_SOURCE_DIR=${CMake_SOURCE_DIR}"
+ "-DCMake_BINARY_DIR=${CMake_BINARY_DIR}"
+ "-DCMake_TEST_FindPython_NumPy=${CMake_TEST_FindPython_NumPy}"
+ "-DPython3_ARTIFACTS_INTERACTIVE=OFF"
+ --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
+ )
+
add_test(NAME FindPython.CustomFailureMessage COMMAND
${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
--build-and-test
@@ -340,7 +391,6 @@ if(CMake_TEST_FindPython_NumPy)
${build_generator_args}
--build-project TestNumPyOnly
--build-options ${build_options}
- --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
)
endif()
@@ -357,6 +407,29 @@ if(CMake_TEST_FindPython_Conda)
)
endif()
+if (CMake_TEST_FindPython AND CMake_TEST_FindPython_IronPython)
+ add_test(NAME FindPython.Implementation.CPython COMMAND
+ ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
+ --build-and-test
+ "${CMake_SOURCE_DIR}/Tests/FindPython/Implementation"
+ "${CMake_BINARY_DIR}/Tests/FindPython/Implementation.CPython"
+ ${build_generator_args}
+ --build-project TestImplementationCPython
+ --build-options ${build_options} -DPython_REQUESTED_VERSION=2 -DPython_REQUESTED_IMPLEMENTATIONS=CPython
+ --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
+ )
+ add_test(NAME FindPython.Implementation.IronPython COMMAND
+ ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
+ --build-and-test
+ "${CMake_SOURCE_DIR}/Tests/FindPython/Implementation"
+ "${CMake_BINARY_DIR}/Tests/FindPython/Implementation.IronPython"
+ ${build_generator_args}
+ --build-project TestImplementationIronPython
+ --build-options ${build_options} -DPython_REQUESTED_VERSION=2 -DPython_REQUESTED_IMPLEMENTATION=IronPython
+ --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
+ )
+endif()
+
if(CMake_TEST_FindPython_IronPython)
add_test(NAME FindPython.IronPython2.LOCATION COMMAND
${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
@@ -420,3 +493,108 @@ if(CMake_TEST_FindPython_IronPython)
--test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
)
endif()
+
+if(CMake_TEST_FindPython_PyPy)
+ add_test(NAME FindPython.PyPy2.LOCATION COMMAND
+ ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
+ --build-and-test
+ "${CMake_SOURCE_DIR}/Tests/FindPython/PyPy2"
+ "${CMake_BINARY_DIR}/Tests/FindPython/PyPy2.LOCATION"
+ ${build_generator_args}
+ --build-project TestPyPy2
+ --build-options ${build_options} -DPython2_FIND_STRATEGY=LOCATION
+ --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
+ )
+ add_test(NAME FindPython.PyPy2.VERSION COMMAND
+ ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
+ --build-and-test
+ "${CMake_SOURCE_DIR}/Tests/FindPython/PyPy2"
+ "${CMake_BINARY_DIR}/Tests/FindPython/PyPy2.VERSION"
+ ${build_generator_args}
+ --build-project TestPyPy2
+ --build-options ${build_options} -DPython2_FIND_STRATEGY=VERSION
+ --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
+ )
+
+ add_test(NAME FindPython.PyPy3.LOCATION COMMAND
+ ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
+ --build-and-test
+ "${CMake_SOURCE_DIR}/Tests/FindPython/PyPy3"
+ "${CMake_BINARY_DIR}/Tests/FindPython/PyPy3.LOCATION"
+ ${build_generator_args}
+ --build-project TestPyPy3
+ --build-options ${build_options} -DPython3_FIND_STRATEGY=LOCATION
+ --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
+ )
+ add_test(NAME FindPython.PyPy3.VERSION COMMAND
+ ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
+ --build-and-test
+ "${CMake_SOURCE_DIR}/Tests/FindPython/PyPy3"
+ "${CMake_BINARY_DIR}/Tests/FindPython/PyPy3.VERSION"
+ ${build_generator_args}
+ --build-project TestPyPy3
+ --build-options ${build_options} -DPython3_FIND_STRATEGY=VERSION
+ --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
+ )
+
+ add_test(NAME FindPython.PyPy.LOCATION COMMAND
+ ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
+ --build-and-test
+ "${CMake_SOURCE_DIR}/Tests/FindPython/PyPy"
+ "${CMake_BINARY_DIR}/Tests/FindPython/PyPy.LOCATION"
+ ${build_generator_args}
+ --build-project TestPyPy
+ --build-options ${build_options} -DPython_FIND_STRATEGY=LOCATION
+ --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
+ )
+ add_test(NAME FindPython.PyPy.VERSION COMMAND
+ ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
+ --build-and-test
+ "${CMake_SOURCE_DIR}/Tests/FindPython/PyPy"
+ "${CMake_BINARY_DIR}/Tests/FindPython/PyPy.VERSION"
+ ${build_generator_args}
+ --build-project TestPyPy
+ --build-options ${build_options} -DPython_FIND_STRATEGY=VERSION
+ --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
+ )
+ add_test(NAME FindPython.PyPy.V2.LOCATION COMMAND
+ ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
+ --build-and-test
+ "${CMake_SOURCE_DIR}/Tests/FindPython/PyPy"
+ "${CMake_BINARY_DIR}/Tests/FindPython/PyPy.V2.LOCATION"
+ ${build_generator_args}
+ --build-project TestPyPy
+ --build-options ${build_options} -DPython_REQUESTED_VERSION=2 -DPython_FIND_STRATEGY=LOCATION
+ --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
+ )
+ add_test(NAME FindPython.PyPy.V2.VERSION COMMAND
+ ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
+ --build-and-test
+ "${CMake_SOURCE_DIR}/Tests/FindPython/PyPy"
+ "${CMake_BINARY_DIR}/Tests/FindPython/PyPy.V2.VERSION"
+ ${build_generator_args}
+ --build-project TestPyPy
+ --build-options ${build_options} -DPython_REQUESTED_VERSION=2 -DPython_FIND_STRATEGY=VERSION
+ --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
+ )
+ add_test(NAME FindPython.PyPy.V3.LOCATION COMMAND
+ ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
+ --build-and-test
+ "${CMake_SOURCE_DIR}/Tests/FindPython/PyPy"
+ "${CMake_BINARY_DIR}/Tests/FindPython/PyPy.V3.LOCATION"
+ ${build_generator_args}
+ --build-project TestPyPy
+ --build-options ${build_options} -DPython_REQUESTED_VERSION=3 -DPython_FIND_STRATEGY=LOCATION
+ --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
+ )
+ add_test(NAME FindPython.PyPy.V3.VERSION COMMAND
+ ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
+ --build-and-test
+ "${CMake_SOURCE_DIR}/Tests/FindPython/PyPy"
+ "${CMake_BINARY_DIR}/Tests/FindPython/PyPy.V3.VERSION"
+ ${build_generator_args}
+ --build-project TestPyPy
+ --build-options ${build_options} -DPython_REQUESTED_VERSION=3 -DPython_FIND_STRATEGY=VERSION
+ --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
+ )
+endif()
diff --git a/Tests/FindPython/Implementation/CMakeLists.txt b/Tests/FindPython/Implementation/CMakeLists.txt
new file mode 100644
index 0000000..d64fa1e
--- /dev/null
+++ b/Tests/FindPython/Implementation/CMakeLists.txt
@@ -0,0 +1,37 @@
+cmake_minimum_required(VERSION 3.1)
+
+project(TestImplementation${Python_REQUESTED_IMPLEMENTATION} C)
+
+
+set (Python${Python_REQUESTED_VERSION}_FIND_IMPLEMENTATIONS ${Python_REQUESTED_IMPLEMENTATION})
+
+find_package(Python${Python_REQUESTED_VERSION} COMPONENTS Interpreter)
+if (NOT Python${Python_REQUESTED_VERSION}_FOUND OR NOT Python${Python_REQUESTED_VERSION}_Interpreter_FOUND)
+ message (FATAL_ERROR "Fail to found Python${Python_REQUESTED_VERSION}")
+endif()
+
+if (Python_REQUESTED_IMPLEMENTATION STREQUAL "IronPython"
+ AND NOT Python${Python_REQUESTED_VERSION}_INTERPRETER_ID STREQUAL "IronPython")
+ message (FATAL_ERROR "Erroneous interpreter ID (${Python${Python_REQUESTED_VERSION}_INTERPRETER_ID})")
+endif()
+if (Python_REQUESTED_IMPLEMENTATION STREQUAL "CPython"
+ AND Python${Python_REQUESTED_VERSION}_INTERPRETER_ID STREQUAL "IronPython")
+ message (FATAL_ERROR "Erroneous interpreter ID (${Python${Python_REQUESTED_VERSION}_INTERPRETER_ID})")
+endif()
+
+
+set (Python_FIND_IMPLEMENTATIONS ${Python_REQUESTED_IMPLEMENTATION})
+
+find_package(Python ${Python_REQUESTED_VERSION} REQUIRED COMPONENTS Interpreter)
+if (NOT Python_FOUND OR NOT Python_Interpreter_FOUND)
+ message (FATAL_ERROR "Fail to found Python ${Python_REQUESTED_VERSION}")
+endif()
+
+if (Python_REQUESTED_IMPLEMENTATION STREQUAL "IronPython"
+ AND NOT Python_INTERPRETER_ID STREQUAL "IronPython")
+ message (FATAL_ERROR "Erroneous interpreter ID (${Python_INTERPRETER_ID})")
+endif()
+if (Python_REQUESTED_IMPLEMENTATION STREQUAL "CPython"
+ AND Python_INTERPRETER_ID STREQUAL "IronPython")
+ message (FATAL_ERROR "Erroneous interpreter ID (${Python_INTERPRETER_ID})")
+endif()
diff --git a/Tests/FindPython/IronPython/CMakeLists.txt b/Tests/FindPython/IronPython/CMakeLists.txt
index c96a3e0..3493c29 100644
--- a/Tests/FindPython/IronPython/CMakeLists.txt
+++ b/Tests/FindPython/IronPython/CMakeLists.txt
@@ -2,11 +2,20 @@ cmake_minimum_required(VERSION 3.1)
project(TestIronPython C)
-find_package(Python ${Python_REQUESTED_VERSION} REQUIRED COMPONENTS Interpreter Compiler)
+set (Python_FIND_IMPLEMENTATIONS IronPython)
+
+find_package(Python ${Python_REQUESTED_VERSION} COMPONENTS Interpreter Compiler)
if (NOT Python_FOUND)
message (FATAL_ERROR "Fail to found Python ${Python_REQUESTED_VERSION}")
endif()
+if (NOT Python_Interpreter_FOUND)
+ message (FATAL_ERROR "Fail to found Python Interpreter")
+endif()
+if (NOT Python_INTERPRETER_ID STREQUAL "IronPython")
+ message (FATAL_ERROR "Erroneous interpreter ID (${Python_INTERPRETER_ID})")
+endif()
+
if (NOT Python_Compiler_FOUND)
message (FATAL_ERROR "Fail to found Python Compiler")
endif()
diff --git a/Tests/FindPython/IronPython2/CMakeLists.txt b/Tests/FindPython/IronPython2/CMakeLists.txt
index 43ec309..1db798c 100644
--- a/Tests/FindPython/IronPython2/CMakeLists.txt
+++ b/Tests/FindPython/IronPython2/CMakeLists.txt
@@ -2,11 +2,20 @@ cmake_minimum_required(VERSION 3.1)
project(TestIronPython2 C)
-find_package(Python2 REQUIRED COMPONENTS Interpreter Compiler)
+set (Python2_FIND_IMPLEMENTATIONS "IronPython")
+
+find_package(Python2 COMPONENTS Interpreter Compiler)
if (NOT Python2_FOUND)
message (FATAL_ERROR "Fail to found Python 2")
endif()
+if (NOT Python2_Interpreter_FOUND)
+ message (FATAL_ERROR "Fail to found Python 2 Interpreter")
+endif()
+if (NOT Python2_INTERPRETER_ID STREQUAL "IronPython")
+ message (FATAL_ERROR "Erroneous interpreter ID (${Python2_INTERPRETER_ID})")
+endif()
+
if (NOT Python2_Compiler_FOUND)
message (FATAL_ERROR "Fail to found Python 2 Compiler")
endif()
diff --git a/Tests/FindPython/PyPy/CMakeLists.txt b/Tests/FindPython/PyPy/CMakeLists.txt
new file mode 100644
index 0000000..b4ade8c
--- /dev/null
+++ b/Tests/FindPython/PyPy/CMakeLists.txt
@@ -0,0 +1,37 @@
+cmake_minimum_required(VERSION 3.1)
+
+project(TestPyPy C)
+
+set (Python_FIND_IMPLEMENTATIONS PyPy)
+
+find_package(Python ${Python_REQUESTED_VERSION} COMPONENTS Interpreter Development)
+if (NOT Python_FOUND)
+ message (FATAL_ERROR "Fail to found Python PyPy ${Python_REQUESTED_VERSION}")
+endif()
+
+if (NOT Python_Interpreter_FOUND)
+ message (FATAL_ERROR "Fail to found Python PyPy Interpreter")
+endif()
+if (NOT Python_INTERPRETER_ID STREQUAL "PyPy")
+ message (FATAL_ERROR "Erroneous interpreter ID (${Python_INTERPRETER_ID})")
+endif()
+
+if (NOT Python_Development.Module_FOUND)
+ message (FATAL_ERROR "Fail to found Python PyPy ${Python_REQUESTED_VERSION} Development.Module")
+endif()
+if (NOT Python_Development.Embed_FOUND)
+ message (FATAL_ERROR "Fail to found Python PyPy ${Python_REQUESTED_VERSION} Development.Embed")
+endif()
+if (NOT Python_Development_FOUND)
+ message (FATAL_ERROR "Fail to found Python PyPy ${Python_REQUESTED_VERSION} Development")
+endif()
+
+if(NOT TARGET Python::Interpreter)
+ message(SEND_ERROR "Python::Interpreter not found")
+endif()
+if(NOT TARGET Python::Module)
+ message(SEND_ERROR "Python::Module not found")
+endif()
+if(NOT TARGET Python::Python)
+ message(SEND_ERROR "Python::Python not found")
+endif()
diff --git a/Tests/FindPython/PyPy2/CMakeLists.txt b/Tests/FindPython/PyPy2/CMakeLists.txt
new file mode 100644
index 0000000..2f0ddc9
--- /dev/null
+++ b/Tests/FindPython/PyPy2/CMakeLists.txt
@@ -0,0 +1,37 @@
+cmake_minimum_required(VERSION 3.1)
+
+project(TestPyPy2 C)
+
+set (Python2_FIND_IMPLEMENTATIONS "PyPy")
+
+find_package(Python2 COMPONENTS Interpreter Development)
+if (NOT Python2_FOUND)
+ message (FATAL_ERROR "Fail to found Python PyPy 2")
+endif()
+
+if (NOT Python2_Interpreter_FOUND)
+ message (FATAL_ERROR "Fail to found Python PyPy 2 Interpreter")
+endif()
+if (NOT Python2_INTERPRETER_ID STREQUAL "PyPy")
+ message (FATAL_ERROR "Erroneous interpreter ID (${Python2_INTERPRETER_ID})")
+endif()
+
+if (NOT Python2_Development.Module_FOUND)
+ message (FATAL_ERROR "Fail to found Python PyPy 2 Development.Module")
+endif()
+if (NOT Python2_Development.Embed_FOUND)
+ message (FATAL_ERROR "Fail to found Python PyPy 2 Development.Embed")
+endif()
+if (NOT Python2_Development_FOUND)
+ message (FATAL_ERROR "Fail to found Python PyPy 2 Development")
+endif()
+
+if(NOT TARGET Python2::Interpreter)
+ message(SEND_ERROR "Python2::Interpreter not found")
+endif()
+if(NOT TARGET Python2::Module)
+ message(SEND_ERROR "Python2::Module not found")
+endif()
+if(NOT TARGET Python2::Python)
+ message(SEND_ERROR "Python2::Python not found")
+endif()
diff --git a/Tests/FindPython/PyPy3/CMakeLists.txt b/Tests/FindPython/PyPy3/CMakeLists.txt
new file mode 100644
index 0000000..5562d57
--- /dev/null
+++ b/Tests/FindPython/PyPy3/CMakeLists.txt
@@ -0,0 +1,37 @@
+cmake_minimum_required(VERSION 3.1)
+
+project(TestPyPy3 C)
+
+set (Python3_FIND_IMPLEMENTATIONS "PyPy")
+
+find_package(Python3 COMPONENTS Interpreter Development)
+if (NOT Python3_FOUND)
+ message (FATAL_ERROR "Fail to found Python PyPy 3")
+endif()
+
+if (NOT Python3_Interpreter_FOUND)
+ message (FATAL_ERROR "Fail to found Python PyPy 3 Interpreter")
+endif()
+if (NOT Python3_INTERPRETER_ID STREQUAL "PyPy")
+ message (FATAL_ERROR "Erroneous interpreter ID (${Python3_INTERPRETER_ID})")
+endif()
+
+if (NOT Python3_Development.Module_FOUND)
+ message (FATAL_ERROR "Fail to found Python PyPy 3 Development.Module")
+endif()
+if (NOT Python3_Development.Embed_FOUND)
+ message (FATAL_ERROR "Fail to found Python PyPy 3 Development.Embed")
+endif()
+if (NOT Python3_Development_FOUND)
+ message (FATAL_ERROR "Fail to found Python PyPy 3 Development")
+endif()
+
+if(NOT TARGET Python3::Interpreter)
+ message(SEND_ERROR "Python3::Interpreter not found")
+endif()
+if(NOT TARGET Python3::Module)
+ message(SEND_ERROR "Python3::Module not found")
+endif()
+if(NOT TARGET Python3::Python)
+ message(SEND_ERROR "Python3::Python not found")
+endif()
diff --git a/Tests/FindPython/Python/CMakeLists.txt b/Tests/FindPython/Python/CMakeLists.txt
index 3ee38e3..e8828a2 100644
--- a/Tests/FindPython/Python/CMakeLists.txt
+++ b/Tests/FindPython/Python/CMakeLists.txt
@@ -8,6 +8,12 @@ find_package(Python ${Python_REQUESTED_VERSION} REQUIRED COMPONENTS Interpreter
if (NOT Python_FOUND)
message (FATAL_ERROR "Fail to found Python ${Python_REQUESTED_VERSION}")
endif()
+if (NOT Python_Development.Module_FOUND)
+ message (FATAL_ERROR "Fail to found Python ${Python_REQUESTED_VERSION}, COMPONENT 'Development.Module'")
+endif()
+if (NOT Python_Development.Embed_FOUND)
+ message (FATAL_ERROR "Fail to found Python ${Python_REQUESTED_VERSION}, COMPOENENT 'Development.Embed'")
+endif()
if(NOT TARGET Python::Interpreter)
message(SEND_ERROR "Python::Interpreter not found")
diff --git a/Tests/FindPython/Python2/CMakeLists.txt b/Tests/FindPython/Python2/CMakeLists.txt
index cf77ca2..609d80f 100644
--- a/Tests/FindPython/Python2/CMakeLists.txt
+++ b/Tests/FindPython/Python2/CMakeLists.txt
@@ -13,6 +13,15 @@ find_package(Python2 REQUIRED COMPONENTS Interpreter Development)
if (NOT Python2_FOUND)
message (FATAL_ERROR "Fail to found Python 2")
endif()
+if (NOT Python2_Development_FOUND)
+ message (FATAL_ERROR "Fail to found Python 2 'Development' component")
+endif()
+if (NOT Python2_Development.Module_FOUND)
+ message (FATAL_ERROR "Fail to found Python 2 'Development.Module' component")
+endif()
+if (NOT Python2_Development.Embed_FOUND)
+ message (FATAL_ERROR "Fail to found Python 2 'Development.Embed' component")
+endif()
if(NOT TARGET Python2::Interpreter)
message(SEND_ERROR "Python2::Interpreter not found")
diff --git a/Tests/FindPython/Python2Embedded/CMakeLists.txt b/Tests/FindPython/Python2Embedded/CMakeLists.txt
index 0115dea..1cf6034 100644
--- a/Tests/FindPython/Python2Embedded/CMakeLists.txt
+++ b/Tests/FindPython/Python2Embedded/CMakeLists.txt
@@ -4,10 +4,23 @@ project(TestPython2Embedded C)
include(CTest)
-find_package(Python2 REQUIRED COMPONENTS Development)
+find_package(Python2 REQUIRED COMPONENTS Development.Embed)
if (NOT Python2_FOUND)
message (FATAL_ERROR "Fail to found Python 2")
endif()
+if (Python2_Development_FOUND)
+ message (FATAL_ERROR "Python 2, COMPONENT 'Development' unexpectedly found")
+endif()
+if (Python2_Development.Module_FOUND)
+ message (FATAL_ERROR "Python 2, COMPONENT 'Development.Module' unexpectedly found")
+endif()
+if (NOT Python2_Development.Embed_FOUND)
+ message (FATAL_ERROR "Python 2, COMPONENT 'Development.Embed' not found")
+endif()
+
+if(TARGET Python2::Module)
+ message(SEND_ERROR "Python2::Module unexpectedly found")
+endif()
if(NOT TARGET Python2::Python)
message(SEND_ERROR "Python2::Python not found")
diff --git a/Tests/FindPython/Python2Module/CMakeLists.txt b/Tests/FindPython/Python2Module/CMakeLists.txt
new file mode 100644
index 0000000..0bc3390
--- /dev/null
+++ b/Tests/FindPython/Python2Module/CMakeLists.txt
@@ -0,0 +1,37 @@
+cmake_minimum_required(VERSION 3.1)
+
+project(TestPython2Module C)
+
+include(CTest)
+
+find_package(Python2 REQUIRED COMPONENTS Interpreter Development.Module)
+if (NOT Python2_FOUND)
+ message (FATAL_ERROR "Fail to found Python 2")
+endif()
+if (Python2_Development_FOUND)
+ message (FATAL_ERROR "Python 2, COMPONENT 'Development' unexpectedly found")
+endif()
+if (Python2_Development.Embed_FOUND)
+ message (FATAL_ERROR "Python 2, COMPONENT 'Development.Embed' unexpectedly found")
+endif()
+if (NOT Python2_Development.Module_FOUND)
+ message (FATAL_ERROR "Python 2, COMPONENT 'Development.Module' not found")
+endif()
+
+if(NOT TARGET Python2::Interpreter)
+ message(SEND_ERROR "Python2::Interpreter not found")
+endif()
+
+if(TARGET Python2::Python)
+ message(SEND_ERROR "Python2::Python unexpectedly found")
+endif()
+if(NOT TARGET Python2::Module)
+ message(SEND_ERROR "Python2::Module not found")
+endif()
+
+Python2_add_library (spam2 MODULE ../spam.c)
+target_compile_definitions (spam2 PRIVATE PYTHON2)
+
+add_test (NAME python2_spam2
+ COMMAND "${CMAKE_COMMAND}" -E env "PYTHONPATH=$<TARGET_FILE_DIR:spam2>"
+ "${Python2_EXECUTABLE}" -c "import spam2; spam2.system(\"cd\")")
diff --git a/Tests/FindPython/Python3/CMakeLists.txt b/Tests/FindPython/Python3/CMakeLists.txt
index 6691a48..d6e5fdb 100644
--- a/Tests/FindPython/Python3/CMakeLists.txt
+++ b/Tests/FindPython/Python3/CMakeLists.txt
@@ -13,16 +13,25 @@ find_package(Python3 REQUIRED COMPONENTS Interpreter Development)
if (NOT Python3_FOUND)
message (FATAL_ERROR "Fail to found Python 3")
endif()
+if (NOT Python3_Development_FOUND)
+ message (FATAL_ERROR "Fail to found Python 3 'Development' component")
+endif()
+if (NOT Python3_Development.Module_FOUND)
+ message (FATAL_ERROR "Fail to found Python 3 'Development.Module' component")
+endif()
+if (NOT Python3_Development.Embed_FOUND)
+ message (FATAL_ERROR "Fail to found Python 3 'Development.Embed' component")
+endif()
if(NOT TARGET Python3::Interpreter)
- message(SEND_ERROR "Python2::Interpreter not found")
+ message(SEND_ERROR "Python3::Interpreter not found")
endif()
if(NOT TARGET Python3::Python)
- message(SEND_ERROR "Python2::Python not found")
+ message(SEND_ERROR "Python3::Python not found")
endif()
if(NOT TARGET Python3::Module)
- message(SEND_ERROR "Python2::Module not found")
+ message(SEND_ERROR "Python3::Module not found")
endif()
Python3_add_library (spam3 MODULE ../spam.c)
diff --git a/Tests/FindPython/Python3Embedded/CMakeLists.txt b/Tests/FindPython/Python3Embedded/CMakeLists.txt
index 4eb7ebc..184c0b4 100644
--- a/Tests/FindPython/Python3Embedded/CMakeLists.txt
+++ b/Tests/FindPython/Python3Embedded/CMakeLists.txt
@@ -4,10 +4,23 @@ project(TestPython3Embedded C)
include(CTest)
-find_package(Python3 REQUIRED COMPONENTS Development)
+find_package(Python3 REQUIRED COMPONENTS Development.Embed)
if (NOT Python3_FOUND)
message (FATAL_ERROR "Fail to found Python 3")
endif()
+if (Python3_Development_FOUND)
+ message (FATAL_ERROR "Python 3, COMPONENT 'Development' unexpectedly found")
+endif()
+if (Python3_Development.Module_FOUND)
+ message (FATAL_ERROR "Python 3, COMPONENT 'Development.Module' unexpectedly found")
+endif()
+if (NOT Python3_Development.Embed_FOUND)
+ message (FATAL_ERROR "Python 3, COMPONENT 'Development.Embed' not found")
+endif()
+
+if(TARGET Python3::Module)
+ message(SEND_ERROR "Python3::Module unexpectedly found")
+endif()
if(NOT TARGET Python3::Python)
message(SEND_ERROR "Python3::Python not found")
diff --git a/Tests/FindPython/Python3Module/CMakeLists.txt b/Tests/FindPython/Python3Module/CMakeLists.txt
new file mode 100644
index 0000000..676f4c8
--- /dev/null
+++ b/Tests/FindPython/Python3Module/CMakeLists.txt
@@ -0,0 +1,37 @@
+cmake_minimum_required(VERSION 3.1)
+
+project(TestPython3Module C)
+
+include(CTest)
+
+find_package(Python3 REQUIRED COMPONENTS Interpreter Development.Module)
+if (NOT Python3_FOUND)
+ message (FATAL_ERROR "Fail to found Python 3")
+endif()
+if (Python3_Development_FOUND)
+ message (FATAL_ERROR "Python 3, COMPONENT 'Development' unexpectedly found")
+endif()
+if (Python3_Development.Embed_FOUND)
+ message (FATAL_ERROR "Python 3, COMPONENT 'Development.Embed' unexpectedly found")
+endif()
+if (NOT Python3_Development.Module_FOUND)
+ message (FATAL_ERROR "Python 3, COMPONENT 'Development.Module' not found")
+endif()
+
+if(NOT TARGET Python3::Interpreter)
+ message(SEND_ERROR "Python3::Interpreter not found")
+endif()
+
+if(TARGET Python3::Python)
+ message(SEND_ERROR "Python3::Python unexpectedly found")
+endif()
+if(NOT TARGET Python3::Module)
+ message(SEND_ERROR "Python3::Module not found")
+endif()
+
+Python3_add_library (spam3 MODULE ../spam.c)
+target_compile_definitions (spam3 PRIVATE PYTHON3)
+
+add_test (NAME python3_spam3
+ COMMAND "${CMAKE_COMMAND}" -E env "PYTHONPATH=$<TARGET_FILE_DIR:spam3>"
+ "${Python3_EXECUTABLE}" -c "import spam3; spam3.system(\"cd\")")
diff --git a/Tests/FindRuby/CMakeLists.txt b/Tests/FindRuby/CMakeLists.txt
new file mode 100644
index 0000000..3f4807c
--- /dev/null
+++ b/Tests/FindRuby/CMakeLists.txt
@@ -0,0 +1,57 @@
+if(CMake_TEST_FindRuby)
+
+ # Looks for ruby >=1.9.9, which is true on any Ubuntu (that installs it) or macOS (> 10.9)
+ add_test(NAME FindRuby.Test COMMAND
+ ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
+ --build-and-test
+ "${CMake_SOURCE_DIR}/Tests/FindRuby/Test"
+ "${CMake_BINARY_DIR}/Tests/FindRuby/Test"
+ ${build_generator_args}
+ --build-project TestRuby
+ --build-options ${build_options}
+ --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
+ )
+
+ # Looks for ruby >= 50.1.0, which should logically fail
+ add_test(NAME FindRuby.Fail COMMAND
+ ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
+ --build-and-test
+ "${CMake_SOURCE_DIR}/Tests/FindRuby/Fail"
+ "${CMake_BINARY_DIR}/Tests/FindRuby/Fail"
+ ${build_generator_args}
+ --build-project TestRubyFail
+ --build-options ${build_options}
+ --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
+ )
+ set_tests_properties(FindRuby.Fail PROPERTIES
+ PASS_REGULAR_EXPRESSION "Could NOT find Ruby.*(Required is at least version \"[0-9]+\\.[0-9]+\\.[0-9]+\")")
+
+ # Looks for 1.9.9 EXACTLY, which unlike the "FindRuby" test above will fail on every machine
+ # since this version doesn't exist (ruby goes from 1.9.3 to 2.0.0)
+ add_test(NAME FindRuby.FailExact COMMAND
+ ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
+ --build-and-test
+ "${CMake_SOURCE_DIR}/Tests/FindRuby/FailExact"
+ "${CMake_BINARY_DIR}/Tests/FindRuby/FailExact"
+ ${build_generator_args}
+ --build-project TestRubyFailExact
+ --build-options ${build_options}
+ --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
+ )
+ set_tests_properties(FindRuby.FailExact PROPERTIES
+ PASS_REGULAR_EXPRESSION "Could NOT find Ruby: Found unsuitable version \".*\", but required is.*exact version \"[0-9]+\\.[0-9]+\\.[0-9]+\" \\(found .*\\)")
+
+ # RVM specific test
+ if(CMake_TEST_FindRuby_RVM)
+ add_test(NAME FindRuby.Rvm COMMAND
+ ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
+ --build-and-test
+ "${CMake_SOURCE_DIR}/Tests/FindRuby/Rvm"
+ "${CMake_BINARY_DIR}/Tests/FindRuby/Rvm"
+ ${build_generator_args}
+ --build-project TestRVM
+ --build-options ${build_options}
+ --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
+ )
+ endif()
+endif()
diff --git a/Tests/FindRuby/Fail/CMakeLists.txt b/Tests/FindRuby/Fail/CMakeLists.txt
new file mode 100644
index 0000000..9185ba5
--- /dev/null
+++ b/Tests/FindRuby/Fail/CMakeLists.txt
@@ -0,0 +1,5 @@
+cmake_minimum_required(VERSION 3.17)
+project(TestRubyFail LANGUAGES NONE)
+
+# Should always fail since there is NO ruby 50.1.0 yet.
+find_package(Ruby 50.1.0 REQUIRED)
diff --git a/Tests/FindRuby/FailExact/CMakeLists.txt b/Tests/FindRuby/FailExact/CMakeLists.txt
new file mode 100644
index 0000000..1ebc0ae
--- /dev/null
+++ b/Tests/FindRuby/FailExact/CMakeLists.txt
@@ -0,0 +1,8 @@
+cmake_minimum_required(VERSION 3.17)
+project(TestRubyFailExact LANGUAGES NONE)
+
+# Should always fail since there is NO ruby 1.9.9 (goes from 1.9.3 to 2.0.0)
+find_package(Ruby 1.9.9 EXACT REQUIRED)
+if (NOT Ruby_FOUND)
+ message (FATAL_ERROR "Failed to find Ruby 1.9.9")
+endif()
diff --git a/Tests/FindRuby/Rvm/CMakeLists.txt b/Tests/FindRuby/Rvm/CMakeLists.txt
new file mode 100644
index 0000000..545fc94
--- /dev/null
+++ b/Tests/FindRuby/Rvm/CMakeLists.txt
@@ -0,0 +1,75 @@
+cmake_minimum_required(VERSION 3.17)
+project(TestRVM LANGUAGES NONE)
+
+include(CTest)
+
+# To run this test, you need to have at least one RVM ruby installed
+# and to ensure that the env variable 'MY_RUBY_HOME' is set to a valid RVM ruby when you run the test
+# (which is the case if you have done `rvm use x.y.z`, but could be manually set too)
+
+# Properly using rvm would require sourcing a shell script, eg `source "$HOME/.rvm/scripts/rvm"`
+# Instead, I'll just rely on the env variable MY_RUBY_HOME
+set(MY_RUBY_HOME "$ENV{MY_RUBY_HOME}")
+if(NOT MY_RUBY_HOME)
+ message(FATAL_ERROR "Env variable MY_RUBY_HOME should be set to a valid RVM ruby location, or you should call `rvm use x.y.z` before")
+endif()
+execute_process (COMMAND "${MY_RUBY_HOME}/bin/ruby" -e "puts RUBY_VERSION"
+ RESULT_VARIABLE result
+ OUTPUT_VARIABLE RVM_RUBY_VERSION
+ ERROR_QUIET
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+if (result)
+ message (FATAL_ERROR "Unable to detect RVM ruby version from `${MY_RUBY_HOME}/bin/ruby`: ${RVM_RUBY_VERSION}")
+endif()
+
+execute_process(COMMAND "${CMAKE_COMMAND}" -E env --unset=MY_RUBY_HOME --unset=PATH
+ "which" "ruby"
+ RESULT_VARIABLE result
+ OUTPUT_VARIABLE SYSTEM_RUBY
+ ERROR_QUIET
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+if (SYSTEM_RUBY MATCHES "^${MY_RUBY_HOME}/.+")
+ message(FATAL_ERROR "Unable to find system ruby, found ${SYSTEM_RUBY} which is part of MY_RUBY_HOME=${MY_RUBY_HOME}")
+endif()
+
+# Check version of the system ruby executable.
+execute_process (COMMAND "${SYSTEM_RUBY}" -e "puts RUBY_VERSION"
+ RESULT_VARIABLE result
+ OUTPUT_VARIABLE SYSTEM_RUBY_VERSION
+ ERROR_QUIET
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+if (result)
+ message (FATAL_ERROR "Unable to detect system ruby version from '${SYSTEM_RUBY}': ${SYSTEM_RUBY_VERSION}")
+endif()
+
+if(SYSTEM_RUBY_VERSION VERSION_EQUAL RVM_RUBY_VERSION)
+ message(FATAL_ERROR "Your RVM Ruby Version and your System ruby version are the same (${RVM_RUBY_VERSION}).")
+endif()
+
+message("Found System Ruby (${SYSTEM_RUBY_VERSION}): ${SYSTEM_RUBY}")
+message("Found RVM Ruby (${RVM_RUBY_VERSION}): ${MY_RUBY_HOME}/bin/ruby")
+
+add_test(NAME FindRuby.RvmDefault
+ COMMAND "${CMAKE_COMMAND}" -E env "MY_RUBY_HOME=${MY_RUBY_HOME}"
+ "${CMAKE_COMMAND}" "-DRUBY_HOME=${MY_RUBY_HOME}"
+ -P "${CMAKE_CURRENT_LIST_DIR}/RvmDefault.cmake")
+
+add_test(NAME FindRuby.RvmOnly
+ COMMAND "${CMAKE_COMMAND}" -E env --unset=PATH
+ "MY_RUBY_HOME=${MY_RUBY_HOME}"
+ "${CMAKE_COMMAND}" "-DRUBY_HOME=${MY_RUBY_HOME}"
+ "-DRVM_RUBY_VERSION=${RVM_RUBY_VERSION}" "-DSYSTEM_RUBY_VERSION=${SYSTEM_RUBY_VERSION}"
+ -P "${CMAKE_CURRENT_LIST_DIR}/RvmOnly.cmake")
+add_test(NAME FindRuby.UnsetRvmOnly
+ COMMAND "${CMAKE_COMMAND}" -E env --unset=MY_RUBY_HOME "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin"
+ "${CMAKE_COMMAND}" "-DRVM_RUBY_VERSION=${RVM_RUBY_VERSION}" "-DSYSTEM_RUBY_VERSION=${SYSTEM_RUBY_VERSION}"
+ -P "${CMAKE_CURRENT_LIST_DIR}/RvmOnly.cmake")
+
+add_test(NAME FindRuby.RvmStandard
+ COMMAND "${CMAKE_COMMAND}" -E env "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin"
+ "MY_RUBY_HOME=${MY_RUBY_HOME}"
+ "${CMAKE_COMMAND}" "-DRUBY_HOME=${MY_RUBY_HOME}"
+ -P "${CMAKE_CURRENT_LIST_DIR}/RvmStandard.cmake")
diff --git a/Tests/FindRuby/Rvm/RvmDefault.cmake b/Tests/FindRuby/Rvm/RvmDefault.cmake
new file mode 100644
index 0000000..a66b911
--- /dev/null
+++ b/Tests/FindRuby/Rvm/RvmDefault.cmake
@@ -0,0 +1,17 @@
+set(CMAKE_FIND_LIBRARY_PREFIXES "")
+set(CMAKE_FIND_LIBRARY_SUFFIXES "")
+
+find_package (Ruby 2.1.1 REQUIRED)
+if (NOT RUBY_EXECUTABLE MATCHES "^${RUBY_HOME}/.+")
+ message (FATAL_ERROR "Failed to use RVM environment: ${RUBY_EXECUTABLE}, ${RUBY_HOME}")
+endif()
+
+find_package (Ruby 2.1 REQUIRED)
+if (NOT RUBY_EXECUTABLE MATCHES "^${RUBY_HOME}/.+")
+ message (FATAL_ERROR "Failed to use RVM environment: ${RUBY_EXECUTABLE}, ${RUBY_HOME}")
+endif()
+
+find_package (Ruby REQUIRED)
+if (NOT RUBY_EXECUTABLE MATCHES "^${RUBY_HOME}/.+")
+ message (FATAL_ERROR "Failed to use RVM environment: ${RUBY_EXECUTABLE}, ${RUBY_HOME}")
+endif()
diff --git a/Tests/FindRuby/Rvm/RvmOnly.cmake b/Tests/FindRuby/Rvm/RvmOnly.cmake
new file mode 100644
index 0000000..3851a7c
--- /dev/null
+++ b/Tests/FindRuby/Rvm/RvmOnly.cmake
@@ -0,0 +1,41 @@
+set(CMAKE_FIND_LIBRARY_PREFIXES "")
+set(CMAKE_FIND_LIBRARY_SUFFIXES "")
+
+set(Ruby_FIND_VIRTUALENV ONLY)
+
+# Test: FindRuby.RvmOnly
+if (RUBY_HOME)
+ # => Trying to find exactly system ruby using ONLY virtual environment should fail
+ find_package (Ruby ${SYSTEM_RUBY_VERSION} EXACT QUIET)
+ if(Ruby_FOUND)
+ message (FATAL_ERROR "Ruby unexpectedly found.")
+ endif()
+ # And should work to find the rvm version
+ find_package (Ruby ${RVM_RUBY_VERSION} EXACT QUIET)
+ if(Ruby_FOUND)
+ message (FATAL_ERROR "Ruby unexpectedly found.")
+ endif()
+endif()
+
+
+# Test: FindRuby.UnsetRvmOnly
+if (NOT RUBY_HOME)
+
+ # If ENV{MY_RUBY_HOME} isn't defined, it should default back to "STANDARD"
+ # At which point:
+
+ # It shouldn't find the RVM ruby
+ find_package (Ruby ${RVM_RUBY_VERSION} EXACT QUIET)
+ if(Ruby_FOUND)
+ message(FATAL_ERROR "Found RVM ruby when expecting system")
+ endif()
+
+ # it should find the system ruby
+ find_package (Ruby ${SYSTEM_RUBY_VERSION} EXACT QUIET)
+ if(NOT Ruby_FOUND)
+ message (FATAL_ERROR "Ruby not found.")
+ endif()
+ if (Ruby_FOUND MATCHES "^${RUBY_HOME}/.+")
+ message(FATAL_ERROR "Failed to find system ruby")
+ endif()
+endif()
diff --git a/Tests/FindRuby/Rvm/RvmStandard.cmake b/Tests/FindRuby/Rvm/RvmStandard.cmake
new file mode 100644
index 0000000..26befdb7
--- /dev/null
+++ b/Tests/FindRuby/Rvm/RvmStandard.cmake
@@ -0,0 +1,9 @@
+set(CMAKE_FIND_LIBRARY_PREFIXES "")
+set(CMAKE_FIND_LIBRARY_SUFFIXES "")
+
+set (Ruby_FIND_VIRTUALENV STANDARD)
+find_package (Ruby REQUIRED)
+
+if (RUBY_EXECUTABLE MATCHES "^${RUBY_HOME}/.+")
+ message (FATAL_ERROR "RVM ruby unexpectedly found at ${RUBY_EXECUTABLE}, matches ${RUBY_HOME}")
+endif()
diff --git a/Tests/FindRuby/Test/CMakeLists.txt b/Tests/FindRuby/Test/CMakeLists.txt
new file mode 100644
index 0000000..dcf3ec3
--- /dev/null
+++ b/Tests/FindRuby/Test/CMakeLists.txt
@@ -0,0 +1,14 @@
+cmake_minimum_required(VERSION 3.17)
+project(TestRuby LANGUAGES C)
+include(CTest)
+
+find_package(Ruby 1.9.9 REQUIRED)
+if (NOT Ruby_FOUND)
+ message (FATAL_ERROR "Failed to find Ruby >=1.9.9")
+endif()
+
+add_executable(ruby_version ruby_version.c)
+target_include_directories(ruby_version PRIVATE ${Ruby_INCLUDE_DIRS})
+target_link_libraries(ruby_version PRIVATE ${Ruby_LIBRARIES})
+
+add_test(NAME ruby_version COMMAND ruby_version)
diff --git a/Tests/FindRuby/Test/ruby_version.c b/Tests/FindRuby/Test/ruby_version.c
new file mode 100644
index 0000000..8800436
--- /dev/null
+++ b/Tests/FindRuby/Test/ruby_version.c
@@ -0,0 +1,7 @@
+#include "ruby.h"
+
+int main(void)
+{
+ ruby_show_version();
+ return 0;
+}
diff --git a/Tests/FindX11/Test/CMakeLists.txt b/Tests/FindX11/Test/CMakeLists.txt
index 769271f..b2adfb2 100644
--- a/Tests/FindX11/Test/CMakeLists.txt
+++ b/Tests/FindX11/Test/CMakeLists.txt
@@ -29,6 +29,10 @@ test_x11_component(x11_components SM)
set(X11_X11_FOUND ${X11_FOUND})
test_x11_component(x11_components X11)
test_x11_component(x11_components Xau)
+test_x11_component(x11_components xcb)
+test_x11_component(x11_components X11_xcb)
+test_x11_component(x11_components xcb_icccm)
+test_x11_component(x11_components xcb_xkb)
test_x11_component(x11_components Xcomposite)
test_x11_component(x11_components Xdamage)
test_x11_component(x11_components Xdmcp)
@@ -41,6 +45,8 @@ test_x11_component(x11_components Xfixes)
test_x11_component(x11_components_ignore Xft)
test_x11_component(x11_components Xi)
test_x11_component(x11_components Xinerama)
+test_x11_component(x11_components xkbcommon)
+test_x11_component(x11_components xkbcommon_X11)
test_x11_component(x11_components Xkb)
test_x11_component(x11_components xkbfile)
test_x11_component(x11_components Xmu)
@@ -61,6 +67,9 @@ target_link_libraries(test_var PRIVATE ${X11_LIBRARIES})
# Not included in X11_LIBRARIES.
foreach(lib
Xau
+ xcb
+ X11_xcb
+ xcb_icccm
Xcomposite
Xdamage
Xdmcp
@@ -69,6 +78,8 @@ foreach(lib
Xfixes
Xi
Xinerama
+ xkbcommon
+ xkbcommon_X11
Xkb
xkbfile
Xmu
diff --git a/Tests/FortranModules/CMakeLists.txt b/Tests/FortranModules/CMakeLists.txt
index d056b43..b7a6f68 100644
--- a/Tests/FortranModules/CMakeLists.txt
+++ b/Tests/FortranModules/CMakeLists.txt
@@ -21,7 +21,7 @@ end module parent
submodule ( parent ) child
contains
module procedure id
- f = x
+ id = x
end procedure id
end submodule child
program main
diff --git a/Tests/FortranOnly/CMakeLists.txt b/Tests/FortranOnly/CMakeLists.txt
index d945375..4327c2f 100644
--- a/Tests/FortranOnly/CMakeLists.txt
+++ b/Tests/FortranOnly/CMakeLists.txt
@@ -51,40 +51,36 @@ add_custom_target(checksayhello ALL
)
add_dependencies(checksayhello sayhello)
-# Exclude this test on IBM XL for now because the check strangely
-# fails with 'ld: 0706-029 Use a number with the -H flag'.
-if(NOT CMAKE_Fortran_COMPILER_ID STREQUAL XL)
- set(err_log ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeError.log)
- file(REMOVE "${err_log}")
- include(CheckFortranSourceCompiles)
- unset(HAVE_PRINT CACHE)
- CHECK_Fortran_SOURCE_COMPILES([[
+set(err_log ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeError.log)
+file(REMOVE "${err_log}")
+include(CheckFortranSourceCompiles)
+unset(HAVE_PRINT CACHE)
+CHECK_Fortran_SOURCE_COMPILES([[
PROGRAM TEST_HAVE_PRINT
PRINT *, 'Hello'
END
]] HAVE_PRINT)
- if(NOT HAVE_PRINT)
- if(EXISTS "${err_log}")
- file(READ "${err_log}" err)
- endif()
- string(REPLACE "\n" "\n " err " ${err}")
- message(SEND_ERROR "CHECK_Fortran_SOURCE_COMPILES for HAVE_PRINT failed:\n"
- "${err}")
+if(NOT HAVE_PRINT)
+ if(EXISTS "${err_log}")
+ file(READ "${err_log}" err)
endif()
+ string(REPLACE "\n" "\n " err " ${err}")
+ message(SEND_ERROR "CHECK_Fortran_SOURCE_COMPILES for HAVE_PRINT failed:\n"
+ "${err}")
+endif()
- unset(Fortran_BOGUS_FLAG CACHE)
- include(CheckFortranCompilerFlag)
- CHECK_Fortran_COMPILER_FLAG(-_this_is_not_a_flag_ Fortran_BOGUS_FLAG)
- if (Fortran_BOGUS_FLAG)
- message(SEND_ERROR "CHECK_Fortran_COMPILER_FLAG() succeeded, but should have failed")
- endif()
+unset(Fortran_BOGUS_FLAG CACHE)
+include(CheckFortranCompilerFlag)
+CHECK_Fortran_COMPILER_FLAG(-_this_is_not_a_flag_ Fortran_BOGUS_FLAG)
+if (Fortran_BOGUS_FLAG)
+ message(SEND_ERROR "CHECK_Fortran_COMPILER_FLAG() succeeded, but should have failed")
+endif()
- unset(Fortran_RUN_FLAG CACHE)
- include(CheckFortranSourceRuns)
- check_fortran_source_runs("program a; end program" Fortran_RUN_FLAG SRC_EXT F90)
- if(NOT Fortran_RUN_FLAG)
- message(SEND_ERROR "CHECK_Fortran_SOURCE_RUNS() failed")
- endif()
+unset(Fortran_RUN_FLAG CACHE)
+include(CheckFortranSourceRuns)
+check_fortran_source_runs("program a; end program" Fortran_RUN_FLAG SRC_EXT F90)
+if(NOT Fortran_RUN_FLAG)
+ message(SEND_ERROR "CHECK_Fortran_SOURCE_RUNS() failed")
endif()
# Test generation of preprocessed sources.
diff --git a/Tests/IncludeDirectories/CMakeLists.txt b/Tests/IncludeDirectories/CMakeLists.txt
index fa3309f..eb08676 100644
--- a/Tests/IncludeDirectories/CMakeLists.txt
+++ b/Tests/IncludeDirectories/CMakeLists.txt
@@ -65,6 +65,39 @@ else()
PROPERTIES COMPILE_FLAGS "-ITarProp")
endif()
+# Test escaping of special characters in include directory paths.
+set(special_chars "~@%&{}()!'")
+if(NOT CMAKE_GENERATOR STREQUAL "Watcom WMake")
+ # Watcom seems to have no way to encode these characters.
+ string(APPEND special_chars "#=[]")
+endif()
+if(NOT (MINGW AND CMAKE_GENERATOR MATCHES "(Unix|MSYS) Makefiles"))
+ # FIXME: Dependencies work but command-line generation does not handle '$'.
+ string(APPEND special_chars "$")
+endif()
+if(NOT CMAKE_GENERATOR MATCHES "(Borland|NMake) Makefiles")
+ # NMake and Borland seem to have no way to encode a single '^'.
+ string(APPEND special_chars "^")
+endif()
+if(NOT CMAKE_GENERATOR MATCHES "Visual Studio 9 2008|Watcom WMake")
+ # The vcproj format separates values with ','.
+ string(APPEND special_chars ",")
+endif()
+if(NOT WIN32 AND NOT CYGWIN)
+ string(APPEND special_chars "*?<>")
+endif()
+set(special_dir "${CMAKE_CURRENT_BINARY_DIR}/special-${special_chars}-include")
+file(WRITE "${special_dir}/SpecialDir.h" "#define SPECIAL_DIR_H\n")
+target_include_directories(IncludeDirectories PRIVATE "${special_dir}")
+target_compile_definitions(IncludeDirectories PRIVATE INCLUDE_SPECIAL_DIR)
+
+if(MAKE_SUPPORTS_SPACES)
+ set(special_space_dir "${CMAKE_CURRENT_BINARY_DIR}/special-space ${special_chars}-include")
+ file(WRITE "${special_space_dir}/SpecialSpaceDir.h" "#define SPECIAL_SPACE_DIR_H\n")
+ target_include_directories(IncludeDirectories PRIVATE "${special_space_dir}")
+ target_compile_definitions(IncludeDirectories PRIVATE INCLUDE_SPECIAL_SPACE_DIR)
+endif()
+
add_library(ordertest ordertest.cpp)
target_include_directories(ordertest SYSTEM PUBLIC SystemIncludeDirectories/systemlib)
target_include_directories(ordertest PUBLIC SystemIncludeDirectories/userlib)
diff --git a/Tests/IncludeDirectories/main.cpp b/Tests/IncludeDirectories/main.cpp
index a59d27c..6dc88e2 100644
--- a/Tests/IncludeDirectories/main.cpp
+++ b/Tests/IncludeDirectories/main.cpp
@@ -3,6 +3,20 @@
#include "SrcProp.h"
#include "TarProp.h"
+#ifdef INCLUDE_SPECIAL_DIR
+# include "SpecialDir.h"
+# ifndef SPECIAL_DIR_H
+# error "SPECIAL_DIR_H not defined"
+# endif
+#endif
+
+#ifdef INCLUDE_SPECIAL_SPACE_DIR
+# include "SpecialSpaceDir.h"
+# ifndef SPECIAL_SPACE_DIR_H
+# error "SPECIAL_SPACE_DIR_H not defined"
+# endif
+#endif
+
int main(int argc, char** argv)
{
return 0;
diff --git a/Tests/MSManifest/CMakeLists.txt b/Tests/MSManifest/CMakeLists.txt
index 300cfa6..631c598 100644
--- a/Tests/MSManifest/CMakeLists.txt
+++ b/Tests/MSManifest/CMakeLists.txt
@@ -1,5 +1,8 @@
cmake_minimum_required(VERSION 3.3)
project(MSManifest C)
+include(CTest)
+
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
add_subdirectory(Subdir)
+add_subdirectory(Subdir2)
diff --git a/Tests/MSManifest/Subdir/CMakeLists.txt b/Tests/MSManifest/Subdir/CMakeLists.txt
index 11272bb..8664572 100644
--- a/Tests/MSManifest/Subdir/CMakeLists.txt
+++ b/Tests/MSManifest/Subdir/CMakeLists.txt
@@ -2,10 +2,9 @@ configure_file(test.manifest.in test.manifest)
add_executable(MSManifest main.c ${CMAKE_CURRENT_BINARY_DIR}/test.manifest)
if(MSVC AND NOT MSVC_VERSION LESS 1400)
- add_custom_command(TARGET MSManifest POST_BUILD VERBATIM
- COMMAND ${CMAKE_COMMAND} -Dexe=$<TARGET_FILE:MSManifest>
- -P ${CMAKE_CURRENT_SOURCE_DIR}/check.cmake
- )
+ add_test(NAME MSManifest.Single COMMAND
+ ${CMAKE_COMMAND} -Dexe=$<TARGET_FILE:MSManifest>
+ -P ${CMAKE_CURRENT_SOURCE_DIR}/check.cmake)
add_executable(MSManifestNone main.c)
set_property(TARGET MSManifestNone PROPERTY LINK_FLAGS "/MANIFEST:NO")
endif()
diff --git a/Tests/MSManifest/Subdir2/CMakeLists.txt b/Tests/MSManifest/Subdir2/CMakeLists.txt
new file mode 100644
index 0000000..19d8de7
--- /dev/null
+++ b/Tests/MSManifest/Subdir2/CMakeLists.txt
@@ -0,0 +1,13 @@
+configure_file(test_manifest1.in test_manifest1.manifest)
+configure_file(test_manifest2.in test_manifest2.manifest)
+configure_file(test_manifest3.in test_manifest3.manifest)
+add_executable(MSMultipleManifest main.c
+ ${CMAKE_CURRENT_BINARY_DIR}/test_manifest1.manifest
+ ${CMAKE_CURRENT_BINARY_DIR}/test_manifest2.manifest
+ ${CMAKE_CURRENT_BINARY_DIR}/test_manifest3.manifest)
+
+if(MSVC AND NOT MSVC_VERSION LESS 1400)
+ add_test(NAME MSManifest.Multiple COMMAND
+ ${CMAKE_COMMAND} -Dexe=$<TARGET_FILE:MSMultipleManifest>
+ -P ${CMAKE_CURRENT_SOURCE_DIR}/check.cmake)
+endif()
diff --git a/Tests/MSManifest/Subdir2/check.cmake b/Tests/MSManifest/Subdir2/check.cmake
new file mode 100644
index 0000000..4a1705b
--- /dev/null
+++ b/Tests/MSManifest/Subdir2/check.cmake
@@ -0,0 +1,22 @@
+file(STRINGS "${exe}" manifest_content1 REGEX "name=\"Kitware.CMake.MSMultipleManifest\"")
+if(manifest_content1)
+ message(STATUS "Expected manifest content found:\n ${manifest_content1}")
+else()
+ message(FATAL_ERROR "Expected manifest content not found in\n ${exe}")
+endif()
+
+# Verify Second Manifest Content is inside Executable.
+file(STRINGS "${exe}" manifest_content2 REGEX "8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a")
+if(manifest_content2)
+ message(STATUS "Expected manifest content found:\n ${manifest_content2}")
+else()
+ message(FATAL_ERROR "Expected manifest content not found in\n ${exe}")
+endif()
+
+# Verify Third Manifest Content is inside Executable.
+file(STRINGS "${exe}" manifest_content3 REGEX "<dpiAware>true</dpiAware>")
+if(manifest_content3)
+ message(STATUS "Expected manifest content found:\n ${manifest_content3}")
+else()
+ message(FATAL_ERROR "Expected manifest content not found in\n ${exe}")
+endif()
diff --git a/Tests/MSManifest/Subdir2/main.c b/Tests/MSManifest/Subdir2/main.c
new file mode 100644
index 0000000..8488f4e
--- /dev/null
+++ b/Tests/MSManifest/Subdir2/main.c
@@ -0,0 +1,4 @@
+int main(void)
+{
+ return 0;
+}
diff --git a/Tests/MSManifest/Subdir2/test_manifest1.in b/Tests/MSManifest/Subdir2/test_manifest1.in
new file mode 100644
index 0000000..f36eead
--- /dev/null
+++ b/Tests/MSManifest/Subdir2/test_manifest1.in
@@ -0,0 +1,5 @@
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+ <assemblyIdentity type="win32" version="1.0.0.0"
+ name="Kitware.CMake.MSMultipleManifest"/>
+ <description>CMake Multiple Manifest Test Application</description>
+</assembly>
diff --git a/Tests/MSManifest/Subdir2/test_manifest2.in b/Tests/MSManifest/Subdir2/test_manifest2.in
new file mode 100644
index 0000000..ec96f11
--- /dev/null
+++ b/Tests/MSManifest/Subdir2/test_manifest2.in
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
+ <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
+ <application>
+ <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"></supportedOS>
+ <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"></supportedOS>
+ <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"></supportedOS>
+ <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"></supportedOS>
+ <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"></supportedOS>
+ </application>
+ </compatibility>
+</assembly>
diff --git a/Tests/MSManifest/Subdir2/test_manifest3.in b/Tests/MSManifest/Subdir2/test_manifest3.in
new file mode 100644
index 0000000..0770e11
--- /dev/null
+++ b/Tests/MSManifest/Subdir2/test_manifest3.in
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
+ <asmv3:application>
+ <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
+ <dpiAware>true</dpiAware>
+ <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
+ </asmv3:windowsSettings>
+ </asmv3:application>
+</assembly>
diff --git a/Tests/ObjectLibrary/CMakeLists.txt b/Tests/ObjectLibrary/CMakeLists.txt
index 7897ab9..fca5f41 100644
--- a/Tests/ObjectLibrary/CMakeLists.txt
+++ b/Tests/ObjectLibrary/CMakeLists.txt
@@ -73,3 +73,5 @@ add_executable(UseABstaticObjs $<TARGET_OBJECTS:UseABstatic>)
target_link_libraries(UseABstaticObjs ABstatic)
add_subdirectory(ExportLanguages)
+
+add_subdirectory(Transitive)
diff --git a/Tests/ObjectLibrary/Transitive/CMakeLists.txt b/Tests/ObjectLibrary/Transitive/CMakeLists.txt
new file mode 100644
index 0000000..d616cda
--- /dev/null
+++ b/Tests/ObjectLibrary/Transitive/CMakeLists.txt
@@ -0,0 +1,12 @@
+cmake_policy(SET CMP0022 NEW)
+add_library(FooStatic STATIC FooStatic.c)
+
+add_library(FooObject1 OBJECT FooObject.c)
+target_link_libraries(FooObject1 PRIVATE FooStatic)
+add_executable(Transitive1 Transitive.c)
+target_link_libraries(Transitive1 PRIVATE FooObject1)
+
+add_library(FooObject2 OBJECT FooObject.c)
+target_link_libraries(FooObject2 INTERFACE FooStatic)
+add_executable(Transitive2 Transitive.c)
+target_link_libraries(Transitive2 PRIVATE FooObject2)
diff --git a/Tests/ObjectLibrary/Transitive/FooObject.c b/Tests/ObjectLibrary/Transitive/FooObject.c
new file mode 100644
index 0000000..54c1f29
--- /dev/null
+++ b/Tests/ObjectLibrary/Transitive/FooObject.c
@@ -0,0 +1,4 @@
+int FooObject(void)
+{
+ return 0;
+}
diff --git a/Tests/ObjectLibrary/Transitive/FooStatic.c b/Tests/ObjectLibrary/Transitive/FooStatic.c
new file mode 100644
index 0000000..84649c7
--- /dev/null
+++ b/Tests/ObjectLibrary/Transitive/FooStatic.c
@@ -0,0 +1,4 @@
+int FooStatic(void)
+{
+ return 0;
+}
diff --git a/Tests/ObjectLibrary/Transitive/Transitive.c b/Tests/ObjectLibrary/Transitive/Transitive.c
new file mode 100644
index 0000000..43089b8
--- /dev/null
+++ b/Tests/ObjectLibrary/Transitive/Transitive.c
@@ -0,0 +1,7 @@
+extern int FooObject(void);
+extern int FooStatic(void);
+
+int main(void)
+{
+ return FooObject() + FooStatic();
+}
diff --git a/Tests/Preprocess/preprocess.c b/Tests/Preprocess/preprocess.c
index 958c77e..b3117da 100644
--- a/Tests/Preprocess/preprocess.c
+++ b/Tests/Preprocess/preprocess.c
@@ -15,21 +15,21 @@ int check_defines_C(void)
result = 0;
}
if (strcmp(TARGET_STRING, STRING_VALUE) != 0) {
- fprintf(stderr, "TARGET_STRING has wrong value in C [%s]\n",
- TARGET_STRING);
+ fprintf(stderr, "TARGET_STRING has wrong value in C [%s] vs [%s]\n",
+ TARGET_STRING, STRING_VALUE);
result = 0;
}
{
int x = 2;
int y = 3;
if ((FILE_EXPR) != (EXPR)) {
- fprintf(stderr, "FILE_EXPR did not work in C [%s]\n",
- TO_STRING(FILE_EXPR));
+ fprintf(stderr, "FILE_EXPR did not work in C [%s] vs [%s]\n",
+ TO_STRING(FILE_EXPR), TO_STRING(EXPR));
result = 0;
}
if ((TARGET_EXPR) != (EXPR)) {
- fprintf(stderr, "TARGET_EXPR did not work in C [%s]\n",
- TO_STRING(FILE_EXPR));
+ fprintf(stderr, "TARGET_EXPR did not work in C [%s] vs [%s]\n",
+ TO_STRING(TARGET_EXPR), TO_STRING(EXPR));
result = 0;
}
}
diff --git a/Tests/Preprocess/preprocess.cxx b/Tests/Preprocess/preprocess.cxx
index 34a69c6..f2fffef 100644
--- a/Tests/Preprocess/preprocess.cxx
+++ b/Tests/Preprocess/preprocess.cxx
@@ -12,25 +12,26 @@ int check_defines_CXX()
{
int result = 1;
if (strcmp(FILE_STRING, STRING_VALUE) != 0) {
- fprintf(stderr, "FILE_STRING has wrong value in CXX [%s]\n", FILE_STRING);
+ fprintf(stderr, "FILE_STRING has wrong value in CXX [%s] vs [%s]\n",
+ FILE_STRING, STRING_VALUE);
result = 0;
}
if (strcmp(TARGET_STRING, STRING_VALUE) != 0) {
- fprintf(stderr, "TARGET_STRING has wrong value in CXX [%s]\n",
- TARGET_STRING);
+ fprintf(stderr, "TARGET_STRING has wrong value in CXX [%s] vs [%s]\n",
+ TARGET_STRING, STRING_VALUE);
result = 0;
}
{
int x = 2;
int y = 3;
if ((FILE_EXPR) != (EXPR)) {
- fprintf(stderr, "FILE_EXPR did not work in CXX [%s]\n",
- TO_STRING(FILE_EXPR));
+ fprintf(stderr, "FILE_EXPR did not work in CXX [%s] vs [%s]\n",
+ TO_STRING(FILE_EXPR), TO_STRING(EXPR));
result = 0;
}
if ((TARGET_EXPR) != (EXPR)) {
- fprintf(stderr, "TARGET_EXPR did not work in CXX [%s]\n",
- TO_STRING(FILE_EXPR));
+ fprintf(stderr, "TARGET_EXPR did not work in CXX [%s] vs [%s]\n",
+ TO_STRING(TARGET_EXPR), TO_STRING(EXPR));
result = 0;
}
}
diff --git a/Tests/Properties/CMakeLists.txt b/Tests/Properties/CMakeLists.txt
index a263061..f93f553 100644
--- a/Tests/Properties/CMakeLists.txt
+++ b/Tests/Properties/CMakeLists.txt
@@ -144,4 +144,143 @@ set_property(CACHE SOME_ENTRY PROPERTY ADVANCED "${expect_ADVANCED}")
set_property(CACHE SOME_ENTRY PROPERTY STRINGS "${expect_STRINGS}")
check_cache_props()
+function(generate_file_for_set_property_test i target_name)
+ set(src_path "${CMAKE_CURRENT_BINARY_DIR}/src${i}.cpp")
+ file(GENERATE OUTPUT "${src_path}" CONTENT
+ "#ifndef def${i}\n\
+ #error Expected def${i}\n\
+ #endif\n\
+ #ifdef _WIN32\n\
+ __declspec(dllexport)\n\
+ #endif\n\
+ void dummy_symbol${i}() {}\n")
+ target_sources(${target_name} PRIVATE "${src_path}")
+endfunction()
+
+add_library(maindirtest SHARED)
add_subdirectory(SubDir2)
+
+set(src_prefix "${CMAKE_CURRENT_BINARY_DIR}/SubDir2/")
+
+# Set property + target directory
+set_property(SOURCE "${src_prefix}/src1.cpp"
+ TARGET_DIRECTORY set_prop_lib_1
+ PROPERTY COMPILE_DEFINITIONS def1)
+
+# Append property + target directory
+set_property(SOURCE "${src_prefix}/src2.cpp"
+ TARGET_DIRECTORY set_prop_lib_1
+ APPEND PROPERTY COMPILE_DEFINITIONS def2)
+
+# Set property + relative directory path
+set_property(SOURCE "${src_prefix}/src3.cpp"
+ DIRECTORY SubDir2
+ PROPERTY COMPILE_DEFINITIONS def3)
+
+# Set property + absolute directory path
+set_property(SOURCE "${src_prefix}/src4.cpp"
+ DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/SubDir2"
+ PROPERTY COMPILE_DEFINITIONS def4)
+
+# Append property + relative directory path
+set_property(SOURCE "${src_prefix}/src5.cpp"
+ DIRECTORY SubDir2
+ APPEND PROPERTY COMPILE_DEFINITIONS def5)
+
+# Append property + absolute directory path
+set_property(SOURCE "${src_prefix}/src6.cpp"
+ DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/SubDir2"
+ APPEND PROPERTY COMPILE_DEFINITIONS def6)
+
+
+# Target directory
+set_source_files_properties("${CMAKE_CURRENT_BINARY_DIR}/SubDir2/src10.cpp"
+ TARGET_DIRECTORY set_prop_lib_1
+ PROPERTIES COMPILE_DEFINITIONS def10)
+
+# Relative directory path
+set_source_files_properties("${CMAKE_CURRENT_BINARY_DIR}/SubDir2/src11.cpp"
+ DIRECTORY SubDir2
+ PROPERTIES COMPILE_DEFINITIONS def11)
+
+# Absolute directory path
+set_source_files_properties("${CMAKE_CURRENT_BINARY_DIR}/SubDir2/src12.cpp"
+ DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/SubDir2"
+ PROPERTIES COMPILE_DEFINITIONS def12)
+
+
+# Multiple files + absolute directory path
+set_source_files_properties("${CMAKE_CURRENT_BINARY_DIR}/SubDir2/src20.cpp"
+ "${CMAKE_CURRENT_BINARY_DIR}/SubDir2/src21.cpp"
+ DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/SubDir2"
+ PROPERTIES COMPILE_DEFINITIONS "def20;def21")
+
+# Multiple files + multiple target directories
+set_source_files_properties("${CMAKE_CURRENT_BINARY_DIR}/SubDir2/src22.cpp"
+ "${CMAKE_CURRENT_BINARY_DIR}/SubDir2/src23.cpp"
+ TARGET_DIRECTORY set_prop_lib_2 set_prop_lib_3
+ PROPERTIES COMPILE_DEFINITIONS "def22;def23")
+
+
+# Multiple files in multiple relative directories
+generate_file_for_set_property_test(30 maindirtest)
+set_source_files_properties("${CMAKE_CURRENT_BINARY_DIR}/src30.cpp"
+ "${CMAKE_CURRENT_BINARY_DIR}/SubDir2/src31.cpp"
+ DIRECTORY . SubDir2
+ PROPERTIES COMPILE_DEFINITIONS "def30;def31")
+
+# Check that specifying files without any properties doesn't crash.
+set_source_files_properties("${CMAKE_CURRENT_BINARY_DIR}/src30.cpp"
+ "${CMAKE_CURRENT_BINARY_DIR}/SubDir2/src31.cpp")
+
+function(check_get_property_value expected)
+ if(NOT actual STREQUAL expected)
+ message(SEND_ERROR "Error: get_property returned unexpected value\n"
+ "actual: ${actual}\n"
+ "expected: ${expected}")
+ endif()
+endfunction()
+
+# Get property + target directory
+get_property(actual
+ SOURCE "${src_prefix}/src1.cpp"
+ TARGET_DIRECTORY set_prop_lib_1
+ PROPERTY COMPILE_DEFINITIONS)
+check_get_property_value("def1")
+
+# Get property + relative directory path
+get_property(actual
+ SOURCE "${src_prefix}/src3.cpp"
+ DIRECTORY SubDir2
+ PROPERTY COMPILE_DEFINITIONS)
+check_get_property_value("def3")
+
+# Get property + absolute directory path
+get_property(actual
+ SOURCE "${src_prefix}/src4.cpp"
+ DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/SubDir2"
+ PROPERTY COMPILE_DEFINITIONS)
+check_get_property_value("def4")
+
+
+# Get property + target directory
+unset(actual)
+get_source_file_property(actual
+ "${CMAKE_CURRENT_BINARY_DIR}/SubDir2/src10.cpp"
+ TARGET_DIRECTORY set_prop_lib_1
+ COMPILE_DEFINITIONS)
+check_get_property_value("def10")
+
+# Get property + relative directory path
+get_source_file_property(actual
+ "${CMAKE_CURRENT_BINARY_DIR}/SubDir2/src11.cpp"
+ DIRECTORY SubDir2
+ COMPILE_DEFINITIONS)
+check_get_property_value("def11")
+
+# Get property + absolute directory path
+get_source_file_property(actual
+ "${CMAKE_CURRENT_BINARY_DIR}/SubDir2/src12.cpp"
+ DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/SubDir2"
+ COMPILE_DEFINITIONS)
+check_get_property_value("def12")
diff --git a/Tests/Properties/SubDir2/CMakeLists.txt b/Tests/Properties/SubDir2/CMakeLists.txt
index 377dc83..9b2c79e 100644
--- a/Tests/Properties/SubDir2/CMakeLists.txt
+++ b/Tests/Properties/SubDir2/CMakeLists.txt
@@ -3,3 +3,28 @@ set_source_files_properties("${CMAKE_CURRENT_SOURCE_DIR}/../subdirtest.cxx"
PROPERTIES COMPILE_DEFINITIONS SUBDIR_TEST)
add_executable(subdirtest "${CMAKE_CURRENT_SOURCE_DIR}/../subdirtest.cxx")
+
+# For set_property
+add_library(set_prop_lib_1 SHARED)
+foreach(i RANGE 1 6)
+ generate_file_for_set_property_test(${i} set_prop_lib_1)
+endforeach()
+
+# For set_source_files_properties
+foreach(i RANGE 10 12)
+ generate_file_for_set_property_test(${i} set_prop_lib_1)
+endforeach()
+
+# For set_source_files_properties + multiple files + absolute directory path
+add_library(set_prop_lib_2 SHARED)
+foreach(i RANGE 20 21)
+ generate_file_for_set_property_test(${i} set_prop_lib_1)
+endforeach()
+
+# For set_source_files_properties + multiple files + multiple target directories
+add_library(set_prop_lib_3 SHARED)
+generate_file_for_set_property_test(22 set_prop_lib_2)
+generate_file_for_set_property_test(23 set_prop_lib_3)
+
+# For set_source_files_properties + multiple files in multiple directories
+generate_file_for_set_property_test(31 set_prop_lib_3)
diff --git a/Tests/RunCMake/AndroidTestUtilities/check.cmake b/Tests/RunCMake/AndroidTestUtilities/check.cmake
index ccd4d74..c24a3cd 100644
--- a/Tests/RunCMake/AndroidTestUtilities/check.cmake
+++ b/Tests/RunCMake/AndroidTestUtilities/check.cmake
@@ -13,7 +13,7 @@ function(compare_build_to_expected)
endfunction()
function(check_for_setup_test)
- file(STRINGS "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" output_var REGEX "add_test\\(setup_test.*")
+ file(STRINGS "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" output_var REGEX "add_test\\(\"setup_test\".*")
if(NOT output_var)
set(RunCMake_TEST_FAILED "Could not find the test: setup_test" PARENT_SCOPE)
endif()
diff --git a/Tests/RunCMake/AutoExportDll/AutoExport.cmake b/Tests/RunCMake/AutoExportDll/AutoExport.cmake
index a550005..85eff7e 100644
--- a/Tests/RunCMake/AutoExportDll/AutoExport.cmake
+++ b/Tests/RunCMake/AutoExportDll/AutoExport.cmake
@@ -5,6 +5,10 @@ add_subdirectory(sub)
add_library(objlib OBJECT objlib.c)
set_property(TARGET objlib PROPERTY POSITION_INDEPENDENT_CODE 1)
add_library(autoexport SHARED hello.cxx world.cxx foo.c $<TARGET_OBJECTS:objlib>)
+add_library(autoexport3 SHARED cppCLI.cxx)
+if(MSVC AND NOT MSVC_VERSION VERSION_LESS 1600)
+ set_property(TARGET autoexport3 PROPERTY COMMON_LANGUAGE_RUNTIME "")
+endif()
add_executable(say say.cxx)
if(MSVC)
@@ -18,4 +22,4 @@ if(MSVC)
target_compile_definitions(say PRIVATE HAS_JUSTNOP)
endif()
endif()
-target_link_libraries(say autoexport autoexport2)
+target_link_libraries(say autoexport autoexport2 autoexport3)
diff --git a/Tests/RunCMake/AutoExportDll/cppCLI.cxx b/Tests/RunCMake/AutoExportDll/cppCLI.cxx
new file mode 100644
index 0000000..816bb6e
--- /dev/null
+++ b/Tests/RunCMake/AutoExportDll/cppCLI.cxx
@@ -0,0 +1,22 @@
+#include <stdio.h>
+
+#ifdef __cplusplus_cli
+# include <msclr\marshal_cppstd.h>
+
+void cliFunction()
+{
+ System::String ^ result = "cliFunction";
+ result = result->Trim();
+ printf(msclr::interop::marshal_as<std::string>(result).c_str());
+}
+#else
+void cliFunction()
+{
+ printf("cliFunction (but /cli was not passed to the compiler)");
+}
+#endif
+
+void nonCliFunction()
+{
+ printf("nonCliFunction");
+}
diff --git a/Tests/RunCMake/AutoExportDll/say.cxx b/Tests/RunCMake/AutoExportDll/say.cxx
index 654b5e0..8fc768a 100644
--- a/Tests/RunCMake/AutoExportDll/say.cxx
+++ b/Tests/RunCMake/AutoExportDll/say.cxx
@@ -17,9 +17,11 @@ void justnop();
}
// test c++ functions
-// forward declare hello and world
+// forward declare hello, world, cliFunction and nonCliFunction
void hello();
void world();
+void cliFunction();
+void nonCliFunction();
// test exports for executable target
extern "C" {
@@ -44,6 +46,10 @@ int main()
bar();
objlib();
printf("\n");
+ cliFunction();
+ printf("\n");
+ nonCliFunction();
+ printf("\n");
#ifdef HAS_JUSTNOP
justnop();
#endif
diff --git a/Tests/RunCMake/BuildDepends/GNU-AS-stdout.txt b/Tests/RunCMake/BuildDepends/GNU-AS-stdout.txt
new file mode 100644
index 0000000..c4326ae
--- /dev/null
+++ b/Tests/RunCMake/BuildDepends/GNU-AS-stdout.txt
@@ -0,0 +1,4 @@
+-- The ASM compiler identification is GNU
+-- Found assembler: [^
+]*/as(\.exe)?
+-- CMAKE_ASM_COMPILER_ID_VENDOR_MATCH='GNU assembler'
diff --git a/Tests/RunCMake/BuildDepends/GNU-AS.cmake b/Tests/RunCMake/BuildDepends/GNU-AS.cmake
new file mode 100644
index 0000000..21921ef
--- /dev/null
+++ b/Tests/RunCMake/BuildDepends/GNU-AS.cmake
@@ -0,0 +1,13 @@
+enable_language(ASM)
+
+# Validate undocumented implementation detail.
+message(STATUS "CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_MATCH='${CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_MATCH}'")
+
+add_library(gnu_as STATIC gnu_as.s)
+target_include_directories(gnu_as PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
+
+file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/check-$<LOWER_CASE:$<CONFIG>>.cmake CONTENT "
+set(check_pairs
+ \"$<TARGET_FILE:gnu_as>|${CMAKE_CURRENT_BINARY_DIR}/gnu_as.inc\"
+ )
+")
diff --git a/Tests/RunCMake/BuildDepends/GNU-AS.step1.cmake b/Tests/RunCMake/BuildDepends/GNU-AS.step1.cmake
new file mode 100644
index 0000000..15a5e96
--- /dev/null
+++ b/Tests/RunCMake/BuildDepends/GNU-AS.step1.cmake
@@ -0,0 +1 @@
+file(WRITE "${RunCMake_TEST_BINARY_DIR}/gnu_as.inc" "")
diff --git a/Tests/RunCMake/BuildDepends/GNU-AS.step2.cmake b/Tests/RunCMake/BuildDepends/GNU-AS.step2.cmake
new file mode 100644
index 0000000..15a5e96
--- /dev/null
+++ b/Tests/RunCMake/BuildDepends/GNU-AS.step2.cmake
@@ -0,0 +1 @@
+file(WRITE "${RunCMake_TEST_BINARY_DIR}/gnu_as.inc" "")
diff --git a/Tests/RunCMake/BuildDepends/RunCMakeTest.cmake b/Tests/RunCMake/BuildDepends/RunCMakeTest.cmake
index e4d7177..7a68c4b 100644
--- a/Tests/RunCMake/BuildDepends/RunCMakeTest.cmake
+++ b/Tests/RunCMake/BuildDepends/RunCMakeTest.cmake
@@ -108,3 +108,8 @@ endfunction()
if(RunCMake_GENERATOR STREQUAL "Xcode")
run_ReGeneration(regenerate-project)
endif()
+
+if(CMake_TEST_BuildDepends_GNU_AS)
+ set(ENV{ASM} "${CMake_TEST_BuildDepends_GNU_AS}")
+ run_BuildDepends(GNU-AS)
+endif()
diff --git a/Tests/RunCMake/BuildDepends/gnu_as.s b/Tests/RunCMake/BuildDepends/gnu_as.s
new file mode 100644
index 0000000..a2e7dfb
--- /dev/null
+++ b/Tests/RunCMake/BuildDepends/gnu_as.s
@@ -0,0 +1 @@
+.include "gnu_as.inc"
diff --git a/Tests/RunCMake/CMP0104/CMP0104-Common.cmake b/Tests/RunCMake/CMP0104/CMP0104-Common.cmake
new file mode 100644
index 0000000..b3568f1
--- /dev/null
+++ b/Tests/RunCMake/CMP0104/CMP0104-Common.cmake
@@ -0,0 +1,2 @@
+enable_language(CUDA)
+add_library(cuda main.cu)
diff --git a/Tests/RunCMake/CMP0104/CMP0104-NEW.cmake b/Tests/RunCMake/CMP0104/CMP0104-NEW.cmake
new file mode 100644
index 0000000..732ab77
--- /dev/null
+++ b/Tests/RunCMake/CMP0104/CMP0104-NEW.cmake
@@ -0,0 +1,6 @@
+cmake_policy(SET CMP0104 NEW)
+include(CMP0104-Common.cmake)
+
+if(NOT CMAKE_CUDA_ARCHITECTURES)
+ message(FATAL_ERROR "CMAKE_CUDA_ARCHITECTURES is empty with CMP0104 enabled.")
+endif()
diff --git a/Tests/RunCMake/CMP0104/CMP0104-OLD.cmake b/Tests/RunCMake/CMP0104/CMP0104-OLD.cmake
new file mode 100644
index 0000000..415eecc
--- /dev/null
+++ b/Tests/RunCMake/CMP0104/CMP0104-OLD.cmake
@@ -0,0 +1,12 @@
+cmake_policy(SET CMP0104 OLD)
+include(CMP0104-Common.cmake)
+
+if(CMAKE_CUDA_COMPILER_ID STREQUAL "NVIDIA")
+ if(CMAKE_CUDA_ARCHITECTURES)
+ message(FATAL_ERROR "CMAKE_CUDA_ARCHITECTURES isn't empty for NVIDIA with CMP0104 OLD.")
+ endif()
+else(NOT CMAKE_CUDA_COMPILER_ID STREQUAL "Unknown")
+ if(NOT CMAKE_CUDA_ARCHITECTURES)
+ message(FATAL_ERROR "CMAKE_CUDA_ARCHITECTURES isn't non-empty for non-NVIDIA with CMP0104 OLD.")
+ endif()
+endif()
diff --git a/Tests/RunCMake/CMP0104/CMP0104-WARN-stderr.txt b/Tests/RunCMake/CMP0104/CMP0104-WARN-stderr.txt
new file mode 100644
index 0000000..2c9b7d7
--- /dev/null
+++ b/Tests/RunCMake/CMP0104/CMP0104-WARN-stderr.txt
@@ -0,0 +1,8 @@
+CMake Warning \(dev\) in CMakeLists.txt:
+ Policy CMP0104 is not set: CMAKE_CUDA_ARCHITECTURES now detected for NVCC,
+ empty CUDA_ARCHITECTURES not allowed. Run "cmake --help-policy CMP0104"
+ for policy details. Use the cmake_policy command to set the policy and
+ suppress this warning.
+
+ CUDA_ARCHITECTURES is empty for target "cuda".
+This warning is for project developers. Use -Wno-dev to suppress it.
diff --git a/Tests/RunCMake/CMP0104/CMP0104-WARN.cmake b/Tests/RunCMake/CMP0104/CMP0104-WARN.cmake
new file mode 100644
index 0000000..2b4a8f5
--- /dev/null
+++ b/Tests/RunCMake/CMP0104/CMP0104-WARN.cmake
@@ -0,0 +1,2 @@
+include(CMP0104-Common.cmake)
+set_property(TARGET cuda PROPERTY CUDA_ARCHITECTURES)
diff --git a/Tests/RunCMake/CMP0104/CMakeLists.txt b/Tests/RunCMake/CMP0104/CMakeLists.txt
new file mode 100644
index 0000000..2632ffa
--- /dev/null
+++ b/Tests/RunCMake/CMP0104/CMakeLists.txt
@@ -0,0 +1,3 @@
+cmake_minimum_required(VERSION 3.16)
+project(${RunCMake_TEST} NONE)
+include(${RunCMake_TEST}.cmake)
diff --git a/Tests/RunCMake/CMP0104/RunCMakeTest.cmake b/Tests/RunCMake/CMP0104/RunCMakeTest.cmake
new file mode 100644
index 0000000..bc8e1b1
--- /dev/null
+++ b/Tests/RunCMake/CMP0104/RunCMakeTest.cmake
@@ -0,0 +1,5 @@
+include(RunCMake)
+
+run_cmake(CMP0104-OLD)
+run_cmake(CMP0104-NEW)
+run_cmake(CMP0104-WARN)
diff --git a/Tests/RunCMake/CMP0104/main.cu b/Tests/RunCMake/CMP0104/main.cu
new file mode 100644
index 0000000..5047a34
--- /dev/null
+++ b/Tests/RunCMake/CMP0104/main.cu
@@ -0,0 +1,3 @@
+int main()
+{
+}
diff --git a/Tests/RunCMake/CMP0106/CMP0106-Common.cmake b/Tests/RunCMake/CMP0106/CMP0106-Common.cmake
new file mode 100644
index 0000000..a1f7908
--- /dev/null
+++ b/Tests/RunCMake/CMP0106/CMP0106-Common.cmake
@@ -0,0 +1,10 @@
+include(Documentation OPTIONAL RESULT_VARIABLE found)
+if (NOT should_find AND found)
+ message(FATAL_ERROR
+ "The Documentation module should not have been found, but it was.")
+endif ()
+if (should_find AND NOT found)
+ message(FATAL_ERROR
+ "The Documentation module should have been found, but it was not.")
+endif ()
+include(${CMAKE_ROOT}/Modules/Documentation.cmake)
diff --git a/Tests/RunCMake/Languages/LINK_LANGUAGE-genex-result.txt b/Tests/RunCMake/CMP0106/CMP0106-NEW-result.txt
index d00491f..d00491f 100644
--- a/Tests/RunCMake/Languages/LINK_LANGUAGE-genex-result.txt
+++ b/Tests/RunCMake/CMP0106/CMP0106-NEW-result.txt
diff --git a/Tests/RunCMake/CMP0106/CMP0106-NEW-stderr.txt b/Tests/RunCMake/CMP0106/CMP0106-NEW-stderr.txt
new file mode 100644
index 0000000..7ad774e
--- /dev/null
+++ b/Tests/RunCMake/CMP0106/CMP0106-NEW-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at .*/Modules/Documentation.cmake:15 \(message\):
+ Documentation.cmake is VTK-specific code and should not be used in non-VTK
+ projects. This logic in this module is best shipped with the project using
+ it rather than with CMake. This is now an error according to policy
+ CMP0106.
+Call Stack \(most recent call first\):
+ CMP0106-Common.cmake:10 \(include\)
+ CMP0106-NEW.cmake:4 \(include\)
+ CMakeLists.txt:7 \(include\)
diff --git a/Tests/RunCMake/CMP0106/CMP0106-NEW.cmake b/Tests/RunCMake/CMP0106/CMP0106-NEW.cmake
new file mode 100644
index 0000000..e7d5bd1
--- /dev/null
+++ b/Tests/RunCMake/CMP0106/CMP0106-NEW.cmake
@@ -0,0 +1,4 @@
+cmake_policy(SET CMP0106 NEW)
+
+set(should_find OFF)
+include(CMP0106-Common.cmake)
diff --git a/Tests/RunCMake/CMP0106/CMP0106-OLD.cmake b/Tests/RunCMake/CMP0106/CMP0106-OLD.cmake
new file mode 100644
index 0000000..730e846
--- /dev/null
+++ b/Tests/RunCMake/CMP0106/CMP0106-OLD.cmake
@@ -0,0 +1,9 @@
+cmake_policy(SET CMP0106 OLD)
+
+set(should_find ON)
+include(CMP0106-Common.cmake)
+if (NOT DEFINED BUILD_DOCUMENTATION)
+ message(FATAL_ERROR
+ "Cache variables seem to have not been made with a `OLD` policy "
+ "setting.")
+endif ()
diff --git a/Tests/RunCMake/CMP0106/CMP0106-WARN-ParaView-stderr.txt b/Tests/RunCMake/CMP0106/CMP0106-WARN-ParaView-stderr.txt
new file mode 100644
index 0000000..b61889b
--- /dev/null
+++ b/Tests/RunCMake/CMP0106/CMP0106-WARN-ParaView-stderr.txt
@@ -0,0 +1,8 @@
+CMake Warning \(dev\) at CMP0106-Common.cmake:1 \(include\):
+ Policy CMP0106 is not set: The Documentation module is removed. Run "cmake
+ --help-policy CMP0106" for policy details. Use the cmake_policy command to
+ set the policy and suppress this warning.
+
+Call Stack \(most recent call first\):
+ subdir/CMakeLists.txt:2 \(include\)
+This warning is for project developers. Use -Wno-dev to suppress it.
diff --git a/Tests/RunCMake/CMP0106/CMP0106-WARN-ParaView.cmake b/Tests/RunCMake/CMP0106/CMP0106-WARN-ParaView.cmake
new file mode 100644
index 0000000..309abcc
--- /dev/null
+++ b/Tests/RunCMake/CMP0106/CMP0106-WARN-ParaView.cmake
@@ -0,0 +1,2 @@
+set(should_find ON)
+add_subdirectory(subdir)
diff --git a/Tests/RunCMake/CMP0106/CMP0106-WARN-VTK-stderr.txt b/Tests/RunCMake/CMP0106/CMP0106-WARN-VTK-stderr.txt
new file mode 100644
index 0000000..f8a754e
--- /dev/null
+++ b/Tests/RunCMake/CMP0106/CMP0106-WARN-VTK-stderr.txt
@@ -0,0 +1,9 @@
+CMake Warning \(dev\) at CMP0106-Common.cmake:1 \(include\):
+ Policy CMP0106 is not set: The Documentation module is removed. Run "cmake
+ --help-policy CMP0106" for policy details. Use the cmake_policy command to
+ set the policy and suppress this warning.
+
+Call Stack \(most recent call first\):
+ CMP0106-WARN-VTK.cmake:2 \(include\)
+ CMakeLists.txt:7 \(include\)
+This warning is for project developers. Use -Wno-dev to suppress it.
diff --git a/Tests/RunCMake/CMP0106/CMP0106-WARN-VTK.cmake b/Tests/RunCMake/CMP0106/CMP0106-WARN-VTK.cmake
new file mode 100644
index 0000000..99f6c39
--- /dev/null
+++ b/Tests/RunCMake/CMP0106/CMP0106-WARN-VTK.cmake
@@ -0,0 +1,2 @@
+set(should_find ON)
+include(CMP0106-Common.cmake)
diff --git a/Tests/RunCMake/CMP0106/CMP0106-WARN-stderr.txt b/Tests/RunCMake/CMP0106/CMP0106-WARN-stderr.txt
new file mode 100644
index 0000000..d0d48d0
--- /dev/null
+++ b/Tests/RunCMake/CMP0106/CMP0106-WARN-stderr.txt
@@ -0,0 +1,37 @@
+CMake Warning \(dev\) at CMP0106-Common.cmake:1 \(include\):
+ Policy CMP0106 is not set: The Documentation module is removed. Run "cmake
+ --help-policy CMP0106" for policy details. Use the cmake_policy command to
+ set the policy and suppress this warning.
+
+Call Stack \(most recent call first\):
+ CMP0106-WARN.cmake:2 \(include\)
+ CMakeLists.txt:7 \(include\)
+This warning is for project developers. Use -Wno-dev to suppress it.
+
+CMake Warning \(dev\) at .*/Modules/Documentation.cmake:27 \(message\):
+ Policy CMP0106 is not set: The Documentation module is removed. Run "cmake
+ --help-policy CMP0106" for policy details. Use the cmake_policy command to
+ set the policy and suppress this warning.
+
+ Documentation.cmake is VTK-specific code and should not be used in non-VTK
+ projects. This logic in this module is best shipped with the project using
+ it rather than with CMake.
+Call Stack \(most recent call first\):
+ CMP0106-Common.cmake:1 \(include\)
+ CMP0106-WARN.cmake:2 \(include\)
+ CMakeLists.txt:7 \(include\)
+This warning is for project developers. Use -Wno-dev to suppress it.
+
+CMake Warning \(dev\) at .*/Modules/Documentation.cmake:27 \(message\):
+ Policy CMP0106 is not set: The Documentation module is removed. Run "cmake
+ --help-policy CMP0106" for policy details. Use the cmake_policy command to
+ set the policy and suppress this warning.
+
+ Documentation.cmake is VTK-specific code and should not be used in non-VTK
+ projects. This logic in this module is best shipped with the project using
+ it rather than with CMake.
+Call Stack \(most recent call first\):
+ CMP0106-Common.cmake:10 \(include\)
+ CMP0106-WARN.cmake:2 \(include\)
+ CMakeLists.txt:7 \(include\)
+This warning is for project developers. Use -Wno-dev to suppress it.
diff --git a/Tests/RunCMake/CMP0106/CMP0106-WARN.cmake b/Tests/RunCMake/CMP0106/CMP0106-WARN.cmake
new file mode 100644
index 0000000..99f6c39
--- /dev/null
+++ b/Tests/RunCMake/CMP0106/CMP0106-WARN.cmake
@@ -0,0 +1,2 @@
+set(should_find ON)
+include(CMP0106-Common.cmake)
diff --git a/Tests/RunCMake/CMP0106/CMakeLists.txt b/Tests/RunCMake/CMP0106/CMakeLists.txt
new file mode 100644
index 0000000..eafa642
--- /dev/null
+++ b/Tests/RunCMake/CMP0106/CMakeLists.txt
@@ -0,0 +1,7 @@
+cmake_minimum_required(VERSION 3.1)
+if (RunCMake_TEST STREQUAL "CMP0106-WARN-VTK")
+ project(VTK NONE)
+else ()
+ project(${RunCMake_TEST} NONE)
+endif ()
+include(${RunCMake_TEST}.cmake)
diff --git a/Tests/RunCMake/CMP0106/RunCMakeTest.cmake b/Tests/RunCMake/CMP0106/RunCMakeTest.cmake
new file mode 100644
index 0000000..acec054
--- /dev/null
+++ b/Tests/RunCMake/CMP0106/RunCMakeTest.cmake
@@ -0,0 +1,7 @@
+include(RunCMake)
+
+run_cmake(CMP0106-OLD)
+run_cmake(CMP0106-NEW)
+run_cmake(CMP0106-WARN)
+run_cmake(CMP0106-WARN-VTK)
+run_cmake(CMP0106-WARN-ParaView)
diff --git a/Tests/RunCMake/CMP0106/subdir/CMakeLists.txt b/Tests/RunCMake/CMP0106/subdir/CMakeLists.txt
new file mode 100644
index 0000000..ed1dd05
--- /dev/null
+++ b/Tests/RunCMake/CMP0106/subdir/CMakeLists.txt
@@ -0,0 +1,2 @@
+project(VTK NONE)
+include(${CMAKE_CURRENT_SOURCE_DIR}/../CMP0106-Common.cmake)
diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt
index e9f8bca..230f168 100644
--- a/Tests/RunCMake/CMakeLists.txt
+++ b/Tests/RunCMake/CMakeLists.txt
@@ -116,6 +116,10 @@ endif()
add_RunCMake_test(CMP0069)
add_RunCMake_test(CMP0081)
add_RunCMake_test(CMP0102)
+if(CMake_TEST_CUDA)
+ add_RunCMake_test(CMP0104)
+endif()
+add_RunCMake_test(CMP0106)
# The test for Policy 65 requires the use of the
# CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS variable, which both the VS and Xcode
@@ -169,7 +173,20 @@ if(CMake_TEST_Qt5 AND Qt5Widgets_FOUND)
set(autogen_with_qt5 TRUE)
endif ()
add_RunCMake_test(Autogen -Dwith_qt5=${autogen_with_qt5})
-add_RunCMake_test(BuildDepends)
+if(NOT DEFINED CMake_TEST_BuildDepends_GNU_AS
+ AND CMAKE_C_COMPILER_ID STREQUAL "GNU"
+ AND CMAKE_GENERATOR MATCHES "^Ninja"
+ )
+ execute_process(COMMAND "${CMAKE_C_COMPILER}" -print-prog-name=as
+ RESULT_VARIABLE _gnu_res
+ OUTPUT_VARIABLE _gnu_as OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET)
+ if(_gnu_res EQUAL 0 AND _gnu_as)
+ set(CMake_TEST_BuildDepends_GNU_AS "${_gnu_as}")
+ endif()
+endif()
+add_RunCMake_test(BuildDepends
+ -DCMake_TEST_BuildDepends_GNU_AS=${CMake_TEST_BuildDepends_GNU_AS}
+ )
if(UNIX AND "${CMAKE_GENERATOR}" MATCHES "Unix Makefiles|Ninja")
add_RunCMake_test(Byproducts)
endif()
@@ -180,6 +197,9 @@ endif()
add_RunCMake_test(CompilerNotFound)
add_RunCMake_test(Configure -DMSVC_IDE=${MSVC_IDE})
add_RunCMake_test(DisallowedCommands)
+if("${CMAKE_GENERATOR}" MATCHES "Unix Makefiles|Ninja")
+ add_RunCMake_test(ExportCompileCommands)
+endif()
add_RunCMake_test(ExternalData)
add_RunCMake_test(FeatureSummary)
add_RunCMake_test(FPHSA)
@@ -188,6 +208,7 @@ add_RunCMake_test(FindBoost)
add_RunCMake_test(FindLua)
add_RunCMake_test(FindOpenGL)
if(CMake_TEST_UseSWIG)
+ add_RunCMake_test(FindSWIG)
add_RunCMake_test(UseSWIG -DCMake_TEST_FindPython=${CMake_TEST_FindPython})
endif()
if(NOT CMAKE_C_COMPILER_ID MATCHES "Watcom")
@@ -251,6 +272,7 @@ add_RunCMake_test(add_dependencies)
add_RunCMake_test(add_executable)
add_RunCMake_test(add_library)
add_RunCMake_test(add_subdirectory)
+add_RunCMake_test(add_test)
add_RunCMake_test(build_command)
add_executable(exit_code exit_code.c)
set(execute_process_ARGS -DEXIT_CODE_EXE=$<TARGET_FILE:exit_code>)
@@ -447,12 +469,15 @@ if(CMAKE_C_COMPILER_ID STREQUAL "AppleClang"
add_RunCMake_test(Framework)
endif()
+add_RunCMake_test(File_Archive)
+add_RunCMake_test(File_Configure)
add_RunCMake_test(File_Generate)
add_RunCMake_test(ExportWithoutLanguage)
add_RunCMake_test(target_link_directories)
add_RunCMake_test(target_link_libraries)
add_RunCMake_test(add_link_options -DCMAKE_C_COMPILER_ID=${CMAKE_C_COMPILER_ID})
-add_RunCMake_test(target_link_options -DCMAKE_C_COMPILER_ID=${CMAKE_C_COMPILER_ID})
+add_RunCMake_test(target_link_options -DCMAKE_C_COMPILER_ID=${CMAKE_C_COMPILER_ID}
+ -DCMake_TEST_CUDA=${CMake_TEST_CUDA})
add_RunCMake_test(target_compile_definitions)
add_RunCMake_test(target_compile_features)
@@ -649,5 +674,7 @@ endif()
add_RunCMake_test("CTestCommandExpandLists")
-add_RunCMake_test(PrecompileHeaders)
+add_RunCMake_test(PrecompileHeaders -DCMAKE_C_COMPILER_ID=${CMAKE_C_COMPILER_ID})
add_RunCMake_test("UnityBuild")
+
+add_RunCMake_test(cmake_command)
diff --git a/Tests/RunCMake/CPack/RunCMakeTest.cmake b/Tests/RunCMake/CPack/RunCMakeTest.cmake
index 3be1fd0..064b4dc 100644
--- a/Tests/RunCMake/CPack/RunCMakeTest.cmake
+++ b/Tests/RunCMake/CPack/RunCMakeTest.cmake
@@ -20,6 +20,8 @@ run_cpack_test(LONG_FILENAMES "DEB.LONG_FILENAMES" false "MONOLITHIC")
run_cpack_test_subtests(MAIN_COMPONENT "invalid;found" "RPM.MAIN_COMPONENT" false "COMPONENT")
run_cpack_test(MINIMAL "RPM.MINIMAL;DEB.MINIMAL;7Z;TBZ2;TGZ;TXZ;TZ;ZIP;STGZ;External" false "MONOLITHIC;COMPONENT")
run_cpack_test_package_target(MINIMAL "RPM.MINIMAL;DEB.MINIMAL;7Z;TBZ2;TGZ;TXZ;TZ;ZIP;STGZ;External" false "MONOLITHIC;COMPONENT")
+run_cpack_test_package_target(THREADED_ALL "TXZ" false "MONOLITHIC;COMPONENT")
+run_cpack_test_package_target(THREADED "TXZ" false "MONOLITHIC;COMPONENT")
run_cpack_test_subtests(PACKAGE_CHECKSUM "invalid;MD5;SHA1;SHA224;SHA256;SHA384;SHA512" "TGZ" false "MONOLITHIC")
run_cpack_test(PARTIALLY_RELOCATABLE_WARNING "RPM.PARTIALLY_RELOCATABLE_WARNING" false "COMPONENT")
run_cpack_test(PER_COMPONENT_FIELDS "RPM.PER_COMPONENT_FIELDS;DEB.PER_COMPONENT_FIELDS" false "COMPONENT")
diff --git a/Tests/RunCMake/CPack/tests/INSTALL_SCRIPTS/VerifyResult.cmake b/Tests/RunCMake/CPack/tests/INSTALL_SCRIPTS/VerifyResult.cmake
index d7d82f2..1a1e983 100644
--- a/Tests/RunCMake/CPack/tests/INSTALL_SCRIPTS/VerifyResult.cmake
+++ b/Tests/RunCMake/CPack/tests/INSTALL_SCRIPTS/VerifyResult.cmake
@@ -25,5 +25,5 @@ function(checkScripts_ FILE COMPARE_LIST)
endforeach()
endfunction()
-checkScripts_("${FOUND_FILE_1}" "echo \"pre install foo\";echo \"post install foo\";echo \"pre uninstall foo\";echo \"post uninstall foo\"")
-checkScripts_("${FOUND_FILE_2}" "echo \"pre install\";echo \"post install\";echo \"pre uninstall\";echo \"post uninstall\"")
+checkScripts_("${FOUND_FILE_1}" "echo \"pre install foo\";echo \"post install foo\";echo \"pre uninstall foo\";echo \"post uninstall foo\";echo \"pre trans foo\";echo \"post trans foo\"")
+checkScripts_("${FOUND_FILE_2}" "echo \"pre install\";echo \"post install\";echo \"pre uninstall\";echo \"post uninstall\";echo \"pre trans\";echo \"post trans\"")
diff --git a/Tests/RunCMake/CPack/tests/INSTALL_SCRIPTS/test.cmake b/Tests/RunCMake/CPack/tests/INSTALL_SCRIPTS/test.cmake
index fb1b8de..c200fa5 100644
--- a/Tests/RunCMake/CPack/tests/INSTALL_SCRIPTS/test.cmake
+++ b/Tests/RunCMake/CPack/tests/INSTALL_SCRIPTS/test.cmake
@@ -7,6 +7,10 @@ if(GENERATOR_TYPE STREQUAL "RPM")
"${CMAKE_CURRENT_BINARY_DIR}/pre_uninstall.sh")
set(CPACK_RPM_POST_UNINSTALL_SCRIPT_FILE
"${CMAKE_CURRENT_BINARY_DIR}/post_uninstall.sh")
+ set(CPACK_RPM_PRE_TRANS_SCRIPT_FILE
+ "${CMAKE_CURRENT_BINARY_DIR}/pre_trans.sh")
+ set(CPACK_RPM_POST_TRANS_SCRIPT_FILE
+ "${CMAKE_CURRENT_BINARY_DIR}/post_trans.sh")
set(CPACK_RPM_foo_PRE_INSTALL_SCRIPT_FILE
"${CMAKE_CURRENT_BINARY_DIR}/pre_install_foo.sh")
@@ -16,6 +20,10 @@ if(GENERATOR_TYPE STREQUAL "RPM")
"${CMAKE_CURRENT_BINARY_DIR}/pre_uninstall_foo.sh")
set(CPACK_RPM_foo_POST_UNINSTALL_SCRIPT_FILE
"${CMAKE_CURRENT_BINARY_DIR}/post_uninstall_foo.sh")
+ set(CPACK_RPM_foo_PRE_TRANS_SCRIPT_FILE
+ "${CMAKE_CURRENT_BINARY_DIR}/pre_trans_foo.sh")
+ set(CPACK_RPM_foo_POST_TRANS_SCRIPT_FILE
+ "${CMAKE_CURRENT_BINARY_DIR}/post_trans_foo.sh")
endif()
set(CMAKE_BUILD_WITH_INSTALL_RPATH 1)
@@ -29,6 +37,10 @@ file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/pre_uninstall.sh"
"echo \"pre uninstall\"\n")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/post_uninstall.sh"
"echo \"post uninstall\"\n")
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/pre_trans.sh"
+ "echo \"pre trans\"\n")
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/post_trans.sh"
+ "echo \"post trans\"\n")
# specific
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/pre_install_foo.sh"
@@ -39,6 +51,10 @@ file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/pre_uninstall_foo.sh"
"echo \"pre uninstall foo\"\n")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/post_uninstall_foo.sh"
"echo \"post uninstall foo\"\n")
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/pre_trans_foo.sh"
+ "echo \"pre trans foo\"\n")
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/post_trans_foo.sh"
+ "echo \"post trans foo\"\n")
install(FILES CMakeLists.txt DESTINATION foo COMPONENT foo)
install(FILES CMakeLists.txt DESTINATION bar COMPONENT bar)
diff --git a/Tests/RunCMake/CPack/tests/THREADED/ExpectedFiles.cmake b/Tests/RunCMake/CPack/tests/THREADED/ExpectedFiles.cmake
new file mode 100644
index 0000000..d1a3a5f
--- /dev/null
+++ b/Tests/RunCMake/CPack/tests/THREADED/ExpectedFiles.cmake
@@ -0,0 +1,2 @@
+set(EXPECTED_FILES_COUNT "1")
+set(EXPECTED_FILE_CONTENT_1_LIST "/foo;/foo/CMakeLists.txt")
diff --git a/Tests/RunCMake/CPack/tests/THREADED/test.cmake b/Tests/RunCMake/CPack/tests/THREADED/test.cmake
new file mode 100644
index 0000000..78fc9e9
--- /dev/null
+++ b/Tests/RunCMake/CPack/tests/THREADED/test.cmake
@@ -0,0 +1,7 @@
+install(FILES CMakeLists.txt DESTINATION foo COMPONENT test)
+
+set(CPACK_ARCHIVE_THREADS 2)
+
+if(PACKAGING_TYPE STREQUAL "COMPONENT")
+ set(CPACK_COMPONENTS_ALL test)
+endif()
diff --git a/Tests/RunCMake/CPack/tests/THREADED_ALL/ExpectedFiles.cmake b/Tests/RunCMake/CPack/tests/THREADED_ALL/ExpectedFiles.cmake
new file mode 100644
index 0000000..d1a3a5f
--- /dev/null
+++ b/Tests/RunCMake/CPack/tests/THREADED_ALL/ExpectedFiles.cmake
@@ -0,0 +1,2 @@
+set(EXPECTED_FILES_COUNT "1")
+set(EXPECTED_FILE_CONTENT_1_LIST "/foo;/foo/CMakeLists.txt")
diff --git a/Tests/RunCMake/CPack/tests/THREADED_ALL/test.cmake b/Tests/RunCMake/CPack/tests/THREADED_ALL/test.cmake
new file mode 100644
index 0000000..34051b8
--- /dev/null
+++ b/Tests/RunCMake/CPack/tests/THREADED_ALL/test.cmake
@@ -0,0 +1,7 @@
+install(FILES CMakeLists.txt DESTINATION foo COMPONENT test)
+
+set(CPACK_ARCHIVE_THREADS 0)
+
+if(PACKAGING_TYPE STREQUAL "COMPONENT")
+ set(CPACK_COMPONENTS_ALL test)
+endif()
diff --git a/Tests/RunCMake/CTestCommandLine/MemCheckSan.cmake b/Tests/RunCMake/CTestCommandLine/MemCheckSan.cmake
new file mode 100644
index 0000000..192c30c
--- /dev/null
+++ b/Tests/RunCMake/CTestCommandLine/MemCheckSan.cmake
@@ -0,0 +1,7 @@
+set(MEMORYCHECK_COMMAND "")
+include(CTest)
+add_test(
+ NAME TestSan
+ COMMAND ${CMAKE_COMMAND}
+ -P ${CMAKE_CURRENT_LIST_DIR}/../ctest_memcheck/test${MEMORYCHECK_TYPE}.cmake
+ )
diff --git a/Tests/RunCMake/CTestCommandLine/RunCMakeTest.cmake b/Tests/RunCMake/CTestCommandLine/RunCMakeTest.cmake
index 9b9ae65..e05ad79 100644
--- a/Tests/RunCMake/CTestCommandLine/RunCMakeTest.cmake
+++ b/Tests/RunCMake/CTestCommandLine/RunCMakeTest.cmake
@@ -242,6 +242,20 @@ function(run_TestOutputSize)
endfunction()
run_TestOutputSize()
+# Test --stop-on-failure
+function(run_stop_on_failure)
+ set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/stop-on-failure)
+ set(RunCMake_TEST_NO_CLEAN 1)
+ file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
+ file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
+ file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
+add_test(test1 \"${CMAKE_COMMAND}\" -E false)
+add_test(test2 \"${CMAKE_COMMAND}\" -E echo \"not running\")
+")
+ run_cmake_command(stop-on-failure ${CMAKE_CTEST_COMMAND} --stop-on-failure)
+endfunction()
+run_stop_on_failure()
+
function(run_TestAffinity)
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/TestAffinity)
set(RunCMake_TEST_NO_CLEAN 1)
@@ -345,3 +359,24 @@ run_NoTests()
# Check the configuration type variable is passed
run_ctest(check-configuration-type)
+
+function(run_MemCheckSan case opts)
+ # Use a single build tree for a few tests without cleaning.
+ set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/MemCheckSan${case}-build)
+ set(RunCMake_TEST_OPTIONS
+ "-DMEMORYCHECK_TYPE=${case}Sanitizer"
+ "-DMEMORYCHECK_SANITIZER_OPTIONS=${opts}"
+ )
+ run_cmake(MemCheckSan)
+ unset(RunCMake_TEST_OPTIONS)
+ set(RunCMake_TEST_NO_CLEAN 1)
+ set(RunCMake-stdout-file "../ctest_memcheck/Dummy${case}Sanitizer-stdout.txt")
+ run_cmake_command(MemCheckSan${case}-ctest
+ ${CMAKE_CTEST_COMMAND} -C Debug -M Experimental -T MemCheck -V
+ )
+endfunction()
+run_MemCheckSan(Address "simulate_sanitizer=1:report_bugs=1:history_size=5:exitcode=55")
+run_MemCheckSan(Leak "simulate_sanitizer=1:report_bugs=1:history_size=5:exitcode=55")
+run_MemCheckSan(Memory "simulate_sanitizer=1:report_bugs=1:history_size=5:exitcode=55")
+run_MemCheckSan(Thread "report_bugs=1:history_size=5:exitcode=55")
+run_MemCheckSan(UndefinedBehavior "simulate_sanitizer=1")
diff --git a/Tests/RunCMake/CTestCommandLine/stop-on-failure-result.txt b/Tests/RunCMake/CTestCommandLine/stop-on-failure-result.txt
new file mode 100644
index 0000000..45a4fb7
--- /dev/null
+++ b/Tests/RunCMake/CTestCommandLine/stop-on-failure-result.txt
@@ -0,0 +1 @@
+8
diff --git a/Tests/RunCMake/CTestCommandLine/stop-on-failure-stderr.txt b/Tests/RunCMake/CTestCommandLine/stop-on-failure-stderr.txt
new file mode 100644
index 0000000..ba4235d
--- /dev/null
+++ b/Tests/RunCMake/CTestCommandLine/stop-on-failure-stderr.txt
@@ -0,0 +1 @@
+Errors while running CTest
diff --git a/Tests/RunCMake/CTestCommandLine/stop-on-failure-stdout.txt b/Tests/RunCMake/CTestCommandLine/stop-on-failure-stdout.txt
new file mode 100644
index 0000000..12c77d0
--- /dev/null
+++ b/Tests/RunCMake/CTestCommandLine/stop-on-failure-stdout.txt
@@ -0,0 +1,10 @@
+^Test project .*/Tests/RunCMake/CTestCommandLine/stop-on-failure
+ Start 1: test1
+1/2 Test #1: test1 ............................\*\*\*Failed +[0-9.]+ sec
++
+0% tests passed, 1 tests failed out of 1
++
+Total Test time \(real\) = +[0-9.]+ sec
++
+The following tests FAILED:
+[ ]+1 - test1 \(Failed\)$
diff --git a/Tests/RunCMake/CTestResourceAllocation/RunCMakeTest.cmake b/Tests/RunCMake/CTestResourceAllocation/RunCMakeTest.cmake
index 8584786..e9aa3a4 100644
--- a/Tests/RunCMake/CTestResourceAllocation/RunCMakeTest.cmake
+++ b/Tests/RunCMake/CTestResourceAllocation/RunCMakeTest.cmake
@@ -38,6 +38,13 @@ function(run_ctresalloc_verify name tests)
run_cmake_command(${name} "${CTRESALLOC_COMMAND}" verify "${RunCMake_SOURCE_DIR}/${name}.log" "${CMAKE_CURRENT_LIST_DIR}/resspec.json" "${tests}")
endfunction()
+function(read_testing_file filename variable)
+ file(READ "${RunCMake_TEST_BINARY_DIR}/Testing/TAG" _tag)
+ string(REGEX REPLACE "^([^\n]*)\n.*$" "\\1" _date "${_tag}")
+ file(READ "${RunCMake_TEST_BINARY_DIR}/Testing/${_date}/${filename}" _contents)
+ set("${variable}" "${_contents}" PARENT_SCOPE)
+endfunction()
+
unset(ENV{CTEST_RESOURCE_GROUP_COUNT})
set(RunCMake_TEST_NO_CLEAN 1)
file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/ctresalloc-write-proc-good1-build")
@@ -140,9 +147,13 @@ run_ctresalloc_verify(ctresalloc-verify-noend "test1")
# Now test the resource allocation feature of CTest
###############################################################################
-function(run_ctest_resource name parallel random)
- run_ctest("${name}-ctest-s-res" "-DCTEST_RESOURCE_ALLOC_ENABLED=1" "-DCTRESALLOC_COMMAND=${CTRESALLOC_COMMAND}" "-DCTEST_PARALLEL=${parallel}" "-DCTEST_RANDOM=${random}")
- run_ctest("${name}-ctest-s-nores" "-DCTEST_RESOURCE_ALLOC_ENABLED=0" "-DCTRESALLOC_COMMAND=${CTRESALLOC_COMMAND}" "-DCTEST_PARALLEL=${parallel}" "-DCTEST_RANDOM=${random}")
+function(run_ctest_resource name parallel random extra)
+ run_ctest("${name}-ctest-s-res" "-DCTEST_RESOURCE_ALLOC_ENABLED=1" "-DCTEST_RESOURCE_SPEC_SOURCE=ARG" "-DCTRESALLOC_COMMAND=${CTRESALLOC_COMMAND}" "-DCTEST_PARALLEL=${parallel}" "-DCTEST_RANDOM=${random}")
+ run_ctest("${name}-ctest-s-nores" "-DCTEST_RESOURCE_ALLOC_ENABLED=0" "-DCTEST_RESOURCE_SPEC_SOURCE=NONE" "-DCTRESALLOC_COMMAND=${CTRESALLOC_COMMAND}" "-DCTEST_PARALLEL=${parallel}" "-DCTEST_RANDOM=${random}")
+ if(extra)
+ run_ctest("${name}-ctest-s-res-variable" "-DCTEST_RESOURCE_ALLOC_ENABLED=1" "-DCTEST_RESOURCE_SPEC_SOURCE=VARIABLE" "-DCTRESALLOC_COMMAND=${CTRESALLOC_COMMAND}" "-DCTEST_PARALLEL=${parallel}" "-DCTEST_RANDOM=${random}")
+ run_ctest("${name}-ctest-s-res-cache" "-DCTEST_RESOURCE_ALLOC_ENABLED=1" "-DCTEST_RESOURCE_SPEC_SOURCE=CACHE" "-DCTRESALLOC_COMMAND=${CTRESALLOC_COMMAND}" "-DCTEST_PARALLEL=${parallel}" "-DCTEST_RANDOM=${random}")
+ endif()
endfunction()
function(verify_ctest_resources)
@@ -155,15 +166,15 @@ function(verify_ctest_resources)
endif()
endfunction()
-run_ctest_resource(lotsoftests 10 1)
-run_ctest_resource(checkfree1 2 0)
-run_ctest_resource(checkfree2 1 0)
-run_ctest_resource(notenough1 1 0)
-run_ctest_resource(notenough2 1 0)
-run_ctest_resource(notenough3 1 0)
-run_ctest_resource(combine 1 0)
-run_ctest_resource(ensure_parallel 2 0)
+run_ctest_resource(lotsoftests 10 1 0)
+run_ctest_resource(checkfree1 2 0 1)
+run_ctest_resource(checkfree2 1 0 0)
+run_ctest_resource(notenough1 1 0 1)
+run_ctest_resource(notenough2 1 0 0)
+run_ctest_resource(notenough3 1 0 0)
+run_ctest_resource(combine 1 0 0)
+run_ctest_resource(ensure_parallel 2 0 0)
set(ENV{CTEST_RESOURCE_GROUP_COUNT} 2)
-run_ctest_resource(process_count 1 0)
+run_ctest_resource(process_count 1 0 0)
unset(ENV{CTEST_RESOURCE_GROUP_COUNT})
diff --git a/Tests/RunCMake/CTestResourceAllocation/checkfree1-ctest-s-res-cache-check.cmake b/Tests/RunCMake/CTestResourceAllocation/checkfree1-ctest-s-res-cache-check.cmake
new file mode 100644
index 0000000..ceda72e
--- /dev/null
+++ b/Tests/RunCMake/CTestResourceAllocation/checkfree1-ctest-s-res-cache-check.cmake
@@ -0,0 +1 @@
+verify_ctest_resources()
diff --git a/Tests/RunCMake/CTestResourceAllocation/checkfree1-ctest-s-res-variable-check.cmake b/Tests/RunCMake/CTestResourceAllocation/checkfree1-ctest-s-res-variable-check.cmake
new file mode 100644
index 0000000..ceda72e
--- /dev/null
+++ b/Tests/RunCMake/CTestResourceAllocation/checkfree1-ctest-s-res-variable-check.cmake
@@ -0,0 +1 @@
+verify_ctest_resources()
diff --git a/Tests/RunCMake/CTestResourceAllocation/ctresalloc.cxx b/Tests/RunCMake/CTestResourceAllocation/ctresalloc.cxx
index 80db05e..daf8a2d 100644
--- a/Tests/RunCMake/CTestResourceAllocation/ctresalloc.cxx
+++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc.cxx
@@ -1,6 +1,6 @@
#include <cassert>
#include <chrono>
-#include <cstddef>
+#include <cstddef> // IWYU pragma: keep
#include <cstdlib>
#include <iostream>
#include <map>
diff --git a/Tests/RunCMake/CTestResourceAllocation/notenough1-ctest-s-res-cache-check.cmake b/Tests/RunCMake/CTestResourceAllocation/notenough1-ctest-s-res-cache-check.cmake
new file mode 100644
index 0000000..321e9a2
--- /dev/null
+++ b/Tests/RunCMake/CTestResourceAllocation/notenough1-ctest-s-res-cache-check.cmake
@@ -0,0 +1,3 @@
+if(EXISTS "${RunCMake_TEST_BINARY_DIR}/ctresalloc.log")
+ set(RunCMake_TEST_FAILED "ctresalloc.log should not exist")
+endif()
diff --git a/Tests/RunCMake/CTestResourceAllocation/notenough1-ctest-s-res-cache-result.txt b/Tests/RunCMake/CTestResourceAllocation/notenough1-ctest-s-res-cache-result.txt
new file mode 100644
index 0000000..b57e2de
--- /dev/null
+++ b/Tests/RunCMake/CTestResourceAllocation/notenough1-ctest-s-res-cache-result.txt
@@ -0,0 +1 @@
+(-1|255)
diff --git a/Tests/RunCMake/CTestResourceAllocation/notenough1-ctest-s-res-cache-stderr.txt b/Tests/RunCMake/CTestResourceAllocation/notenough1-ctest-s-res-cache-stderr.txt
new file mode 100644
index 0000000..521a34b
--- /dev/null
+++ b/Tests/RunCMake/CTestResourceAllocation/notenough1-ctest-s-res-cache-stderr.txt
@@ -0,0 +1,14 @@
+^Insufficient resources for test Test1:
+
+ Test requested resources of type 'fluxcapacitors' in the following amounts:
+ 200 slots
+ but only the following units were available:
+ 'outatime': 121 slots
+
+Resource spec file:
+
+ [^
+]*/Tests/RunCMake/CTestResourceAllocation/resspec.json
+CMake Error at [^
+]*/Tests/RunCMake/CTestResourceAllocation/notenough1-ctest-s-res-cache/test\.cmake:[0-9]+ \(message\):
+ Tests did not pass$
diff --git a/Tests/RunCMake/CTestResourceAllocation/notenough1-ctest-s-res-variable-check.cmake b/Tests/RunCMake/CTestResourceAllocation/notenough1-ctest-s-res-variable-check.cmake
new file mode 100644
index 0000000..321e9a2
--- /dev/null
+++ b/Tests/RunCMake/CTestResourceAllocation/notenough1-ctest-s-res-variable-check.cmake
@@ -0,0 +1,3 @@
+if(EXISTS "${RunCMake_TEST_BINARY_DIR}/ctresalloc.log")
+ set(RunCMake_TEST_FAILED "ctresalloc.log should not exist")
+endif()
diff --git a/Tests/RunCMake/CTestResourceAllocation/notenough1-ctest-s-res-variable-result.txt b/Tests/RunCMake/CTestResourceAllocation/notenough1-ctest-s-res-variable-result.txt
new file mode 100644
index 0000000..b57e2de
--- /dev/null
+++ b/Tests/RunCMake/CTestResourceAllocation/notenough1-ctest-s-res-variable-result.txt
@@ -0,0 +1 @@
+(-1|255)
diff --git a/Tests/RunCMake/CTestResourceAllocation/notenough1-ctest-s-res-variable-stderr.txt b/Tests/RunCMake/CTestResourceAllocation/notenough1-ctest-s-res-variable-stderr.txt
new file mode 100644
index 0000000..dcf13e0
--- /dev/null
+++ b/Tests/RunCMake/CTestResourceAllocation/notenough1-ctest-s-res-variable-stderr.txt
@@ -0,0 +1,14 @@
+^Insufficient resources for test Test1:
+
+ Test requested resources of type 'fluxcapacitors' in the following amounts:
+ 200 slots
+ but only the following units were available:
+ 'outatime': 121 slots
+
+Resource spec file:
+
+ [^
+]*/Tests/RunCMake/CTestResourceAllocation/resspec.json
+CMake Error at [^
+]*/Tests/RunCMake/CTestResourceAllocation/notenough1-ctest-s-res-variable/test\.cmake:[0-9]+ \(message\):
+ Tests did not pass$
diff --git a/Tests/RunCMake/CTestResourceAllocation/process_count-ctest-s-nores-check.cmake b/Tests/RunCMake/CTestResourceAllocation/process_count-ctest-s-nores-check.cmake
new file mode 100644
index 0000000..c6e72bd
--- /dev/null
+++ b/Tests/RunCMake/CTestResourceAllocation/process_count-ctest-s-nores-check.cmake
@@ -0,0 +1,4 @@
+read_testing_file("Test.xml" _test_contents)
+if(NOT _test_contents MATCHES "#CTEST_RESOURCE_GROUP_COUNT=")
+ string(APPEND RunCMake_TEST_FAILED "Could not find unset variable CTEST_RESOURCE_GROUP_COUNT in test measurements\n")
+endif()
diff --git a/Tests/RunCMake/CTestResourceAllocation/process_count-ctest-s-res-check.cmake b/Tests/RunCMake/CTestResourceAllocation/process_count-ctest-s-res-check.cmake
index ceda72e..585c36b 100644
--- a/Tests/RunCMake/CTestResourceAllocation/process_count-ctest-s-res-check.cmake
+++ b/Tests/RunCMake/CTestResourceAllocation/process_count-ctest-s-res-check.cmake
@@ -1 +1,9 @@
verify_ctest_resources()
+
+read_testing_file("Test.xml" _test_contents)
+if(NOT _test_contents MATCHES "\nCTEST_RESOURCE_GROUP_0=widgets")
+ string(APPEND RunCMake_TEST_FAILED "Could not find variable CTEST_RESOURCE_GROUP_0 in test measurements\n")
+endif()
+if(NOT _test_contents MATCHES "\nCTEST_RESOURCE_GROUP_0_WIDGETS=id:")
+ string(APPEND RunCMake_TEST_FAILED "Could not find variable CTEST_RESOURCE_GROUP_0_WIDGETS in test measurements\n")
+endif()
diff --git a/Tests/RunCMake/CTestResourceAllocation/test.cmake.in b/Tests/RunCMake/CTestResourceAllocation/test.cmake.in
index 4b426f1..54eb4e9 100644
--- a/Tests/RunCMake/CTestResourceAllocation/test.cmake.in
+++ b/Tests/RunCMake/CTestResourceAllocation/test.cmake.in
@@ -8,15 +8,21 @@ set(CTEST_CMAKE_GENERATOR_TOOLSET "@RunCMake_GENERATOR_TOOLSET@")
set(CTEST_BUILD_CONFIGURATION "$ENV{CMAKE_CONFIG_TYPE}")
set(CTEST_NIGHTLY_START_TIME "01:00:00 UTC")
-ctest_start(Experimental QUIET)
-ctest_configure(OPTIONS
+set(config_options
"-DCTEST_RESOURCE_ALLOC_ENABLED=${CTEST_RESOURCE_ALLOC_ENABLED};-DCTRESALLOC_COMMAND=${CTRESALLOC_COMMAND}"
)
-ctest_build()
-if(CTEST_RESOURCE_ALLOC_ENABLED)
+if(CTEST_RESOURCE_SPEC_SOURCE STREQUAL "ARG")
set(resspec RESOURCE_SPEC_FILE "@RunCMake_SOURCE_DIR@/resspec.json")
+elseif(CTEST_RESOURCE_SPEC_SOURCE STREQUAL "VARIABLE")
+ set(CTEST_RESOURCE_SPEC_FILE "@RunCMake_SOURCE_DIR@/resspec.json")
+elseif(CTEST_RESOURCE_SPEC_SOURCE STREQUAL "CACHE")
+ list(APPEND config_options "-DCTEST_RESOURCE_SPEC_FILE=@RunCMake_SOURCE_DIR@/resspec.json")
endif()
+
+ctest_start(Experimental QUIET)
+ctest_configure(OPTIONS "${config_options}")
+ctest_build()
ctest_test(${resspec} RETURN_VALUE retval PARALLEL_LEVEL ${CTEST_PARALLEL} SCHEDULE_RANDOM ${CTEST_RANDOM})
if(retval)
message(FATAL_ERROR "Tests did not pass")
diff --git a/Tests/RunCMake/CommandLine/E_cat_directory-result.txt b/Tests/RunCMake/CommandLine/E_cat_directory-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/CommandLine/E_cat_directory-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/CommandLine/E_cat_directory-stderr.txt b/Tests/RunCMake/CommandLine/E_cat_directory-stderr.txt
new file mode 100644
index 0000000..c4d0d48
--- /dev/null
+++ b/Tests/RunCMake/CommandLine/E_cat_directory-stderr.txt
@@ -0,0 +1 @@
+^CMake Error: .* is a directory
diff --git a/Tests/RunCMake/CommandLine/E_cat_good_cat-stdout.txt b/Tests/RunCMake/CommandLine/E_cat_good_cat-stdout.txt
new file mode 100644
index 0000000..aae90e6
--- /dev/null
+++ b/Tests/RunCMake/CommandLine/E_cat_good_cat-stdout.txt
@@ -0,0 +1,3 @@
+first file to append
+second file to append
+àéùç - 한국어
diff --git a/Tests/RunCMake/CommandLine/E_cat_non_existing_file-result.txt b/Tests/RunCMake/CommandLine/E_cat_non_existing_file-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/CommandLine/E_cat_non_existing_file-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/CommandLine/E_cat_non_existing_file-stderr.txt b/Tests/RunCMake/CommandLine/E_cat_non_existing_file-stderr.txt
new file mode 100644
index 0000000..0d8fc4b
--- /dev/null
+++ b/Tests/RunCMake/CommandLine/E_cat_non_existing_file-stderr.txt
@@ -0,0 +1 @@
+^CMake Error: .*: no such file or directory \(ignoring\)
diff --git a/Tests/RunCMake/CommandLine/E_cat_non_readable_file-result.txt b/Tests/RunCMake/CommandLine/E_cat_non_readable_file-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/CommandLine/E_cat_non_readable_file-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/CommandLine/E_cat_non_readable_file-stderr.txt b/Tests/RunCMake/CommandLine/E_cat_non_readable_file-stderr.txt
new file mode 100644
index 0000000..97ec822
--- /dev/null
+++ b/Tests/RunCMake/CommandLine/E_cat_non_readable_file-stderr.txt
@@ -0,0 +1 @@
+^CMake Error: .*: permission denied \(ignoring\)
diff --git a/Tests/RunCMake/CommandLine/E_cat_option_not_handled-result.txt b/Tests/RunCMake/CommandLine/E_cat_option_not_handled-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/CommandLine/E_cat_option_not_handled-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/CommandLine/E_cat_option_not_handled-stderr.txt b/Tests/RunCMake/CommandLine/E_cat_option_not_handled-stderr.txt
new file mode 100644
index 0000000..92f7acf
--- /dev/null
+++ b/Tests/RunCMake/CommandLine/E_cat_option_not_handled-stderr.txt
@@ -0,0 +1 @@
+^CMake Error: -f: option not handled
diff --git a/Tests/RunCMake/CommandLine/P_arbitrary_args.cmake b/Tests/RunCMake/CommandLine/P_arbitrary_args.cmake
new file mode 100644
index 0000000..29faae3
--- /dev/null
+++ b/Tests/RunCMake/CommandLine/P_arbitrary_args.cmake
@@ -0,0 +1,3 @@
+if(NOT ("${CMAKE_ARGV3}" STREQUAL "--" AND "${CMAKE_ARGV4}" STREQUAL "-DFOO"))
+ message(FATAL_ERROR "`-DFOO` shouldn't trigger an error after `--`")
+endif()
diff --git a/Tests/RunCMake/CommandLine/ProfilingTest-check.cmake b/Tests/RunCMake/CommandLine/ProfilingTest-check.cmake
new file mode 100644
index 0000000..19ece86
--- /dev/null
+++ b/Tests/RunCMake/CommandLine/ProfilingTest-check.cmake
@@ -0,0 +1,18 @@
+if (NOT EXISTS ${ProfilingTestOutput})
+ set(RunCMake_TEST_FAILED "Expected ${ProfilingTestOutput} to exists")
+endif()
+
+file(READ "${ProfilingTestOutput}" JSON_HEADER LIMIT 2)
+if (NOT JSON_HEADER MATCHES "^\\[{")
+ set(RunCMake_TEST_FAILED "Expected valid JSON start")
+ return()
+endif()
+
+file(SIZE "${ProfilingTestOutput}" OUTPUT_SIZE)
+math(EXPR END_OFFSET "${OUTPUT_SIZE} -2 ")
+
+file(READ "${ProfilingTestOutput}" JSON_TRAILER OFFSET ${END_OFFSET})
+if (NOT JSON_TRAILER MATCHES "^}]$")
+ set(RunCMake_TEST_FAILED "Expected valid JSON end")
+ return()
+endif()
diff --git a/Tests/RunCMake/CommandLine/ProfilingTest.cmake b/Tests/RunCMake/CommandLine/ProfilingTest.cmake
new file mode 100644
index 0000000..837f4bf
--- /dev/null
+++ b/Tests/RunCMake/CommandLine/ProfilingTest.cmake
@@ -0,0 +1 @@
+# This file is intentionally left blank
diff --git a/Tests/RunCMake/CommandLine/RunCMakeTest.cmake b/Tests/RunCMake/CommandLine/RunCMakeTest.cmake
index 8930721..973391d 100644
--- a/Tests/RunCMake/CommandLine/RunCMakeTest.cmake
+++ b/Tests/RunCMake/CommandLine/RunCMakeTest.cmake
@@ -46,6 +46,7 @@ run_cmake_command(G_no-arg ${CMAKE_COMMAND} -B DummyBuildDir -G)
run_cmake_command(G_bad-arg ${CMAKE_COMMAND} -B DummyBuildDir -G NoSuchGenerator)
run_cmake_command(P_no-arg ${CMAKE_COMMAND} -P)
run_cmake_command(P_no-file ${CMAKE_COMMAND} -P nosuchscriptfile.cmake)
+run_cmake_command(P_arbitrary_args ${CMAKE_COMMAND} -P "${RunCMake_SOURCE_DIR}/P_arbitrary_args.cmake" -- -DFOO)
run_cmake_command(build-no-dir
${CMAKE_COMMAND} --build)
@@ -459,6 +460,44 @@ if(NOT WIN32 AND NOT CYGWIN)
endif()
unset(out)
+# cat tests
+set(out ${RunCMake_BINARY_DIR}/cat_tests)
+file(REMOVE_RECURSE "${out}")
+file(MAKE_DIRECTORY ${out})
+run_cmake_command(E_cat_non_existing_file
+ ${CMAKE_COMMAND} -E cat ${out}/non-existing-file.txt)
+
+if(UNIX)
+ # test non readable file only if not root
+ execute_process(
+ COMMAND id -u $ENV{USER}
+ OUTPUT_VARIABLE uid
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+ if(NOT "${uid}" STREQUAL "0")
+ # Create non readable file
+ set(inside_folder "${out}/in")
+ file(MAKE_DIRECTORY ${inside_folder})
+ file(WRITE "${inside_folder}/non_readable_file.txt" "first file to append\n")
+ file(COPY "${inside_folder}/non_readable_file.txt" DESTINATION "${out}" FILE_PERMISSIONS OWNER_WRITE)
+ run_cmake_command(E_cat_non_readable_file
+ ${CMAKE_COMMAND} -E cat "${out}/non_readable_file.txt")
+ endif()
+endif()
+
+run_cmake_command(E_cat_option_not_handled
+ ${CMAKE_COMMAND} -E cat -f)
+
+run_cmake_command(E_cat_directory
+ ${CMAKE_COMMAND} -E cat ${out})
+
+file(WRITE "${out}/first_file.txt" "first file to append\n")
+file(WRITE "${out}/second_file.txt" "second file to append\n")
+file(WRITE "${out}/unicode_file.txt" "àéùç - 한국어") # Korean in Korean
+run_cmake_command(E_cat_good_cat
+ ${CMAKE_COMMAND} -E cat "${out}/first_file.txt" "${out}/second_file.txt" "${out}/unicode_file.txt")
+unset(out)
+
run_cmake_command(E_env-no-command0 ${CMAKE_COMMAND} -E env)
run_cmake_command(E_env-no-command1 ${CMAKE_COMMAND} -E env TEST_ENV=1)
run_cmake_command(E_env-bad-arg1 ${CMAKE_COMMAND} -E env -bad-arg1)
@@ -696,3 +735,25 @@ function(run_llvm_rc)
unset(LLVMRC_RESULT)
endfunction()
run_llvm_rc()
+
+set(RunCMake_TEST_OPTIONS --profiling-output=/no/such/file.txt --profiling-format=google-trace)
+run_cmake(profiling-all-params)
+unset(RunCMake_TEST_OPTIONS)
+
+set(RunCMake_TEST_OPTIONS --profiling-output=/no/such/file.txt --profiling-format=invalid-format)
+run_cmake(profiling-invalid-format)
+unset(RunCMake_TEST_OPTIONS)
+
+set(RunCMake_TEST_OPTIONS --profiling-output=/no/such/file.txt)
+run_cmake(profiling-missing-format)
+unset(RunCMake_TEST_OPTIONS)
+
+set(RunCMake_TEST_OPTIONS --profiling-format=google-trace)
+run_cmake(profiling-missing-output)
+unset(RunCMake_TEST_OPTIONS)
+
+set(RunCMake_TEST_BINARY_DIR "${RunCMake_BINARY_DIR}/profiling-test")
+set(ProfilingTestOutput ${RunCMake_TEST_BINARY_DIR}/output.json)
+set(RunCMake_TEST_OPTIONS --profiling-format=google-trace --profiling-output=${ProfilingTestOutput})
+run_cmake(ProfilingTest)
+unset(RunCMake_TEST_OPTIONS)
diff --git a/Tests/RunCMake/CommandLine/cmake_depends/test_UTF-16LE.h b/Tests/RunCMake/CommandLine/cmake_depends/test_UTF-16LE.h
index bf56ec6..2d39178 100644
--- a/Tests/RunCMake/CommandLine/cmake_depends/test_UTF-16LE.h
+++ b/Tests/RunCMake/CommandLine/cmake_depends/test_UTF-16LE.h
Binary files differ
diff --git a/Tests/RunCMake/CommandLine/profiling-all-params-result.txt b/Tests/RunCMake/CommandLine/profiling-all-params-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/CommandLine/profiling-all-params-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/CommandLine/profiling-all-params-stderr.txt b/Tests/RunCMake/CommandLine/profiling-all-params-stderr.txt
new file mode 100644
index 0000000..6b5c373
--- /dev/null
+++ b/Tests/RunCMake/CommandLine/profiling-all-params-stderr.txt
@@ -0,0 +1 @@
+^.*Could not start profiling: Unable to open: /no/such/file.txt$
diff --git a/Tests/RunCMake/CommandLine/profiling-invalid-format-result.txt b/Tests/RunCMake/CommandLine/profiling-invalid-format-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/CommandLine/profiling-invalid-format-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/CommandLine/profiling-invalid-format-stderr.txt b/Tests/RunCMake/CommandLine/profiling-invalid-format-stderr.txt
new file mode 100644
index 0000000..459bc3a
--- /dev/null
+++ b/Tests/RunCMake/CommandLine/profiling-invalid-format-stderr.txt
@@ -0,0 +1 @@
+^.*Invalid format specified for --profiling-format$
diff --git a/Tests/RunCMake/CommandLine/profiling-missing-format-result.txt b/Tests/RunCMake/CommandLine/profiling-missing-format-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/CommandLine/profiling-missing-format-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/CommandLine/profiling-missing-format-stderr.txt b/Tests/RunCMake/CommandLine/profiling-missing-format-stderr.txt
new file mode 100644
index 0000000..459bc3a
--- /dev/null
+++ b/Tests/RunCMake/CommandLine/profiling-missing-format-stderr.txt
@@ -0,0 +1 @@
+^.*Invalid format specified for --profiling-format$
diff --git a/Tests/RunCMake/CommandLine/profiling-missing-output-result.txt b/Tests/RunCMake/CommandLine/profiling-missing-output-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/CommandLine/profiling-missing-output-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/CommandLine/profiling-missing-output-stderr.txt b/Tests/RunCMake/CommandLine/profiling-missing-output-stderr.txt
new file mode 100644
index 0000000..9ab0c8f
--- /dev/null
+++ b/Tests/RunCMake/CommandLine/profiling-missing-output-stderr.txt
@@ -0,0 +1 @@
+^.*--profiling-format specified but no --profiling-output!$
diff --git a/Tests/RunCMake/CompilerLauncher/CUDA-common.cmake b/Tests/RunCMake/CompilerLauncher/CUDA-common.cmake
index 6f7fc86..ca25b2a 100644
--- a/Tests/RunCMake/CompilerLauncher/CUDA-common.cmake
+++ b/Tests/RunCMake/CompilerLauncher/CUDA-common.cmake
@@ -1,3 +1,4 @@
+cmake_policy(SET CMP0104 NEW)
enable_language(CUDA)
set(CMAKE_VERBOSE_MAKEFILE TRUE)
add_executable(main main.cu)
diff --git a/Tests/RunCMake/CrosscompilingEmulator/AddTest-check.cmake b/Tests/RunCMake/CrosscompilingEmulator/AddTest-check.cmake
index 588b77b..3cbbc07 100644
--- a/Tests/RunCMake/CrosscompilingEmulator/AddTest-check.cmake
+++ b/Tests/RunCMake/CrosscompilingEmulator/AddTest-check.cmake
@@ -7,22 +7,22 @@ endif()
set(error_details "There is a problem with generated test file: ${testfile}")
-if(testfile_contents MATCHES "add_test[(]DoesNotUseEmulator [^\n]+pseudo_emulator[^\n]+\n")
+if(testfile_contents MATCHES "add_test[(][\"]DoesNotUseEmulator[\"] [^\n]+pseudo_emulator[^\n]+\n")
message(SEND_ERROR "Used emulator when it should not be used. ${error_details}")
endif()
-if(NOT testfile_contents MATCHES "add_test[(]UsesEmulator [^\n]+pseudo_emulator[^\n]+\n")
+if(NOT testfile_contents MATCHES "add_test[(][\"]UsesEmulator[\"] [^\n]+pseudo_emulator[^\n]+\n")
message(SEND_ERROR "Did not use emulator when it should be used. ${error_details}")
endif()
-if(testfile_contents MATCHES "add_test[(]DoesNotUseEmulatorWithGenex [^\n]+pseudo_emulator[^\n]+\n")
+if(testfile_contents MATCHES "add_test[(][\"]DoesNotUseEmulatorWithGenex[\"] [^\n]+pseudo_emulator[^\n]+\n")
message(SEND_ERROR "Used emulator when it should not be used. ${error_details}")
endif()
-if(NOT testfile_contents MATCHES "add_test[(]UsesEmulatorWithExecTargetFromSubdirAddedWithoutGenex [^\n]+pseudo_emulator[^\n]+\n")
+if(NOT testfile_contents MATCHES "add_test[(][\"]UsesEmulatorWithExecTargetFromSubdirAddedWithoutGenex[\"] [^\n]+pseudo_emulator[^\n]+\n")
message(SEND_ERROR "Did not use emulator when it should be used. ${error_details}")
endif()
-if(testfile_contents MATCHES "add_test[(]DoesNotUseEmulatorWithExecTargetFromSubdirAddedWithGenex [^\n]+pseudo_emulator[^\n]+\n")
+if(testfile_contents MATCHES "add_test[(][\"]DoesNotUseEmulatorWithExecTargetFromSubdirAddedWithGenex[\"] [^\n]+pseudo_emulator[^\n]+\n")
message(SEND_ERROR "Used emulator when it should not be used. ${error_details}")
endif()
diff --git a/Tests/RunCMake/ExportCompileCommands/BeforeProject-check.cmake b/Tests/RunCMake/ExportCompileCommands/BeforeProject-check.cmake
new file mode 100644
index 0000000..87058e2
--- /dev/null
+++ b/Tests/RunCMake/ExportCompileCommands/BeforeProject-check.cmake
@@ -0,0 +1,4 @@
+if(NOT EXISTS "${RunCMake_TEST_BINARY_DIR}/compile_commands.json")
+ set(RunCMake_TEST_FAILED "compile_commands.json not generated")
+ return()
+endif()
diff --git a/Tests/RunCMake/ExportCompileCommands/BeforeProject.cmake b/Tests/RunCMake/ExportCompileCommands/BeforeProject.cmake
new file mode 100644
index 0000000..b8cbdef
--- /dev/null
+++ b/Tests/RunCMake/ExportCompileCommands/BeforeProject.cmake
@@ -0,0 +1,3 @@
+enable_language(C)
+add_library(empty STATIC empty.c)
+message(STATUS "CMAKE_EXPORT_COMPILE_COMMANDS='${CMAKE_EXPORT_COMPILE_COMMANDS}'")
diff --git a/Tests/RunCMake/ExportCompileCommands/BeforeProjectBEFORE.cmake b/Tests/RunCMake/ExportCompileCommands/BeforeProjectBEFORE.cmake
new file mode 100644
index 0000000..87f9c87
--- /dev/null
+++ b/Tests/RunCMake/ExportCompileCommands/BeforeProjectBEFORE.cmake
@@ -0,0 +1 @@
+set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
diff --git a/Tests/RunCMake/ExportCompileCommands/CMakeLists.txt b/Tests/RunCMake/ExportCompileCommands/CMakeLists.txt
new file mode 100644
index 0000000..b7117bd
--- /dev/null
+++ b/Tests/RunCMake/ExportCompileCommands/CMakeLists.txt
@@ -0,0 +1,3 @@
+cmake_minimum_required(VERSION 3.17)
+project(${RunCMake_TEST} NONE)
+include(${RunCMake_TEST}.cmake)
diff --git a/Tests/RunCMake/ExportCompileCommands/RunCMakeTest.cmake b/Tests/RunCMake/ExportCompileCommands/RunCMakeTest.cmake
new file mode 100644
index 0000000..b540a04
--- /dev/null
+++ b/Tests/RunCMake/ExportCompileCommands/RunCMakeTest.cmake
@@ -0,0 +1,3 @@
+include(RunCMake)
+
+run_cmake_with_options(BeforeProject -DCMAKE_PROJECT_INCLUDE_BEFORE=BeforeProjectBEFORE.cmake)
diff --git a/Tests/RunCMake/ExportCompileCommands/empty.c b/Tests/RunCMake/ExportCompileCommands/empty.c
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/Tests/RunCMake/ExportCompileCommands/empty.c
diff --git a/Tests/RunCMake/ExternalProject/Add_StepDependencies_iface_step-stderr.txt b/Tests/RunCMake/ExternalProject/Add_StepDependencies_iface_step-stderr.txt
index 22e13bf..5fa75e8 100644
--- a/Tests/RunCMake/ExternalProject/Add_StepDependencies_iface_step-stderr.txt
+++ b/Tests/RunCMake/ExternalProject/Add_StepDependencies_iface_step-stderr.txt
@@ -1,5 +1,5 @@
^CMake Error at .*/Modules/ExternalProject.cmake:[0-9]+ \(message\):
- Target "MyProj-IFace" was not generated by ExternalProject_Add_StepTargets.
+ External project "MyProj" does not have a step "IFace".
Call Stack \(most recent call first\):
Add_StepDependencies_iface_step.cmake:[0-9]+ \(ExternalProject_Add_StepDependencies\)
CMakeLists.txt:[0-9]+ \(include\)$
diff --git a/Tests/RunCMake/FPHSA/FindUseComponents.cmake b/Tests/RunCMake/FPHSA/FindUseComponents.cmake
new file mode 100644
index 0000000..4168f1d
--- /dev/null
+++ b/Tests/RunCMake/FPHSA/FindUseComponents.cmake
@@ -0,0 +1,15 @@
+# pseudo find_module
+
+if (UseComponents_REQUIRE_VARS)
+ set(FOOBAR TRUE)
+ set(REQUIRED_VARS REQUIRED_VARS FOOBAR)
+endif()
+
+set (UseComponents_Comp1_FOUND TRUE)
+set (UseComponents_Comp2_FOUND TRUE)
+set (UseComponents_Comp3_FOUND FALSE)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(UseComponents ${REQUIRED_VARS}
+ VERSION_VAR Pseudo_VERSION
+ HANDLE_COMPONENTS)
diff --git a/Tests/RunCMake/FPHSA/RunCMakeTest.cmake b/Tests/RunCMake/FPHSA/RunCMakeTest.cmake
index 286915d..8e39090 100644
--- a/Tests/RunCMake/FPHSA/RunCMakeTest.cmake
+++ b/Tests/RunCMake/FPHSA/RunCMakeTest.cmake
@@ -47,3 +47,11 @@ run_cmake(custom_message_1)
set(RunCMake_TEST_OPTIONS "-DCMAKE_MODULE_PATH=${CMAKE_CURRENT_LIST_DIR}" "-DCONFIG_MODE=TRUE")
run_cmake(custom_message_2)
run_cmake(custom_message_3)
+
+# check handling of components
+set(RunCMake_TEST_OPTIONS "-DCMAKE_MODULE_PATH=${CMAKE_CURRENT_LIST_DIR}" "-DUseComponents_VERSION=1.2.3.4")
+run_cmake(required_components)
+run_cmake(required_and_optional_components)
+run_cmake(all_optional_components)
+list(APPEND RunCMake_TEST_OPTIONS "-DUseComponents_REQUIRE_VARS=TRUE")
+run_cmake(required_components_with_vars)
diff --git a/Tests/RunCMake/FPHSA/all_optional_components.cmake b/Tests/RunCMake/FPHSA/all_optional_components.cmake
new file mode 100644
index 0000000..f4d8b5e
--- /dev/null
+++ b/Tests/RunCMake/FPHSA/all_optional_components.cmake
@@ -0,0 +1,14 @@
+find_package(UseComponents OPTIONAL_COMPONENTS Comp1 Comp2 Comp3)
+
+if (NOT UseComponents_FOUND)
+ message (FATAL_ERROR "package UseComponents Not Found.")
+endif()
+if (NOT UseComponents_Comp1_FOUND)
+ message (FATAL_ERROR "package UseComponents, component Comp1 not found.")
+endif()
+if (NOT UseComponents_Comp2_FOUND)
+ message (FATAL_ERROR "package UseComponents, component Comp2 not found.")
+endif()
+if (UseComponents_Comp3_FOUND)
+ message (FATAL_ERROR "package UseComponents, component Comp2 unexpectedly found.")
+endif()
diff --git a/Tests/RunCMake/FPHSA/required_and_optional_components.cmake b/Tests/RunCMake/FPHSA/required_and_optional_components.cmake
new file mode 100644
index 0000000..836dcac
--- /dev/null
+++ b/Tests/RunCMake/FPHSA/required_and_optional_components.cmake
@@ -0,0 +1,14 @@
+find_package(UseComponents COMPONENTS Comp1 Comp2 OPTIONAL_COMPONENTS Comp3)
+
+if (NOT UseComponents_FOUND)
+ message (FATAL_ERROR "package UseComponents Not Found.")
+endif()
+if (NOT UseComponents_Comp1_FOUND)
+ message (FATAL_ERROR "package UseComponents, component Comp1 not found.")
+endif()
+if (NOT UseComponents_Comp2_FOUND)
+ message (FATAL_ERROR "package UseComponents, component Comp2 not found.")
+endif()
+if (UseComponents_Comp3_FOUND)
+ message (FATAL_ERROR "package UseComponents, component Comp2 unexpectedly found.")
+endif()
diff --git a/Tests/RunCMake/FPHSA/required_components.cmake b/Tests/RunCMake/FPHSA/required_components.cmake
new file mode 100644
index 0000000..0dd8e9c
--- /dev/null
+++ b/Tests/RunCMake/FPHSA/required_components.cmake
@@ -0,0 +1,11 @@
+find_package(UseComponents COMPONENTS Comp1 Comp2)
+
+if (NOT UseComponents_FOUND)
+ message (FATAL_ERROR "package UseComponents Not Found.")
+endif()
+if (NOT UseComponents_Comp1_FOUND)
+ message (FATAL_ERROR "package UseComponents, component Comp1 Not Found.")
+endif()
+if (NOT UseComponents_Comp2_FOUND)
+ message (FATAL_ERROR "package UseComponents, component Comp2 Not Found.")
+endif()
diff --git a/Tests/RunCMake/FPHSA/required_components_with_vars.cmake b/Tests/RunCMake/FPHSA/required_components_with_vars.cmake
new file mode 100644
index 0000000..842ef15
--- /dev/null
+++ b/Tests/RunCMake/FPHSA/required_components_with_vars.cmake
@@ -0,0 +1 @@
+include ("required_components.cmake")
diff --git a/Tests/RunCMake/FetchContent/DownloadFile.cmake b/Tests/RunCMake/FetchContent/DownloadFile.cmake
new file mode 100644
index 0000000..741b6d3
--- /dev/null
+++ b/Tests/RunCMake/FetchContent/DownloadFile.cmake
@@ -0,0 +1,9 @@
+include(FetchContent)
+
+FetchContent_Declare(
+ t1
+ URL ${CMAKE_CURRENT_LIST_DIR}/dummyFile.txt
+ DOWNLOAD_NO_EXTRACT YES
+)
+
+FetchContent_Populate(t1)
diff --git a/Tests/RunCMake/FetchContent/MakeAvailable-stdout.txt b/Tests/RunCMake/FetchContent/MakeAvailable-stdout.txt
index 6e6c730..711de6b 100644
--- a/Tests/RunCMake/FetchContent/MakeAvailable-stdout.txt
+++ b/Tests/RunCMake/FetchContent/MakeAvailable-stdout.txt
@@ -1,2 +1,3 @@
Confirmation project has been added
+.*Confirmation subproject has been added
.*Confirmation script has been called
diff --git a/Tests/RunCMake/FetchContent/MakeAvailable.cmake b/Tests/RunCMake/FetchContent/MakeAvailable.cmake
index a93f1f7..d7fc55c 100644
--- a/Tests/RunCMake/FetchContent/MakeAvailable.cmake
+++ b/Tests/RunCMake/FetchContent/MakeAvailable.cmake
@@ -8,13 +8,22 @@ FetchContent_Declare(
WithoutProject
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/WithoutProject
)
+FetchContent_Declare(
+ ProjectSubdir
+ SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/WithoutProject
+ SOURCE_SUBDIR ProjectSubdir
+)
# Order is important and will be verified by test output
-FetchContent_MakeAvailable(WithProject WithoutProject)
+FetchContent_MakeAvailable(WithProject WithoutProject ProjectSubdir)
get_property(addedWith GLOBAL PROPERTY FetchWithProject SET)
if(NOT addedWith)
- message(SEND_ERROR "Subdir with CMakeLists.txt not added")
+ message(SEND_ERROR "Project with top level CMakeLists.txt not added")
+endif()
+get_property(addedSubdir GLOBAL PROPERTY FetchWithSubProject SET)
+if(NOT addedSubdir)
+ message(SEND_ERROR "Project with CMakeLists.txt in subdir not added")
endif()
include(${withoutproject_SOURCE_DIR}/confirmMessage.cmake)
diff --git a/Tests/RunCMake/FetchContent/RunCMakeTest.cmake b/Tests/RunCMake/FetchContent/RunCMakeTest.cmake
index e28ae96..5e2e5e1 100644
--- a/Tests/RunCMake/FetchContent/RunCMakeTest.cmake
+++ b/Tests/RunCMake/FetchContent/RunCMakeTest.cmake
@@ -6,6 +6,7 @@ run_cmake(MissingDetails)
run_cmake(DirectIgnoresDetails)
run_cmake(FirstDetailsWin)
run_cmake(DownloadTwice)
+run_cmake(DownloadFile)
run_cmake(SameGenerator)
run_cmake(VarDefinitions)
run_cmake(GetProperties)
diff --git a/Tests/RunCMake/FetchContent/WithoutProject/ProjectSubdir/CMakeLists.txt b/Tests/RunCMake/FetchContent/WithoutProject/ProjectSubdir/CMakeLists.txt
new file mode 100644
index 0000000..216eeb1
--- /dev/null
+++ b/Tests/RunCMake/FetchContent/WithoutProject/ProjectSubdir/CMakeLists.txt
@@ -0,0 +1,5 @@
+cmake_minimum_required(VERSION 3.13)
+project(ProjectSubdir LANGUAGES NONE)
+
+set_property(GLOBAL PROPERTY FetchWithSubProject YES)
+message(STATUS "Confirmation subproject has been added")
diff --git a/Tests/RunCMake/FetchContent/dummyFile.txt b/Tests/RunCMake/FetchContent/dummyFile.txt
new file mode 100644
index 0000000..0a12ce1
--- /dev/null
+++ b/Tests/RunCMake/FetchContent/dummyFile.txt
@@ -0,0 +1 @@
+# This file is used to verify fetching a single file directly
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-check.py b/Tests/RunCMake/FileAPI/codemodel-v2-check.py
index de6253f..9ee0c20 100644
--- a/Tests/RunCMake/FileAPI/codemodel-v2-check.py
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-check.py
@@ -1,8 +1,14 @@
from check_index import *
+import json
import sys
import os
+def read_codemodel_json_data(filename):
+ abs_filename = os.path.join(os.path.dirname(os.path.realpath(__file__)), "codemodel-v2-data", filename)
+ with open(abs_filename, "r") as f:
+ return json.load(f)
+
def check_objects(o, g):
assert is_list(o)
assert len(o) == 1
@@ -471,154 +477,15 @@ def check_project(c):
def gen_check_directories(c, g):
expected = [
- {
- "source": "^\\.$",
- "build": "^\\.$",
- "parentSource": None,
- "childSources": [
- "^alias$",
- "^custom$",
- "^cxx$",
- "^imported$",
- "^object$",
- "^.*/Tests/RunCMake/FileAPIExternalSource$",
- "^dir$",
- ],
- "targetIds": [
- "^ALL_BUILD::@6890427a1f51a3e7e1df$",
- "^ZERO_CHECK::@6890427a1f51a3e7e1df$",
- "^c_exe::@6890427a1f51a3e7e1df$",
- "^c_lib::@6890427a1f51a3e7e1df$",
- "^c_shared_exe::@6890427a1f51a3e7e1df$",
- "^c_shared_lib::@6890427a1f51a3e7e1df$",
- "^c_static_exe::@6890427a1f51a3e7e1df$",
- "^c_static_lib::@6890427a1f51a3e7e1df$",
- "^interface_exe::@6890427a1f51a3e7e1df$",
- ],
- "projectName": "codemodel-v2",
- "minimumCMakeVersion": "3.12",
- "hasInstallRule": True,
- },
- {
- "source": "^alias$",
- "build": "^alias$",
- "parentSource": "^\\.$",
- "childSources": None,
- "targetIds": [
- "^ALL_BUILD::@53632cba2752272bb008$",
- "^ZERO_CHECK::@53632cba2752272bb008$",
- "^c_alias_exe::@53632cba2752272bb008$",
- "^cxx_alias_exe::@53632cba2752272bb008$",
- ],
- "projectName": "Alias",
- "minimumCMakeVersion": "3.12",
- "hasInstallRule": None,
- },
- {
- "source": "^custom$",
- "build": "^custom$",
- "parentSource": "^\\.$",
- "childSources": None,
- "targetIds": [
- "^ALL_BUILD::@c11385ffed57b860da63$",
- "^ZERO_CHECK::@c11385ffed57b860da63$",
- "^custom_exe::@c11385ffed57b860da63$",
- "^custom_tgt::@c11385ffed57b860da63$",
- ],
- "projectName": "Custom",
- "minimumCMakeVersion": "3.12",
- "hasInstallRule": None,
- },
- {
- "source": "^cxx$",
- "build": "^cxx$",
- "parentSource": "^\\.$",
- "childSources": None,
- "targetIds": [
- "^ALL_BUILD::@a56b12a3f5c0529fb296$",
- "^ZERO_CHECK::@a56b12a3f5c0529fb296$",
- "^cxx_exe::@a56b12a3f5c0529fb296$",
- "^cxx_lib::@a56b12a3f5c0529fb296$",
- "^cxx_shared_exe::@a56b12a3f5c0529fb296$",
- "^cxx_shared_lib::@a56b12a3f5c0529fb296$",
- "^cxx_static_exe::@a56b12a3f5c0529fb296$",
- "^cxx_static_lib::@a56b12a3f5c0529fb296$",
- ],
- "projectName": "Cxx",
- "minimumCMakeVersion": "3.12",
- "hasInstallRule": None,
- },
- {
- "source": "^imported$",
- "build": "^imported$",
- "parentSource": "^\\.$",
- "childSources": None,
- "targetIds": [
- "^ALL_BUILD::@ba7eb709d0b48779c6c8$",
- "^ZERO_CHECK::@ba7eb709d0b48779c6c8$",
- "^link_imported_exe::@ba7eb709d0b48779c6c8$",
- "^link_imported_interface_exe::@ba7eb709d0b48779c6c8$",
- "^link_imported_object_exe::@ba7eb709d0b48779c6c8$",
- "^link_imported_shared_exe::@ba7eb709d0b48779c6c8$",
- "^link_imported_static_exe::@ba7eb709d0b48779c6c8$",
- ],
- "projectName": "Imported",
- "minimumCMakeVersion": "3.12",
- "hasInstallRule": None,
- },
- {
- "source": "^object$",
- "build": "^object$",
- "parentSource": "^\\.$",
- "childSources": None,
- "targetIds": [
- "^ALL_BUILD::@5ed5358f70faf8d8af7a$",
- "^ZERO_CHECK::@5ed5358f70faf8d8af7a$",
- "^c_object_exe::@5ed5358f70faf8d8af7a$",
- "^c_object_lib::@5ed5358f70faf8d8af7a$",
- "^cxx_object_exe::@5ed5358f70faf8d8af7a$",
- "^cxx_object_lib::@5ed5358f70faf8d8af7a$",
- ],
- "projectName": "Object",
- "minimumCMakeVersion": "3.13",
- "hasInstallRule": True,
- },
- {
- "source": "^dir$",
- "build": "^dir$",
- "parentSource": "^\\.$",
- "childSources": [
- "^dir/dir$",
- ],
- "targetIds": None,
- "projectName": "codemodel-v2",
- "minimumCMakeVersion": "3.12",
- "hasInstallRule": None,
- },
- {
- "source": "^dir/dir$",
- "build": "^dir/dir$",
- "parentSource": "^dir$",
- "childSources": None,
- "targetIds": None,
- "projectName": "codemodel-v2",
- "minimumCMakeVersion": "3.12",
- "hasInstallRule": None,
- },
- {
- "source": "^.*/Tests/RunCMake/FileAPIExternalSource$",
- "build": "^.*/Tests/RunCMake/FileAPI/FileAPIExternalBuild$",
- "parentSource": "^\\.$",
- "childSources": None,
- "targetIds": [
- "^ALL_BUILD::@[0-9a-f]+$",
- "^ZERO_CHECK::@[0-9a-f]+$",
- "^generated_exe::@[0-9a-f]+$",
- ],
- "projectName": "External",
- "minimumCMakeVersion": "3.12",
- "hasInstallRule": None,
- },
+ read_codemodel_json_data("directories/top.json"),
+ read_codemodel_json_data("directories/alias.json"),
+ read_codemodel_json_data("directories/custom.json"),
+ read_codemodel_json_data("directories/cxx.json"),
+ read_codemodel_json_data("directories/imported.json"),
+ read_codemodel_json_data("directories/object.json"),
+ read_codemodel_json_data("directories/dir.json"),
+ read_codemodel_json_data("directories/dir_dir.json"),
+ read_codemodel_json_data("directories/external.json"),
]
if matches(g["name"], "^Visual Studio "):
@@ -646,4428 +513,52 @@ def check_directories(c, g):
def gen_check_targets(c, g, inSource):
expected = [
- {
- "name": "ALL_BUILD",
- "id": "^ALL_BUILD::@6890427a1f51a3e7e1df$",
- "directorySource": "^\\.$",
- "projectName": "codemodel-v2",
- "type": "UTILITY",
- "isGeneratorProvided": True,
- "sources": [
- {
- "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/CMakeFiles/ALL_BUILD$",
- "isGenerated": True,
- "sourceGroupName": "",
- "compileGroupLanguage": None,
- "backtrace": [
- {
- "file": "^CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- {
- "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/CMakeFiles/ALL_BUILD\\.rule$",
- "isGenerated": True,
- "sourceGroupName": "CMake Rules",
- "compileGroupLanguage": None,
- "backtrace": [
- {
- "file": "^CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "",
- "sourcePaths": [
- "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/CMakeFiles/ALL_BUILD$",
- ],
- },
- {
- "name": "CMake Rules",
- "sourcePaths": [
- "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/CMakeFiles/ALL_BUILD\\.rule$",
- ],
- },
- ],
- "compileGroups": None,
- "backtrace": [
- {
- "file": "^CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": None,
- "artifacts": None,
- "build": "^\\.$",
- "source": "^\\.$",
- "install": None,
- "link": None,
- "archive": None,
- "dependencies": [
- {
- "id": "^ZERO_CHECK::@6890427a1f51a3e7e1df$",
- "backtrace": None,
- },
- {
- "id": "^interface_exe::@6890427a1f51a3e7e1df$",
- "backtrace": None,
- },
- {
- "id": "^c_lib::@6890427a1f51a3e7e1df$",
- "backtrace": None,
- },
- {
- "id": "^c_exe::@6890427a1f51a3e7e1df$",
- "backtrace": None,
- },
- {
- "id": "^c_shared_lib::@6890427a1f51a3e7e1df$",
- "backtrace": None,
- },
- {
- "id": "^c_shared_exe::@6890427a1f51a3e7e1df$",
- "backtrace": None,
- },
- {
- "id": "^c_static_lib::@6890427a1f51a3e7e1df$",
- "backtrace": None,
- },
- {
- "id": "^c_static_exe::@6890427a1f51a3e7e1df$",
- "backtrace": None,
- },
- {
- "id": "^c_alias_exe::@53632cba2752272bb008$",
- "backtrace": None,
- },
- {
- "id": "^cxx_alias_exe::@53632cba2752272bb008$",
- "backtrace": None,
- },
- {
- "id": "^cxx_lib::@a56b12a3f5c0529fb296$",
- "backtrace": None,
- },
- {
- "id": "^cxx_exe::@a56b12a3f5c0529fb296$",
- "backtrace": None,
- },
- {
- "id": "^cxx_shared_lib::@a56b12a3f5c0529fb296$",
- "backtrace": None,
- },
- {
- "id": "^cxx_shared_exe::@a56b12a3f5c0529fb296$",
- "backtrace": None,
- },
- {
- "id": "^cxx_static_lib::@a56b12a3f5c0529fb296$",
- "backtrace": None,
- },
- {
- "id": "^cxx_static_exe::@a56b12a3f5c0529fb296$",
- "backtrace": None,
- },
- {
- "id": "^c_object_lib::@5ed5358f70faf8d8af7a$",
- "backtrace": None,
- },
- {
- "id": "^c_object_exe::@5ed5358f70faf8d8af7a$",
- "backtrace": None,
- },
- {
- "id": "^cxx_object_lib::@5ed5358f70faf8d8af7a$",
- "backtrace": None,
- },
- {
- "id": "^cxx_object_exe::@5ed5358f70faf8d8af7a$",
- "backtrace": None,
- },
- {
- "id": "^link_imported_exe::@ba7eb709d0b48779c6c8$",
- "backtrace": None,
- },
- {
- "id": "^link_imported_shared_exe::@ba7eb709d0b48779c6c8$",
- "backtrace": None,
- },
- {
- "id": "^link_imported_static_exe::@ba7eb709d0b48779c6c8$",
- "backtrace": None,
- },
- {
- "id": "^link_imported_object_exe::@ba7eb709d0b48779c6c8$",
- "backtrace": None,
- },
- {
- "id": "^link_imported_interface_exe::@ba7eb709d0b48779c6c8$",
- "backtrace": None,
- },
- {
- "id": "^custom_exe::@c11385ffed57b860da63$",
- "backtrace": None,
- },
- {
- "id": "^generated_exe::@[0-9a-f]+$",
- "backtrace": None,
- },
- ],
- },
- {
- "name": "ZERO_CHECK",
- "id": "^ZERO_CHECK::@6890427a1f51a3e7e1df$",
- "directorySource": "^\\.$",
- "projectName": "codemodel-v2",
- "type": "UTILITY",
- "isGeneratorProvided": True,
- "sources": [
- {
- "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/CMakeFiles/ZERO_CHECK$",
- "isGenerated": True,
- "sourceGroupName": "",
- "compileGroupLanguage": None,
- "backtrace": [
- {
- "file": "^CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- {
- "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/CMakeFiles/ZERO_CHECK\\.rule$",
- "isGenerated": True,
- "sourceGroupName": "CMake Rules",
- "compileGroupLanguage": None,
- "backtrace": [
- {
- "file": "^CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "",
- "sourcePaths": [
- "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/CMakeFiles/ZERO_CHECK$",
- ],
- },
- {
- "name": "CMake Rules",
- "sourcePaths": [
- "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/CMakeFiles/ZERO_CHECK\\.rule$",
- ],
- },
- ],
- "compileGroups": None,
- "backtrace": [
- {
- "file": "^CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": None,
- "artifacts": None,
- "build": "^\\.$",
- "source": "^\\.$",
- "install": None,
- "link": None,
- "archive": None,
- "dependencies": None,
- },
- {
- "name": "interface_exe",
- "id": "^interface_exe::@6890427a1f51a3e7e1df$",
- "directorySource": "^\\.$",
- "projectName": "codemodel-v2",
- "type": "EXECUTABLE",
- "isGeneratorProvided": None,
- "sources": [
- {
- "path": "^empty\\.c$",
- "isGenerated": None,
- "sourceGroupName": "Source Files",
- "compileGroupLanguage": "C",
- "backtrace": [
- {
- "file": "^include_test\\.cmake$",
- "line": 3,
- "command": "add_executable",
- "hasParent": True,
- },
- {
- "file": "^include_test\\.cmake$",
- "line": None,
- "command": None,
- "hasParent": True,
- },
- {
- "file": "^codemodel-v2\\.cmake$",
- "line": 3,
- "command": "include",
- "hasParent": True,
- },
- {
- "file": "^codemodel-v2\\.cmake$",
- "line": None,
- "command": None,
- "hasParent": True,
- },
- {
- "file": "^CMakeLists\\.txt$",
- "line": 3,
- "command": "include",
- "hasParent": True,
- },
- {
- "file": "^CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "Source Files",
- "sourcePaths": [
- "^empty\\.c$",
- ],
- },
- ],
- "compileGroups": [
- {
- "language": "C",
- "sourcePaths": [
- "^empty\\.c$",
- ],
- "includes": None,
- "defines": [
- {
- "define": "interface_exe_EXPORTS",
- "backtrace": None,
- },
- ],
- "compileCommandFragments": None,
- },
- ],
- "backtrace": [
- {
- "file": "^include_test\\.cmake$",
- "line": 3,
- "command": "add_executable",
- "hasParent": True,
- },
- {
- "file": "^include_test\\.cmake$",
- "line": None,
- "command": None,
- "hasParent": True,
- },
- {
- "file": "^codemodel-v2\\.cmake$",
- "line": 3,
- "command": "include",
- "hasParent": True,
- },
- {
- "file": "^codemodel-v2\\.cmake$",
- "line": None,
- "command": None,
- "hasParent": True,
- },
- {
- "file": "^CMakeLists\\.txt$",
- "line": 3,
- "command": "include",
- "hasParent": True,
- },
- {
- "file": "^CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": "^my_interface_exe\\.myexe$",
- "artifacts": [
- {
- "path": "^bin/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?my_interface_exe\\.myexe$",
- "_dllExtra": False,
- },
- {
- "path": "^lib/my_interface_exe\\.imp$",
- "_aixExtra": True,
- "_dllExtra": False,
- },
- {
- "path": "^lib/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?(lib)?my_interface_exe\\.(dll\\.a|lib)$",
- "_dllExtra": True,
- },
- {
- "path": "^bin/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?my_interface_exe\\.pdb$",
- "_dllExtra": True,
- },
- ],
- "build": "^\\.$",
- "source": "^\\.$",
- "install": None,
- "link": {
- "language": "C",
- "lto": None,
- "commandFragments": None,
- },
- "archive": None,
- "dependencies": [
- {
- "id": "^ZERO_CHECK::@6890427a1f51a3e7e1df$",
- "backtrace": None,
- },
- ],
- },
- {
- "name": "c_lib",
- "id": "^c_lib::@6890427a1f51a3e7e1df$",
- "directorySource": "^\\.$",
- "projectName": "codemodel-v2",
- "type": "STATIC_LIBRARY",
- "isGeneratorProvided": None,
- "sources": [
- {
- "path": "^empty\\.c$",
- "isGenerated": None,
- "sourceGroupName": "Source Files",
- "compileGroupLanguage": "C",
- "backtrace": [
- {
- "file": "^codemodel-v2\\.cmake$",
- "line": 5,
- "command": "add_library",
- "hasParent": True,
- },
- {
- "file": "^codemodel-v2\\.cmake$",
- "line": None,
- "command": None,
- "hasParent": True,
- },
- {
- "file": "^CMakeLists\\.txt$",
- "line": 3,
- "command": "include",
- "hasParent": True,
- },
- {
- "file": "^CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "Source Files",
- "sourcePaths": [
- "^empty\\.c$",
- ],
- },
- ],
- "compileGroups": [
- {
- "language": "C",
- "sourcePaths": [
- "^empty\\.c$",
- ],
- "includes": None,
- "defines": None,
- "compileCommandFragments": None,
- },
- ],
- "backtrace": [
- {
- "file": "^codemodel-v2\\.cmake$",
- "line": 5,
- "command": "add_library",
- "hasParent": True,
- },
- {
- "file": "^codemodel-v2\\.cmake$",
- "line": None,
- "command": None,
- "hasParent": True,
- },
- {
- "file": "^CMakeLists\\.txt$",
- "line": 3,
- "command": "include",
- "hasParent": True,
- },
- {
- "file": "^CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": "^(lib)?c_lib\\.(a|lib)$",
- "artifacts": [
- {
- "path": "^((Debug|Release|RelWithDebInfo|MinSizeRel)/)?(lib)?c_lib\\.(a|lib)$",
- "_dllExtra": False,
- },
- ],
- "build": "^\\.$",
- "source": "^\\.$",
- "install": None,
- "link": None,
- "archive": {
- "lto": None,
- },
- "dependencies": [
- {
- "id": "^ZERO_CHECK::@6890427a1f51a3e7e1df$",
- "backtrace": None,
- },
- ],
- },
- {
- "name": "c_exe",
- "id": "^c_exe::@6890427a1f51a3e7e1df$",
- "directorySource": "^\\.$",
- "projectName": "codemodel-v2",
- "type": "EXECUTABLE",
- "isGeneratorProvided": None,
- "sources": [
- {
- "path": "^empty\\.c$",
- "isGenerated": None,
- "sourceGroupName": "Source Files",
- "compileGroupLanguage": "C",
- "backtrace": [
- {
- "file": "^codemodel-v2\\.cmake$",
- "line": 6,
- "command": "add_executable",
- "hasParent": True,
- },
- {
- "file": "^codemodel-v2\\.cmake$",
- "line": None,
- "command": None,
- "hasParent": True,
- },
- {
- "file": "^CMakeLists\\.txt$",
- "line": 3,
- "command": "include",
- "hasParent": True,
- },
- {
- "file": "^CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "Source Files",
- "sourcePaths": [
- "^empty\\.c$",
- ],
- },
- ],
- "compileGroups": [
- {
- "language": "C",
- "sourcePaths": [
- "^empty\\.c$",
- ],
- "includes": None,
- "defines": None,
- "compileCommandFragments": None,
- },
- ],
- "backtrace": [
- {
- "file": "^codemodel-v2\\.cmake$",
- "line": 6,
- "command": "add_executable",
- "hasParent": True,
- },
- {
- "file": "^codemodel-v2\\.cmake$",
- "line": None,
- "command": None,
- "hasParent": True,
- },
- {
- "file": "^CMakeLists\\.txt$",
- "line": 3,
- "command": "include",
- "hasParent": True,
- },
- {
- "file": "^CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": "^c_exe(\\.exe)?$",
- "artifacts": [
- {
- "path": "^((Debug|Release|RelWithDebInfo|MinSizeRel)/)?c_exe(\\.exe)?$",
- "_dllExtra": False,
- },
- {
- "path": "^((Debug|Release|RelWithDebInfo|MinSizeRel)/)?c_exe\\.pdb$",
- "_dllExtra": True,
- },
- ],
- "build": "^\\.$",
- "source": "^\\.$",
- "install": None,
- "link": {
- "language": "C",
- "lto": None,
- "commandFragments": None,
- },
- "archive": None,
- "dependencies": [
- {
- "id": "^c_lib::@6890427a1f51a3e7e1df$",
- "backtrace": [
- {
- "file": "^codemodel-v2\\.cmake$",
- "line": 7,
- "command": "target_link_libraries",
- "hasParent": True,
- },
- {
- "file": "^codemodel-v2\\.cmake$",
- "line": None,
- "command": None,
- "hasParent": True,
- },
- {
- "file": "^CMakeLists\\.txt$",
- "line": 3,
- "command": "include",
- "hasParent": True,
- },
- {
- "file": "^CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- {
- "id": "^ZERO_CHECK::@6890427a1f51a3e7e1df$",
- "backtrace": None,
- },
- ],
- },
- {
- "name": "c_shared_lib",
- "id": "^c_shared_lib::@6890427a1f51a3e7e1df$",
- "directorySource": "^\\.$",
- "projectName": "codemodel-v2",
- "type": "SHARED_LIBRARY",
- "isGeneratorProvided": None,
- "sources": [
- {
- "path": "^empty\\.c$",
- "isGenerated": None,
- "sourceGroupName": "Source Files",
- "compileGroupLanguage": "C",
- "backtrace": [
- {
- "file": "^codemodel-v2\\.cmake$",
- "line": 9,
- "command": "add_library",
- "hasParent": True,
- },
- {
- "file": "^codemodel-v2\\.cmake$",
- "line": None,
- "command": None,
- "hasParent": True,
- },
- {
- "file": "^CMakeLists\\.txt$",
- "line": 3,
- "command": "include",
- "hasParent": True,
- },
- {
- "file": "^CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "Source Files",
- "sourcePaths": [
- "^empty\\.c$",
- ],
- },
- ],
- "compileGroups": [
- {
- "language": "C",
- "sourcePaths": [
- "^empty\\.c$",
- ],
- "includes": None,
- "defines": [
- {
- "define": "c_shared_lib_EXPORTS",
- "backtrace": None,
- },
- ],
- "compileCommandFragments": None,
- },
- ],
- "backtrace": [
- {
- "file": "^codemodel-v2\\.cmake$",
- "line": 9,
- "command": "add_library",
- "hasParent": True,
- },
- {
- "file": "^codemodel-v2\\.cmake$",
- "line": None,
- "command": None,
- "hasParent": True,
- },
- {
- "file": "^CMakeLists\\.txt$",
- "line": 3,
- "command": "include",
- "hasParent": True,
- },
- {
- "file": "^CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": "^(lib|cyg)?c_shared_lib\\.(so|dylib|dll)$",
- "artifacts": [
- {
- "path": "^lib/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?(lib|cyg)?c_shared_lib\\.(so|dylib|dll)$",
- "_dllExtra": False,
- },
- {
- "path": "^((Debug|Release|RelWithDebInfo|MinSizeRel)/)?(lib)?c_shared_lib\\.(dll\\.a|lib)$",
- "_dllExtra": True,
- },
- {
- "path": "^lib/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?(lib|cyg)?c_shared_lib\\.pdb$",
- "_dllExtra": True,
- },
- ],
- "build": "^\\.$",
- "source": "^\\.$",
- "install": None,
- "link": {
- "language": "C",
- "lto": True,
- "commandFragments": None,
- },
- "archive": None,
- "dependencies": [
- {
- "id": "^ZERO_CHECK::@6890427a1f51a3e7e1df$",
- "backtrace": None,
- },
- ],
- },
- {
- "name": "c_shared_exe",
- "id": "^c_shared_exe::@6890427a1f51a3e7e1df$",
- "directorySource": "^\\.$",
- "projectName": "codemodel-v2",
- "type": "EXECUTABLE",
- "isGeneratorProvided": None,
- "sources": [
- {
- "path": "^empty\\.c$",
- "isGenerated": None,
- "sourceGroupName": "Source Files",
- "compileGroupLanguage": "C",
- "backtrace": [
- {
- "file": "^codemodel-v2\\.cmake$",
- "line": 10,
- "command": "add_executable",
- "hasParent": True,
- },
- {
- "file": "^codemodel-v2\\.cmake$",
- "line": None,
- "command": None,
- "hasParent": True,
- },
- {
- "file": "^CMakeLists\\.txt$",
- "line": 3,
- "command": "include",
- "hasParent": True,
- },
- {
- "file": "^CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "Source Files",
- "sourcePaths": [
- "^empty\\.c$",
- ],
- },
- ],
- "compileGroups": [
- {
- "language": "C",
- "sourcePaths": [
- "^empty\\.c$",
- ],
- "includes": None,
- "defines": None,
- "compileCommandFragments": None,
- },
- ],
- "backtrace": [
- {
- "file": "^codemodel-v2\\.cmake$",
- "line": 10,
- "command": "add_executable",
- "hasParent": True,
- },
- {
- "file": "^codemodel-v2\\.cmake$",
- "line": None,
- "command": None,
- "hasParent": True,
- },
- {
- "file": "^CMakeLists\\.txt$",
- "line": 3,
- "command": "include",
- "hasParent": True,
- },
- {
- "file": "^CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": "^c_shared_exe(\\.exe)?$",
- "artifacts": [
- {
- "path": "^((Debug|Release|RelWithDebInfo|MinSizeRel)/)?c_shared_exe(\\.exe)?$",
- "_dllExtra": False,
- },
- {
- "path": "^((Debug|Release|RelWithDebInfo|MinSizeRel)/)?c_shared_exe\\.pdb$",
- "_dllExtra": True,
- },
- ],
- "build": "^\\.$",
- "source": "^\\.$",
- "install": None,
- "link": {
- "language": "C",
- "lto": True,
- "commandFragments": None,
- },
- "archive": None,
- "dependencies": [
- {
- "id": "^c_shared_lib::@6890427a1f51a3e7e1df$",
- "backtrace": [
- {
- "file": "^codemodel-v2\\.cmake$",
- "line": 11,
- "command": "target_link_libraries",
- "hasParent": True,
- },
- {
- "file": "^codemodel-v2\\.cmake$",
- "line": None,
- "command": None,
- "hasParent": True,
- },
- {
- "file": "^CMakeLists\\.txt$",
- "line": 3,
- "command": "include",
- "hasParent": True,
- },
- {
- "file": "^CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- {
- "id": "^ZERO_CHECK::@6890427a1f51a3e7e1df$",
- "backtrace": None,
- },
- ],
- },
- {
- "name": "c_static_lib",
- "id": "^c_static_lib::@6890427a1f51a3e7e1df$",
- "directorySource": "^\\.$",
- "projectName": "codemodel-v2",
- "type": "STATIC_LIBRARY",
- "isGeneratorProvided": None,
- "sources": [
- {
- "path": "^empty\\.c$",
- "isGenerated": None,
- "sourceGroupName": "Source Files",
- "compileGroupLanguage": "C",
- "backtrace": [
- {
- "file": "^codemodel-v2\\.cmake$",
- "line": 13,
- "command": "add_library",
- "hasParent": True,
- },
- {
- "file": "^codemodel-v2\\.cmake$",
- "line": None,
- "command": None,
- "hasParent": True,
- },
- {
- "file": "^CMakeLists\\.txt$",
- "line": 3,
- "command": "include",
- "hasParent": True,
- },
- {
- "file": "^CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "Source Files",
- "sourcePaths": [
- "^empty\\.c$",
- ],
- },
- ],
- "compileGroups": [
- {
- "language": "C",
- "sourcePaths": [
- "^empty\\.c$",
- ],
- "includes": None,
- "defines": None,
- "compileCommandFragments": None,
- },
- ],
- "backtrace": [
- {
- "file": "^codemodel-v2\\.cmake$",
- "line": 13,
- "command": "add_library",
- "hasParent": True,
- },
- {
- "file": "^codemodel-v2\\.cmake$",
- "line": None,
- "command": None,
- "hasParent": True,
- },
- {
- "file": "^CMakeLists\\.txt$",
- "line": 3,
- "command": "include",
- "hasParent": True,
- },
- {
- "file": "^CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": "^(lib)?c_static_lib\\.(a|lib)$",
- "artifacts": [
- {
- "path": "^((Debug|Release|RelWithDebInfo|MinSizeRel)/)?(lib)?c_static_lib\\.(a|lib)$",
- "_dllExtra": False,
- },
- ],
- "build": "^\\.$",
- "source": "^\\.$",
- "install": None,
- "link": None,
- "archive": {
- "lto": True,
- },
- "dependencies": [
- {
- "id": "^ZERO_CHECK::@6890427a1f51a3e7e1df$",
- "backtrace": None,
- },
- ],
- },
- {
- "name": "c_static_exe",
- "id": "^c_static_exe::@6890427a1f51a3e7e1df$",
- "directorySource": "^\\.$",
- "projectName": "codemodel-v2",
- "type": "EXECUTABLE",
- "isGeneratorProvided": None,
- "sources": [
- {
- "path": "^empty\\.c$",
- "isGenerated": None,
- "sourceGroupName": "Source Files",
- "compileGroupLanguage": "C",
- "backtrace": [
- {
- "file": "^codemodel-v2\\.cmake$",
- "line": 14,
- "command": "add_executable",
- "hasParent": True,
- },
- {
- "file": "^codemodel-v2\\.cmake$",
- "line": None,
- "command": None,
- "hasParent": True,
- },
- {
- "file": "^CMakeLists\\.txt$",
- "line": 3,
- "command": "include",
- "hasParent": True,
- },
- {
- "file": "^CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "Source Files",
- "sourcePaths": [
- "^empty\\.c$",
- ],
- },
- ],
- "compileGroups": [
- {
- "language": "C",
- "sourcePaths": [
- "^empty\\.c$",
- ],
- "includes": None,
- "defines": None,
- "compileCommandFragments": None,
- },
- ],
- "backtrace": [
- {
- "file": "^codemodel-v2\\.cmake$",
- "line": 14,
- "command": "add_executable",
- "hasParent": True,
- },
- {
- "file": "^codemodel-v2\\.cmake$",
- "line": None,
- "command": None,
- "hasParent": True,
- },
- {
- "file": "^CMakeLists\\.txt$",
- "line": 3,
- "command": "include",
- "hasParent": True,
- },
- {
- "file": "^CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": "^c_static_exe(\\.exe)?$",
- "artifacts": [
- {
- "path": "^((Debug|Release|RelWithDebInfo|MinSizeRel)/)?c_static_exe(\\.exe)?$",
- "_dllExtra": False,
- },
- {
- "path": "^((Debug|Release|RelWithDebInfo|MinSizeRel)/)?c_static_exe\\.pdb$",
- "_dllExtra": True,
- },
- ],
- "build": "^\\.$",
- "source": "^\\.$",
- "install": None,
- "link": {
- "language": "C",
- "lto": None,
- "commandFragments": None,
- },
- "archive": None,
- "dependencies": [
- {
- "id": "^c_static_lib::@6890427a1f51a3e7e1df$",
- "backtrace": [
- {
- "file": "^codemodel-v2\\.cmake$",
- "line": 15,
- "command": "target_link_libraries",
- "hasParent": True,
- },
- {
- "file": "^codemodel-v2\\.cmake$",
- "line": None,
- "command": None,
- "hasParent": True,
- },
- {
- "file": "^CMakeLists\\.txt$",
- "line": 3,
- "command": "include",
- "hasParent": True,
- },
- {
- "file": "^CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- {
- "id": "^ZERO_CHECK::@6890427a1f51a3e7e1df$",
- "backtrace": None,
- },
- ],
- },
- {
- "name": "ALL_BUILD",
- "id": "^ALL_BUILD::@a56b12a3f5c0529fb296$",
- "directorySource": "^cxx$",
- "projectName": "Cxx",
- "type": "UTILITY",
- "isGeneratorProvided": True,
- "sources": [
- {
- "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/cxx/CMakeFiles/ALL_BUILD$",
- "isGenerated": True,
- "sourceGroupName": "",
- "compileGroupLanguage": None,
- "backtrace": [
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- {
- "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/cxx/CMakeFiles/ALL_BUILD\\.rule$",
- "isGenerated": True,
- "sourceGroupName": "CMake Rules",
- "compileGroupLanguage": None,
- "backtrace": [
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "",
- "sourcePaths": [
- "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/cxx/CMakeFiles/ALL_BUILD$",
- ],
- },
- {
- "name": "CMake Rules",
- "sourcePaths": [
- "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/cxx/CMakeFiles/ALL_BUILD\\.rule$",
- ],
- },
- ],
- "compileGroups": None,
- "backtrace": [
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": None,
- "artifacts": None,
- "build": "^cxx$",
- "source": "^cxx$",
- "install": None,
- "link": None,
- "archive": None,
- "dependencies": [
- {
- "id": "^ZERO_CHECK::@a56b12a3f5c0529fb296$",
- "backtrace": None,
- },
- {
- "id": "^cxx_lib::@a56b12a3f5c0529fb296$",
- "backtrace": None,
- },
- {
- "id": "^cxx_exe::@a56b12a3f5c0529fb296$",
- "backtrace": None,
- },
- {
- "id": "^cxx_shared_lib::@a56b12a3f5c0529fb296$",
- "backtrace": None,
- },
- {
- "id": "^cxx_shared_exe::@a56b12a3f5c0529fb296$",
- "backtrace": None,
- },
- {
- "id": "^cxx_static_lib::@a56b12a3f5c0529fb296$",
- "backtrace": None,
- },
- {
- "id": "^cxx_static_exe::@a56b12a3f5c0529fb296$",
- "backtrace": None,
- },
- ],
- },
- {
- "name": "ZERO_CHECK",
- "id": "^ZERO_CHECK::@a56b12a3f5c0529fb296$",
- "directorySource": "^cxx$",
- "projectName": "Cxx",
- "type": "UTILITY",
- "isGeneratorProvided": True,
- "sources": [
- {
- "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/cxx/CMakeFiles/ZERO_CHECK$",
- "isGenerated": True,
- "sourceGroupName": "",
- "compileGroupLanguage": None,
- "backtrace": [
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- {
- "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/cxx/CMakeFiles/ZERO_CHECK\\.rule$",
- "isGenerated": True,
- "sourceGroupName": "CMake Rules",
- "compileGroupLanguage": None,
- "backtrace": [
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "",
- "sourcePaths": [
- "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/cxx/CMakeFiles/ZERO_CHECK$",
- ],
- },
- {
- "name": "CMake Rules",
- "sourcePaths": [
- "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/cxx/CMakeFiles/ZERO_CHECK\\.rule$",
- ],
- },
- ],
- "compileGroups": None,
- "backtrace": [
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": None,
- "artifacts": None,
- "build": "^cxx$",
- "source": "^cxx$",
- "install": None,
- "link": None,
- "archive": None,
- "dependencies": None,
- },
- {
- "name": "cxx_lib",
- "id": "^cxx_lib::@a56b12a3f5c0529fb296$",
- "directorySource": "^cxx$",
- "projectName": "Cxx",
- "type": "STATIC_LIBRARY",
- "isGeneratorProvided": None,
- "sources": [
- {
- "path": "^empty\\.cxx$",
- "isGenerated": None,
- "sourceGroupName": "Source Files",
- "compileGroupLanguage": "CXX",
- "backtrace": [
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": 4,
- "command": "add_library",
- "hasParent": True,
- },
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "Source Files",
- "sourcePaths": [
- "^empty\\.cxx$",
- ],
- },
- ],
- "compileGroups": [
- {
- "language": "CXX",
- "sourcePaths": [
- "^empty\\.cxx$",
- ],
- "includes": None,
- "defines": None,
- "compileCommandFragments": None,
- },
- ],
- "backtrace": [
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": 4,
- "command": "add_library",
- "hasParent": True,
- },
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": "^(lib)?cxx_lib\\.(a|lib)$",
- "artifacts": [
- {
- "path": "^cxx/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?(lib)?cxx_lib\\.(a|lib)$",
- "_dllExtra": False,
- },
- ],
- "build": "^cxx$",
- "source": "^cxx$",
- "install": None,
- "link": None,
- "archive": {
- "lto": None,
- },
- "dependencies": [
- {
- "id": "^ZERO_CHECK::@a56b12a3f5c0529fb296$",
- "backtrace": None,
- },
- ],
- },
- {
- "name": "cxx_exe",
- "id": "^cxx_exe::@a56b12a3f5c0529fb296$",
- "directorySource": "^cxx$",
- "projectName": "Cxx",
- "type": "EXECUTABLE",
- "isGeneratorProvided": None,
- "sources": [
- {
- "path": "^empty\\.cxx$",
- "isGenerated": None,
- "sourceGroupName": "Source Files",
- "compileGroupLanguage": "CXX",
- "backtrace": [
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": 5,
- "command": "add_executable",
- "hasParent": True,
- },
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "Source Files",
- "sourcePaths": [
- "^empty\\.cxx$",
- ],
- },
- ],
- "compileGroups": [
- {
- "language": "CXX",
- "sourcePaths": [
- "^empty\\.cxx$",
- ],
- "includes": None,
- "defines": None,
- "compileCommandFragments": [
- {
- "fragment" : "TargetCompileOptions",
- "backtrace": [
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": 17,
- "command": "target_compile_options",
- "hasParent": True,
- },
- {
- "file" : "^cxx/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- }
- ],
- },
- ],
- "backtrace": [
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": 5,
- "command": "add_executable",
- "hasParent": True,
- },
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": "bin",
- "nameOnDisk": "^cxx_exe(\\.exe)?$",
- "artifacts": [
- {
- "path": "^cxx/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?cxx_exe(\\.exe)?$",
- "_dllExtra": False,
- },
- {
- "path": "^cxx/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?cxx_exe\\.pdb$",
- "_dllExtra": True,
- },
- ],
- "build": "^cxx$",
- "source": "^cxx$",
- "install": {
- "prefix": "^(/usr/local|[A-Za-z]:.*/codemodel-v2)$",
- "destinations": [
- {
- "path": "bin",
- "backtrace": [
- {
- "file": "^codemodel-v2\\.cmake$",
- "line": 37,
- "command": "install",
- "hasParent": True,
- },
- {
- "file": "^codemodel-v2\\.cmake$",
- "line": None,
- "command": None,
- "hasParent": True,
- },
- {
- "file": "^CMakeLists\\.txt$",
- "line": 3,
- "command": "include",
- "hasParent": True,
- },
- {
- "file": "^CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- },
- "link": {
- "language": "CXX",
- "lto": None,
- "commandFragments": [
- {
- "fragment" : "TargetLinkOptions",
- "role" : "flags",
- "backtrace": [
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": 18,
- "command": "target_link_options",
- "hasParent": True,
- },
- {
- "file" : "^cxx/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- {
- "fragment" : ".*TargetLinkDir\\\"?$",
- "role" : "libraryPath",
- "backtrace": [
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": 19,
- "command": "target_link_directories",
- "hasParent": True,
- },
- {
- "file" : "^cxx/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- {
- "fragment" : ".*cxx_lib.*",
- "role" : "libraries",
- "backtrace": [
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": 6,
- "command": "target_link_libraries",
- "hasParent": True,
- },
- {
- "file" : "^cxx/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- },
- "archive": None,
- "dependencies": [
- {
- "id": "^cxx_lib::@a56b12a3f5c0529fb296$",
- "backtrace": [
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": 6,
- "command": "target_link_libraries",
- "hasParent": True,
- },
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- {
- "id": "^ZERO_CHECK::@a56b12a3f5c0529fb296$",
- "backtrace": None,
- },
- ],
- },
- {
- "name": "cxx_shared_lib",
- "id": "^cxx_shared_lib::@a56b12a3f5c0529fb296$",
- "directorySource": "^cxx$",
- "projectName": "Cxx",
- "type": "SHARED_LIBRARY",
- "isGeneratorProvided": None,
- "sources": [
- {
- "path": "^empty\\.cxx$",
- "isGenerated": None,
- "sourceGroupName": "Source Files",
- "compileGroupLanguage": "CXX",
- "backtrace": [
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": 9,
- "command": "add_library",
- "hasParent": True,
- },
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "Source Files",
- "sourcePaths": [
- "^empty\\.cxx$",
- ],
- },
- ],
- "compileGroups": [
- {
- "language": "CXX",
- "sourcePaths": [
- "^empty\\.cxx$",
- ],
- "includes": None,
- "defines": [
- {
- "define": "cxx_shared_lib_EXPORTS",
- "backtrace": None,
- },
- ],
- "compileCommandFragments": None,
- },
- ],
- "backtrace": [
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": 9,
- "command": "add_library",
- "hasParent": True,
- },
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": "^(lib|cyg)?cxx_shared_lib\\.(so|dylib|dll)$",
- "artifacts": [
- {
- "path": "^cxx/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?(lib|cyg)?cxx_shared_lib\\.(so|dylib|dll)$",
- "_dllExtra": False,
- },
- {
- "path": "^cxx/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?(lib)?cxx_shared_lib\\.(dll\\.a|lib)$",
- "_dllExtra": True,
- },
- {
- "path": "^cxx/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?(lib|cyg)?cxx_shared_lib\\.pdb$",
- "_dllExtra": True,
- },
- ],
- "build": "^cxx$",
- "source": "^cxx$",
- "install": None,
- "link": {
- "language": "CXX",
- "lto": None,
- "commandFragments": None,
- },
- "archive": None,
- "dependencies": [
- {
- "id": "^ZERO_CHECK::@a56b12a3f5c0529fb296$",
- "backtrace": None,
- },
- ],
- },
- {
- "name": "cxx_shared_exe",
- "id": "^cxx_shared_exe::@a56b12a3f5c0529fb296$",
- "directorySource": "^cxx$",
- "projectName": "Cxx",
- "type": "EXECUTABLE",
- "isGeneratorProvided": None,
- "sources": [
- {
- "path": "^empty\\.cxx$",
- "isGenerated": None,
- "sourceGroupName": "Source Files",
- "compileGroupLanguage": "CXX",
- "backtrace": [
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": 10,
- "command": "add_executable",
- "hasParent": True,
- },
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "Source Files",
- "sourcePaths": [
- "^empty\\.cxx$",
- ],
- },
- ],
- "compileGroups": [
- {
- "language": "CXX",
- "sourcePaths": [
- "^empty\\.cxx$",
- ],
- "includes": None,
- "defines": None,
- "compileCommandFragments": None,
- },
- ],
- "backtrace": [
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": 10,
- "command": "add_executable",
- "hasParent": True,
- },
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": "^cxx_shared_exe(\\.exe)?$",
- "artifacts": [
- {
- "path": "^cxx/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?cxx_shared_exe(\\.exe)?$",
- "_dllExtra": False,
- },
- {
- "path": "^cxx/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?cxx_shared_exe\\.pdb$",
- "_dllExtra": True,
- },
- ],
- "build": "^cxx$",
- "source": "^cxx$",
- "install": None,
- "link": {
- "language": "CXX",
- "lto": None,
- "commandFragments": None,
- },
- "archive": None,
- "dependencies": [
- {
- "id": "^cxx_shared_lib::@a56b12a3f5c0529fb296$",
- "backtrace": [
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": 11,
- "command": "target_link_libraries",
- "hasParent": True,
- },
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- {
- "id": "^ZERO_CHECK::@a56b12a3f5c0529fb296$",
- "backtrace": None,
- },
- ],
- },
- {
- "name": "cxx_static_lib",
- "id": "^cxx_static_lib::@a56b12a3f5c0529fb296$",
- "directorySource": "^cxx$",
- "projectName": "Cxx",
- "type": "STATIC_LIBRARY",
- "isGeneratorProvided": None,
- "sources": [
- {
- "path": "^empty\\.cxx$",
- "isGenerated": None,
- "sourceGroupName": "Source Files",
- "compileGroupLanguage": "CXX",
- "backtrace": [
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": 13,
- "command": "add_library",
- "hasParent": True,
- },
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "Source Files",
- "sourcePaths": [
- "^empty\\.cxx$",
- ],
- },
- ],
- "compileGroups": [
- {
- "language": "CXX",
- "sourcePaths": [
- "^empty\\.cxx$",
- ],
- "includes": None,
- "defines": None,
- "compileCommandFragments": None,
- },
- ],
- "backtrace": [
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": 13,
- "command": "add_library",
- "hasParent": True,
- },
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": "^(lib)?cxx_static_lib\\.(a|lib)$",
- "artifacts": [
- {
- "path": "^cxx/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?(lib)?cxx_static_lib\\.(a|lib)$",
- "_dllExtra": False,
- },
- ],
- "build": "^cxx$",
- "source": "^cxx$",
- "install": None,
- "link": None,
- "archive": {
- "lto": None,
- },
- "dependencies": [
- {
- "id": "^ZERO_CHECK::@a56b12a3f5c0529fb296$",
- "backtrace": None,
- },
- ],
- },
- {
- "name": "cxx_static_exe",
- "id": "^cxx_static_exe::@a56b12a3f5c0529fb296$",
- "directorySource": "^cxx$",
- "projectName": "Cxx",
- "type": "EXECUTABLE",
- "isGeneratorProvided": None,
- "sources": [
- {
- "path": "^empty\\.cxx$",
- "isGenerated": None,
- "sourceGroupName": "Source Files",
- "compileGroupLanguage": "CXX",
- "backtrace": [
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": 14,
- "command": "add_executable",
- "hasParent": True,
- },
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "Source Files",
- "sourcePaths": [
- "^empty\\.cxx$",
- ],
- },
- ],
- "compileGroups": [
- {
- "language": "CXX",
- "sourcePaths": [
- "^empty\\.cxx$",
- ],
- "includes": None,
- "defines": None,
- "compileCommandFragments": None,
- },
- ],
- "backtrace": [
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": 14,
- "command": "add_executable",
- "hasParent": True,
- },
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": "^cxx_static_exe(\\.exe)?$",
- "artifacts": [
- {
- "path": "^cxx/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?cxx_static_exe(\\.exe)?$",
- "_dllExtra": False,
- },
- {
- "path": "^cxx/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?cxx_static_exe\\.pdb$",
- "_dllExtra": True,
- },
- ],
- "build": "^cxx$",
- "source": "^cxx$",
- "install": None,
- "link": {
- "language": "CXX",
- "lto": None,
- "commandFragments": None,
- },
- "archive": None,
- "dependencies": [
- {
- "id": "^cxx_static_lib::@a56b12a3f5c0529fb296$",
- "backtrace": [
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": 15,
- "command": "target_link_libraries",
- "hasParent": True,
- },
- {
- "file": "^cxx/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- {
- "id": "^ZERO_CHECK::@a56b12a3f5c0529fb296$",
- "backtrace": None,
- },
- ],
- },
- {
- "name": "ALL_BUILD",
- "id": "^ALL_BUILD::@53632cba2752272bb008$",
- "directorySource": "^alias$",
- "projectName": "Alias",
- "type": "UTILITY",
- "isGeneratorProvided": True,
- "sources": [
- {
- "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/alias/CMakeFiles/ALL_BUILD$",
- "isGenerated": True,
- "sourceGroupName": "",
- "compileGroupLanguage": None,
- "backtrace": [
- {
- "file": "^alias/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- {
- "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/alias/CMakeFiles/ALL_BUILD\\.rule$",
- "isGenerated": True,
- "sourceGroupName": "CMake Rules",
- "compileGroupLanguage": None,
- "backtrace": [
- {
- "file": "^alias/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "",
- "sourcePaths": [
- "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/alias/CMakeFiles/ALL_BUILD$",
- ],
- },
- {
- "name": "CMake Rules",
- "sourcePaths": [
- "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/alias/CMakeFiles/ALL_BUILD\\.rule$",
- ],
- },
- ],
- "compileGroups": None,
- "backtrace": [
- {
- "file": "^alias/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": None,
- "artifacts": None,
- "build": "^alias$",
- "source": "^alias$",
- "install": None,
- "link": None,
- "archive": None,
- "dependencies": [
- {
- "id": "^ZERO_CHECK::@53632cba2752272bb008$",
- "backtrace": None,
- },
- {
- "id": "^c_alias_exe::@53632cba2752272bb008$",
- "backtrace": None,
- },
- {
- "id": "^cxx_alias_exe::@53632cba2752272bb008$",
- "backtrace": None,
- },
- ],
- },
- {
- "name": "ZERO_CHECK",
- "id": "^ZERO_CHECK::@53632cba2752272bb008$",
- "directorySource": "^alias$",
- "projectName": "Alias",
- "type": "UTILITY",
- "isGeneratorProvided": True,
- "sources": [
- {
- "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/alias/CMakeFiles/ZERO_CHECK$",
- "isGenerated": True,
- "sourceGroupName": "",
- "compileGroupLanguage": None,
- "backtrace": [
- {
- "file": "^alias/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- {
- "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/alias/CMakeFiles/ZERO_CHECK\\.rule$",
- "isGenerated": True,
- "sourceGroupName": "CMake Rules",
- "compileGroupLanguage": None,
- "backtrace": [
- {
- "file": "^alias/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "",
- "sourcePaths": [
- "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/alias/CMakeFiles/ZERO_CHECK$",
- ],
- },
- {
- "name": "CMake Rules",
- "sourcePaths": [
- "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/alias/CMakeFiles/ZERO_CHECK\\.rule$",
- ],
- },
- ],
- "compileGroups": None,
- "backtrace": [
- {
- "file": "^alias/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": None,
- "artifacts": None,
- "build": "^alias$",
- "source": "^alias$",
- "install": None,
- "link": None,
- "archive": None,
- "dependencies": None,
- },
- {
- "name": "c_alias_exe",
- "id": "^c_alias_exe::@53632cba2752272bb008$",
- "directorySource": "^alias$",
- "projectName": "Alias",
- "type": "EXECUTABLE",
- "isGeneratorProvided": None,
- "sources": [
- {
- "path": "^empty\\.c$",
- "isGenerated": None,
- "sourceGroupName": "Source Files",
- "compileGroupLanguage": "C",
- "backtrace": [
- {
- "file": "^alias/CMakeLists\\.txt$",
- "line": 5,
- "command": "add_executable",
- "hasParent": True,
- },
- {
- "file": "^alias/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "Source Files",
- "sourcePaths": [
- "^empty\\.c$",
- ],
- },
- ],
- "compileGroups": [
- {
- "language": "C",
- "sourcePaths": [
- "^empty\\.c$",
- ],
- "includes": None,
- "defines": None,
- "compileCommandFragments": None,
- },
- ],
- "backtrace": [
- {
- "file": "^alias/CMakeLists\\.txt$",
- "line": 5,
- "command": "add_executable",
- "hasParent": True,
- },
- {
- "file": "^alias/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": "^c_alias_exe(\\.exe)?$",
- "artifacts": [
- {
- "path": "^alias/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?c_alias_exe(\\.exe)?$",
- "_dllExtra": False,
- },
- {
- "path": "^alias/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?c_alias_exe\\.pdb$",
- "_dllExtra": True,
- },
- ],
- "build": "^alias$",
- "source": "^alias$",
- "install": None,
- "link": {
- "language": "C",
- "lto": None,
- "commandFragments": None,
- },
- "archive": None,
- "dependencies": [
- {
- "id": "^c_lib::@6890427a1f51a3e7e1df$",
- "backtrace": [
- {
- "file": "^alias/CMakeLists\\.txt$",
- "line": 6,
- "command": "target_link_libraries",
- "hasParent": True,
- },
- {
- "file": "^alias/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- {
- "id": "^ZERO_CHECK::@53632cba2752272bb008$",
- "backtrace": None,
- },
- ],
- },
- {
- "name": "cxx_alias_exe",
- "id": "^cxx_alias_exe::@53632cba2752272bb008$",
- "directorySource": "^alias$",
- "projectName": "Alias",
- "type": "EXECUTABLE",
- "isGeneratorProvided": None,
- "sources": [
- {
- "path": "^empty\\.cxx$",
- "isGenerated": None,
- "sourceGroupName": "Source Files",
- "compileGroupLanguage": "CXX",
- "backtrace": [
- {
- "file": "^alias/CMakeLists\\.txt$",
- "line": 9,
- "command": "add_executable",
- "hasParent": True,
- },
- {
- "file": "^alias/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "Source Files",
- "sourcePaths": [
- "^empty\\.cxx$",
- ],
- },
- ],
- "compileGroups": [
- {
- "language": "CXX",
- "sourcePaths": [
- "^empty\\.cxx$",
- ],
- "includes": None,
- "defines": None,
- "compileCommandFragments": None,
- },
- ],
- "backtrace": [
- {
- "file": "^alias/CMakeLists\\.txt$",
- "line": 9,
- "command": "add_executable",
- "hasParent": True,
- },
- {
- "file": "^alias/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": "^cxx_alias_exe(\\.exe)?$",
- "artifacts": [
- {
- "path": "^alias/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?cxx_alias_exe(\\.exe)?$",
- "_dllExtra": False,
- },
- {
- "path": "^alias/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?cxx_alias_exe\\.pdb$",
- "_dllExtra": True,
- },
- ],
- "build": "^alias$",
- "source": "^alias$",
- "install": None,
- "link": {
- "language": "CXX",
- "lto": None,
- "commandFragments": None,
- },
- "archive": None,
- "dependencies": [
- {
- "id": "^cxx_lib::@a56b12a3f5c0529fb296$",
- "backtrace": [
- {
- "file": "^alias/CMakeLists\\.txt$",
- "line": 10,
- "command": "target_link_libraries",
- "hasParent": True,
- },
- {
- "file": "^alias/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- {
- "id": "^ZERO_CHECK::@53632cba2752272bb008$",
- "backtrace": None,
- },
- ],
- },
- {
- "name": "ALL_BUILD",
- "id": "^ALL_BUILD::@5ed5358f70faf8d8af7a$",
- "directorySource": "^object$",
- "projectName": "Object",
- "type": "UTILITY",
- "isGeneratorProvided": True,
- "sources": [
- {
- "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/object/CMakeFiles/ALL_BUILD$",
- "isGenerated": True,
- "sourceGroupName": "",
- "compileGroupLanguage": None,
- "backtrace": [
- {
- "file": "^object/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- {
- "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/object/CMakeFiles/ALL_BUILD\\.rule$",
- "isGenerated": True,
- "sourceGroupName": "CMake Rules",
- "compileGroupLanguage": None,
- "backtrace": [
- {
- "file": "^object/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "",
- "sourcePaths": [
- "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/object/CMakeFiles/ALL_BUILD$",
- ],
- },
- {
- "name": "CMake Rules",
- "sourcePaths": [
- "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/object/CMakeFiles/ALL_BUILD\\.rule$",
- ],
- },
- ],
- "compileGroups": None,
- "backtrace": [
- {
- "file": "^object/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": None,
- "artifacts": None,
- "build": "^object$",
- "source": "^object$",
- "install": None,
- "link": None,
- "archive": None,
- "dependencies": [
- {
- "id": "^ZERO_CHECK::@5ed5358f70faf8d8af7a$",
- "backtrace": None,
- },
- {
- "id": "^c_object_lib::@5ed5358f70faf8d8af7a$",
- "backtrace": None,
- },
- {
- "id": "^c_object_exe::@5ed5358f70faf8d8af7a$",
- "backtrace": None,
- },
- {
- "id": "^cxx_object_lib::@5ed5358f70faf8d8af7a$",
- "backtrace": None,
- },
- {
- "id": "^cxx_object_exe::@5ed5358f70faf8d8af7a$",
- "backtrace": None,
- },
- ],
- },
- {
- "name": "ZERO_CHECK",
- "id": "^ZERO_CHECK::@5ed5358f70faf8d8af7a$",
- "directorySource": "^object$",
- "projectName": "Object",
- "type": "UTILITY",
- "isGeneratorProvided": True,
- "sources": [
- {
- "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/object/CMakeFiles/ZERO_CHECK$",
- "isGenerated": True,
- "sourceGroupName": "",
- "compileGroupLanguage": None,
- "backtrace": [
- {
- "file": "^object/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- {
- "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/object/CMakeFiles/ZERO_CHECK\\.rule$",
- "isGenerated": True,
- "sourceGroupName": "CMake Rules",
- "compileGroupLanguage": None,
- "backtrace": [
- {
- "file": "^object/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "",
- "sourcePaths": [
- "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/object/CMakeFiles/ZERO_CHECK$",
- ],
- },
- {
- "name": "CMake Rules",
- "sourcePaths": [
- "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/object/CMakeFiles/ZERO_CHECK\\.rule$",
- ],
- },
- ],
- "compileGroups": None,
- "backtrace": [
- {
- "file": "^object/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": None,
- "artifacts": None,
- "build": "^object$",
- "source": "^object$",
- "install": None,
- "link": None,
- "archive": None,
- "dependencies": None,
- },
- {
- "name": "c_object_lib",
- "id": "^c_object_lib::@5ed5358f70faf8d8af7a$",
- "directorySource": "^object$",
- "projectName": "Object",
- "type": "OBJECT_LIBRARY",
- "isGeneratorProvided": None,
- "sources": [
- {
- "path": "^empty\\.c$",
- "isGenerated": None,
- "sourceGroupName": "Source Files",
- "compileGroupLanguage": "C",
- "backtrace": [
- {
- "file": "^object/CMakeLists\\.txt$",
- "line": 5,
- "command": "add_library",
- "hasParent": True,
- },
- {
- "file": "^object/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "Source Files",
- "sourcePaths": [
- "^empty\\.c$",
- ],
- },
- ],
- "compileGroups": [
- {
- "language": "C",
- "sourcePaths": [
- "^empty\\.c$",
- ],
- "includes": None,
- "defines": None,
- "compileCommandFragments": None,
- },
- ],
- "backtrace": [
- {
- "file": "^object/CMakeLists\\.txt$",
- "line": 5,
- "command": "add_library",
- "hasParent": True,
- },
- {
- "file": "^object/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": None,
- "artifacts": [
- {
- "path": "^object/.*/empty(\\.c)?\\.o(bj)?$",
- "_dllExtra": False,
- },
- ],
- "build": "^object$",
- "source": "^object$",
- "install": None,
- "link": None,
- "archive": None,
- "dependencies": [
- {
- "id": "^ZERO_CHECK::@5ed5358f70faf8d8af7a$",
- "backtrace": None,
- },
- ],
- },
- {
- "name": "c_object_exe",
- "id": "^c_object_exe::@5ed5358f70faf8d8af7a$",
- "directorySource": "^object$",
- "projectName": "Object",
- "type": "EXECUTABLE",
- "isGeneratorProvided": None,
- "sources": [
- {
- "path": "^empty\\.c$",
- "isGenerated": None,
- "sourceGroupName": "Source Files",
- "compileGroupLanguage": "C",
- "backtrace": [
- {
- "file": "^object/CMakeLists\\.txt$",
- "line": 6,
- "command": "add_executable",
- "hasParent": True,
- },
- {
- "file": "^object/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- {
- "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/object/.*/empty(\\.c)?\\.o(bj)?$",
- "isGenerated": True,
- "sourceGroupName": "Object Libraries",
- "compileGroupLanguage": None,
- "backtrace": [
- {
- "file": "^object/CMakeLists\\.txt$",
- "line": 7,
- "command": "target_link_libraries",
- "hasParent": True,
- },
- {
- "file": "^object/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "Source Files",
- "sourcePaths": [
- "^empty\\.c$",
- ],
- },
- {
- "name": "Object Libraries",
- "sourcePaths": [
- "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/object/.*/empty(\\.c)?\\.o(bj)?$",
- ],
- },
- ],
- "compileGroups": [
- {
- "language": "C",
- "sourcePaths": [
- "^empty\\.c$",
- ],
- "includes": None,
- "defines": None,
- "compileCommandFragments": None,
- },
- ],
- "backtrace": [
- {
- "file": "^object/CMakeLists\\.txt$",
- "line": 6,
- "command": "add_executable",
- "hasParent": True,
- },
- {
- "file": "^object/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": "^c_object_exe(\\.exe)?$",
- "artifacts": [
- {
- "path": "^object/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?c_object_exe(\\.exe)?$",
- "_dllExtra": False,
- },
- {
- "path": "^object/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?c_object_exe\\.pdb$",
- "_dllExtra": True,
- },
- ],
- "build": "^object$",
- "source": "^object$",
- "install": {
- "prefix": "^(/usr/local|[A-Za-z]:.*/codemodel-v2)$",
- "destinations": [
- {
- "path": "bin",
- "backtrace": [
- {
- "file": "^object/CMakeLists\\.txt$",
- "line": 13,
- "command": "install",
- "hasParent": True,
- },
- {
- "file": "^object/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- },
- "link": {
- "language": "C",
- "lto": None,
- "commandFragments": None,
- },
- "archive": None,
- "dependencies": [
- {
- "id": "^c_object_lib::@5ed5358f70faf8d8af7a$",
- # FIXME: Add a backtrace here when it becomes available.
- # You'll know when it's available, because this test will
- # fail.
- "backtrace": None,
- },
- {
- "id": "^ZERO_CHECK::@5ed5358f70faf8d8af7a$",
- "backtrace": None,
- },
- ],
- },
- {
- "name": "cxx_object_lib",
- "id": "^cxx_object_lib::@5ed5358f70faf8d8af7a$",
- "directorySource": "^object$",
- "projectName": "Object",
- "type": "OBJECT_LIBRARY",
- "isGeneratorProvided": None,
- "sources": [
- {
- "path": "^empty\\.cxx$",
- "isGenerated": None,
- "sourceGroupName": "Source Files",
- "compileGroupLanguage": "CXX",
- "backtrace": [
- {
- "file": "^object/CMakeLists\\.txt$",
- "line": 9,
- "command": "add_library",
- "hasParent": True,
- },
- {
- "file": "^object/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "Source Files",
- "sourcePaths": [
- "^empty\\.cxx$",
- ],
- },
- ],
- "compileGroups": [
- {
- "language": "CXX",
- "sourcePaths": [
- "^empty\\.cxx$",
- ],
- "includes": None,
- "defines": None,
- "compileCommandFragments": None,
- },
- ],
- "backtrace": [
- {
- "file": "^object/CMakeLists\\.txt$",
- "line": 9,
- "command": "add_library",
- "hasParent": True,
- },
- {
- "file": "^object/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": None,
- "artifacts": [
- {
- "path": "^object/.*/empty(\\.cxx)?\\.o(bj)?$",
- "_dllExtra": False,
- },
- ],
- "build": "^object$",
- "source": "^object$",
- "install": None,
- "link": None,
- "archive": None,
- "dependencies": [
- {
- "id": "^ZERO_CHECK::@5ed5358f70faf8d8af7a$",
- "backtrace": None,
- },
- ],
- },
- {
- "name": "cxx_object_exe",
- "id": "^cxx_object_exe::@5ed5358f70faf8d8af7a$",
- "directorySource": "^object$",
- "projectName": "Object",
- "type": "EXECUTABLE",
- "isGeneratorProvided": None,
- "sources": [
- {
- "path": "^empty\\.cxx$",
- "isGenerated": None,
- "sourceGroupName": "Source Files",
- "compileGroupLanguage": "CXX",
- "backtrace": [
- {
- "file": "^object/CMakeLists\\.txt$",
- "line": 10,
- "command": "add_executable",
- "hasParent": True,
- },
- {
- "file": "^object/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- {
- "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/object/.*/empty(\\.cxx)?\\.o(bj)?$",
- "isGenerated": True,
- "sourceGroupName": "Object Libraries",
- "compileGroupLanguage": None,
- "backtrace": [
- {
- "file": "^object/CMakeLists\\.txt$",
- "line": 11,
- "command": "target_link_libraries",
- "hasParent": True,
- },
- {
- "file": "^object/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "Source Files",
- "sourcePaths": [
- "^empty\\.cxx$",
- ],
- },
- {
- "name": "Object Libraries",
- "sourcePaths": [
- "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/object/.*/empty(\\.cxx)?\\.o(bj)?$",
- ],
- },
- ],
- "compileGroups": [
- {
- "language": "CXX",
- "sourcePaths": [
- "^empty\\.cxx$",
- ],
- "includes": None,
- "defines": None,
- "compileCommandFragments": None,
- },
- ],
- "backtrace": [
- {
- "file": "^object/CMakeLists\\.txt$",
- "line": 10,
- "command": "add_executable",
- "hasParent": True,
- },
- {
- "file": "^object/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": "^cxx_object_exe(\\.exe)?$",
- "artifacts": [
- {
- "path": "^object/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?cxx_object_exe(\\.exe)?$",
- "_dllExtra": False,
- },
- {
- "path": "^object/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?cxx_object_exe\\.pdb$",
- "_dllExtra": True,
- },
- ],
- "build": "^object$",
- "source": "^object$",
- "install": {
- "prefix": "^(/usr/local|[A-Za-z]:.*/codemodel-v2)$",
- "destinations": [
- {
- "path": "bin",
- "backtrace": [
- {
- "file": "^object/CMakeLists\\.txt$",
- "line": 13,
- "command": "install",
- "hasParent": True,
- },
- {
- "file": "^object/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- },
- "link": {
- "language": "CXX",
- "lto": None,
- "commandFragments": None,
- },
- "archive": None,
- "dependencies": [
- {
- "id": "^cxx_object_lib::@5ed5358f70faf8d8af7a$",
- # FIXME: Add a backtrace here when it becomes available.
- # You'll know when it's available, because this test will
- # fail.
- "backtrace": None,
- },
- {
- "id": "^ZERO_CHECK::@5ed5358f70faf8d8af7a$",
- "backtrace": None,
- },
- ],
- },
- {
- "name": "ALL_BUILD",
- "id": "^ALL_BUILD::@ba7eb709d0b48779c6c8$",
- "directorySource": "^imported$",
- "projectName": "Imported",
- "type": "UTILITY",
- "isGeneratorProvided": True,
- "sources": [
- {
- "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/imported/CMakeFiles/ALL_BUILD$",
- "isGenerated": True,
- "sourceGroupName": "",
- "compileGroupLanguage": None,
- "backtrace": [
- {
- "file": "^imported/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- {
- "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/imported/CMakeFiles/ALL_BUILD\\.rule$",
- "isGenerated": True,
- "sourceGroupName": "CMake Rules",
- "compileGroupLanguage": None,
- "backtrace": [
- {
- "file": "^imported/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "",
- "sourcePaths": [
- "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/imported/CMakeFiles/ALL_BUILD$",
- ],
- },
- {
- "name": "CMake Rules",
- "sourcePaths": [
- "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/imported/CMakeFiles/ALL_BUILD\\.rule$",
- ],
- },
- ],
- "compileGroups": None,
- "backtrace": [
- {
- "file": "^imported/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": None,
- "artifacts": None,
- "build": "^imported$",
- "source": "^imported$",
- "install": None,
- "link": None,
- "archive": None,
- "dependencies": [
- {
- "id": "^ZERO_CHECK::@ba7eb709d0b48779c6c8$",
- "backtrace": None,
- },
- {
- "id": "^link_imported_exe::@ba7eb709d0b48779c6c8$",
- "backtrace": None,
- },
- {
- "id": "^link_imported_shared_exe::@ba7eb709d0b48779c6c8$",
- "backtrace": None,
- },
- {
- "id": "^link_imported_static_exe::@ba7eb709d0b48779c6c8$",
- "backtrace": None,
- },
- {
- "id": "^link_imported_object_exe::@ba7eb709d0b48779c6c8$",
- "backtrace": None,
- },
- {
- "id": "^link_imported_interface_exe::@ba7eb709d0b48779c6c8$",
- "backtrace": None,
- },
- ],
- },
- {
- "name": "ZERO_CHECK",
- "id": "^ZERO_CHECK::@ba7eb709d0b48779c6c8$",
- "directorySource": "^imported$",
- "projectName": "Imported",
- "type": "UTILITY",
- "isGeneratorProvided": True,
- "sources": [
- {
- "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/imported/CMakeFiles/ZERO_CHECK$",
- "isGenerated": True,
- "sourceGroupName": "",
- "compileGroupLanguage": None,
- "backtrace": [
- {
- "file": "^imported/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- {
- "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/imported/CMakeFiles/ZERO_CHECK\\.rule$",
- "isGenerated": True,
- "sourceGroupName": "CMake Rules",
- "compileGroupLanguage": None,
- "backtrace": [
- {
- "file": "^imported/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "",
- "sourcePaths": [
- "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/imported/CMakeFiles/ZERO_CHECK$",
- ],
- },
- {
- "name": "CMake Rules",
- "sourcePaths": [
- "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/imported/CMakeFiles/ZERO_CHECK\\.rule$",
- ],
- },
- ],
- "compileGroups": None,
- "backtrace": [
- {
- "file": "^imported/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": None,
- "artifacts": None,
- "build": "^imported$",
- "source": "^imported$",
- "install": None,
- "link": None,
- "archive": None,
- "dependencies": None,
- },
- {
- "name": "link_imported_exe",
- "id": "^link_imported_exe::@ba7eb709d0b48779c6c8$",
- "directorySource": "^imported$",
- "projectName": "Imported",
- "type": "EXECUTABLE",
- "isGeneratorProvided": None,
- "sources": [
- {
- "path": "^empty\\.c$",
- "isGenerated": None,
- "sourceGroupName": "Source Files",
- "compileGroupLanguage": "C",
- "backtrace": [
- {
- "file": "^imported/CMakeLists\\.txt$",
- "line": 5,
- "command": "add_executable",
- "hasParent": True,
- },
- {
- "file": "^imported/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "Source Files",
- "sourcePaths": [
- "^empty\\.c$",
- ],
- },
- ],
- "compileGroups": [
- {
- "language": "C",
- "sourcePaths": [
- "^empty\\.c$",
- ],
- "includes": None,
- "defines": None,
- "compileCommandFragments": None,
- },
- ],
- "backtrace": [
- {
- "file": "^imported/CMakeLists\\.txt$",
- "line": 5,
- "command": "add_executable",
- "hasParent": True,
- },
- {
- "file": "^imported/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": "^link_imported_exe(\\.exe)?$",
- "artifacts": [
- {
- "path": "^imported/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?link_imported_exe(\\.exe)?$",
- "_dllExtra": False,
- },
- {
- "path": "^imported/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?link_imported_exe\\.pdb$",
- "_dllExtra": True,
- },
- ],
- "build": "^imported$",
- "source": "^imported$",
- "install": None,
- "link": {
- "language": "C",
- "lto": None,
- "commandFragments": None,
- },
- "archive": None,
- "dependencies": [
- {
- "id": "^ZERO_CHECK::@ba7eb709d0b48779c6c8$",
- "backtrace": None,
- },
- ],
- },
- {
- "name": "link_imported_shared_exe",
- "id": "^link_imported_shared_exe::@ba7eb709d0b48779c6c8$",
- "directorySource": "^imported$",
- "projectName": "Imported",
- "type": "EXECUTABLE",
- "isGeneratorProvided": None,
- "sources": [
- {
- "path": "^empty\\.c$",
- "isGenerated": None,
- "sourceGroupName": "Source Files",
- "compileGroupLanguage": "C",
- "backtrace": [
- {
- "file": "^imported/CMakeLists\\.txt$",
- "line": 9,
- "command": "add_executable",
- "hasParent": True,
- },
- {
- "file": "^imported/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "Source Files",
- "sourcePaths": [
- "^empty\\.c$",
- ],
- },
- ],
- "compileGroups": [
- {
- "language": "C",
- "sourcePaths": [
- "^empty\\.c$",
- ],
- "includes": None,
- "defines": None,
- "compileCommandFragments": None,
- },
- ],
- "backtrace": [
- {
- "file": "^imported/CMakeLists\\.txt$",
- "line": 9,
- "command": "add_executable",
- "hasParent": True,
- },
- {
- "file": "^imported/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": "^link_imported_shared_exe(\\.exe)?$",
- "artifacts": [
- {
- "path": "^imported/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?link_imported_shared_exe(\\.exe)?$",
- "_dllExtra": False,
- },
- {
- "path": "^imported/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?link_imported_shared_exe\\.pdb$",
- "_dllExtra": True,
- },
- ],
- "build": "^imported$",
- "source": "^imported$",
- "install": None,
- "link": {
- "language": "C",
- "lto": None,
- "commandFragments": None,
- },
- "archive": None,
- "dependencies": [
- {
- "id": "^ZERO_CHECK::@ba7eb709d0b48779c6c8$",
- "backtrace": None,
- },
- ],
- },
- {
- "name": "link_imported_static_exe",
- "id": "^link_imported_static_exe::@ba7eb709d0b48779c6c8$",
- "directorySource": "^imported$",
- "projectName": "Imported",
- "type": "EXECUTABLE",
- "isGeneratorProvided": None,
- "sources": [
- {
- "path": "^empty\\.c$",
- "isGenerated": None,
- "sourceGroupName": "Source Files",
- "compileGroupLanguage": "C",
- "backtrace": [
- {
- "file": "^imported/CMakeLists\\.txt$",
- "line": 13,
- "command": "add_executable",
- "hasParent": True,
- },
- {
- "file": "^imported/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "Source Files",
- "sourcePaths": [
- "^empty\\.c$",
- ],
- },
- ],
- "compileGroups": [
- {
- "language": "C",
- "sourcePaths": [
- "^empty\\.c$",
- ],
- "includes": None,
- "defines": None,
- "compileCommandFragments": None,
- },
- ],
- "backtrace": [
- {
- "file": "^imported/CMakeLists\\.txt$",
- "line": 13,
- "command": "add_executable",
- "hasParent": True,
- },
- {
- "file": "^imported/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": "^link_imported_static_exe(\\.exe)?$",
- "artifacts": [
- {
- "path": "^imported/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?link_imported_static_exe(\\.exe)?$",
- "_dllExtra": False,
- },
- {
- "path": "^imported/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?link_imported_static_exe\\.pdb$",
- "_dllExtra": True,
- },
- ],
- "build": "^imported$",
- "source": "^imported$",
- "install": None,
- "link": {
- "language": "C",
- "lto": None,
- "commandFragments": None,
- },
- "archive": None,
- "dependencies": [
- {
- "id": "^ZERO_CHECK::@ba7eb709d0b48779c6c8$",
- "backtrace": None,
- },
- ],
- },
- {
- "name": "link_imported_object_exe",
- "id": "^link_imported_object_exe::@ba7eb709d0b48779c6c8$",
- "directorySource": "^imported$",
- "projectName": "Imported",
- "type": "EXECUTABLE",
- "isGeneratorProvided": None,
- "sources": [
- {
- "path": "^empty\\.c$",
- "isGenerated": None,
- "sourceGroupName": "Source Files",
- "compileGroupLanguage": "C",
- "backtrace": [
- {
- "file": "^imported/CMakeLists\\.txt$",
- "line": 18,
- "command": "add_executable",
- "hasParent": True,
- },
- {
- "file": "^imported/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "Source Files",
- "sourcePaths": [
- "^empty\\.c$",
- ],
- },
- ],
- "compileGroups": [
- {
- "language": "C",
- "sourcePaths": [
- "^empty\\.c$",
- ],
- "includes": None,
- "defines": None,
- "compileCommandFragments": None,
- },
- ],
- "backtrace": [
- {
- "file": "^imported/CMakeLists\\.txt$",
- "line": 18,
- "command": "add_executable",
- "hasParent": True,
- },
- {
- "file": "^imported/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": "^link_imported_object_exe(\\.exe)?$",
- "artifacts": [
- {
- "path": "^imported/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?link_imported_object_exe(\\.exe)?$",
- "_dllExtra": False,
- },
- {
- "path": "^imported/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?link_imported_object_exe\\.pdb$",
- "_dllExtra": True,
- },
- ],
- "build": "^imported$",
- "source": "^imported$",
- "install": None,
- "link": {
- "language": "C",
- "lto": None,
- "commandFragments": None,
- },
- "archive": None,
- "dependencies": [
- {
- "id": "^ZERO_CHECK::@ba7eb709d0b48779c6c8$",
- "backtrace": None,
- },
- ],
- },
- {
- "name": "link_imported_interface_exe",
- "id": "^link_imported_interface_exe::@ba7eb709d0b48779c6c8$",
- "directorySource": "^imported$",
- "projectName": "Imported",
- "type": "EXECUTABLE",
- "isGeneratorProvided": None,
- "sources": [
- {
- "path": "^empty\\.c$",
- "isGenerated": None,
- "sourceGroupName": "Source Files",
- "compileGroupLanguage": "C",
- "backtrace": [
- {
- "file": "^imported/CMakeLists\\.txt$",
- "line": 23,
- "command": "add_executable",
- "hasParent": True,
- },
- {
- "file": "^imported/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "Source Files",
- "sourcePaths": [
- "^empty\\.c$",
- ],
- },
- ],
- "compileGroups": [
- {
- "language": "C",
- "sourcePaths": [
- "^empty\\.c$",
- ],
- "includes": None,
- "defines": None,
- "compileCommandFragments": None,
- },
- ],
- "backtrace": [
- {
- "file": "^imported/CMakeLists\\.txt$",
- "line": 23,
- "command": "add_executable",
- "hasParent": True,
- },
- {
- "file": "^imported/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": "^link_imported_interface_exe(\\.exe)?$",
- "artifacts": [
- {
- "path": "^imported/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?link_imported_interface_exe(\\.exe)?$",
- "_dllExtra": False,
- },
- {
- "path": "^imported/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?link_imported_interface_exe\\.pdb$",
- "_dllExtra": True,
- },
- ],
- "build": "^imported$",
- "source": "^imported$",
- "install": None,
- "link": {
- "language": "C",
- "lto": None,
- "commandFragments": None,
- },
- "archive": None,
- "dependencies": [
- {
- "id": "^ZERO_CHECK::@ba7eb709d0b48779c6c8$",
- "backtrace": None,
- },
- ],
- },
- {
- "name": "ALL_BUILD",
- "id": "^ALL_BUILD::@c11385ffed57b860da63$",
- "directorySource": "^custom$",
- "projectName": "Custom",
- "type": "UTILITY",
- "isGeneratorProvided": True,
- "sources": [
- {
- "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/custom/CMakeFiles/ALL_BUILD$",
- "isGenerated": True,
- "sourceGroupName": "",
- "compileGroupLanguage": None,
- "backtrace": [
- {
- "file": "^custom/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- {
- "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/custom/CMakeFiles/ALL_BUILD\\.rule$",
- "isGenerated": True,
- "sourceGroupName": "CMake Rules",
- "compileGroupLanguage": None,
- "backtrace": [
- {
- "file": "^custom/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "",
- "sourcePaths": [
- "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/custom/CMakeFiles/ALL_BUILD$",
- ],
- },
- {
- "name": "CMake Rules",
- "sourcePaths": [
- "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/custom/CMakeFiles/ALL_BUILD\\.rule$",
- ],
- },
- ],
- "compileGroups": None,
- "backtrace": [
- {
- "file": "^custom/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": None,
- "artifacts": None,
- "build": "^custom$",
- "source": "^custom$",
- "install": None,
- "link": None,
- "archive": None,
- "dependencies": [
- {
- "id": "^ZERO_CHECK::@c11385ffed57b860da63$",
- "backtrace": None,
- },
- {
- "id": "^custom_exe::@c11385ffed57b860da63$",
- "backtrace": None,
- },
- ],
- },
- {
- "name": "ZERO_CHECK",
- "id": "^ZERO_CHECK::@c11385ffed57b860da63$",
- "directorySource": "^custom$",
- "projectName": "Custom",
- "type": "UTILITY",
- "isGeneratorProvided": True,
- "sources": [
- {
- "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/custom/CMakeFiles/ZERO_CHECK$",
- "isGenerated": True,
- "sourceGroupName": "",
- "compileGroupLanguage": None,
- "backtrace": [
- {
- "file": "^custom/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- {
- "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/custom/CMakeFiles/ZERO_CHECK\\.rule$",
- "isGenerated": True,
- "sourceGroupName": "CMake Rules",
- "compileGroupLanguage": None,
- "backtrace": [
- {
- "file": "^custom/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "",
- "sourcePaths": [
- "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/custom/CMakeFiles/ZERO_CHECK$",
- ],
- },
- {
- "name": "CMake Rules",
- "sourcePaths": [
- "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/custom/CMakeFiles/ZERO_CHECK\\.rule$",
- ],
- },
- ],
- "compileGroups": None,
- "backtrace": [
- {
- "file": "^custom/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": None,
- "artifacts": None,
- "build": "^custom$",
- "source": "^custom$",
- "install": None,
- "link": None,
- "archive": None,
- "dependencies": None,
- },
- {
- "name": "custom_tgt",
- "id": "^custom_tgt::@c11385ffed57b860da63$",
- "directorySource": "^custom$",
- "projectName": "Custom",
- "type": "UTILITY",
- "isGeneratorProvided": None,
- "sources": [
- {
- "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/custom/CMakeFiles/custom_tgt$",
- "isGenerated": True,
- "sourceGroupName": "",
- "compileGroupLanguage": None,
- "backtrace": [
- {
- "file": "^custom/CMakeLists\\.txt$",
- "line": 3,
- "command": "add_custom_target",
- "hasParent": True,
- },
- {
- "file": "^custom/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- {
- "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/(custom/)?CMakeFiles/([0-9a-f]+/)?custom_tgt\\.rule$",
- "isGenerated": True,
- "sourceGroupName": "CMake Rules",
- "compileGroupLanguage": None,
- "backtrace": [
- {
- "file": "^custom/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "",
- "sourcePaths": [
- "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/custom/CMakeFiles/custom_tgt$",
- ],
- },
- {
- "name": "CMake Rules",
- "sourcePaths": [
- "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/(custom/)?CMakeFiles/([0-9a-f]+/)?custom_tgt\\.rule$",
- ],
- },
- ],
- "compileGroups": None,
- "backtrace": [
- {
- "file": "^custom/CMakeLists\\.txt$",
- "line": 3,
- "command": "add_custom_target",
- "hasParent": True,
- },
- {
- "file": "^custom/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": None,
- "artifacts": None,
- "build": "^custom$",
- "source": "^custom$",
- "install": None,
- "link": None,
- "archive": None,
- "dependencies": [
- {
- "id": "^ZERO_CHECK::@c11385ffed57b860da63$",
- "backtrace": None,
- },
- ],
- },
- {
- "name": "custom_exe",
- "id": "^custom_exe::@c11385ffed57b860da63$",
- "directorySource": "^custom$",
- "projectName": "Custom",
- "type": "EXECUTABLE",
- "isGeneratorProvided": None,
- "sources": [
- {
- "path": "^empty\\.c$",
- "isGenerated": None,
- "sourceGroupName": "Source Files",
- "compileGroupLanguage": "C",
- "backtrace": [
- {
- "file": "^custom/CMakeLists\\.txt$",
- "line": 4,
- "command": "add_executable",
- "hasParent": True,
- },
- {
- "file": "^custom/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "Source Files",
- "sourcePaths": [
- "^empty\\.c$",
- ],
- },
- ],
- "compileGroups": [
- {
- "language": "C",
- "sourcePaths": [
- "^empty\\.c$",
- ],
- "includes": None,
- "defines": None,
- "compileCommandFragments": None,
- },
- ],
- "backtrace": [
- {
- "file": "^custom/CMakeLists\\.txt$",
- "line": 4,
- "command": "add_executable",
- "hasParent": True,
- },
- {
- "file": "^custom/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": "^custom_exe(\\.exe)?$",
- "artifacts": [
- {
- "path": "^custom/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?custom_exe(\\.exe)?$",
- "_dllExtra": False,
- },
- {
- "path": "^custom/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?custom_exe\\.pdb$",
- "_dllExtra": True,
- },
- ],
- "build": "^custom$",
- "source": "^custom$",
- "install": None,
- "link": {
- "language": "C",
- "lto": None,
- "commandFragments": None,
- },
- "archive": None,
- "dependencies": [
- {
- "id": "^custom_tgt::@c11385ffed57b860da63$",
- "backtrace": [
- {
- "file": "^custom/CMakeLists\\.txt$",
- "line": 5,
- "command": "add_dependencies",
- "hasParent": True,
- },
- {
- "file": "^custom/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- {
- "id": "^ZERO_CHECK::@c11385ffed57b860da63$",
- "backtrace": None,
- },
- ],
- },
- {
- "name": "ALL_BUILD",
- "id": "^ALL_BUILD::@[0-9a-f]+$",
- "directorySource": "^.*/Tests/RunCMake/FileAPIExternalSource$",
- "projectName": "External",
- "type": "UTILITY",
- "isGeneratorProvided": True,
- "sources": [
- {
- "path": "^.*/Tests/RunCMake/FileAPI/FileAPIExternalBuild/CMakeFiles/ALL_BUILD$",
- "isGenerated": True,
- "sourceGroupName": "",
- "compileGroupLanguage": None,
- "backtrace": [
- {
- "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- {
- "path": "^.*/Tests/RunCMake/FileAPI/FileAPIExternalBuild/CMakeFiles/ALL_BUILD\\.rule$",
- "isGenerated": True,
- "sourceGroupName": "CMake Rules",
- "compileGroupLanguage": None,
- "backtrace": [
- {
- "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "",
- "sourcePaths": [
- "^.*/Tests/RunCMake/FileAPI/FileAPIExternalBuild/CMakeFiles/ALL_BUILD$",
- ],
- },
- {
- "name": "CMake Rules",
- "sourcePaths": [
- "^.*/Tests/RunCMake/FileAPI/FileAPIExternalBuild/CMakeFiles/ALL_BUILD\\.rule$",
- ],
- },
- ],
- "compileGroups": None,
- "backtrace": [
- {
- "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": None,
- "artifacts": None,
- "build": "^.*/Tests/RunCMake/FileAPI/FileAPIExternalBuild$",
- "source": "^.*/Tests/RunCMake/FileAPIExternalSource$",
- "install": None,
- "link": None,
- "archive": None,
- "dependencies": [
- {
- "id": "^ZERO_CHECK::@[0-9a-f]+$",
- "backtrace": None,
- },
- {
- "id": "^generated_exe::@[0-9a-f]+$",
- "backtrace": None,
- },
- ],
- },
- {
- "name": "ZERO_CHECK",
- "id": "^ZERO_CHECK::@[0-9a-f]+$",
- "directorySource": "^.*/Tests/RunCMake/FileAPIExternalSource$",
- "projectName": "External",
- "type": "UTILITY",
- "isGeneratorProvided": True,
- "sources": [
- {
- "path": "^.*/Tests/RunCMake/FileAPI/FileAPIExternalBuild/CMakeFiles/ZERO_CHECK$",
- "isGenerated": True,
- "sourceGroupName": "",
- "compileGroupLanguage": None,
- "backtrace": [
- {
- "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- {
- "path": "^.*/Tests/RunCMake/FileAPI/FileAPIExternalBuild/CMakeFiles/ZERO_CHECK\\.rule$",
- "isGenerated": True,
- "sourceGroupName": "CMake Rules",
- "compileGroupLanguage": None,
- "backtrace": [
- {
- "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "",
- "sourcePaths": [
- "^.*/Tests/RunCMake/FileAPI/FileAPIExternalBuild/CMakeFiles/ZERO_CHECK$",
- ],
- },
- {
- "name": "CMake Rules",
- "sourcePaths": [
- "^.*/Tests/RunCMake/FileAPI/FileAPIExternalBuild/CMakeFiles/ZERO_CHECK\\.rule$",
- ],
- },
- ],
- "compileGroups": None,
- "backtrace": [
- {
- "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": None,
- "artifacts": None,
- "build": "^.*/Tests/RunCMake/FileAPI/FileAPIExternalBuild$",
- "source": "^.*/Tests/RunCMake/FileAPIExternalSource$",
- "install": None,
- "link": None,
- "archive": None,
- "dependencies": None,
- },
- {
- "name": "generated_exe",
- "id": "^generated_exe::@[0-9a-f]+$",
- "directorySource": "^.*/Tests/RunCMake/FileAPIExternalSource$",
- "projectName": "External",
- "type": "EXECUTABLE",
- "isGeneratorProvided": None,
- "sources": [
- {
- "path": "^.*/Tests/RunCMake/FileAPIExternalSource/empty\\.c$",
- "isGenerated": None,
- "sourceGroupName": "Source Files",
- "compileGroupLanguage": "C",
- "backtrace": [
- {
- "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
- "line": 5,
- "command": "add_executable",
- "hasParent": True,
- },
- {
- "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- {
- "path": "^.*/Tests/RunCMake/FileAPI/FileAPIExternalBuild/generated\\.cxx$",
- "isGenerated": True,
- "sourceGroupName": "Generated Source Files",
- "compileGroupLanguage": "CXX",
- "backtrace": [
- {
- "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
- "line": 6,
- "command": "target_sources",
- "hasParent": True,
- },
- {
- "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "sourceGroups": [
- {
- "name": "Source Files",
- "sourcePaths": [
- "^.*/Tests/RunCMake/FileAPIExternalSource/empty\\.c$",
- ],
- },
- {
- "name": "Generated Source Files",
- "sourcePaths": [
- "^.*/Tests/RunCMake/FileAPI/FileAPIExternalBuild/generated\\.cxx$",
- ],
- },
- ],
- "compileGroups": [
- {
- "language": "C",
- "sourcePaths": [
- "^.*/Tests/RunCMake/FileAPIExternalSource/empty\\.c$",
- ],
- "includes": [
- {
- "path": "^.*/Tests/RunCMake/FileAPI/FileAPIExternalBuild$",
- "isSystem": None,
- "backtrace": [
- {
- "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
- "line": 10,
- "command": "set_property",
- "hasParent": True,
- },
- {
- "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- {
- "path": "^.*/Tests/RunCMake/FileAPIExternalSource$",
- "isSystem": True,
- "backtrace": [
- {
- "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
- "line": 11,
- "command": "target_include_directories",
- "hasParent": True,
- },
- {
- "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "defines": [
- {
- "define": "EMPTY_C=1",
- "backtrace": [
- {
- "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
- "line": 9,
- "command": "set_property",
- "hasParent": True,
- },
- {
- "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- {
- "define": "SRC_DUMMY",
- "backtrace": [
- {
- "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
- "line": 9,
- "command": "set_property",
- "hasParent": True,
- },
- {
- "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- {
- "define": "GENERATED_EXE=1",
- "backtrace": [
- {
- "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
- "line": 12,
- "command": "target_compile_definitions",
- "hasParent": True,
- },
- {
- "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- {
- "define": "TGT_DUMMY",
- "backtrace": [
- {
- "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
- "line": 12,
- "command": "target_compile_definitions",
- "hasParent": True,
- },
- {
- "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "compileCommandFragments": [
- {
- "fragment" : "SRC_COMPILE_OPTIONS_DUMMY",
- "backtrace": [
- {
- "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
- "line": 13,
- "command": "set_source_files_properties",
- "hasParent": True,
- },
- {
- "file" : "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- }
- ],
- },
- {
- "language": "CXX",
- "sourcePaths": [
- "^.*/Tests/RunCMake/FileAPI/FileAPIExternalBuild/generated\\.cxx$",
- ],
- "includes": [
- {
- "path": "^.*/Tests/RunCMake/FileAPIExternalSource$",
- "isSystem": True,
- "backtrace": [
- {
- "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
- "line": 11,
- "command": "target_include_directories",
- "hasParent": True,
- },
- {
- "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "defines": [
- {
- "define": "GENERATED_EXE=1",
- "backtrace": [
- {
- "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
- "line": 12,
- "command": "target_compile_definitions",
- "hasParent": True,
- },
- {
- "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- {
- "define": "TGT_DUMMY",
- "backtrace": [
- {
- "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
- "line": 12,
- "command": "target_compile_definitions",
- "hasParent": True,
- },
- {
- "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- },
- ],
- "compileCommandFragments": None,
- },
- ],
- "backtrace": [
- {
- "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
- "line": 5,
- "command": "add_executable",
- "hasParent": True,
- },
- {
- "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
- "line": None,
- "command": None,
- "hasParent": False,
- },
- ],
- "folder": None,
- "nameOnDisk": "^generated_exe(\\.exe)?$",
- "artifacts": [
- {
- "path": "^.*/Tests/RunCMake/FileAPI/FileAPIExternalBuild/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?generated_exe(\\.exe)?$",
- "_dllExtra": False,
- },
- {
- "path": "^.*/Tests/RunCMake/FileAPI/FileAPIExternalBuild/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?generated_exe\\.pdb$",
- "_dllExtra": True,
- },
- ],
- "build": "^.*/Tests/RunCMake/FileAPI/FileAPIExternalBuild$",
- "source": "^.*/Tests/RunCMake/FileAPIExternalSource$",
- "install": None,
- "link": {
- "language": "CXX",
- "lto": None,
- "commandFragments": None,
- },
- "archive": None,
- "dependencies": [
- {
- "id": "^ZERO_CHECK::@[0-9a-f]+$",
- "backtrace": None,
- },
- ],
- },
+ read_codemodel_json_data("targets/all_build_top.json"),
+ read_codemodel_json_data("targets/zero_check_top.json"),
+ read_codemodel_json_data("targets/interface_exe.json"),
+ read_codemodel_json_data("targets/c_lib.json"),
+ read_codemodel_json_data("targets/c_exe.json"),
+ read_codemodel_json_data("targets/c_shared_lib.json"),
+ read_codemodel_json_data("targets/c_shared_exe.json"),
+ read_codemodel_json_data("targets/c_static_lib.json"),
+ read_codemodel_json_data("targets/c_static_exe.json"),
+
+ read_codemodel_json_data("targets/all_build_cxx.json"),
+ read_codemodel_json_data("targets/zero_check_cxx.json"),
+ read_codemodel_json_data("targets/cxx_lib.json"),
+ read_codemodel_json_data("targets/cxx_exe.json"),
+ read_codemodel_json_data("targets/cxx_shared_lib.json"),
+ read_codemodel_json_data("targets/cxx_shared_exe.json"),
+ read_codemodel_json_data("targets/cxx_static_lib.json"),
+ read_codemodel_json_data("targets/cxx_static_exe.json"),
+
+ read_codemodel_json_data("targets/all_build_alias.json"),
+ read_codemodel_json_data("targets/zero_check_alias.json"),
+ read_codemodel_json_data("targets/c_alias_exe.json"),
+ read_codemodel_json_data("targets/cxx_alias_exe.json"),
+
+ read_codemodel_json_data("targets/all_build_object.json"),
+ read_codemodel_json_data("targets/zero_check_object.json"),
+ read_codemodel_json_data("targets/c_object_lib.json"),
+ read_codemodel_json_data("targets/c_object_exe.json"),
+ read_codemodel_json_data("targets/cxx_object_lib.json"),
+ read_codemodel_json_data("targets/cxx_object_exe.json"),
+
+ read_codemodel_json_data("targets/all_build_imported.json"),
+ read_codemodel_json_data("targets/zero_check_imported.json"),
+ read_codemodel_json_data("targets/link_imported_exe.json"),
+ read_codemodel_json_data("targets/link_imported_shared_exe.json"),
+ read_codemodel_json_data("targets/link_imported_static_exe.json"),
+ read_codemodel_json_data("targets/link_imported_object_exe.json"),
+ read_codemodel_json_data("targets/link_imported_interface_exe.json"),
+
+ read_codemodel_json_data("targets/all_build_custom.json"),
+ read_codemodel_json_data("targets/zero_check_custom.json"),
+ read_codemodel_json_data("targets/custom_tgt.json"),
+ read_codemodel_json_data("targets/custom_exe.json"),
+ read_codemodel_json_data("targets/all_build_external.json"),
+ read_codemodel_json_data("targets/zero_check_external.json"),
+ read_codemodel_json_data("targets/generated_exe.json"),
]
if not os.path.exists(os.path.join(reply_dir, "..", "..", "..", "..", "ipo_enabled.txt")):
@@ -5164,126 +655,13 @@ def check_targets(c, g, inSource):
def gen_check_projects(c, g):
expected = [
- {
- "name": "codemodel-v2",
- "parentName": None,
- "childNames": [
- "Alias",
- "Custom",
- "Cxx",
- "Imported",
- "Object",
- "External",
- ],
- "directorySources": [
- "^\\.$",
- "^dir$",
- "^dir/dir$",
- ],
- "targetIds": [
- "^ALL_BUILD::@6890427a1f51a3e7e1df$",
- "^ZERO_CHECK::@6890427a1f51a3e7e1df$",
- "^interface_exe::@6890427a1f51a3e7e1df$",
- "^c_lib::@6890427a1f51a3e7e1df$",
- "^c_exe::@6890427a1f51a3e7e1df$",
- "^c_shared_lib::@6890427a1f51a3e7e1df$",
- "^c_shared_exe::@6890427a1f51a3e7e1df$",
- "^c_static_lib::@6890427a1f51a3e7e1df$",
- "^c_static_exe::@6890427a1f51a3e7e1df$",
- ],
- },
- {
- "name": "Cxx",
- "parentName": "codemodel-v2",
- "childNames": None,
- "directorySources": [
- "^cxx$",
- ],
- "targetIds": [
- "^ALL_BUILD::@a56b12a3f5c0529fb296$",
- "^ZERO_CHECK::@a56b12a3f5c0529fb296$",
- "^cxx_lib::@a56b12a3f5c0529fb296$",
- "^cxx_exe::@a56b12a3f5c0529fb296$",
- "^cxx_shared_lib::@a56b12a3f5c0529fb296$",
- "^cxx_shared_exe::@a56b12a3f5c0529fb296$",
- "^cxx_static_lib::@a56b12a3f5c0529fb296$",
- "^cxx_static_exe::@a56b12a3f5c0529fb296$",
- ],
- },
- {
- "name": "Alias",
- "parentName": "codemodel-v2",
- "childNames": None,
- "directorySources": [
- "^alias$",
- ],
- "targetIds": [
- "^ALL_BUILD::@53632cba2752272bb008$",
- "^ZERO_CHECK::@53632cba2752272bb008$",
- "^c_alias_exe::@53632cba2752272bb008$",
- "^cxx_alias_exe::@53632cba2752272bb008$",
- ],
- },
- {
- "name": "Object",
- "parentName": "codemodel-v2",
- "childNames": None,
- "directorySources": [
- "^object$",
- ],
- "targetIds": [
- "^ALL_BUILD::@5ed5358f70faf8d8af7a$",
- "^ZERO_CHECK::@5ed5358f70faf8d8af7a$",
- "^c_object_lib::@5ed5358f70faf8d8af7a$",
- "^c_object_exe::@5ed5358f70faf8d8af7a$",
- "^cxx_object_lib::@5ed5358f70faf8d8af7a$",
- "^cxx_object_exe::@5ed5358f70faf8d8af7a$",
- ],
- },
- {
- "name": "Imported",
- "parentName": "codemodel-v2",
- "childNames": None,
- "directorySources": [
- "^imported$",
- ],
- "targetIds": [
- "^ALL_BUILD::@ba7eb709d0b48779c6c8$",
- "^ZERO_CHECK::@ba7eb709d0b48779c6c8$",
- "^link_imported_exe::@ba7eb709d0b48779c6c8$",
- "^link_imported_shared_exe::@ba7eb709d0b48779c6c8$",
- "^link_imported_static_exe::@ba7eb709d0b48779c6c8$",
- "^link_imported_object_exe::@ba7eb709d0b48779c6c8$",
- "^link_imported_interface_exe::@ba7eb709d0b48779c6c8$",
- ],
- },
- {
- "name": "Custom",
- "parentName": "codemodel-v2",
- "childNames": None,
- "directorySources": [
- "^custom$",
- ],
- "targetIds": [
- "^ALL_BUILD::@c11385ffed57b860da63$",
- "^ZERO_CHECK::@c11385ffed57b860da63$",
- "^custom_tgt::@c11385ffed57b860da63$",
- "^custom_exe::@c11385ffed57b860da63$",
- ],
- },
- {
- "name": "External",
- "parentName": "codemodel-v2",
- "childNames": None,
- "directorySources": [
- "^.*/Tests/RunCMake/FileAPIExternalSource$",
- ],
- "targetIds": [
- "^ALL_BUILD::@[0-9a-f]+$",
- "^ZERO_CHECK::@[0-9a-f]+$",
- "^generated_exe::@[0-9a-f]+$",
- ],
- },
+ read_codemodel_json_data("projects/codemodel-v2.json"),
+ read_codemodel_json_data("projects/cxx.json"),
+ read_codemodel_json_data("projects/alias.json"),
+ read_codemodel_json_data("projects/object.json"),
+ read_codemodel_json_data("projects/imported.json"),
+ read_codemodel_json_data("projects/custom.json"),
+ read_codemodel_json_data("projects/external.json"),
]
if matches(g["name"], "^Visual Studio "):
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/directories/alias.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/directories/alias.json
new file mode 100644
index 0000000..9f0c48a
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/directories/alias.json
@@ -0,0 +1,15 @@
+{
+ "source": "^alias$",
+ "build": "^alias$",
+ "parentSource": "^\\.$",
+ "childSources": null,
+ "targetIds": [
+ "^ALL_BUILD::@53632cba2752272bb008$",
+ "^ZERO_CHECK::@53632cba2752272bb008$",
+ "^c_alias_exe::@53632cba2752272bb008$",
+ "^cxx_alias_exe::@53632cba2752272bb008$"
+ ],
+ "projectName": "Alias",
+ "minimumCMakeVersion": "3.12",
+ "hasInstallRule": null
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/directories/custom.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/directories/custom.json
new file mode 100644
index 0000000..afd41f3
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/directories/custom.json
@@ -0,0 +1,15 @@
+{
+ "source": "^custom$",
+ "build": "^custom$",
+ "parentSource": "^\\.$",
+ "childSources": null,
+ "targetIds": [
+ "^ALL_BUILD::@c11385ffed57b860da63$",
+ "^ZERO_CHECK::@c11385ffed57b860da63$",
+ "^custom_exe::@c11385ffed57b860da63$",
+ "^custom_tgt::@c11385ffed57b860da63$"
+ ],
+ "projectName": "Custom",
+ "minimumCMakeVersion": "3.12",
+ "hasInstallRule": null
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/directories/cxx.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/directories/cxx.json
new file mode 100644
index 0000000..ebe717a
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/directories/cxx.json
@@ -0,0 +1,19 @@
+{
+ "source": "^cxx$",
+ "build": "^cxx$",
+ "parentSource": "^\\.$",
+ "childSources": null,
+ "targetIds": [
+ "^ALL_BUILD::@a56b12a3f5c0529fb296$",
+ "^ZERO_CHECK::@a56b12a3f5c0529fb296$",
+ "^cxx_exe::@a56b12a3f5c0529fb296$",
+ "^cxx_lib::@a56b12a3f5c0529fb296$",
+ "^cxx_shared_exe::@a56b12a3f5c0529fb296$",
+ "^cxx_shared_lib::@a56b12a3f5c0529fb296$",
+ "^cxx_static_exe::@a56b12a3f5c0529fb296$",
+ "^cxx_static_lib::@a56b12a3f5c0529fb296$"
+ ],
+ "projectName": "Cxx",
+ "minimumCMakeVersion": "3.12",
+ "hasInstallRule": null
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/directories/dir.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/directories/dir.json
new file mode 100644
index 0000000..afbd43a
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/directories/dir.json
@@ -0,0 +1,12 @@
+{
+ "source": "^dir$",
+ "build": "^dir$",
+ "parentSource": "^\\.$",
+ "childSources": [
+ "^dir/dir$"
+ ],
+ "targetIds": null,
+ "projectName": "codemodel-v2",
+ "minimumCMakeVersion": "3.12",
+ "hasInstallRule": null
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/directories/dir_dir.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/directories/dir_dir.json
new file mode 100644
index 0000000..3737ad5
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/directories/dir_dir.json
@@ -0,0 +1,10 @@
+{
+ "source": "^dir/dir$",
+ "build": "^dir/dir$",
+ "parentSource": "^dir$",
+ "childSources": null,
+ "targetIds": null,
+ "projectName": "codemodel-v2",
+ "minimumCMakeVersion": "3.12",
+ "hasInstallRule": null
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/directories/external.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/directories/external.json
new file mode 100644
index 0000000..521e3c7
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/directories/external.json
@@ -0,0 +1,14 @@
+{
+ "source": "^.*/Tests/RunCMake/FileAPIExternalSource$",
+ "build": "^.*/Tests/RunCMake/FileAPI/FileAPIExternalBuild$",
+ "parentSource": "^\\.$",
+ "childSources": null,
+ "targetIds": [
+ "^ALL_BUILD::@[0-9a-f]+$",
+ "^ZERO_CHECK::@[0-9a-f]+$",
+ "^generated_exe::@[0-9a-f]+$"
+ ],
+ "projectName": "External",
+ "minimumCMakeVersion": "3.12",
+ "hasInstallRule": null
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/directories/imported.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/directories/imported.json
new file mode 100644
index 0000000..a41b79b
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/directories/imported.json
@@ -0,0 +1,18 @@
+{
+ "source": "^imported$",
+ "build": "^imported$",
+ "parentSource": "^\\.$",
+ "childSources": null,
+ "targetIds": [
+ "^ALL_BUILD::@ba7eb709d0b48779c6c8$",
+ "^ZERO_CHECK::@ba7eb709d0b48779c6c8$",
+ "^link_imported_exe::@ba7eb709d0b48779c6c8$",
+ "^link_imported_interface_exe::@ba7eb709d0b48779c6c8$",
+ "^link_imported_object_exe::@ba7eb709d0b48779c6c8$",
+ "^link_imported_shared_exe::@ba7eb709d0b48779c6c8$",
+ "^link_imported_static_exe::@ba7eb709d0b48779c6c8$"
+ ],
+ "projectName": "Imported",
+ "minimumCMakeVersion": "3.12",
+ "hasInstallRule": null
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/directories/object.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/directories/object.json
new file mode 100644
index 0000000..1e647ad
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/directories/object.json
@@ -0,0 +1,17 @@
+{
+ "source": "^object$",
+ "build": "^object$",
+ "parentSource": "^\\.$",
+ "childSources": null,
+ "targetIds": [
+ "^ALL_BUILD::@5ed5358f70faf8d8af7a$",
+ "^ZERO_CHECK::@5ed5358f70faf8d8af7a$",
+ "^c_object_exe::@5ed5358f70faf8d8af7a$",
+ "^c_object_lib::@5ed5358f70faf8d8af7a$",
+ "^cxx_object_exe::@5ed5358f70faf8d8af7a$",
+ "^cxx_object_lib::@5ed5358f70faf8d8af7a$"
+ ],
+ "projectName": "Object",
+ "minimumCMakeVersion": "3.13",
+ "hasInstallRule": true
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/directories/top.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/directories/top.json
new file mode 100644
index 0000000..c144953
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/directories/top.json
@@ -0,0 +1,28 @@
+{
+ "source": "^\\.$",
+ "build": "^\\.$",
+ "parentSource": null,
+ "childSources": [
+ "^alias$",
+ "^custom$",
+ "^cxx$",
+ "^imported$",
+ "^object$",
+ "^.*/Tests/RunCMake/FileAPIExternalSource$",
+ "^dir$"
+ ],
+ "targetIds": [
+ "^ALL_BUILD::@6890427a1f51a3e7e1df$",
+ "^ZERO_CHECK::@6890427a1f51a3e7e1df$",
+ "^c_exe::@6890427a1f51a3e7e1df$",
+ "^c_lib::@6890427a1f51a3e7e1df$",
+ "^c_shared_exe::@6890427a1f51a3e7e1df$",
+ "^c_shared_lib::@6890427a1f51a3e7e1df$",
+ "^c_static_exe::@6890427a1f51a3e7e1df$",
+ "^c_static_lib::@6890427a1f51a3e7e1df$",
+ "^interface_exe::@6890427a1f51a3e7e1df$"
+ ],
+ "projectName": "codemodel-v2",
+ "minimumCMakeVersion": "3.12",
+ "hasInstallRule": true
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/projects/alias.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/projects/alias.json
new file mode 100644
index 0000000..8ede60f
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/projects/alias.json
@@ -0,0 +1,14 @@
+{
+ "name": "Alias",
+ "parentName": "codemodel-v2",
+ "childNames": null,
+ "directorySources": [
+ "^alias$"
+ ],
+ "targetIds": [
+ "^ALL_BUILD::@53632cba2752272bb008$",
+ "^ZERO_CHECK::@53632cba2752272bb008$",
+ "^c_alias_exe::@53632cba2752272bb008$",
+ "^cxx_alias_exe::@53632cba2752272bb008$"
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/projects/codemodel-v2.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/projects/codemodel-v2.json
new file mode 100644
index 0000000..f3aac63
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/projects/codemodel-v2.json
@@ -0,0 +1,28 @@
+{
+ "name": "codemodel-v2",
+ "parentName": null,
+ "childNames": [
+ "Alias",
+ "Custom",
+ "Cxx",
+ "Imported",
+ "Object",
+ "External"
+ ],
+ "directorySources": [
+ "^\\.$",
+ "^dir$",
+ "^dir/dir$"
+ ],
+ "targetIds": [
+ "^ALL_BUILD::@6890427a1f51a3e7e1df$",
+ "^ZERO_CHECK::@6890427a1f51a3e7e1df$",
+ "^interface_exe::@6890427a1f51a3e7e1df$",
+ "^c_lib::@6890427a1f51a3e7e1df$",
+ "^c_exe::@6890427a1f51a3e7e1df$",
+ "^c_shared_lib::@6890427a1f51a3e7e1df$",
+ "^c_shared_exe::@6890427a1f51a3e7e1df$",
+ "^c_static_lib::@6890427a1f51a3e7e1df$",
+ "^c_static_exe::@6890427a1f51a3e7e1df$"
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/projects/custom.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/projects/custom.json
new file mode 100644
index 0000000..0aeb727
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/projects/custom.json
@@ -0,0 +1,14 @@
+{
+ "name": "Custom",
+ "parentName": "codemodel-v2",
+ "childNames": null,
+ "directorySources": [
+ "^custom$"
+ ],
+ "targetIds": [
+ "^ALL_BUILD::@c11385ffed57b860da63$",
+ "^ZERO_CHECK::@c11385ffed57b860da63$",
+ "^custom_tgt::@c11385ffed57b860da63$",
+ "^custom_exe::@c11385ffed57b860da63$"
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/projects/cxx.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/projects/cxx.json
new file mode 100644
index 0000000..296ae6c
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/projects/cxx.json
@@ -0,0 +1,18 @@
+{
+ "name": "Cxx",
+ "parentName": "codemodel-v2",
+ "childNames": null,
+ "directorySources": [
+ "^cxx$"
+ ],
+ "targetIds": [
+ "^ALL_BUILD::@a56b12a3f5c0529fb296$",
+ "^ZERO_CHECK::@a56b12a3f5c0529fb296$",
+ "^cxx_lib::@a56b12a3f5c0529fb296$",
+ "^cxx_exe::@a56b12a3f5c0529fb296$",
+ "^cxx_shared_lib::@a56b12a3f5c0529fb296$",
+ "^cxx_shared_exe::@a56b12a3f5c0529fb296$",
+ "^cxx_static_lib::@a56b12a3f5c0529fb296$",
+ "^cxx_static_exe::@a56b12a3f5c0529fb296$"
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/projects/external.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/projects/external.json
new file mode 100644
index 0000000..3c9afff
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/projects/external.json
@@ -0,0 +1,13 @@
+{
+ "name": "External",
+ "parentName": "codemodel-v2",
+ "childNames": null,
+ "directorySources": [
+ "^.*/Tests/RunCMake/FileAPIExternalSource$"
+ ],
+ "targetIds": [
+ "^ALL_BUILD::@[0-9a-f]+$",
+ "^ZERO_CHECK::@[0-9a-f]+$",
+ "^generated_exe::@[0-9a-f]+$"
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/projects/imported.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/projects/imported.json
new file mode 100644
index 0000000..dc40b72
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/projects/imported.json
@@ -0,0 +1,17 @@
+{
+ "name": "Imported",
+ "parentName": "codemodel-v2",
+ "childNames": null,
+ "directorySources": [
+ "^imported$"
+ ],
+ "targetIds": [
+ "^ALL_BUILD::@ba7eb709d0b48779c6c8$",
+ "^ZERO_CHECK::@ba7eb709d0b48779c6c8$",
+ "^link_imported_exe::@ba7eb709d0b48779c6c8$",
+ "^link_imported_shared_exe::@ba7eb709d0b48779c6c8$",
+ "^link_imported_static_exe::@ba7eb709d0b48779c6c8$",
+ "^link_imported_object_exe::@ba7eb709d0b48779c6c8$",
+ "^link_imported_interface_exe::@ba7eb709d0b48779c6c8$"
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/projects/object.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/projects/object.json
new file mode 100644
index 0000000..219f4eb
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/projects/object.json
@@ -0,0 +1,16 @@
+{
+ "name": "Object",
+ "parentName": "codemodel-v2",
+ "childNames": null,
+ "directorySources": [
+ "^object$"
+ ],
+ "targetIds": [
+ "^ALL_BUILD::@5ed5358f70faf8d8af7a$",
+ "^ZERO_CHECK::@5ed5358f70faf8d8af7a$",
+ "^c_object_lib::@5ed5358f70faf8d8af7a$",
+ "^c_object_exe::@5ed5358f70faf8d8af7a$",
+ "^cxx_object_lib::@5ed5358f70faf8d8af7a$",
+ "^cxx_object_exe::@5ed5358f70faf8d8af7a$"
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/all_build_alias.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/all_build_alias.json
new file mode 100644
index 0000000..eabf739
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/all_build_alias.json
@@ -0,0 +1,83 @@
+{
+ "name": "ALL_BUILD",
+ "id": "^ALL_BUILD::@53632cba2752272bb008$",
+ "directorySource": "^alias$",
+ "projectName": "Alias",
+ "type": "UTILITY",
+ "isGeneratorProvided": true,
+ "sources": [
+ {
+ "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/alias/CMakeFiles/ALL_BUILD$",
+ "isGenerated": true,
+ "sourceGroupName": "",
+ "compileGroupLanguage": null,
+ "backtrace": [
+ {
+ "file": "^alias/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ },
+ {
+ "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/alias/CMakeFiles/ALL_BUILD\\.rule$",
+ "isGenerated": true,
+ "sourceGroupName": "CMake Rules",
+ "compileGroupLanguage": null,
+ "backtrace": [
+ {
+ "file": "^alias/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "",
+ "sourcePaths": [
+ "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/alias/CMakeFiles/ALL_BUILD$"
+ ]
+ },
+ {
+ "name": "CMake Rules",
+ "sourcePaths": [
+ "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/alias/CMakeFiles/ALL_BUILD\\.rule$"
+ ]
+ }
+ ],
+ "compileGroups": null,
+ "backtrace": [
+ {
+ "file": "^alias/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": null,
+ "artifacts": null,
+ "build": "^alias$",
+ "source": "^alias$",
+ "install": null,
+ "link": null,
+ "archive": null,
+ "dependencies": [
+ {
+ "id": "^ZERO_CHECK::@53632cba2752272bb008$",
+ "backtrace": null
+ },
+ {
+ "id": "^c_alias_exe::@53632cba2752272bb008$",
+ "backtrace": null
+ },
+ {
+ "id": "^cxx_alias_exe::@53632cba2752272bb008$",
+ "backtrace": null
+ }
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/all_build_custom.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/all_build_custom.json
new file mode 100644
index 0000000..a5ff686
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/all_build_custom.json
@@ -0,0 +1,79 @@
+{
+ "name": "ALL_BUILD",
+ "id": "^ALL_BUILD::@c11385ffed57b860da63$",
+ "directorySource": "^custom$",
+ "projectName": "Custom",
+ "type": "UTILITY",
+ "isGeneratorProvided": true,
+ "sources": [
+ {
+ "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/custom/CMakeFiles/ALL_BUILD$",
+ "isGenerated": true,
+ "sourceGroupName": "",
+ "compileGroupLanguage": null,
+ "backtrace": [
+ {
+ "file": "^custom/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ },
+ {
+ "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/custom/CMakeFiles/ALL_BUILD\\.rule$",
+ "isGenerated": true,
+ "sourceGroupName": "CMake Rules",
+ "compileGroupLanguage": null,
+ "backtrace": [
+ {
+ "file": "^custom/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "",
+ "sourcePaths": [
+ "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/custom/CMakeFiles/ALL_BUILD$"
+ ]
+ },
+ {
+ "name": "CMake Rules",
+ "sourcePaths": [
+ "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/custom/CMakeFiles/ALL_BUILD\\.rule$"
+ ]
+ }
+ ],
+ "compileGroups": null,
+ "backtrace": [
+ {
+ "file": "^custom/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": null,
+ "artifacts": null,
+ "build": "^custom$",
+ "source": "^custom$",
+ "install": null,
+ "link": null,
+ "archive": null,
+ "dependencies": [
+ {
+ "id": "^ZERO_CHECK::@c11385ffed57b860da63$",
+ "backtrace": null
+ },
+ {
+ "id": "^custom_exe::@c11385ffed57b860da63$",
+ "backtrace": null
+ }
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/all_build_cxx.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/all_build_cxx.json
new file mode 100644
index 0000000..92a7944
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/all_build_cxx.json
@@ -0,0 +1,99 @@
+{
+ "name": "ALL_BUILD",
+ "id": "^ALL_BUILD::@a56b12a3f5c0529fb296$",
+ "directorySource": "^cxx$",
+ "projectName": "Cxx",
+ "type": "UTILITY",
+ "isGeneratorProvided": true,
+ "sources": [
+ {
+ "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/cxx/CMakeFiles/ALL_BUILD$",
+ "isGenerated": true,
+ "sourceGroupName": "",
+ "compileGroupLanguage": null,
+ "backtrace": [
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ },
+ {
+ "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/cxx/CMakeFiles/ALL_BUILD\\.rule$",
+ "isGenerated": true,
+ "sourceGroupName": "CMake Rules",
+ "compileGroupLanguage": null,
+ "backtrace": [
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "",
+ "sourcePaths": [
+ "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/cxx/CMakeFiles/ALL_BUILD$"
+ ]
+ },
+ {
+ "name": "CMake Rules",
+ "sourcePaths": [
+ "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/cxx/CMakeFiles/ALL_BUILD\\.rule$"
+ ]
+ }
+ ],
+ "compileGroups": null,
+ "backtrace": [
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": null,
+ "artifacts": null,
+ "build": "^cxx$",
+ "source": "^cxx$",
+ "install": null,
+ "link": null,
+ "archive": null,
+ "dependencies": [
+ {
+ "id": "^ZERO_CHECK::@a56b12a3f5c0529fb296$",
+ "backtrace": null
+ },
+ {
+ "id": "^cxx_lib::@a56b12a3f5c0529fb296$",
+ "backtrace": null
+ },
+ {
+ "id": "^cxx_exe::@a56b12a3f5c0529fb296$",
+ "backtrace": null
+ },
+ {
+ "id": "^cxx_shared_lib::@a56b12a3f5c0529fb296$",
+ "backtrace": null
+ },
+ {
+ "id": "^cxx_shared_exe::@a56b12a3f5c0529fb296$",
+ "backtrace": null
+ },
+ {
+ "id": "^cxx_static_lib::@a56b12a3f5c0529fb296$",
+ "backtrace": null
+ },
+ {
+ "id": "^cxx_static_exe::@a56b12a3f5c0529fb296$",
+ "backtrace": null
+ }
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/all_build_external.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/all_build_external.json
new file mode 100644
index 0000000..017335c
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/all_build_external.json
@@ -0,0 +1,79 @@
+{
+ "name": "ALL_BUILD",
+ "id": "^ALL_BUILD::@[0-9a-f]+$",
+ "directorySource": "^.*/Tests/RunCMake/FileAPIExternalSource$",
+ "projectName": "External",
+ "type": "UTILITY",
+ "isGeneratorProvided": true,
+ "sources": [
+ {
+ "path": "^.*/Tests/RunCMake/FileAPI/FileAPIExternalBuild/CMakeFiles/ALL_BUILD$",
+ "isGenerated": true,
+ "sourceGroupName": "",
+ "compileGroupLanguage": null,
+ "backtrace": [
+ {
+ "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ },
+ {
+ "path": "^.*/Tests/RunCMake/FileAPI/FileAPIExternalBuild/CMakeFiles/ALL_BUILD\\.rule$",
+ "isGenerated": true,
+ "sourceGroupName": "CMake Rules",
+ "compileGroupLanguage": null,
+ "backtrace": [
+ {
+ "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "",
+ "sourcePaths": [
+ "^.*/Tests/RunCMake/FileAPI/FileAPIExternalBuild/CMakeFiles/ALL_BUILD$"
+ ]
+ },
+ {
+ "name": "CMake Rules",
+ "sourcePaths": [
+ "^.*/Tests/RunCMake/FileAPI/FileAPIExternalBuild/CMakeFiles/ALL_BUILD\\.rule$"
+ ]
+ }
+ ],
+ "compileGroups": null,
+ "backtrace": [
+ {
+ "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": null,
+ "artifacts": null,
+ "build": "^.*/Tests/RunCMake/FileAPI/FileAPIExternalBuild$",
+ "source": "^.*/Tests/RunCMake/FileAPIExternalSource$",
+ "install": null,
+ "link": null,
+ "archive": null,
+ "dependencies": [
+ {
+ "id": "^ZERO_CHECK::@[0-9a-f]+$",
+ "backtrace": null
+ },
+ {
+ "id": "^generated_exe::@[0-9a-f]+$",
+ "backtrace": null
+ }
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/all_build_imported.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/all_build_imported.json
new file mode 100644
index 0000000..2de5b15
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/all_build_imported.json
@@ -0,0 +1,95 @@
+{
+ "name": "ALL_BUILD",
+ "id": "^ALL_BUILD::@ba7eb709d0b48779c6c8$",
+ "directorySource": "^imported$",
+ "projectName": "Imported",
+ "type": "UTILITY",
+ "isGeneratorProvided": true,
+ "sources": [
+ {
+ "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/imported/CMakeFiles/ALL_BUILD$",
+ "isGenerated": true,
+ "sourceGroupName": "",
+ "compileGroupLanguage": null,
+ "backtrace": [
+ {
+ "file": "^imported/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ },
+ {
+ "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/imported/CMakeFiles/ALL_BUILD\\.rule$",
+ "isGenerated": true,
+ "sourceGroupName": "CMake Rules",
+ "compileGroupLanguage": null,
+ "backtrace": [
+ {
+ "file": "^imported/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "",
+ "sourcePaths": [
+ "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/imported/CMakeFiles/ALL_BUILD$"
+ ]
+ },
+ {
+ "name": "CMake Rules",
+ "sourcePaths": [
+ "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/imported/CMakeFiles/ALL_BUILD\\.rule$"
+ ]
+ }
+ ],
+ "compileGroups": null,
+ "backtrace": [
+ {
+ "file": "^imported/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": null,
+ "artifacts": null,
+ "build": "^imported$",
+ "source": "^imported$",
+ "install": null,
+ "link": null,
+ "archive": null,
+ "dependencies": [
+ {
+ "id": "^ZERO_CHECK::@ba7eb709d0b48779c6c8$",
+ "backtrace": null
+ },
+ {
+ "id": "^link_imported_exe::@ba7eb709d0b48779c6c8$",
+ "backtrace": null
+ },
+ {
+ "id": "^link_imported_shared_exe::@ba7eb709d0b48779c6c8$",
+ "backtrace": null
+ },
+ {
+ "id": "^link_imported_static_exe::@ba7eb709d0b48779c6c8$",
+ "backtrace": null
+ },
+ {
+ "id": "^link_imported_object_exe::@ba7eb709d0b48779c6c8$",
+ "backtrace": null
+ },
+ {
+ "id": "^link_imported_interface_exe::@ba7eb709d0b48779c6c8$",
+ "backtrace": null
+ }
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/all_build_object.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/all_build_object.json
new file mode 100644
index 0000000..9d8899a
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/all_build_object.json
@@ -0,0 +1,91 @@
+{
+ "name": "ALL_BUILD",
+ "id": "^ALL_BUILD::@5ed5358f70faf8d8af7a$",
+ "directorySource": "^object$",
+ "projectName": "Object",
+ "type": "UTILITY",
+ "isGeneratorProvided": true,
+ "sources": [
+ {
+ "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/object/CMakeFiles/ALL_BUILD$",
+ "isGenerated": true,
+ "sourceGroupName": "",
+ "compileGroupLanguage": null,
+ "backtrace": [
+ {
+ "file": "^object/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ },
+ {
+ "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/object/CMakeFiles/ALL_BUILD\\.rule$",
+ "isGenerated": true,
+ "sourceGroupName": "CMake Rules",
+ "compileGroupLanguage": null,
+ "backtrace": [
+ {
+ "file": "^object/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "",
+ "sourcePaths": [
+ "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/object/CMakeFiles/ALL_BUILD$"
+ ]
+ },
+ {
+ "name": "CMake Rules",
+ "sourcePaths": [
+ "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/object/CMakeFiles/ALL_BUILD\\.rule$"
+ ]
+ }
+ ],
+ "compileGroups": null,
+ "backtrace": [
+ {
+ "file": "^object/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": null,
+ "artifacts": null,
+ "build": "^object$",
+ "source": "^object$",
+ "install": null,
+ "link": null,
+ "archive": null,
+ "dependencies": [
+ {
+ "id": "^ZERO_CHECK::@5ed5358f70faf8d8af7a$",
+ "backtrace": null
+ },
+ {
+ "id": "^c_object_lib::@5ed5358f70faf8d8af7a$",
+ "backtrace": null
+ },
+ {
+ "id": "^c_object_exe::@5ed5358f70faf8d8af7a$",
+ "backtrace": null
+ },
+ {
+ "id": "^cxx_object_lib::@5ed5358f70faf8d8af7a$",
+ "backtrace": null
+ },
+ {
+ "id": "^cxx_object_exe::@5ed5358f70faf8d8af7a$",
+ "backtrace": null
+ }
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/all_build_top.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/all_build_top.json
new file mode 100644
index 0000000..b4def78
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/all_build_top.json
@@ -0,0 +1,179 @@
+{
+ "name": "ALL_BUILD",
+ "id": "^ALL_BUILD::@6890427a1f51a3e7e1df$",
+ "directorySource": "^\\.$",
+ "projectName": "codemodel-v2",
+ "type": "UTILITY",
+ "isGeneratorProvided": true,
+ "sources": [
+ {
+ "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/CMakeFiles/ALL_BUILD$",
+ "isGenerated": true,
+ "sourceGroupName": "",
+ "compileGroupLanguage": null,
+ "backtrace": [
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ },
+ {
+ "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/CMakeFiles/ALL_BUILD\\.rule$",
+ "isGenerated": true,
+ "sourceGroupName": "CMake Rules",
+ "compileGroupLanguage": null,
+ "backtrace": [
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "",
+ "sourcePaths": [
+ "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/CMakeFiles/ALL_BUILD$"
+ ]
+ },
+ {
+ "name": "CMake Rules",
+ "sourcePaths": [
+ "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/CMakeFiles/ALL_BUILD\\.rule$"
+ ]
+ }
+ ],
+ "compileGroups": null,
+ "backtrace": [
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": null,
+ "artifacts": null,
+ "build": "^\\.$",
+ "source": "^\\.$",
+ "install": null,
+ "link": null,
+ "archive": null,
+ "dependencies": [
+ {
+ "id": "^ZERO_CHECK::@6890427a1f51a3e7e1df$",
+ "backtrace": null
+ },
+ {
+ "id": "^interface_exe::@6890427a1f51a3e7e1df$",
+ "backtrace": null
+ },
+ {
+ "id": "^c_lib::@6890427a1f51a3e7e1df$",
+ "backtrace": null
+ },
+ {
+ "id": "^c_exe::@6890427a1f51a3e7e1df$",
+ "backtrace": null
+ },
+ {
+ "id": "^c_shared_lib::@6890427a1f51a3e7e1df$",
+ "backtrace": null
+ },
+ {
+ "id": "^c_shared_exe::@6890427a1f51a3e7e1df$",
+ "backtrace": null
+ },
+ {
+ "id": "^c_static_lib::@6890427a1f51a3e7e1df$",
+ "backtrace": null
+ },
+ {
+ "id": "^c_static_exe::@6890427a1f51a3e7e1df$",
+ "backtrace": null
+ },
+ {
+ "id": "^c_alias_exe::@53632cba2752272bb008$",
+ "backtrace": null
+ },
+ {
+ "id": "^cxx_alias_exe::@53632cba2752272bb008$",
+ "backtrace": null
+ },
+ {
+ "id": "^cxx_lib::@a56b12a3f5c0529fb296$",
+ "backtrace": null
+ },
+ {
+ "id": "^cxx_exe::@a56b12a3f5c0529fb296$",
+ "backtrace": null
+ },
+ {
+ "id": "^cxx_shared_lib::@a56b12a3f5c0529fb296$",
+ "backtrace": null
+ },
+ {
+ "id": "^cxx_shared_exe::@a56b12a3f5c0529fb296$",
+ "backtrace": null
+ },
+ {
+ "id": "^cxx_static_lib::@a56b12a3f5c0529fb296$",
+ "backtrace": null
+ },
+ {
+ "id": "^cxx_static_exe::@a56b12a3f5c0529fb296$",
+ "backtrace": null
+ },
+ {
+ "id": "^c_object_lib::@5ed5358f70faf8d8af7a$",
+ "backtrace": null
+ },
+ {
+ "id": "^c_object_exe::@5ed5358f70faf8d8af7a$",
+ "backtrace": null
+ },
+ {
+ "id": "^cxx_object_lib::@5ed5358f70faf8d8af7a$",
+ "backtrace": null
+ },
+ {
+ "id": "^cxx_object_exe::@5ed5358f70faf8d8af7a$",
+ "backtrace": null
+ },
+ {
+ "id": "^link_imported_exe::@ba7eb709d0b48779c6c8$",
+ "backtrace": null
+ },
+ {
+ "id": "^link_imported_shared_exe::@ba7eb709d0b48779c6c8$",
+ "backtrace": null
+ },
+ {
+ "id": "^link_imported_static_exe::@ba7eb709d0b48779c6c8$",
+ "backtrace": null
+ },
+ {
+ "id": "^link_imported_object_exe::@ba7eb709d0b48779c6c8$",
+ "backtrace": null
+ },
+ {
+ "id": "^link_imported_interface_exe::@ba7eb709d0b48779c6c8$",
+ "backtrace": null
+ },
+ {
+ "id": "^custom_exe::@c11385ffed57b860da63$",
+ "backtrace": null
+ },
+ {
+ "id": "^generated_exe::@[0-9a-f]+$",
+ "backtrace": null
+ }
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/c_alias_exe.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/c_alias_exe.json
new file mode 100644
index 0000000..ac7c94d
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/c_alias_exe.json
@@ -0,0 +1,107 @@
+{
+ "name": "c_alias_exe",
+ "id": "^c_alias_exe::@53632cba2752272bb008$",
+ "directorySource": "^alias$",
+ "projectName": "Alias",
+ "type": "EXECUTABLE",
+ "isGeneratorProvided": null,
+ "sources": [
+ {
+ "path": "^empty\\.c$",
+ "isGenerated": null,
+ "sourceGroupName": "Source Files",
+ "compileGroupLanguage": "C",
+ "backtrace": [
+ {
+ "file": "^alias/CMakeLists\\.txt$",
+ "line": 5,
+ "command": "add_executable",
+ "hasParent": true
+ },
+ {
+ "file": "^alias/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "Source Files",
+ "sourcePaths": [
+ "^empty\\.c$"
+ ]
+ }
+ ],
+ "compileGroups": [
+ {
+ "language": "C",
+ "sourcePaths": [
+ "^empty\\.c$"
+ ],
+ "includes": null,
+ "defines": null,
+ "compileCommandFragments": null
+ }
+ ],
+ "backtrace": [
+ {
+ "file": "^alias/CMakeLists\\.txt$",
+ "line": 5,
+ "command": "add_executable",
+ "hasParent": true
+ },
+ {
+ "file": "^alias/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": "^c_alias_exe(\\.exe)?$",
+ "artifacts": [
+ {
+ "path": "^alias/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?c_alias_exe(\\.exe)?$",
+ "_dllExtra": false
+ },
+ {
+ "path": "^alias/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?c_alias_exe\\.pdb$",
+ "_dllExtra": true
+ }
+ ],
+ "build": "^alias$",
+ "source": "^alias$",
+ "install": null,
+ "link": {
+ "language": "C",
+ "lto": null,
+ "commandFragments": null
+ },
+ "archive": null,
+ "dependencies": [
+ {
+ "id": "^c_lib::@6890427a1f51a3e7e1df$",
+ "backtrace": [
+ {
+ "file": "^alias/CMakeLists\\.txt$",
+ "line": 6,
+ "command": "target_link_libraries",
+ "hasParent": true
+ },
+ {
+ "file": "^alias/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ },
+ {
+ "id": "^ZERO_CHECK::@53632cba2752272bb008$",
+ "backtrace": null
+ }
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/c_exe.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/c_exe.json
new file mode 100644
index 0000000..7af74c4
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/c_exe.json
@@ -0,0 +1,143 @@
+{
+ "name": "c_exe",
+ "id": "^c_exe::@6890427a1f51a3e7e1df$",
+ "directorySource": "^\\.$",
+ "projectName": "codemodel-v2",
+ "type": "EXECUTABLE",
+ "isGeneratorProvided": null,
+ "sources": [
+ {
+ "path": "^empty\\.c$",
+ "isGenerated": null,
+ "sourceGroupName": "Source Files",
+ "compileGroupLanguage": "C",
+ "backtrace": [
+ {
+ "file": "^codemodel-v2\\.cmake$",
+ "line": 6,
+ "command": "add_executable",
+ "hasParent": true
+ },
+ {
+ "file": "^codemodel-v2\\.cmake$",
+ "line": null,
+ "command": null,
+ "hasParent": true
+ },
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": 3,
+ "command": "include",
+ "hasParent": true
+ },
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "Source Files",
+ "sourcePaths": [
+ "^empty\\.c$"
+ ]
+ }
+ ],
+ "compileGroups": [
+ {
+ "language": "C",
+ "sourcePaths": [
+ "^empty\\.c$"
+ ],
+ "includes": null,
+ "defines": null,
+ "compileCommandFragments": null
+ }
+ ],
+ "backtrace": [
+ {
+ "file": "^codemodel-v2\\.cmake$",
+ "line": 6,
+ "command": "add_executable",
+ "hasParent": true
+ },
+ {
+ "file": "^codemodel-v2\\.cmake$",
+ "line": null,
+ "command": null,
+ "hasParent": true
+ },
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": 3,
+ "command": "include",
+ "hasParent": true
+ },
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": "^c_exe(\\.exe)?$",
+ "artifacts": [
+ {
+ "path": "^((Debug|Release|RelWithDebInfo|MinSizeRel)/)?c_exe(\\.exe)?$",
+ "_dllExtra": false
+ },
+ {
+ "path": "^((Debug|Release|RelWithDebInfo|MinSizeRel)/)?c_exe\\.pdb$",
+ "_dllExtra": true
+ }
+ ],
+ "build": "^\\.$",
+ "source": "^\\.$",
+ "install": null,
+ "link": {
+ "language": "C",
+ "lto": null,
+ "commandFragments": null
+ },
+ "archive": null,
+ "dependencies": [
+ {
+ "id": "^c_lib::@6890427a1f51a3e7e1df$",
+ "backtrace": [
+ {
+ "file": "^codemodel-v2\\.cmake$",
+ "line": 7,
+ "command": "target_link_libraries",
+ "hasParent": true
+ },
+ {
+ "file": "^codemodel-v2\\.cmake$",
+ "line": null,
+ "command": null,
+ "hasParent": true
+ },
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": 3,
+ "command": "include",
+ "hasParent": true
+ },
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ },
+ {
+ "id": "^ZERO_CHECK::@6890427a1f51a3e7e1df$",
+ "backtrace": null
+ }
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/c_lib.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/c_lib.json
new file mode 100644
index 0000000..0ca1962
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/c_lib.json
@@ -0,0 +1,108 @@
+{
+ "name": "c_lib",
+ "id": "^c_lib::@6890427a1f51a3e7e1df$",
+ "directorySource": "^\\.$",
+ "projectName": "codemodel-v2",
+ "type": "STATIC_LIBRARY",
+ "isGeneratorProvided": null,
+ "sources": [
+ {
+ "path": "^empty\\.c$",
+ "isGenerated": null,
+ "sourceGroupName": "Source Files",
+ "compileGroupLanguage": "C",
+ "backtrace": [
+ {
+ "file": "^codemodel-v2\\.cmake$",
+ "line": 5,
+ "command": "add_library",
+ "hasParent": true
+ },
+ {
+ "file": "^codemodel-v2\\.cmake$",
+ "line": null,
+ "command": null,
+ "hasParent": true
+ },
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": 3,
+ "command": "include",
+ "hasParent": true
+ },
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "Source Files",
+ "sourcePaths": [
+ "^empty\\.c$"
+ ]
+ }
+ ],
+ "compileGroups": [
+ {
+ "language": "C",
+ "sourcePaths": [
+ "^empty\\.c$"
+ ],
+ "includes": null,
+ "defines": null,
+ "compileCommandFragments": null
+ }
+ ],
+ "backtrace": [
+ {
+ "file": "^codemodel-v2\\.cmake$",
+ "line": 5,
+ "command": "add_library",
+ "hasParent": true
+ },
+ {
+ "file": "^codemodel-v2\\.cmake$",
+ "line": null,
+ "command": null,
+ "hasParent": true
+ },
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": 3,
+ "command": "include",
+ "hasParent": true
+ },
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": "^(lib)?c_lib\\.(a|lib)$",
+ "artifacts": [
+ {
+ "path": "^((Debug|Release|RelWithDebInfo|MinSizeRel)/)?(lib)?c_lib\\.(a|lib)$",
+ "_dllExtra": false
+ }
+ ],
+ "build": "^\\.$",
+ "source": "^\\.$",
+ "install": null,
+ "link": null,
+ "archive": {
+ "lto": null
+ },
+ "dependencies": [
+ {
+ "id": "^ZERO_CHECK::@6890427a1f51a3e7e1df$",
+ "backtrace": null
+ }
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/c_object_exe.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/c_object_exe.json
new file mode 100644
index 0000000..3c9ace3
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/c_object_exe.json
@@ -0,0 +1,154 @@
+{
+ "name": "c_object_exe",
+ "id": "^c_object_exe::@5ed5358f70faf8d8af7a$",
+ "directorySource": "^object$",
+ "projectName": "Object",
+ "type": "EXECUTABLE",
+ "isGeneratorProvided": null,
+ "sources": [
+ {
+ "path": "^empty\\.c$",
+ "isGenerated": null,
+ "sourceGroupName": "Source Files",
+ "compileGroupLanguage": "C",
+ "backtrace": [
+ {
+ "file": "^object/CMakeLists\\.txt$",
+ "line": 6,
+ "command": "add_executable",
+ "hasParent": true
+ },
+ {
+ "file": "^object/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ },
+ {
+ "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/object/.*/empty(\\.c)?\\.o(bj)?$",
+ "isGenerated": true,
+ "sourceGroupName": "Object Libraries",
+ "compileGroupLanguage": null,
+ "backtrace": [
+ {
+ "file": "^object/CMakeLists\\.txt$",
+ "line": 7,
+ "command": "target_link_libraries",
+ "hasParent": true
+ },
+ {
+ "file": "^object/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "Source Files",
+ "sourcePaths": [
+ "^empty\\.c$"
+ ]
+ },
+ {
+ "name": "Object Libraries",
+ "sourcePaths": [
+ "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/object/.*/empty(\\.c)?\\.o(bj)?$"
+ ]
+ }
+ ],
+ "compileGroups": [
+ {
+ "language": "C",
+ "sourcePaths": [
+ "^empty\\.c$"
+ ],
+ "includes": null,
+ "defines": null,
+ "compileCommandFragments": null
+ }
+ ],
+ "backtrace": [
+ {
+ "file": "^object/CMakeLists\\.txt$",
+ "line": 6,
+ "command": "add_executable",
+ "hasParent": true
+ },
+ {
+ "file": "^object/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": "^c_object_exe(\\.exe)?$",
+ "artifacts": [
+ {
+ "path": "^object/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?c_object_exe(\\.exe)?$",
+ "_dllExtra": false
+ },
+ {
+ "path": "^object/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?c_object_exe\\.pdb$",
+ "_dllExtra": true
+ }
+ ],
+ "build": "^object$",
+ "source": "^object$",
+ "install": {
+ "prefix": "^(/usr/local|[A-Za-z]:.*/codemodel-v2)$",
+ "destinations": [
+ {
+ "path": "bin",
+ "backtrace": [
+ {
+ "file": "^object/CMakeLists\\.txt$",
+ "line": 13,
+ "command": "install",
+ "hasParent": true
+ },
+ {
+ "file": "^object/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ]
+ },
+ "link": {
+ "language": "C",
+ "lto": null,
+ "commandFragments": null
+ },
+ "archive": null,
+ "dependencies": [
+ {
+ "id": "^c_object_lib::@5ed5358f70faf8d8af7a$",
+ "backtrace": [
+ {
+ "file": "^object/CMakeLists\\.txt$",
+ "line": 7,
+ "command": "target_link_libraries",
+ "hasParent": true
+ },
+ {
+ "file": "^object/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ },
+ {
+ "id": "^ZERO_CHECK::@5ed5358f70faf8d8af7a$",
+ "backtrace": null
+ }
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/c_object_lib.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/c_object_lib.json
new file mode 100644
index 0000000..e3a20df
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/c_object_lib.json
@@ -0,0 +1,82 @@
+{
+ "name": "c_object_lib",
+ "id": "^c_object_lib::@5ed5358f70faf8d8af7a$",
+ "directorySource": "^object$",
+ "projectName": "Object",
+ "type": "OBJECT_LIBRARY",
+ "isGeneratorProvided": null,
+ "sources": [
+ {
+ "path": "^empty\\.c$",
+ "isGenerated": null,
+ "sourceGroupName": "Source Files",
+ "compileGroupLanguage": "C",
+ "backtrace": [
+ {
+ "file": "^object/CMakeLists\\.txt$",
+ "line": 5,
+ "command": "add_library",
+ "hasParent": true
+ },
+ {
+ "file": "^object/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "Source Files",
+ "sourcePaths": [
+ "^empty\\.c$"
+ ]
+ }
+ ],
+ "compileGroups": [
+ {
+ "language": "C",
+ "sourcePaths": [
+ "^empty\\.c$"
+ ],
+ "includes": null,
+ "defines": null,
+ "compileCommandFragments": null
+ }
+ ],
+ "backtrace": [
+ {
+ "file": "^object/CMakeLists\\.txt$",
+ "line": 5,
+ "command": "add_library",
+ "hasParent": true
+ },
+ {
+ "file": "^object/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": null,
+ "artifacts": [
+ {
+ "path": "^object/.*/empty(\\.c)?\\.o(bj)?$",
+ "_dllExtra": false
+ }
+ ],
+ "build": "^object$",
+ "source": "^object$",
+ "install": null,
+ "link": null,
+ "archive": null,
+ "dependencies": [
+ {
+ "id": "^ZERO_CHECK::@5ed5358f70faf8d8af7a$",
+ "backtrace": null
+ }
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/c_shared_exe.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/c_shared_exe.json
new file mode 100644
index 0000000..0d4018a
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/c_shared_exe.json
@@ -0,0 +1,143 @@
+{
+ "name": "c_shared_exe",
+ "id": "^c_shared_exe::@6890427a1f51a3e7e1df$",
+ "directorySource": "^\\.$",
+ "projectName": "codemodel-v2",
+ "type": "EXECUTABLE",
+ "isGeneratorProvided": null,
+ "sources": [
+ {
+ "path": "^empty\\.c$",
+ "isGenerated": null,
+ "sourceGroupName": "Source Files",
+ "compileGroupLanguage": "C",
+ "backtrace": [
+ {
+ "file": "^codemodel-v2\\.cmake$",
+ "line": 10,
+ "command": "add_executable",
+ "hasParent": true
+ },
+ {
+ "file": "^codemodel-v2\\.cmake$",
+ "line": null,
+ "command": null,
+ "hasParent": true
+ },
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": 3,
+ "command": "include",
+ "hasParent": true
+ },
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "Source Files",
+ "sourcePaths": [
+ "^empty\\.c$"
+ ]
+ }
+ ],
+ "compileGroups": [
+ {
+ "language": "C",
+ "sourcePaths": [
+ "^empty\\.c$"
+ ],
+ "includes": null,
+ "defines": null,
+ "compileCommandFragments": null
+ }
+ ],
+ "backtrace": [
+ {
+ "file": "^codemodel-v2\\.cmake$",
+ "line": 10,
+ "command": "add_executable",
+ "hasParent": true
+ },
+ {
+ "file": "^codemodel-v2\\.cmake$",
+ "line": null,
+ "command": null,
+ "hasParent": true
+ },
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": 3,
+ "command": "include",
+ "hasParent": true
+ },
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": "^c_shared_exe(\\.exe)?$",
+ "artifacts": [
+ {
+ "path": "^((Debug|Release|RelWithDebInfo|MinSizeRel)/)?c_shared_exe(\\.exe)?$",
+ "_dllExtra": false
+ },
+ {
+ "path": "^((Debug|Release|RelWithDebInfo|MinSizeRel)/)?c_shared_exe\\.pdb$",
+ "_dllExtra": true
+ }
+ ],
+ "build": "^\\.$",
+ "source": "^\\.$",
+ "install": null,
+ "link": {
+ "language": "C",
+ "lto": true,
+ "commandFragments": null
+ },
+ "archive": null,
+ "dependencies": [
+ {
+ "id": "^c_shared_lib::@6890427a1f51a3e7e1df$",
+ "backtrace": [
+ {
+ "file": "^codemodel-v2\\.cmake$",
+ "line": 11,
+ "command": "target_link_libraries",
+ "hasParent": true
+ },
+ {
+ "file": "^codemodel-v2\\.cmake$",
+ "line": null,
+ "command": null,
+ "hasParent": true
+ },
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": 3,
+ "command": "include",
+ "hasParent": true
+ },
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ },
+ {
+ "id": "^ZERO_CHECK::@6890427a1f51a3e7e1df$",
+ "backtrace": null
+ }
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/c_shared_lib.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/c_shared_lib.json
new file mode 100644
index 0000000..176a857
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/c_shared_lib.json
@@ -0,0 +1,123 @@
+{
+ "name": "c_shared_lib",
+ "id": "^c_shared_lib::@6890427a1f51a3e7e1df$",
+ "directorySource": "^\\.$",
+ "projectName": "codemodel-v2",
+ "type": "SHARED_LIBRARY",
+ "isGeneratorProvided": null,
+ "sources": [
+ {
+ "path": "^empty\\.c$",
+ "isGenerated": null,
+ "sourceGroupName": "Source Files",
+ "compileGroupLanguage": "C",
+ "backtrace": [
+ {
+ "file": "^codemodel-v2\\.cmake$",
+ "line": 9,
+ "command": "add_library",
+ "hasParent": true
+ },
+ {
+ "file": "^codemodel-v2\\.cmake$",
+ "line": null,
+ "command": null,
+ "hasParent": true
+ },
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": 3,
+ "command": "include",
+ "hasParent": true
+ },
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "Source Files",
+ "sourcePaths": [
+ "^empty\\.c$"
+ ]
+ }
+ ],
+ "compileGroups": [
+ {
+ "language": "C",
+ "sourcePaths": [
+ "^empty\\.c$"
+ ],
+ "includes": null,
+ "defines": [
+ {
+ "define": "c_shared_lib_EXPORTS",
+ "backtrace": null
+ }
+ ],
+ "compileCommandFragments": null
+ }
+ ],
+ "backtrace": [
+ {
+ "file": "^codemodel-v2\\.cmake$",
+ "line": 9,
+ "command": "add_library",
+ "hasParent": true
+ },
+ {
+ "file": "^codemodel-v2\\.cmake$",
+ "line": null,
+ "command": null,
+ "hasParent": true
+ },
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": 3,
+ "command": "include",
+ "hasParent": true
+ },
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": "^(lib|cyg)?c_shared_lib\\.(so|dylib|dll)$",
+ "artifacts": [
+ {
+ "path": "^lib/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?(lib|cyg)?c_shared_lib\\.(so|dylib|dll)$",
+ "_dllExtra": false
+ },
+ {
+ "path": "^((Debug|Release|RelWithDebInfo|MinSizeRel)/)?(lib)?c_shared_lib\\.(dll\\.a|lib)$",
+ "_dllExtra": true
+ },
+ {
+ "path": "^lib/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?(lib|cyg)?c_shared_lib\\.pdb$",
+ "_dllExtra": true
+ }
+ ],
+ "build": "^\\.$",
+ "source": "^\\.$",
+ "install": null,
+ "link": {
+ "language": "C",
+ "lto": true,
+ "commandFragments": null
+ },
+ "archive": null,
+ "dependencies": [
+ {
+ "id": "^ZERO_CHECK::@6890427a1f51a3e7e1df$",
+ "backtrace": null
+ }
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/c_static_exe.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/c_static_exe.json
new file mode 100644
index 0000000..5542277
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/c_static_exe.json
@@ -0,0 +1,143 @@
+{
+ "name": "c_static_exe",
+ "id": "^c_static_exe::@6890427a1f51a3e7e1df$",
+ "directorySource": "^\\.$",
+ "projectName": "codemodel-v2",
+ "type": "EXECUTABLE",
+ "isGeneratorProvided": null,
+ "sources": [
+ {
+ "path": "^empty\\.c$",
+ "isGenerated": null,
+ "sourceGroupName": "Source Files",
+ "compileGroupLanguage": "C",
+ "backtrace": [
+ {
+ "file": "^codemodel-v2\\.cmake$",
+ "line": 14,
+ "command": "add_executable",
+ "hasParent": true
+ },
+ {
+ "file": "^codemodel-v2\\.cmake$",
+ "line": null,
+ "command": null,
+ "hasParent": true
+ },
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": 3,
+ "command": "include",
+ "hasParent": true
+ },
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "Source Files",
+ "sourcePaths": [
+ "^empty\\.c$"
+ ]
+ }
+ ],
+ "compileGroups": [
+ {
+ "language": "C",
+ "sourcePaths": [
+ "^empty\\.c$"
+ ],
+ "includes": null,
+ "defines": null,
+ "compileCommandFragments": null
+ }
+ ],
+ "backtrace": [
+ {
+ "file": "^codemodel-v2\\.cmake$",
+ "line": 14,
+ "command": "add_executable",
+ "hasParent": true
+ },
+ {
+ "file": "^codemodel-v2\\.cmake$",
+ "line": null,
+ "command": null,
+ "hasParent": true
+ },
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": 3,
+ "command": "include",
+ "hasParent": true
+ },
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": "^c_static_exe(\\.exe)?$",
+ "artifacts": [
+ {
+ "path": "^((Debug|Release|RelWithDebInfo|MinSizeRel)/)?c_static_exe(\\.exe)?$",
+ "_dllExtra": false
+ },
+ {
+ "path": "^((Debug|Release|RelWithDebInfo|MinSizeRel)/)?c_static_exe\\.pdb$",
+ "_dllExtra": true
+ }
+ ],
+ "build": "^\\.$",
+ "source": "^\\.$",
+ "install": null,
+ "link": {
+ "language": "C",
+ "lto": null,
+ "commandFragments": null
+ },
+ "archive": null,
+ "dependencies": [
+ {
+ "id": "^c_static_lib::@6890427a1f51a3e7e1df$",
+ "backtrace": [
+ {
+ "file": "^codemodel-v2\\.cmake$",
+ "line": 15,
+ "command": "target_link_libraries",
+ "hasParent": true
+ },
+ {
+ "file": "^codemodel-v2\\.cmake$",
+ "line": null,
+ "command": null,
+ "hasParent": true
+ },
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": 3,
+ "command": "include",
+ "hasParent": true
+ },
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ },
+ {
+ "id": "^ZERO_CHECK::@6890427a1f51a3e7e1df$",
+ "backtrace": null
+ }
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/c_static_lib.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/c_static_lib.json
new file mode 100644
index 0000000..4b63897
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/c_static_lib.json
@@ -0,0 +1,108 @@
+{
+ "name": "c_static_lib",
+ "id": "^c_static_lib::@6890427a1f51a3e7e1df$",
+ "directorySource": "^\\.$",
+ "projectName": "codemodel-v2",
+ "type": "STATIC_LIBRARY",
+ "isGeneratorProvided": null,
+ "sources": [
+ {
+ "path": "^empty\\.c$",
+ "isGenerated": null,
+ "sourceGroupName": "Source Files",
+ "compileGroupLanguage": "C",
+ "backtrace": [
+ {
+ "file": "^codemodel-v2\\.cmake$",
+ "line": 13,
+ "command": "add_library",
+ "hasParent": true
+ },
+ {
+ "file": "^codemodel-v2\\.cmake$",
+ "line": null,
+ "command": null,
+ "hasParent": true
+ },
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": 3,
+ "command": "include",
+ "hasParent": true
+ },
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "Source Files",
+ "sourcePaths": [
+ "^empty\\.c$"
+ ]
+ }
+ ],
+ "compileGroups": [
+ {
+ "language": "C",
+ "sourcePaths": [
+ "^empty\\.c$"
+ ],
+ "includes": null,
+ "defines": null,
+ "compileCommandFragments": null
+ }
+ ],
+ "backtrace": [
+ {
+ "file": "^codemodel-v2\\.cmake$",
+ "line": 13,
+ "command": "add_library",
+ "hasParent": true
+ },
+ {
+ "file": "^codemodel-v2\\.cmake$",
+ "line": null,
+ "command": null,
+ "hasParent": true
+ },
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": 3,
+ "command": "include",
+ "hasParent": true
+ },
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": "^(lib)?c_static_lib\\.(a|lib)$",
+ "artifacts": [
+ {
+ "path": "^((Debug|Release|RelWithDebInfo|MinSizeRel)/)?(lib)?c_static_lib\\.(a|lib)$",
+ "_dllExtra": false
+ }
+ ],
+ "build": "^\\.$",
+ "source": "^\\.$",
+ "install": null,
+ "link": null,
+ "archive": {
+ "lto": true
+ },
+ "dependencies": [
+ {
+ "id": "^ZERO_CHECK::@6890427a1f51a3e7e1df$",
+ "backtrace": null
+ }
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/custom_exe.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/custom_exe.json
new file mode 100644
index 0000000..ab301e9
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/custom_exe.json
@@ -0,0 +1,107 @@
+{
+ "name": "custom_exe",
+ "id": "^custom_exe::@c11385ffed57b860da63$",
+ "directorySource": "^custom$",
+ "projectName": "Custom",
+ "type": "EXECUTABLE",
+ "isGeneratorProvided": null,
+ "sources": [
+ {
+ "path": "^empty\\.c$",
+ "isGenerated": null,
+ "sourceGroupName": "Source Files",
+ "compileGroupLanguage": "C",
+ "backtrace": [
+ {
+ "file": "^custom/CMakeLists\\.txt$",
+ "line": 4,
+ "command": "add_executable",
+ "hasParent": true
+ },
+ {
+ "file": "^custom/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "Source Files",
+ "sourcePaths": [
+ "^empty\\.c$"
+ ]
+ }
+ ],
+ "compileGroups": [
+ {
+ "language": "C",
+ "sourcePaths": [
+ "^empty\\.c$"
+ ],
+ "includes": null,
+ "defines": null,
+ "compileCommandFragments": null
+ }
+ ],
+ "backtrace": [
+ {
+ "file": "^custom/CMakeLists\\.txt$",
+ "line": 4,
+ "command": "add_executable",
+ "hasParent": true
+ },
+ {
+ "file": "^custom/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": "^custom_exe(\\.exe)?$",
+ "artifacts": [
+ {
+ "path": "^custom/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?custom_exe(\\.exe)?$",
+ "_dllExtra": false
+ },
+ {
+ "path": "^custom/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?custom_exe\\.pdb$",
+ "_dllExtra": true
+ }
+ ],
+ "build": "^custom$",
+ "source": "^custom$",
+ "install": null,
+ "link": {
+ "language": "C",
+ "lto": null,
+ "commandFragments": null
+ },
+ "archive": null,
+ "dependencies": [
+ {
+ "id": "^custom_tgt::@c11385ffed57b860da63$",
+ "backtrace": [
+ {
+ "file": "^custom/CMakeLists\\.txt$",
+ "line": 5,
+ "command": "add_dependencies",
+ "hasParent": true
+ },
+ {
+ "file": "^custom/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ },
+ {
+ "id": "^ZERO_CHECK::@c11385ffed57b860da63$",
+ "backtrace": null
+ }
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/custom_tgt.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/custom_tgt.json
new file mode 100644
index 0000000..a7106fc
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/custom_tgt.json
@@ -0,0 +1,87 @@
+{
+ "name": "custom_tgt",
+ "id": "^custom_tgt::@c11385ffed57b860da63$",
+ "directorySource": "^custom$",
+ "projectName": "Custom",
+ "type": "UTILITY",
+ "isGeneratorProvided": null,
+ "sources": [
+ {
+ "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/custom/CMakeFiles/custom_tgt$",
+ "isGenerated": true,
+ "sourceGroupName": "",
+ "compileGroupLanguage": null,
+ "backtrace": [
+ {
+ "file": "^custom/CMakeLists\\.txt$",
+ "line": 3,
+ "command": "add_custom_target",
+ "hasParent": true
+ },
+ {
+ "file": "^custom/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ },
+ {
+ "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/(custom/)?CMakeFiles/([0-9a-f]+/)?custom_tgt\\.rule$",
+ "isGenerated": true,
+ "sourceGroupName": "CMake Rules",
+ "compileGroupLanguage": null,
+ "backtrace": [
+ {
+ "file": "^custom/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "",
+ "sourcePaths": [
+ "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/custom/CMakeFiles/custom_tgt$"
+ ]
+ },
+ {
+ "name": "CMake Rules",
+ "sourcePaths": [
+ "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/(custom/)?CMakeFiles/([0-9a-f]+/)?custom_tgt\\.rule$"
+ ]
+ }
+ ],
+ "compileGroups": null,
+ "backtrace": [
+ {
+ "file": "^custom/CMakeLists\\.txt$",
+ "line": 3,
+ "command": "add_custom_target",
+ "hasParent": true
+ },
+ {
+ "file": "^custom/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": null,
+ "artifacts": null,
+ "build": "^custom$",
+ "source": "^custom$",
+ "install": null,
+ "link": null,
+ "archive": null,
+ "dependencies": [
+ {
+ "id": "^ZERO_CHECK::@c11385ffed57b860da63$",
+ "backtrace": null
+ }
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/cxx_alias_exe.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/cxx_alias_exe.json
new file mode 100644
index 0000000..837f252
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/cxx_alias_exe.json
@@ -0,0 +1,107 @@
+{
+ "name": "cxx_alias_exe",
+ "id": "^cxx_alias_exe::@53632cba2752272bb008$",
+ "directorySource": "^alias$",
+ "projectName": "Alias",
+ "type": "EXECUTABLE",
+ "isGeneratorProvided": null,
+ "sources": [
+ {
+ "path": "^empty\\.cxx$",
+ "isGenerated": null,
+ "sourceGroupName": "Source Files",
+ "compileGroupLanguage": "CXX",
+ "backtrace": [
+ {
+ "file": "^alias/CMakeLists\\.txt$",
+ "line": 9,
+ "command": "add_executable",
+ "hasParent": true
+ },
+ {
+ "file": "^alias/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "Source Files",
+ "sourcePaths": [
+ "^empty\\.cxx$"
+ ]
+ }
+ ],
+ "compileGroups": [
+ {
+ "language": "CXX",
+ "sourcePaths": [
+ "^empty\\.cxx$"
+ ],
+ "includes": null,
+ "defines": null,
+ "compileCommandFragments": null
+ }
+ ],
+ "backtrace": [
+ {
+ "file": "^alias/CMakeLists\\.txt$",
+ "line": 9,
+ "command": "add_executable",
+ "hasParent": true
+ },
+ {
+ "file": "^alias/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": "^cxx_alias_exe(\\.exe)?$",
+ "artifacts": [
+ {
+ "path": "^alias/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?cxx_alias_exe(\\.exe)?$",
+ "_dllExtra": false
+ },
+ {
+ "path": "^alias/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?cxx_alias_exe\\.pdb$",
+ "_dllExtra": true
+ }
+ ],
+ "build": "^alias$",
+ "source": "^alias$",
+ "install": null,
+ "link": {
+ "language": "CXX",
+ "lto": null,
+ "commandFragments": null
+ },
+ "archive": null,
+ "dependencies": [
+ {
+ "id": "^cxx_lib::@a56b12a3f5c0529fb296$",
+ "backtrace": [
+ {
+ "file": "^alias/CMakeLists\\.txt$",
+ "line": 10,
+ "command": "target_link_libraries",
+ "hasParent": true
+ },
+ {
+ "file": "^alias/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ },
+ {
+ "id": "^ZERO_CHECK::@53632cba2752272bb008$",
+ "backtrace": null
+ }
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/cxx_exe.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/cxx_exe.json
new file mode 100644
index 0000000..7631837
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/cxx_exe.json
@@ -0,0 +1,213 @@
+{
+ "name": "cxx_exe",
+ "id": "^cxx_exe::@a56b12a3f5c0529fb296$",
+ "directorySource": "^cxx$",
+ "projectName": "Cxx",
+ "type": "EXECUTABLE",
+ "isGeneratorProvided": null,
+ "sources": [
+ {
+ "path": "^empty\\.cxx$",
+ "isGenerated": null,
+ "sourceGroupName": "Source Files",
+ "compileGroupLanguage": "CXX",
+ "backtrace": [
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": 5,
+ "command": "add_executable",
+ "hasParent": true
+ },
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "Source Files",
+ "sourcePaths": [
+ "^empty\\.cxx$"
+ ]
+ }
+ ],
+ "compileGroups": [
+ {
+ "language": "CXX",
+ "sourcePaths": [
+ "^empty\\.cxx$"
+ ],
+ "includes": null,
+ "defines": null,
+ "compileCommandFragments": [
+ {
+ "fragment" : "TargetCompileOptions",
+ "backtrace": [
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": 17,
+ "command": "target_compile_options",
+ "hasParent": true
+ },
+ {
+ "file" : "^cxx/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "backtrace": [
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": 5,
+ "command": "add_executable",
+ "hasParent": true
+ },
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": "bin",
+ "nameOnDisk": "^cxx_exe(\\.exe)?$",
+ "artifacts": [
+ {
+ "path": "^cxx/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?cxx_exe(\\.exe)?$",
+ "_dllExtra": false
+ },
+ {
+ "path": "^cxx/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?cxx_exe\\.pdb$",
+ "_dllExtra": true
+ }
+ ],
+ "build": "^cxx$",
+ "source": "^cxx$",
+ "install": {
+ "prefix": "^(/usr/local|[A-Za-z]:.*/codemodel-v2)$",
+ "destinations": [
+ {
+ "path": "bin",
+ "backtrace": [
+ {
+ "file": "^codemodel-v2\\.cmake$",
+ "line": 37,
+ "command": "install",
+ "hasParent": true
+ },
+ {
+ "file": "^codemodel-v2\\.cmake$",
+ "line": null,
+ "command": null,
+ "hasParent": true
+ },
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": 3,
+ "command": "include",
+ "hasParent": true
+ },
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ]
+ },
+ "link": {
+ "language": "CXX",
+ "lto": null,
+ "commandFragments": [
+ {
+ "fragment" : "TargetLinkOptions",
+ "role" : "flags",
+ "backtrace": [
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": 18,
+ "command": "target_link_options",
+ "hasParent": true
+ },
+ {
+ "file" : "^cxx/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ },
+ {
+ "fragment" : ".*TargetLinkDir\\\"?$",
+ "role" : "libraryPath",
+ "backtrace": [
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": 19,
+ "command": "target_link_directories",
+ "hasParent": true
+ },
+ {
+ "file" : "^cxx/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ },
+ {
+ "fragment" : ".*cxx_lib.*",
+ "role" : "libraries",
+ "backtrace": [
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": 6,
+ "command": "target_link_libraries",
+ "hasParent": true
+ },
+ {
+ "file" : "^cxx/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ]
+ },
+ "archive": null,
+ "dependencies": [
+ {
+ "id": "^cxx_lib::@a56b12a3f5c0529fb296$",
+ "backtrace": [
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": 6,
+ "command": "target_link_libraries",
+ "hasParent": true
+ },
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ },
+ {
+ "id": "^ZERO_CHECK::@a56b12a3f5c0529fb296$",
+ "backtrace": null
+ }
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/cxx_lib.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/cxx_lib.json
new file mode 100644
index 0000000..94ac081
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/cxx_lib.json
@@ -0,0 +1,84 @@
+{
+ "name": "cxx_lib",
+ "id": "^cxx_lib::@a56b12a3f5c0529fb296$",
+ "directorySource": "^cxx$",
+ "projectName": "Cxx",
+ "type": "STATIC_LIBRARY",
+ "isGeneratorProvided": null,
+ "sources": [
+ {
+ "path": "^empty\\.cxx$",
+ "isGenerated": null,
+ "sourceGroupName": "Source Files",
+ "compileGroupLanguage": "CXX",
+ "backtrace": [
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": 4,
+ "command": "add_library",
+ "hasParent": true
+ },
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "Source Files",
+ "sourcePaths": [
+ "^empty\\.cxx$"
+ ]
+ }
+ ],
+ "compileGroups": [
+ {
+ "language": "CXX",
+ "sourcePaths": [
+ "^empty\\.cxx$"
+ ],
+ "includes": null,
+ "defines": null,
+ "compileCommandFragments": null
+ }
+ ],
+ "backtrace": [
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": 4,
+ "command": "add_library",
+ "hasParent": true
+ },
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": "^(lib)?cxx_lib\\.(a|lib)$",
+ "artifacts": [
+ {
+ "path": "^cxx/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?(lib)?cxx_lib\\.(a|lib)$",
+ "_dllExtra": false
+ }
+ ],
+ "build": "^cxx$",
+ "source": "^cxx$",
+ "install": null,
+ "link": null,
+ "archive": {
+ "lto": null
+ },
+ "dependencies": [
+ {
+ "id": "^ZERO_CHECK::@a56b12a3f5c0529fb296$",
+ "backtrace": null
+ }
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/cxx_object_exe.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/cxx_object_exe.json
new file mode 100644
index 0000000..119c91d
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/cxx_object_exe.json
@@ -0,0 +1,154 @@
+{
+ "name": "cxx_object_exe",
+ "id": "^cxx_object_exe::@5ed5358f70faf8d8af7a$",
+ "directorySource": "^object$",
+ "projectName": "Object",
+ "type": "EXECUTABLE",
+ "isGeneratorProvided": null,
+ "sources": [
+ {
+ "path": "^empty\\.cxx$",
+ "isGenerated": null,
+ "sourceGroupName": "Source Files",
+ "compileGroupLanguage": "CXX",
+ "backtrace": [
+ {
+ "file": "^object/CMakeLists\\.txt$",
+ "line": 10,
+ "command": "add_executable",
+ "hasParent": true
+ },
+ {
+ "file": "^object/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ },
+ {
+ "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/object/.*/empty(\\.cxx)?\\.o(bj)?$",
+ "isGenerated": true,
+ "sourceGroupName": "Object Libraries",
+ "compileGroupLanguage": null,
+ "backtrace": [
+ {
+ "file": "^object/CMakeLists\\.txt$",
+ "line": 11,
+ "command": "target_link_libraries",
+ "hasParent": true
+ },
+ {
+ "file": "^object/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "Source Files",
+ "sourcePaths": [
+ "^empty\\.cxx$"
+ ]
+ },
+ {
+ "name": "Object Libraries",
+ "sourcePaths": [
+ "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/object/.*/empty(\\.cxx)?\\.o(bj)?$"
+ ]
+ }
+ ],
+ "compileGroups": [
+ {
+ "language": "CXX",
+ "sourcePaths": [
+ "^empty\\.cxx$"
+ ],
+ "includes": null,
+ "defines": null,
+ "compileCommandFragments": null
+ }
+ ],
+ "backtrace": [
+ {
+ "file": "^object/CMakeLists\\.txt$",
+ "line": 10,
+ "command": "add_executable",
+ "hasParent": true
+ },
+ {
+ "file": "^object/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": "^cxx_object_exe(\\.exe)?$",
+ "artifacts": [
+ {
+ "path": "^object/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?cxx_object_exe(\\.exe)?$",
+ "_dllExtra": false
+ },
+ {
+ "path": "^object/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?cxx_object_exe\\.pdb$",
+ "_dllExtra": true
+ }
+ ],
+ "build": "^object$",
+ "source": "^object$",
+ "install": {
+ "prefix": "^(/usr/local|[A-Za-z]:.*/codemodel-v2)$",
+ "destinations": [
+ {
+ "path": "bin",
+ "backtrace": [
+ {
+ "file": "^object/CMakeLists\\.txt$",
+ "line": 13,
+ "command": "install",
+ "hasParent": true
+ },
+ {
+ "file": "^object/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ]
+ },
+ "link": {
+ "language": "CXX",
+ "lto": null,
+ "commandFragments": null
+ },
+ "archive": null,
+ "dependencies": [
+ {
+ "id": "^cxx_object_lib::@5ed5358f70faf8d8af7a$",
+ "backtrace": [
+ {
+ "file": "^object/CMakeLists\\.txt$",
+ "line": 11,
+ "command": "target_link_libraries",
+ "hasParent": true
+ },
+ {
+ "file": "^object/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ },
+ {
+ "id": "^ZERO_CHECK::@5ed5358f70faf8d8af7a$",
+ "backtrace": null
+ }
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/cxx_object_lib.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/cxx_object_lib.json
new file mode 100644
index 0000000..8e99f7d
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/cxx_object_lib.json
@@ -0,0 +1,82 @@
+{
+ "name": "cxx_object_lib",
+ "id": "^cxx_object_lib::@5ed5358f70faf8d8af7a$",
+ "directorySource": "^object$",
+ "projectName": "Object",
+ "type": "OBJECT_LIBRARY",
+ "isGeneratorProvided": null,
+ "sources": [
+ {
+ "path": "^empty\\.cxx$",
+ "isGenerated": null,
+ "sourceGroupName": "Source Files",
+ "compileGroupLanguage": "CXX",
+ "backtrace": [
+ {
+ "file": "^object/CMakeLists\\.txt$",
+ "line": 9,
+ "command": "add_library",
+ "hasParent": true
+ },
+ {
+ "file": "^object/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "Source Files",
+ "sourcePaths": [
+ "^empty\\.cxx$"
+ ]
+ }
+ ],
+ "compileGroups": [
+ {
+ "language": "CXX",
+ "sourcePaths": [
+ "^empty\\.cxx$"
+ ],
+ "includes": null,
+ "defines": null,
+ "compileCommandFragments": null
+ }
+ ],
+ "backtrace": [
+ {
+ "file": "^object/CMakeLists\\.txt$",
+ "line": 9,
+ "command": "add_library",
+ "hasParent": true
+ },
+ {
+ "file": "^object/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": null,
+ "artifacts": [
+ {
+ "path": "^object/.*/empty(\\.cxx)?\\.o(bj)?$",
+ "_dllExtra": false
+ }
+ ],
+ "build": "^object$",
+ "source": "^object$",
+ "install": null,
+ "link": null,
+ "archive": null,
+ "dependencies": [
+ {
+ "id": "^ZERO_CHECK::@5ed5358f70faf8d8af7a$",
+ "backtrace": null
+ }
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/cxx_shared_exe.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/cxx_shared_exe.json
new file mode 100644
index 0000000..4421c8f
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/cxx_shared_exe.json
@@ -0,0 +1,107 @@
+{
+ "name": "cxx_shared_exe",
+ "id": "^cxx_shared_exe::@a56b12a3f5c0529fb296$",
+ "directorySource": "^cxx$",
+ "projectName": "Cxx",
+ "type": "EXECUTABLE",
+ "isGeneratorProvided": null,
+ "sources": [
+ {
+ "path": "^empty\\.cxx$",
+ "isGenerated": null,
+ "sourceGroupName": "Source Files",
+ "compileGroupLanguage": "CXX",
+ "backtrace": [
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": 10,
+ "command": "add_executable",
+ "hasParent": true
+ },
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "Source Files",
+ "sourcePaths": [
+ "^empty\\.cxx$"
+ ]
+ }
+ ],
+ "compileGroups": [
+ {
+ "language": "CXX",
+ "sourcePaths": [
+ "^empty\\.cxx$"
+ ],
+ "includes": null,
+ "defines": null,
+ "compileCommandFragments": null
+ }
+ ],
+ "backtrace": [
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": 10,
+ "command": "add_executable",
+ "hasParent": true
+ },
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": "^cxx_shared_exe(\\.exe)?$",
+ "artifacts": [
+ {
+ "path": "^cxx/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?cxx_shared_exe(\\.exe)?$",
+ "_dllExtra": false
+ },
+ {
+ "path": "^cxx/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?cxx_shared_exe\\.pdb$",
+ "_dllExtra": true
+ }
+ ],
+ "build": "^cxx$",
+ "source": "^cxx$",
+ "install": null,
+ "link": {
+ "language": "CXX",
+ "lto": null,
+ "commandFragments": null
+ },
+ "archive": null,
+ "dependencies": [
+ {
+ "id": "^cxx_shared_lib::@a56b12a3f5c0529fb296$",
+ "backtrace": [
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": 11,
+ "command": "target_link_libraries",
+ "hasParent": true
+ },
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ },
+ {
+ "id": "^ZERO_CHECK::@a56b12a3f5c0529fb296$",
+ "backtrace": null
+ }
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/cxx_shared_lib.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/cxx_shared_lib.json
new file mode 100644
index 0000000..171a4f5
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/cxx_shared_lib.json
@@ -0,0 +1,99 @@
+{
+ "name": "cxx_shared_lib",
+ "id": "^cxx_shared_lib::@a56b12a3f5c0529fb296$",
+ "directorySource": "^cxx$",
+ "projectName": "Cxx",
+ "type": "SHARED_LIBRARY",
+ "isGeneratorProvided": null,
+ "sources": [
+ {
+ "path": "^empty\\.cxx$",
+ "isGenerated": null,
+ "sourceGroupName": "Source Files",
+ "compileGroupLanguage": "CXX",
+ "backtrace": [
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": 9,
+ "command": "add_library",
+ "hasParent": true
+ },
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "Source Files",
+ "sourcePaths": [
+ "^empty\\.cxx$"
+ ]
+ }
+ ],
+ "compileGroups": [
+ {
+ "language": "CXX",
+ "sourcePaths": [
+ "^empty\\.cxx$"
+ ],
+ "includes": null,
+ "defines": [
+ {
+ "define": "cxx_shared_lib_EXPORTS",
+ "backtrace": null
+ }
+ ],
+ "compileCommandFragments": null
+ }
+ ],
+ "backtrace": [
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": 9,
+ "command": "add_library",
+ "hasParent": true
+ },
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": "^(lib|cyg)?cxx_shared_lib\\.(so|dylib|dll)$",
+ "artifacts": [
+ {
+ "path": "^cxx/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?(lib|cyg)?cxx_shared_lib\\.(so|dylib|dll)$",
+ "_dllExtra": false
+ },
+ {
+ "path": "^cxx/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?(lib)?cxx_shared_lib\\.(dll\\.a|lib)$",
+ "_dllExtra": true
+ },
+ {
+ "path": "^cxx/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?(lib|cyg)?cxx_shared_lib\\.pdb$",
+ "_dllExtra": true
+ }
+ ],
+ "build": "^cxx$",
+ "source": "^cxx$",
+ "install": null,
+ "link": {
+ "language": "CXX",
+ "lto": null,
+ "commandFragments": null
+ },
+ "archive": null,
+ "dependencies": [
+ {
+ "id": "^ZERO_CHECK::@a56b12a3f5c0529fb296$",
+ "backtrace": null
+ }
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/cxx_static_exe.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/cxx_static_exe.json
new file mode 100644
index 0000000..52c42de
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/cxx_static_exe.json
@@ -0,0 +1,107 @@
+{
+ "name": "cxx_static_exe",
+ "id": "^cxx_static_exe::@a56b12a3f5c0529fb296$",
+ "directorySource": "^cxx$",
+ "projectName": "Cxx",
+ "type": "EXECUTABLE",
+ "isGeneratorProvided": null,
+ "sources": [
+ {
+ "path": "^empty\\.cxx$",
+ "isGenerated": null,
+ "sourceGroupName": "Source Files",
+ "compileGroupLanguage": "CXX",
+ "backtrace": [
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": 14,
+ "command": "add_executable",
+ "hasParent": true
+ },
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "Source Files",
+ "sourcePaths": [
+ "^empty\\.cxx$"
+ ]
+ }
+ ],
+ "compileGroups": [
+ {
+ "language": "CXX",
+ "sourcePaths": [
+ "^empty\\.cxx$"
+ ],
+ "includes": null,
+ "defines": null,
+ "compileCommandFragments": null
+ }
+ ],
+ "backtrace": [
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": 14,
+ "command": "add_executable",
+ "hasParent": true
+ },
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": "^cxx_static_exe(\\.exe)?$",
+ "artifacts": [
+ {
+ "path": "^cxx/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?cxx_static_exe(\\.exe)?$",
+ "_dllExtra": false
+ },
+ {
+ "path": "^cxx/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?cxx_static_exe\\.pdb$",
+ "_dllExtra": true
+ }
+ ],
+ "build": "^cxx$",
+ "source": "^cxx$",
+ "install": null,
+ "link": {
+ "language": "CXX",
+ "lto": null,
+ "commandFragments": null
+ },
+ "archive": null,
+ "dependencies": [
+ {
+ "id": "^cxx_static_lib::@a56b12a3f5c0529fb296$",
+ "backtrace": [
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": 15,
+ "command": "target_link_libraries",
+ "hasParent": true
+ },
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ },
+ {
+ "id": "^ZERO_CHECK::@a56b12a3f5c0529fb296$",
+ "backtrace": null
+ }
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/cxx_static_lib.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/cxx_static_lib.json
new file mode 100644
index 0000000..98298be
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/cxx_static_lib.json
@@ -0,0 +1,84 @@
+{
+ "name": "cxx_static_lib",
+ "id": "^cxx_static_lib::@a56b12a3f5c0529fb296$",
+ "directorySource": "^cxx$",
+ "projectName": "Cxx",
+ "type": "STATIC_LIBRARY",
+ "isGeneratorProvided": null,
+ "sources": [
+ {
+ "path": "^empty\\.cxx$",
+ "isGenerated": null,
+ "sourceGroupName": "Source Files",
+ "compileGroupLanguage": "CXX",
+ "backtrace": [
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": 13,
+ "command": "add_library",
+ "hasParent": true
+ },
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "Source Files",
+ "sourcePaths": [
+ "^empty\\.cxx$"
+ ]
+ }
+ ],
+ "compileGroups": [
+ {
+ "language": "CXX",
+ "sourcePaths": [
+ "^empty\\.cxx$"
+ ],
+ "includes": null,
+ "defines": null,
+ "compileCommandFragments": null
+ }
+ ],
+ "backtrace": [
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": 13,
+ "command": "add_library",
+ "hasParent": true
+ },
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": "^(lib)?cxx_static_lib\\.(a|lib)$",
+ "artifacts": [
+ {
+ "path": "^cxx/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?(lib)?cxx_static_lib\\.(a|lib)$",
+ "_dllExtra": false
+ }
+ ],
+ "build": "^cxx$",
+ "source": "^cxx$",
+ "install": null,
+ "link": null,
+ "archive": {
+ "lto": null
+ },
+ "dependencies": [
+ {
+ "id": "^ZERO_CHECK::@a56b12a3f5c0529fb296$",
+ "backtrace": null
+ }
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/generated_exe.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/generated_exe.json
new file mode 100644
index 0000000..d41bbb2
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/generated_exe.json
@@ -0,0 +1,303 @@
+{
+ "name": "generated_exe",
+ "id": "^generated_exe::@[0-9a-f]+$",
+ "directorySource": "^.*/Tests/RunCMake/FileAPIExternalSource$",
+ "projectName": "External",
+ "type": "EXECUTABLE",
+ "isGeneratorProvided": null,
+ "sources": [
+ {
+ "path": "^.*/Tests/RunCMake/FileAPIExternalSource/empty\\.c$",
+ "isGenerated": null,
+ "sourceGroupName": "Source Files",
+ "compileGroupLanguage": "C",
+ "backtrace": [
+ {
+ "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
+ "line": 5,
+ "command": "add_executable",
+ "hasParent": true
+ },
+ {
+ "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ },
+ {
+ "path": "^.*/Tests/RunCMake/FileAPI/FileAPIExternalBuild/generated\\.cxx$",
+ "isGenerated": true,
+ "sourceGroupName": "Generated Source Files",
+ "compileGroupLanguage": "CXX",
+ "backtrace": [
+ {
+ "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
+ "line": 6,
+ "command": "target_sources",
+ "hasParent": true
+ },
+ {
+ "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "Source Files",
+ "sourcePaths": [
+ "^.*/Tests/RunCMake/FileAPIExternalSource/empty\\.c$"
+ ]
+ },
+ {
+ "name": "Generated Source Files",
+ "sourcePaths": [
+ "^.*/Tests/RunCMake/FileAPI/FileAPIExternalBuild/generated\\.cxx$"
+ ]
+ }
+ ],
+ "compileGroups": [
+ {
+ "language": "C",
+ "sourcePaths": [
+ "^.*/Tests/RunCMake/FileAPIExternalSource/empty\\.c$"
+ ],
+ "includes": [
+ {
+ "path": "^.*/Tests/RunCMake/FileAPI/FileAPIExternalBuild$",
+ "isSystem": null,
+ "backtrace": [
+ {
+ "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
+ "line": 10,
+ "command": "set_property",
+ "hasParent": true
+ },
+ {
+ "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ },
+ {
+ "path": "^.*/Tests/RunCMake/FileAPIExternalSource$",
+ "isSystem": true,
+ "backtrace": [
+ {
+ "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
+ "line": 11,
+ "command": "target_include_directories",
+ "hasParent": true
+ },
+ {
+ "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "defines": [
+ {
+ "define": "EMPTY_C=1",
+ "backtrace": [
+ {
+ "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
+ "line": 9,
+ "command": "set_property",
+ "hasParent": true
+ },
+ {
+ "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ },
+ {
+ "define": "SRC_DUMMY",
+ "backtrace": [
+ {
+ "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
+ "line": 9,
+ "command": "set_property",
+ "hasParent": true
+ },
+ {
+ "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ },
+ {
+ "define": "GENERATED_EXE=1",
+ "backtrace": [
+ {
+ "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
+ "line": 12,
+ "command": "target_compile_definitions",
+ "hasParent": true
+ },
+ {
+ "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ },
+ {
+ "define": "TGT_DUMMY",
+ "backtrace": [
+ {
+ "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
+ "line": 12,
+ "command": "target_compile_definitions",
+ "hasParent": true
+ },
+ {
+ "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "compileCommandFragments": [
+ {
+ "fragment" : "SRC_COMPILE_OPTIONS_DUMMY",
+ "backtrace": [
+ {
+ "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
+ "line": 13,
+ "command": "set_source_files_properties",
+ "hasParent": true
+ },
+ {
+ "file" : "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "language": "CXX",
+ "sourcePaths": [
+ "^.*/Tests/RunCMake/FileAPI/FileAPIExternalBuild/generated\\.cxx$"
+ ],
+ "includes": [
+ {
+ "path": "^.*/Tests/RunCMake/FileAPIExternalSource$",
+ "isSystem": true,
+ "backtrace": [
+ {
+ "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
+ "line": 11,
+ "command": "target_include_directories",
+ "hasParent": true
+ },
+ {
+ "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "defines": [
+ {
+ "define": "GENERATED_EXE=1",
+ "backtrace": [
+ {
+ "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
+ "line": 12,
+ "command": "target_compile_definitions",
+ "hasParent": true
+ },
+ {
+ "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ },
+ {
+ "define": "TGT_DUMMY",
+ "backtrace": [
+ {
+ "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
+ "line": 12,
+ "command": "target_compile_definitions",
+ "hasParent": true
+ },
+ {
+ "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "compileCommandFragments": null
+ }
+ ],
+ "backtrace": [
+ {
+ "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
+ "line": 5,
+ "command": "add_executable",
+ "hasParent": true
+ },
+ {
+ "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": "^generated_exe(\\.exe)?$",
+ "artifacts": [
+ {
+ "path": "^.*/Tests/RunCMake/FileAPI/FileAPIExternalBuild/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?generated_exe(\\.exe)?$",
+ "_dllExtra": false
+ },
+ {
+ "path": "^.*/Tests/RunCMake/FileAPI/FileAPIExternalBuild/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?generated_exe\\.pdb$",
+ "_dllExtra": true
+ }
+ ],
+ "build": "^.*/Tests/RunCMake/FileAPI/FileAPIExternalBuild$",
+ "source": "^.*/Tests/RunCMake/FileAPIExternalSource$",
+ "install": null,
+ "link": {
+ "language": "CXX",
+ "lto": null,
+ "commandFragments": null
+ },
+ "archive": null,
+ "dependencies": [
+ {
+ "id": "^ZERO_CHECK::@[0-9a-f]+$",
+ "backtrace": null
+ }
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/interface_exe.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/interface_exe.json
new file mode 100644
index 0000000..fe0524c
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/interface_exe.json
@@ -0,0 +1,152 @@
+{
+ "name": "interface_exe",
+ "id": "^interface_exe::@6890427a1f51a3e7e1df$",
+ "directorySource": "^\\.$",
+ "projectName": "codemodel-v2",
+ "type": "EXECUTABLE",
+ "isGeneratorProvided": null,
+ "sources": [
+ {
+ "path": "^empty\\.c$",
+ "isGenerated": null,
+ "sourceGroupName": "Source Files",
+ "compileGroupLanguage": "C",
+ "backtrace": [
+ {
+ "file": "^include_test\\.cmake$",
+ "line": 3,
+ "command": "add_executable",
+ "hasParent": true
+ },
+ {
+ "file": "^include_test\\.cmake$",
+ "line": null,
+ "command": null,
+ "hasParent": true
+ },
+ {
+ "file": "^codemodel-v2\\.cmake$",
+ "line": 3,
+ "command": "include",
+ "hasParent": true
+ },
+ {
+ "file": "^codemodel-v2\\.cmake$",
+ "line": null,
+ "command": null,
+ "hasParent": true
+ },
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": 3,
+ "command": "include",
+ "hasParent": true
+ },
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "Source Files",
+ "sourcePaths": [
+ "^empty\\.c$"
+ ]
+ }
+ ],
+ "compileGroups": [
+ {
+ "language": "C",
+ "sourcePaths": [
+ "^empty\\.c$"
+ ],
+ "includes": null,
+ "defines": [
+ {
+ "define": "interface_exe_EXPORTS",
+ "backtrace": null
+ }
+ ],
+ "compileCommandFragments": null
+ }
+ ],
+ "backtrace": [
+ {
+ "file": "^include_test\\.cmake$",
+ "line": 3,
+ "command": "add_executable",
+ "hasParent": true
+ },
+ {
+ "file": "^include_test\\.cmake$",
+ "line": null,
+ "command": null,
+ "hasParent": true
+ },
+ {
+ "file": "^codemodel-v2\\.cmake$",
+ "line": 3,
+ "command": "include",
+ "hasParent": true
+ },
+ {
+ "file": "^codemodel-v2\\.cmake$",
+ "line": null,
+ "command": null,
+ "hasParent": true
+ },
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": 3,
+ "command": "include",
+ "hasParent": true
+ },
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": "^my_interface_exe\\.myexe$",
+ "artifacts": [
+ {
+ "path": "^bin/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?my_interface_exe\\.myexe$",
+ "_dllExtra": false
+ },
+ {
+ "path": "^lib/my_interface_exe\\.imp$",
+ "_aixExtra": true,
+ "_dllExtra": false
+ },
+ {
+ "path": "^lib/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?(lib)?my_interface_exe\\.(dll\\.a|lib)$",
+ "_dllExtra": true
+ },
+ {
+ "path": "^bin/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?my_interface_exe\\.pdb$",
+ "_dllExtra": true
+ }
+ ],
+ "build": "^\\.$",
+ "source": "^\\.$",
+ "install": null,
+ "link": {
+ "language": "C",
+ "lto": null,
+ "commandFragments": null
+ },
+ "archive": null,
+ "dependencies": [
+ {
+ "id": "^ZERO_CHECK::@6890427a1f51a3e7e1df$",
+ "backtrace": null
+ }
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/link_imported_exe.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/link_imported_exe.json
new file mode 100644
index 0000000..312f4c5
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/link_imported_exe.json
@@ -0,0 +1,90 @@
+{
+ "name": "link_imported_exe",
+ "id": "^link_imported_exe::@ba7eb709d0b48779c6c8$",
+ "directorySource": "^imported$",
+ "projectName": "Imported",
+ "type": "EXECUTABLE",
+ "isGeneratorProvided": null,
+ "sources": [
+ {
+ "path": "^empty\\.c$",
+ "isGenerated": null,
+ "sourceGroupName": "Source Files",
+ "compileGroupLanguage": "C",
+ "backtrace": [
+ {
+ "file": "^imported/CMakeLists\\.txt$",
+ "line": 5,
+ "command": "add_executable",
+ "hasParent": true
+ },
+ {
+ "file": "^imported/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "Source Files",
+ "sourcePaths": [
+ "^empty\\.c$"
+ ]
+ }
+ ],
+ "compileGroups": [
+ {
+ "language": "C",
+ "sourcePaths": [
+ "^empty\\.c$"
+ ],
+ "includes": null,
+ "defines": null,
+ "compileCommandFragments": null
+ }
+ ],
+ "backtrace": [
+ {
+ "file": "^imported/CMakeLists\\.txt$",
+ "line": 5,
+ "command": "add_executable",
+ "hasParent": true
+ },
+ {
+ "file": "^imported/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": "^link_imported_exe(\\.exe)?$",
+ "artifacts": [
+ {
+ "path": "^imported/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?link_imported_exe(\\.exe)?$",
+ "_dllExtra": false
+ },
+ {
+ "path": "^imported/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?link_imported_exe\\.pdb$",
+ "_dllExtra": true
+ }
+ ],
+ "build": "^imported$",
+ "source": "^imported$",
+ "install": null,
+ "link": {
+ "language": "C",
+ "lto": null,
+ "commandFragments": null
+ },
+ "archive": null,
+ "dependencies": [
+ {
+ "id": "^ZERO_CHECK::@ba7eb709d0b48779c6c8$",
+ "backtrace": null
+ }
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/link_imported_interface_exe.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/link_imported_interface_exe.json
new file mode 100644
index 0000000..7d0e6df
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/link_imported_interface_exe.json
@@ -0,0 +1,90 @@
+{
+ "name": "link_imported_interface_exe",
+ "id": "^link_imported_interface_exe::@ba7eb709d0b48779c6c8$",
+ "directorySource": "^imported$",
+ "projectName": "Imported",
+ "type": "EXECUTABLE",
+ "isGeneratorProvided": null,
+ "sources": [
+ {
+ "path": "^empty\\.c$",
+ "isGenerated": null,
+ "sourceGroupName": "Source Files",
+ "compileGroupLanguage": "C",
+ "backtrace": [
+ {
+ "file": "^imported/CMakeLists\\.txt$",
+ "line": 23,
+ "command": "add_executable",
+ "hasParent": true
+ },
+ {
+ "file": "^imported/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "Source Files",
+ "sourcePaths": [
+ "^empty\\.c$"
+ ]
+ }
+ ],
+ "compileGroups": [
+ {
+ "language": "C",
+ "sourcePaths": [
+ "^empty\\.c$"
+ ],
+ "includes": null,
+ "defines": null,
+ "compileCommandFragments": null
+ }
+ ],
+ "backtrace": [
+ {
+ "file": "^imported/CMakeLists\\.txt$",
+ "line": 23,
+ "command": "add_executable",
+ "hasParent": true
+ },
+ {
+ "file": "^imported/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": "^link_imported_interface_exe(\\.exe)?$",
+ "artifacts": [
+ {
+ "path": "^imported/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?link_imported_interface_exe(\\.exe)?$",
+ "_dllExtra": false
+ },
+ {
+ "path": "^imported/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?link_imported_interface_exe\\.pdb$",
+ "_dllExtra": true
+ }
+ ],
+ "build": "^imported$",
+ "source": "^imported$",
+ "install": null,
+ "link": {
+ "language": "C",
+ "lto": null,
+ "commandFragments": null
+ },
+ "archive": null,
+ "dependencies": [
+ {
+ "id": "^ZERO_CHECK::@ba7eb709d0b48779c6c8$",
+ "backtrace": null
+ }
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/link_imported_object_exe.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/link_imported_object_exe.json
new file mode 100644
index 0000000..4aec524
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/link_imported_object_exe.json
@@ -0,0 +1,90 @@
+{
+ "name": "link_imported_object_exe",
+ "id": "^link_imported_object_exe::@ba7eb709d0b48779c6c8$",
+ "directorySource": "^imported$",
+ "projectName": "Imported",
+ "type": "EXECUTABLE",
+ "isGeneratorProvided": null,
+ "sources": [
+ {
+ "path": "^empty\\.c$",
+ "isGenerated": null,
+ "sourceGroupName": "Source Files",
+ "compileGroupLanguage": "C",
+ "backtrace": [
+ {
+ "file": "^imported/CMakeLists\\.txt$",
+ "line": 18,
+ "command": "add_executable",
+ "hasParent": true
+ },
+ {
+ "file": "^imported/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "Source Files",
+ "sourcePaths": [
+ "^empty\\.c$"
+ ]
+ }
+ ],
+ "compileGroups": [
+ {
+ "language": "C",
+ "sourcePaths": [
+ "^empty\\.c$"
+ ],
+ "includes": null,
+ "defines": null,
+ "compileCommandFragments": null
+ }
+ ],
+ "backtrace": [
+ {
+ "file": "^imported/CMakeLists\\.txt$",
+ "line": 18,
+ "command": "add_executable",
+ "hasParent": true
+ },
+ {
+ "file": "^imported/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": "^link_imported_object_exe(\\.exe)?$",
+ "artifacts": [
+ {
+ "path": "^imported/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?link_imported_object_exe(\\.exe)?$",
+ "_dllExtra": false
+ },
+ {
+ "path": "^imported/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?link_imported_object_exe\\.pdb$",
+ "_dllExtra": true
+ }
+ ],
+ "build": "^imported$",
+ "source": "^imported$",
+ "install": null,
+ "link": {
+ "language": "C",
+ "lto": null,
+ "commandFragments": null
+ },
+ "archive": null,
+ "dependencies": [
+ {
+ "id": "^ZERO_CHECK::@ba7eb709d0b48779c6c8$",
+ "backtrace": null
+ }
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/link_imported_shared_exe.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/link_imported_shared_exe.json
new file mode 100644
index 0000000..f5846ec
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/link_imported_shared_exe.json
@@ -0,0 +1,90 @@
+{
+ "name": "link_imported_shared_exe",
+ "id": "^link_imported_shared_exe::@ba7eb709d0b48779c6c8$",
+ "directorySource": "^imported$",
+ "projectName": "Imported",
+ "type": "EXECUTABLE",
+ "isGeneratorProvided": null,
+ "sources": [
+ {
+ "path": "^empty\\.c$",
+ "isGenerated": null,
+ "sourceGroupName": "Source Files",
+ "compileGroupLanguage": "C",
+ "backtrace": [
+ {
+ "file": "^imported/CMakeLists\\.txt$",
+ "line": 9,
+ "command": "add_executable",
+ "hasParent": true
+ },
+ {
+ "file": "^imported/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "Source Files",
+ "sourcePaths": [
+ "^empty\\.c$"
+ ]
+ }
+ ],
+ "compileGroups": [
+ {
+ "language": "C",
+ "sourcePaths": [
+ "^empty\\.c$"
+ ],
+ "includes": null,
+ "defines": null,
+ "compileCommandFragments": null
+ }
+ ],
+ "backtrace": [
+ {
+ "file": "^imported/CMakeLists\\.txt$",
+ "line": 9,
+ "command": "add_executable",
+ "hasParent": true
+ },
+ {
+ "file": "^imported/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": "^link_imported_shared_exe(\\.exe)?$",
+ "artifacts": [
+ {
+ "path": "^imported/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?link_imported_shared_exe(\\.exe)?$",
+ "_dllExtra": false
+ },
+ {
+ "path": "^imported/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?link_imported_shared_exe\\.pdb$",
+ "_dllExtra": true
+ }
+ ],
+ "build": "^imported$",
+ "source": "^imported$",
+ "install": null,
+ "link": {
+ "language": "C",
+ "lto": null,
+ "commandFragments": null
+ },
+ "archive": null,
+ "dependencies": [
+ {
+ "id": "^ZERO_CHECK::@ba7eb709d0b48779c6c8$",
+ "backtrace": null
+ }
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/link_imported_static_exe.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/link_imported_static_exe.json
new file mode 100644
index 0000000..29a1695
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/link_imported_static_exe.json
@@ -0,0 +1,90 @@
+{
+ "name": "link_imported_static_exe",
+ "id": "^link_imported_static_exe::@ba7eb709d0b48779c6c8$",
+ "directorySource": "^imported$",
+ "projectName": "Imported",
+ "type": "EXECUTABLE",
+ "isGeneratorProvided": null,
+ "sources": [
+ {
+ "path": "^empty\\.c$",
+ "isGenerated": null,
+ "sourceGroupName": "Source Files",
+ "compileGroupLanguage": "C",
+ "backtrace": [
+ {
+ "file": "^imported/CMakeLists\\.txt$",
+ "line": 13,
+ "command": "add_executable",
+ "hasParent": true
+ },
+ {
+ "file": "^imported/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "Source Files",
+ "sourcePaths": [
+ "^empty\\.c$"
+ ]
+ }
+ ],
+ "compileGroups": [
+ {
+ "language": "C",
+ "sourcePaths": [
+ "^empty\\.c$"
+ ],
+ "includes": null,
+ "defines": null,
+ "compileCommandFragments": null
+ }
+ ],
+ "backtrace": [
+ {
+ "file": "^imported/CMakeLists\\.txt$",
+ "line": 13,
+ "command": "add_executable",
+ "hasParent": true
+ },
+ {
+ "file": "^imported/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": "^link_imported_static_exe(\\.exe)?$",
+ "artifacts": [
+ {
+ "path": "^imported/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?link_imported_static_exe(\\.exe)?$",
+ "_dllExtra": false
+ },
+ {
+ "path": "^imported/((Debug|Release|RelWithDebInfo|MinSizeRel)/)?link_imported_static_exe\\.pdb$",
+ "_dllExtra": true
+ }
+ ],
+ "build": "^imported$",
+ "source": "^imported$",
+ "install": null,
+ "link": {
+ "language": "C",
+ "lto": null,
+ "commandFragments": null
+ },
+ "archive": null,
+ "dependencies": [
+ {
+ "id": "^ZERO_CHECK::@ba7eb709d0b48779c6c8$",
+ "backtrace": null
+ }
+ ]
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/zero_check_alias.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/zero_check_alias.json
new file mode 100644
index 0000000..941c172
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/zero_check_alias.json
@@ -0,0 +1,70 @@
+{
+ "name": "ZERO_CHECK",
+ "id": "^ZERO_CHECK::@53632cba2752272bb008$",
+ "directorySource": "^alias$",
+ "projectName": "Alias",
+ "type": "UTILITY",
+ "isGeneratorProvided": true,
+ "sources": [
+ {
+ "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/alias/CMakeFiles/ZERO_CHECK$",
+ "isGenerated": true,
+ "sourceGroupName": "",
+ "compileGroupLanguage": null,
+ "backtrace": [
+ {
+ "file": "^alias/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ },
+ {
+ "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/alias/CMakeFiles/ZERO_CHECK\\.rule$",
+ "isGenerated": true,
+ "sourceGroupName": "CMake Rules",
+ "compileGroupLanguage": null,
+ "backtrace": [
+ {
+ "file": "^alias/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "",
+ "sourcePaths": [
+ "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/alias/CMakeFiles/ZERO_CHECK$"
+ ]
+ },
+ {
+ "name": "CMake Rules",
+ "sourcePaths": [
+ "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/alias/CMakeFiles/ZERO_CHECK\\.rule$"
+ ]
+ }
+ ],
+ "compileGroups": null,
+ "backtrace": [
+ {
+ "file": "^alias/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": null,
+ "artifacts": null,
+ "build": "^alias$",
+ "source": "^alias$",
+ "install": null,
+ "link": null,
+ "archive": null,
+ "dependencies": null
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/zero_check_custom.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/zero_check_custom.json
new file mode 100644
index 0000000..98c6dd9
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/zero_check_custom.json
@@ -0,0 +1,70 @@
+{
+ "name": "ZERO_CHECK",
+ "id": "^ZERO_CHECK::@c11385ffed57b860da63$",
+ "directorySource": "^custom$",
+ "projectName": "Custom",
+ "type": "UTILITY",
+ "isGeneratorProvided": true,
+ "sources": [
+ {
+ "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/custom/CMakeFiles/ZERO_CHECK$",
+ "isGenerated": true,
+ "sourceGroupName": "",
+ "compileGroupLanguage": null,
+ "backtrace": [
+ {
+ "file": "^custom/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ },
+ {
+ "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/custom/CMakeFiles/ZERO_CHECK\\.rule$",
+ "isGenerated": true,
+ "sourceGroupName": "CMake Rules",
+ "compileGroupLanguage": null,
+ "backtrace": [
+ {
+ "file": "^custom/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "",
+ "sourcePaths": [
+ "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/custom/CMakeFiles/ZERO_CHECK$"
+ ]
+ },
+ {
+ "name": "CMake Rules",
+ "sourcePaths": [
+ "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/custom/CMakeFiles/ZERO_CHECK\\.rule$"
+ ]
+ }
+ ],
+ "compileGroups": null,
+ "backtrace": [
+ {
+ "file": "^custom/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": null,
+ "artifacts": null,
+ "build": "^custom$",
+ "source": "^custom$",
+ "install": null,
+ "link": null,
+ "archive": null,
+ "dependencies": null
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/zero_check_cxx.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/zero_check_cxx.json
new file mode 100644
index 0000000..b72ff82
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/zero_check_cxx.json
@@ -0,0 +1,70 @@
+{
+ "name": "ZERO_CHECK",
+ "id": "^ZERO_CHECK::@a56b12a3f5c0529fb296$",
+ "directorySource": "^cxx$",
+ "projectName": "Cxx",
+ "type": "UTILITY",
+ "isGeneratorProvided": true,
+ "sources": [
+ {
+ "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/cxx/CMakeFiles/ZERO_CHECK$",
+ "isGenerated": true,
+ "sourceGroupName": "",
+ "compileGroupLanguage": null,
+ "backtrace": [
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ },
+ {
+ "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/cxx/CMakeFiles/ZERO_CHECK\\.rule$",
+ "isGenerated": true,
+ "sourceGroupName": "CMake Rules",
+ "compileGroupLanguage": null,
+ "backtrace": [
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "",
+ "sourcePaths": [
+ "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/cxx/CMakeFiles/ZERO_CHECK$"
+ ]
+ },
+ {
+ "name": "CMake Rules",
+ "sourcePaths": [
+ "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/cxx/CMakeFiles/ZERO_CHECK\\.rule$"
+ ]
+ }
+ ],
+ "compileGroups": null,
+ "backtrace": [
+ {
+ "file": "^cxx/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": null,
+ "artifacts": null,
+ "build": "^cxx$",
+ "source": "^cxx$",
+ "install": null,
+ "link": null,
+ "archive": null,
+ "dependencies": null
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/zero_check_external.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/zero_check_external.json
new file mode 100644
index 0000000..9e73806
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/zero_check_external.json
@@ -0,0 +1,70 @@
+{
+ "name": "ZERO_CHECK",
+ "id": "^ZERO_CHECK::@[0-9a-f]+$",
+ "directorySource": "^.*/Tests/RunCMake/FileAPIExternalSource$",
+ "projectName": "External",
+ "type": "UTILITY",
+ "isGeneratorProvided": true,
+ "sources": [
+ {
+ "path": "^.*/Tests/RunCMake/FileAPI/FileAPIExternalBuild/CMakeFiles/ZERO_CHECK$",
+ "isGenerated": true,
+ "sourceGroupName": "",
+ "compileGroupLanguage": null,
+ "backtrace": [
+ {
+ "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ },
+ {
+ "path": "^.*/Tests/RunCMake/FileAPI/FileAPIExternalBuild/CMakeFiles/ZERO_CHECK\\.rule$",
+ "isGenerated": true,
+ "sourceGroupName": "CMake Rules",
+ "compileGroupLanguage": null,
+ "backtrace": [
+ {
+ "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "",
+ "sourcePaths": [
+ "^.*/Tests/RunCMake/FileAPI/FileAPIExternalBuild/CMakeFiles/ZERO_CHECK$"
+ ]
+ },
+ {
+ "name": "CMake Rules",
+ "sourcePaths": [
+ "^.*/Tests/RunCMake/FileAPI/FileAPIExternalBuild/CMakeFiles/ZERO_CHECK\\.rule$"
+ ]
+ }
+ ],
+ "compileGroups": null,
+ "backtrace": [
+ {
+ "file": "^.*/Tests/RunCMake/FileAPIExternalSource/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": null,
+ "artifacts": null,
+ "build": "^.*/Tests/RunCMake/FileAPI/FileAPIExternalBuild$",
+ "source": "^.*/Tests/RunCMake/FileAPIExternalSource$",
+ "install": null,
+ "link": null,
+ "archive": null,
+ "dependencies": null
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/zero_check_imported.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/zero_check_imported.json
new file mode 100644
index 0000000..7534c84
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/zero_check_imported.json
@@ -0,0 +1,70 @@
+{
+ "name": "ZERO_CHECK",
+ "id": "^ZERO_CHECK::@ba7eb709d0b48779c6c8$",
+ "directorySource": "^imported$",
+ "projectName": "Imported",
+ "type": "UTILITY",
+ "isGeneratorProvided": true,
+ "sources": [
+ {
+ "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/imported/CMakeFiles/ZERO_CHECK$",
+ "isGenerated": true,
+ "sourceGroupName": "",
+ "compileGroupLanguage": null,
+ "backtrace": [
+ {
+ "file": "^imported/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ },
+ {
+ "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/imported/CMakeFiles/ZERO_CHECK\\.rule$",
+ "isGenerated": true,
+ "sourceGroupName": "CMake Rules",
+ "compileGroupLanguage": null,
+ "backtrace": [
+ {
+ "file": "^imported/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "",
+ "sourcePaths": [
+ "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/imported/CMakeFiles/ZERO_CHECK$"
+ ]
+ },
+ {
+ "name": "CMake Rules",
+ "sourcePaths": [
+ "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/imported/CMakeFiles/ZERO_CHECK\\.rule$"
+ ]
+ }
+ ],
+ "compileGroups": null,
+ "backtrace": [
+ {
+ "file": "^imported/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": null,
+ "artifacts": null,
+ "build": "^imported$",
+ "source": "^imported$",
+ "install": null,
+ "link": null,
+ "archive": null,
+ "dependencies": null
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/zero_check_object.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/zero_check_object.json
new file mode 100644
index 0000000..bcd7616
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/zero_check_object.json
@@ -0,0 +1,70 @@
+{
+ "name": "ZERO_CHECK",
+ "id": "^ZERO_CHECK::@5ed5358f70faf8d8af7a$",
+ "directorySource": "^object$",
+ "projectName": "Object",
+ "type": "UTILITY",
+ "isGeneratorProvided": true,
+ "sources": [
+ {
+ "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/object/CMakeFiles/ZERO_CHECK$",
+ "isGenerated": true,
+ "sourceGroupName": "",
+ "compileGroupLanguage": null,
+ "backtrace": [
+ {
+ "file": "^object/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ },
+ {
+ "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/object/CMakeFiles/ZERO_CHECK\\.rule$",
+ "isGenerated": true,
+ "sourceGroupName": "CMake Rules",
+ "compileGroupLanguage": null,
+ "backtrace": [
+ {
+ "file": "^object/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "",
+ "sourcePaths": [
+ "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/object/CMakeFiles/ZERO_CHECK$"
+ ]
+ },
+ {
+ "name": "CMake Rules",
+ "sourcePaths": [
+ "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/object/CMakeFiles/ZERO_CHECK\\.rule$"
+ ]
+ }
+ ],
+ "compileGroups": null,
+ "backtrace": [
+ {
+ "file": "^object/CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": null,
+ "artifacts": null,
+ "build": "^object$",
+ "source": "^object$",
+ "install": null,
+ "link": null,
+ "archive": null,
+ "dependencies": null
+}
diff --git a/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/zero_check_top.json b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/zero_check_top.json
new file mode 100644
index 0000000..b3030bd
--- /dev/null
+++ b/Tests/RunCMake/FileAPI/codemodel-v2-data/targets/zero_check_top.json
@@ -0,0 +1,70 @@
+{
+ "name": "ZERO_CHECK",
+ "id": "^ZERO_CHECK::@6890427a1f51a3e7e1df$",
+ "directorySource": "^\\.$",
+ "projectName": "codemodel-v2",
+ "type": "UTILITY",
+ "isGeneratorProvided": true,
+ "sources": [
+ {
+ "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/CMakeFiles/ZERO_CHECK$",
+ "isGenerated": true,
+ "sourceGroupName": "",
+ "compileGroupLanguage": null,
+ "backtrace": [
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ },
+ {
+ "path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/CMakeFiles/ZERO_CHECK\\.rule$",
+ "isGenerated": true,
+ "sourceGroupName": "CMake Rules",
+ "compileGroupLanguage": null,
+ "backtrace": [
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "sourceGroups": [
+ {
+ "name": "",
+ "sourcePaths": [
+ "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/CMakeFiles/ZERO_CHECK$"
+ ]
+ },
+ {
+ "name": "CMake Rules",
+ "sourcePaths": [
+ "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/CMakeFiles/ZERO_CHECK\\.rule$"
+ ]
+ }
+ ],
+ "compileGroups": null,
+ "backtrace": [
+ {
+ "file": "^CMakeLists\\.txt$",
+ "line": null,
+ "command": null,
+ "hasParent": false
+ }
+ ],
+ "folder": null,
+ "nameOnDisk": null,
+ "artifacts": null,
+ "build": "^\\.$",
+ "source": "^\\.$",
+ "install": null,
+ "link": null,
+ "archive": null,
+ "dependencies": null
+}
diff --git a/Tests/RunCMake/File_Archive/7zip.cmake b/Tests/RunCMake/File_Archive/7zip.cmake
new file mode 100644
index 0000000..7b0b9b7
--- /dev/null
+++ b/Tests/RunCMake/File_Archive/7zip.cmake
@@ -0,0 +1,7 @@
+set(OUTPUT_NAME "test.7z")
+
+set(COMPRESSION_FORMAT 7zip)
+
+include(${CMAKE_CURRENT_LIST_DIR}/roundtrip.cmake)
+
+check_magic("377abcaf271c" LIMIT 6 HEX)
diff --git a/Tests/RunCMake/File_Archive/CMakeLists.txt b/Tests/RunCMake/File_Archive/CMakeLists.txt
new file mode 100644
index 0000000..2897109
--- /dev/null
+++ b/Tests/RunCMake/File_Archive/CMakeLists.txt
@@ -0,0 +1,3 @@
+cmake_minimum_required(VERSION 3.0)
+project(${RunCMake_TEST} NONE)
+include(${RunCMake_TEST}.cmake)
diff --git a/Tests/RunCMake/File_Archive/RunCMakeTest.cmake b/Tests/RunCMake/File_Archive/RunCMakeTest.cmake
new file mode 100644
index 0000000..871cb6d
--- /dev/null
+++ b/Tests/RunCMake/File_Archive/RunCMakeTest.cmake
@@ -0,0 +1,17 @@
+include(RunCMake)
+
+run_cmake(7zip)
+run_cmake(gnutar)
+run_cmake(gnutar-gz)
+run_cmake(pax)
+run_cmake(pax-xz)
+run_cmake(pax-zstd)
+run_cmake(paxr)
+run_cmake(paxr-bz2)
+run_cmake(zip)
+
+# Extracting only selected files or directories
+run_cmake(zip-filtered)
+
+run_cmake(unsupported-format)
+run_cmake(zip-with-bad-type)
diff --git a/Tests/RunCMake/File_Archive/gnutar-gz.cmake b/Tests/RunCMake/File_Archive/gnutar-gz.cmake
new file mode 100644
index 0000000..f4e3975
--- /dev/null
+++ b/Tests/RunCMake/File_Archive/gnutar-gz.cmake
@@ -0,0 +1,8 @@
+set(OUTPUT_NAME "test.tar.gz")
+
+set(COMPRESSION_FORMAT gnutar)
+set(COMPRESSION_TYPE GZip)
+
+include(${CMAKE_CURRENT_LIST_DIR}/roundtrip.cmake)
+
+check_magic("1f8b" LIMIT 2 HEX)
diff --git a/Tests/RunCMake/File_Archive/gnutar.cmake b/Tests/RunCMake/File_Archive/gnutar.cmake
new file mode 100644
index 0000000..e5cbd35
--- /dev/null
+++ b/Tests/RunCMake/File_Archive/gnutar.cmake
@@ -0,0 +1,7 @@
+set(OUTPUT_NAME "test.tar")
+
+set(COMPRESSION_FORMAT gnutar)
+
+include(${CMAKE_CURRENT_LIST_DIR}/roundtrip.cmake)
+
+check_magic("7573746172202000" OFFSET 257 LIMIT 8 HEX)
diff --git a/Tests/RunCMake/File_Archive/pax-xz.cmake b/Tests/RunCMake/File_Archive/pax-xz.cmake
new file mode 100644
index 0000000..47fb0fd
--- /dev/null
+++ b/Tests/RunCMake/File_Archive/pax-xz.cmake
@@ -0,0 +1,8 @@
+set(OUTPUT_NAME "test.tar.xz")
+
+set(COMPRESSION_FORMAT pax)
+set(COMPRESSION_TYPE XZ)
+
+include(${CMAKE_CURRENT_LIST_DIR}/roundtrip.cmake)
+
+check_magic("fd377a585a00" LIMIT 6 HEX)
diff --git a/Tests/RunCMake/File_Archive/pax-zstd.cmake b/Tests/RunCMake/File_Archive/pax-zstd.cmake
new file mode 100644
index 0000000..59e0443
--- /dev/null
+++ b/Tests/RunCMake/File_Archive/pax-zstd.cmake
@@ -0,0 +1,8 @@
+set(OUTPUT_NAME "test.tar.zstd")
+
+set(COMPRESSION_FORMAT pax)
+set(COMPRESSION_TYPE Zstd)
+
+include(${CMAKE_CURRENT_LIST_DIR}/roundtrip.cmake)
+
+check_magic("28b52ffd0058" LIMIT 6 HEX)
diff --git a/Tests/RunCMake/File_Archive/pax.cmake b/Tests/RunCMake/File_Archive/pax.cmake
new file mode 100644
index 0000000..e50c74f
--- /dev/null
+++ b/Tests/RunCMake/File_Archive/pax.cmake
@@ -0,0 +1,7 @@
+set(OUTPUT_NAME "test.tar")
+
+set(COMPRESSION_FORMAT pax)
+
+include(${CMAKE_CURRENT_LIST_DIR}/roundtrip.cmake)
+
+check_magic("7573746172003030" OFFSET 257 LIMIT 8 HEX)
diff --git a/Tests/RunCMake/File_Archive/paxr-bz2.cmake b/Tests/RunCMake/File_Archive/paxr-bz2.cmake
new file mode 100644
index 0000000..469a131
--- /dev/null
+++ b/Tests/RunCMake/File_Archive/paxr-bz2.cmake
@@ -0,0 +1,8 @@
+set(OUTPUT_NAME "test.tar.bz2")
+
+set(COMPRESSION_FORMAT paxr)
+set(COMPRESSION_TYPE BZip2)
+
+include(${CMAKE_CURRENT_LIST_DIR}/roundtrip.cmake)
+
+check_magic("425a68" LIMIT 3 HEX)
diff --git a/Tests/RunCMake/File_Archive/paxr.cmake b/Tests/RunCMake/File_Archive/paxr.cmake
new file mode 100644
index 0000000..e3a4d5c
--- /dev/null
+++ b/Tests/RunCMake/File_Archive/paxr.cmake
@@ -0,0 +1,7 @@
+set(OUTPUT_NAME "test.tar")
+
+set(COMPRESSION_FORMAT paxr)
+
+include(${CMAKE_CURRENT_LIST_DIR}/roundtrip.cmake)
+
+check_magic("7573746172003030" OFFSET 257 LIMIT 8 HEX)
diff --git a/Tests/RunCMake/File_Archive/roundtrip.cmake b/Tests/RunCMake/File_Archive/roundtrip.cmake
new file mode 100644
index 0000000..9050400
--- /dev/null
+++ b/Tests/RunCMake/File_Archive/roundtrip.cmake
@@ -0,0 +1,92 @@
+foreach(parameter OUTPUT_NAME COMPRESSION_FORMAT)
+ if(NOT DEFINED ${parameter})
+ message(FATAL_ERROR "missing required parameter ${parameter}")
+ endif()
+endforeach()
+
+set(COMPRESS_DIR compress_dir)
+set(FULL_COMPRESS_DIR ${CMAKE_CURRENT_BINARY_DIR}/${COMPRESS_DIR})
+
+set(DECOMPRESS_DIR decompress_dir)
+set(FULL_DECOMPRESS_DIR ${CMAKE_CURRENT_BINARY_DIR}/${DECOMPRESS_DIR})
+
+set(FULL_OUTPUT_NAME ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_NAME})
+
+set(CHECK_FILES
+ "f1.txt"
+ "d1/f1.txt"
+ "d 2/f1.txt"
+ "d + 3/f1.txt"
+ "d_4/f1.txt"
+ "d-4/f1.txt"
+ "My Special Directory/f1.txt"
+)
+
+foreach(file ${CHECK_FILES})
+ configure_file(${CMAKE_CURRENT_LIST_FILE} ${FULL_COMPRESS_DIR}/${file} COPYONLY)
+endforeach()
+
+if(UNIX)
+ execute_process(COMMAND ln -sf f1.txt ${FULL_COMPRESS_DIR}/d1/f2.txt)
+ list(APPEND CHECK_FILES "d1/f2.txt")
+endif()
+
+file(REMOVE ${FULL_OUTPUT_NAME})
+file(REMOVE_RECURSE ${FULL_DECOMPRESS_DIR})
+file(MAKE_DIRECTORY ${FULL_DECOMPRESS_DIR})
+
+file(ARCHIVE_CREATE
+ OUTPUT ${FULL_OUTPUT_NAME}
+ FORMAT "${COMPRESSION_FORMAT}"
+ TYPE "${COMPRESSION_TYPE}"
+ VERBOSE
+ DIRECTORY ${COMPRESS_DIR})
+
+file(ARCHIVE_EXTRACT
+ INPUT ${FULL_OUTPUT_NAME}
+ ${DECOMPRESSION_OPTIONS}
+ DESTINATION ${FULL_DECOMPRESS_DIR}
+ VERBOSE)
+
+if(CUSTOM_CHECK_FILES)
+ set(CHECK_FILES ${CUSTOM_CHECK_FILES})
+endif()
+
+foreach(file ${CHECK_FILES})
+ set(input ${FULL_COMPRESS_DIR}/${file})
+ set(output ${FULL_DECOMPRESS_DIR}/${COMPRESS_DIR}/${file})
+
+ if(NOT EXISTS ${input})
+ message(SEND_ERROR "Cannot find input file ${output}")
+ endif()
+
+ if(NOT EXISTS ${output})
+ message(SEND_ERROR "Cannot find output file ${output}")
+ endif()
+
+ file(MD5 ${input} input_md5)
+ file(MD5 ${output} output_md5)
+
+ if(NOT input_md5 STREQUAL output_md5)
+ message(SEND_ERROR "Files \"${input}\" and \"${output}\" are different")
+ endif()
+endforeach()
+
+foreach(file ${NOT_EXISTING_FILES_CHECK})
+ set(output ${FULL_DECOMPRESS_DIR}/${COMPRESS_DIR}/${file})
+
+ if(EXISTS ${output})
+ message(SEND_ERROR "File ${output} exists but it shouldn't")
+ endif()
+endforeach()
+
+function(check_magic EXPECTED)
+ file(READ ${FULL_OUTPUT_NAME} ACTUAL
+ ${ARGN}
+ )
+
+ if(NOT ACTUAL STREQUAL EXPECTED)
+ message(FATAL_ERROR
+ "Actual [${ACTUAL}] does not match expected [${EXPECTED}]")
+ endif()
+endfunction()
diff --git a/Tests/RunCMake/File_Archive/unsupported-format-result.txt b/Tests/RunCMake/File_Archive/unsupported-format-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/File_Archive/unsupported-format-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/File_Archive/unsupported-format-stderr.txt b/Tests/RunCMake/File_Archive/unsupported-format-stderr.txt
new file mode 100644
index 0000000..4328022
--- /dev/null
+++ b/Tests/RunCMake/File_Archive/unsupported-format-stderr.txt
@@ -0,0 +1,5 @@
+CMake Error at roundtrip.cmake:38 \(file\):
+ file archive format rar not supported
+Call Stack \(most recent call first\):
+ unsupported-format.cmake:5 \(include\)
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/File_Archive/unsupported-format.cmake b/Tests/RunCMake/File_Archive/unsupported-format.cmake
new file mode 100644
index 0000000..61edc1b
--- /dev/null
+++ b/Tests/RunCMake/File_Archive/unsupported-format.cmake
@@ -0,0 +1,5 @@
+set(OUTPUT_NAME "test.rar")
+
+set(COMPRESSION_FORMAT rar)
+
+include(${CMAKE_CURRENT_LIST_DIR}/roundtrip.cmake)
diff --git a/Tests/RunCMake/File_Archive/zip-filtered.cmake b/Tests/RunCMake/File_Archive/zip-filtered.cmake
new file mode 100644
index 0000000..2d259bc
--- /dev/null
+++ b/Tests/RunCMake/File_Archive/zip-filtered.cmake
@@ -0,0 +1,26 @@
+set(OUTPUT_NAME "test.zip")
+
+set(COMPRESSION_FORMAT zip)
+
+set(DECOMPRESSION_OPTIONS
+ FILES
+ compress_dir/f1.txt # Decompress only file
+ compress_dir/d1 # and whole directory
+)
+
+set(CUSTOM_CHECK_FILES
+ "f1.txt"
+ "d1/f1.txt"
+)
+
+# This files shouldn't exists
+set(NOT_EXISTING_FILES_CHECK
+ "d 2/f1.txt"
+ "d + 3/f1.txt"
+ "d_4/f1.txt"
+ "d-4/f1.txt"
+)
+
+include(${CMAKE_CURRENT_LIST_DIR}/roundtrip.cmake)
+
+check_magic("504b0304" LIMIT 4 HEX)
diff --git a/Tests/RunCMake/File_Archive/zip-with-bad-type-result.txt b/Tests/RunCMake/File_Archive/zip-with-bad-type-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/File_Archive/zip-with-bad-type-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/File_Archive/zip-with-bad-type-stderr.txt b/Tests/RunCMake/File_Archive/zip-with-bad-type-stderr.txt
new file mode 100644
index 0000000..fe12feb
--- /dev/null
+++ b/Tests/RunCMake/File_Archive/zip-with-bad-type-stderr.txt
@@ -0,0 +1,5 @@
+CMake Error at roundtrip.cmake:38 \(file\):
+ file archive format zip does not support TYPE arguments
+Call Stack \(most recent call first\):
+ zip-with-bad-type.cmake:6 \(include\)
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/File_Archive/zip-with-bad-type.cmake b/Tests/RunCMake/File_Archive/zip-with-bad-type.cmake
new file mode 100644
index 0000000..ebb97a3
--- /dev/null
+++ b/Tests/RunCMake/File_Archive/zip-with-bad-type.cmake
@@ -0,0 +1,6 @@
+set(OUTPUT_NAME "test.zip")
+
+set(COMPRESSION_FORMAT zip)
+set(COMPRESSION_TYPE BZip2)
+
+include(${CMAKE_CURRENT_LIST_DIR}/roundtrip.cmake)
diff --git a/Tests/RunCMake/File_Archive/zip.cmake b/Tests/RunCMake/File_Archive/zip.cmake
new file mode 100644
index 0000000..1b93058
--- /dev/null
+++ b/Tests/RunCMake/File_Archive/zip.cmake
@@ -0,0 +1,7 @@
+set(OUTPUT_NAME "test.zip")
+
+set(COMPRESSION_FORMAT zip)
+
+include(${CMAKE_CURRENT_LIST_DIR}/roundtrip.cmake)
+
+check_magic("504b0304" LIMIT 4 HEX)
diff --git a/Tests/RunCMake/File_Configure/BadArg-result.txt b/Tests/RunCMake/File_Configure/BadArg-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/File_Configure/BadArg-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/File_Configure/BadArg-stderr.txt b/Tests/RunCMake/File_Configure/BadArg-stderr.txt
new file mode 100644
index 0000000..5423a28
--- /dev/null
+++ b/Tests/RunCMake/File_Configure/BadArg-stderr.txt
@@ -0,0 +1,4 @@
+CMake Error at BadArg.cmake:[0-9]+ \(file\):
+ file Incorrect arguments to CONFIGURE subcommand.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/File_Configure/BadArg.cmake b/Tests/RunCMake/File_Configure/BadArg.cmake
new file mode 100644
index 0000000..7c7fcda
--- /dev/null
+++ b/Tests/RunCMake/File_Configure/BadArg.cmake
@@ -0,0 +1 @@
+file(CONFIGURE OUTPUT)
diff --git a/Tests/RunCMake/File_Configure/BadArgGeneratorExpressionContent-result.txt b/Tests/RunCMake/File_Configure/BadArgGeneratorExpressionContent-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/File_Configure/BadArgGeneratorExpressionContent-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/File_Configure/BadArgGeneratorExpressionContent-stderr.txt b/Tests/RunCMake/File_Configure/BadArgGeneratorExpressionContent-stderr.txt
new file mode 100644
index 0000000..acda654
--- /dev/null
+++ b/Tests/RunCMake/File_Configure/BadArgGeneratorExpressionContent-stderr.txt
@@ -0,0 +1,5 @@
+CMake Error at BadArgGeneratorExpressionContent.cmake:[0-9]+ \(file\):
+ file CONFIGURE called with CONTENT containing a "<". This character is not
+ allowed.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/File_Configure/BadArgGeneratorExpressionContent.cmake b/Tests/RunCMake/File_Configure/BadArgGeneratorExpressionContent.cmake
new file mode 100644
index 0000000..75fe9e5
--- /dev/null
+++ b/Tests/RunCMake/File_Configure/BadArgGeneratorExpressionContent.cmake
@@ -0,0 +1,4 @@
+file(CONFIGURE
+ OUTPUT "file.txt"
+ CONTENT "foo-$<CONFIG>"
+)
diff --git a/Tests/RunCMake/File_Configure/BadArgGeneratorExpressionOutput-result.txt b/Tests/RunCMake/File_Configure/BadArgGeneratorExpressionOutput-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/File_Configure/BadArgGeneratorExpressionOutput-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/File_Configure/BadArgGeneratorExpressionOutput-stderr.txt b/Tests/RunCMake/File_Configure/BadArgGeneratorExpressionOutput-stderr.txt
new file mode 100644
index 0000000..329d956
--- /dev/null
+++ b/Tests/RunCMake/File_Configure/BadArgGeneratorExpressionOutput-stderr.txt
@@ -0,0 +1,5 @@
+CMake Error at BadArgGeneratorExpressionOutput.cmake:[0-9]+ \(file\):
+ file CONFIGURE called with OUTPUT containing a "<". This character is not
+ allowed.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/File_Configure/BadArgGeneratorExpressionOutput.cmake b/Tests/RunCMake/File_Configure/BadArgGeneratorExpressionOutput.cmake
new file mode 100644
index 0000000..31a79a7
--- /dev/null
+++ b/Tests/RunCMake/File_Configure/BadArgGeneratorExpressionOutput.cmake
@@ -0,0 +1,4 @@
+file(CONFIGURE
+ OUTPUT "file-$<CONFIG>.txt"
+ CONTENT "foo"
+)
diff --git a/Tests/RunCMake/File_Configure/CMakeLists.txt b/Tests/RunCMake/File_Configure/CMakeLists.txt
new file mode 100644
index 0000000..b7117bd
--- /dev/null
+++ b/Tests/RunCMake/File_Configure/CMakeLists.txt
@@ -0,0 +1,3 @@
+cmake_minimum_required(VERSION 3.17)
+project(${RunCMake_TEST} NONE)
+include(${RunCMake_TEST}.cmake)
diff --git a/Tests/RunCMake/File_Configure/DirOutput-stderr.txt b/Tests/RunCMake/File_Configure/DirOutput-stderr.txt
new file mode 100644
index 0000000..d051f7c
--- /dev/null
+++ b/Tests/RunCMake/File_Configure/DirOutput-stderr.txt
@@ -0,0 +1 @@
+^DirOutput test file$
diff --git a/Tests/RunCMake/File_Configure/DirOutput.cmake b/Tests/RunCMake/File_Configure/DirOutput.cmake
new file mode 100644
index 0000000..aa0fadf
--- /dev/null
+++ b/Tests/RunCMake/File_Configure/DirOutput.cmake
@@ -0,0 +1,4 @@
+file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/DirOutput)
+configure_file(DirOutput.txt DirOutput)
+file(READ ${CMAKE_CURRENT_BINARY_DIR}/DirOutput/DirOutput.txt out)
+message("${out}")
diff --git a/Tests/RunCMake/File_Configure/DirOutput.txt b/Tests/RunCMake/File_Configure/DirOutput.txt
new file mode 100644
index 0000000..16388a6
--- /dev/null
+++ b/Tests/RunCMake/File_Configure/DirOutput.txt
@@ -0,0 +1 @@
+DirOutput test file
diff --git a/Tests/RunCMake/File_Configure/NewLineStyle-NoArg-result.txt b/Tests/RunCMake/File_Configure/NewLineStyle-NoArg-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/File_Configure/NewLineStyle-NoArg-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/File_Configure/NewLineStyle-NoArg-stderr.txt b/Tests/RunCMake/File_Configure/NewLineStyle-NoArg-stderr.txt
new file mode 100644
index 0000000..5a8ed2c
--- /dev/null
+++ b/Tests/RunCMake/File_Configure/NewLineStyle-NoArg-stderr.txt
@@ -0,0 +1,5 @@
+CMake Error at NewLineStyle-NoArg.cmake:[0-9]+ \(file\):
+ file CONFIGURE NEWLINE_STYLE must set a style: LF, CRLF, UNIX, DOS, or
+ WIN32
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/File_Configure/NewLineStyle-NoArg.cmake b/Tests/RunCMake/File_Configure/NewLineStyle-NoArg.cmake
new file mode 100644
index 0000000..d6738b4
--- /dev/null
+++ b/Tests/RunCMake/File_Configure/NewLineStyle-NoArg.cmake
@@ -0,0 +1,6 @@
+set(file_name ${CMAKE_CURRENT_BINARY_DIR}/NewLineStyle.txt)
+file(CONFIGURE
+ OUTPUT ${file_name}
+ CONTENT "Data\n"
+ NEWLINE_STYLE
+)
diff --git a/Tests/RunCMake/File_Configure/NewLineStyle-ValidArg.cmake b/Tests/RunCMake/File_Configure/NewLineStyle-ValidArg.cmake
new file mode 100644
index 0000000..e384873
--- /dev/null
+++ b/Tests/RunCMake/File_Configure/NewLineStyle-ValidArg.cmake
@@ -0,0 +1,20 @@
+set(file_name ${CMAKE_CURRENT_BINARY_DIR}/NewLineStyle.txt)
+
+function(test_eol style in out)
+ file(CONFIGURE
+ OUTPUT ${file_name}
+ CONTENT "@in@"
+ NEWLINE_STYLE ${style}
+ )
+ file(READ ${file_name} new HEX)
+ if(NOT "${new}" STREQUAL "${out}")
+ message(FATAL_ERROR "No ${style} line endings")
+ endif()
+endfunction()
+
+test_eol(DOS "a" "610d0a")
+test_eol(WIN32 "b" "620d0a")
+test_eol(CRLF "c" "630d0a")
+
+test_eol(UNIX "d" "640a")
+test_eol(LF "e" "650a")
diff --git a/Tests/RunCMake/File_Configure/NewLineStyle-WrongArg-result.txt b/Tests/RunCMake/File_Configure/NewLineStyle-WrongArg-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/File_Configure/NewLineStyle-WrongArg-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/File_Configure/NewLineStyle-WrongArg-stderr.txt b/Tests/RunCMake/File_Configure/NewLineStyle-WrongArg-stderr.txt
new file mode 100644
index 0000000..c1bb42c
--- /dev/null
+++ b/Tests/RunCMake/File_Configure/NewLineStyle-WrongArg-stderr.txt
@@ -0,0 +1,5 @@
+CMake Error at NewLineStyle-WrongArg.cmake:[0-9]+ \(file\):
+ file CONFIGURE NEWLINE_STYLE sets an unknown style, only LF, CRLF, UNIX,
+ DOS, and WIN32 are supported
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/File_Configure/NewLineStyle-WrongArg.cmake b/Tests/RunCMake/File_Configure/NewLineStyle-WrongArg.cmake
new file mode 100644
index 0000000..7d38167
--- /dev/null
+++ b/Tests/RunCMake/File_Configure/NewLineStyle-WrongArg.cmake
@@ -0,0 +1,6 @@
+set(file_name ${CMAKE_CURRENT_BINARY_DIR}/NewLineStyle.txt)
+file(CONFIGURE
+ OUTPUT ${file_name}
+ CONTENT "Data\n"
+ NEWLINE_STYLE FOO
+)
diff --git a/Tests/RunCMake/File_Configure/RunCMakeTest.cmake b/Tests/RunCMake/File_Configure/RunCMakeTest.cmake
new file mode 100644
index 0000000..d09d648
--- /dev/null
+++ b/Tests/RunCMake/File_Configure/RunCMakeTest.cmake
@@ -0,0 +1,9 @@
+include(RunCMake)
+
+run_cmake(BadArg)
+run_cmake(BadArgGeneratorExpressionContent)
+run_cmake(BadArgGeneratorExpressionOutput)
+run_cmake(DirOutput)
+run_cmake(NewLineStyle-NoArg)
+run_cmake(NewLineStyle-ValidArg)
+run_cmake(NewLineStyle-WrongArg)
diff --git a/Tests/RunCMake/File_Generate/CMP0070-OLD-stderr.txt b/Tests/RunCMake/File_Generate/CMP0070-OLD-stderr.txt
new file mode 100644
index 0000000..bb578e5
--- /dev/null
+++ b/Tests/RunCMake/File_Generate/CMP0070-OLD-stderr.txt
@@ -0,0 +1,10 @@
+^CMake Deprecation Warning at CMP0070-OLD.cmake:[0-9]+ \(cmake_policy\):
+ The OLD behavior for policy CMP0070 will be removed from a future version
+ of CMake.
+
+ The cmake-policies\(7\) manual explains that the OLD behaviors of all
+ policies are deprecated and that a policy should be set to OLD only under
+ specific short-term circumstances. Projects should be ported to the NEW
+ behavior and not rely on setting a policy to OLD.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:[0-9]+ \(include\)$
diff --git a/Tests/RunCMake/FindPkgConfig/FindPkgConfig_CMAKE_APPBUNDLE_PATH.cmake b/Tests/RunCMake/FindPkgConfig/FindPkgConfig_CMAKE_APPBUNDLE_PATH.cmake
index 2687efe..bf8cd4e 100644
--- a/Tests/RunCMake/FindPkgConfig/FindPkgConfig_CMAKE_APPBUNDLE_PATH.cmake
+++ b/Tests/RunCMake/FindPkgConfig/FindPkgConfig_CMAKE_APPBUNDLE_PATH.cmake
@@ -4,53 +4,13 @@ enable_language(C)
# Prepare environment and variables
set(PKG_CONFIG_USE_CMAKE_PREFIX_PATH TRUE)
set(CMAKE_APPBUNDLE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/pc-foo")
-if(WIN32)
- set(PKG_CONFIG_EXECUTABLE "${CMAKE_CURRENT_SOURCE_DIR}\\dummy-pkg-config.bat")
- set(ENV{CMAKE_APPBUNDLE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}\\pc-bar;X:\\this\\directory\\should\\not\\exist\\in\\the\\filesystem")
- set(ENV{PKG_CONFIG_PATH} "C:\\baz")
-else()
- set(PKG_CONFIG_EXECUTABLE "${CMAKE_CURRENT_SOURCE_DIR}/dummy-pkg-config.sh")
- set(ENV{CMAKE_APPBUNDLE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/pc-bar:/this/directory/should/not/exist/in/the/filesystem")
- set(ENV{PKG_CONFIG_PATH} "/baz")
-endif()
-
+set(PKG_CONFIG_EXECUTABLE "${CMAKE_CURRENT_SOURCE_DIR}/dummy-pkg-config.sh")
+set(ENV{CMAKE_APPBUNDLE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/pc-bar:/this/directory/should/not/exist/in/the/filesystem")
+set(ENV{PKG_CONFIG_PATH} "/baz")
find_package(PkgConfig)
-
-if(NOT DEFINED CMAKE_SYSTEM_NAME
- OR (CMAKE_SYSTEM_NAME MATCHES "^(Linux|kFreeBSD|GNU)$"
- AND NOT CMAKE_CROSSCOMPILING))
- if(EXISTS "/etc/debian_version") # is this a debian system ?
- if(CMAKE_LIBRARY_ARCHITECTURE MATCHES "^(i386-linux-gnu|x86_64-linux-gnu)$")
- # Cannot create directories for all the existing architectures...
- set(expected_path "/baz:${CMAKE_CURRENT_SOURCE_DIR}/pc-foo/lib/${CMAKE_LIBRARY_ARCHITECTURE}/pkgconfig:${CMAKE_CURRENT_SOURCE_DIR}/pc-foo/lib/pkgconfig:${CMAKE_CURRENT_SOURCE_DIR}/pc-bar/lib/${CMAKE_LIBRARY_ARCHITECTURE}/pkgconfig:${CMAKE_CURRENT_SOURCE_DIR}/pc-bar/lib/pkgconfig")
- else()
- set(expected_path "/baz:${CMAKE_CURRENT_SOURCE_DIR}/pc-foo/lib/pkgconfig:${CMAKE_CURRENT_SOURCE_DIR}/pc-bar/lib/pkgconfig")
- endif()
- else()
- # not debian, check the FIND_LIBRARY_USE_LIB32_PATHS and FIND_LIBRARY_USE_LIB64_PATHS properties
- get_property(uselibx32 GLOBAL PROPERTY FIND_LIBRARY_USE_LIBX32_PATHS)
- get_property(uselib32 GLOBAL PROPERTY FIND_LIBRARY_USE_LIB32_PATHS)
- get_property(uselib64 GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS)
- if(uselibx32 AND CMAKE_INTERNAL_PLATFORM_ABI STREQUAL "ELF X32")
- set(expected_path "/baz:${CMAKE_CURRENT_SOURCE_DIR}/pc-foo/libx32/pkgconfig:${CMAKE_CURRENT_SOURCE_DIR}/pc-foo/lib/pkgconfig:${CMAKE_CURRENT_SOURCE_DIR}/pc-bar/libx32/pkgconfig:${CMAKE_CURRENT_SOURCE_DIR}/pc-bar/lib/pkgconfig")
- elseif(uselib32 AND CMAKE_SIZEOF_VOID_P EQUAL 4)
- set(expected_path "/baz:${CMAKE_CURRENT_SOURCE_DIR}/pc-foo/lib32/pkgconfig:${CMAKE_CURRENT_SOURCE_DIR}/pc-foo/lib/pkgconfig:${CMAKE_CURRENT_SOURCE_DIR}/pc-bar/lib32/pkgconfig:${CMAKE_CURRENT_SOURCE_DIR}/pc-bar/lib/pkgconfig")
- elseif(uselib64 AND CMAKE_SIZEOF_VOID_P EQUAL 8)
- set(expected_path "/baz:${CMAKE_CURRENT_SOURCE_DIR}/pc-foo/lib64/pkgconfig:${CMAKE_CURRENT_SOURCE_DIR}/pc-foo/lib/pkgconfig:${CMAKE_CURRENT_SOURCE_DIR}/pc-bar/lib64/pkgconfig:${CMAKE_CURRENT_SOURCE_DIR}/pc-bar/lib/pkgconfig")
- else()
- set(expected_path "/baz:${CMAKE_CURRENT_SOURCE_DIR}/pc-foo/lib/pkgconfig:${CMAKE_CURRENT_SOURCE_DIR}/pc-bar/lib/pkgconfig")
- endif()
- endif()
-else()
- if(WIN32)
- set(expected_path "C:\\baz;${CMAKE_CURRENT_SOURCE_DIR}\\pc-foo\\lib\\pkgconfig;${CMAKE_CURRENT_SOURCE_DIR}\\pc-bar\\lib\\pkgconfig")
- else()
- set(expected_path "/baz:${CMAKE_CURRENT_SOURCE_DIR}/pc-foo/lib/pkgconfig:${CMAKE_CURRENT_SOURCE_DIR}/pc-bar/lib/pkgconfig")
- endif()
-endif()
-
+set(expected_path "/baz:${CMAKE_CURRENT_SOURCE_DIR}/pc-foo/lib/pkgconfig:${CMAKE_CURRENT_SOURCE_DIR}/pc-bar/lib/pkgconfig")
pkg_check_modules(FOO "${expected_path}")
diff --git a/Tests/RunCMake/FindPkgConfig/FindPkgConfig_CMAKE_FRAMEWORK_PATH.cmake b/Tests/RunCMake/FindPkgConfig/FindPkgConfig_CMAKE_FRAMEWORK_PATH.cmake
index 74cda25..37c18fc 100644
--- a/Tests/RunCMake/FindPkgConfig/FindPkgConfig_CMAKE_FRAMEWORK_PATH.cmake
+++ b/Tests/RunCMake/FindPkgConfig/FindPkgConfig_CMAKE_FRAMEWORK_PATH.cmake
@@ -4,53 +4,13 @@ enable_language(C)
# Prepare environment and variables
set(PKG_CONFIG_USE_CMAKE_PREFIX_PATH TRUE)
set(CMAKE_FRAMEWORK_PATH "${CMAKE_CURRENT_SOURCE_DIR}/pc-foo")
-if(WIN32)
- set(PKG_CONFIG_EXECUTABLE "${CMAKE_CURRENT_SOURCE_DIR}\\dummy-pkg-config.bat")
- set(ENV{CMAKE_FRAMEWORK_PATH} "${CMAKE_CURRENT_SOURCE_DIR}\\pc-bar;X:\\this\\directory\\should\\not\\exist\\in\\the\\filesystem")
- set(ENV{PKG_CONFIG_PATH} "C:\\baz")
-else()
- set(PKG_CONFIG_EXECUTABLE "${CMAKE_CURRENT_SOURCE_DIR}/dummy-pkg-config.sh")
- set(ENV{CMAKE_FRAMEWORK_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/pc-bar:/this/directory/should/not/exist/in/the/filesystem")
- set(ENV{PKG_CONFIG_PATH} "/baz")
-endif()
-
+set(PKG_CONFIG_EXECUTABLE "${CMAKE_CURRENT_SOURCE_DIR}/dummy-pkg-config.sh")
+set(ENV{CMAKE_FRAMEWORK_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/pc-bar:/this/directory/should/not/exist/in/the/filesystem")
+set(ENV{PKG_CONFIG_PATH} "/baz")
find_package(PkgConfig)
-
-if(NOT DEFINED CMAKE_SYSTEM_NAME
- OR (CMAKE_SYSTEM_NAME MATCHES "^(Linux|kFreeBSD|GNU)$"
- AND NOT CMAKE_CROSSCOMPILING))
- if(EXISTS "/etc/debian_version") # is this a debian system ?
- if(CMAKE_LIBRARY_ARCHITECTURE MATCHES "^(i386-linux-gnu|x86_64-linux-gnu)$")
- # Cannot create directories for all the existing architectures...
- set(expected_path "/baz:${CMAKE_CURRENT_SOURCE_DIR}/pc-foo/lib/${CMAKE_LIBRARY_ARCHITECTURE}/pkgconfig:${CMAKE_CURRENT_SOURCE_DIR}/pc-foo/lib/pkgconfig:${CMAKE_CURRENT_SOURCE_DIR}/pc-bar/lib/${CMAKE_LIBRARY_ARCHITECTURE}/pkgconfig:${CMAKE_CURRENT_SOURCE_DIR}/pc-bar/lib/pkgconfig")
- else()
- set(expected_path "/baz:${CMAKE_CURRENT_SOURCE_DIR}/pc-foo/lib/pkgconfig:${CMAKE_CURRENT_SOURCE_DIR}/pc-bar/lib/pkgconfig")
- endif()
- else()
- # not debian, check the FIND_LIBRARY_USE_LIB64_PATHS and FIND_LIBRARY_USE_LIB64_PATHS properties
- get_property(uselibx32 GLOBAL PROPERTY FIND_LIBRARY_USE_LIBX32_PATHS)
- get_property(uselib32 GLOBAL PROPERTY FIND_LIBRARY_USE_LIB32_PATHS)
- get_property(uselib64 GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS)
- if(uselibx32 AND CMAKE_INTERNAL_PLATFORM_ABI STREQUAL "ELF X32")
- set(expected_path "/baz:${CMAKE_CURRENT_SOURCE_DIR}/pc-foo/libx32/pkgconfig:${CMAKE_CURRENT_SOURCE_DIR}/pc-foo/lib/pkgconfig:${CMAKE_CURRENT_SOURCE_DIR}/pc-bar/libx32/pkgconfig:${CMAKE_CURRENT_SOURCE_DIR}/pc-bar/lib/pkgconfig")
- elseif(uselib32 AND CMAKE_SIZEOF_VOID_P EQUAL 4)
- set(expected_path "/baz:${CMAKE_CURRENT_SOURCE_DIR}/pc-foo/lib32/pkgconfig:${CMAKE_CURRENT_SOURCE_DIR}/pc-foo/lib/pkgconfig:${CMAKE_CURRENT_SOURCE_DIR}/pc-bar/lib32/pkgconfig:${CMAKE_CURRENT_SOURCE_DIR}/pc-bar/lib/pkgconfig")
- elseif(uselib64 AND CMAKE_SIZEOF_VOID_P EQUAL 8)
- set(expected_path "/baz:${CMAKE_CURRENT_SOURCE_DIR}/pc-foo/lib64/pkgconfig:${CMAKE_CURRENT_SOURCE_DIR}/pc-foo/lib/pkgconfig:${CMAKE_CURRENT_SOURCE_DIR}/pc-bar/lib64/pkgconfig:${CMAKE_CURRENT_SOURCE_DIR}/pc-bar/lib/pkgconfig")
- else()
- set(expected_path "/baz:${CMAKE_CURRENT_SOURCE_DIR}/pc-foo/lib/pkgconfig:${CMAKE_CURRENT_SOURCE_DIR}/pc-bar/lib/pkgconfig")
- endif()
- endif()
-else()
- if(WIN32)
- set(expected_path "C:\\baz;${CMAKE_CURRENT_SOURCE_DIR}\\pc-foo\\lib\\pkgconfig;${CMAKE_CURRENT_SOURCE_DIR}\\pc-bar\\lib\\pkgconfig")
- else()
- set(expected_path "/baz:${CMAKE_CURRENT_SOURCE_DIR}/pc-foo/lib/pkgconfig:${CMAKE_CURRENT_SOURCE_DIR}/pc-bar/lib/pkgconfig")
- endif()
-endif()
-
+set(expected_path "/baz:${CMAKE_CURRENT_SOURCE_DIR}/pc-foo/lib/pkgconfig:${CMAKE_CURRENT_SOURCE_DIR}/pc-bar/lib/pkgconfig")
pkg_check_modules(FOO "${expected_path}")
diff --git a/Tests/RunCMake/FindPkgConfig/FindPkgConfig_extract_frameworks.cmake b/Tests/RunCMake/FindPkgConfig/FindPkgConfig_extract_frameworks.cmake
new file mode 100644
index 0000000..fde886d
--- /dev/null
+++ b/Tests/RunCMake/FindPkgConfig/FindPkgConfig_extract_frameworks.cmake
@@ -0,0 +1,13 @@
+find_package(PkgConfig)
+
+set(foobar_LDFLAGS_OTHER "-Wl,xy;-framework;bar;-Wl,other-framework;-framework;baz;-Wl,abc;-framework;gosh;-frameworkcrap;-frame;j;-framework;nix;-Wl,def")
+set(foobar_LIBRARIES "-lz;-lm")
+
+_pkgconfig_extract_frameworks("foobar")
+
+if (NOT foobar_LDFLAGS_OTHER STREQUAL "-Wl,xy;-Wl,other-framework;-Wl,abc;-frameworkcrap;-frame;j;-Wl,def")
+ message(SEND_ERROR "foobar_LDFLAGS_OTHER did not match: ${foobar_LDFLAGS_OTHER}")
+endif ()
+if (NOT foobar_LIBRARIES STREQUAL "-lz;-lm;-framework bar;-framework baz;-framework gosh;-framework nix")
+ message(SEND_ERROR "foobar_LIBRARIES did not match: ${foobar_LIBRARIES}")
+endif ()
diff --git a/Tests/RunCMake/FindPkgConfig/FindPkgConfig_extract_frameworks_target.cmake b/Tests/RunCMake/FindPkgConfig/FindPkgConfig_extract_frameworks_target.cmake
new file mode 100644
index 0000000..5501d9f
--- /dev/null
+++ b/Tests/RunCMake/FindPkgConfig/FindPkgConfig_extract_frameworks_target.cmake
@@ -0,0 +1,29 @@
+# Prepare environment to reuse bletch.pc
+file(TO_NATIVE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/pc-bletch/lib/pkgconfig" PC_PATH)
+if(UNIX)
+ string(REPLACE "\\ " " " PC_PATH "${PC_PATH}")
+endif()
+set(ENV{PKG_CONFIG_PATH} "${PC_PATH}")
+
+find_package(PkgConfig REQUIRED)
+pkg_check_modules(Bletch IMPORTED_TARGET REQUIRED bletch-framework)
+
+if (Bletch_LDFLAGS_OTHER)
+ message(SEND_ERROR "Bletch_LDFLAGS_OTHER should be empty, but is '${Bletch_LDFLAGS_OTHER}'")
+endif ()
+
+if (NOT Bletch_LINK_LIBRARIES STREQUAL "-framework foo;-framework bar;bletch;-framework baz")
+ message(SEND_ERROR "Bletch_LINK_LIBRARIES has wrong value '${Bletch_LINK_LIBRARIES}'")
+endif ()
+
+foreach (prop IN ITEMS INTERFACE_INCLUDE_DIRECTORIES INTERFACE_LINK_OPTIONS INTERFACE_COMPILE_OPTIONS)
+ get_target_property(prop_value PkgConfig::Bletch ${prop})
+ if (prop_value)
+ message(SEND_ERROR "target property ${prop} should not be set, but is '${prop_value}'")
+ endif ()
+endforeach ()
+
+get_target_property(prop_value PkgConfig::Bletch INTERFACE_LINK_LIBRARIES)
+if (NOT prop_value STREQUAL Bletch_LINK_LIBRARIES)
+ message(SEND_ERROR "target property INTERFACE_LINK_LIBRARIES has wrong value '${prop_value}'")
+endif ()
diff --git a/Tests/RunCMake/FindPkgConfig/PkgConfigDoesNotExist-stdout.txt b/Tests/RunCMake/FindPkgConfig/PkgConfigDoesNotExist-stdout.txt
new file mode 100644
index 0000000..ef5f7f6
--- /dev/null
+++ b/Tests/RunCMake/FindPkgConfig/PkgConfigDoesNotExist-stdout.txt
@@ -0,0 +1,6 @@
+-- Could NOT find PkgConfig \(missing: PKG_CONFIG_EXECUTABLE\) *
+ Reason given by package: The command
+ "pkg-config-does-not-exist" --version
+ failed with output.*
+-- PKG_CONFIG_FOUND='FALSE'
+-- PKG_CONFIG_EXECUTABLE=''
diff --git a/Tests/RunCMake/FindPkgConfig/PkgConfigDoesNotExist.cmake b/Tests/RunCMake/FindPkgConfig/PkgConfigDoesNotExist.cmake
new file mode 100644
index 0000000..a4fabde
--- /dev/null
+++ b/Tests/RunCMake/FindPkgConfig/PkgConfigDoesNotExist.cmake
@@ -0,0 +1,4 @@
+set(PKG_CONFIG_EXECUTABLE "pkg-config-does-not-exist" CACHE FILEPATH "")
+find_package(PkgConfig)
+message(STATUS "PKG_CONFIG_FOUND='${PKG_CONFIG_FOUND}'")
+message(STATUS "PKG_CONFIG_EXECUTABLE='${PKG_CONFIG_EXECUTABLE}'")
diff --git a/Tests/RunCMake/FindPkgConfig/RunCMakeTest.cmake b/Tests/RunCMake/FindPkgConfig/RunCMakeTest.cmake
index b77bb54..dc77915 100644
--- a/Tests/RunCMake/FindPkgConfig/RunCMakeTest.cmake
+++ b/Tests/RunCMake/FindPkgConfig/RunCMakeTest.cmake
@@ -1,11 +1,15 @@
include(RunCMake)
+run_cmake(PkgConfigDoesNotExist)
+
run_cmake(FindPkgConfig_NO_PKGCONFIG_PATH)
run_cmake(FindPkgConfig_PKGCONFIG_PATH)
run_cmake(FindPkgConfig_PKGCONFIG_PATH_NO_CMAKE_PATH)
run_cmake(FindPkgConfig_PKGCONFIG_PATH_NO_CMAKE_ENVIRONMENT_PATH)
+run_cmake(FindPkgConfig_extract_frameworks)
if(APPLE)
+ run_cmake(FindPkgConfig_extract_frameworks_target)
run_cmake(FindPkgConfig_CMAKE_FRAMEWORK_PATH)
run_cmake(FindPkgConfig_CMAKE_APPBUNDLE_PATH)
endif()
diff --git a/Tests/RunCMake/FindPkgConfig/pc-bletch/lib/pkgconfig/bletch-framework.pc b/Tests/RunCMake/FindPkgConfig/pc-bletch/lib/pkgconfig/bletch-framework.pc
new file mode 100644
index 0000000..cc680ae
--- /dev/null
+++ b/Tests/RunCMake/FindPkgConfig/pc-bletch/lib/pkgconfig/bletch-framework.pc
@@ -0,0 +1,9 @@
+prefix=/opt/bletch
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib
+includedir=${prefix}/include
+
+Name: Bletch
+Description: Dummy packaget to test variable support
+Version: 1.3
+Libs: -L${libdir} -framework foo -framework bar -lbletch -framework baz
diff --git a/Tests/RunCMake/FindSWIG/CMakeLists.txt b/Tests/RunCMake/FindSWIG/CMakeLists.txt
new file mode 100644
index 0000000..d1b0d2c
--- /dev/null
+++ b/Tests/RunCMake/FindSWIG/CMakeLists.txt
@@ -0,0 +1,3 @@
+cmake_minimum_required(VERSION 3.10)
+project(${RunCMake_TEST} C)
+include(${RunCMake_TEST}.cmake)
diff --git a/Tests/RunCMake/FindSWIG/RunCMakeTest.cmake b/Tests/RunCMake/FindSWIG/RunCMakeTest.cmake
new file mode 100644
index 0000000..5f5f7f5
--- /dev/null
+++ b/Tests/RunCMake/FindSWIG/RunCMakeTest.cmake
@@ -0,0 +1,4 @@
+include(RunCMake)
+
+run_cmake(components)
+run_cmake(missing-components)
diff --git a/Tests/RunCMake/FindSWIG/components-stdout.txt b/Tests/RunCMake/FindSWIG/components-stdout.txt
new file mode 100644
index 0000000..3977b08
--- /dev/null
+++ b/Tests/RunCMake/FindSWIG/components-stdout.txt
@@ -0,0 +1,6 @@
+-- Found SWIG: [^ ]+ \(found version "[0-9.]+"\) found components: java python missing components: PERL
+-- SWIG_VERSION='[0-9.]+'
+-- SWIG_java_FOUND=TRUE
+-- SWIG_python_FOUND=TRUE
+-- SWIG_PERL_FOUND=
+-- Configuring done
diff --git a/Tests/RunCMake/FindSWIG/components.cmake b/Tests/RunCMake/FindSWIG/components.cmake
new file mode 100644
index 0000000..b79a81e
--- /dev/null
+++ b/Tests/RunCMake/FindSWIG/components.cmake
@@ -0,0 +1,9 @@
+# Note that 'perl' will not be found because it is not lowercase.
+find_package(SWIG REQUIRED
+ COMPONENTS java
+ OPTIONAL_COMPONENTS python PERL)
+
+message(STATUS "SWIG_VERSION='${SWIG_VERSION}'")
+foreach(_lang java python PERL)
+ message(STATUS "SWIG_${_lang}_FOUND=${SWIG_${_lang}_FOUND}")
+endforeach()
diff --git a/Tests/RunCMake/FindSWIG/missing-components-result.txt b/Tests/RunCMake/FindSWIG/missing-components-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/FindSWIG/missing-components-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/FindSWIG/missing-components-stderr.txt b/Tests/RunCMake/FindSWIG/missing-components-stderr.txt
new file mode 100644
index 0000000..c937532
--- /dev/null
+++ b/Tests/RunCMake/FindSWIG/missing-components-stderr.txt
@@ -0,0 +1 @@
+Could NOT find SWIG \(missing: invalid\)
diff --git a/Tests/RunCMake/FindSWIG/missing-components.cmake b/Tests/RunCMake/FindSWIG/missing-components.cmake
new file mode 100644
index 0000000..1d05ae4
--- /dev/null
+++ b/Tests/RunCMake/FindSWIG/missing-components.cmake
@@ -0,0 +1,3 @@
+find_package(SWIG REQUIRED
+ COMPONENTS invalid
+ OPTIONAL_COMPONENTS alsoinvalid)
diff --git a/Tests/RunCMake/Framework/FrameworkMultiConfigPostfix-build-final-check.cmake b/Tests/RunCMake/Framework/FrameworkMultiConfigPostfix-build-final-check.cmake
new file mode 100644
index 0000000..76fe6b8
--- /dev/null
+++ b/Tests/RunCMake/Framework/FrameworkMultiConfigPostfix-build-final-check.cmake
@@ -0,0 +1,45 @@
+include("${RunCMake_TEST_BINARY_DIR}/FrameworkMultiConfigPostfixInfo.cmake")
+
+get_filename_component(framework_location "${framework_dir}" DIRECTORY)
+set(non_existent_debug_framework_dir "${framework_location}/${target_file_name}_debug.framework")
+set(framework_resources "${framework_dir}/Resources")
+set(plist_file "${framework_resources}/Info.plist")
+
+set(symlink_release_path "${framework_dir}/${target_file_name}")
+set(framework_release_path "${framework_dir}/Versions/A/${target_file_name}")
+
+# When using a multi config generator (like Ninja Multi-Config and Xcode),
+# the postfix will be applied to the debug framework library name and the symlink name.
+# For single config generators, the name stays the same as the the release framework.
+if(is_multi_config)
+ set(symlink_debug_path "${framework_dir}/${target_file_name}_debug")
+ set(framework_debug_path "${framework_dir}/Versions/A/${target_file_name}_debug")
+else()
+ set(symlink_debug_path "${framework_dir}/${target_file_name}")
+ set(framework_debug_path "${framework_dir}/Versions/A/${target_file_name}")
+endif()
+
+if(NOT IS_DIRECTORY ${framework_dir})
+ message(SEND_ERROR "Framework dir not found at ${framework_dir}")
+endif()
+
+if(IS_DIRECTORY ${non_existent_debug_framework_dir})
+ message(SEND_ERROR
+ "A framework dir with a debug suffix should not exist at ${non_existent_debug_framework_dir}")
+endif()
+
+if(NOT IS_SYMLINK "${symlink_release_path}")
+ message(SEND_ERROR "Release framework symlink not found at ${symlink_release_path}")
+endif()
+
+if(NOT IS_SYMLINK "${symlink_debug_path}")
+ message(SEND_ERROR "Debug framework symlink not found at ${symlink_debug_path}")
+endif()
+
+if(NOT EXISTS "${framework_release_path}")
+ message(SEND_ERROR "Release framework not found at ${framework_release_path}")
+endif()
+
+if(NOT EXISTS "${framework_debug_path}")
+ message(SEND_ERROR "Debug framework not found at ${framework_debug_path}")
+endif()
diff --git a/Tests/RunCMake/Framework/FrameworkMultiConfigPostfix.cmake b/Tests/RunCMake/Framework/FrameworkMultiConfigPostfix.cmake
new file mode 100644
index 0000000..51e627d
--- /dev/null
+++ b/Tests/RunCMake/Framework/FrameworkMultiConfigPostfix.cmake
@@ -0,0 +1,25 @@
+enable_language(C)
+
+set(CMAKE_FRAMEWORK_MULTI_CONFIG_POSTFIX_DEBUG "_debug")
+
+set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lib)
+set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_CURRENT_BINARY_DIR}/lib)
+set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CMAKE_CURRENT_BINARY_DIR}/lib)
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin)
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_CURRENT_BINARY_DIR}/bin)
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_CURRENT_BINARY_DIR}/bin)
+set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lib)
+set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${CMAKE_CURRENT_BINARY_DIR}/lib)
+set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${CMAKE_CURRENT_BINARY_DIR}/lib)
+
+set(target_name "mylib")
+add_library(${target_name} SHARED foo.c)
+set_property(TARGET ${target_name} PROPERTY FRAMEWORK ON)
+get_property(is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
+
+string(APPEND content
+ "set(is_multi_config \"${is_multi_config}\")\n"
+ "set(framework_dir \"$<TARGET_BUNDLE_DIR:${target_name}>\")\n"
+ "set(target_file_name ${target_name})\n")
+file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/FrameworkMultiConfigPostfixInfo.cmake
+ CONTENT "${content}")
diff --git a/Tests/RunCMake/Framework/RunCMakeTest.cmake b/Tests/RunCMake/Framework/RunCMakeTest.cmake
index 965fbf4..6ee61a3 100644
--- a/Tests/RunCMake/Framework/RunCMakeTest.cmake
+++ b/Tests/RunCMake/Framework/RunCMakeTest.cmake
@@ -45,3 +45,39 @@ framework_type_test(ios SHARED YES)
framework_type_test(ios STATIC YES)
framework_type_test(osx SHARED YES)
framework_type_test(osx STATIC YES)
+
+function(framework_multi_config_postfix_test)
+ set(configure_name "FrameworkMultiConfigPostfix")
+ set(build_name "${configure_name}-build-intermediate")
+ set(build_name_final "${configure_name}-build-final")
+
+ if(RunCMake_GENERATOR MATCHES "Ninja Multi-Config")
+ set(RunCMake_TEST_OPTIONS
+ "-DCMAKE_CONFIGURATION_TYPES=Debug\\;Release;-DCMAKE_CROSS_CONFIGS=all")
+ elseif(RunCMake_GENERATOR MATCHES "Xcode")
+ set(RunCMake_TEST_OPTIONS
+ "-DCMAKE_CONFIGURATION_TYPES=Debug\\;Release")
+ else()
+ set(RunCMake_TEST_OPTIONS "-DCMAKE_BUILD_TYPE=Debug")
+ endif()
+
+ set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${configure_name})
+ set(RunCMake_TEST_NO_CLEAN 1)
+
+ file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
+ file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
+ run_cmake(${configure_name})
+ unset(RunCMake_TEST_OPTIONS)
+
+ if(RunCMake_GENERATOR MATCHES "Ninja Multi-Config")
+ run_cmake_command(${build_name_final} ${CMAKE_COMMAND} --build . --target all:all)
+ elseif(RunCMake_GENERATOR MATCHES "Xcode")
+ run_cmake_command(${build_name} ${CMAKE_COMMAND} --build . --config Release)
+ run_cmake_command(${build_name} ${CMAKE_COMMAND} --build . --config Debug)
+ run_cmake_command(${build_name_final} ${CMAKE_COMMAND} --build . --config Debug)
+ else()
+ run_cmake_command(${build_name_final} ${CMAKE_COMMAND} --build .)
+ endif()
+endfunction()
+
+framework_multi_config_postfix_test()
diff --git a/Tests/RunCMake/GenerateExportHeader/exportheader_test.cpp b/Tests/RunCMake/GenerateExportHeader/exportheader_test.cpp
index ba77679..dcaa4f2 100644
--- a/Tests/RunCMake/GenerateExportHeader/exportheader_test.cpp
+++ b/Tests/RunCMake/GenerateExportHeader/exportheader_test.cpp
@@ -32,14 +32,14 @@ void compare(const char* refName, const char* testName)
// trailing null to the string that we need to strip before testing for a
// trailing space.
if (refLine.size() && refLine[refLine.size() - 1] == 0) {
- refLine = refLine.substr(0, refLine.size() - 1);
+ refLine.resize(refLine.size() - 1);
}
if (testLine.size() && testLine[testLine.size() - 1] == 0) {
- testLine = testLine.substr(0, testLine.size() - 1);
+ testLine.resize(testLine.size() - 1);
}
// The reference files never have trailing spaces:
if (testLine.size() && testLine[testLine.size() - 1] == ' ') {
- testLine = testLine.substr(0, testLine.size() - 1);
+ testLine.resize(testLine.size() - 1);
}
if (refLine != testLine) {
std::cout << "Ref and test are not the same:\n Ref: \"" << refLine
diff --git a/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_custom_command-result.txt b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_custom_command-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_custom_command-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_custom_command-stderr.txt b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_custom_command-stderr.txt
new file mode 100644
index 0000000..eb15834
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_custom_command-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at DEVICE_LINK-add_custom_command.cmake:[0-9]+ \(add_custom_command\):
+ Error evaluating generator expression:
+
+ \$<DEVICE_LINK>
+
+ \$<DEVICE_LINK:...> may only be used with binary targets to specify link
+ options.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:[0-9]+ \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_custom_command.cmake b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_custom_command.cmake
new file mode 100644
index 0000000..01b3784
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_custom_command.cmake
@@ -0,0 +1,4 @@
+add_custom_target(drive)
+add_custom_command(TARGET drive PRE_BUILD
+ COMMAND ${CMAKE_COMMAND} -E echo $<DEVICE_LINK>
+)
diff --git a/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_custom_target-result.txt b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_custom_target-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_custom_target-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_custom_target-stderr.txt b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_custom_target-stderr.txt
new file mode 100644
index 0000000..cdd3043
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_custom_target-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at DEVICE_LINK-add_custom_target.cmake:[0-9]+ \(add_custom_target\):
+ Error evaluating generator expression:
+
+ \$<DEVICE_LINK>
+
+ \$<DEVICE_LINK:...> may only be used with binary targets to specify link
+ options.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:[0-9]+ \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_custom_target.cmake b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_custom_target.cmake
new file mode 100644
index 0000000..35728e9
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_custom_target.cmake
@@ -0,0 +1,3 @@
+add_custom_target(drive
+ COMMAND ${CMAKE_COMMAND} -E echo $<DEVICE_LINK>
+)
diff --git a/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_executable-result.txt b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_executable-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_executable-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_executable-stderr.txt b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_executable-stderr.txt
new file mode 100644
index 0000000..56b595c
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_executable-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at DEVICE_LINK-add_executable.cmake:[0-9]+ \(add_executable\):
+ Error evaluating generator expression:
+
+ \$<DEVICE_LINK:empty.c>
+
+ \$<DEVICE_LINK:...> may only be used with binary targets to specify link
+ options.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:[0-9]+ \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_executable.cmake b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_executable.cmake
new file mode 100644
index 0000000..899f8f6
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_executable.cmake
@@ -0,0 +1 @@
+add_executable(empty $<DEVICE_LINK:empty.c>)
diff --git a/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_library-result.txt b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_library-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_library-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_library-stderr.txt b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_library-stderr.txt
new file mode 100644
index 0000000..4477e00
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_library-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at DEVICE_LINK-add_library.cmake:[0-9]+ \(add_library\):
+ Error evaluating generator expression:
+
+ \$<DEVICE_LINK:empty.c>
+
+ \$<DEVICE_LINK:...> may only be used with binary targets to specify link
+ options.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:[0-9]+ \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_library.cmake b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_library.cmake
new file mode 100644
index 0000000..fc8547b
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_library.cmake
@@ -0,0 +1 @@
+add_library(empty $<DEVICE_LINK:empty.c>)
diff --git a/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_test-result.txt b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_test-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_test-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_test-stderr.txt b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_test-stderr.txt
new file mode 100644
index 0000000..99561fe
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_test-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at DEVICE_LINK-add_test.cmake:[0-9]+ \(add_test\):
+ Error evaluating generator expression:
+
+ \$<DEVICE_LINK>
+
+ \$<DEVICE_LINK:...> may only be used with binary targets to specify link
+ options.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:[0-9]+ \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_test.cmake b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_test.cmake
new file mode 100644
index 0000000..87d6ba1
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-add_test.cmake
@@ -0,0 +1,5 @@
+
+include(CTest)
+enable_testing()
+
+add_test(NAME dummy COMMAND ${CMAKE_COMMAND} -E echo $<DEVICE_LINK>)
diff --git a/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-install-result.txt b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-install-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-install-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-install-stderr.txt b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-install-stderr.txt
new file mode 100644
index 0000000..afb3090
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-install-stderr.txt
@@ -0,0 +1,7 @@
+CMake Error:
+ Error evaluating generator expression:
+
+ \$<DEVICE_LINK:empty>
+
+ \$<DEVICE_LINK:...> may only be used with binary targets to specify link
+ options.
diff --git a/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-install.cmake b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-install.cmake
new file mode 100644
index 0000000..4b6dbef
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-install.cmake
@@ -0,0 +1,5 @@
+
+install(FILES
+ $<DEVICE_LINK:empty>
+ DESTINATION src
+)
diff --git a/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-link_depends-result.txt b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-link_depends-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-link_depends-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-link_depends-stderr.txt b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-link_depends-stderr.txt
new file mode 100644
index 0000000..4fa0522
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-link_depends-stderr.txt
@@ -0,0 +1,7 @@
+CMake Error:
+ Error evaluating generator expression:
+
+ \$<DEVICE_LINK:lib>
+
+ \$<DEVICE_LINK:...> may only be used with binary targets to specify link
+ options.
diff --git a/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-link_depends.cmake b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-link_depends.cmake
new file mode 100644
index 0000000..8129514
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-link_depends.cmake
@@ -0,0 +1,7 @@
+
+enable_language(C)
+
+add_library(lib empty.c)
+
+add_executable(empty empty.c)
+set_property(TARGET empty PROPERTY LINK_DEPENDS $<DEVICE_LINK:lib>)
diff --git a/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_compile_definitions-result.txt b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_compile_definitions-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_compile_definitions-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_compile_definitions-stderr.txt b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_compile_definitions-stderr.txt
new file mode 100644
index 0000000..c0185e3
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_compile_definitions-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at DEVICE_LINK-target_compile_definitions.cmake:[0-9]+ \(target_compile_definitions\):
+ Error evaluating generator expression:
+
+ \$<DEVICE_LINK:DEF>
+
+ \$<DEVICE_LINK:...> may only be used with binary targets to specify link
+ options.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_compile_definitions.cmake b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_compile_definitions.cmake
new file mode 100644
index 0000000..aaa8efc
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_compile_definitions.cmake
@@ -0,0 +1,4 @@
+
+enable_language(C)
+add_executable(empty empty.c)
+target_compile_definitions(empty PRIVATE $<DEVICE_LINK:DEF>)
diff --git a/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_compile_options-result.txt b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_compile_options-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_compile_options-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_compile_options-stderr.txt b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_compile_options-stderr.txt
new file mode 100644
index 0000000..34ca4f2
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_compile_options-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at DEVICE_LINK-target_compile_options.cmake:[0-9]+ \(target_compile_options\):
+ Error evaluating generator expression:
+
+ \$<DEVICE_LINK:-OPT>
+
+ \$<DEVICE_LINK:...> may only be used with binary targets to specify link
+ options.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:[0-9]+ \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_compile_options.cmake b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_compile_options.cmake
new file mode 100644
index 0000000..a9cb7fd
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_compile_options.cmake
@@ -0,0 +1,4 @@
+
+enable_language(C)
+add_executable(empty empty.c)
+target_compile_options(empty PRIVATE $<DEVICE_LINK:-OPT>)
diff --git a/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_include_directories-result.txt b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_include_directories-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_include_directories-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_include_directories-stderr.txt b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_include_directories-stderr.txt
new file mode 100644
index 0000000..4d1642d
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_include_directories-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at DEVICE_LINK-target_include_directories.cmake:[0-9]+ \(target_include_directories\):
+ Error evaluating generator expression:
+
+ \$<DEVICE_LINK:/DIR>
+
+ \$<DEVICE_LINK:...> may only be used with binary targets to specify link
+ options.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:[0-9]+ \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_include_directories.cmake b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_include_directories.cmake
new file mode 100644
index 0000000..03cc413
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_include_directories.cmake
@@ -0,0 +1,4 @@
+
+enable_language(C)
+add_executable(empty empty.c)
+target_include_directories(empty PRIVATE $<DEVICE_LINK:/DIR>)
diff --git a/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_link_directories-result.txt b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_link_directories-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_link_directories-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_link_directories-stderr.txt b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_link_directories-stderr.txt
new file mode 100644
index 0000000..d924916
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_link_directories-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at DEVICE_LINK-target_link_directories.cmake:[0-9]+ \(target_link_directories\):
+ Error evaluating generator expression:
+
+ \$<DEVICE_LINK:/DIR>
+
+ \$<DEVICE_LINK:...> may only be used with binary targets to specify link
+ options.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:[0-9]+ \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_link_directories.cmake b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_link_directories.cmake
new file mode 100644
index 0000000..e50d27d
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_link_directories.cmake
@@ -0,0 +1,7 @@
+
+enable_language(C)
+
+add_library(lib empty.c)
+
+add_executable(empty empty.c)
+target_link_directories(empty PRIVATE $<DEVICE_LINK:/DIR>)
diff --git a/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_link_libraries-result.txt b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_link_libraries-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_link_libraries-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_link_libraries-stderr.txt b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_link_libraries-stderr.txt
new file mode 100644
index 0000000..1436fa8
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_link_libraries-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at DEVICE_LINK-target_link_libraries.cmake:[0-9]+ \(target_link_libraries\):
+ Error evaluating generator expression:
+
+ \$<DEVICE_LINK:lib>
+
+ \$<DEVICE_LINK:...> may only be used with binary targets to specify link
+ options.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:[0-9]+ \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_link_libraries.cmake b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_link_libraries.cmake
new file mode 100644
index 0000000..971f562
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_link_libraries.cmake
@@ -0,0 +1,7 @@
+
+enable_language(C)
+
+add_library(lib empty.c)
+
+add_executable(empty empty.c)
+target_link_libraries(empty PRIVATE $<DEVICE_LINK:lib>)
diff --git a/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_sources-result.txt b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_sources-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_sources-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_sources-stderr.txt b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_sources-stderr.txt
new file mode 100644
index 0000000..c9b602d
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_sources-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at DEVICE_LINK-target_sources.cmake:[0-9]+ \(target_sources\):
+ Error evaluating generator expression:
+
+ \$<DEVICE_LINK:empty.c>
+
+ \$<DEVICE_LINK:...> may only be used with binary targets to specify link
+ options.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:[0-9]+ \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_sources.cmake b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_sources.cmake
new file mode 100644
index 0000000..94bac9e
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/DEVICE_LINK-target_sources.cmake
@@ -0,0 +1,2 @@
+add_library(empty)
+target_sources(empty PRIVATE $<DEVICE_LINK:empty.c>)
diff --git a/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_custom_command-result.txt b/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_custom_command-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_custom_command-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_custom_command-stderr.txt b/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_custom_command-stderr.txt
new file mode 100644
index 0000000..5ad41b9
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_custom_command-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at HOST_LINK-add_custom_command.cmake:[0-9]+ \(add_custom_command\):
+ Error evaluating generator expression:
+
+ \$<HOST_LINK>
+
+ \$<HOST_LINK:...> may only be used with binary targets to specify link
+ options.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:[0-9]+ \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_custom_command.cmake b/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_custom_command.cmake
new file mode 100644
index 0000000..4d6e305
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_custom_command.cmake
@@ -0,0 +1,4 @@
+add_custom_target(drive)
+add_custom_command(TARGET drive PRE_BUILD
+ COMMAND ${CMAKE_COMMAND} -E echo $<HOST_LINK>
+)
diff --git a/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_custom_target-result.txt b/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_custom_target-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_custom_target-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_custom_target-stderr.txt b/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_custom_target-stderr.txt
new file mode 100644
index 0000000..c44202a
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_custom_target-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at HOST_LINK-add_custom_target.cmake:[0-9]+ \(add_custom_target\):
+ Error evaluating generator expression:
+
+ \$<HOST_LINK>
+
+ \$<HOST_LINK:...> may only be used with binary targets to specify link
+ options.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:[0-9]+ \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_custom_target.cmake b/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_custom_target.cmake
new file mode 100644
index 0000000..eec072a
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_custom_target.cmake
@@ -0,0 +1,3 @@
+add_custom_target(drive
+ COMMAND ${CMAKE_COMMAND} -E echo $<HOST_LINK>
+)
diff --git a/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_executable-result.txt b/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_executable-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_executable-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_executable-stderr.txt b/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_executable-stderr.txt
new file mode 100644
index 0000000..b395515
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_executable-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at HOST_LINK-add_executable.cmake:[0-9]+ \(add_executable\):
+ Error evaluating generator expression:
+
+ \$<HOST_LINK:empty.c>
+
+ \$<HOST_LINK:...> may only be used with binary targets to specify link
+ options.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:[0-9]+ \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_executable.cmake b/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_executable.cmake
new file mode 100644
index 0000000..c9f74a5
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_executable.cmake
@@ -0,0 +1 @@
+add_executable(empty $<HOST_LINK:empty.c>)
diff --git a/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_library-result.txt b/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_library-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_library-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_library-stderr.txt b/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_library-stderr.txt
new file mode 100644
index 0000000..4bd27be
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_library-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at HOST_LINK-add_library.cmake:[0-9]+ \(add_library\):
+ Error evaluating generator expression:
+
+ \$<HOST_LINK:empty.c>
+
+ \$<HOST_LINK:...> may only be used with binary targets to specify link
+ options.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:[0-9]+ \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_library.cmake b/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_library.cmake
new file mode 100644
index 0000000..44135af
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_library.cmake
@@ -0,0 +1 @@
+add_library(empty $<HOST_LINK:empty.c>)
diff --git a/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_test-result.txt b/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_test-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_test-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_test-stderr.txt b/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_test-stderr.txt
new file mode 100644
index 0000000..012ad21
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_test-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at HOST_LINK-add_test.cmake:[0-9]+ \(add_test\):
+ Error evaluating generator expression:
+
+ \$<HOST_LINK>
+
+ \$<HOST_LINK:...> may only be used with binary targets to specify link
+ options.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:[0-9]+ \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_test.cmake b/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_test.cmake
new file mode 100644
index 0000000..4b472af
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/HOST_LINK-add_test.cmake
@@ -0,0 +1,5 @@
+
+include(CTest)
+enable_testing()
+
+add_test(NAME dummy COMMAND ${CMAKE_COMMAND} -E echo $<HOST_LINK>)
diff --git a/Tests/RunCMake/GeneratorExpression/HOST_LINK-install-result.txt b/Tests/RunCMake/GeneratorExpression/HOST_LINK-install-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/HOST_LINK-install-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/HOST_LINK-install-stderr.txt b/Tests/RunCMake/GeneratorExpression/HOST_LINK-install-stderr.txt
new file mode 100644
index 0000000..c265ec4
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/HOST_LINK-install-stderr.txt
@@ -0,0 +1,7 @@
+CMake Error:
+ Error evaluating generator expression:
+
+ \$<HOST_LINK:empty>
+
+ \$<HOST_LINK:...> may only be used with binary targets to specify link
+ options.
diff --git a/Tests/RunCMake/GeneratorExpression/HOST_LINK-install.cmake b/Tests/RunCMake/GeneratorExpression/HOST_LINK-install.cmake
new file mode 100644
index 0000000..b4dff68
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/HOST_LINK-install.cmake
@@ -0,0 +1,5 @@
+
+install(FILES
+ $<HOST_LINK:empty>
+ DESTINATION src
+)
diff --git a/Tests/RunCMake/GeneratorExpression/HOST_LINK-link_depends-result.txt b/Tests/RunCMake/GeneratorExpression/HOST_LINK-link_depends-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/HOST_LINK-link_depends-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/HOST_LINK-link_depends-stderr.txt b/Tests/RunCMake/GeneratorExpression/HOST_LINK-link_depends-stderr.txt
new file mode 100644
index 0000000..24b8b82
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/HOST_LINK-link_depends-stderr.txt
@@ -0,0 +1,7 @@
+CMake Error:
+ Error evaluating generator expression:
+
+ \$<HOST_LINK:lib>
+
+ \$<HOST_LINK:...> may only be used with binary targets to specify link
+ options.
diff --git a/Tests/RunCMake/GeneratorExpression/HOST_LINK-link_depends.cmake b/Tests/RunCMake/GeneratorExpression/HOST_LINK-link_depends.cmake
new file mode 100644
index 0000000..0402f43
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/HOST_LINK-link_depends.cmake
@@ -0,0 +1,7 @@
+
+enable_language(C)
+
+add_library(lib empty.c)
+
+add_executable(empty empty.c)
+set_property(TARGET empty PROPERTY LINK_DEPENDS $<HOST_LINK:lib>)
diff --git a/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_compile_definitions-result.txt b/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_compile_definitions-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_compile_definitions-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_compile_definitions-stderr.txt b/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_compile_definitions-stderr.txt
new file mode 100644
index 0000000..6ab3c14
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_compile_definitions-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at HOST_LINK-target_compile_definitions.cmake:[0-9]+ \(target_compile_definitions\):
+ Error evaluating generator expression:
+
+ \$<HOST_LINK:DEF>
+
+ \$<HOST_LINK:...> may only be used with binary targets to specify link
+ options.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_compile_definitions.cmake b/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_compile_definitions.cmake
new file mode 100644
index 0000000..f6c130d
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_compile_definitions.cmake
@@ -0,0 +1,4 @@
+
+enable_language(C)
+add_executable(empty empty.c)
+target_compile_definitions(empty PRIVATE $<HOST_LINK:DEF>)
diff --git a/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_compile_options-result.txt b/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_compile_options-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_compile_options-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_compile_options-stderr.txt b/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_compile_options-stderr.txt
new file mode 100644
index 0000000..0f5bbc3
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_compile_options-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at HOST_LINK-target_compile_options.cmake:[0-9]+ \(target_compile_options\):
+ Error evaluating generator expression:
+
+ \$<HOST_LINK:-OPT>
+
+ \$<HOST_LINK:...> may only be used with binary targets to specify link
+ options.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:[0-9]+ \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_compile_options.cmake b/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_compile_options.cmake
new file mode 100644
index 0000000..53afea1
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_compile_options.cmake
@@ -0,0 +1,4 @@
+
+enable_language(C)
+add_executable(empty empty.c)
+target_compile_options(empty PRIVATE $<HOST_LINK:-OPT>)
diff --git a/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_include_directories-result.txt b/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_include_directories-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_include_directories-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_include_directories-stderr.txt b/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_include_directories-stderr.txt
new file mode 100644
index 0000000..9a2634a
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_include_directories-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at HOST_LINK-target_include_directories.cmake:[0-9]+ \(target_include_directories\):
+ Error evaluating generator expression:
+
+ \$<HOST_LINK:/DIR>
+
+ \$<HOST_LINK:...> may only be used with binary targets to specify link
+ options.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:[0-9]+ \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_include_directories.cmake b/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_include_directories.cmake
new file mode 100644
index 0000000..aff1009
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_include_directories.cmake
@@ -0,0 +1,4 @@
+
+enable_language(C)
+add_executable(empty empty.c)
+target_include_directories(empty PRIVATE $<HOST_LINK:/DIR>)
diff --git a/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_link_directories-result.txt b/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_link_directories-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_link_directories-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_link_directories-stderr.txt b/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_link_directories-stderr.txt
new file mode 100644
index 0000000..5225a52
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_link_directories-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at HOST_LINK-target_link_directories.cmake:[0-9]+ \(target_link_directories\):
+ Error evaluating generator expression:
+
+ \$<HOST_LINK:/DIR>
+
+ \$<HOST_LINK:...> may only be used with binary targets to specify link
+ options.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:[0-9]+ \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_link_directories.cmake b/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_link_directories.cmake
new file mode 100644
index 0000000..97488ee
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_link_directories.cmake
@@ -0,0 +1,7 @@
+
+enable_language(C)
+
+add_library(lib empty.c)
+
+add_executable(empty empty.c)
+target_link_directories(empty PRIVATE $<HOST_LINK:/DIR>)
diff --git a/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_link_libraries-result.txt b/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_link_libraries-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_link_libraries-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_link_libraries-stderr.txt b/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_link_libraries-stderr.txt
new file mode 100644
index 0000000..6c4441f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_link_libraries-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at HOST_LINK-target_link_libraries.cmake:[0-9]+ \(target_link_libraries\):
+ Error evaluating generator expression:
+
+ \$<HOST_LINK:lib>
+
+ \$<HOST_LINK:...> may only be used with binary targets to specify link
+ options.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:[0-9]+ \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_link_libraries.cmake b/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_link_libraries.cmake
new file mode 100644
index 0000000..d74c92d
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_link_libraries.cmake
@@ -0,0 +1,7 @@
+
+enable_language(C)
+
+add_library(lib empty.c)
+
+add_executable(empty empty.c)
+target_link_libraries(empty PRIVATE $<HOST_LINK:lib>)
diff --git a/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_sources-result.txt b/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_sources-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_sources-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_sources-stderr.txt b/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_sources-stderr.txt
new file mode 100644
index 0000000..0e25568
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_sources-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at HOST_LINK-target_sources.cmake:[0-9]+ \(target_sources\):
+ Error evaluating generator expression:
+
+ \$<HOST_LINK:empty.c>
+
+ \$<HOST_LINK:...> may only be used with binary targets to specify link
+ options.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:[0-9]+ \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_sources.cmake b/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_sources.cmake
new file mode 100644
index 0000000..ea7bf55
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/HOST_LINK-target_sources.cmake
@@ -0,0 +1,2 @@
+add_library(empty)
+target_sources(empty PRIVATE $<HOST_LINK:empty.c>)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_custom_command-result.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_custom_command-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_custom_command-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_custom_command-stderr.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_custom_command-stderr.txt
new file mode 100644
index 0000000..0b0d458
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_custom_command-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at LINK_LANGUAGE-add_custom_command.cmake:2 \(add_custom_command\):
+ Error evaluating generator expression:
+
+ \$<LINK_LANGUAGE>
+
+ \$<LINK_LANGUAGE:...> may only be used with binary targets to specify link
+ libraries, link directories, link options and link depends.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_custom_command.cmake b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_custom_command.cmake
new file mode 100644
index 0000000..a378c1c
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_custom_command.cmake
@@ -0,0 +1,4 @@
+add_custom_target(drive)
+add_custom_command(TARGET drive PRE_BUILD
+ COMMAND ${CMAKE_COMMAND} -E echo $<LINK_LANGUAGE>
+)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_custom_target-result.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_custom_target-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_custom_target-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_custom_target-stderr.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_custom_target-stderr.txt
new file mode 100644
index 0000000..92da634
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_custom_target-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at LINK_LANGUAGE-add_custom_target.cmake:1 \(add_custom_target\):
+ Error evaluating generator expression:
+
+ \$<LINK_LANGUAGE>
+
+ \$<LINK_LANGUAGE:...> may only be used with binary targets to specify link
+ libraries, link directories, link options and link depends.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_custom_target.cmake b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_custom_target.cmake
new file mode 100644
index 0000000..60b6c75
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_custom_target.cmake
@@ -0,0 +1,3 @@
+add_custom_target(drive
+ COMMAND ${CMAKE_COMMAND} -E echo $<LINK_LANGUAGE>
+)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_executable-result.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_executable-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_executable-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_executable-stderr.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_executable-stderr.txt
new file mode 100644
index 0000000..3bdc8e4
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_executable-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at LINK_LANGUAGE-add_executable.cmake:1 \(add_executable\):
+ Error evaluating generator expression:
+
+ \$<LINK_LANGUAGE>
+
+ \$<LINK_LANGUAGE:...> may only be used with binary targets to specify link
+ libraries, link directories, link options and link depends.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_executable.cmake b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_executable.cmake
new file mode 100644
index 0000000..2176b39
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_executable.cmake
@@ -0,0 +1 @@
+add_executable(empty empty.$<LINK_LANGUAGE>)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_library-result.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_library-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_library-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_library-stderr.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_library-stderr.txt
new file mode 100644
index 0000000..1bacdeb
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_library-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at LINK_LANGUAGE-add_library.cmake:1 \(add_library\):
+ Error evaluating generator expression:
+
+ \$<LINK_LANGUAGE>
+
+ \$<LINK_LANGUAGE:...> may only be used with binary targets to specify link
+ libraries, link directories, link options and link depends.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_library.cmake b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_library.cmake
new file mode 100644
index 0000000..253f82a
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_library.cmake
@@ -0,0 +1 @@
+add_library(empty empty.$<LINK_LANGUAGE>)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_test-result.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_test-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_test-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_test-stderr.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_test-stderr.txt
new file mode 100644
index 0000000..f22efde
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_test-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at LINK_LANGUAGE-add_test.cmake:5 \(add_test\):
+ Error evaluating generator expression:
+
+ \$<LINK_LANGUAGE>
+
+ \$<LINK_LANGUAGE:...> may only be used with binary targets to specify link
+ libraries, link directories, link options and link depends.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_test.cmake b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_test.cmake
new file mode 100644
index 0000000..4fd547d
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-add_test.cmake
@@ -0,0 +1,5 @@
+
+include(CTest)
+enable_testing()
+
+add_test(NAME dummy COMMAND ${CMAKE_COMMAND} -E echo $<LINK_LANGUAGE>)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-file_generate-result.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-file_generate-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-file_generate-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-file_generate-stderr.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-file_generate-stderr.txt
new file mode 100644
index 0000000..21d26de
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-file_generate-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at LINK_LANGUAGE-file_generate.cmake:3 \(file\):
+ Error evaluating generator expression:
+
+ \$<LINK_LANGUAGE>
+
+ \$<LINK_LANGUAGE:...> may only be used with binary targets to specify link
+ libraries, link directories, link options and link depends.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-file_generate.cmake b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-file_generate.cmake
new file mode 100644
index 0000000..519b883
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-file_generate.cmake
@@ -0,0 +1,6 @@
+enable_language(CXX C)
+
+file(GENERATE
+ OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/output.txt
+ CONTENT "LANG_IS_$<LINK_LANGUAGE>\n"
+)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-install-result.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-install-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-install-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-install-stderr.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-install-stderr.txt
new file mode 100644
index 0000000..73afc33
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-install-stderr.txt
@@ -0,0 +1,10 @@
+CMake Error:
+ Error evaluating generator expression:
+
+ \$<LINK_LANGUAGE>
+
+ \$<LINK_LANGUAGE:...> may only be used with binary targets to specify link
+ libraries, link directories, link options and link depends.
+
+
+CMake Generate step failed. Build files cannot be regenerated correctly.
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-install.cmake b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-install.cmake
new file mode 100644
index 0000000..533c0b4
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-install.cmake
@@ -0,0 +1,5 @@
+
+install(FILES
+ empty.$<LINK_LANGUAGE>
+ DESTINATION src
+)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-target_sources-result.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-target_sources-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-target_sources-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-target_sources-stderr.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-target_sources-stderr.txt
new file mode 100644
index 0000000..d8121cc
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-target_sources-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at LINK_LANGUAGE-target_sources.cmake:2 \(target_sources\):
+ Error evaluating generator expression:
+
+ \$<LINK_LANGUAGE>
+
+ \$<LINK_LANGUAGE:...> may only be used with binary targets to specify link
+ libraries, link directories, link options and link depends.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-target_sources.cmake b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-target_sources.cmake
new file mode 100644
index 0000000..c134c01
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-target_sources.cmake
@@ -0,0 +1,2 @@
+add_library(empty)
+target_sources(empty PRIVATE empty.$<LINK_LANGUAGE>)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-unknown-lang.cmake b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-unknown-lang.cmake
new file mode 100644
index 0000000..0ba472d
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-unknown-lang.cmake
@@ -0,0 +1,4 @@
+
+enable_language(C)
+add_executable(empty empty.c)
+target_link_options(empty PRIVATE $<$<LINK_LANGUAGE:CXX>:$<TARGET_EXISTS:too,many,parameters>>)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage1-result.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage1-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage1-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage1-stderr.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage1-stderr.txt
new file mode 100644
index 0000000..1e3a83b
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage1-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at LINK_LANGUAGE-wrong-usage1.cmake:4 \(target_compile_definitions\):
+ Error evaluating generator expression:
+
+ \$<LINK_LANGUAGE:C>
+
+ \$<LINK_LANGUAGE:...> may only be used with binary targets to specify link
+ libraries, link directories, link options and link depends.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage1.cmake b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage1.cmake
new file mode 100644
index 0000000..90b7ce0
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage1.cmake
@@ -0,0 +1,4 @@
+
+enable_language(C)
+add_executable(empty empty.c)
+target_compile_definitions(empty PRIVATE $<$<LINK_LANGUAGE:C>:DEF>)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage2-result.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage2-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage2-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage2-stderr.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage2-stderr.txt
new file mode 100644
index 0000000..7fe4310
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage2-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at LINK_LANGUAGE-wrong-usage2.cmake:4 \(target_compile_options\):
+ Error evaluating generator expression:
+
+ \$<LINK_LANGUAGE:C>
+
+ \$<LINK_LANGUAGE:...> may only be used with binary targets to specify link
+ libraries, link directories, link options and link depends.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage2.cmake b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage2.cmake
new file mode 100644
index 0000000..e761897
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage2.cmake
@@ -0,0 +1,4 @@
+
+enable_language(C)
+add_executable(empty empty.c)
+target_compile_options(empty PRIVATE $<$<LINK_LANGUAGE:C>:-OPT>)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage3-result.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage3-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage3-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage3-stderr.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage3-stderr.txt
new file mode 100644
index 0000000..cb20e99
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage3-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at LINK_LANGUAGE-wrong-usage3.cmake:4 \(target_include_directories\):
+ Error evaluating generator expression:
+
+ \$<LINK_LANGUAGE:C>
+
+ \$<LINK_LANGUAGE:...> may only be used with binary targets to specify link
+ libraries, link directories, link options and link depends.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage3.cmake b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage3.cmake
new file mode 100644
index 0000000..96a72a1
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage3.cmake
@@ -0,0 +1,4 @@
+
+enable_language(C)
+add_executable(empty empty.c)
+target_include_directories(empty PRIVATE $<$<LINK_LANGUAGE:C>:/DIR>)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage4-result.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage4-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage4-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage4-stderr.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage4-stderr.txt
new file mode 100644
index 0000000..ee36912
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage4-stderr.txt
@@ -0,0 +1,8 @@
+CMake Error at LINK_LANGUAGE-wrong-usage4.cmake:7 \(target_link_libraries\):
+ Error evaluating generator expression:
+
+ \$<LINK_LANGUAGE>
+
+ \$<LINK_LANGUAGE> is not supported in link libraries expression.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage4.cmake b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage4.cmake
new file mode 100644
index 0000000..3ecaabb
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANGUAGE-wrong-usage4.cmake
@@ -0,0 +1,7 @@
+
+enable_language(C)
+
+add_library(libC empty.c)
+
+add_executable(empty empty.c)
+target_link_libraries(empty PRIVATE lib$<LINK_LANGUAGE>)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_custom_command-result.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_custom_command-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_custom_command-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_custom_command-stderr.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_custom_command-stderr.txt
new file mode 100644
index 0000000..2ff62bc
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_custom_command-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at LINK_LANG_AND_ID-add_custom_command.cmake:2 \(add_custom_command\):
+ Error evaluating generator expression:
+
+ \$<LINK_LANG_AND_ID:LANG,ID>
+
+ \$<LINK_LANG_AND_ID:lang,id> may only be used with binary targets to specify
+ link libraries, link directories, link options, and link depends.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_custom_command.cmake b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_custom_command.cmake
new file mode 100644
index 0000000..9df9232
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_custom_command.cmake
@@ -0,0 +1,4 @@
+add_custom_target(drive)
+add_custom_command(TARGET drive PRE_BUILD
+ COMMAND ${CMAKE_COMMAND} -E echo $<LINK_LANG_AND_ID:LANG,ID>
+)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_custom_target-result.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_custom_target-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_custom_target-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_custom_target-stderr.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_custom_target-stderr.txt
new file mode 100644
index 0000000..0749c44
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_custom_target-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at LINK_LANG_AND_ID-add_custom_target.cmake:2 \(add_custom_target\):
+ Error evaluating generator expression:
+
+ \$<LINK_LANG_AND_ID:LANG,ID>
+
+ \$<LINK_LANG_AND_ID:lang,id> may only be used with binary targets to specify
+ link libraries, link directories, link options, and link depends.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_custom_target.cmake b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_custom_target.cmake
new file mode 100644
index 0000000..e5f76bc
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_custom_target.cmake
@@ -0,0 +1,4 @@
+
+add_custom_target(drive
+ COMMAND ${CMAKE_COMMAND} -E echo $<LINK_LANG_AND_ID:LANG,ID>
+)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_executable-result.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_executable-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_executable-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_executable-stderr.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_executable-stderr.txt
new file mode 100644
index 0000000..595312a
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_executable-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at LINK_LANG_AND_ID-add_executable.cmake:1 \(add_executable\):
+ Error evaluating generator expression:
+
+ \$<LINK_LANG_AND_ID:C,MSVC>
+
+ \$<LINK_LANG_AND_ID:lang,id> may only be used with binary targets to specify
+ link libraries, link directories, link options, and link depends.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_executable.cmake b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_executable.cmake
new file mode 100644
index 0000000..4d6c674
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_executable.cmake
@@ -0,0 +1,5 @@
+add_executable(empty main.c
+ $<$<LINK_LANG_AND_ID:C,MSVC>:empty.c>
+ $<$<LINK_LANG_AND_ID:C,GNU>:empty2.c>
+ $<$<LINK_LANG_AND_ID:C,Clang>:empty3.c>
+ )
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_library-result.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_library-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_library-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_library-stderr.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_library-stderr.txt
new file mode 100644
index 0000000..be46e28
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_library-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at LINK_LANG_AND_ID-add_library.cmake:2 \(add_library\):
+ Error evaluating generator expression:
+
+ \$<LINK_LANG_AND_ID:C,MSVC>
+
+ \$<LINK_LANG_AND_ID:lang,id> may only be used with binary targets to specify
+ link libraries, link directories, link options, and link depends.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_library.cmake b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_library.cmake
new file mode 100644
index 0000000..a8199cf
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_library.cmake
@@ -0,0 +1,2 @@
+
+add_library(empty empty.$<LINK_LANG_AND_ID:C,MSVC>)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_test-result.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_test-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_test-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_test-stderr.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_test-stderr.txt
new file mode 100644
index 0000000..2a29492
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_test-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at LINK_LANG_AND_ID-add_test.cmake:5 \(add_test\):
+ Error evaluating generator expression:
+
+ \$<LINK_LANG_AND_ID:CXX,GNU>
+
+ \$<LINK_LANG_AND_ID:lang,id> may only be used with binary targets to specify
+ link libraries, link directories, link options, and link depends.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_test.cmake b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_test.cmake
new file mode 100644
index 0000000..fd700d7
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-add_test.cmake
@@ -0,0 +1,5 @@
+
+include(CTest)
+enable_testing()
+
+add_test(NAME dummy COMMAND ${CMAKE_COMMAND} -E echo $<LINK_LANG_AND_ID:CXX,GNU>)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-file_generate-result.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-file_generate-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-file_generate-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-file_generate-stderr.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-file_generate-stderr.txt
new file mode 100644
index 0000000..e57b55c
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-file_generate-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at LINK_LANG_AND_ID-file_generate.cmake:3 \(file\):
+ Error evaluating generator expression:
+
+ \$<LINK_LANG_AND_ID:C,GNU>
+
+ \$<LINK_LANG_AND_ID:lang,id> may only be used with binary targets to specify
+ link libraries, link directories, link options, and link depends.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-file_generate.cmake b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-file_generate.cmake
new file mode 100644
index 0000000..67c1bda
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-file_generate.cmake
@@ -0,0 +1,6 @@
+enable_language(CXX C)
+
+file(GENERATE
+ OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/output.txt
+ CONTENT "LANG_IS_$<$<LINK_LANG_AND_ID:C,GNU>:C>\n"
+)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-install-result.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-install-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-install-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-install-stderr.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-install-stderr.txt
new file mode 100644
index 0000000..965f974
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-install-stderr.txt
@@ -0,0 +1,10 @@
+CMake Error:
+ Error evaluating generator expression:
+
+ \$<LINK_LANG_AND_ID:C,MSVC>
+
+ \$<LINK_LANG_AND_ID:lang,id> may only be used with binary targets to specify
+ link libraries, link directories, link options, and link depends.
+
+
+CMake Generate step failed. Build files cannot be regenerated correctly.
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-install.cmake b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-install.cmake
new file mode 100644
index 0000000..b8f9323
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-install.cmake
@@ -0,0 +1,5 @@
+
+install(FILES
+ empty.$<LINK_LANG_AND_ID:C,MSVC>
+ DESTINATION src
+)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-target_sources-result.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-target_sources-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-target_sources-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-target_sources-stderr.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-target_sources-stderr.txt
new file mode 100644
index 0000000..e86602a
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-target_sources-stderr.txt
@@ -0,0 +1,8 @@
+CMake Error at LINK_LANG_AND_ID-target_sources.cmake:2 \(target_sources\):
+ Error evaluating generator expression:
+
+ \$<LINK_LANG_AND_ID>
+
+ \$<LINK_LANG_AND_ID> expression requires at least two parameters.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-target_sources.cmake b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-target_sources.cmake
new file mode 100644
index 0000000..da5faf4
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-target_sources.cmake
@@ -0,0 +1,2 @@
+add_library(empty)
+target_sources(empty PRIVATE empty.$<LINK_LANG_AND_ID>)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-unknown-lang.cmake b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-unknown-lang.cmake
new file mode 100644
index 0000000..99dd337
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-unknown-lang.cmake
@@ -0,0 +1,4 @@
+
+enable_language(C)
+add_executable(empty empty.c)
+target_link_options(empty PRIVATE $<$<LINK_LANG_AND_ID:CXX,GNU>:$<TARGET_EXISTS:too,many,parameters>>)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-wrong-usage1-result.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-wrong-usage1-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-wrong-usage1-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-wrong-usage1-stderr.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-wrong-usage1-stderr.txt
new file mode 100644
index 0000000..95611c3
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-wrong-usage1-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at LINK_LANG_AND_ID-wrong-usage1.cmake:4 \(target_compile_definitions\):
+ Error evaluating generator expression:
+
+ \$<LINK_LANG_AND_ID:C,GNU>
+
+ \$<LINK_LANG_AND_ID:lang,id> may only be used with binary targets to specify
+ link libraries, link directories, link options, and link depends.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-wrong-usage1.cmake b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-wrong-usage1.cmake
new file mode 100644
index 0000000..e58e3b44
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-wrong-usage1.cmake
@@ -0,0 +1,4 @@
+
+enable_language(C)
+add_executable(empty empty.c)
+target_compile_definitions(empty PRIVATE $<$<LINK_LANG_AND_ID:C,GNU>:DEF>)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-wrong-usage2-result.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-wrong-usage2-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-wrong-usage2-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-wrong-usage2-stderr.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-wrong-usage2-stderr.txt
new file mode 100644
index 0000000..53bdcb2
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-wrong-usage2-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at LINK_LANG_AND_ID-wrong-usage2.cmake:4 \(target_compile_options\):
+ Error evaluating generator expression:
+
+ \$<LINK_LANG_AND_ID:C,GNU>
+
+ \$<LINK_LANG_AND_ID:lang,id> may only be used with binary targets to specify
+ link libraries, link directories, link options, and link depends.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-wrong-usage2.cmake b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-wrong-usage2.cmake
new file mode 100644
index 0000000..998daa9
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-wrong-usage2.cmake
@@ -0,0 +1,4 @@
+
+enable_language(C)
+add_executable(empty empty.c)
+target_compile_options(empty PRIVATE $<$<LINK_LANG_AND_ID:C,GNU>:-OPT>)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-wrong-usage3-result.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-wrong-usage3-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-wrong-usage3-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-wrong-usage3-stderr.txt b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-wrong-usage3-stderr.txt
new file mode 100644
index 0000000..a34a2ea
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-wrong-usage3-stderr.txt
@@ -0,0 +1,9 @@
+CMake Error at LINK_LANG_AND_ID-wrong-usage3.cmake:4 \(target_include_directories\):
+ Error evaluating generator expression:
+
+ \$<LINK_LANG_AND_ID:C,GNU>
+
+ \$<LINK_LANG_AND_ID:lang,id> may only be used with binary targets to specify
+ link libraries, link directories, link options, and link depends.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-wrong-usage3.cmake b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-wrong-usage3.cmake
new file mode 100644
index 0000000..0543056
--- /dev/null
+++ b/Tests/RunCMake/GeneratorExpression/LINK_LANG_AND_ID-wrong-usage3.cmake
@@ -0,0 +1,4 @@
+
+enable_language(C)
+add_executable(empty empty.c)
+target_include_directories(empty PRIVATE $<$<LINK_LANG_AND_ID:C,GNU>:/DIR>)
diff --git a/Tests/RunCMake/GeneratorExpression/RunCMakeTest.cmake b/Tests/RunCMake/GeneratorExpression/RunCMakeTest.cmake
index 68a0172..24c3642 100644
--- a/Tests/RunCMake/GeneratorExpression/RunCMakeTest.cmake
+++ b/Tests/RunCMake/GeneratorExpression/RunCMakeTest.cmake
@@ -39,6 +39,61 @@ run_cmake(COMPILE_LANG_AND_ID-add_executable)
run_cmake(COMPILE_LANG_AND_ID-add_library)
run_cmake(COMPILE_LANG_AND_ID-add_test)
run_cmake(COMPILE_LANG_AND_ID-unknown-lang)
+run_cmake(LINK_LANGUAGE-add_custom_target)
+run_cmake(LINK_LANGUAGE-add_custom_command)
+run_cmake(LINK_LANGUAGE-install)
+run_cmake(LINK_LANGUAGE-target_sources)
+run_cmake(LINK_LANGUAGE-add_executable)
+run_cmake(LINK_LANGUAGE-add_library)
+run_cmake(LINK_LANGUAGE-add_test)
+run_cmake(LINK_LANGUAGE-unknown-lang)
+run_cmake(LINK_LANGUAGE-wrong-usage1)
+run_cmake(LINK_LANGUAGE-wrong-usage2)
+run_cmake(LINK_LANGUAGE-wrong-usage3)
+run_cmake(LINK_LANGUAGE-wrong-usage4)
+run_cmake(LINK_LANGUAGE-file_generate)
+run_cmake(LINK_LANG_AND_ID-add_custom_target)
+run_cmake(LINK_LANG_AND_ID-add_custom_command)
+run_cmake(LINK_LANG_AND_ID-install)
+run_cmake(LINK_LANG_AND_ID-target_sources)
+run_cmake(LINK_LANG_AND_ID-add_executable)
+run_cmake(LINK_LANG_AND_ID-add_library)
+run_cmake(LINK_LANG_AND_ID-add_test)
+run_cmake(LINK_LANG_AND_ID-unknown-lang)
+run_cmake(LINK_LANG_AND_ID-wrong-usage1)
+run_cmake(LINK_LANG_AND_ID-wrong-usage2)
+run_cmake(LINK_LANG_AND_ID-wrong-usage3)
+run_cmake(LINK_LANG_AND_ID-file_generate)
+run_cmake(HOST_LINK-add_custom_target)
+run_cmake(HOST_LINK-add_custom_command)
+run_cmake(HOST_LINK-install)
+run_cmake(HOST_LINK-add_executable)
+run_cmake(HOST_LINK-add_library)
+run_cmake(HOST_LINK-add_test)
+run_cmake(HOST_LINK-target_sources)
+run_cmake(HOST_LINK-target_compile_definitions)
+run_cmake(HOST_LINK-target_compile_options)
+run_cmake(HOST_LINK-target_include_directories)
+run_cmake(HOST_LINK-target_link_libraries)
+run_cmake(HOST_LINK-target_link_directories)
+if(RunCMake_GENERATOR MATCHES "(Ninja|Makefile)")
+ run_cmake(HOST_LINK-link_depends)
+endif()
+run_cmake(DEVICE_LINK-add_custom_target)
+run_cmake(DEVICE_LINK-add_custom_command)
+run_cmake(DEVICE_LINK-install)
+run_cmake(DEVICE_LINK-add_executable)
+run_cmake(DEVICE_LINK-add_library)
+run_cmake(DEVICE_LINK-add_test)
+run_cmake(DEVICE_LINK-target_sources)
+run_cmake(DEVICE_LINK-target_compile_definitions)
+run_cmake(DEVICE_LINK-target_compile_options)
+run_cmake(DEVICE_LINK-target_include_directories)
+run_cmake(DEVICE_LINK-target_link_libraries)
+run_cmake(DEVICE_LINK-target_link_directories)
+if(RunCMake_GENERATOR MATCHES "(Ninja|Makefile)")
+ run_cmake(DEVICE_LINK-link_depends)
+endif()
run_cmake(TARGET_FILE-recursion)
run_cmake(OUTPUT_NAME-recursion)
run_cmake(TARGET_FILE_PREFIX)
diff --git a/Tests/RunCMake/GoogleTest/GoogleTest-configuration-debug-stdout.txt b/Tests/RunCMake/GoogleTest/GoogleTest-configuration-debug-stdout.txt
new file mode 100644
index 0000000..1f5d1a5
--- /dev/null
+++ b/Tests/RunCMake/GoogleTest/GoogleTest-configuration-debug-stdout.txt
@@ -0,0 +1,5 @@
+Test project .*GoogleTest-discovery-multi-config
+[ \t]*Test #[0-9]+: configuration\.case_release \(Disabled\)
+[ \t]*Test #[0-9]+: configuration\.case_debug
++
+Total Tests: 2
diff --git a/Tests/RunCMake/GoogleTest/GoogleTest-configuration-release-stdout.txt b/Tests/RunCMake/GoogleTest/GoogleTest-configuration-release-stdout.txt
new file mode 100644
index 0000000..4f91664
--- /dev/null
+++ b/Tests/RunCMake/GoogleTest/GoogleTest-configuration-release-stdout.txt
@@ -0,0 +1,5 @@
+Test project .*GoogleTest-discovery-multi-config
+[ \t]*Test #[0-9]+: configuration\.case_release
+[ \t]*Test #[0-9]+: configuration\.case_debug \(Disabled\)
++
+Total Tests: 2
diff --git a/Tests/RunCMake/GoogleTest/GoogleTest-discovery-timeout-result.txt b/Tests/RunCMake/GoogleTest/GoogleTest-discovery-POST_BUILD-timeout-build-result.txt
index d197c91..d197c91 100644
--- a/Tests/RunCMake/GoogleTest/GoogleTest-discovery-timeout-result.txt
+++ b/Tests/RunCMake/GoogleTest/GoogleTest-discovery-POST_BUILD-timeout-build-result.txt
diff --git a/Tests/RunCMake/GoogleTest/GoogleTest-discovery-timeout-stdout.txt b/Tests/RunCMake/GoogleTest/GoogleTest-discovery-POST_BUILD-timeout-build-stdout.txt
index 3a6572c..3a6572c 100644
--- a/Tests/RunCMake/GoogleTest/GoogleTest-discovery-timeout-stdout.txt
+++ b/Tests/RunCMake/GoogleTest/GoogleTest-discovery-POST_BUILD-timeout-build-stdout.txt
diff --git a/Tests/RunCMake/GoogleTest/GoogleTest-discovery-POST_BUILD-timeout-test-result.txt b/Tests/RunCMake/GoogleTest/GoogleTest-discovery-POST_BUILD-timeout-test-result.txt
new file mode 100644
index 0000000..d197c91
--- /dev/null
+++ b/Tests/RunCMake/GoogleTest/GoogleTest-discovery-POST_BUILD-timeout-test-result.txt
@@ -0,0 +1 @@
+[^0]
diff --git a/Tests/RunCMake/GoogleTest/GoogleTest-discovery-POST_BUILD-timeout-test-stderr.txt b/Tests/RunCMake/GoogleTest/GoogleTest-discovery-POST_BUILD-timeout-test-stderr.txt
new file mode 100644
index 0000000..f6be939
--- /dev/null
+++ b/Tests/RunCMake/GoogleTest/GoogleTest-discovery-POST_BUILD-timeout-test-stderr.txt
@@ -0,0 +1,2 @@
+Unable to find executable: discovery_timeout_test_NOT_BUILT
+Errors while running CTest
diff --git a/Tests/RunCMake/GoogleTest/GoogleTest-discovery-POST_BUILD-timeout-test-stdout.txt b/Tests/RunCMake/GoogleTest/GoogleTest-discovery-POST_BUILD-timeout-test-stdout.txt
new file mode 100644
index 0000000..d9de3f8
--- /dev/null
+++ b/Tests/RunCMake/GoogleTest/GoogleTest-discovery-POST_BUILD-timeout-test-stdout.txt
@@ -0,0 +1,18 @@
+Test project .*GoogleTest-discovery-timeout
+[ \t]*Start [0-9]+: discovery_timeout_test_NOT_BUILT
+Could not find executable discovery_timeout_test_NOT_BUILT
+Looked in the following places:
+discovery_timeout_test_NOT_BUILT
+discovery_timeout_test_NOT_BUILT(\.exe)?
+Debug/discovery_timeout_test_NOT_BUILT
+Debug/discovery_timeout_test_NOT_BUILT(\.exe)?
+Debug/discovery_timeout_test_NOT_BUILT
+Debug/discovery_timeout_test_NOT_BUILT(\.exe)?
+[^\n]+discovery_timeout_test_NOT_BUILT +\.+\*\*\*Not Run +[0-9.]+ sec
++
+0% tests passed, 1 tests failed out of 1
++
+Total Test time \(real\) = +[0-9.]+ sec
++
+The following tests FAILED:
+[^\n]+discovery_timeout_test_NOT_BUILT \(Not Run\)
diff --git a/Tests/RunCMake/GoogleTest/GoogleTest-discovery-PRE_TEST-timeout-test-stderr.txt b/Tests/RunCMake/GoogleTest/GoogleTest-discovery-PRE_TEST-timeout-test-stderr.txt
new file mode 100644
index 0000000..75afe4a
--- /dev/null
+++ b/Tests/RunCMake/GoogleTest/GoogleTest-discovery-PRE_TEST-timeout-test-stderr.txt
@@ -0,0 +1,8 @@
+CMake Error at .*GoogleTestAddTests.cmake:[0-9]+ \(message\):
+[ \t]*Error running test executable.
++
+[ \t]*Path: '.*discovery_timeout_test(\.exe)?'
+[ \t]*Result: Process terminated due to timeout
+[ \t]*Output:
+[ \t]*timeout.
+[ \t]*case
diff --git a/Tests/RunCMake/GoogleTest/GoogleTest-discovery-PRE_TEST-timeout-test-stdout.txt b/Tests/RunCMake/GoogleTest/GoogleTest-discovery-PRE_TEST-timeout-test-stdout.txt
new file mode 100644
index 0000000..d65061f
--- /dev/null
+++ b/Tests/RunCMake/GoogleTest/GoogleTest-discovery-PRE_TEST-timeout-test-stdout.txt
@@ -0,0 +1 @@
+Test project .*GoogleTest-discovery-timeout
diff --git a/Tests/RunCMake/GoogleTest/GoogleTest-skip-timeout-stdout.txt b/Tests/RunCMake/GoogleTest/GoogleTest-skip-timeout-stdout.txt
new file mode 100644
index 0000000..eeecb6a
--- /dev/null
+++ b/Tests/RunCMake/GoogleTest/GoogleTest-skip-timeout-stdout.txt
@@ -0,0 +1,10 @@
+Test project .*
+ Start 20: skip_test.test1
+1/1 Test #20: skip_test.test1 \.+\*\*\*Skipped +[0-9.]+ sec
+
+100% tests passed, 0 tests failed out of 1
+
+Total Test time \(real\) = +[0-9.]+ sec
+
+The following tests did not run:
+.*20 - skip_test\.test1 \(Skipped\)
diff --git a/Tests/RunCMake/GoogleTest/GoogleTest-test1-stdout.txt b/Tests/RunCMake/GoogleTest/GoogleTest-test1-stdout.txt
index 5f7753d..7fb3919 100644
--- a/Tests/RunCMake/GoogleTest/GoogleTest-test1-stdout.txt
+++ b/Tests/RunCMake/GoogleTest/GoogleTest-test1-stdout.txt
@@ -1,22 +1,28 @@
Test project .*
- Start 1: TEST:basic\.case_foo!1
-1/8 Test #1: TEST:basic\.case_foo!1 \.+ +Passed +[0-9.]+ sec
- Start 2: TEST:basic\.case_bar!1
-2/8 Test #2: TEST:basic\.case_bar!1 \.+ +Passed +[0-9.]+ sec
- Start 3: TEST:basic\.disabled_case!1
-3/8 Test #3: TEST:basic\.disabled_case!1 \.+\*+Not Run \(Disabled\) +[0-9.]+ sec
- Start 4: TEST:disabled\.case!1
-4/8 Test #4: TEST:disabled\.case!1 \.+\*+Not Run \(Disabled\) +[0-9.]+ sec
- Start 5: TEST:typed/short\.case!1
-5/8 Test #5: TEST:typed/short\.case!1 \.+ +Passed +[0-9.]+ sec
- Start 6: TEST:typed/float\.case!1
-6/8 Test #6: TEST:typed/float\.case!1 \.+ +Passed +[0-9.]+ sec
- Start 7: TEST:value/test\.case/1!1
-7/8 Test #7: TEST:value/test\.case/1!1 \.+ +Passed +[0-9.]+ sec
- Start 8: TEST:value/test\.case/"foo"!1
-8/8 Test #8: TEST:value/test\.case/"foo"!1 \.+ +Passed +[0-9.]+ sec
+ Start 1: TEST:basic\.case_foo!1
+ 1/11 Test #1: TEST:basic\.case_foo!1 \.+ +Passed +[0-9.]+ sec
+ Start 2: TEST:basic\.case_bar!1
+ 2/11 Test #2: TEST:basic\.case_bar!1 \.+ +Passed +[0-9.]+ sec
+ Start 3: TEST:basic\.disabled_case!1
+ 3/11 Test #3: TEST:basic\.disabled_case!1 \.+\*+Not Run \(Disabled\) +[0-9.]+ sec
+ Start 4: TEST:disabled\.case!1
+ 4/11 Test #4: TEST:disabled\.case!1 \.+\*+Not Run \(Disabled\) +[0-9.]+ sec
+ Start 5: TEST:typed/short\.case!1
+ 5/11 Test #5: TEST:typed/short\.case!1 \.+ +Passed +[0-9.]+ sec
+ Start 6: TEST:typed/float\.case!1
+ 6/11 Test #6: TEST:typed/float\.case!1 \.+ +Passed +[0-9.]+ sec
+ Start 7: TEST:value/test\.case/1!1
+ 7/11 Test #7: TEST:value/test\.case/1!1 \.+ +Passed +[0-9.]+ sec
+ Start 8: TEST:value/test\.case/"foo"!1
+ 8/11 Test #8: TEST:value/test\.case/"foo"!1 \.+ +Passed +[0-9.]+ sec
+ Start 9: TEST:param/special\.case/"semicolon;"!1
+ 9/11 Test #9: TEST:param/special\.case/"semicolon;"!1 \.+ +Passed +[0-9.]+ sec
+ Start 10: TEST:param/special\.case/"backslash\\"!1
+10/11 Test #10: TEST:param/special\.case/"backslash\\"!1 \.+ +Passed +[0-9.]+ sec
+ Start 11: TEST:param/special\.case/"\$\{var\}"!1
+11/11 Test #11: TEST:param/special\.case/"\$\{var\}"!1 \.+ +Passed +[0-9.]+ sec
-100% tests passed, 0 tests failed out of 6
+100% tests passed, 0 tests failed out of 9
Total Test time \(real\) = +[0-9.]+ sec
diff --git a/Tests/RunCMake/GoogleTest/GoogleTest-test2-stdout.txt b/Tests/RunCMake/GoogleTest/GoogleTest-test2-stdout.txt
index 960c0b9..58c4d10 100644
--- a/Tests/RunCMake/GoogleTest/GoogleTest-test2-stdout.txt
+++ b/Tests/RunCMake/GoogleTest/GoogleTest-test2-stdout.txt
@@ -1,25 +1,31 @@
Test project .*
- Start 9: TEST:basic\.case_foo!2
-1/8 Test #9: TEST:basic\.case_foo!2 \.+ +Passed +[0-9.]+ sec
- Start 10: TEST:basic\.case_bar!2
-2/8 Test #10: TEST:basic\.case_bar!2 \.+ +Passed +[0-9.]+ sec
- Start 11: TEST:basic\.disabled_case!2
-3/8 Test #11: TEST:basic\.disabled_case!2 \.+\*+Not Run \(Disabled\) +[0-9.]+ sec
- Start 12: TEST:disabled\.case!2
-4/8 Test #12: TEST:disabled\.case!2 \.+\*+Not Run \(Disabled\) +[0-9.]+ sec
- Start 13: TEST:typed/short\.case!2
-5/8 Test #13: TEST:typed/short\.case!2 \.+ +Passed +[0-9.]+ sec
- Start 14: TEST:typed/float\.case!2
-6/8 Test #14: TEST:typed/float\.case!2 \.+ +Passed +[0-9.]+ sec
- Start 15: TEST:value/test\.case/1!2
-7/8 Test #15: TEST:value/test\.case/1!2 \.+ +Passed +[0-9.]+ sec
- Start 16: TEST:value/test\.case/"foo"!2
-8/8 Test #16: TEST:value/test\.case/"foo"!2 \.+ +Passed +[0-9.]+ sec
+ Start 12: TEST:basic\.case_foo!2
+ 1/11 Test #12: TEST:basic\.case_foo!2 \.+ +Passed +[0-9.]+ sec
+ Start 13: TEST:basic\.case_bar!2
+ 2/11 Test #13: TEST:basic\.case_bar!2 \.+ +Passed +[0-9.]+ sec
+ Start 14: TEST:basic\.disabled_case!2
+ 3/11 Test #14: TEST:basic\.disabled_case!2 \.+\*+Not Run \(Disabled\) +[0-9.]+ sec
+ Start 15: TEST:disabled\.case!2
+ 4/11 Test #15: TEST:disabled\.case!2 \.+\*+Not Run \(Disabled\) +[0-9.]+ sec
+ Start 16: TEST:typed/short\.case!2
+ 5/11 Test #16: TEST:typed/short\.case!2 \.+ +Passed +[0-9.]+ sec
+ Start 17: TEST:typed/float\.case!2
+ 6/11 Test #17: TEST:typed/float\.case!2 \.+ +Passed +[0-9.]+ sec
+ Start 18: TEST:value/test\.case/1!2
+ 7/11 Test #18: TEST:value/test\.case/1!2 \.+ +Passed +[0-9.]+ sec
+ Start 19: TEST:value/test\.case/"foo"!2
+ 8/11 Test #19: TEST:value/test\.case/"foo"!2 \.+ +Passed +[0-9.]+ sec
+ Start 20: TEST:param/special\.case/"semicolon;"!2
+ 9/11 Test #20: TEST:param/special\.case/"semicolon;"!2 \.+ +Passed +[0-9.]+ sec
+ Start 21: TEST:param/special\.case/"backslash\\"!2
+10/11 Test #21: TEST:param/special\.case/"backslash\\"!2 \.+ +Passed +[0-9.]+ sec
+ Start 22: TEST:param/special\.case/"\$\{var\}"!2
+11/11 Test #22: TEST:param/special\.case/"\$\{var\}"!2 \.+ +Passed +[0-9.]+ sec
-100% tests passed, 0 tests failed out of 6
+100% tests passed, 0 tests failed out of 9
Total Test time \(real\) = +[0-9.]+ sec
The following tests did not run:
-.*11 - TEST:basic\.disabled_case!2 \(Disabled\)
-.*12 - TEST:disabled\.case!2 \(Disabled\)
+.*14 - TEST:basic\.disabled_case!2 \(Disabled\)
+.*15 - TEST:disabled\.case!2 \(Disabled\)
diff --git a/Tests/RunCMake/GoogleTest/GoogleTest.cmake b/Tests/RunCMake/GoogleTest/GoogleTest.cmake
index 31808c6..fca292a 100644
--- a/Tests/RunCMake/GoogleTest/GoogleTest.cmake
+++ b/Tests/RunCMake/GoogleTest/GoogleTest.cmake
@@ -50,10 +50,8 @@ gtest_discover_tests(
PROPERTIES TIMEOUT 2
)
-add_executable(discovery_timeout_test timeout_test.cpp)
-target_compile_definitions(discovery_timeout_test PRIVATE discoverySleepSec=10)
+add_executable(skip_test skip_test.cpp)
+
gtest_discover_tests(
- discovery_timeout_test
- TEST_PREFIX discovery_
- DISCOVERY_TIMEOUT 2
+ skip_test
)
diff --git a/Tests/RunCMake/GoogleTest/GoogleTestDiscoveryMultiConfig.cmake b/Tests/RunCMake/GoogleTest/GoogleTestDiscoveryMultiConfig.cmake
new file mode 100644
index 0000000..1919dc1
--- /dev/null
+++ b/Tests/RunCMake/GoogleTest/GoogleTestDiscoveryMultiConfig.cmake
@@ -0,0 +1,14 @@
+project(test_include_dirs)
+include(CTest)
+include(GoogleTest)
+
+enable_testing()
+
+add_executable(configuration_gtest configuration_gtest.cpp)
+target_compile_definitions(configuration_gtest PRIVATE $<$<CONFIG:Debug>:DEBUG=1>)
+
+gtest_discover_tests(
+ configuration_gtest
+ PROPERTIES LABELS CONFIG
+ DISCOVERY_MODE PRE_TEST
+)
diff --git a/Tests/RunCMake/GoogleTest/GoogleTestDiscoveryTimeout.cmake b/Tests/RunCMake/GoogleTest/GoogleTestDiscoveryTimeout.cmake
new file mode 100644
index 0000000..7398faf
--- /dev/null
+++ b/Tests/RunCMake/GoogleTest/GoogleTestDiscoveryTimeout.cmake
@@ -0,0 +1,14 @@
+project(test_include_dirs)
+include(CTest)
+include(GoogleTest)
+
+enable_testing()
+
+add_executable(discovery_timeout_test timeout_test.cpp)
+target_compile_definitions(discovery_timeout_test PRIVATE discoverySleepSec=10)
+gtest_discover_tests(
+ discovery_timeout_test
+ TEST_PREFIX discovery_
+ DISCOVERY_TIMEOUT 2
+ DISCOVERY_MODE ${DISCOVERY_MODE}
+)
diff --git a/Tests/RunCMake/GoogleTest/GoogleTestXML-result-check.cmake b/Tests/RunCMake/GoogleTest/GoogleTestXML-result-check.cmake
new file mode 100644
index 0000000..3bfdac3
--- /dev/null
+++ b/Tests/RunCMake/GoogleTest/GoogleTestXML-result-check.cmake
@@ -0,0 +1,4 @@
+set(RESULT_FILE "${RunCMake_TEST_BINARY_DIR}/GoogleTestXML.Foo.xml")
+if(NOT EXISTS ${RESULT_FILE})
+ set(RunCMake_TEST_FAILED "Result XML file ${RESULT_FILE} was not created")
+endif()
diff --git a/Tests/RunCMake/GoogleTest/GoogleTestXML.cmake b/Tests/RunCMake/GoogleTest/GoogleTestXML.cmake
new file mode 100644
index 0000000..c86de63
--- /dev/null
+++ b/Tests/RunCMake/GoogleTest/GoogleTestXML.cmake
@@ -0,0 +1,11 @@
+project(test_include_dirs)
+include(CTest)
+include(GoogleTest)
+
+enable_testing()
+
+add_executable(xml_output xml_output.cpp)
+gtest_discover_tests(
+ xml_output
+ XML_OUTPUT_DIR ${CMAKE_BINARY_DIR}
+)
diff --git a/Tests/RunCMake/GoogleTest/RunCMakeTest.cmake b/Tests/RunCMake/GoogleTest/RunCMakeTest.cmake
index 0fa4e2a..efd22be 100644
--- a/Tests/RunCMake/GoogleTest/RunCMakeTest.cmake
+++ b/Tests/RunCMake/GoogleTest/RunCMakeTest.cmake
@@ -1,6 +1,6 @@
include(RunCMake)
-function(run_GoogleTest)
+function(run_GoogleTest DISCOVERY_MODE)
# Use a single build tree for a few tests without cleaning.
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/GoogleTest-build)
set(RunCMake_TEST_NO_CLEAN 1)
@@ -10,7 +10,7 @@ function(run_GoogleTest)
file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
- run_cmake(GoogleTest)
+ run_cmake_with_options(GoogleTest -DCMAKE_GTEST_DISCOVER_TESTS_DISCOVERY_MODE=${DISCOVERY_MODE})
run_cmake_command(GoogleTest-build
${CMAKE_COMMAND}
@@ -26,15 +26,6 @@ function(run_GoogleTest)
--target property_timeout_test
)
- set(RunCMake_TEST_OUTPUT_MERGE 1)
- run_cmake_command(GoogleTest-discovery-timeout
- ${CMAKE_COMMAND}
- --build .
- --config Debug
- --target discovery_timeout_test
- )
- set(RunCMake_TEST_OUTPUT_MERGE 0)
-
run_cmake_command(GoogleTest-test1
${CMAKE_CTEST_COMMAND}
-C Debug
@@ -69,6 +60,123 @@ function(run_GoogleTest)
-R property_timeout\\.case_with_discovery
--no-label-summary
)
+
+ run_cmake_command(GoogleTest-build
+ ${CMAKE_COMMAND}
+ --build .
+ --config Debug
+ --target skip_test
+ )
+
+ run_cmake_command(GoogleTest-skip-test
+ ${CMAKE_CTEST_COMMAND}
+ -C Debug
+ -R skip_test
+ --no-label-summary
+ )
endfunction()
-run_GoogleTest()
+function(run_GoogleTestXML DISCOVERY_MODE)
+ # Use a single build tree for a few tests without cleaning.
+ set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/GoogleTestXML-build)
+ set(RunCMake_TEST_NO_CLEAN 1)
+ if(NOT RunCMake_GENERATOR_IS_MULTI_CONFIG)
+ set(RunCMake_TEST_OPTIONS -DCMAKE_BUILD_TYPE=Debug)
+ endif()
+ file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
+ file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
+
+ run_cmake_with_options(GoogleTestXML -DCMAKE_GTEST_DISCOVER_TESTS_DISCOVERY_MODE=${DISCOVERY_MODE})
+
+ run_cmake_command(GoogleTestXML-discovery
+ ${CMAKE_COMMAND}
+ --build .
+ --config Debug
+ --target xml_output
+ )
+
+ run_cmake_command(GoogleTestXML-result
+ ${CMAKE_CTEST_COMMAND}
+ -C Debug
+ -R GoogleTestXML
+ --no-label-summary
+ )
+endfunction()
+
+function(run_GoogleTest_discovery_timeout DISCOVERY_MODE)
+ # Use a single build tree for a few tests without cleaning.
+ set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/GoogleTest-discovery-timeout)
+ set(RunCMake_TEST_NO_CLEAN 1)
+ if(NOT RunCMake_GENERATOR_IS_MULTI_CONFIG)
+ set(RunCMake_TEST_OPTIONS -DCMAKE_BUILD_TYPE=Debug)
+ endif()
+ file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
+ file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
+
+ run_cmake_with_options(GoogleTestDiscoveryTimeout -DDISCOVERY_MODE=${DISCOVERY_MODE})
+
+ set(RunCMake_TEST_OUTPUT_MERGE 1)
+ run_cmake_command(GoogleTest-discovery-${DISCOVERY_MODE}-timeout-build
+ ${CMAKE_COMMAND}
+ --build .
+ --config Debug
+ --target discovery_timeout_test
+ )
+ set(RunCMake_TEST_OUTPUT_MERGE 0)
+
+ run_cmake_command(GoogleTest-discovery-${DISCOVERY_MODE}-timeout-test
+ ${CMAKE_CTEST_COMMAND}
+ -C Debug
+ -R discovery_timeout_test
+ --no-label-sumary
+ )
+endfunction()
+
+function(run_GoogleTest_discovery_multi_config)
+ # Use a single build tree for a few tests without cleaning.
+ set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/GoogleTest-discovery-multi-config)
+ set(RunCMake_TEST_NO_CLEAN 1)
+ file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
+ file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
+
+ run_cmake(GoogleTestDiscoveryMultiConfig)
+
+ run_cmake_command(GoogleTest-build-release
+ ${CMAKE_COMMAND}
+ --build .
+ --config Release
+ --target configuration_gtest
+ )
+ run_cmake_command(GoogleTest-build-debug
+ ${CMAKE_COMMAND}
+ --build .
+ --config Debug
+ --target configuration_gtest
+ )
+ run_cmake_command(GoogleTest-configuration-release
+ ${CMAKE_CTEST_COMMAND}
+ -C Release
+ -L CONFIG
+ -N
+ )
+ run_cmake_command(GoogleTest-configuration-debug
+ ${CMAKE_CTEST_COMMAND}
+ -C Debug
+ -L CONFIG
+ -N
+ )
+
+endfunction()
+
+foreach(DISCOVERY_MODE POST_BUILD PRE_TEST)
+ message("Testing ${DISCOVERY_MODE} discovery mode via CMAKE_GTEST_DISCOVER_TESTS_DISCOVERY_MODE global override...")
+ run_GoogleTest(${DISCOVERY_MODE})
+ run_GoogleTestXML(${DISCOVERY_MODE})
+ message("Testing ${DISCOVERY_MODE} discovery mode via DISCOVERY_MODE option...")
+ run_GoogleTest_discovery_timeout(${DISCOVERY_MODE})
+endforeach()
+
+if(RunCMake_GENERATOR_IS_MULTI_CONFIG)
+ message("Testing PRE_TEST discovery multi configuration...")
+ run_GoogleTest_discovery_multi_config()
+endif()
diff --git a/Tests/RunCMake/GoogleTest/configuration_gtest.cpp b/Tests/RunCMake/GoogleTest/configuration_gtest.cpp
new file mode 100644
index 0000000..3cbb134
--- /dev/null
+++ b/Tests/RunCMake/GoogleTest/configuration_gtest.cpp
@@ -0,0 +1,23 @@
+#include <iostream>
+#include <string>
+
+int main(int argc, char** argv)
+{
+ // Note: GoogleTest.cmake doesn't actually depend on Google Test as such;
+ // it only requires that we produces output in the expected format when
+ // invoked with --gtest_list_tests. Thus, we fake that here. This allows us
+ // to test the module without actually needing Google Test.
+ if (argc > 1 && std::string(argv[1]) == "--gtest_list_tests") {
+ std::cout << "configuration." << std::endl;
+#ifdef DEBUG
+ std::cout << " DISABLED_case_release" << std::endl;
+ std::cout << " case_debug" << std::endl;
+#else
+ std::cout << " case_release" << std::endl;
+ std::cout << " DISABLED_case_debug" << std::endl;
+#endif
+ return 0;
+ }
+
+ return 1;
+}
diff --git a/Tests/RunCMake/GoogleTest/fake_gtest.cpp b/Tests/RunCMake/GoogleTest/fake_gtest.cpp
index f1bd7ef..a8127bf 100644
--- a/Tests/RunCMake/GoogleTest/fake_gtest.cpp
+++ b/Tests/RunCMake/GoogleTest/fake_gtest.cpp
@@ -21,6 +21,10 @@ int main(int argc, char** argv)
std::cout << "value/test." << std::endl;
std::cout << " case/0 # GetParam() = 1" << std::endl;
std::cout << " case/1 # GetParam() = \"foo\"" << std::endl;
+ std::cout << "param/special." << std::endl;
+ std::cout << " case/0 # GetParam() = \"semicolon;\"" << std::endl;
+ std::cout << " case/1 # GetParam() = \"backslash\\\"" << std::endl;
+ std::cout << " case/2 # GetParam() = \"${var}\"" << std::endl;
return 0;
}
diff --git a/Tests/RunCMake/GoogleTest/skip_test.cpp b/Tests/RunCMake/GoogleTest/skip_test.cpp
new file mode 100644
index 0000000..2bc9fe1
--- /dev/null
+++ b/Tests/RunCMake/GoogleTest/skip_test.cpp
@@ -0,0 +1,18 @@
+#include <iostream>
+#include <string>
+
+int main(int argc, char** argv)
+{
+ // Note: GoogleTest.cmake doesn't actually depend on Google Test as such;
+ // it only requires that we produces output in the expected format when
+ // invoked with --gtest_list_tests. Thus, we fake that here. This allows us
+ // to test the module without actually needing Google Test.
+ if (argc > 1 && std::string(argv[1]) == "--gtest_list_tests") {
+ std::cout << "skip_test." << std::endl;
+ std::cout << " test1" << std::endl;
+ return 0;
+ }
+
+ std::cout << "[ SKIPPED ] skip_test.test1" << std::endl;
+ return 0;
+}
diff --git a/Tests/RunCMake/GoogleTest/timeout_test.cpp b/Tests/RunCMake/GoogleTest/timeout_test.cpp
index b8ad055..5506269 100644
--- a/Tests/RunCMake/GoogleTest/timeout_test.cpp
+++ b/Tests/RunCMake/GoogleTest/timeout_test.cpp
@@ -4,9 +4,10 @@
# include <unistd.h>
#endif
-#include <iostream>
#include <string>
+#include <stdio.h>
+
void sleepFor(unsigned seconds)
{
#if defined(_WIN32)
@@ -23,8 +24,8 @@ int main(int argc, char** argv)
// invoked with --gtest_list_tests. Thus, we fake that here. This allows us
// to test the module without actually needing Google Test.
if (argc > 1 && std::string(argv[1]) == "--gtest_list_tests") {
- std::cout << "timeout." << std::endl;
- std::cout << " case" << std::endl;
+ printf("timeout.\n case\n");
+ fflush(stdout);
#ifdef discoverySleepSec
sleepFor(discoverySleepSec);
#endif
diff --git a/Tests/RunCMake/GoogleTest/xml_output.cpp b/Tests/RunCMake/GoogleTest/xml_output.cpp
new file mode 100644
index 0000000..e130231
--- /dev/null
+++ b/Tests/RunCMake/GoogleTest/xml_output.cpp
@@ -0,0 +1,26 @@
+#include <fstream>
+#include <iostream>
+#include <string>
+
+int main(int argc, char** argv)
+{
+ // Note: GoogleTestXML.cmake doesn't actually depend on Google Test as such;
+ // it only mimicks the output file creation using the path passed to this
+ // test without any content
+ for (int i = 0; i < argc; i++) {
+ std::string param(argv[i]);
+ if (param.find("--gtest_list_tests") != std::string::npos) {
+ // This actually defines the name of the file passed in the 2nd run
+ std::cout << "GoogleTestXML." << std::endl;
+ std::cout << " Foo" << std::endl;
+ } else if (param.find("--gtest_output=xml:") != std::string::npos) {
+ std::string::size_type split = param.find(":");
+ std::string filepath = param.substr(split + 1);
+ // The full file path is passed
+ std::ofstream ostrm(filepath.c_str(), std::ios::binary);
+ ostrm << "--gtest_output=xml: mockup file\n";
+ }
+ }
+
+ return 0;
+}
diff --git a/Tests/RunCMake/Languages/LINKER_LANGUAGE-genex-result.txt b/Tests/RunCMake/Languages/LINKER_LANGUAGE-genex-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/Languages/LINKER_LANGUAGE-genex-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/Languages/LINK_LANGUAGE-genex-stderr.txt b/Tests/RunCMake/Languages/LINKER_LANGUAGE-genex-stderr.txt
index 03c002e..7abf76a 100644
--- a/Tests/RunCMake/Languages/LINK_LANGUAGE-genex-stderr.txt
+++ b/Tests/RunCMake/Languages/LINKER_LANGUAGE-genex-stderr.txt
@@ -1,4 +1,4 @@
-CMake Error at LINK_LANGUAGE-genex.cmake:[0-9]+ \(target_link_libraries\):
+CMake Error at LINKER_LANGUAGE-genex.cmake:[0-9]+ \(target_link_libraries\):
Error evaluating generator expression:
\$<TARGET_PROPERTY:LINKER_LANGUAGE>
diff --git a/Tests/RunCMake/Languages/LINK_LANGUAGE-genex.cmake b/Tests/RunCMake/Languages/LINKER_LANGUAGE-genex.cmake
index 64f394c..64f394c 100644
--- a/Tests/RunCMake/Languages/LINK_LANGUAGE-genex.cmake
+++ b/Tests/RunCMake/Languages/LINKER_LANGUAGE-genex.cmake
diff --git a/Tests/RunCMake/Languages/RunCMakeTest.cmake b/Tests/RunCMake/Languages/RunCMakeTest.cmake
index 2a534b3..48216e9 100644
--- a/Tests/RunCMake/Languages/RunCMakeTest.cmake
+++ b/Tests/RunCMake/Languages/RunCMakeTest.cmake
@@ -1,7 +1,7 @@
include(RunCMake)
run_cmake(NoLangSHARED)
-run_cmake(LINK_LANGUAGE-genex)
+run_cmake(LINKER_LANGUAGE-genex)
run_cmake(link-libraries-TARGET_FILE-genex)
run_cmake(link-libraries-TARGET_FILE-genex-ok)
diff --git a/Tests/RunCMake/Ninja/RunCMakeTest.cmake b/Tests/RunCMake/Ninja/RunCMakeTest.cmake
index 0eada08..8f9c263 100644
--- a/Tests/RunCMake/Ninja/RunCMakeTest.cmake
+++ b/Tests/RunCMake/Ninja/RunCMakeTest.cmake
@@ -18,6 +18,12 @@ else()
message(FATAL_ERROR "'ninja --version' reported:\n${ninja_out}")
endif()
+if(CMAKE_HOST_WIN32)
+ run_cmake(SelectCompilerWindows)
+else()
+ run_cmake(SelectCompilerUNIX)
+endif()
+
function(run_NinjaToolMissing)
set(RunCMake_MAKE_PROGRAM ninja-tool-missing)
run_cmake(NinjaToolMissing)
diff --git a/Tests/RunCMake/Ninja/SelectCompiler/1/gcc b/Tests/RunCMake/Ninja/SelectCompiler/1/gcc
new file mode 100755
index 0000000..151dfa6
--- /dev/null
+++ b/Tests/RunCMake/Ninja/SelectCompiler/1/gcc
@@ -0,0 +1,2 @@
+#!/bin/sh
+false
diff --git a/Tests/RunCMake/Ninja/SelectCompiler/2/cc b/Tests/RunCMake/Ninja/SelectCompiler/2/cc
new file mode 100755
index 0000000..151dfa6
--- /dev/null
+++ b/Tests/RunCMake/Ninja/SelectCompiler/2/cc
@@ -0,0 +1,2 @@
+#!/bin/sh
+false
diff --git a/Tests/RunCMake/Ninja/SelectCompilerUNIX-result.txt b/Tests/RunCMake/Ninja/SelectCompilerUNIX-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/Ninja/SelectCompilerUNIX-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/Ninja/SelectCompilerUNIX-stderr.txt b/Tests/RunCMake/Ninja/SelectCompilerUNIX-stderr.txt
new file mode 100644
index 0000000..a2baa48
--- /dev/null
+++ b/Tests/RunCMake/Ninja/SelectCompilerUNIX-stderr.txt
@@ -0,0 +1,6 @@
+^CMake Error at .*/Modules/CMakeTestCCompiler.cmake:[0-9]+ \(message\):
+ The C compiler
+
+ "[^"]*/Tests/RunCMake/Ninja/SelectCompiler/2/cc"
+
+ is not able to compile a simple test program.
diff --git a/Tests/RunCMake/Ninja/SelectCompilerUNIX.cmake b/Tests/RunCMake/Ninja/SelectCompilerUNIX.cmake
new file mode 100644
index 0000000..02c8439
--- /dev/null
+++ b/Tests/RunCMake/Ninja/SelectCompilerUNIX.cmake
@@ -0,0 +1,3 @@
+set(ENV{PATH} "${CMAKE_CURRENT_SOURCE_DIR}/SelectCompiler/1:${CMAKE_CURRENT_SOURCE_DIR}/SelectCompiler/2:$ENV{PATH}")
+unset(ENV{CC})
+enable_language(C)
diff --git a/Tests/RunCMake/Ninja/SelectCompilerWindows-result.txt b/Tests/RunCMake/Ninja/SelectCompilerWindows-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/Ninja/SelectCompilerWindows-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/Ninja/SelectCompilerWindows-stderr.txt b/Tests/RunCMake/Ninja/SelectCompilerWindows-stderr.txt
new file mode 100644
index 0000000..e4b506e
--- /dev/null
+++ b/Tests/RunCMake/Ninja/SelectCompilerWindows-stderr.txt
@@ -0,0 +1,6 @@
+^CMake Error at .*/Modules/CMakeTestCCompiler.cmake:[0-9]+ \(message\):
+ The C compiler
+
+ "[^"]*/Tests/RunCMake/Ninja/SelectCompiler/1/gcc"
+
+ is not able to compile a simple test program.
diff --git a/Tests/RunCMake/Ninja/SelectCompilerWindows.cmake b/Tests/RunCMake/Ninja/SelectCompilerWindows.cmake
new file mode 100644
index 0000000..f5a7e2b
--- /dev/null
+++ b/Tests/RunCMake/Ninja/SelectCompilerWindows.cmake
@@ -0,0 +1,3 @@
+set(ENV{PATH} "${CMAKE_CURRENT_SOURCE_DIR}/SelectCompiler/1;${CMAKE_CURRENT_SOURCE_DIR}/SelectCompiler/2;$ENV{PATH}")
+unset(ENV{CC})
+enable_language(C)
diff --git a/Tests/RunCMake/NinjaMultiConfig/CudaSimple.cmake b/Tests/RunCMake/NinjaMultiConfig/CudaSimple.cmake
index 2e9b1cb..00d8a1b 100644
--- a/Tests/RunCMake/NinjaMultiConfig/CudaSimple.cmake
+++ b/Tests/RunCMake/NinjaMultiConfig/CudaSimple.cmake
@@ -1,3 +1,4 @@
+cmake_policy(SET CMP0104 NEW)
enable_language(CUDA)
file(TOUCH ${CMAKE_BINARY_DIR}/empty.cmake)
diff --git a/Tests/RunCMake/NinjaMultiConfig/RunCMakeTest.cmake b/Tests/RunCMake/NinjaMultiConfig/RunCMakeTest.cmake
index 6472f46..23b89d3 100644
--- a/Tests/RunCMake/NinjaMultiConfig/RunCMakeTest.cmake
+++ b/Tests/RunCMake/NinjaMultiConfig/RunCMakeTest.cmake
@@ -285,7 +285,8 @@ run_cmake_command(NoUnusedVariables ${CMAKE_COMMAND} ${CMAKE_CURRENT_LIST_DIR}
"-DCMAKE_DEFAULT_CONFIGS=all"
)
-if(CMake_TEST_CUDA)
+# CudaSimple uses separable compilation, which is currently only supported on NVCC.
+if(CMake_TEST_CUDA AND NOT CMake_TEST_CUDA STREQUAL "Clang")
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/CudaSimple-build)
run_cmake_configure(CudaSimple)
include(${RunCMake_TEST_BINARY_DIR}/target_files.cmake)
diff --git a/Tests/RunCMake/ObjectLibrary/b.c b/Tests/RunCMake/ObjectLibrary/b.c
index 220ce03..2c65a2b 100644
--- a/Tests/RunCMake/ObjectLibrary/b.c
+++ b/Tests/RunCMake/ObjectLibrary/b.c
@@ -5,7 +5,7 @@
#endif
extern int a(void);
-EXPORT int b()
+EXPORT int b(void)
{
return a();
}
diff --git a/Tests/RunCMake/ObjectLibrary/requires.c b/Tests/RunCMake/ObjectLibrary/requires.c
index 685632b..a5b429a 100644
--- a/Tests/RunCMake/ObjectLibrary/requires.c
+++ b/Tests/RunCMake/ObjectLibrary/requires.c
@@ -1,5 +1,5 @@
#ifdef REQUIRED
-int required()
+int required(void)
{
return 0;
}
diff --git a/Tests/RunCMake/PrecompileHeaders/PchWarnInvalid-check.cmake b/Tests/RunCMake/PrecompileHeaders/PchWarnInvalid-check.cmake
new file mode 100644
index 0000000..3e7fb30
--- /dev/null
+++ b/Tests/RunCMake/PrecompileHeaders/PchWarnInvalid-check.cmake
@@ -0,0 +1,22 @@
+if (NOT CMAKE_C_COMPILER_ID MATCHES "GNU|Intel" OR
+ (CMAKE_C_COMPILER_ID STREQUAL "Intel" AND CMAKE_HOST_WIN32))
+ return()
+endif()
+
+file(STRINGS ${RunCMake_TEST_BINARY_DIR}/compile_commands.json empty_dir_commands
+ REGEX "command.*-Winvalid-pch.*empty.dir/cmake_pch.h")
+file(STRINGS ${RunCMake_TEST_BINARY_DIR}/compile_commands.json foo_dir_commands
+ REGEX "command.*-Winvalid-pch.*foo.dir/cmake_pch.h")
+
+list(LENGTH empty_dir_commands empty_dir_commands_size)
+list(LENGTH foo_dir_commands foo_dir_commands_size)
+
+if (empty_dir_commands_size EQUAL 0)
+ set(RunCMake_TEST_FAILED "empty target should have -Winvalid-pch compile option present")
+ return()
+endif()
+
+if (foo_dir_commands_size GREATER 0)
+ set(RunCMake_TEST_FAILED "foo target should not have -Winvalid-pch compile option present")
+ return()
+endif()
diff --git a/Tests/RunCMake/PrecompileHeaders/PchWarnInvalid.cmake b/Tests/RunCMake/PrecompileHeaders/PchWarnInvalid.cmake
new file mode 100644
index 0000000..4525664
--- /dev/null
+++ b/Tests/RunCMake/PrecompileHeaders/PchWarnInvalid.cmake
@@ -0,0 +1,16 @@
+enable_language(C)
+
+set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
+
+add_library(empty empty.c)
+target_precompile_headers(empty PUBLIC
+ <stdio.h>
+ <string.h>
+)
+
+add_library(foo foo.c)
+target_precompile_headers(foo PUBLIC
+ <stdio.h>
+ <string.h>
+)
+set_target_properties(foo PROPERTIES PCH_WARN_INVALID OFF)
diff --git a/Tests/RunCMake/PrecompileHeaders/RunCMakeTest.cmake b/Tests/RunCMake/PrecompileHeaders/RunCMakeTest.cmake
index f587c7d..381b800 100644
--- a/Tests/RunCMake/PrecompileHeaders/RunCMakeTest.cmake
+++ b/Tests/RunCMake/PrecompileHeaders/RunCMakeTest.cmake
@@ -4,12 +4,9 @@ include(RunCMake)
function(run_test name)
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${name}-build)
run_cmake(${name})
- # Precompiled headers are not supported with multiple architectures.
- if(NOT "$ENV{CMAKE_OSX_ARCHITECTURES}" MATCHES "[;$]")
- set(RunCMake_TEST_NO_CLEAN 1)
- run_cmake_command(${name}-build ${CMAKE_COMMAND} --build . --config Debug)
- run_cmake_command(${name}-test ${CMAKE_CTEST_COMMAND} -C Debug)
- endif()
+ set(RunCMake_TEST_NO_CLEAN 1)
+ run_cmake_command(${name}-build ${CMAKE_COMMAND} --build . --config Debug)
+ run_cmake_command(${name}-test ${CMAKE_CTEST_COMMAND} -C Debug)
endfunction()
run_cmake(DisabledPch)
@@ -21,3 +18,6 @@ run_test(PchReuseFrom)
run_test(PchReuseFromPrefixed)
run_test(PchReuseFromSubdir)
run_cmake(PchMultilanguage)
+if(RunCMake_GENERATOR MATCHES "Make|Ninja")
+ run_cmake(PchWarnInvalid)
+endif()
diff --git a/Tests/RunCMake/PrecompileHeaders/empty.c b/Tests/RunCMake/PrecompileHeaders/empty.c
index 30ae1c4..2a51ebc 100644
--- a/Tests/RunCMake/PrecompileHeaders/empty.c
+++ b/Tests/RunCMake/PrecompileHeaders/empty.c
@@ -1,3 +1,3 @@
-void nothing()
+void nothing(void)
{
}
diff --git a/Tests/RunCMake/Syntax/CommandEOF-stderr.txt b/Tests/RunCMake/Syntax/CommandEOF-stderr.txt
index 31cbc08..b9f8fd1 100644
--- a/Tests/RunCMake/Syntax/CommandEOF-stderr.txt
+++ b/Tests/RunCMake/Syntax/CommandEOF-stderr.txt
@@ -1,4 +1,4 @@
-^CMake Error in CommandEOF.cmake:
+^CMake Error at CommandEOF.cmake:1:
Unexpected end of file.
Parse error. Function missing opening "\(".
diff --git a/Tests/RunCMake/TargetPolicies/PolicyList-stderr.txt b/Tests/RunCMake/TargetPolicies/PolicyList-stderr.txt
index 9a1e027..2d270c5 100644
--- a/Tests/RunCMake/TargetPolicies/PolicyList-stderr.txt
+++ b/Tests/RunCMake/TargetPolicies/PolicyList-stderr.txt
@@ -29,6 +29,8 @@
\* CMP0083
\* CMP0095
\* CMP0099
+ \* CMP0104
+ \* CMP0105
Call Stack \(most recent call first\):
CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/UnityBuild/RunCMakeTest.cmake b/Tests/RunCMake/UnityBuild/RunCMakeTest.cmake
index 24daa64..9ba3c85 100644
--- a/Tests/RunCMake/UnityBuild/RunCMakeTest.cmake
+++ b/Tests/RunCMake/UnityBuild/RunCMakeTest.cmake
@@ -1,14 +1,20 @@
include(RunCMake)
run_cmake(unitybuild_c)
+run_cmake(unitybuild_c_batch)
+run_cmake(unitybuild_c_group)
run_cmake(unitybuild_cxx)
+run_cmake(unitybuild_cxx_group)
run_cmake(unitybuild_c_and_cxx)
+run_cmake(unitybuild_c_and_cxx_group)
run_cmake(unitybuild_batchsize)
run_cmake(unitybuild_default_batchsize)
run_cmake(unitybuild_skip)
run_cmake(unitybuild_code_before_and_after_include)
run_cmake(unitybuild_c_no_unity_build)
+run_cmake(unitybuild_c_no_unity_build_group)
run_cmake(unitybuild_order)
+run_cmake(unitybuild_invalid_mode)
function(run_test name)
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${name}-build)
diff --git a/Tests/RunCMake/UnityBuild/f.c b/Tests/RunCMake/UnityBuild/f.c
new file mode 100644
index 0000000..d5813c6
--- /dev/null
+++ b/Tests/RunCMake/UnityBuild/f.c
@@ -0,0 +1,5 @@
+int f(int x)
+{
+ (void)x;
+ return 0;
+}
diff --git a/Tests/RunCMake/UnityBuild/unitybuild_c_and_cxx_group-check.cmake b/Tests/RunCMake/UnityBuild/unitybuild_c_and_cxx_group-check.cmake
new file mode 100644
index 0000000..b027682
--- /dev/null
+++ b/Tests/RunCMake/UnityBuild/unitybuild_c_and_cxx_group-check.cmake
@@ -0,0 +1,42 @@
+set(unitybuild_a_c "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/tgt.dir/Unity/unity_a_c.c")
+if(NOT EXISTS "${unitybuild_a_c}")
+ set(RunCMake_TEST_FAILED "Generated unity source files ${unitybuild_a_c} does not exist.")
+ return()
+else()
+ #verify that the 4 c file is part of this grouping and therefore UNITY_BUILD_BATCH_SIZE
+ #was ignored
+ file(STRINGS ${unitybuild_a_c} unitybuild_a_c_strings)
+ string(REGEX MATCH ".*#include.*s1.c.*#include.*s2.c.*#include.*s3.c.*#include.*s4.c.*" matched_code ${unitybuild_a_c_strings})
+ if(NOT matched_code)
+ set(RunCMake_TEST_FAILED "Generated unity file doesn't include expected source files")
+ return()
+ endif()
+endif()
+
+set(unitybuild_b_c "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/tgt.dir/Unity/unity_b_c.c")
+if(NOT EXISTS "${unitybuild_b_c}")
+ set(RunCMake_TEST_FAILED "Generated unity source files ${unitybuild_b_c} does not exist.")
+ return()
+endif()
+
+
+set(unitybuild_a_cxx "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/tgt.dir/Unity/unity_a_cxx.cxx")
+if(NOT EXISTS "${unitybuild_a_cxx}")
+ set(RunCMake_TEST_FAILED "Generated unity source files ${unitybuild_a_cxx} does not exist.")
+ return()
+else()
+ #verify that the 4 cxx file are part of this grouping and therefore UNITY_BUILD_BATCH_SIZE
+ #was ignored
+ file(STRINGS ${unitybuild_a_cxx} unitybuild_a_cxx_strings)
+ string(REGEX MATCH ".*#include.*s1.cxx.*#include.*s2.cxx.*#include.*s3.cxx.*#include.*s4.cxx.*" matched_code ${unitybuild_a_cxx_strings})
+ if(NOT matched_code)
+ set(RunCMake_TEST_FAILED "Generated unity file doesn't include expected source files")
+ return()
+ endif()
+endif()
+
+set(unitybuild_b_cxx "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/tgt.dir/Unity/unity_b_cxx.cxx")
+if(NOT EXISTS "${unitybuild_b_cxx}")
+ set(RunCMake_TEST_FAILED "Generated unity source files ${unitybuild_b_cxx} does not exist.")
+ return()
+endif()
diff --git a/Tests/RunCMake/UnityBuild/unitybuild_c_and_cxx_group.cmake b/Tests/RunCMake/UnityBuild/unitybuild_c_and_cxx_group.cmake
new file mode 100644
index 0000000..7bf3f4b
--- /dev/null
+++ b/Tests/RunCMake/UnityBuild/unitybuild_c_and_cxx_group.cmake
@@ -0,0 +1,39 @@
+project(unitybuild_c_and_cxx C CXX)
+
+set(srcs f.c)
+foreach(s RANGE 1 8)
+ set(src_c "${CMAKE_CURRENT_BINARY_DIR}/s${s}.c")
+ file(WRITE "${src_c}" "
+int f(int);\n
+int s${s}(void) { return f(${s}); }\n"
+ )
+
+ set(src_cxx "${CMAKE_CURRENT_BINARY_DIR}/s${s}.cxx")
+ file(WRITE "${src_cxx}" "
+extern \"C\" { \n
+ int f(int); \n
+}\n
+ int s${s}(void) { return f(${s}); }\n"
+ )
+
+ list(APPEND srcs "${src_c}")
+ list(APPEND srcs "${src_cxx}")
+endforeach()
+
+
+
+add_library(tgt SHARED ${srcs})
+
+set_target_properties(tgt PROPERTIES UNITY_BUILD ON
+ UNITY_BUILD_MODE GROUP
+ #UNITY_BUILD_BATCH_SIZE will be ignored
+ UNITY_BUILD_BATCH_SIZE 2)
+
+set_source_files_properties(s1.c s2.c s3.c s4.c
+ s1.cxx s2.cxx s3.cxx s4.cxx
+ PROPERTIES UNITY_GROUP "a"
+ )
+set_source_files_properties(s5.c s6.c s7.c s8.c
+ s5.cxx s6.cxx s7.cxx s8.cxx
+ PROPERTIES UNITY_GROUP "b"
+ )
diff --git a/Tests/RunCMake/UnityBuild/unitybuild_c_batch-check.cmake b/Tests/RunCMake/UnityBuild/unitybuild_c_batch-check.cmake
new file mode 100644
index 0000000..024286d
--- /dev/null
+++ b/Tests/RunCMake/UnityBuild/unitybuild_c_batch-check.cmake
@@ -0,0 +1,5 @@
+set(unitybuild_c "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/tgt.dir/Unity/unity_0_c.c")
+if(NOT EXISTS "${unitybuild_c}")
+ set(RunCMake_TEST_FAILED "Generated unity source files ${unitybuild_c} does not exist.")
+ return()
+endif()
diff --git a/Tests/RunCMake/UnityBuild/unitybuild_c_batch.cmake b/Tests/RunCMake/UnityBuild/unitybuild_c_batch.cmake
new file mode 100644
index 0000000..33873b6
--- /dev/null
+++ b/Tests/RunCMake/UnityBuild/unitybuild_c_batch.cmake
@@ -0,0 +1,15 @@
+project(unitybuild_c C)
+
+set(srcs "")
+foreach(s RANGE 1 8)
+ set(src "${CMAKE_CURRENT_BINARY_DIR}/s${s}.c")
+ file(WRITE "${src}" "int s${s}(void) { return 0; }\n")
+ list(APPEND srcs "${src}")
+endforeach()
+
+add_library(tgt SHARED ${srcs})
+
+set_target_properties(tgt PROPERTIES
+ UNITY_BUILD ON
+ UNITY_BUILD_MODE BATCH
+ )
diff --git a/Tests/RunCMake/UnityBuild/unitybuild_c_group-check.cmake b/Tests/RunCMake/UnityBuild/unitybuild_c_group-check.cmake
new file mode 100644
index 0000000..0b9ea15
--- /dev/null
+++ b/Tests/RunCMake/UnityBuild/unitybuild_c_group-check.cmake
@@ -0,0 +1,11 @@
+set(unitybuild_a_c "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/tgt.dir/Unity/unity_a_c.c")
+if(NOT EXISTS "${unitybuild_a_c}")
+ set(RunCMake_TEST_FAILED "Generated unity source files ${unitybuild_a_c} does not exist.")
+ return()
+endif()
+
+set(unitybuild_b_c "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/tgt.dir/Unity/unity_b_c.c")
+if(NOT EXISTS "${unitybuild_b_c}")
+ set(RunCMake_TEST_FAILED "Generated unity source files ${unitybuild_b_c} does not exist.")
+ return()
+endif()
diff --git a/Tests/RunCMake/UnityBuild/unitybuild_c_group.cmake b/Tests/RunCMake/UnityBuild/unitybuild_c_group.cmake
new file mode 100644
index 0000000..1fa17f3
--- /dev/null
+++ b/Tests/RunCMake/UnityBuild/unitybuild_c_group.cmake
@@ -0,0 +1,17 @@
+project(unitybuild_c C)
+
+set(srcs "")
+foreach(s RANGE 1 8)
+ set(src "${CMAKE_CURRENT_BINARY_DIR}/s${s}.c")
+ file(WRITE "${src}" "int s${s}(void) { return 0; }\n")
+ list(APPEND srcs "${src}")
+endforeach()
+
+add_library(tgt SHARED ${srcs})
+
+set_target_properties(tgt PROPERTIES UNITY_BUILD ON
+ UNITY_BUILD_MODE GROUP)
+
+set_source_files_properties(s1.c PROPERTIES UNITY_GROUP "a")
+set_source_files_properties(s2.c PROPERTIES UNITY_GROUP "a")
+set_source_files_properties(s3.c s4.c PROPERTIES UNITY_GROUP "b")
diff --git a/Tests/RunCMake/UnityBuild/unitybuild_c_no_unity_build_group-check.cmake b/Tests/RunCMake/UnityBuild/unitybuild_c_no_unity_build_group-check.cmake
new file mode 100644
index 0000000..e344627
--- /dev/null
+++ b/Tests/RunCMake/UnityBuild/unitybuild_c_no_unity_build_group-check.cmake
@@ -0,0 +1,5 @@
+set(unitybuild_c "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/tgt.dir/Unity/unity_a_c.c")
+if(EXISTS "${unitybuild_c}")
+ set(RunCMake_TEST_FAILED "Generated unity source files ${unitybuild_c} should not exist.")
+ return()
+endif()
diff --git a/Tests/RunCMake/UnityBuild/unitybuild_c_no_unity_build_group.cmake b/Tests/RunCMake/UnityBuild/unitybuild_c_no_unity_build_group.cmake
new file mode 100644
index 0000000..7b26dc1
--- /dev/null
+++ b/Tests/RunCMake/UnityBuild/unitybuild_c_no_unity_build_group.cmake
@@ -0,0 +1,16 @@
+project(unitybuild_c_no_unity_build C)
+
+set(srcs "")
+foreach(s RANGE 1 8)
+ set(src "${CMAKE_CURRENT_BINARY_DIR}/s${s}.c")
+ file(WRITE "${src}" "int s${s}(void) { return 0; }\n")
+ list(APPEND srcs "${src}")
+endforeach()
+
+add_library(tgt SHARED ${srcs})
+
+#These should be ignored as UNITY_BUILD is off
+set_target_properties(tgt PROPERTIES UNITY_BUILD_MODE GROUP)
+set_source_files_properties(s1.c s2.c s3.c s4.c s5.c s6.c s7.c s8.c
+ PROPERTIES UNITY_GROUP "a"
+ )
diff --git a/Tests/RunCMake/UnityBuild/unitybuild_cxx_group-check.cmake b/Tests/RunCMake/UnityBuild/unitybuild_cxx_group-check.cmake
new file mode 100644
index 0000000..ecef3a3
--- /dev/null
+++ b/Tests/RunCMake/UnityBuild/unitybuild_cxx_group-check.cmake
@@ -0,0 +1,27 @@
+set(unitybuild_a_cxx "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/tgt.dir/Unity/unity_a_cxx.cxx")
+if(NOT EXISTS "${unitybuild_a_cxx}")
+ set(RunCMake_TEST_FAILED "Generated unity source files ${unitybuild_a_cxx} does not exist.")
+ return()
+else()
+ #verify that odr2 is not part of this source set
+ file(STRINGS ${unitybuild_a_cxx} unitybuild_a_cxx_strings)
+ string(REGEX MATCH ".*#include.*odr2.cxx" matched_code ${unitybuild_a_cxx_strings})
+ if(matched_code)
+ set(RunCMake_TEST_FAILED "Generated unity file includes un-expected ord2.cxx source file")
+ return()
+ endif()
+endif()
+
+set(unitybuild_b_cxx "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/tgt.dir/Unity/unity_b_cxx.cxx")
+if(NOT EXISTS "${unitybuild_b_cxx}")
+ set(RunCMake_TEST_FAILED "Generated unity source files ${unitybuild_b_cxx} does not exist.")
+ return()
+else()
+ #verify that odr1 is not part of this source set
+ file(STRINGS ${unitybuild_b_cxx} unitybuild_b_cxx_strings)
+ string(REGEX MATCH ".*#include.*odr1.cxx" matched_code ${unitybuild_b_cxx_strings})
+ if(matched_code)
+ set(RunCMake_TEST_FAILED "Generated unity file includes un-expected ord1.cxx source file")
+ return()
+ endif()
+endif()
diff --git a/Tests/RunCMake/UnityBuild/unitybuild_cxx_group.cmake b/Tests/RunCMake/UnityBuild/unitybuild_cxx_group.cmake
new file mode 100644
index 0000000..9804289
--- /dev/null
+++ b/Tests/RunCMake/UnityBuild/unitybuild_cxx_group.cmake
@@ -0,0 +1,27 @@
+project(unitybuild_cxx CXX)
+
+set(srcs "")
+foreach(s RANGE 1 4)
+ set(src "${CMAKE_CURRENT_BINARY_DIR}/s${s}.cxx")
+ file(WRITE "${src}" "int s${s}(void) { return 0; }\n")
+ list(APPEND srcs "${src}")
+endforeach()
+
+foreach(s RANGE 1 2)
+ set(src "${CMAKE_CURRENT_BINARY_DIR}/odr${s}.cxx")
+ file(WRITE "${src}" "namespace odr { int s${s}(void) { return 0; } }\n")
+ list(APPEND srcs "${src}")
+endforeach()
+
+add_library(tgt SHARED ${srcs})
+
+set_target_properties(tgt PROPERTIES UNITY_BUILD ON
+ UNITY_BUILD_MODE GROUP
+ )
+
+set_source_files_properties(s1.cxx s2.cxx odr1.cxx
+ PROPERTIES UNITY_GROUP "a"
+ )
+set_source_files_properties(s3.cxx s4.cxx odr2.cxx
+ PROPERTIES UNITY_GROUP "b"
+ )
diff --git a/Tests/RunCMake/UnityBuild/unitybuild_invalid_mode-result.txt b/Tests/RunCMake/UnityBuild/unitybuild_invalid_mode-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/UnityBuild/unitybuild_invalid_mode-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/UnityBuild/unitybuild_invalid_mode-stderr.txt b/Tests/RunCMake/UnityBuild/unitybuild_invalid_mode-stderr.txt
new file mode 100644
index 0000000..b1b17a0
--- /dev/null
+++ b/Tests/RunCMake/UnityBuild/unitybuild_invalid_mode-stderr.txt
@@ -0,0 +1,5 @@
+^CMake Error in CMakeLists.txt:
+ Invalid UNITY_BUILD_MODE value of INVALID assigned to target tgt\.
+ Acceptable values are BATCH and GROUP\.
+.*
+CMake Generate step failed\. Build files cannot be regenerated correctly\.$
diff --git a/Tests/RunCMake/UnityBuild/unitybuild_invalid_mode.cmake b/Tests/RunCMake/UnityBuild/unitybuild_invalid_mode.cmake
new file mode 100644
index 0000000..0212200
--- /dev/null
+++ b/Tests/RunCMake/UnityBuild/unitybuild_invalid_mode.cmake
@@ -0,0 +1,12 @@
+project(unitybuild_c C)
+
+set(srcs "")
+foreach(s RANGE 1 8)
+ set(src "${CMAKE_CURRENT_BINARY_DIR}/s${s}.c")
+ file(WRITE "${src}" "int s${s}(void) { return 0; }\n")
+ list(APPEND srcs "${src}")
+endforeach()
+
+add_library(tgt SHARED ${srcs})
+
+set_target_properties(tgt PROPERTIES UNITY_BUILD ON UNITY_BUILD_MODE INVALID)
diff --git a/Tests/RunCMake/VS10Project/CSharpSourceGroup/foo.cs b/Tests/RunCMake/VS10Project/CSharpSourceGroup/foo.cs
new file mode 100644
index 0000000..3695dc9
--- /dev/null
+++ b/Tests/RunCMake/VS10Project/CSharpSourceGroup/foo.cs
@@ -0,0 +1,3 @@
+void foo()
+{
+}
diff --git a/Tests/RunCMake/VS10Project/CSharpSourceGroup/images/empty.bmp b/Tests/RunCMake/VS10Project/CSharpSourceGroup/images/empty.bmp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/Tests/RunCMake/VS10Project/CSharpSourceGroup/images/empty.bmp
diff --git a/Tests/RunCMake/VS10Project/CSharpSourceGroup/nested/baz.cs b/Tests/RunCMake/VS10Project/CSharpSourceGroup/nested/baz.cs
new file mode 100644
index 0000000..d5d334a
--- /dev/null
+++ b/Tests/RunCMake/VS10Project/CSharpSourceGroup/nested/baz.cs
@@ -0,0 +1,3 @@
+void baz()
+{
+}
diff --git a/Tests/RunCMake/VS10Project/RunCMakeTest.cmake b/Tests/RunCMake/VS10Project/RunCMakeTest.cmake
index 8a04f78..93ef603 100644
--- a/Tests/RunCMake/VS10Project/RunCMakeTest.cmake
+++ b/Tests/RunCMake/VS10Project/RunCMakeTest.cmake
@@ -3,12 +3,12 @@ cmake_policy(SET CMP0057 NEW)
include(RunCMake)
cmake_policy(SET CMP0054 NEW)
+run_cmake(VsCsharpSourceGroup)
run_cmake(VsCSharpCompilerOpts)
run_cmake(ExplicitCMakeLists)
run_cmake(RuntimeLibrary)
run_cmake(SourceGroupCMakeLists)
run_cmake(SourceGroupTreeCMakeLists)
-
run_cmake(VsConfigurationType)
run_cmake(VsTargetsFileReferences)
run_cmake(VsCustomProps)
@@ -30,6 +30,10 @@ run_cmake(VsDpiAware)
run_cmake(VsDpiAwareBadParam)
run_cmake(VsPrecompileHeaders)
run_cmake(VsPrecompileHeadersReuseFromCompilePDBName)
+run_cmake(VsDeployEnabled)
+run_cmake(VsSettings)
+run_cmake(VsSourceSettingsTool)
+run_cmake(VsPlatformToolset)
run_cmake(VsWinRTByDefault)
@@ -52,6 +56,7 @@ if (RunCMake_GENERATOR MATCHES "Visual Studio 1[0-4] 201[0-5]" OR
run_cmake(UnityBuildPre2017)
else()
run_cmake(UnityBuildNative)
+ run_cmake(UnityBuildNativeGrouped)
endif()
run_cmake(VsDotnetTargetFramework)
diff --git a/Tests/RunCMake/VS10Project/UnityBuildNativeGrouped-check.cmake b/Tests/RunCMake/VS10Project/UnityBuildNativeGrouped-check.cmake
new file mode 100644
index 0000000..d6380da
--- /dev/null
+++ b/Tests/RunCMake/VS10Project/UnityBuildNativeGrouped-check.cmake
@@ -0,0 +1,56 @@
+set(unitybuild_c0 "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/tgt.dir/Unity/unity_poolA_c.c")
+if(NOT EXISTS "${unitybuild_c0}")
+ set(RunCMake_TEST_FAILED "Generated unity source files ${unitybuild_c0} does not exist.")
+ return()
+endif()
+
+set(unitybuild_c1 "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/tgt.dir/Unity/unity_poolB_c.c")
+if(NOT EXISTS "${unitybuild_c1}")
+ set(RunCMake_TEST_FAILED "Generated unity source files ${unitybuild_c1} does not exist.")
+ return()
+endif()
+
+set(tgt_project "${RunCMake_TEST_BINARY_DIR}/tgt.vcxproj")
+if (NOT EXISTS "${tgt_project}")
+ set(RunCMake_TEST_FAILED "Generated project file ${tgt_project} doesn't exist.")
+ return()
+endif()
+
+file(STRINGS ${tgt_project} tgt_projects_strings)
+
+foreach(line IN LISTS tgt_projects_strings)
+ if (line MATCHES "<EnableUnitySupport>true</EnableUnitySupport>")
+ set(have_unity_support ON)
+ endif()
+
+ if (line MATCHES "<ClCompile Include=.*IncludeInUnityFile=\"false\" CustomUnityFile=\"true\"")
+ list(APPEND unity_source_lines ${line})
+ endif()
+
+ if (line MATCHES "<ClCompile Include=.*IncludeInUnityFile=\"true\" CustomUnityFile=\"true\"")
+ list(APPEND sources_list ${line})
+ endif()
+endforeach()
+
+if (NOT have_unity_support)
+ set(RunCMake_TEST_FAILED "Generated project should include the <EnableUnitySupport> block.")
+ return()
+endif()
+
+string(REPLACE "\\" "/" unity_source_lines "${unity_source_lines}")
+string(FIND "${unity_source_lines}" "CMakeFiles/tgt.dir/Unity/unity_poolA_c.c" unity_source_file_position)
+if (unity_source_file_position EQUAL "-1")
+ set(RunCMake_TEST_FAILED "Generated project should include the generated unity source file 'poolA'.")
+ return()
+endif()
+string(FIND "${unity_source_lines}" "CMakeFiles/tgt.dir/Unity/unity_poolB_c.c" unity_source_file_position)
+if (unity_source_file_position EQUAL "-1")
+ set(RunCMake_TEST_FAILED "Generated project should include the generated unity source file 'poolB'.")
+ return()
+endif()
+
+list(LENGTH sources_list number_of_sources)
+if(NOT number_of_sources EQUAL 7)
+ set(RunCMake_TEST_FAILED "Generated project doesn't include the expect number of files.")
+ return()
+endif()
diff --git a/Tests/RunCMake/VS10Project/UnityBuildNativeGrouped.cmake b/Tests/RunCMake/VS10Project/UnityBuildNativeGrouped.cmake
new file mode 100644
index 0000000..b740e3b
--- /dev/null
+++ b/Tests/RunCMake/VS10Project/UnityBuildNativeGrouped.cmake
@@ -0,0 +1,20 @@
+project(unitybuild_c C)
+
+set(srcs "")
+foreach(s RANGE 1 8)
+ set(src "${CMAKE_CURRENT_BINARY_DIR}/s${s}.c")
+ file(WRITE "${src}" "int s${s}(void) { return 0; }\n")
+ list(APPEND srcs "${src}")
+endforeach()
+
+add_library(tgt SHARED ${srcs})
+
+set_target_properties(tgt PROPERTIES UNITY_BUILD ON UNITY_BUILD_MODE GROUP)
+
+set_source_files_properties(s1.c s2.c s3.c s4.c
+ PROPERTIES UNITY_GROUP "poolA"
+ )
+
+set_source_files_properties(s5.c s6.c s7.c
+ PROPERTIES UNITY_GROUP "poolB"
+ )
diff --git a/Tests/RunCMake/VS10Project/UnityBuildPre2017Grouped-check.cmake b/Tests/RunCMake/VS10Project/UnityBuildPre2017Grouped-check.cmake
new file mode 100644
index 0000000..d9b8c01
--- /dev/null
+++ b/Tests/RunCMake/VS10Project/UnityBuildPre2017Grouped-check.cmake
@@ -0,0 +1,59 @@
+set(unitybuild_c0 "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/tgt.dir/Unity/unity_poolA.c")
+if(NOT EXISTS "${unitybuild_c0}")
+ set(RunCMake_TEST_FAILED "Generated unity source files ${unitybuild_c0} does not exist.")
+ return()
+endif()
+
+set(unitybuild_c1 "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/tgt.dir/Unity/unity_poolB.c")
+if(NOT EXISTS "${unitybuild_c1}")
+ set(RunCMake_TEST_FAILED "Generated unity source files ${unitybuild_c1} does not exist.")
+ return()
+endif()
+
+set(tgt_project "${RunCMake_TEST_BINARY_DIR}/tgt.vcxproj")
+if (NOT EXISTS "${tgt_project}")
+ set(RunCMake_TEST_FAILED "Generated project file ${tgt_project} doesn't exist.")
+ return()
+endif()
+
+file(STRINGS ${tgt_project} tgt_projects_strings)
+
+foreach(line IN LISTS tgt_projects_strings)
+ if (line MATCHES "<ClCompile Include=.*/>")
+ set(unity_source_line ${line})
+ endif()
+
+ if (line MATCHES "<ClCompile Include=\"[^\"]*\">")
+ string(REGEX MATCH "<ClCompile Include=\"([^\"]*)\">" source_file ${line})
+ list(APPEND sources_list ${source_file})
+ endif()
+
+ if (line MATCHES "<ExcludedFromBuild.*</ExcludedFromBuild>")
+ list(APPEND excluded_sources_list ${source_file})
+ endif()
+endforeach()
+
+string(REPLACE "\\" "/" unity_source_line ${unity_source_line})
+string(FIND "${unity_source_line}" "CMakeFiles/tgt.dir/Unity/unity_poolA.c" unity_source_file_position)
+if (unity_source_file_position EQUAL "-1")
+ set(RunCMake_TEST_FAILED "Generated project should include the generated unity source file.")
+ return()
+endif()
+string(FIND "${unity_source_line}" "CMakeFiles/tgt.dir/Unity/unity_poolB.c" unity_source_file_position)
+if (unity_source_file_position EQUAL "-1")
+ set(RunCMake_TEST_FAILED "Generated project should include the generated unity source file.")
+ return()
+endif()
+
+list(LENGTH sources_list number_of_sources)
+if(NOT number_of_sources EQUAL 7)
+ set(RunCMake_TEST_FAILED "Generated project doesn't include the expect number of files.")
+ return()
+endif()
+
+# Exclusions for Debug|Release|MinSizeRel|RelWithDebInfo
+list(LENGTH excluded_sources_list number_of_excluded_sources)
+if(NOT number_of_excluded_sources EQUAL 28)
+ set(RunCMake_TEST_FAILED "Generated project doesn't exclude the source files for all configurations.")
+ return()
+endif()
diff --git a/Tests/RunCMake/VS10Project/UnityBuildPre2017Grouped.cmake b/Tests/RunCMake/VS10Project/UnityBuildPre2017Grouped.cmake
new file mode 100644
index 0000000..b740e3b
--- /dev/null
+++ b/Tests/RunCMake/VS10Project/UnityBuildPre2017Grouped.cmake
@@ -0,0 +1,20 @@
+project(unitybuild_c C)
+
+set(srcs "")
+foreach(s RANGE 1 8)
+ set(src "${CMAKE_CURRENT_BINARY_DIR}/s${s}.c")
+ file(WRITE "${src}" "int s${s}(void) { return 0; }\n")
+ list(APPEND srcs "${src}")
+endforeach()
+
+add_library(tgt SHARED ${srcs})
+
+set_target_properties(tgt PROPERTIES UNITY_BUILD ON UNITY_BUILD_MODE GROUP)
+
+set_source_files_properties(s1.c s2.c s3.c s4.c
+ PROPERTIES UNITY_GROUP "poolA"
+ )
+
+set_source_files_properties(s5.c s6.c s7.c
+ PROPERTIES UNITY_GROUP "poolB"
+ )
diff --git a/Tests/RunCMake/VS10Project/VsCsharpSourceGroup-check.cmake b/Tests/RunCMake/VS10Project/VsCsharpSourceGroup-check.cmake
new file mode 100644
index 0000000..3b5c70f
--- /dev/null
+++ b/Tests/RunCMake/VS10Project/VsCsharpSourceGroup-check.cmake
@@ -0,0 +1,22 @@
+set(csProjFile "${RunCMake_TEST_BINARY_DIR}/VsCsharpSourceGroup.csproj")
+if(NOT EXISTS "${csProjFile}")
+ set(RunCMake_TEST_FAILED "Project file ${csProjFile} does not exist.")
+ return()
+endif()
+
+file(STRINGS "${csProjFile}" lines)
+
+include(${RunCMake_TEST_SOURCE_DIR}/VsCsharpSourceGroupHelpers.cmake)
+
+set(SOURCE_GROUPS_TO_FIND
+ "CSharpSourceGroup"
+ "CSharpSourceGroup/nested"
+ "Images"
+)
+
+foreach(GROUP_NAME IN LISTS ${SOURCE_GROUPS_TO_FIND})
+ find_source_group("${lines}" ${GROUP_NAME})
+ if(NOT ${SOURCE_GROUP_FOUND})
+ return()
+ endif()
+endforeach()
diff --git a/Tests/RunCMake/VS10Project/VsCsharpSourceGroup.cmake b/Tests/RunCMake/VS10Project/VsCsharpSourceGroup.cmake
new file mode 100644
index 0000000..024993c
--- /dev/null
+++ b/Tests/RunCMake/VS10Project/VsCsharpSourceGroup.cmake
@@ -0,0 +1,16 @@
+enable_language(CSharp)
+set(CMAKE_CONFIGURATION_TYPES Debug)
+
+set(SRC_FILES
+ ${CMAKE_CURRENT_SOURCE_DIR}/CSharpSourceGroup/foo.cs
+ ${CMAKE_CURRENT_SOURCE_DIR}/CSharpSourceGroup/nested/baz.cs
+)
+
+set(IMAGE_FILES
+ ${CMAKE_CURRENT_SOURCE_DIR}/CSharpSourceGroup/Images/empty.bmp
+)
+
+add_library(VsCsharpSourceGroup SHARED ${SRC_FILES} ${IMAGE_FILES})
+source_group("CSharpSourceGroup" FILES ${CMAKE_CURRENT_SOURCE_DIR}/CSharpSourceGroup/foo.cs)
+source_group("CSharpSourceGroup/nested" FILES ${CMAKE_CURRENT_SOURCE_DIR}/CSharpSourceGroup/nested/baz.cs)
+source_group("Images" FILES ${IMAGE_FILES})
diff --git a/Tests/RunCMake/VS10Project/VsCsharpSourceGroupHelpers.cmake b/Tests/RunCMake/VS10Project/VsCsharpSourceGroupHelpers.cmake
new file mode 100644
index 0000000..bfa9a67
--- /dev/null
+++ b/Tests/RunCMake/VS10Project/VsCsharpSourceGroupHelpers.cmake
@@ -0,0 +1,15 @@
+function(find_source_group LINES NAME)
+ set(foundSourceGroupLink 0)
+ foreach(line IN LISTS LINES)
+ if(line MATCHES "<Link>${NAME}</Link>")
+ set(foundSourceGroupLink 1)
+ endif()
+ endforeach()
+
+ if(NOT foundSourceGroupLink)
+ set(RunCMake_TEST_FAILED "Source group link for ${NAME} not found." PARENT_SCOPE)
+ set(SOURCE_GROUP_FOUND 0 PARENT_SCOPE)
+ return()
+ endif()
+ set(SOURCE_GROUP_FOUND 1 PARENT_SCOPE)
+endfunction()
diff --git a/Tests/RunCMake/VS10Project/VsDeployEnabled-check.cmake b/Tests/RunCMake/VS10Project/VsDeployEnabled-check.cmake
new file mode 100644
index 0000000..0ff8678
--- /dev/null
+++ b/Tests/RunCMake/VS10Project/VsDeployEnabled-check.cmake
@@ -0,0 +1,58 @@
+set(vcProjectFile "${RunCMake_TEST_BINARY_DIR}/foo.vcxproj")
+if(NOT EXISTS "${vcProjectFile}")
+ set(RunCMake_TEST_FAILED "Project file ${vcProjectFile} does not exist.")
+ return()
+endif()
+#
+# Test solution file for deployment.
+#
+
+set(vcSlnFile "${RunCMake_TEST_BINARY_DIR}/VsDeployEnabled.sln")
+if(NOT EXISTS "${vcSlnFile}")
+ set(RunCMake_TEST_FAILED "Solution file ${vcSlnFile} does not exist.")
+ return()
+endif()
+
+
+
+set(FooProjGUID "")
+set(FoundFooProj FALSE)
+set(InFooProj FALSE)
+set(FoundReleaseDeploy FALSE)
+set(DeployConfigs Debug MinSizeRel RelWithDebInfo )
+
+file(STRINGS "${vcSlnFile}" lines)
+foreach(line IN LISTS lines)
+#message(STATUS "${line}")
+ if( (NOT InFooProj ) AND (line MATCHES "^[ \\t]*Project\\(\"{[A-F0-9-]+}\"\\) = \"foo\", \"foo.vcxproj\", \"({[A-F0-9-]+})\"[ \\t]*$"))
+ # First, identify the GUID for the foo project, and record it.
+ set(FoundFooProj TRUE)
+ set(InFooProj TRUE)
+ set(FooProjGUID ${CMAKE_MATCH_1})
+ elseif(InFooProj AND line MATCHES "EndProject")
+ set(InFooProj FALSE)
+ elseif((NOT InFooProj) AND line MATCHES "${FooProjGUID}\\.Release.*\\.Deploy\\.0")
+ # If foo's Release configuration is set to deploy, this is the error.
+ set(FoundReleaseDeploy TRUE)
+ endif()
+ if( line MATCHES "{[A-F0-9-]+}\\.([^\\|]+).*\\.Deploy\\.0" )
+ # Check that the other configurations ARE set to deploy.
+ list( REMOVE_ITEM DeployConfigs ${CMAKE_MATCH_1})
+ endif()
+endforeach()
+
+if(FoundReleaseDeploy)
+ set(RunCMake_TEST_FAILED "Release deployment enabled.")
+ return()
+endif()
+
+if(NOT FoundFooProj)
+ set(RunCMake_TEST_FAILED "Failed to find foo project in the solution.")
+ return()
+endif()
+
+list(LENGTH DeployConfigs length)
+if( length GREATER 0 )
+ set(RunCMake_TEST_FAILED "Failed to find Deploy lines for non-Release configurations. (${length})")
+ return()
+endif()
diff --git a/Tests/RunCMake/VS10Project/VsDeployEnabled.cmake b/Tests/RunCMake/VS10Project/VsDeployEnabled.cmake
new file mode 100644
index 0000000..02b42b2
--- /dev/null
+++ b/Tests/RunCMake/VS10Project/VsDeployEnabled.cmake
@@ -0,0 +1,12 @@
+enable_language(CXX)
+
+set(DEPLOY_DIR
+ "temp\\foodir"
+)
+
+add_library(foo SHARED foo.cpp)
+
+set_target_properties(foo
+ PROPERTIES
+ VS_SOLUTION_DEPLOY $<NOT:$<CONFIG:Release>>
+)
diff --git a/Tests/RunCMake/VS10Project/VsPlatformToolset-check.cmake b/Tests/RunCMake/VS10Project/VsPlatformToolset-check.cmake
new file mode 100644
index 0000000..416220b
--- /dev/null
+++ b/Tests/RunCMake/VS10Project/VsPlatformToolset-check.cmake
@@ -0,0 +1,36 @@
+macro(ReadPlatformToolset tgt outvar)
+ set(vcProjectFile "${RunCMake_TEST_BINARY_DIR}/${tgt}.vcxproj")
+ if(NOT EXISTS "${vcProjectFile}")
+ set(RunCMake_TEST_FAILED "Project file ${tgt}.vcxproj does not exist.")
+ return()
+ endif()
+
+ set(HAVE_PlatformToolset 0)
+
+ file(STRINGS "${vcProjectFile}" lines)
+ foreach(line IN LISTS lines)
+ if(line MATCHES "^ *<PlatformToolset>([^<>]+)</PlatformToolset>")
+ set(${outvar} "${CMAKE_MATCH_1}")
+ set(HAVE_PlatformToolset 1)
+ break()
+ endif()
+ endforeach()
+
+ if(NOT HAVE_PlatformToolset)
+ set(RunCMake_TEST_FAILED "Project file ${tgt}.vcxproj does not have a <PlatformToolset> field.")
+ return()
+ endif()
+endmacro()
+
+ReadPlatformToolset(NormalPlatformToolset NORMAL_TOOLSET)
+ReadPlatformToolset(OverridenPlatformToolset OVERRIDEN_TOOLSET)
+
+if (NOT "${OVERRIDEN_TOOLSET}" STREQUAL "MyCustomToolset")
+ set(RunCMake_TEST_FAILED "Failed to override the platform toolset")
+ return()
+endif()
+
+if ("${NORMAL_TOOLSET}" STREQUAL "MyCustomToolset")
+ set(RunCMake_TEST_FAILED "Main toolset was overriden (it shouldn't)")
+ return()
+endif()
diff --git a/Tests/RunCMake/VS10Project/VsPlatformToolset.cmake b/Tests/RunCMake/VS10Project/VsPlatformToolset.cmake
new file mode 100644
index 0000000..dce9717
--- /dev/null
+++ b/Tests/RunCMake/VS10Project/VsPlatformToolset.cmake
@@ -0,0 +1,6 @@
+enable_language(CXX)
+
+add_library(NormalPlatformToolset foo.cpp)
+add_library(OverridenPlatformToolset foo.cpp)
+set_target_properties(OverridenPlatformToolset
+ PROPERTIES VS_PLATFORM_TOOLSET MyCustomToolset)
diff --git a/Tests/RunCMake/VS10Project/VsSettings-check.cmake b/Tests/RunCMake/VS10Project/VsSettings-check.cmake
new file mode 100644
index 0000000..0f8b26c
--- /dev/null
+++ b/Tests/RunCMake/VS10Project/VsSettings-check.cmake
@@ -0,0 +1,23 @@
+macro(ensure_props_set projectFile)
+ if(NOT EXISTS "${projectFile}")
+ set(RunCMake_TEST_FAILED "Project file ${projectFile} does not exist.")
+ return()
+ endif()
+
+ set(SettingFound FALSE)
+
+ file(STRINGS "${projectFile}" lines)
+ foreach(line IN LISTS lines)
+ if(line MATCHES "<SourceProperty1.*Debug.*>SourceProperty1Value</SourceProperty1>")
+ message("SourceProperty1 setting found")
+ set(SettingFound TRUE)
+ endif()
+ endforeach()
+
+ if (NOT SettingFound)
+ set(RunCMake_TEST_FAILED "SourceProperty1 setting was not found")
+ return()
+ endif()
+endmacro()
+
+ensure_props_set("${RunCMake_TEST_BINARY_DIR}/foo.vcxproj")
diff --git a/Tests/RunCMake/VS10Project/VsSettings.cmake b/Tests/RunCMake/VS10Project/VsSettings.cmake
new file mode 100644
index 0000000..a4b321b
--- /dev/null
+++ b/Tests/RunCMake/VS10Project/VsSettings.cmake
@@ -0,0 +1,5 @@
+enable_language(CXX)
+
+add_library(foo foo.cpp shader.hlsl)
+set_property(SOURCE shader.hlsl PROPERTY VS_SETTINGS
+ "$<$<CONFIG:DEBUG>:SourceProperty1=SourceProperty1Value>")
diff --git a/Tests/RunCMake/VS10Project/VsSourceSettingsTool-check.cmake b/Tests/RunCMake/VS10Project/VsSourceSettingsTool-check.cmake
new file mode 100644
index 0000000..29a89c3
--- /dev/null
+++ b/Tests/RunCMake/VS10Project/VsSourceSettingsTool-check.cmake
@@ -0,0 +1,34 @@
+macro(ensure_props_set projectFile)
+ if(NOT EXISTS "${projectFile}")
+ set(RunCMake_TEST_FAILED "Project file ${projectFile} does not exist.")
+ return()
+ endif()
+
+ set(FirstSettingFound FALSE)
+ set(SecondSettingFound FALSE)
+
+ file(STRINGS "${projectFile}" lines)
+ foreach(line IN LISTS lines)
+ if(line MATCHES "<TargetProperty1.*Debug.*>TargetProperty1ValueDebug</TargetProperty1>")
+ if (FirstSettingFound)
+ message("TargetProperty1 setting found twice")
+ set(SecondSettingFound TRUE)
+ else()
+ message("TargetProperty1 setting found once")
+ set(FirstSettingFound TRUE)
+ endif()
+ endif()
+ endforeach()
+
+ if (NOT FirstSettingFound)
+ set(RunCMake_TEST_FAILED "TargetProperty1 setting not found at all")
+ return()
+ endif()
+
+ if (NOT SecondSettingFound)
+ set(RunCMake_TEST_FAILED "TargetProperty1 setting found once when it should be found twice")
+ return()
+ endif()
+endmacro()
+
+ensure_props_set("${RunCMake_TEST_BINARY_DIR}/foo.vcxproj")
diff --git a/Tests/RunCMake/VS10Project/VsSourceSettingsTool.cmake b/Tests/RunCMake/VS10Project/VsSourceSettingsTool.cmake
new file mode 100644
index 0000000..498962f
--- /dev/null
+++ b/Tests/RunCMake/VS10Project/VsSourceSettingsTool.cmake
@@ -0,0 +1,5 @@
+enable_language(CXX)
+
+add_library(foo foo.cpp shader.hlsl shader2.hlsl)
+set_property(TARGET foo PROPERTY VS_SOURCE_SETTINGS_FXCompile
+ "$<$<CONFIG:DEBUG>:TargetProperty1=TargetProperty1ValueDebug>")
diff --git a/Tests/RunCMake/VS10Project/shader.hlsl b/Tests/RunCMake/VS10Project/shader.hlsl
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/Tests/RunCMake/VS10Project/shader.hlsl
@@ -0,0 +1 @@
+
diff --git a/Tests/RunCMake/VS10Project/shader2.hlsl b/Tests/RunCMake/VS10Project/shader2.hlsl
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/Tests/RunCMake/VS10Project/shader2.hlsl
@@ -0,0 +1 @@
+
diff --git a/Tests/RunCMake/add_link_options/GENEX_LINK_LANG.cmake b/Tests/RunCMake/add_link_options/GENEX_LINK_LANG.cmake
new file mode 100644
index 0000000..cc4ce4c
--- /dev/null
+++ b/Tests/RunCMake/add_link_options/GENEX_LINK_LANG.cmake
@@ -0,0 +1,16 @@
+
+enable_language(C)
+
+set(obj "${CMAKE_C_OUTPUT_EXTENSION}")
+if(BORLAND)
+ set(pre -)
+endif()
+
+add_link_options ($<$<LINK_LANGUAGE:C>:${pre}BADFLAG_LANG_C${obj}>
+ $<$<LINK_LANGUAGE:CXX>:${pre}BADFLAG_LANG_CXX${obj}>)
+
+add_library(LinkOptions_shared SHARED LinkOptionsLib.c)
+
+add_library(LinkOptions_mod MODULE LinkOptionsLib.c)
+
+add_executable(LinkOptions_exe LinkOptionsExe.c)
diff --git a/Tests/RunCMake/add_link_options/LINKER_expansion-validation.cmake b/Tests/RunCMake/add_link_options/LINKER_expansion-validation.cmake
index bebd6c7..ece3ba0 100644
--- a/Tests/RunCMake/add_link_options/LINKER_expansion-validation.cmake
+++ b/Tests/RunCMake/add_link_options/LINKER_expansion-validation.cmake
@@ -11,5 +11,8 @@ endif()
file(READ "${RunCMake_TEST_BINARY_DIR}/LINKER.txt" linker_flag)
if (NOT actual_stdout MATCHES "${linker_flag}")
- set (RunCMake_TEST_FAILED "LINKER: was not expanded correctly.")
+ if (RunCMake_TEST_FAILED)
+ string (APPEND RunCMake_TEST_FAILED "\n")
+ endif()
+ string (APPEND RunCMake_TEST_FAILED "LINKER: was not expanded correctly.")
endif()
diff --git a/Tests/RunCMake/add_link_options/LINK_OPTIONS-exe-check.cmake b/Tests/RunCMake/add_link_options/LINK_OPTIONS-exe-check.cmake
index 4a22d7e..127a2f5 100644
--- a/Tests/RunCMake/add_link_options/LINK_OPTIONS-exe-check.cmake
+++ b/Tests/RunCMake/add_link_options/LINK_OPTIONS-exe-check.cmake
@@ -3,5 +3,8 @@ if (NOT actual_stdout MATCHES "BADFLAG_EXECUTABLE_RELEASE")
set (RunCMake_TEST_FAILED "Not found expected 'BADFLAG_EXECUTABLE_RELEASE'.")
endif()
if (actual_stdout MATCHES "BADFLAG_(SHARED|MODULE)_RELEASE")
- set (RunCMake_TEST_FAILED "Found unexpected 'BADFLAG_(SHARED|MODULE)_RELEASE'.")
+ if (RunCMake_TEST_FAILED)
+ string (APPEND RunCMake_TEST_FAILED "\n")
+ endif()
+ string (APPEND RunCMake_TEST_FAILED "Found unexpected 'BADFLAG_(SHARED|MODULE)_RELEASE'.")
endif()
diff --git a/Tests/RunCMake/add_link_options/LINK_OPTIONS-mod-check.cmake b/Tests/RunCMake/add_link_options/LINK_OPTIONS-mod-check.cmake
index d695761..874e0ad 100644
--- a/Tests/RunCMake/add_link_options/LINK_OPTIONS-mod-check.cmake
+++ b/Tests/RunCMake/add_link_options/LINK_OPTIONS-mod-check.cmake
@@ -3,5 +3,8 @@ if (NOT actual_stdout MATCHES "BADFLAG_MODULE_RELEASE")
set (RunCMake_TEST_FAILED "Not found expected 'BADFLAG_MODULE_RELEASE'.")
endif()
if (actual_stdout MATCHES "BADFLAG_(SHARED|EXECUTABLE)_RELEASE")
- set (RunCMake_TEST_FAILED "Found unexpected 'BADFLAG_(SHARED|EXECUTABLE)_RELEASE'.")
+ if (RunCMake_TEST_FAILED)
+ string (APPEND RunCMake_TEST_FAILED "\n")
+ endif()
+ string (APPEND RunCMake_TEST_FAILED "Found unexpected 'BADFLAG_(SHARED|EXECUTABLE)_RELEASE'.")
endif()
diff --git a/Tests/RunCMake/add_link_options/LINK_OPTIONS-shared-check.cmake b/Tests/RunCMake/add_link_options/LINK_OPTIONS-shared-check.cmake
index eaac8e3..ecba17e 100644
--- a/Tests/RunCMake/add_link_options/LINK_OPTIONS-shared-check.cmake
+++ b/Tests/RunCMake/add_link_options/LINK_OPTIONS-shared-check.cmake
@@ -3,5 +3,8 @@ if (NOT actual_stdout MATCHES "BADFLAG_SHARED_RELEASE")
set (RunCMake_TEST_FAILED "Not found expected 'BADFLAG_SHARED_RELEASE'.")
endif()
if (actual_stdout MATCHES "BADFLAG_(MODULE|EXECUTABLE)_RELEASE")
- set (RunCMake_TEST_FAILED "Found unexpected 'BADFLAG_(MODULE|EXECUTABLE)_RELEASE'.")
+ if (RunCMake_TEST_FAILED)
+ string (APPEND RunCMake_TEST_FAILED "\n")
+ endif()
+ string (APPEND RunCMake_TEST_FAILED "Found unexpected 'BADFLAG_(MODULE|EXECUTABLE)_RELEASE'.")
endif()
diff --git a/Tests/RunCMake/add_link_options/LinkOptionsLib.cxx b/Tests/RunCMake/add_link_options/LinkOptionsLib.cxx
new file mode 100644
index 0000000..9bbd24c
--- /dev/null
+++ b/Tests/RunCMake/add_link_options/LinkOptionsLib.cxx
@@ -0,0 +1,7 @@
+#if defined(_WIN32)
+__declspec(dllexport)
+#endif
+ int flags_lib(void)
+{
+ return 0;
+}
diff --git a/Tests/RunCMake/add_link_options/RunCMakeTest.cmake b/Tests/RunCMake/add_link_options/RunCMakeTest.cmake
index 4f5df72..465ff85 100644
--- a/Tests/RunCMake/add_link_options/RunCMakeTest.cmake
+++ b/Tests/RunCMake/add_link_options/RunCMakeTest.cmake
@@ -23,6 +23,21 @@ if (NOT CMAKE_C_COMPILER_ID STREQUAL "Intel")
run_cmake_target(LINK_OPTIONS mod LinkOptions_mod --config Release)
run_cmake_target(LINK_OPTIONS exe LinkOptions_exe --config Release)
+
+ run_cmake(genex_LINK_LANGUAGE)
+
+ run_cmake_target(genex_LINK_LANGUAGE shared_c LinkOptions_shared_c --config Release)
+ run_cmake_target(genex_LINK_LANGUAGE shared_cxx LinkOptions_shared_cxx --config Release)
+ run_cmake_target(genex_LINK_LANGUAGE mod LinkOptions_mod --config Release)
+ run_cmake_target(genex_LINK_LANGUAGE exe LinkOptions_exe --config Release)
+
+ run_cmake(genex_LINK_LANG_AND_ID)
+
+ run_cmake_target(genex_LINK_LANG_AND_ID shared_c LinkOptions_shared_c --config Release)
+ run_cmake_target(genex_LINK_LANG_AND_ID shared_cxx LinkOptions_shared_cxx --config Release)
+ run_cmake_target(genex_LINK_LANG_AND_ID mod LinkOptions_mod --config Release)
+ run_cmake_target(genex_LINK_LANG_AND_ID exe LinkOptions_exe --config Release)
+
unset(RunCMake_TEST_OPTIONS)
unset(RunCMake_TEST_OUTPUT_MERGE)
endif()
diff --git a/Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE-exe-check.cmake b/Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE-exe-check.cmake
new file mode 100644
index 0000000..71f641d
--- /dev/null
+++ b/Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE-exe-check.cmake
@@ -0,0 +1,2 @@
+
+include ("${CMAKE_CURRENT_LIST_DIR}/genex_LINK_LANGUAGE-validation.cmake")
diff --git a/Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE-exe-result.txt b/Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE-exe-result.txt
new file mode 100644
index 0000000..8d98f9d
--- /dev/null
+++ b/Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE-exe-result.txt
@@ -0,0 +1 @@
+.*
diff --git a/Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE-mod-check.cmake b/Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE-mod-check.cmake
new file mode 100644
index 0000000..71f641d
--- /dev/null
+++ b/Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE-mod-check.cmake
@@ -0,0 +1,2 @@
+
+include ("${CMAKE_CURRENT_LIST_DIR}/genex_LINK_LANGUAGE-validation.cmake")
diff --git a/Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE-mod-result.txt b/Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE-mod-result.txt
new file mode 100644
index 0000000..8d98f9d
--- /dev/null
+++ b/Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE-mod-result.txt
@@ -0,0 +1 @@
+.*
diff --git a/Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE-shared_c-check.cmake b/Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE-shared_c-check.cmake
new file mode 100644
index 0000000..ba0120c
--- /dev/null
+++ b/Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE-shared_c-check.cmake
@@ -0,0 +1,5 @@
+
+set (VALID_LANG C)
+set (INVALID_LANG CXX)
+
+include ("${CMAKE_CURRENT_LIST_DIR}/genex_LINK_LANGUAGE-validation.cmake")
diff --git a/Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE-shared_c-result.txt b/Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE-shared_c-result.txt
new file mode 100644
index 0000000..8d98f9d
--- /dev/null
+++ b/Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE-shared_c-result.txt
@@ -0,0 +1 @@
+.*
diff --git a/Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE-shared_cxx-check.cmake b/Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE-shared_cxx-check.cmake
new file mode 100644
index 0000000..aa39810
--- /dev/null
+++ b/Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE-shared_cxx-check.cmake
@@ -0,0 +1,5 @@
+
+set (VALID_LANG CXX)
+set (INVALID_LANG C)
+
+include ("${CMAKE_CURRENT_LIST_DIR}/genex_LINK_LANGUAGE-validation.cmake")
diff --git a/Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE-shared_cxx-result.txt b/Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE-shared_cxx-result.txt
new file mode 100644
index 0000000..8d98f9d
--- /dev/null
+++ b/Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE-shared_cxx-result.txt
@@ -0,0 +1 @@
+.*
diff --git a/Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE-validation.cmake b/Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE-validation.cmake
new file mode 100644
index 0000000..f0237ab
--- /dev/null
+++ b/Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE-validation.cmake
@@ -0,0 +1,17 @@
+
+if (NOT DEFINED VALID_LANG)
+ set (VALID_LANG C)
+endif()
+if (NOT DEFINED INVALID_LANG)
+ set (INVALID_LANG CXX)
+endif()
+
+if (NOT actual_stdout MATCHES "BADFLAG_${VALID_LANG}_LANG")
+ set (RunCMake_TEST_FAILED "Not found expected 'BADFLAG_${VALID_LANG}_LANG'.")
+endif()
+if (actual_stdout MATCHES "BADFLAG_${INVALID_LANG}_LANG")
+ if (RunCMake_TEST_FAILED)
+ string (APPEND RunCMake_TEST_FAILED "\n")
+ endif()
+ string (APPEND RunCMake_TEST_FAILED "Found unexpected 'BADFLAG_${INVALID_LANG}_LANG'.")
+endif()
diff --git a/Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE.cmake b/Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE.cmake
new file mode 100644
index 0000000..d74d448
--- /dev/null
+++ b/Tests/RunCMake/add_link_options/genex_LINK_LANGUAGE.cmake
@@ -0,0 +1,17 @@
+
+enable_language(C)
+enable_language(CXX)
+
+if(BORLAND)
+ set(pre -)
+endif()
+
+add_link_options ($<$<LINK_LANGUAGE:C>:${pre}BADFLAG_$<LINK_LANGUAGE>_LANG${CMAKE_C_OUTPUT_EXTENSION}>
+ $<$<LINK_LANGUAGE:CXX>:${pre}BADFLAG_$<LINK_LANGUAGE>_LANG${CMAKE_CXX_OUTPUT_EXTENSION}>)
+
+add_library(LinkOptions_shared_c SHARED LinkOptionsLib.c)
+add_library(LinkOptions_shared_cxx SHARED LinkOptionsLib.cxx)
+
+add_library(LinkOptions_mod MODULE LinkOptionsLib.c)
+
+add_executable(LinkOptions_exe LinkOptionsExe.c)
diff --git a/Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID-exe-check.cmake b/Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID-exe-check.cmake
new file mode 100644
index 0000000..6bddee1
--- /dev/null
+++ b/Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID-exe-check.cmake
@@ -0,0 +1,2 @@
+
+include ("${CMAKE_CURRENT_LIST_DIR}/genex_LINK_LANG_AND_ID-validation.cmake")
diff --git a/Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID-exe-result.txt b/Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID-exe-result.txt
new file mode 100644
index 0000000..8d98f9d
--- /dev/null
+++ b/Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID-exe-result.txt
@@ -0,0 +1 @@
+.*
diff --git a/Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID-mod-check.cmake b/Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID-mod-check.cmake
new file mode 100644
index 0000000..6bddee1
--- /dev/null
+++ b/Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID-mod-check.cmake
@@ -0,0 +1,2 @@
+
+include ("${CMAKE_CURRENT_LIST_DIR}/genex_LINK_LANG_AND_ID-validation.cmake")
diff --git a/Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID-mod-result.txt b/Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID-mod-result.txt
new file mode 100644
index 0000000..8d98f9d
--- /dev/null
+++ b/Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID-mod-result.txt
@@ -0,0 +1 @@
+.*
diff --git a/Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID-shared_c-check.cmake b/Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID-shared_c-check.cmake
new file mode 100644
index 0000000..cf498d9
--- /dev/null
+++ b/Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID-shared_c-check.cmake
@@ -0,0 +1,5 @@
+
+set (VALID_LANG C)
+set (INVALID_LANG CXX)
+
+include ("${CMAKE_CURRENT_LIST_DIR}/genex_LINK_LANG_AND_ID-validation.cmake")
diff --git a/Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID-shared_c-result.txt b/Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID-shared_c-result.txt
new file mode 100644
index 0000000..8d98f9d
--- /dev/null
+++ b/Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID-shared_c-result.txt
@@ -0,0 +1 @@
+.*
diff --git a/Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID-shared_cxx-check.cmake b/Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID-shared_cxx-check.cmake
new file mode 100644
index 0000000..ed4f851
--- /dev/null
+++ b/Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID-shared_cxx-check.cmake
@@ -0,0 +1,5 @@
+
+set (VALID_LANG CXX)
+set (INVALID_LANG C)
+
+include ("${CMAKE_CURRENT_LIST_DIR}/genex_LINK_LANG_AND_ID-validation.cmake")
diff --git a/Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID-shared_cxx-result.txt b/Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID-shared_cxx-result.txt
new file mode 100644
index 0000000..8d98f9d
--- /dev/null
+++ b/Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID-shared_cxx-result.txt
@@ -0,0 +1 @@
+.*
diff --git a/Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID-validation.cmake b/Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID-validation.cmake
new file mode 100644
index 0000000..a5dc27f
--- /dev/null
+++ b/Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID-validation.cmake
@@ -0,0 +1,23 @@
+
+if (NOT VALID_LANG)
+ set (VALID_LANG C)
+endif()
+if (NOT INVALID_LANG)
+ set (INVALID_LANG CXX)
+endif()
+
+if (NOT actual_stdout MATCHES "BADFLAG_${VALID_LANG}_LANG_ID")
+ set (RunCMake_TEST_FAILED "Not found expected 'BADFLAG_${VALID_LANG}_LANG_ID'.\n")
+endif()
+if (actual_stdout MATCHES "BADFLAG_${INVALID_LANG}_LANG_ID")
+ if (RunCMake_TEST_FAILED)
+ string (APPEND RunCMake_TEST_FAILED "\n")
+ endif()
+ string (APPEND RunCMake_TEST_FAILED "Found unexpected 'BADFLAG_${INVALID_LANG}_LANG_ID '.")
+endif()
+if (actual_stdout MATCHES "BADFLAG_(${VALID_LANG}|${INVALID_LANG})_BADID")
+ if (RunCMake_TEST_FAILED)
+ string (APPEND RunCMake_TEST_FAILED "\n")
+ endif()
+ string (APPEND RunCMake_TEST_FAILED "Found unexpected 'BADFLAG_(${VALID_LANG}|${INVALID_LANG})_BADID'.")
+endif()
diff --git a/Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID.cmake b/Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID.cmake
new file mode 100644
index 0000000..c807050
--- /dev/null
+++ b/Tests/RunCMake/add_link_options/genex_LINK_LANG_AND_ID.cmake
@@ -0,0 +1,19 @@
+
+enable_language(C)
+enable_language(CXX)
+
+if(BORLAND)
+ set(pre -)
+endif()
+
+add_link_options ($<$<LINK_LANG_AND_ID:C,${CMAKE_C_COMPILER_ID}>:${pre}BADFLAG_C_LANG_ID${CMAKE_C_OUTPUT_EXTENSION}>
+ $<$<LINK_LANG_AND_ID:CXX,${CMAKE_CXX_COMPILER_ID}>:${pre}BADFLAG_CXX_LANG_ID${CMAKE_CXX_OUTPUT_EXTENSION}>
+ $<$<LINK_LANG_AND_ID:C,BADID>:${pre}BADFLAG_C_BADID${CMAKE_C_OUTPUT_EXTENSION}>
+ $<$<LINK_LANG_AND_ID:CXX,BADID>:${pre}BADFLAG_CXX_BADID${CMAKE_CXX_OUTPUT_EXTENSION}>)
+
+add_library(LinkOptions_shared_c SHARED LinkOptionsLib.c)
+add_library(LinkOptions_shared_cxx SHARED LinkOptionsLib.cxx)
+
+add_library(LinkOptions_mod MODULE LinkOptionsLib.c)
+
+add_executable(LinkOptions_exe LinkOptionsExe.c)
diff --git a/Tests/RunCMake/add_test/CMakeLists.txt.in b/Tests/RunCMake/add_test/CMakeLists.txt.in
new file mode 100644
index 0000000..495240d
--- /dev/null
+++ b/Tests/RunCMake/add_test/CMakeLists.txt.in
@@ -0,0 +1,27 @@
+if (NOT DEFINED RUN_AS_SCRIPT)
+
+ cmake_minimum_required(VERSION 3.7)
+ project(@CASE_NAME@ NONE)
+ include(CTest)
+
+ # Two fallback tests for set_tests_properties.
+ add_test(NAME PrefixTest COMMAND "${CMAKE_COMMAND}" --version)
+ add_test(NAME SuffixTest COMMAND "${CMAKE_COMMAND}" --version)
+
+ add_test(
+ NAME @CASE_CMAKELISTS_NAME_1@
+ COMMAND "${CMAKE_COMMAND}" -D RUN_AS_SCRIPT=1 -P "${CMAKE_CURRENT_LIST_FILE}"
+ )
+ set_tests_properties(
+ @CASE_CMAKELISTS_NAME_2@
+ PROPERTIES
+ ENVIRONMENT CMAKE_add_test_ENVVAR=1
+ )
+
+else()
+
+ if(NOT DEFINED ENV{CMAKE_add_test_ENVVAR})
+ message(FATAL_ERROR "Setting property on test did not succeed!")
+ endif()
+
+endif()
diff --git a/Tests/RunCMake/add_test/NameContainsBracketArgument1-stdout.txt b/Tests/RunCMake/add_test/NameContainsBracketArgument1-stdout.txt
new file mode 100644
index 0000000..00865d0
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsBracketArgument1-stdout.txt
@@ -0,0 +1 @@
+Test #[0-9]+: \[=\[BracketArgument;SuffixTest\]=\] \.+[ ]+Passed
diff --git a/Tests/RunCMake/add_test/NameContainsBracketArgument2-stdout.txt b/Tests/RunCMake/add_test/NameContainsBracketArgument2-stdout.txt
new file mode 100644
index 0000000..a744beb
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsBracketArgument2-stdout.txt
@@ -0,0 +1 @@
+Test #[0-9]+: BracketArgument;SuffixTest \.+[ ]+Passed
diff --git a/Tests/RunCMake/add_test/NameContainsBracketArgument3-result.txt b/Tests/RunCMake/add_test/NameContainsBracketArgument3-result.txt
new file mode 100644
index 0000000..b57e2de
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsBracketArgument3-result.txt
@@ -0,0 +1 @@
+(-1|255)
diff --git a/Tests/RunCMake/add_test/NameContainsBracketArgument3-stderr.txt b/Tests/RunCMake/add_test/NameContainsBracketArgument3-stderr.txt
new file mode 100644
index 0000000..32c2112
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsBracketArgument3-stderr.txt
@@ -0,0 +1,2 @@
+Error\(s\) when configuring the project
+No tests were found!!!
diff --git a/Tests/RunCMake/add_test/NameContainsBracketArgument4-result.txt b/Tests/RunCMake/add_test/NameContainsBracketArgument4-result.txt
new file mode 100644
index 0000000..b57e2de
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsBracketArgument4-result.txt
@@ -0,0 +1 @@
+(-1|255)
diff --git a/Tests/RunCMake/add_test/NameContainsBracketArgument4-stderr.txt b/Tests/RunCMake/add_test/NameContainsBracketArgument4-stderr.txt
new file mode 100644
index 0000000..32c2112
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsBracketArgument4-stderr.txt
@@ -0,0 +1,2 @@
+Error\(s\) when configuring the project
+No tests were found!!!
diff --git a/Tests/RunCMake/add_test/NameContainsEscapedQuote1-result.txt b/Tests/RunCMake/add_test/NameContainsEscapedQuote1-result.txt
new file mode 100644
index 0000000..b57e2de
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsEscapedQuote1-result.txt
@@ -0,0 +1 @@
+(-1|255)
diff --git a/Tests/RunCMake/add_test/NameContainsEscapedQuote1-stderr.txt b/Tests/RunCMake/add_test/NameContainsEscapedQuote1-stderr.txt
new file mode 100644
index 0000000..0661945
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsEscapedQuote1-stderr.txt
@@ -0,0 +1 @@
+Unable to find executable: SuffixTest
diff --git a/Tests/RunCMake/add_test/NameContainsEscapedQuote1-stdout.txt b/Tests/RunCMake/add_test/NameContainsEscapedQuote1-stdout.txt
new file mode 100644
index 0000000..4875409
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsEscapedQuote1-stdout.txt
@@ -0,0 +1 @@
+Test #[0-9]+: EscapedQuote \.+\*\*\*Not Run
diff --git a/Tests/RunCMake/add_test/NameContainsEscapedQuote2-result.txt b/Tests/RunCMake/add_test/NameContainsEscapedQuote2-result.txt
new file mode 100644
index 0000000..b57e2de
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsEscapedQuote2-result.txt
@@ -0,0 +1 @@
+(-1|255)
diff --git a/Tests/RunCMake/add_test/NameContainsEscapedQuote2-stderr.txt b/Tests/RunCMake/add_test/NameContainsEscapedQuote2-stderr.txt
new file mode 100644
index 0000000..0661945
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsEscapedQuote2-stderr.txt
@@ -0,0 +1 @@
+Unable to find executable: SuffixTest
diff --git a/Tests/RunCMake/add_test/NameContainsEscapedQuote2-stdout.txt b/Tests/RunCMake/add_test/NameContainsEscapedQuote2-stdout.txt
new file mode 100644
index 0000000..4875409
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsEscapedQuote2-stdout.txt
@@ -0,0 +1 @@
+Test #[0-9]+: EscapedQuote \.+\*\*\*Not Run
diff --git a/Tests/RunCMake/add_test/NameContainsEscapedQuote3-result.txt b/Tests/RunCMake/add_test/NameContainsEscapedQuote3-result.txt
new file mode 100644
index 0000000..b57e2de
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsEscapedQuote3-result.txt
@@ -0,0 +1 @@
+(-1|255)
diff --git a/Tests/RunCMake/add_test/NameContainsEscapedQuote3-stderr.txt b/Tests/RunCMake/add_test/NameContainsEscapedQuote3-stderr.txt
new file mode 100644
index 0000000..0661945
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsEscapedQuote3-stderr.txt
@@ -0,0 +1 @@
+Unable to find executable: SuffixTest
diff --git a/Tests/RunCMake/add_test/NameContainsEscapedQuote3-stdout.txt b/Tests/RunCMake/add_test/NameContainsEscapedQuote3-stdout.txt
new file mode 100644
index 0000000..4875409
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsEscapedQuote3-stdout.txt
@@ -0,0 +1 @@
+Test #[0-9]+: EscapedQuote \.+\*\*\*Not Run
diff --git a/Tests/RunCMake/add_test/NameContainsEscapedQuote4-result.txt b/Tests/RunCMake/add_test/NameContainsEscapedQuote4-result.txt
new file mode 100644
index 0000000..b57e2de
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsEscapedQuote4-result.txt
@@ -0,0 +1 @@
+(-1|255)
diff --git a/Tests/RunCMake/add_test/NameContainsEscapedQuote4-stderr.txt b/Tests/RunCMake/add_test/NameContainsEscapedQuote4-stderr.txt
new file mode 100644
index 0000000..0661945
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsEscapedQuote4-stderr.txt
@@ -0,0 +1 @@
+Unable to find executable: SuffixTest
diff --git a/Tests/RunCMake/add_test/NameContainsEscapedQuote4-stdout.txt b/Tests/RunCMake/add_test/NameContainsEscapedQuote4-stdout.txt
new file mode 100644
index 0000000..4875409
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsEscapedQuote4-stdout.txt
@@ -0,0 +1 @@
+Test #[0-9]+: EscapedQuote \.+\*\*\*Not Run
diff --git a/Tests/RunCMake/add_test/NameContainsEscapedSpecialChars1-stdout.txt b/Tests/RunCMake/add_test/NameContainsEscapedSpecialChars1-stdout.txt
new file mode 100644
index 0000000..80435b6
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsEscapedSpecialChars1-stdout.txt
@@ -0,0 +1 @@
+Test #[0-9]+: \(\) # \.+[ ]*Passed
diff --git a/Tests/RunCMake/add_test/NameContainsEscapedSpecialChars2-stdout.txt b/Tests/RunCMake/add_test/NameContainsEscapedSpecialChars2-stdout.txt
new file mode 100644
index 0000000..80435b6
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsEscapedSpecialChars2-stdout.txt
@@ -0,0 +1 @@
+Test #[0-9]+: \(\) # \.+[ ]*Passed
diff --git a/Tests/RunCMake/add_test/NameContainsEscapedSpecialChars3-stdout.txt b/Tests/RunCMake/add_test/NameContainsEscapedSpecialChars3-stdout.txt
new file mode 100644
index 0000000..80435b6
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsEscapedSpecialChars3-stdout.txt
@@ -0,0 +1 @@
+Test #[0-9]+: \(\) # \.+[ ]*Passed
diff --git a/Tests/RunCMake/add_test/NameContainsEscapedSpecialChars4-stdout.txt b/Tests/RunCMake/add_test/NameContainsEscapedSpecialChars4-stdout.txt
new file mode 100644
index 0000000..80435b6
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsEscapedSpecialChars4-stdout.txt
@@ -0,0 +1 @@
+Test #[0-9]+: \(\) # \.+[ ]*Passed
diff --git a/Tests/RunCMake/add_test/NameContainsGeneratorExpressionSyntax1-stdout.txt b/Tests/RunCMake/add_test/NameContainsGeneratorExpressionSyntax1-stdout.txt
new file mode 100644
index 0000000..172ff99
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsGeneratorExpressionSyntax1-stdout.txt
@@ -0,0 +1 @@
+Test #[0-9]+: \$<BOOL:0> \.+[ ]*Passed
diff --git a/Tests/RunCMake/add_test/NameContainsGeneratorExpressionSyntax2-stdout.txt b/Tests/RunCMake/add_test/NameContainsGeneratorExpressionSyntax2-stdout.txt
new file mode 100644
index 0000000..172ff99
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsGeneratorExpressionSyntax2-stdout.txt
@@ -0,0 +1 @@
+Test #[0-9]+: \$<BOOL:0> \.+[ ]*Passed
diff --git a/Tests/RunCMake/add_test/NameContainsGeneratorExpressionSyntax3-stdout.txt b/Tests/RunCMake/add_test/NameContainsGeneratorExpressionSyntax3-stdout.txt
new file mode 100644
index 0000000..172ff99
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsGeneratorExpressionSyntax3-stdout.txt
@@ -0,0 +1 @@
+Test #[0-9]+: \$<BOOL:0> \.+[ ]*Passed
diff --git a/Tests/RunCMake/add_test/NameContainsGeneratorExpressionSyntax4-stdout.txt b/Tests/RunCMake/add_test/NameContainsGeneratorExpressionSyntax4-stdout.txt
new file mode 100644
index 0000000..172ff99
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsGeneratorExpressionSyntax4-stdout.txt
@@ -0,0 +1 @@
+Test #[0-9]+: \$<BOOL:0> \.+[ ]*Passed
diff --git a/Tests/RunCMake/add_test/NameContainsOtherSpecialChars1-stdout.txt b/Tests/RunCMake/add_test/NameContainsOtherSpecialChars1-stdout.txt
new file mode 100644
index 0000000..83e3f86
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsOtherSpecialChars1-stdout.txt
@@ -0,0 +1 @@
+Test #[0-9]+: !§\$%&/ü:\*😤~ \.+[ ]*Passed
diff --git a/Tests/RunCMake/add_test/NameContainsOtherSpecialChars2-stdout.txt b/Tests/RunCMake/add_test/NameContainsOtherSpecialChars2-stdout.txt
new file mode 100644
index 0000000..83e3f86
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsOtherSpecialChars2-stdout.txt
@@ -0,0 +1 @@
+Test #[0-9]+: !§\$%&/ü:\*😤~ \.+[ ]*Passed
diff --git a/Tests/RunCMake/add_test/NameContainsOtherSpecialChars3-stdout.txt b/Tests/RunCMake/add_test/NameContainsOtherSpecialChars3-stdout.txt
new file mode 100644
index 0000000..83e3f86
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsOtherSpecialChars3-stdout.txt
@@ -0,0 +1 @@
+Test #[0-9]+: !§\$%&/ü:\*😤~ \.+[ ]*Passed
diff --git a/Tests/RunCMake/add_test/NameContainsOtherSpecialChars4-stdout.txt b/Tests/RunCMake/add_test/NameContainsOtherSpecialChars4-stdout.txt
new file mode 100644
index 0000000..83e3f86
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsOtherSpecialChars4-stdout.txt
@@ -0,0 +1 @@
+Test #[0-9]+: !§\$%&/ü:\*😤~ \.+[ ]*Passed
diff --git a/Tests/RunCMake/add_test/NameContainsSemicolon1-stdout.txt b/Tests/RunCMake/add_test/NameContainsSemicolon1-stdout.txt
new file mode 100644
index 0000000..0fbf486
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsSemicolon1-stdout.txt
@@ -0,0 +1 @@
+Test #[0-9]+: PrefixTest;SuffixTest \.+[ ]*Passed
diff --git a/Tests/RunCMake/add_test/NameContainsSemicolon2-result.txt b/Tests/RunCMake/add_test/NameContainsSemicolon2-result.txt
new file mode 100644
index 0000000..b57e2de
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsSemicolon2-result.txt
@@ -0,0 +1 @@
+(-1|255)
diff --git a/Tests/RunCMake/add_test/NameContainsSemicolon2-stderr.txt b/Tests/RunCMake/add_test/NameContainsSemicolon2-stderr.txt
new file mode 100644
index 0000000..32c2112
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsSemicolon2-stderr.txt
@@ -0,0 +1,2 @@
+Error\(s\) when configuring the project
+No tests were found!!!
diff --git a/Tests/RunCMake/add_test/NameContainsSemicolon3-stdout.txt b/Tests/RunCMake/add_test/NameContainsSemicolon3-stdout.txt
new file mode 100644
index 0000000..c5ab1d8
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsSemicolon3-stdout.txt
@@ -0,0 +1,3 @@
+3/3 Test #3: PrefixTest;SuffixTest \.+\*\*\*Failed.*
+CMake Error at .+/CMakeLists.txt:[0-9]+ \(message\):
+[ ]*Setting property on test did not succeed!
diff --git a/Tests/RunCMake/add_test/NameContainsSemicolon4-result.txt b/Tests/RunCMake/add_test/NameContainsSemicolon4-result.txt
new file mode 100644
index 0000000..b57e2de
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsSemicolon4-result.txt
@@ -0,0 +1 @@
+(-1|255)
diff --git a/Tests/RunCMake/add_test/NameContainsSemicolon4-stderr.txt b/Tests/RunCMake/add_test/NameContainsSemicolon4-stderr.txt
new file mode 100644
index 0000000..32c2112
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsSemicolon4-stderr.txt
@@ -0,0 +1,2 @@
+Error\(s\) when configuring the project
+No tests were found!!!
diff --git a/Tests/RunCMake/add_test/NameContainsSpaces1-stdout.txt b/Tests/RunCMake/add_test/NameContainsSpaces1-stdout.txt
new file mode 100644
index 0000000..a255fb1
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsSpaces1-stdout.txt
@@ -0,0 +1 @@
+Test #[0-9]+: PrefixTest SuffixTest \.+[ ]*Passed
diff --git a/Tests/RunCMake/add_test/NameContainsSpaces2-result.txt b/Tests/RunCMake/add_test/NameContainsSpaces2-result.txt
new file mode 100644
index 0000000..b57e2de
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsSpaces2-result.txt
@@ -0,0 +1 @@
+(-1|255)
diff --git a/Tests/RunCMake/add_test/NameContainsSpaces2-stderr.txt b/Tests/RunCMake/add_test/NameContainsSpaces2-stderr.txt
new file mode 100644
index 0000000..32c2112
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsSpaces2-stderr.txt
@@ -0,0 +1,2 @@
+Error\(s\) when configuring the project
+No tests were found!!!
diff --git a/Tests/RunCMake/add_test/NameContainsSpaces3-stdout.txt b/Tests/RunCMake/add_test/NameContainsSpaces3-stdout.txt
new file mode 100644
index 0000000..3d42b0b
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsSpaces3-stdout.txt
@@ -0,0 +1,3 @@
+3/3 Test #3: PrefixTest SuffixTest \.+\*\*\*Failed.*
+CMake Error at .+/CMakeLists.txt:[0-9]+ \(message\):
+[ ]*Setting property on test did not succeed!
diff --git a/Tests/RunCMake/add_test/NameContainsSpaces4-result.txt b/Tests/RunCMake/add_test/NameContainsSpaces4-result.txt
new file mode 100644
index 0000000..b57e2de
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsSpaces4-result.txt
@@ -0,0 +1 @@
+(-1|255)
diff --git a/Tests/RunCMake/add_test/NameContainsSpaces4-stderr.txt b/Tests/RunCMake/add_test/NameContainsSpaces4-stderr.txt
new file mode 100644
index 0000000..32c2112
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsSpaces4-stderr.txt
@@ -0,0 +1,2 @@
+Error\(s\) when configuring the project
+No tests were found!!!
diff --git a/Tests/RunCMake/add_test/NameContainsValidSpecialChars1-stdout.txt b/Tests/RunCMake/add_test/NameContainsValidSpecialChars1-stdout.txt
new file mode 100644
index 0000000..ae1a0b1
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsValidSpecialChars1-stdout.txt
@@ -0,0 +1 @@
+Test #[0-9]+: abc_\.\+-012 \.+[ ]*Passed
diff --git a/Tests/RunCMake/add_test/NameContainsValidSpecialChars2-stdout.txt b/Tests/RunCMake/add_test/NameContainsValidSpecialChars2-stdout.txt
new file mode 100644
index 0000000..ae1a0b1
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsValidSpecialChars2-stdout.txt
@@ -0,0 +1 @@
+Test #[0-9]+: abc_\.\+-012 \.+[ ]*Passed
diff --git a/Tests/RunCMake/add_test/NameContainsValidSpecialChars3-stdout.txt b/Tests/RunCMake/add_test/NameContainsValidSpecialChars3-stdout.txt
new file mode 100644
index 0000000..ae1a0b1
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsValidSpecialChars3-stdout.txt
@@ -0,0 +1 @@
+Test #[0-9]+: abc_\.\+-012 \.+[ ]*Passed
diff --git a/Tests/RunCMake/add_test/NameContainsValidSpecialChars4-stdout.txt b/Tests/RunCMake/add_test/NameContainsValidSpecialChars4-stdout.txt
new file mode 100644
index 0000000..ae1a0b1
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameContainsValidSpecialChars4-stdout.txt
@@ -0,0 +1 @@
+Test #[0-9]+: abc_\.\+-012 \.+[ ]*Passed
diff --git a/Tests/RunCMake/add_test/NameIsAlphaNumeric1-stdout.txt b/Tests/RunCMake/add_test/NameIsAlphaNumeric1-stdout.txt
new file mode 100644
index 0000000..ed939bf
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameIsAlphaNumeric1-stdout.txt
@@ -0,0 +1 @@
+Test #[0-9]+: abcdefghijklmnopqrstuvwxyz0123456789 \.+[ ]*Passed
diff --git a/Tests/RunCMake/add_test/NameIsAlphaNumeric2-stdout.txt b/Tests/RunCMake/add_test/NameIsAlphaNumeric2-stdout.txt
new file mode 100644
index 0000000..ed939bf
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameIsAlphaNumeric2-stdout.txt
@@ -0,0 +1 @@
+Test #[0-9]+: abcdefghijklmnopqrstuvwxyz0123456789 \.+[ ]*Passed
diff --git a/Tests/RunCMake/add_test/NameIsAlphaNumeric3-stdout.txt b/Tests/RunCMake/add_test/NameIsAlphaNumeric3-stdout.txt
new file mode 100644
index 0000000..ed939bf
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameIsAlphaNumeric3-stdout.txt
@@ -0,0 +1 @@
+Test #[0-9]+: abcdefghijklmnopqrstuvwxyz0123456789 \.+[ ]*Passed
diff --git a/Tests/RunCMake/add_test/NameIsAlphaNumeric4-stdout.txt b/Tests/RunCMake/add_test/NameIsAlphaNumeric4-stdout.txt
new file mode 100644
index 0000000..ed939bf
--- /dev/null
+++ b/Tests/RunCMake/add_test/NameIsAlphaNumeric4-stdout.txt
@@ -0,0 +1 @@
+Test #[0-9]+: abcdefghijklmnopqrstuvwxyz0123456789 \.+[ ]*Passed
diff --git a/Tests/RunCMake/add_test/RunCMakeTest.cmake b/Tests/RunCMake/add_test/RunCMakeTest.cmake
new file mode 100644
index 0000000..6e9edda
--- /dev/null
+++ b/Tests/RunCMake/add_test/RunCMakeTest.cmake
@@ -0,0 +1,263 @@
+include(RunCTest)
+
+set(ENV{CTEST_OUTPUT_ON_FAILURE} 1)
+
+function(run_NameIsAlphaNumeric1_test)
+ set(CASE_CMAKELISTS_NAME_1 [==[ abcdefghijklmnopqrstuvwxyz0123456789 ]==])
+ set(CASE_CMAKELISTS_NAME_2 [==[ abcdefghijklmnopqrstuvwxyz0123456789 ]==])
+ run_ctest(NameIsAlphaNumeric1)
+endfunction()
+run_NameIsAlphaNumeric1_test()
+
+function(run_NameIsAlphaNumeric2_test)
+ set(CASE_CMAKELISTS_NAME_1 [==["abcdefghijklmnopqrstuvwxyz0123456789"]==])
+ set(CASE_CMAKELISTS_NAME_2 [==["abcdefghijklmnopqrstuvwxyz0123456789"]==])
+ run_ctest(NameIsAlphaNumeric2)
+endfunction()
+run_NameIsAlphaNumeric2_test()
+
+function(run_NameIsAlphaNumeric3_test)
+ set(CASE_CMAKELISTS_NAME_1 [==["abcdefghijklmnopqrstuvwxyz0123456789"]==])
+ set(CASE_CMAKELISTS_NAME_2 [==[ abcdefghijklmnopqrstuvwxyz0123456789 ]==])
+ run_ctest(NameIsAlphaNumeric3)
+endfunction()
+run_NameIsAlphaNumeric3_test()
+
+function(run_NameIsAlphaNumeric4_test)
+ set(CASE_CMAKELISTS_NAME_1 [==[ abcdefghijklmnopqrstuvwxyz0123456789 ]==])
+ set(CASE_CMAKELISTS_NAME_2 [==["abcdefghijklmnopqrstuvwxyz0123456789"]==])
+ run_ctest(NameIsAlphaNumeric4)
+endfunction()
+run_NameIsAlphaNumeric4_test()
+
+
+function(run_NameContainsValidSpecialChars1_test)
+ set(CASE_CMAKELISTS_NAME_1 [==[ abc_.+-012 ]==])
+ set(CASE_CMAKELISTS_NAME_2 [==[ abc_.+-012 ]==])
+ run_ctest(NameContainsValidSpecialChars1)
+endfunction()
+run_NameContainsValidSpecialChars1_test()
+
+function(run_NameContainsValidSpecialChars2_test)
+ set(CASE_CMAKELISTS_NAME_1 [==["abc_.+-012"]==])
+ set(CASE_CMAKELISTS_NAME_2 [==["abc_.+-012"]==])
+ run_ctest(NameContainsValidSpecialChars2)
+endfunction()
+run_NameContainsValidSpecialChars2_test()
+
+function(run_NameContainsValidSpecialChars3_test)
+ set(CASE_CMAKELISTS_NAME_1 [==["abc_.+-012"]==])
+ set(CASE_CMAKELISTS_NAME_2 [==[ abc_.+-012 ]==])
+ run_ctest(NameContainsValidSpecialChars3)
+endfunction()
+run_NameContainsValidSpecialChars3_test()
+
+function(run_NameContainsValidSpecialChars4_test)
+ set(CASE_CMAKELISTS_NAME_1 [==[ abc_.+-012 ]==])
+ set(CASE_CMAKELISTS_NAME_2 [==["abc_.+-012"]==])
+ run_ctest(NameContainsValidSpecialChars4)
+endfunction()
+run_NameContainsValidSpecialChars4_test()
+
+
+function(run_NameContainsOtherSpecialChars1_test)
+ set(CASE_CMAKELISTS_NAME_1 [==[ !§$%&/ü:*😤~ ]==])
+ set(CASE_CMAKELISTS_NAME_2 [==[ !§$%&/ü:*😤~ ]==])
+ run_ctest(NameContainsOtherSpecialChars1)
+endfunction()
+run_NameContainsOtherSpecialChars1_test()
+
+function(run_NameContainsOtherSpecialChars2_test)
+ set(CASE_CMAKELISTS_NAME_1 [==["!§$%&/ü:*😤~"]==])
+ set(CASE_CMAKELISTS_NAME_2 [==["!§$%&/ü:*😤~"]==])
+ run_ctest(NameContainsOtherSpecialChars2)
+endfunction()
+run_NameContainsOtherSpecialChars2_test()
+
+function(run_NameContainsOtherSpecialChars3_test)
+ set(CASE_CMAKELISTS_NAME_1 [==["!§$%&/ü:*😤~"]==])
+ set(CASE_CMAKELISTS_NAME_2 [==[ !§$%&/ü:*😤~ ]==])
+ run_ctest(NameContainsOtherSpecialChars3)
+endfunction()
+run_NameContainsOtherSpecialChars3_test()
+
+function(run_NameContainsOtherSpecialChars4_test)
+ set(CASE_CMAKELISTS_NAME_1 [==[ !§$%&/ü:*😤~ ]==])
+ set(CASE_CMAKELISTS_NAME_2 [==["!§$%&/ü:*😤~"]==])
+ run_ctest(NameContainsOtherSpecialChars4)
+endfunction()
+run_NameContainsOtherSpecialChars4_test()
+
+
+function(run_NameContainsEscapedSpecialChars1_test)
+ set(CASE_CMAKELISTS_NAME_1 [==[ \(\)\ \# ]==])
+ set(CASE_CMAKELISTS_NAME_2 [==[ \(\)\ \# ]==])
+ run_ctest(NameContainsEscapedSpecialChars1)
+endfunction()
+run_NameContainsEscapedSpecialChars1_test()
+
+function(run_NameContainsEscapedSpecialChars2_test)
+ set(CASE_CMAKELISTS_NAME_1 [==["\(\)\ \#"]==])
+ set(CASE_CMAKELISTS_NAME_2 [==["\(\)\ \#"]==])
+ run_ctest(NameContainsEscapedSpecialChars2)
+endfunction()
+run_NameContainsEscapedSpecialChars2_test()
+
+function(run_NameContainsEscapedSpecialChars3_test)
+ set(CASE_CMAKELISTS_NAME_1 [==["\(\)\ \#"]==])
+ set(CASE_CMAKELISTS_NAME_2 [==[ \(\)\ \# ]==])
+ run_ctest(NameContainsEscapedSpecialChars3)
+endfunction()
+run_NameContainsEscapedSpecialChars3_test()
+
+function(run_NameContainsEscapedSpecialChars4_test)
+ set(CASE_CMAKELISTS_NAME_1 [==[ \(\)\ \# ]==])
+ set(CASE_CMAKELISTS_NAME_2 [==["\(\)\ \#"]==])
+ run_ctest(NameContainsEscapedSpecialChars4)
+endfunction()
+run_NameContainsEscapedSpecialChars4_test()
+
+
+function(run_NameContainsGeneratorExpressionSyntax1_test)
+ set(CASE_CMAKELISTS_NAME_1 [==[ $<BOOL:0> ]==])
+ set(CASE_CMAKELISTS_NAME_2 [==[ $<BOOL:0> ]==])
+ run_ctest(NameContainsGeneratorExpressionSyntax1)
+endfunction()
+run_NameContainsGeneratorExpressionSyntax1_test()
+
+function(run_NameContainsGeneratorExpressionSyntax2_test)
+ set(CASE_CMAKELISTS_NAME_1 [==["$<BOOL:0>"]==])
+ set(CASE_CMAKELISTS_NAME_2 [==["$<BOOL:0>"]==])
+ run_ctest(NameContainsGeneratorExpressionSyntax2)
+endfunction()
+run_NameContainsGeneratorExpressionSyntax2_test()
+
+function(run_NameContainsGeneratorExpressionSyntax3_test)
+ set(CASE_CMAKELISTS_NAME_1 [==["$<BOOL:0>"]==])
+ set(CASE_CMAKELISTS_NAME_2 [==[ $<BOOL:0> ]==])
+ run_ctest(NameContainsGeneratorExpressionSyntax3)
+endfunction()
+run_NameContainsGeneratorExpressionSyntax3_test()
+
+function(run_NameContainsGeneratorExpressionSyntax4_test)
+ set(CASE_CMAKELISTS_NAME_1 [==[ $<BOOL:0> ]==])
+ set(CASE_CMAKELISTS_NAME_2 [==["$<BOOL:0>"]==])
+ run_ctest(NameContainsGeneratorExpressionSyntax4)
+endfunction()
+run_NameContainsGeneratorExpressionSyntax4_test()
+
+
+function(run_NameContainsSpaces1_test)
+ set(CASE_CMAKELISTS_NAME_1 [==["PrefixTest SuffixTest"]==])
+ set(CASE_CMAKELISTS_NAME_2 [==["PrefixTest SuffixTest"]==])
+ run_ctest(NameContainsSpaces1)
+endfunction()
+run_NameContainsSpaces1_test()
+
+function(run_NameContainsSpaces2_test)
+ set(CASE_CMAKELISTS_NAME_1 [==[ PrefixTest SuffixTest ]==])
+ set(CASE_CMAKELISTS_NAME_2 [==[ PrefixTest SuffixTest ]==])
+ run_ctest(NameContainsSpaces2)
+endfunction()
+run_NameContainsSpaces2_test()
+
+function(run_NameContainsSpaces3_test)
+ set(CASE_CMAKELISTS_NAME_1 [==["PrefixTest SuffixTest"]==])
+ set(CASE_CMAKELISTS_NAME_2 [==[ PrefixTest SuffixTest ]==])
+ run_ctest(NameContainsSpaces3)
+endfunction()
+run_NameContainsSpaces3_test()
+
+function(run_NameContainsSpaces4_test)
+ set(CASE_CMAKELISTS_NAME_1 [==[ PrefixTest SuffixTest ]==])
+ set(CASE_CMAKELISTS_NAME_2 [==["PrefixTest SuffixTest"]==])
+ run_ctest(NameContainsSpaces4)
+endfunction()
+run_NameContainsSpaces4_test()
+
+
+function(run_NameContainsSemicolon1_test)
+ set(CASE_CMAKELISTS_NAME_1 [==["PrefixTest;SuffixTest"]==])
+ set(CASE_CMAKELISTS_NAME_2 [==["PrefixTest;SuffixTest"]==])
+ run_ctest(NameContainsSemicolon1)
+endfunction()
+run_NameContainsSemicolon1_test()
+
+function(run_NameContainsSemicolon2_test)
+ set(CASE_CMAKELISTS_NAME_1 [==[ PrefixTest;SuffixTest ]==])
+ set(CASE_CMAKELISTS_NAME_2 [==[ PrefixTest;SuffixTest ]==])
+ run_ctest(NameContainsSemicolon2)
+endfunction()
+run_NameContainsSemicolon2_test()
+
+function(run_NameContainsSemicolon3_test)
+ set(CASE_CMAKELISTS_NAME_1 [==["PrefixTest;SuffixTest"]==])
+ set(CASE_CMAKELISTS_NAME_2 [==[ PrefixTest;SuffixTest ]==])
+ run_ctest(NameContainsSemicolon3)
+endfunction()
+run_NameContainsSemicolon3_test()
+
+function(run_NameContainsSemicolon4_test)
+ set(CASE_CMAKELISTS_NAME_1 [==[ PrefixTest;SuffixTest ]==])
+ set(CASE_CMAKELISTS_NAME_2 [==["PrefixTest;SuffixTest"]==])
+ run_ctest(NameContainsSemicolon4)
+endfunction()
+run_NameContainsSemicolon4_test()
+
+
+function(run_NameContainsEscapedQuote1_test)
+ set(CASE_CMAKELISTS_NAME_1 [==["EscapedQuote\"\"SuffixTest"]==])
+ set(CASE_CMAKELISTS_NAME_2 [==["EscapedQuote\"\"SuffixTest"]==])
+ run_ctest(NameContainsEscapedQuote1)
+endfunction()
+run_NameContainsEscapedQuote1_test()
+
+function(run_NameContainsEscapedQuote2_test)
+ set(CASE_CMAKELISTS_NAME_1 [==[ EscapedQuote\"\"SuffixTest ]==])
+ set(CASE_CMAKELISTS_NAME_2 [==[ EscapedQuote\"\"SuffixTest ]==])
+ run_ctest(NameContainsEscapedQuote2)
+endfunction()
+run_NameContainsEscapedQuote2_test()
+
+function(run_NameContainsEscapedQuote3_test)
+ set(CASE_CMAKELISTS_NAME_1 [==["EscapedQuote\"\"SuffixTest"]==])
+ set(CASE_CMAKELISTS_NAME_2 [==[ EscapedQuote\"\"SuffixTest ]==])
+ run_ctest(NameContainsEscapedQuote3)
+endfunction()
+run_NameContainsEscapedQuote3_test()
+
+function(run_NameContainsEscapedQuote4_test)
+ set(CASE_CMAKELISTS_NAME_1 [==[ EscapedQuote\"\"SuffixTest ]==])
+ set(CASE_CMAKELISTS_NAME_2 [==["EscapedQuote\"\"SuffixTest"]==])
+ run_ctest(NameContainsEscapedQuote4)
+endfunction()
+run_NameContainsEscapedQuote4_test()
+
+
+function(run_NameContainsBracketArgument1_test)
+ set(CASE_CMAKELISTS_NAME_1 [==["[=[BracketArgument;SuffixTest]=]"]==])
+ set(CASE_CMAKELISTS_NAME_2 [==["[=[BracketArgument;SuffixTest]=]"]==])
+ run_ctest(NameContainsBracketArgument1)
+endfunction()
+run_NameContainsBracketArgument1_test()
+
+function(run_NameContainsBracketArgument2_test)
+ set(CASE_CMAKELISTS_NAME_1 [==[ [=[BracketArgument;SuffixTest]=] ]==])
+ set(CASE_CMAKELISTS_NAME_2 [==[ [=[BracketArgument;SuffixTest]=] ]==])
+ run_ctest(NameContainsBracketArgument2)
+endfunction()
+run_NameContainsBracketArgument2_test()
+
+function(run_NameContainsBracketArgument3_test)
+ set(CASE_CMAKELISTS_NAME_1 [==["[=[BracketArgument;SuffixTest]=]"]==])
+ set(CASE_CMAKELISTS_NAME_2 [==[ [=[BracketArgument;SuffixTest]=] ]==])
+ run_ctest(NameContainsBracketArgument3)
+endfunction()
+run_NameContainsBracketArgument3_test()
+
+function(run_NameContainsBracketArgument4_test)
+ set(CASE_CMAKELISTS_NAME_1 [==[ [=[BracketArgument;SuffixTest]=] ]==])
+ set(CASE_CMAKELISTS_NAME_2 [==["[=[BracketArgument;SuffixTest]=]"]==])
+ run_ctest(NameContainsBracketArgument4)
+endfunction()
+run_NameContainsBracketArgument4_test()
diff --git a/Tests/RunCMake/add_test/test.cmake.in b/Tests/RunCMake/add_test/test.cmake.in
new file mode 100644
index 0000000..9821c1c
--- /dev/null
+++ b/Tests/RunCMake/add_test/test.cmake.in
@@ -0,0 +1,16 @@
+cmake_minimum_required(VERSION 3.17)
+
+set(CTEST_SITE "test-site")
+set(CTEST_BUILD_NAME "test-build-name")
+set(CTEST_SOURCE_DIRECTORY "@RunCMake_BINARY_DIR@/@CASE_NAME@")
+set(CTEST_BINARY_DIRECTORY "@RunCMake_BINARY_DIR@/@CASE_NAME@-build")
+set(CTEST_CMAKE_GENERATOR "@RunCMake_GENERATOR@")
+set(CTEST_CMAKE_GENERATOR_PLATFORM "@RunCMake_GENERATOR_PLATFORM@")
+set(CTEST_CMAKE_GENERATOR_TOOLSET "@RunCMake_GENERATOR_TOOLSET@")
+set(CTEST_BUILD_CONFIGURATION "$ENV{CMAKE_CONFIG_TYPE}")
+
+set(ctest_test_args "@CASE_CTEST_TEST_ARGS@")
+ctest_start(Experimental)
+ctest_configure()
+#ctest_build()
+ctest_test(${ctest_test_args})
diff --git a/Tests/RunCMake/cmake_command/CMakeLists.txt b/Tests/RunCMake/cmake_command/CMakeLists.txt
new file mode 100644
index 0000000..2632ffa
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/CMakeLists.txt
@@ -0,0 +1,3 @@
+cmake_minimum_required(VERSION 3.16)
+project(${RunCMake_TEST} NONE)
+include(${RunCMake_TEST}.cmake)
diff --git a/Tests/RunCMake/cmake_command/RunCMakeTest.cmake b/Tests/RunCMake/cmake_command/RunCMakeTest.cmake
new file mode 100644
index 0000000..a6b2efe
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/RunCMakeTest.cmake
@@ -0,0 +1,23 @@
+include(RunCMake)
+
+run_cmake(cmake_command_no_parameters)
+run_cmake(cmake_command_unknown_meta_operation)
+run_cmake(cmake_command_invoke_double_evaluation)
+run_cmake(cmake_command_invoke_expanded_command)
+run_cmake(cmake_command_invoke_expanded_command_and_arguments)
+run_cmake(cmake_command_invoke_expanded_command_with_explicit_argument)
+run_cmake(cmake_command_invoke_expand_command_name)
+run_cmake(cmake_command_invoke_expand_function_name)
+run_cmake(cmake_command_invoke_message)
+run_cmake(cmake_command_invoke_message_fatal_error)
+run_cmake(cmake_command_invoke_no_parameters)
+run_cmake(cmake_command_invoke_preserve_arguments)
+run_cmake(cmake_command_invoke_unknown_function)
+run_cmake(cmake_command_eval_expand_command_name)
+run_cmake(cmake_command_eval_expanded_command_and_arguments)
+run_cmake(cmake_command_eval_extra_parameters_between_eval_and_code)
+run_cmake(cmake_command_eval_message)
+run_cmake(cmake_command_eval_message_fatal_error)
+run_cmake(cmake_command_eval_no_code)
+run_cmake(cmake_command_eval_no_parameters)
+run_cmake(cmake_command_eval_variable_outside_message)
diff --git a/Tests/RunCMake/cmake_command/cmake_command_eval_expand_command_name-stderr.txt b/Tests/RunCMake/cmake_command/cmake_command_eval_expand_command_name-stderr.txt
new file mode 100644
index 0000000..d640661
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_eval_expand_command_name-stderr.txt
@@ -0,0 +1 @@
+OK!
diff --git a/Tests/RunCMake/cmake_command/cmake_command_eval_expand_command_name.cmake b/Tests/RunCMake/cmake_command/cmake_command_eval_expand_command_name.cmake
new file mode 100644
index 0000000..4cea393
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_eval_expand_command_name.cmake
@@ -0,0 +1,2 @@
+set (my_eval "EVAL")
+cmake_command (${my_eval} CODE message("OK!"))
diff --git a/Tests/RunCMake/cmake_command/cmake_command_eval_expanded_command_and_arguments-stderr.txt b/Tests/RunCMake/cmake_command/cmake_command_eval_expanded_command_and_arguments-stderr.txt
new file mode 100644
index 0000000..d640661
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_eval_expanded_command_and_arguments-stderr.txt
@@ -0,0 +1 @@
+OK!
diff --git a/Tests/RunCMake/cmake_command/cmake_command_eval_expanded_command_and_arguments.cmake b/Tests/RunCMake/cmake_command/cmake_command_eval_expanded_command_and_arguments.cmake
new file mode 100644
index 0000000..fcc399b
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_eval_expanded_command_and_arguments.cmake
@@ -0,0 +1,2 @@
+set(cmd EVAL CODE [[message("OK!")]])
+cmake_command(${cmd})
diff --git a/Tests/RunCMake/cmake_command/cmake_command_eval_extra_parameters_between_eval_and_code-result.txt b/Tests/RunCMake/cmake_command/cmake_command_eval_extra_parameters_between_eval_and_code-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_eval_extra_parameters_between_eval_and_code-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/cmake_command/cmake_command_eval_extra_parameters_between_eval_and_code-stderr.txt b/Tests/RunCMake/cmake_command/cmake_command_eval_extra_parameters_between_eval_and_code-stderr.txt
new file mode 100644
index 0000000..13c114e
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_eval_extra_parameters_between_eval_and_code-stderr.txt
@@ -0,0 +1,5 @@
+CMake Error at cmake_command_eval_extra_parameters_between_eval_and_code.cmake:1 \(cmake_command\):
+ cmake_command called with unsupported arguments between EVAL and CODE
+ arguments
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/cmake_command/cmake_command_eval_extra_parameters_between_eval_and_code.cmake b/Tests/RunCMake/cmake_command/cmake_command_eval_extra_parameters_between_eval_and_code.cmake
new file mode 100644
index 0000000..0927631
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_eval_extra_parameters_between_eval_and_code.cmake
@@ -0,0 +1 @@
+cmake_command(EVAL BAD CODE "message(BAD CODE)")
diff --git a/Tests/RunCMake/cmake_command/cmake_command_eval_message-stderr.txt b/Tests/RunCMake/cmake_command/cmake_command_eval_message-stderr.txt
new file mode 100644
index 0000000..cfc8694
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_eval_message-stderr.txt
@@ -0,0 +1 @@
+WORKS!
diff --git a/Tests/RunCMake/cmake_command/cmake_command_eval_message.cmake b/Tests/RunCMake/cmake_command/cmake_command_eval_message.cmake
new file mode 100644
index 0000000..9ef5e25
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_eval_message.cmake
@@ -0,0 +1 @@
+cmake_command(EVAL CODE message(WORKS!))
diff --git a/Tests/RunCMake/cmake_command/cmake_command_eval_message_fatal_error-result.txt b/Tests/RunCMake/cmake_command/cmake_command_eval_message_fatal_error-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_eval_message_fatal_error-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/cmake_command/cmake_command_eval_message_fatal_error-stderr.txt b/Tests/RunCMake/cmake_command/cmake_command_eval_message_fatal_error-stderr.txt
new file mode 100644
index 0000000..6a8a124
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_eval_message_fatal_error-stderr.txt
@@ -0,0 +1,5 @@
+CMake Error at cmake_command_eval_message_fatal_error.cmake:1:EVAL:2 \(message\):
+ error!
+Call Stack \(most recent call first\):
+ cmake_command_eval_message_fatal_error.cmake:1 \(cmake_command\)
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/cmake_command/cmake_command_eval_message_fatal_error.cmake b/Tests/RunCMake/cmake_command/cmake_command_eval_message_fatal_error.cmake
new file mode 100644
index 0000000..22913de
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_eval_message_fatal_error.cmake
@@ -0,0 +1,5 @@
+cmake_command(EVAL CODE
+"
+ message(FATAL_ERROR error!)
+"
+)
diff --git a/Tests/RunCMake/cmake_command/cmake_command_eval_no_code-result.txt b/Tests/RunCMake/cmake_command/cmake_command_eval_no_code-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_eval_no_code-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/cmake_command/cmake_command_eval_no_code-stderr.txt b/Tests/RunCMake/cmake_command/cmake_command_eval_no_code-stderr.txt
new file mode 100644
index 0000000..ee53312
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_eval_no_code-stderr.txt
@@ -0,0 +1,2 @@
+CMake Error at cmake_command_eval_no_code.cmake:1 \(cmake_command\):
+ cmake_command called without CODE argument
diff --git a/Tests/RunCMake/cmake_command/cmake_command_eval_no_code.cmake b/Tests/RunCMake/cmake_command/cmake_command_eval_no_code.cmake
new file mode 100644
index 0000000..22e1667
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_eval_no_code.cmake
@@ -0,0 +1 @@
+cmake_command(EVAL message "too many parameters")
diff --git a/Tests/RunCMake/cmake_command/cmake_command_eval_no_parameters-result.txt b/Tests/RunCMake/cmake_command/cmake_command_eval_no_parameters-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_eval_no_parameters-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/cmake_command/cmake_command_eval_no_parameters-stderr.txt b/Tests/RunCMake/cmake_command/cmake_command_eval_no_parameters-stderr.txt
new file mode 100644
index 0000000..e9fc317
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_eval_no_parameters-stderr.txt
@@ -0,0 +1,2 @@
+CMake Error at cmake_command_eval_no_parameters.cmake:1 \(cmake_command\):
+ cmake_command called with incorrect number of arguments
diff --git a/Tests/RunCMake/cmake_command/cmake_command_eval_no_parameters.cmake b/Tests/RunCMake/cmake_command/cmake_command_eval_no_parameters.cmake
new file mode 100644
index 0000000..a5ba2c7
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_eval_no_parameters.cmake
@@ -0,0 +1 @@
+cmake_command(EVAL)
diff --git a/Tests/RunCMake/cmake_command/cmake_command_eval_variable_outside_message-stderr.txt b/Tests/RunCMake/cmake_command/cmake_command_eval_variable_outside_message-stderr.txt
new file mode 100644
index 0000000..cfc8694
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_eval_variable_outside_message-stderr.txt
@@ -0,0 +1 @@
+WORKS!
diff --git a/Tests/RunCMake/cmake_command/cmake_command_eval_variable_outside_message.cmake b/Tests/RunCMake/cmake_command/cmake_command_eval_variable_outside_message.cmake
new file mode 100644
index 0000000..b7a06a5
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_eval_variable_outside_message.cmake
@@ -0,0 +1,2 @@
+cmake_command(EVAL CODE "set(phrase \"WORKS!\")")
+message(${phrase})
diff --git a/Tests/RunCMake/cmake_command/cmake_command_invoke_double_evaluation-stderr.txt b/Tests/RunCMake/cmake_command/cmake_command_invoke_double_evaluation-stderr.txt
new file mode 100644
index 0000000..59a70bd
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_invoke_double_evaluation-stderr.txt
@@ -0,0 +1 @@
+var='\${foo}'
diff --git a/Tests/RunCMake/cmake_command/cmake_command_invoke_double_evaluation.cmake b/Tests/RunCMake/cmake_command/cmake_command_invoke_double_evaluation.cmake
new file mode 100644
index 0000000..10970fc
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_invoke_double_evaluation.cmake
@@ -0,0 +1,2 @@
+set(var [[${foo}]])
+cmake_command(INVOKE cmake_command INVOKE message "var='${var}'")
diff --git a/Tests/RunCMake/cmake_command/cmake_command_invoke_expand_command_name-stderr.txt b/Tests/RunCMake/cmake_command/cmake_command_invoke_expand_command_name-stderr.txt
new file mode 100644
index 0000000..d640661
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_invoke_expand_command_name-stderr.txt
@@ -0,0 +1 @@
+OK!
diff --git a/Tests/RunCMake/cmake_command/cmake_command_invoke_expand_command_name.cmake b/Tests/RunCMake/cmake_command/cmake_command_invoke_expand_command_name.cmake
new file mode 100644
index 0000000..d59afe4
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_invoke_expand_command_name.cmake
@@ -0,0 +1,2 @@
+set (my_invoke "INVOKE")
+cmake_command (${my_invoke} message "OK!")
diff --git a/Tests/RunCMake/cmake_command/cmake_command_invoke_expand_function_name-stderr.txt b/Tests/RunCMake/cmake_command/cmake_command_invoke_expand_function_name-stderr.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_invoke_expand_function_name-stderr.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/cmake_command/cmake_command_invoke_expand_function_name.cmake b/Tests/RunCMake/cmake_command/cmake_command_invoke_expand_function_name.cmake
new file mode 100644
index 0000000..923ddaa
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_invoke_expand_function_name.cmake
@@ -0,0 +1,11 @@
+function(some_function_1)
+ message(1)
+endfunction()
+
+function(some_function_2)
+ message(2)
+endfunction()
+
+set(function_version 1)
+
+cmake_command(INVOKE some_function_${function_version})
diff --git a/Tests/RunCMake/cmake_command/cmake_command_invoke_expanded_command-stderr.txt b/Tests/RunCMake/cmake_command/cmake_command_invoke_expanded_command-stderr.txt
new file mode 100644
index 0000000..d640661
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_invoke_expanded_command-stderr.txt
@@ -0,0 +1 @@
+OK!
diff --git a/Tests/RunCMake/cmake_command/cmake_command_invoke_expanded_command.cmake b/Tests/RunCMake/cmake_command/cmake_command_invoke_expanded_command.cmake
new file mode 100644
index 0000000..bca7d2f
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_invoke_expanded_command.cmake
@@ -0,0 +1,6 @@
+function (itsok)
+ message(OK!)
+endfunction()
+
+set (cmd INVOKE itsok)
+cmake_command (${cmd})
diff --git a/Tests/RunCMake/cmake_command/cmake_command_invoke_expanded_command_and_arguments-result.txt b/Tests/RunCMake/cmake_command/cmake_command_invoke_expanded_command_and_arguments-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_invoke_expanded_command_and_arguments-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/cmake_command/cmake_command_invoke_expanded_command_and_arguments-stderr.txt b/Tests/RunCMake/cmake_command/cmake_command_invoke_expanded_command_and_arguments-stderr.txt
new file mode 100644
index 0000000..6d0e241
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_invoke_expanded_command_and_arguments-stderr.txt
@@ -0,0 +1,4 @@
+CMake Error at cmake_command_invoke_expanded_command_and_arguments.cmake:2 \(cmake_command\):
+ cmake_command called with incorrect number of arguments
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/cmake_command/cmake_command_invoke_expanded_command_and_arguments.cmake b/Tests/RunCMake/cmake_command/cmake_command_invoke_expanded_command_and_arguments.cmake
new file mode 100644
index 0000000..6bfa3a7
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_invoke_expanded_command_and_arguments.cmake
@@ -0,0 +1,2 @@
+set(invoke_message INVOKE message a b)
+cmake_command(${invoke_message})
diff --git a/Tests/RunCMake/cmake_command/cmake_command_invoke_expanded_command_with_explicit_argument-stderr.txt b/Tests/RunCMake/cmake_command/cmake_command_invoke_expanded_command_with_explicit_argument-stderr.txt
new file mode 100644
index 0000000..d640661
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_invoke_expanded_command_with_explicit_argument-stderr.txt
@@ -0,0 +1 @@
+OK!
diff --git a/Tests/RunCMake/cmake_command/cmake_command_invoke_expanded_command_with_explicit_argument.cmake b/Tests/RunCMake/cmake_command/cmake_command_invoke_expanded_command_with_explicit_argument.cmake
new file mode 100644
index 0000000..eb0411f
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_invoke_expanded_command_with_explicit_argument.cmake
@@ -0,0 +1,2 @@
+set (cmd INVOKE message)
+cmake_command (${cmd} "OK!")
diff --git a/Tests/RunCMake/cmake_command/cmake_command_invoke_message-stderr.txt b/Tests/RunCMake/cmake_command/cmake_command_invoke_message-stderr.txt
new file mode 100644
index 0000000..cfc8694
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_invoke_message-stderr.txt
@@ -0,0 +1 @@
+WORKS!
diff --git a/Tests/RunCMake/cmake_command/cmake_command_invoke_message.cmake b/Tests/RunCMake/cmake_command/cmake_command_invoke_message.cmake
new file mode 100644
index 0000000..336d78a
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_invoke_message.cmake
@@ -0,0 +1 @@
+cmake_command(INVOKE message WORKS!)
diff --git a/Tests/RunCMake/cmake_command/cmake_command_invoke_message_fatal_error-result.txt b/Tests/RunCMake/cmake_command/cmake_command_invoke_message_fatal_error-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_invoke_message_fatal_error-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/cmake_command/cmake_command_invoke_message_fatal_error-stderr.txt b/Tests/RunCMake/cmake_command/cmake_command_invoke_message_fatal_error-stderr.txt
new file mode 100644
index 0000000..2c9dab5
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_invoke_message_fatal_error-stderr.txt
@@ -0,0 +1,5 @@
+CMake Error at cmake_command_invoke_message_fatal_error.cmake:1 \(message\):
+ error!
+Call Stack \(most recent call first\):
+ cmake_command_invoke_message_fatal_error.cmake:1 \(cmake_command\)
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/cmake_command/cmake_command_invoke_message_fatal_error.cmake b/Tests/RunCMake/cmake_command/cmake_command_invoke_message_fatal_error.cmake
new file mode 100644
index 0000000..6b42764
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_invoke_message_fatal_error.cmake
@@ -0,0 +1 @@
+cmake_command(INVOKE message FATAL_ERROR error!)
diff --git a/Tests/RunCMake/cmake_command/cmake_command_invoke_no_parameters-result.txt b/Tests/RunCMake/cmake_command/cmake_command_invoke_no_parameters-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_invoke_no_parameters-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/cmake_command/cmake_command_invoke_no_parameters-stderr.txt b/Tests/RunCMake/cmake_command/cmake_command_invoke_no_parameters-stderr.txt
new file mode 100644
index 0000000..7741b41
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_invoke_no_parameters-stderr.txt
@@ -0,0 +1,2 @@
+CMake Error at cmake_command_invoke_no_parameters.cmake:1 \(cmake_command\):
+ cmake_command called with incorrect number of arguments
diff --git a/Tests/RunCMake/cmake_command/cmake_command_invoke_no_parameters.cmake b/Tests/RunCMake/cmake_command/cmake_command_invoke_no_parameters.cmake
new file mode 100644
index 0000000..b9c5e14
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_invoke_no_parameters.cmake
@@ -0,0 +1 @@
+cmake_command(INVOKE)
diff --git a/Tests/RunCMake/cmake_command/cmake_command_invoke_preserve_arguments-stderr.txt b/Tests/RunCMake/cmake_command/cmake_command_invoke_preserve_arguments-stderr.txt
new file mode 100644
index 0000000..4670e60
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_invoke_preserve_arguments-stderr.txt
@@ -0,0 +1,6 @@
+foo\(...\)
+\[a;b\]
+\[c;d\]
+cmake_command\(INVOKE foo ...\)
+\[a;b\]
+\[c;d\]
diff --git a/Tests/RunCMake/cmake_command/cmake_command_invoke_preserve_arguments.cmake b/Tests/RunCMake/cmake_command/cmake_command_invoke_preserve_arguments.cmake
new file mode 100644
index 0000000..53ac2e6
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_invoke_preserve_arguments.cmake
@@ -0,0 +1,12 @@
+function(foo arg1 arg2)
+ math(EXPR last "${ARGC} - 1")
+ foreach(i RANGE 0 ${last})
+ message("[${ARGV${i}}]")
+ endforeach()
+endfunction()
+
+message("foo(...)")
+foo("a;b" "c;d")
+
+message("cmake_command(INVOKE foo ...)")
+cmake_command(INVOKE foo "a;b" "c;d")
diff --git a/Tests/RunCMake/cmake_command/cmake_command_invoke_unknown_function-result.txt b/Tests/RunCMake/cmake_command/cmake_command_invoke_unknown_function-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_invoke_unknown_function-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/cmake_command/cmake_command_invoke_unknown_function-stderr.txt b/Tests/RunCMake/cmake_command/cmake_command_invoke_unknown_function-stderr.txt
new file mode 100644
index 0000000..50a81a3
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_invoke_unknown_function-stderr.txt
@@ -0,0 +1,2 @@
+CMake Error at cmake_command_invoke_unknown_function.cmake:1 \(unknown\):
+ Unknown CMake command "unknown".
diff --git a/Tests/RunCMake/cmake_command/cmake_command_invoke_unknown_function.cmake b/Tests/RunCMake/cmake_command/cmake_command_invoke_unknown_function.cmake
new file mode 100644
index 0000000..f19a04b
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_invoke_unknown_function.cmake
@@ -0,0 +1 @@
+cmake_command(INVOKE unknown)
diff --git a/Tests/RunCMake/cmake_command/cmake_command_no_parameters-result.txt b/Tests/RunCMake/cmake_command/cmake_command_no_parameters-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_no_parameters-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/cmake_command/cmake_command_no_parameters-stderr.txt b/Tests/RunCMake/cmake_command/cmake_command_no_parameters-stderr.txt
new file mode 100644
index 0000000..772b604
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_no_parameters-stderr.txt
@@ -0,0 +1,2 @@
+CMake Error at cmake_command_no_parameters.cmake:1 \(cmake_command\):
+ cmake_command called with incorrect number of arguments
diff --git a/Tests/RunCMake/cmake_command/cmake_command_no_parameters.cmake b/Tests/RunCMake/cmake_command/cmake_command_no_parameters.cmake
new file mode 100644
index 0000000..b9c5e14
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_no_parameters.cmake
@@ -0,0 +1 @@
+cmake_command(INVOKE)
diff --git a/Tests/RunCMake/cmake_command/cmake_command_unknown_meta_operation-result.txt b/Tests/RunCMake/cmake_command/cmake_command_unknown_meta_operation-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_unknown_meta_operation-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/cmake_command/cmake_command_unknown_meta_operation-stderr.txt b/Tests/RunCMake/cmake_command/cmake_command_unknown_meta_operation-stderr.txt
new file mode 100644
index 0000000..7b9b915
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_unknown_meta_operation-stderr.txt
@@ -0,0 +1,2 @@
+CMake Error at cmake_command_unknown_meta_operation.cmake:1 \(cmake_command\):
+ cmake_command called with unknown meta-operation
diff --git a/Tests/RunCMake/cmake_command/cmake_command_unknown_meta_operation.cmake b/Tests/RunCMake/cmake_command/cmake_command_unknown_meta_operation.cmake
new file mode 100644
index 0000000..f7c77e5
--- /dev/null
+++ b/Tests/RunCMake/cmake_command/cmake_command_unknown_meta_operation.cmake
@@ -0,0 +1 @@
+cmake_command(UNKNOWN)
diff --git a/Tests/RunCMake/configure_file/RerunCMake.cmake b/Tests/RunCMake/configure_file/RerunCMake.cmake
index 890cc1f..98387d0 100644
--- a/Tests/RunCMake/configure_file/RerunCMake.cmake
+++ b/Tests/RunCMake/configure_file/RerunCMake.cmake
@@ -1,8 +1,4 @@
message("Running CMake on RerunCMake") # write to stderr if cmake reruns
-configure_file(
- "${CMAKE_CURRENT_BINARY_DIR}/ConfigureFileInput.txt.in"
- "${CMAKE_CURRENT_BINARY_DIR}/ConfigureFileOutput.txt"
- @ONLY
- )
+add_subdirectory(RerunCMake)
# make sure CMakeCache.txt is newer than ConfigureFileOutput.txt
execute_process(COMMAND ${CMAKE_COMMAND} -E sleep 1)
diff --git a/Tests/RunCMake/configure_file/RerunCMake/CMakeLists.txt b/Tests/RunCMake/configure_file/RerunCMake/CMakeLists.txt
new file mode 100644
index 0000000..c9681c7
--- /dev/null
+++ b/Tests/RunCMake/configure_file/RerunCMake/CMakeLists.txt
@@ -0,0 +1,5 @@
+configure_file(
+ "${CMAKE_CURRENT_BINARY_DIR}/ConfigureFileInput.txt.in"
+ "${CMAKE_CURRENT_BINARY_DIR}/ConfigureFileOutput.txt"
+ @ONLY
+ )
diff --git a/Tests/RunCMake/configure_file/RunCMakeTest.cmake b/Tests/RunCMake/configure_file/RunCMakeTest.cmake
index de14468..32a0770 100644
--- a/Tests/RunCMake/configure_file/RunCMakeTest.cmake
+++ b/Tests/RunCMake/configure_file/RunCMakeTest.cmake
@@ -22,7 +22,7 @@ if(RunCMake_GENERATOR MATCHES "Make")
set(RunCMake_TEST_NO_CLEAN 1)
file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
- set(in_conf "${RunCMake_TEST_BINARY_DIR}/ConfigureFileInput.txt.in")
+ set(in_conf "${RunCMake_TEST_BINARY_DIR}/RerunCMake/ConfigureFileInput.txt.in")
file(WRITE "${in_conf}" "1")
message(STATUS "RerunCMake: first configuration...")
@@ -42,7 +42,7 @@ if(RunCMake_GENERATOR MATCHES "Make")
run_cmake_command(RerunCMake-nowork ${CMAKE_COMMAND} --build .)
message(STATUS "RerunCMake: remove configure_file output...")
- file(REMOVE "${RunCMake_TEST_BINARY_DIR}/ConfigureFileOutput.txt")
+ file(REMOVE "${RunCMake_TEST_BINARY_DIR}/RerunCMake/ConfigureFileOutput.txt")
run_cmake_command(RerunCMake-rerun ${CMAKE_COMMAND} --build .)
run_cmake_command(RerunCMake-nowork ${CMAKE_COMMAND} --build .)
diff --git a/Tests/RunCMake/ctest_memcheck/testAddressLeakSanitizer.cmake b/Tests/RunCMake/ctest_memcheck/testAddressLeakSanitizer.cmake
index ca36a7c..58c94d7 100644
--- a/Tests/RunCMake/ctest_memcheck/testAddressLeakSanitizer.cmake
+++ b/Tests/RunCMake/ctest_memcheck/testAddressLeakSanitizer.cmake
@@ -2,7 +2,7 @@
# options
message("ASAN_OPTIONS = [$ENV{ASAN_OPTIONS}]")
-string(REGEX REPLACE ".*log_path=\'([^\']*)\'.*" "\\1" LOG_FILE "$ENV{ASAN_OPTIONS}")
+string(REGEX REPLACE ".*log_path='([^']*)'.*" "\\1" LOG_FILE "$ENV{ASAN_OPTIONS}")
message("LOG_FILE=[${LOG_FILE}]")
# if we are not asked to simulate AddressSanitizer don't do it
diff --git a/Tests/RunCMake/ctest_memcheck/testAddressSanitizer.cmake b/Tests/RunCMake/ctest_memcheck/testAddressSanitizer.cmake
index 1219666..8f18cd0 100644
--- a/Tests/RunCMake/ctest_memcheck/testAddressSanitizer.cmake
+++ b/Tests/RunCMake/ctest_memcheck/testAddressSanitizer.cmake
@@ -2,7 +2,7 @@
# options
message("ASAN_OPTIONS = [$ENV{ASAN_OPTIONS}]")
-string(REGEX REPLACE ".*log_path=\'([^\']*)\'.*" "\\1" LOG_FILE "$ENV{ASAN_OPTIONS}")
+string(REGEX REPLACE ".*log_path='([^']*)'.*" "\\1" LOG_FILE "$ENV{ASAN_OPTIONS}")
message("LOG_FILE=[${LOG_FILE}]")
# if we are not asked to simulate address sanitizer don't do it
diff --git a/Tests/RunCMake/ctest_memcheck/testLeakSanitizer.cmake b/Tests/RunCMake/ctest_memcheck/testLeakSanitizer.cmake
index 6d51f83..4990792 100644
--- a/Tests/RunCMake/ctest_memcheck/testLeakSanitizer.cmake
+++ b/Tests/RunCMake/ctest_memcheck/testLeakSanitizer.cmake
@@ -2,7 +2,7 @@
# options
message("LSAN_OPTIONS = [$ENV{LSAN_OPTIONS}]")
-string(REGEX REPLACE ".*log_path=\'([^\']*)\'.*" "\\1" LOG_FILE "$ENV{LSAN_OPTIONS}")
+string(REGEX REPLACE ".*log_path='([^']*)'.*" "\\1" LOG_FILE "$ENV{LSAN_OPTIONS}")
message("LOG_FILE=[${LOG_FILE}]")
# if we are not asked to simulate LeakSanitizer don't do it
diff --git a/Tests/RunCMake/ctest_memcheck/testMemorySanitizer.cmake b/Tests/RunCMake/ctest_memcheck/testMemorySanitizer.cmake
index 3b3ac22..4a6adb1 100644
--- a/Tests/RunCMake/ctest_memcheck/testMemorySanitizer.cmake
+++ b/Tests/RunCMake/ctest_memcheck/testMemorySanitizer.cmake
@@ -2,7 +2,7 @@
# options
message("MSAN_OPTIONS = [$ENV{MSAN_OPTIONS}]")
-string(REGEX REPLACE ".*log_path=\'([^\']*)\'.*" "\\1" LOG_FILE "$ENV{MSAN_OPTIONS}")
+string(REGEX REPLACE ".*log_path='([^']*)'.*" "\\1" LOG_FILE "$ENV{MSAN_OPTIONS}")
message("LOG_FILE=[${LOG_FILE}]")
# if we are not asked to simulate address sanitizer don't do it
diff --git a/Tests/RunCMake/ctest_memcheck/testThreadSanitizer.cmake b/Tests/RunCMake/ctest_memcheck/testThreadSanitizer.cmake
index e7a5c9f..96251c3 100644
--- a/Tests/RunCMake/ctest_memcheck/testThreadSanitizer.cmake
+++ b/Tests/RunCMake/ctest_memcheck/testThreadSanitizer.cmake
@@ -2,7 +2,7 @@
# options
message("TSAN_OPTIONS = [$ENV{TSAN_OPTIONS}]")
-string(REGEX REPLACE ".*log_path=\'([^\']*)\'.*" "\\1" LOG_FILE "$ENV{TSAN_OPTIONS}")
+string(REGEX REPLACE ".*log_path='([^']*)'.*" "\\1" LOG_FILE "$ENV{TSAN_OPTIONS}")
message("LOG_FILE=[${LOG_FILE}]")
set(error_types
diff --git a/Tests/RunCMake/ctest_memcheck/testUndefinedBehaviorSanitizer.cmake b/Tests/RunCMake/ctest_memcheck/testUndefinedBehaviorSanitizer.cmake
index ba6122d..7160280 100644
--- a/Tests/RunCMake/ctest_memcheck/testUndefinedBehaviorSanitizer.cmake
+++ b/Tests/RunCMake/ctest_memcheck/testUndefinedBehaviorSanitizer.cmake
@@ -2,7 +2,7 @@
# UndefinedBehaviorSanitizer options
message("UBSAN_OPTIONS = [$ENV{UBSAN_OPTIONS}]")
-string(REGEX REPLACE ".*log_path=\'([^\']*)\'.*" "\\1" LOG_FILE "$ENV{UBSAN_OPTIONS}")
+string(REGEX REPLACE ".*log_path='([^']*)'.*" "\\1" LOG_FILE "$ENV{UBSAN_OPTIONS}")
message("LOG_FILE=[${LOG_FILE}]")
# if we are not asked to simulate address sanitizer don't do it
diff --git a/Tests/RunCMake/ctest_start/NoStartTimeNightly-result.txt b/Tests/RunCMake/ctest_start/NoStartTimeNightly-result.txt
new file mode 100644
index 0000000..b57e2de
--- /dev/null
+++ b/Tests/RunCMake/ctest_start/NoStartTimeNightly-result.txt
@@ -0,0 +1 @@
+(-1|255)
diff --git a/Tests/RunCMake/ctest_start/NoStartTimeNightly-stderr.txt b/Tests/RunCMake/ctest_start/NoStartTimeNightly-stderr.txt
new file mode 100644
index 0000000..79756eb
--- /dev/null
+++ b/Tests/RunCMake/ctest_start/NoStartTimeNightly-stderr.txt
@@ -0,0 +1,4 @@
+^WARNING: No nightly start time found please set in CTestConfig\.cmake or DartConfig\.cmake
+CMake Error at [^
+]*/Tests/RunCMake/ctest_start/NoStartTimeNightly/test\.cmake:[0-9]+ \(ctest_start\):
+ ctest_start unknown error\.$
diff --git a/Tests/RunCMake/ctest_start/RunCMakeTest.cmake b/Tests/RunCMake/ctest_start/RunCMakeTest.cmake
index da85b39..f11f1ec 100644
--- a/Tests/RunCMake/ctest_start/RunCMakeTest.cmake
+++ b/Tests/RunCMake/ctest_start/RunCMakeTest.cmake
@@ -48,6 +48,8 @@ run_ctest_start(TooManyArgs Experimental
${RunCMake_BINARY_DIR}/TooManyArgs-build
${RunCMake_BINARY_DIR}/TooManyArgs-build
${RunCMake_BINARY_DIR}/TooManyArgs-build)
+run_ctest_start(NoStartTimeExperimental Experimental)
+run_ctest_start(NoStartTimeNightly Nightly)
function(run_ConfigInBuild)
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/ConfigInBuild-build)
diff --git a/Tests/RunCMake/ctest_start/test.cmake.in b/Tests/RunCMake/ctest_start/test.cmake.in
index 8cd3cff..4063ece 100644
--- a/Tests/RunCMake/ctest_start/test.cmake.in
+++ b/Tests/RunCMake/ctest_start/test.cmake.in
@@ -8,7 +8,9 @@ set(CTEST_CMAKE_GENERATOR "@RunCMake_GENERATOR@")
set(CTEST_CMAKE_GENERATOR_PLATFORM "@RunCMake_GENERATOR_PLATFORM@")
set(CTEST_CMAKE_GENERATOR_TOOLSET "@RunCMake_GENERATOR_TOOLSET@")
set(CTEST_BUILD_CONFIGURATION "$ENV{CMAKE_CONFIG_TYPE}")
-set(CTEST_NIGHTLY_START_TIME "01:00:00 UTC")
+if(NOT "@CASE_NAME@" MATCHES "^NoStartTime")
+ set(CTEST_NIGHTLY_START_TIME "01:00:00 UTC")
+endif()
function(setup_tests)
ctest_start(${ctest_start_args})
diff --git a/Tests/RunCMake/ctest_test/RunCMakeTest.cmake b/Tests/RunCMake/ctest_test/RunCMakeTest.cmake
index 84d1d66..18ae793 100644
--- a/Tests/RunCMake/ctest_test/RunCMakeTest.cmake
+++ b/Tests/RunCMake/ctest_test/RunCMakeTest.cmake
@@ -95,3 +95,26 @@ endfunction()
run_TestRepeat(UntilFail REPEAT UNTIL_FAIL:3)
run_TestRepeat(UntilPass REPEAT UNTIL_PASS:3)
run_TestRepeat(AfterTimeout REPEAT AFTER_TIMEOUT:3)
+
+# test --stop-on-failure
+function(run_stop_on_failure)
+ set(CASE_CTEST_TEST_ARGS EXCLUDE RunCMakeVersion)
+ set(CASE_CMAKELISTS_SUFFIX_CODE [[
+add_test(NAME StoppingTest COMMAND ${CMAKE_COMMAND} -E false)
+add_test(NAME NotRunTest COMMAND ${CMAKE_COMMAND} -E true)
+ ]])
+
+ run_ctest_test(stop-on-failure STOP_ON_FAILURE)
+endfunction()
+run_stop_on_failure()
+
+# Make sure environment gets logged
+function(run_environment)
+ set(ENV{BAD_ENVIRONMENT_VARIABLE} "Bad environment variable")
+ set(CASE_CMAKELISTS_SUFFIX_CODE [[
+set_property(TEST RunCMakeVersion PROPERTY ENVIRONMENT "ENV1=env1;ENV2=env2")
+ ]])
+
+ run_ctest(TestEnvironment)
+endfunction()
+run_environment()
diff --git a/Tests/RunCMake/ctest_test/TestEnvironment-check.cmake b/Tests/RunCMake/ctest_test/TestEnvironment-check.cmake
new file mode 100644
index 0000000..91c9731
--- /dev/null
+++ b/Tests/RunCMake/ctest_test/TestEnvironment-check.cmake
@@ -0,0 +1,10 @@
+file(READ "${RunCMake_TEST_BINARY_DIR}/Testing/TAG" _tag)
+string(REGEX REPLACE "^([^\n]*)\n.*$" "\\1" _date "${_tag}")
+file(READ "${RunCMake_TEST_BINARY_DIR}/Testing/${_date}/Test.xml" _test_contents)
+
+if(NOT _test_contents MATCHES "<Value>ENV1=env1\nENV2=env2\n#CTEST_RESOURCE_GROUP_COUNT=</Value>")
+ string(APPEND RunCMake_TEST_FAILED "Could not find expected environment variables in Test.xml")
+endif()
+if(_test_contents MATCHES "BAD_ENVIRONMENT_VARIABLE")
+ string(APPEND RunCMake_TEST_FAILED "Found BAD_ENVIRONMENT_VARIABLE in Test.xml")
+endif()
diff --git a/Tests/RunCMake/ctest_test/stop-on-failure-stdout.txt b/Tests/RunCMake/ctest_test/stop-on-failure-stdout.txt
new file mode 100644
index 0000000..fa4bce0
--- /dev/null
+++ b/Tests/RunCMake/ctest_test/stop-on-failure-stdout.txt
@@ -0,0 +1,13 @@
+Test project [^
+]*/Tests/RunCMake/ctest_test/stop-on-failure-build
+ Start 1: RunCMakeVersion
+1/3 Test #1: RunCMakeVersion .................. Passed +[0-9.]+ sec
+ Start 2: StoppingTest
+2/3 Test #2: StoppingTest .....................\*\*\*Failed +[0-9.]+ sec
++
+50% tests passed, 1 tests failed out of 2
++
+Total Test time \(real\) = +[0-9.]+ sec
++
+The following tests FAILED:
+[ ]+2 - StoppingTest \(Failed\)$
diff --git a/Tests/RunCMake/execute_process/EchoVariable-stderr.txt b/Tests/RunCMake/execute_process/EchoVariable-stderr.txt
new file mode 100644
index 0000000..d927553
--- /dev/null
+++ b/Tests/RunCMake/execute_process/EchoVariable-stderr.txt
@@ -0,0 +1,3 @@
+CMake Error at [^
+]*EchoVariableOutput.cmake:2 \(message\):
+ Text to stderr
diff --git a/Tests/RunCMake/execute_process/EchoVariable-stdout.txt b/Tests/RunCMake/execute_process/EchoVariable-stdout.txt
new file mode 100644
index 0000000..7c868bd
--- /dev/null
+++ b/Tests/RunCMake/execute_process/EchoVariable-stdout.txt
@@ -0,0 +1 @@
+-- Text to stdout
diff --git a/Tests/RunCMake/execute_process/EchoVariable.cmake b/Tests/RunCMake/execute_process/EchoVariable.cmake
new file mode 100644
index 0000000..99999c7
--- /dev/null
+++ b/Tests/RunCMake/execute_process/EchoVariable.cmake
@@ -0,0 +1,23 @@
+execute_process(
+ COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_LIST_DIR}/EchoVariableOutput.cmake
+ OUTPUT_VARIABLE stdout
+ ERROR_QUIET
+ ECHO_OUTPUT_VARIABLE
+)
+
+file(READ ${CMAKE_CURRENT_LIST_DIR}/EchoVariable-stdout.txt expected_stdout)
+if (NOT stdout MATCHES "${expected_stdout}")
+ message(FATAL_ERROR "stdout differs from the expected stdout")
+endif()
+
+execute_process(
+ COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_LIST_DIR}/EchoVariableOutput.cmake
+ ERROR_VARIABLE stderr
+ OUTPUT_QUIET
+ ECHO_ERROR_VARIABLE
+)
+
+file(READ ${CMAKE_CURRENT_LIST_DIR}/EchoVariable-stderr.txt expected_stderr)
+if (NOT stderr MATCHES "${expected_stderr}")
+ message(FATAL_ERROR "stderr differs from the expected stderr")
+endif()
diff --git a/Tests/RunCMake/execute_process/EchoVariableOutput.cmake b/Tests/RunCMake/execute_process/EchoVariableOutput.cmake
new file mode 100644
index 0000000..e636567
--- /dev/null
+++ b/Tests/RunCMake/execute_process/EchoVariableOutput.cmake
@@ -0,0 +1,2 @@
+message(STATUS "Text to stdout")
+message(FATAL_ERROR "Text to stderr")
diff --git a/Tests/RunCMake/execute_process/RunCMakeTest.cmake b/Tests/RunCMake/execute_process/RunCMakeTest.cmake
index b203aab..89ad6b2 100644
--- a/Tests/RunCMake/execute_process/RunCMakeTest.cmake
+++ b/Tests/RunCMake/execute_process/RunCMakeTest.cmake
@@ -24,3 +24,5 @@ run_cmake_command(EchoCommand2 ${CMAKE_COMMAND} -P
run_cmake_command(EchoCommand3 ${CMAKE_COMMAND}
-DCHECK_ERROR_OUTPUT_LOCATION=TRUE -P
${RunCMake_SOURCE_DIR}/EchoCommand.cmake)
+
+run_cmake_command(EchoVariable ${CMAKE_COMMAND} -P ${RunCMake_SOURCE_DIR}/EchoVariable.cmake)
diff --git a/Tests/RunCMake/exit_code.c b/Tests/RunCMake/exit_code.c
index 3eba019..9fa8eca 100644
--- a/Tests/RunCMake/exit_code.c
+++ b/Tests/RunCMake/exit_code.c
@@ -21,7 +21,8 @@ int main(int argc, const char* argv[])
}
if (strcmp(str, substring_success) == 0) {
return EXIT_SUCCESS;
- } else if (strcmp(str, substring_failure) == 0) {
+ }
+ if (strcmp(str, substring_failure) == 0) {
return EXIT_FAILURE;
}
fprintf(stderr, "Failed to find string '%s' in '%s'\n", substring_success,
diff --git a/Tests/RunCMake/export/Repeat-CMP0103-NEW-result.txt b/Tests/RunCMake/export/Repeat-CMP0103-NEW-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/export/Repeat-CMP0103-NEW-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/export/Repeat-CMP0103-NEW-stderr.txt b/Tests/RunCMake/export/Repeat-CMP0103-NEW-stderr.txt
new file mode 100644
index 0000000..48ab7b1
--- /dev/null
+++ b/Tests/RunCMake/export/Repeat-CMP0103-NEW-stderr.txt
@@ -0,0 +1,17 @@
+CMake Error at Repeat.cmake:[0-9]+ \(export\):
+ export command already specified for the file
+
+ foo.cmake
+
+ Did you miss 'APPEND' keyword\?
+Call Stack \(most recent call first\):
+ Repeat-CMP0103-NEW.cmake:[0-9]+ \(include\)
+ CMakeLists.txt:[0-9]+ \(include\)
+
+
+CMake Error at Repeat/CMakeLists.txt:[0-9]+ \(export\):
+ export command already specified for the file
+
+ .+/foo.cmake
+
+ Did you miss 'APPEND' keyword\?
diff --git a/Tests/RunCMake/export/Repeat-CMP0103-NEW.cmake b/Tests/RunCMake/export/Repeat-CMP0103-NEW.cmake
new file mode 100644
index 0000000..69381df
--- /dev/null
+++ b/Tests/RunCMake/export/Repeat-CMP0103-NEW.cmake
@@ -0,0 +1,2 @@
+cmake_policy(SET CMP0103 NEW)
+include(Repeat.cmake)
diff --git a/Tests/RunCMake/export/Repeat-CMP0103-OLD.cmake b/Tests/RunCMake/export/Repeat-CMP0103-OLD.cmake
new file mode 100644
index 0000000..25134d6
--- /dev/null
+++ b/Tests/RunCMake/export/Repeat-CMP0103-OLD.cmake
@@ -0,0 +1,2 @@
+cmake_policy(SET CMP0103 OLD)
+include(Repeat.cmake)
diff --git a/Tests/RunCMake/export/Repeat-CMP0103-WARN-stderr.txt b/Tests/RunCMake/export/Repeat-CMP0103-WARN-stderr.txt
new file mode 100644
index 0000000..28e849d
--- /dev/null
+++ b/Tests/RunCMake/export/Repeat-CMP0103-WARN-stderr.txt
@@ -0,0 +1,26 @@
+CMake Warning \(dev\) at Repeat.cmake:[0-9]+ \(export\):
+ Policy CMP0103 is not set: Multiple export\(\) with same FILE without APPEND
+ is not allowed. Run "cmake --help-policy CMP0103" for policy details. Use
+ the cmake_policy command to set the policy and suppress this warning.
+
+ export\(\) command already specified for the file
+
+ foo.cmake
+
+ Did you miss 'APPEND' keyword\?
+Call Stack \(most recent call first\):
+ Repeat-CMP0103-WARN.cmake:[0-9]+ \(include\)
+ CMakeLists.txt:[0-9]+ \(include\)
+This warning is for project developers. Use -Wno-dev to suppress it.
+
+CMake Warning \(dev\) at Repeat/CMakeLists.txt:[0-9]+ \(export\):
+ Policy CMP0103 is not set: Multiple export\(\) with same FILE without APPEND
+ is not allowed. Run "cmake --help-policy CMP0103" for policy details. Use
+ the cmake_policy command to set the policy and suppress this warning.
+
+ export\(\) command already specified for the file
+
+ .+/foo.cmake
+
+ Did you miss 'APPEND' keyword\?
+This warning is for project developers. Use -Wno-dev to suppress it.
diff --git a/Tests/RunCMake/export/Repeat-CMP0103-WARN.cmake b/Tests/RunCMake/export/Repeat-CMP0103-WARN.cmake
new file mode 100644
index 0000000..3a630c5
--- /dev/null
+++ b/Tests/RunCMake/export/Repeat-CMP0103-WARN.cmake
@@ -0,0 +1 @@
+include(Repeat.cmake)
diff --git a/Tests/RunCMake/export/RunCMakeTest.cmake b/Tests/RunCMake/export/RunCMakeTest.cmake
index df35d95..1c74762 100644
--- a/Tests/RunCMake/export/RunCMakeTest.cmake
+++ b/Tests/RunCMake/export/RunCMakeTest.cmake
@@ -2,7 +2,9 @@ include(RunCMake)
run_cmake(CustomTarget)
run_cmake(Empty)
-run_cmake(Repeat)
+run_cmake(Repeat-CMP0103-WARN)
+run_cmake(Repeat-CMP0103-OLD)
+run_cmake(Repeat-CMP0103-NEW)
run_cmake(TargetNotFound)
run_cmake(AppendExport)
run_cmake(OldIface)
diff --git a/Tests/RunCMake/file/DOWNLOAD-tls-cainfo-not-set-result.txt b/Tests/RunCMake/file/DOWNLOAD-tls-cainfo-not-set-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/file/DOWNLOAD-tls-cainfo-not-set-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/file/DOWNLOAD-tls-cainfo-not-set-stderr.txt b/Tests/RunCMake/file/DOWNLOAD-tls-cainfo-not-set-stderr.txt
new file mode 100644
index 0000000..1552baa
--- /dev/null
+++ b/Tests/RunCMake/file/DOWNLOAD-tls-cainfo-not-set-stderr.txt
@@ -0,0 +1,4 @@
+^CMake Error at DOWNLOAD-tls-cainfo-not-set.cmake:[0-9]+ \(file\):
+ file DOWNLOAD missing file value for TLS_CAINFO.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:[0-9]+ \(include\)$
diff --git a/Tests/RunCMake/file/DOWNLOAD-tls-cainfo-not-set.cmake b/Tests/RunCMake/file/DOWNLOAD-tls-cainfo-not-set.cmake
new file mode 100644
index 0000000..b476425
--- /dev/null
+++ b/Tests/RunCMake/file/DOWNLOAD-tls-cainfo-not-set.cmake
@@ -0,0 +1 @@
+file(DOWNLOAD "" "" TLS_CAINFO)
diff --git a/Tests/RunCMake/file/DOWNLOAD-tls-verify-not-set-result.txt b/Tests/RunCMake/file/DOWNLOAD-tls-verify-not-set-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/file/DOWNLOAD-tls-verify-not-set-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/file/DOWNLOAD-tls-verify-not-set-stderr.txt b/Tests/RunCMake/file/DOWNLOAD-tls-verify-not-set-stderr.txt
new file mode 100644
index 0000000..2f46c0c
--- /dev/null
+++ b/Tests/RunCMake/file/DOWNLOAD-tls-verify-not-set-stderr.txt
@@ -0,0 +1,4 @@
+^CMake Error at DOWNLOAD-tls-verify-not-set.cmake:[0-9]+ \(file\):
+ file DOWNLOAD missing bool value for TLS_VERIFY.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:[0-9]+ \(include\)$
diff --git a/Tests/RunCMake/file/DOWNLOAD-tls-verify-not-set.cmake b/Tests/RunCMake/file/DOWNLOAD-tls-verify-not-set.cmake
new file mode 100644
index 0000000..919368c
--- /dev/null
+++ b/Tests/RunCMake/file/DOWNLOAD-tls-verify-not-set.cmake
@@ -0,0 +1 @@
+file(DOWNLOAD "" "" TLS_VERIFY)
diff --git a/Tests/RunCMake/file/RunCMakeTest.cmake b/Tests/RunCMake/file/RunCMakeTest.cmake
index f5461ad..a4de1d3 100644
--- a/Tests/RunCMake/file/RunCMakeTest.cmake
+++ b/Tests/RunCMake/file/RunCMakeTest.cmake
@@ -8,6 +8,8 @@ run_cmake(DOWNLOAD-hash-mismatch)
run_cmake(DOWNLOAD-unused-argument)
run_cmake(DOWNLOAD-httpheader-not-set)
run_cmake(DOWNLOAD-netrc-bad)
+run_cmake(DOWNLOAD-tls-cainfo-not-set)
+run_cmake(DOWNLOAD-tls-verify-not-set)
run_cmake(DOWNLOAD-pass-not-set)
run_cmake(TOUCH)
run_cmake(TOUCH-error-in-source-directory)
@@ -15,6 +17,8 @@ run_cmake(TOUCH-error-missing-directory)
run_cmake(UPLOAD-unused-argument)
run_cmake(UPLOAD-httpheader-not-set)
run_cmake(UPLOAD-netrc-bad)
+run_cmake(UPLOAD-tls-cainfo-not-set)
+run_cmake(UPLOAD-tls-verify-not-set)
run_cmake(UPLOAD-pass-not-set)
run_cmake(INSTALL-DIRECTORY)
run_cmake(INSTALL-FILES_FROM_DIR)
diff --git a/Tests/RunCMake/file/UPLOAD-tls-cainfo-not-set-result.txt b/Tests/RunCMake/file/UPLOAD-tls-cainfo-not-set-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/file/UPLOAD-tls-cainfo-not-set-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/file/UPLOAD-tls-cainfo-not-set-stderr.txt b/Tests/RunCMake/file/UPLOAD-tls-cainfo-not-set-stderr.txt
new file mode 100644
index 0000000..a5fa4e8
--- /dev/null
+++ b/Tests/RunCMake/file/UPLOAD-tls-cainfo-not-set-stderr.txt
@@ -0,0 +1,4 @@
+^CMake Error at UPLOAD-tls-cainfo-not-set.cmake:[0-9]+ \(file\):
+ file UPLOAD missing file value for TLS_CAINFO.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:[0-9]+ \(include\)$
diff --git a/Tests/RunCMake/file/UPLOAD-tls-cainfo-not-set.cmake b/Tests/RunCMake/file/UPLOAD-tls-cainfo-not-set.cmake
new file mode 100644
index 0000000..8eb7c83
--- /dev/null
+++ b/Tests/RunCMake/file/UPLOAD-tls-cainfo-not-set.cmake
@@ -0,0 +1 @@
+file(UPLOAD "" "" TLS_CAINFO)
diff --git a/Tests/RunCMake/file/UPLOAD-tls-verify-not-set-result.txt b/Tests/RunCMake/file/UPLOAD-tls-verify-not-set-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/file/UPLOAD-tls-verify-not-set-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/file/UPLOAD-tls-verify-not-set-stderr.txt b/Tests/RunCMake/file/UPLOAD-tls-verify-not-set-stderr.txt
new file mode 100644
index 0000000..c4dffcd
--- /dev/null
+++ b/Tests/RunCMake/file/UPLOAD-tls-verify-not-set-stderr.txt
@@ -0,0 +1,4 @@
+^CMake Error at UPLOAD-tls-verify-not-set.cmake:[0-9]+ \(file\):
+ file UPLOAD missing bool value for TLS_VERIFY.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:[0-9]+ \(include\)$
diff --git a/Tests/RunCMake/file/UPLOAD-tls-verify-not-set.cmake b/Tests/RunCMake/file/UPLOAD-tls-verify-not-set.cmake
new file mode 100644
index 0000000..8b9d293
--- /dev/null
+++ b/Tests/RunCMake/file/UPLOAD-tls-verify-not-set.cmake
@@ -0,0 +1 @@
+file(UPLOAD "" "" TLS_VERIFY)
diff --git a/Tests/RunCMake/find_file/Required-result.txt b/Tests/RunCMake/find_file/Required-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/find_file/Required-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/find_file/Required-stderr.txt b/Tests/RunCMake/find_file/Required-stderr.txt
new file mode 100644
index 0000000..f9c337c
--- /dev/null
+++ b/Tests/RunCMake/find_file/Required-stderr.txt
@@ -0,0 +1,4 @@
+CMake Error at Required.cmake:9 \(find_file\):
+ Could not find FILE_doNotExists using the following files: doNotExists.h
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/find_file/Required-stdout.txt b/Tests/RunCMake/find_file/Required-stdout.txt
new file mode 100644
index 0000000..87a8e86
--- /dev/null
+++ b/Tests/RunCMake/find_file/Required-stdout.txt
@@ -0,0 +1 @@
+-- FILE_exists='[^']*/Tests/RunCMake/find_file/include/PrefixInPATH.h'
diff --git a/Tests/RunCMake/find_file/Required.cmake b/Tests/RunCMake/find_file/Required.cmake
new file mode 100644
index 0000000..9cf0927
--- /dev/null
+++ b/Tests/RunCMake/find_file/Required.cmake
@@ -0,0 +1,12 @@
+find_file(FILE_exists
+ NAMES PrefixInPATH.h
+ PATHS ${CMAKE_CURRENT_SOURCE_DIR}/include
+ NO_DEFAULT_PATH
+ REQUIRED
+ )
+message(STATUS "FILE_exists='${FILE_exists}'")
+
+find_file(FILE_doNotExists
+ NAMES doNotExists.h
+ REQUIRED
+ )
diff --git a/Tests/RunCMake/find_file/RunCMakeTest.cmake b/Tests/RunCMake/find_file/RunCMakeTest.cmake
index 9f56a57..93dfb78 100644
--- a/Tests/RunCMake/find_file/RunCMakeTest.cmake
+++ b/Tests/RunCMake/find_file/RunCMakeTest.cmake
@@ -3,3 +3,4 @@ include(RunCMake)
run_cmake(FromPATHEnv)
run_cmake(FromPrefixPath)
run_cmake(PrefixInPATH)
+run_cmake(Required)
diff --git a/Tests/RunCMake/find_library/Required-result.txt b/Tests/RunCMake/find_library/Required-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/find_library/Required-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/find_library/Required-stderr.txt b/Tests/RunCMake/find_library/Required-stderr.txt
new file mode 100644
index 0000000..545d164
--- /dev/null
+++ b/Tests/RunCMake/find_library/Required-stderr.txt
@@ -0,0 +1,4 @@
+CMake Error at Required.cmake:11 \(find_library\):
+ Could not find LIB_doNotExists using the following names: doNotExists
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/find_library/Required-stdout.txt b/Tests/RunCMake/find_library/Required-stdout.txt
new file mode 100644
index 0000000..b88ab79
--- /dev/null
+++ b/Tests/RunCMake/find_library/Required-stdout.txt
@@ -0,0 +1 @@
+-- LIB_exists='[^']*/Tests/RunCMake/find_library/lib/libPrefixInPATH.a'
diff --git a/Tests/RunCMake/find_library/Required.cmake b/Tests/RunCMake/find_library/Required.cmake
new file mode 100644
index 0000000..78c9f87
--- /dev/null
+++ b/Tests/RunCMake/find_library/Required.cmake
@@ -0,0 +1,14 @@
+list(APPEND CMAKE_FIND_LIBRARY_PREFIXES lib)
+list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES .a)
+find_library(LIB_exists
+ NAMES PrefixInPATH
+ PATHS ${CMAKE_CURRENT_SOURCE_DIR}/lib
+ NO_DEFAULT_PATH
+ REQUIRED
+ )
+message(STATUS "LIB_exists='${LIB_exists}'")
+
+find_library(LIB_doNotExists
+ NAMES doNotExists
+ REQUIRED
+ )
diff --git a/Tests/RunCMake/find_library/RunCMakeTest.cmake b/Tests/RunCMake/find_library/RunCMakeTest.cmake
index 643a5b9..b6aadce 100644
--- a/Tests/RunCMake/find_library/RunCMakeTest.cmake
+++ b/Tests/RunCMake/find_library/RunCMakeTest.cmake
@@ -7,3 +7,4 @@ if(CMAKE_HOST_UNIX)
run_cmake(LibArchLink)
endif()
run_cmake(PrefixInPATH)
+run_cmake(Required)
diff --git a/Tests/RunCMake/find_path/Required-result.txt b/Tests/RunCMake/find_path/Required-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/find_path/Required-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/find_path/Required-stderr.txt b/Tests/RunCMake/find_path/Required-stderr.txt
new file mode 100644
index 0000000..db65c2f
--- /dev/null
+++ b/Tests/RunCMake/find_path/Required-stderr.txt
@@ -0,0 +1,4 @@
+CMake Error at Required.cmake:9 \(find_path\):
+ Could not find PATH_doNotExists using the following files: doNotExists.h
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/find_path/Required-stdout.txt b/Tests/RunCMake/find_path/Required-stdout.txt
new file mode 100644
index 0000000..225fcab
--- /dev/null
+++ b/Tests/RunCMake/find_path/Required-stdout.txt
@@ -0,0 +1 @@
+-- PATH_exists='[^']*/Tests/RunCMake/find_path/include'
diff --git a/Tests/RunCMake/find_path/Required.cmake b/Tests/RunCMake/find_path/Required.cmake
new file mode 100644
index 0000000..172dc11
--- /dev/null
+++ b/Tests/RunCMake/find_path/Required.cmake
@@ -0,0 +1,12 @@
+find_path(PATH_exists
+ NAMES PrefixInPATH.h
+ PATHS ${CMAKE_CURRENT_SOURCE_DIR}/include
+ NO_DEFAULT_PATH
+ REQUIRED
+ )
+message(STATUS "PATH_exists='${PATH_exists}'")
+
+find_path(PATH_doNotExists
+ NAMES doNotExists.h
+ REQUIRED
+ )
diff --git a/Tests/RunCMake/find_path/RunCMakeTest.cmake b/Tests/RunCMake/find_path/RunCMakeTest.cmake
index ed55f51..5c919bb 100644
--- a/Tests/RunCMake/find_path/RunCMakeTest.cmake
+++ b/Tests/RunCMake/find_path/RunCMakeTest.cmake
@@ -3,6 +3,7 @@ include(RunCMake)
run_cmake(EmptyOldStyle)
run_cmake(FromPATHEnv)
run_cmake(PrefixInPATH)
+run_cmake(Required)
if(APPLE)
run_cmake(FrameworksWithSubdirs)
diff --git a/Tests/RunCMake/find_program/ExeNoRead-stdout.txt b/Tests/RunCMake/find_program/ExeNoRead-stdout.txt
new file mode 100644
index 0000000..35a83f2
--- /dev/null
+++ b/Tests/RunCMake/find_program/ExeNoRead-stdout.txt
@@ -0,0 +1 @@
+-- ExeNoRead_EXECUTABLE='.*/Tests/RunCMake/find_program/ExeNoRead-build/ExeNoRead'
diff --git a/Tests/RunCMake/find_program/ExeNoRead.cmake b/Tests/RunCMake/find_program/ExeNoRead.cmake
new file mode 100644
index 0000000..7e22dc5
--- /dev/null
+++ b/Tests/RunCMake/find_program/ExeNoRead.cmake
@@ -0,0 +1,4 @@
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/ExeNoRead" "#!/bin/sh\n")
+execute_process(COMMAND chmod -r+x "${CMAKE_CURRENT_BINARY_DIR}/ExeNoRead")
+find_program(ExeNoRead_EXECUTABLE NAMES ExeNoRead NO_DEFAULT_PATH PATHS "${CMAKE_CURRENT_BINARY_DIR}")
+message(STATUS "ExeNoRead_EXECUTABLE='${ExeNoRead_EXECUTABLE}'")
diff --git a/Tests/RunCMake/find_program/Required-result.txt b/Tests/RunCMake/find_program/Required-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/find_program/Required-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/find_program/Required-stderr.txt b/Tests/RunCMake/find_program/Required-stderr.txt
new file mode 100644
index 0000000..214a8d4
--- /dev/null
+++ b/Tests/RunCMake/find_program/Required-stderr.txt
@@ -0,0 +1,4 @@
+CMake Error at Required.cmake:9 \(find_program\):
+ Could not find PROG_AandB using the following names: testAandB
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/find_program/Required-stdout.txt b/Tests/RunCMake/find_program/Required-stdout.txt
new file mode 100644
index 0000000..3c8f1b5
--- /dev/null
+++ b/Tests/RunCMake/find_program/Required-stdout.txt
@@ -0,0 +1 @@
+-- PROG_A='[^']*/Tests/RunCMake/find_program/A/testA'
diff --git a/Tests/RunCMake/find_program/Required.cmake b/Tests/RunCMake/find_program/Required.cmake
new file mode 100644
index 0000000..a75aa53
--- /dev/null
+++ b/Tests/RunCMake/find_program/Required.cmake
@@ -0,0 +1,12 @@
+find_program(PROG_A
+ NAMES testA
+ PATHS ${CMAKE_CURRENT_SOURCE_DIR}/A
+ NO_DEFAULT_PATH
+ REQUIRED
+ )
+message(STATUS "PROG_A='${PROG_A}'")
+
+find_program(PROG_AandB
+ NAMES testAandB
+ REQUIRED
+ )
diff --git a/Tests/RunCMake/find_program/RunCMakeTest.cmake b/Tests/RunCMake/find_program/RunCMakeTest.cmake
index 6903f05..95ffd84 100644
--- a/Tests/RunCMake/find_program/RunCMakeTest.cmake
+++ b/Tests/RunCMake/find_program/RunCMakeTest.cmake
@@ -4,8 +4,13 @@ run_cmake(EnvAndHints)
run_cmake(DirsPerName)
run_cmake(NamesPerDir)
run_cmake(RelAndAbsPath)
+run_cmake(Required)
if(CMAKE_SYSTEM_NAME MATCHES "^(Windows|CYGWIN)$")
run_cmake(WindowsCom)
run_cmake(WindowsExe)
endif()
+
+if(UNIX)
+ run_cmake(ExeNoRead)
+endif()
diff --git a/Tests/RunCMake/get_filename_component/KnownComponents.cmake b/Tests/RunCMake/get_filename_component/KnownComponents.cmake
index 54b858f..c2762ad 100644
--- a/Tests/RunCMake/get_filename_component/KnownComponents.cmake
+++ b/Tests/RunCMake/get_filename_component/KnownComponents.cmake
@@ -85,12 +85,12 @@ check("PROGRAM with args output: args" "${test_program_args}" " arg1 arg2")
get_filename_component(test_program_name " " PROGRAM)
check("PROGRAM with just a space" "${test_program_name}" "")
-get_filename_component(test_program_name "${CMAKE_CURRENT_LIST_FILE}" PROGRAM)
-check("PROGRAM specified explicitly without quoting" "${test_program_name}" "${CMAKE_CURRENT_LIST_FILE}")
+get_filename_component(test_program_name "${CMAKE_CURRENT_LIST_DIR}/KnownComponents.sh" PROGRAM)
+check("PROGRAM specified explicitly without quoting" "${test_program_name}" "${CMAKE_CURRENT_LIST_DIR}/KnownComponents.sh")
-get_filename_component(test_program_name "\"${CMAKE_CURRENT_LIST_FILE}\" arg1 arg2" PROGRAM
+get_filename_component(test_program_name "\"${CMAKE_CURRENT_LIST_DIR}/KnownComponents.sh\" arg1 arg2" PROGRAM
PROGRAM_ARGS test_program_args)
-check("PROGRAM specified explicitly with arguments: name" "${test_program_name}" "${CMAKE_CURRENT_LIST_FILE}")
+check("PROGRAM specified explicitly with arguments: name" "${test_program_name}" "${CMAKE_CURRENT_LIST_DIR}/KnownComponents.sh")
check("PROGRAM specified explicitly with arguments: args" "${test_program_args}" " arg1 arg2")
list(APPEND non_cache_vars test_program_name)
diff --git a/Tests/RunCMake/get_filename_component/KnownComponents.sh b/Tests/RunCMake/get_filename_component/KnownComponents.sh
new file mode 100755
index 0000000..1a24852
--- /dev/null
+++ b/Tests/RunCMake/get_filename_component/KnownComponents.sh
@@ -0,0 +1 @@
+#!/bin/sh
diff --git a/Tests/RunCMake/get_property/RunCMakeTest.cmake b/Tests/RunCMake/get_property/RunCMakeTest.cmake
index 6e36473..c4ee53d 100644
--- a/Tests/RunCMake/get_property/RunCMakeTest.cmake
+++ b/Tests/RunCMake/get_property/RunCMakeTest.cmake
@@ -5,6 +5,7 @@ run_cmake(directory_properties)
run_cmake(global_properties)
run_cmake(install_properties)
run_cmake(source_properties)
+run_cmake(source_properties_failures)
run_cmake(target_properties)
run_cmake(test_properties)
run_cmake(DebugConfigurations)
diff --git a/Tests/RunCMake/get_property/source_properties_failures-result.txt b/Tests/RunCMake/get_property/source_properties_failures-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/get_property/source_properties_failures-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/get_property/source_properties_failures-stderr.txt b/Tests/RunCMake/get_property/source_properties_failures-stderr.txt
new file mode 100644
index 0000000..a500e2e
--- /dev/null
+++ b/Tests/RunCMake/get_property/source_properties_failures-stderr.txt
@@ -0,0 +1,66 @@
+^CMake Error at source_properties_failures.cmake:1 \(set_source_files_properties\):
+ set_source_files_properties called with incorrect number of arguments no
+ value provided to the DIRECTORY option
+Call Stack \(most recent call first\):
+ CMakeLists\.txt:[0-9]+ \(include\)
++
+CMake Error at source_properties_failures.cmake:2 \(set_source_files_properties\):
+ set_source_files_properties given non-existent DIRECTORY non_existing_dir
+Call Stack \(most recent call first\):
+ CMakeLists\.txt:[0-9]+ \(include\)
++
+CMake Error at source_properties_failures.cmake:3 \(set_source_files_properties\):
+ set_source_files_properties called with incorrect number of arguments no
+ value provided to the TARGET_DIRECTORY option
+Call Stack \(most recent call first\):
+ CMakeLists\.txt:[0-9]+ \(include\)
++
+CMake Error at source_properties_failures.cmake:4 \(set_source_files_properties\):
+ set_source_files_properties given non-existent target for DIRECTORY_TARGET
+ non_existing_target
+Call Stack \(most recent call first\):
+ CMakeLists\.txt:[0-9]+ \(include\)
++
+CMake Error at source_properties_failures.cmake:6 \(get_property\):
+ get_property called with incorrect number of arguments no value provided to
+ the DIRECTORY option
+Call Stack \(most recent call first\):
+ CMakeLists\.txt:[0-9]+ \(include\)
++
+CMake Error at source_properties_failures.cmake:7 \(get_property\):
+ get_property given non-existent DIRECTORY non_existing_dir
+Call Stack \(most recent call first\):
+ CMakeLists\.txt:[0-9]+ \(include\)
++
+CMake Error at source_properties_failures.cmake:8 \(get_property\):
+ get_property called with incorrect number of arguments no value provided to
+ the TARGET_DIRECTORY option
+Call Stack \(most recent call first\):
+ CMakeLists\.txt:[0-9]+ \(include\)
++
+CMake Error at source_properties_failures.cmake:9 \(get_property\):
+ get_property given non-existent target for DIRECTORY_TARGET
+ non_existing_dir
+Call Stack \(most recent call first\):
+ CMakeLists\.txt:[0-9]+ \(include\)
++
+CMake Error at source_properties_failures.cmake:11 \(get_source_file_property\):
+ get_source_file_property given non-existent DIRECTORY PROPERTY
+Call Stack \(most recent call first\):
+ CMakeLists\.txt:[0-9]+ \(include\)
++
+CMake Error at source_properties_failures.cmake:12 \(get_source_file_property\):
+ get_source_file_property called with incorrect number of arguments
+Call Stack \(most recent call first\):
+ CMakeLists\.txt:[0-9]+ \(include\)
++
+CMake Error at source_properties_failures.cmake:13 \(get_source_file_property\):
+ get_source_file_property given non-existent target for DIRECTORY_TARGET
+ PROPERTY
+Call Stack \(most recent call first\):
+ CMakeLists\.txt:[0-9]+ \(include\)
++
+CMake Error at source_properties_failures.cmake:14 \(get_source_file_property\):
+ get_source_file_property called with incorrect number of arguments
+Call Stack \(most recent call first\):
+ CMakeLists\.txt:[0-9]+ \(include\)$
diff --git a/Tests/RunCMake/get_property/source_properties_failures.cmake b/Tests/RunCMake/get_property/source_properties_failures.cmake
new file mode 100644
index 0000000..f4b87f9
--- /dev/null
+++ b/Tests/RunCMake/get_property/source_properties_failures.cmake
@@ -0,0 +1,14 @@
+set_source_files_properties(a.txt DIRECTORY PROPERTIES COMPILE_DEFINITIONS "def")
+set_source_files_properties(a.txt DIRECTORY non_existing_dir PROPERTIES COMPILE_DEFINITIONS "def")
+set_source_files_properties(a.txt TARGET_DIRECTORY PROPERTIES COMPILE_DEFINITIONS "def")
+set_source_files_properties(a.txt TARGET_DIRECTORY non_existing_target PROPERTIES COMPILE_DEFINITIONS "def")
+
+get_property(in_var SOURCE a.txt DIRECTORY PROPERTY COMPILE_DEFINITIONS)
+get_property(in_var SOURCE a.txt DIRECTORY non_existing_dir PROPERTY COMPILE_DEFINITIONS)
+get_property(in_var SOURCE a.txt TARGET_DIRECTORY PROPERTY COMPILE_DEFINITIONS)
+get_property(in_var SOURCE a.txt TARGET_DIRECTORY non_existing_dir PROPERTY COMPILE_DEFINITIONS)
+
+get_source_file_property(in_var a.txt DIRECTORY PROPERTY COMPILE_DEFINITIONS)
+get_source_file_property(in_var a.txt DIRECTORY non_existing_dir PROPERTY COMPILE_DEFINITIONS)
+get_source_file_property(in_var a.txt TARGET_DIRECTORY PROPERTY COMPILE_DEFINITIONS)
+get_source_file_property(in_var a.txt TARGET_DIRECTORY non_existing_dir PROPERTY COMPILE_DEFINITIONS)
diff --git a/Tests/RunCMake/install/RunCMakeTest.cmake b/Tests/RunCMake/install/RunCMakeTest.cmake
index 70570b7..bd0bbe3 100644
--- a/Tests/RunCMake/install/RunCMakeTest.cmake
+++ b/Tests/RunCMake/install/RunCMakeTest.cmake
@@ -188,6 +188,7 @@ else()
endif()
set(run_install_test_components 1)
+run_install_test(file-GET_RUNTIME_DEPENDENCIES-variable-propagation)
run_install_test(FILES-EXCLUDE_FROM_ALL)
run_install_test(TARGETS-EXCLUDE_FROM_ALL)
run_install_test(TARGETS-NAMELINK_COMPONENT)
diff --git a/Tests/RunCMake/install/file-GET_RUNTIME_DEPENDENCIES-variable-propagation-all-result.txt b/Tests/RunCMake/install/file-GET_RUNTIME_DEPENDENCIES-variable-propagation-all-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/install/file-GET_RUNTIME_DEPENDENCIES-variable-propagation-all-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/install/file-GET_RUNTIME_DEPENDENCIES-variable-propagation-all-stderr.txt b/Tests/RunCMake/install/file-GET_RUNTIME_DEPENDENCIES-variable-propagation-all-stderr.txt
new file mode 100644
index 0000000..591a5e7
--- /dev/null
+++ b/Tests/RunCMake/install/file-GET_RUNTIME_DEPENDENCIES-variable-propagation-all-stderr.txt
@@ -0,0 +1,6 @@
+^CMake Error at cmake_install\.cmake:[0-9]+ \(message\):
+.*
+.*CMAKE_GET_RUNTIME_DEPENDENCIES_PLATFORM: custom-platform.*
+.*CMAKE_GET_RUNTIME_DEPENDENCIES_TOOL: custom-platform-objdump.*
+.*CMAKE_GET_RUNTIME_DEPENDENCIES_COMMAND: path/to/custom-objdump.*
+.*CMAKE_OBJDUMP: custom-objdump.*
diff --git a/Tests/RunCMake/install/file-GET_RUNTIME_DEPENDENCIES-variable-propagation-dev-result.txt b/Tests/RunCMake/install/file-GET_RUNTIME_DEPENDENCIES-variable-propagation-dev-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/install/file-GET_RUNTIME_DEPENDENCIES-variable-propagation-dev-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/install/file-GET_RUNTIME_DEPENDENCIES-variable-propagation-dev-stderr.txt b/Tests/RunCMake/install/file-GET_RUNTIME_DEPENDENCIES-variable-propagation-dev-stderr.txt
new file mode 100644
index 0000000..591a5e7
--- /dev/null
+++ b/Tests/RunCMake/install/file-GET_RUNTIME_DEPENDENCIES-variable-propagation-dev-stderr.txt
@@ -0,0 +1,6 @@
+^CMake Error at cmake_install\.cmake:[0-9]+ \(message\):
+.*
+.*CMAKE_GET_RUNTIME_DEPENDENCIES_PLATFORM: custom-platform.*
+.*CMAKE_GET_RUNTIME_DEPENDENCIES_TOOL: custom-platform-objdump.*
+.*CMAKE_GET_RUNTIME_DEPENDENCIES_COMMAND: path/to/custom-objdump.*
+.*CMAKE_OBJDUMP: custom-objdump.*
diff --git a/Tests/RunCMake/install/file-GET_RUNTIME_DEPENDENCIES-variable-propagation.cmake b/Tests/RunCMake/install/file-GET_RUNTIME_DEPENDENCIES-variable-propagation.cmake
new file mode 100644
index 0000000..07bbc5e
--- /dev/null
+++ b/Tests/RunCMake/install/file-GET_RUNTIME_DEPENDENCIES-variable-propagation.cmake
@@ -0,0 +1,17 @@
+enable_language(C)
+
+set(CMAKE_GET_RUNTIME_DEPENDENCIES_PLATFORM "custom-platform")
+set(CMAKE_GET_RUNTIME_DEPENDENCIES_TOOL "custom-platform-objdump")
+set(CMAKE_GET_RUNTIME_DEPENDENCIES_COMMAND "path/to/custom-objdump")
+set(CMAKE_OBJDUMP "custom-objdump")
+
+install(CODE [[
+message(FATAL_ERROR "
+ CMAKE_GET_RUNTIME_DEPENDENCIES_PLATFORM: ${CMAKE_GET_RUNTIME_DEPENDENCIES_PLATFORM}
+ CMAKE_GET_RUNTIME_DEPENDENCIES_TOOL: ${CMAKE_GET_RUNTIME_DEPENDENCIES_TOOL}
+ CMAKE_GET_RUNTIME_DEPENDENCIES_COMMAND: ${CMAKE_GET_RUNTIME_DEPENDENCIES_COMMAND}
+ CMAKE_OBJDUMP: ${CMAKE_OBJDUMP}
+")
+]]
+COMPONENT dev
+)
diff --git a/Tests/RunCMake/pseudo_cppcheck.c b/Tests/RunCMake/pseudo_cppcheck.c
index 5b1531b..e80620c 100644
--- a/Tests/RunCMake/pseudo_cppcheck.c
+++ b/Tests/RunCMake/pseudo_cppcheck.c
@@ -11,7 +11,8 @@ int main(int argc, char* argv[])
fprintf(stdout, "stdout from bad command line arg '-bad'\n");
fprintf(stderr, "stderr from bad command line arg '-bad'\n");
return 1;
- } else if (strcmp(argv[i], "-error") == 0) {
+ }
+ if (strcmp(argv[i], "-error") == 0) {
// The real cppcheck allows to set the exitcode with --error-exitcode
result = 5;
}
diff --git a/Tests/RunCMake/set_property/RunCMakeTest.cmake b/Tests/RunCMake/set_property/RunCMakeTest.cmake
index 8d4614c..692c6b9 100644
--- a/Tests/RunCMake/set_property/RunCMakeTest.cmake
+++ b/Tests/RunCMake/set_property/RunCMakeTest.cmake
@@ -9,6 +9,7 @@ run_cmake(LINK_OPTIONS)
run_cmake(LINK_DIRECTORIES)
run_cmake(LINK_LIBRARIES)
run_cmake(SOURCES)
+run_cmake(SOURCE_FILE)
run_cmake(TYPE)
run_cmake(USER_PROP)
run_cmake(USER_PROP_INHERITED)
diff --git a/Tests/RunCMake/set_property/SOURCE_FILE-result.txt b/Tests/RunCMake/set_property/SOURCE_FILE-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/set_property/SOURCE_FILE-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/set_property/SOURCE_FILE-stderr.txt b/Tests/RunCMake/set_property/SOURCE_FILE-stderr.txt
new file mode 100644
index 0000000..2e0b238
--- /dev/null
+++ b/Tests/RunCMake/set_property/SOURCE_FILE-stderr.txt
@@ -0,0 +1,22 @@
+^CMake Error at SOURCE_FILE.cmake:1 \(set_property\):
+ set_property called with incorrect number of arguments no value provided to
+ the DIRECTORY option
+Call Stack \(most recent call first\):
+ CMakeLists\.txt:[0-9]+ \(include\)
++
+CMake Error at SOURCE_FILE.cmake:2 \(set_property\):
+ set_property given non-existent DIRECTORY non_existing_dir
+Call Stack \(most recent call first\):
+ CMakeLists\.txt:[0-9]+ \(include\)
++
+CMake Error at SOURCE_FILE.cmake:3 \(set_property\):
+ set_property called with incorrect number of arguments no value provided to
+ the TARGET_DIRECTORY option
+Call Stack \(most recent call first\):
+ CMakeLists\.txt:[0-9]+ \(include\)
++
+CMake Error at SOURCE_FILE.cmake:4 \(set_property\):
+ set_property given non-existent target for DIRECTORY_TARGET
+ non_existing_target
+Call Stack \(most recent call first\):
+ CMakeLists\.txt:[0-9]+ \(include\)$
diff --git a/Tests/RunCMake/set_property/SOURCE_FILE.cmake b/Tests/RunCMake/set_property/SOURCE_FILE.cmake
new file mode 100644
index 0000000..b1d78bd
--- /dev/null
+++ b/Tests/RunCMake/set_property/SOURCE_FILE.cmake
@@ -0,0 +1,4 @@
+set_property(SOURCE a.txt DIRECTORY PROPERTY COMPILE_DEFINITIONS "def")
+set_property(SOURCE a.txt DIRECTORY non_existing_dir PROPERTY COMPILE_DEFINITIONS "def")
+set_property(SOURCE a.txt TARGET_DIRECTORY PROPERTY COMPILE_DEFINITIONS "def")
+set_property(SOURCE a.txt TARGET_DIRECTORY non_existing_target PROPERTY COMPILE_DEFINITIONS "def")
diff --git a/Tests/RunCMake/string/Hex.cmake b/Tests/RunCMake/string/Hex.cmake
new file mode 100644
index 0000000..1c5aaa1
--- /dev/null
+++ b/Tests/RunCMake/string/Hex.cmake
@@ -0,0 +1,20 @@
+function(assert_strequal input actual expected)
+ if(NOT expected STREQUAL actual)
+ message(SEND_ERROR "Output did not match expected\nInput string:\n ${input}\nExpected:\n ${expected}\nActual:\n ${actual}")
+ endif()
+endfunction()
+
+set(_input1 "The quick brown fox jumps over the lazy dog.")
+string(HEX "${_input1}" _result1)
+assert_strequal("${_input1}" "${_result1}" "54686520717569636b2062726f776e20666f78206a756d7073206f76657220746865206c617a7920646f672e")
+
+set(_input2 "Hello world!")
+string(HEX "${_input2}" _result2)
+assert_strequal("${_input2}" "${_result2}" "48656c6c6f20776f726c6421")
+
+set(_input3 "Ash nazg durbatulûk\nAsh nazg gimbatul\nAsh nazg thrakatulûk\nAgh burzum-ishi krimpatul")
+string(HEX "${_input3}" _result3)
+assert_strequal("${_input3}" "${_result3}" "417368206e617a6720647572626174756cc3bb6b0a417368206e617a672067696d626174756c0a417368206e617a6720746872616b6174756cc3bb6b0a416768206275727a756d2d69736869206b72696d706174756c")
+
+string(HEX "" _result_empty)
+assert_strequal("" "${_result_empty}" "")
diff --git a/Tests/RunCMake/string/HexNotEnoughArgs-result.txt b/Tests/RunCMake/string/HexNotEnoughArgs-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/string/HexNotEnoughArgs-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/string/HexNotEnoughArgs-stderr.txt b/Tests/RunCMake/string/HexNotEnoughArgs-stderr.txt
new file mode 100644
index 0000000..444f79d
--- /dev/null
+++ b/Tests/RunCMake/string/HexNotEnoughArgs-stderr.txt
@@ -0,0 +1,4 @@
+^CMake Error at HexNotEnoughArgs\.cmake:[0-9]+ \(string\):
+ string Incorrect number of arguments
+Call Stack \(most recent call first\):
+ CMakeLists\.txt:3 \(include\)$
diff --git a/Tests/RunCMake/string/HexNotEnoughArgs.cmake b/Tests/RunCMake/string/HexNotEnoughArgs.cmake
new file mode 100644
index 0000000..7002af0
--- /dev/null
+++ b/Tests/RunCMake/string/HexNotEnoughArgs.cmake
@@ -0,0 +1 @@
+string(HEX "Hello world!")
diff --git a/Tests/RunCMake/string/HexTooManyArgs-result.txt b/Tests/RunCMake/string/HexTooManyArgs-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/string/HexTooManyArgs-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/string/HexTooManyArgs-stderr.txt b/Tests/RunCMake/string/HexTooManyArgs-stderr.txt
new file mode 100644
index 0000000..91b40ed
--- /dev/null
+++ b/Tests/RunCMake/string/HexTooManyArgs-stderr.txt
@@ -0,0 +1,4 @@
+^CMake Error at HexTooManyArgs\.cmake:[0-9]+ \(string\):
+ string Incorrect number of arguments
+Call Stack \(most recent call first\):
+ CMakeLists\.txt:3 \(include\)$
diff --git a/Tests/RunCMake/string/HexTooManyArgs.cmake b/Tests/RunCMake/string/HexTooManyArgs.cmake
new file mode 100644
index 0000000..8986cf8
--- /dev/null
+++ b/Tests/RunCMake/string/HexTooManyArgs.cmake
@@ -0,0 +1 @@
+string(HEX "Hello world!" _output bad)
diff --git a/Tests/RunCMake/string/RunCMakeTest.cmake b/Tests/RunCMake/string/RunCMakeTest.cmake
index c432b4e..bb7cb17 100644
--- a/Tests/RunCMake/string/RunCMakeTest.cmake
+++ b/Tests/RunCMake/string/RunCMakeTest.cmake
@@ -37,3 +37,7 @@ run_cmake(UTF-32LE)
run_cmake(Repeat)
run_cmake(RepeatNoArgs)
run_cmake(RepeatNegativeCount)
+
+run_cmake(Hex)
+run_cmake(HexTooManyArgs)
+run_cmake(HexNotEnoughArgs)
diff --git a/Tests/RunCMake/target_link_directories/CMP0099.cmake b/Tests/RunCMake/target_link_directories/CMP0099.cmake
index a2be279..aff1e33 100644
--- a/Tests/RunCMake/target_link_directories/CMP0099.cmake
+++ b/Tests/RunCMake/target_link_directories/CMP0099.cmake
@@ -5,7 +5,7 @@ set(CMAKE_VERBOSE_MAKEFILE TRUE)
set(CMAKE_C_USE_RESPONSE_FILE_FOR_LIBRARIES FALSE)
add_library(LinkDirs_interface INTERFACE)
-target_link_directories (LinkDirs_interface INTERFACE "/DIR_INTERFACE"})
+target_link_directories (LinkDirs_interface INTERFACE "/DIR_INTERFACE")
add_library(LinkDirs_static STATIC lib.c)
target_link_libraries (LinkDirs_static PRIVATE LinkDirs_interface)
diff --git a/Tests/RunCMake/target_link_directories/RunCMakeTest.cmake b/Tests/RunCMake/target_link_directories/RunCMakeTest.cmake
index a74ee25..699e871 100644
--- a/Tests/RunCMake/target_link_directories/RunCMakeTest.cmake
+++ b/Tests/RunCMake/target_link_directories/RunCMakeTest.cmake
@@ -21,10 +21,21 @@ if(RunCMake_GENERATOR MATCHES "(Ninja|Makefiles)" AND
set(VERBOSE -- -v)
endif()
+ run_cmake(genex_LINK_LANGUAGE)
+ run_cmake_target(genex_LINK_LANGUAGE interface LinkDirs_exe_interface --config Release ${VERBOSE})
+ run_cmake_target(genex_LINK_LANGUAGE basic LinkDirs_exe_c --config Release ${VERBOSE})
+ run_cmake_target(genex_LINK_LANGUAGE LINKER_LANGUAGE LinkDirs_exe_cxx --config Release ${VERBOSE})
+
+ run_cmake(genex_LINK_LANG_AND_ID)
+
+ run_cmake_target(genex_LINK_LANG_AND_ID interface LinkDirs_exe_interface --config Release ${VERBOSE})
+ run_cmake_target(genex_LINK_LANG_AND_ID basic LinkDirs_exe_c --config Release ${VERBOSE})
+ run_cmake_target(genex_LINK_LANG_AND_ID LINKER_LANGUAGE LinkDirs_exe_cxx --config Release ${VERBOSE})
+
+
run_cmake(CMP0099-NEW)
run_cmake_target(CMP0099-NEW basic LinkDirs_exe ${VERBOSE})
-
run_cmake(CMP0099-OLD)
run_cmake_target(CMP0099-OLD basic LinkDirs_exe ${VERBOSE})
diff --git a/Tests/RunCMake/target_link_directories/genex_LINK_LANGUAGE-LINKER_LANGUAGE-check.cmake b/Tests/RunCMake/target_link_directories/genex_LINK_LANGUAGE-LINKER_LANGUAGE-check.cmake
new file mode 100644
index 0000000..aa39810
--- /dev/null
+++ b/Tests/RunCMake/target_link_directories/genex_LINK_LANGUAGE-LINKER_LANGUAGE-check.cmake
@@ -0,0 +1,5 @@
+
+set (VALID_LANG CXX)
+set (INVALID_LANG C)
+
+include ("${CMAKE_CURRENT_LIST_DIR}/genex_LINK_LANGUAGE-validation.cmake")
diff --git a/Tests/RunCMake/target_link_directories/genex_LINK_LANGUAGE-LINKER_LANGUAGE-result.txt b/Tests/RunCMake/target_link_directories/genex_LINK_LANGUAGE-LINKER_LANGUAGE-result.txt
new file mode 100644
index 0000000..8d98f9d
--- /dev/null
+++ b/Tests/RunCMake/target_link_directories/genex_LINK_LANGUAGE-LINKER_LANGUAGE-result.txt
@@ -0,0 +1 @@
+.*
diff --git a/Tests/RunCMake/target_link_directories/genex_LINK_LANGUAGE-basic-check.cmake b/Tests/RunCMake/target_link_directories/genex_LINK_LANGUAGE-basic-check.cmake
new file mode 100644
index 0000000..71f641d
--- /dev/null
+++ b/Tests/RunCMake/target_link_directories/genex_LINK_LANGUAGE-basic-check.cmake
@@ -0,0 +1,2 @@
+
+include ("${CMAKE_CURRENT_LIST_DIR}/genex_LINK_LANGUAGE-validation.cmake")
diff --git a/Tests/RunCMake/target_link_directories/genex_LINK_LANGUAGE-basic-result.txt b/Tests/RunCMake/target_link_directories/genex_LINK_LANGUAGE-basic-result.txt
new file mode 100644
index 0000000..8d98f9d
--- /dev/null
+++ b/Tests/RunCMake/target_link_directories/genex_LINK_LANGUAGE-basic-result.txt
@@ -0,0 +1 @@
+.*
diff --git a/Tests/RunCMake/target_link_directories/genex_LINK_LANGUAGE-interface-check.cmake b/Tests/RunCMake/target_link_directories/genex_LINK_LANGUAGE-interface-check.cmake
new file mode 100644
index 0000000..8313de6
--- /dev/null
+++ b/Tests/RunCMake/target_link_directories/genex_LINK_LANGUAGE-interface-check.cmake
@@ -0,0 +1,4 @@
+
+set (TYPE INTERFACE)
+
+include ("${CMAKE_CURRENT_LIST_DIR}/genex_LINK_LANGUAGE-validation.cmake")
diff --git a/Tests/RunCMake/target_link_directories/genex_LINK_LANGUAGE-interface-result.txt b/Tests/RunCMake/target_link_directories/genex_LINK_LANGUAGE-interface-result.txt
new file mode 100644
index 0000000..8d98f9d
--- /dev/null
+++ b/Tests/RunCMake/target_link_directories/genex_LINK_LANGUAGE-interface-result.txt
@@ -0,0 +1 @@
+.*
diff --git a/Tests/RunCMake/target_link_directories/genex_LINK_LANGUAGE-validation.cmake b/Tests/RunCMake/target_link_directories/genex_LINK_LANGUAGE-validation.cmake
new file mode 100644
index 0000000..298564e
--- /dev/null
+++ b/Tests/RunCMake/target_link_directories/genex_LINK_LANGUAGE-validation.cmake
@@ -0,0 +1,20 @@
+
+if (NOT VALID_LANG)
+ set (VALID_LANG C)
+endif()
+if (NOT INVALID_LANG)
+ set (INVALID_LANG CXX)
+endif()
+if (NOT TYPE)
+ set (TYPE EXE)
+endif()
+
+if (NOT actual_stdout MATCHES "DIR_${VALID_LANG}_${TYPE}")
+ set (RunCMake_TEST_FAILED "Not found expected 'DIR_${VALID_LANG}_${TYPE}'.")
+endif()
+if (actual_stdout MATCHES "DIR_${INVALID_LANG}_${TYPE}")
+ if (RunCMake_TEST_FAILED)
+ string (APPEND RunCMake_TEST_FAILED "\n")
+ endif()
+ string (APPEND RunCMake_TEST_FAILED "Found unexpected 'DIR_${INVALID_LANG}_${TYPE}'.")
+endif()
diff --git a/Tests/RunCMake/target_link_directories/genex_LINK_LANGUAGE.cmake b/Tests/RunCMake/target_link_directories/genex_LINK_LANGUAGE.cmake
new file mode 100644
index 0000000..1f266b1
--- /dev/null
+++ b/Tests/RunCMake/target_link_directories/genex_LINK_LANGUAGE.cmake
@@ -0,0 +1,23 @@
+
+enable_language(C)
+enable_language(CXX)
+
+set(CMAKE_VERBOSE_MAKEFILE TRUE)
+set(CMAKE_C_USE_RESPONSE_FILE_FOR_LIBRARIES FALSE)
+set(CMAKE_CXX_USE_RESPONSE_FILE_FOR_LIBRARIES FALSE)
+
+add_library(LinkDirs_interface INTERFACE)
+target_link_directories (LinkDirs_interface INTERFACE "$<$<LINK_LANGUAGE:C>:/DIR_C_INTERFACE>"
+ "$<$<LINK_LANGUAGE:CXX>:/DIR_CXX_INTERFACE>")
+
+add_executable(LinkDirs_exe_interface exe.c)
+target_link_libraries (LinkDirs_exe_interface PRIVATE LinkDirs_interface)
+
+add_executable(LinkDirs_exe_c exe.c)
+target_link_directories (LinkDirs_exe_c PRIVATE "$<$<LINK_LANGUAGE:C>:/DIR_C_EXE>"
+ "$<$<LINK_LANGUAGE:CXX>:/DIR_CXX_EXE>")
+
+add_executable(LinkDirs_exe_cxx exe.c)
+target_link_directories (LinkDirs_exe_cxx PRIVATE "$<$<LINK_LANGUAGE:C>:/DIR_C_EXE>"
+ "$<$<LINK_LANGUAGE:CXX>:/DIR_CXX_EXE>")
+set_property (TARGET LinkDirs_exe_cxx PROPERTY LINKER_LANGUAGE CXX)
diff --git a/Tests/RunCMake/target_link_directories/genex_LINK_LANG_AND_ID-LINKER_LANGUAGE-check.cmake b/Tests/RunCMake/target_link_directories/genex_LINK_LANG_AND_ID-LINKER_LANGUAGE-check.cmake
new file mode 100644
index 0000000..ed4f851
--- /dev/null
+++ b/Tests/RunCMake/target_link_directories/genex_LINK_LANG_AND_ID-LINKER_LANGUAGE-check.cmake
@@ -0,0 +1,5 @@
+
+set (VALID_LANG CXX)
+set (INVALID_LANG C)
+
+include ("${CMAKE_CURRENT_LIST_DIR}/genex_LINK_LANG_AND_ID-validation.cmake")
diff --git a/Tests/RunCMake/target_link_directories/genex_LINK_LANG_AND_ID-LINKER_LANGUAGE-result.txt b/Tests/RunCMake/target_link_directories/genex_LINK_LANG_AND_ID-LINKER_LANGUAGE-result.txt
new file mode 100644
index 0000000..8d98f9d
--- /dev/null
+++ b/Tests/RunCMake/target_link_directories/genex_LINK_LANG_AND_ID-LINKER_LANGUAGE-result.txt
@@ -0,0 +1 @@
+.*
diff --git a/Tests/RunCMake/target_link_directories/genex_LINK_LANG_AND_ID-basic-check.cmake b/Tests/RunCMake/target_link_directories/genex_LINK_LANG_AND_ID-basic-check.cmake
new file mode 100644
index 0000000..6bddee1
--- /dev/null
+++ b/Tests/RunCMake/target_link_directories/genex_LINK_LANG_AND_ID-basic-check.cmake
@@ -0,0 +1,2 @@
+
+include ("${CMAKE_CURRENT_LIST_DIR}/genex_LINK_LANG_AND_ID-validation.cmake")
diff --git a/Tests/RunCMake/target_link_directories/genex_LINK_LANG_AND_ID-basic-result.txt b/Tests/RunCMake/target_link_directories/genex_LINK_LANG_AND_ID-basic-result.txt
new file mode 100644
index 0000000..8d98f9d
--- /dev/null
+++ b/Tests/RunCMake/target_link_directories/genex_LINK_LANG_AND_ID-basic-result.txt
@@ -0,0 +1 @@
+.*
diff --git a/Tests/RunCMake/target_link_directories/genex_LINK_LANG_AND_ID-interface-check.cmake b/Tests/RunCMake/target_link_directories/genex_LINK_LANG_AND_ID-interface-check.cmake
new file mode 100644
index 0000000..a328738
--- /dev/null
+++ b/Tests/RunCMake/target_link_directories/genex_LINK_LANG_AND_ID-interface-check.cmake
@@ -0,0 +1,4 @@
+
+set (TYPE INTERFACE)
+
+include ("${CMAKE_CURRENT_LIST_DIR}/genex_LINK_LANG_AND_ID-validation.cmake")
diff --git a/Tests/RunCMake/target_link_directories/genex_LINK_LANG_AND_ID-interface-result.txt b/Tests/RunCMake/target_link_directories/genex_LINK_LANG_AND_ID-interface-result.txt
new file mode 100644
index 0000000..8d98f9d
--- /dev/null
+++ b/Tests/RunCMake/target_link_directories/genex_LINK_LANG_AND_ID-interface-result.txt
@@ -0,0 +1 @@
+.*
diff --git a/Tests/RunCMake/target_link_directories/genex_LINK_LANG_AND_ID-validation.cmake b/Tests/RunCMake/target_link_directories/genex_LINK_LANG_AND_ID-validation.cmake
new file mode 100644
index 0000000..9872953
--- /dev/null
+++ b/Tests/RunCMake/target_link_directories/genex_LINK_LANG_AND_ID-validation.cmake
@@ -0,0 +1,26 @@
+
+if (NOT VALID_LANG)
+ set (VALID_LANG C)
+endif()
+if (NOT INVALID_LANG)
+ set (INVALID_LANG CXX)
+endif()
+if (NOT TYPE)
+ set (TYPE EXE)
+endif()
+
+if (NOT actual_stdout MATCHES "DIR_${VALID_LANG}_${TYPE}")
+ set (RunCMake_TEST_FAILED "Not found expected 'DIR_${VALID_LANG}_${TYPE}'.\n")
+endif()
+if (actual_stdout MATCHES "DIR_${INVALID_LANG}_${TYPE}")
+ if (RunCMake_TEST_FAILED)
+ string (APPEND RunCMake_TEST_FAILED "\n")
+ endif()
+ string (APPEND RunCMake_TEST_FAILED "Found unexpected 'DIR_${INVALID_LANG}_${TYPE} '.")
+endif()
+if (actual_stdout MATCHES "DIR_(${VALID_LANG}|${INVALID_LANG})_BADID_${TYPE}")
+ if (RunCMake_TEST_FAILED)
+ string (APPEND RunCMake_TEST_FAILED "\n")
+ endif()
+ string (APPEND RunCMake_TEST_FAILED "Found unexpected 'DIR_(${VALID_LANG}|${INVALID_LANG})_BADID_${TYPE}'.")
+endif()
diff --git a/Tests/RunCMake/target_link_directories/genex_LINK_LANG_AND_ID.cmake b/Tests/RunCMake/target_link_directories/genex_LINK_LANG_AND_ID.cmake
new file mode 100644
index 0000000..eb3b342
--- /dev/null
+++ b/Tests/RunCMake/target_link_directories/genex_LINK_LANG_AND_ID.cmake
@@ -0,0 +1,29 @@
+
+enable_language(C)
+enable_language(CXX)
+
+set(CMAKE_VERBOSE_MAKEFILE TRUE)
+set(CMAKE_C_USE_RESPONSE_FILE_FOR_LIBRARIES FALSE)
+set(CMAKE_CXX_USE_RESPONSE_FILE_FOR_LIBRARIES FALSE)
+
+add_library(LinkDirs_interface INTERFACE)
+target_link_directories (LinkDirs_interface INTERFACE $<$<LINK_LANG_AND_ID:C,${CMAKE_C_COMPILER_ID}>:/DIR_C_INTERFACE>
+ $<$<LINK_LANG_AND_ID:CXX,${CMAKE_CXX_COMPILER_ID}>:/DIR_CXX_INTERFACE>
+ $<$<LINK_LANG_AND_ID:C,BADID>:/DIR_C_BADID_INTERFACE>
+ $<$<LINK_LANG_AND_ID:CXX,BADID>:/DIR_CXX_BADID_INTERFACE>)
+
+add_executable(LinkDirs_exe_interface exe.c)
+target_link_libraries (LinkDirs_exe_interface PRIVATE LinkDirs_interface)
+
+add_executable(LinkDirs_exe_c exe.c)
+target_link_options (LinkDirs_exe_c PRIVATE $<$<LINK_LANG_AND_ID:C,${CMAKE_C_COMPILER_ID}>:/DIR_C_EXE>
+ $<$<LINK_LANG_AND_ID:CXX,${CMAKE_CXX_COMPILER_ID}>:/DIR_CXX_EXE>
+ $<$<LINK_LANG_AND_ID:C,BADID>:/DIR_C_BADID_EXE>
+ $<$<LINK_LANG_AND_ID:CXX,BADID>:/DIR_CXX_BADID_EXE>)
+
+add_executable(LinkDirs_exe_cxx exe.c)
+target_link_directories (LinkDirs_exe_cxx PRIVATE $<$<LINK_LANG_AND_ID:C,${CMAKE_C_COMPILER_ID}>:/DIR_C_EXE>
+ $<$<LINK_LANG_AND_ID:CXX,${CMAKE_CXX_COMPILER_ID}>:/DIR_CXX_EXE>
+ $<$<LINK_LANG_AND_ID:C,BADID>:/DIR_C_BADID_EXE>
+ $<$<LINK_LANG_AND_ID:CXX,BADID>:/DIR_CXX_BADID_EXE>)
+set_property (TARGET LinkDirs_exe_cxx PROPERTY LINKER_LANGUAGE CXX)
diff --git a/Tests/RunCMake/target_link_libraries/RunCMakeTest.cmake b/Tests/RunCMake/target_link_libraries/RunCMakeTest.cmake
index 8eed986..fb223ab 100644
--- a/Tests/RunCMake/target_link_libraries/RunCMakeTest.cmake
+++ b/Tests/RunCMake/target_link_libraries/RunCMakeTest.cmake
@@ -28,3 +28,57 @@ run_cmake(StaticPrivateDepNotExported)
run_cmake(StaticPrivateDepNotTarget)
run_cmake(UNKNOWN-IMPORTED-GLOBAL)
run_cmake(empty_keyword_args)
+run_cmake(genex_LINK_LANGUAGE-bad-usage)
+
+if (RunCMake_GENERATOR MATCHES "Makefiles|Ninja|Visual Studio|Xcode|Watcom WMake")
+
+ run_cmake(genex_LINK_LANGUAGE-bad-mix-lang)
+ run_cmake(genex_LINK_LANG_AND_ID-bad-mix-lang)
+
+ macro(run_cmake_target test subtest target)
+ set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${test}-build)
+ set(RunCMake_TEST_NO_CLEAN 1)
+ run_cmake_command(${test}-${subtest} ${CMAKE_COMMAND} --build . --target ${target} ${ARGN})
+
+ unset(RunCMake_TEST_BINARY_DIR)
+ unset(RunCMake_TEST_NO_CLEAN)
+ endmacro()
+
+ set(RunCMake_TEST_OUTPUT_MERGE TRUE)
+ if (NOT RunCMake_GENERATOR_IS_MULTI_CONFIG)
+ set(RunCMake_TEST_OPTIONS -DCMAKE_BUILD_TYPE=Release)
+ endif()
+
+ run_cmake(genex_LINK_LANGUAGE)
+
+ run_cmake_target(genex_LINK_LANGUAGE lib LinkLibraries_lib --config Release)
+ run_cmake_target(genex_LINK_LANGUAGE lib2 LinkLibraries_lib2 --config Release)
+ run_cmake_target(genex_LINK_LANGUAGE lib3 LinkLibraries_lib3 --config Release)
+ run_cmake_target(genex_LINK_LANGUAGE exe LinkLibraries_exe --config Release)
+ run_cmake_target(genex_LINK_LANGUAGE C_import LinkLibraries_C_import --config Release)
+ run_cmake_target(genex_LINK_LANGUAGE CXX_import LinkLibraries_CXX_import --config Release)
+ run_cmake_target(genex_LINK_LANGUAGE C_interface LinkLibraries_C_interface --config Release)
+ run_cmake_target(genex_LINK_LANGUAGE CXX_interface LinkLibraries_CXX_interface --config Release)
+ run_cmake_target(genex_LINK_LANGUAGE C_interface2 LinkLibraries_C_interface2 --config Release)
+ run_cmake_target(genex_LINK_LANGUAGE CXX_interface2 LinkLibraries_CXX_interface2 --config Release)
+ run_cmake_target(genex_LINK_LANGUAGE C_static LinkLibraries_C_static --config Release)
+ run_cmake_target(genex_LINK_LANGUAGE CXX_static LinkLibraries_CXX_static --config Release)
+
+ run_cmake(genex_LINK_LANG_AND_ID)
+
+ run_cmake_target(genex_LINK_LANG_AND_ID lib LinkLibraries_lib --config Release)
+ run_cmake_target(genex_LINK_LANG_AND_ID lib2 LinkLibraries_lib2 --config Release)
+ run_cmake_target(genex_LINK_LANG_AND_ID lib3 LinkLibraries_lib3 --config Release)
+ run_cmake_target(genex_LINK_LANG_AND_ID exe LinkLibraries_exe --config Release)
+ run_cmake_target(genex_LINK_LANG_AND_ID C_import LinkLibraries_C_import --config Release)
+ run_cmake_target(genex_LINK_LANG_AND_ID CXX_import LinkLibraries_CXX_import --config Release)
+ run_cmake_target(genex_LINK_LANG_AND_ID C_interface LinkLibraries_C_interface --config Release)
+ run_cmake_target(genex_LINK_LANG_AND_ID CXX_interface LinkLibraries_CXX_interface --config Release)
+ run_cmake_target(genex_LINK_LANG_AND_ID C_interface2 LinkLibraries_C_interface2 --config Release)
+ run_cmake_target(genex_LINK_LANG_AND_ID CXX_interface2 LinkLibraries_CXX_interface2 --config Release)
+ run_cmake_target(genex_LINK_LANG_AND_ID CXX_static LinkLibraries_CXX_static --config Release)
+
+ unset(RunCMake_TEST_OPTIONS)
+ unset(RunCMake_TEST_OUTPUT_MERGE)
+
+endif()
diff --git a/Tests/RunCMake/target_link_libraries/func.c b/Tests/RunCMake/target_link_libraries/func.c
new file mode 100644
index 0000000..415a9bf
--- /dev/null
+++ b/Tests/RunCMake/target_link_libraries/func.c
@@ -0,0 +1,7 @@
+
+#if defined(_WIN32)
+__declspec(dllexport)
+#endif
+ void func_c()
+{
+}
diff --git a/Tests/RunCMake/target_link_libraries/func.cxx b/Tests/RunCMake/target_link_libraries/func.cxx
new file mode 100644
index 0000000..a12caca
--- /dev/null
+++ b/Tests/RunCMake/target_link_libraries/func.cxx
@@ -0,0 +1,7 @@
+
+#if defined(_WIN32)
+__declspec(dllexport)
+#endif
+ void func_cxx()
+{
+}
diff --git a/Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-mix-lang-result.txt b/Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-mix-lang-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-mix-lang-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-mix-lang-stderr.txt b/Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-mix-lang-stderr.txt
new file mode 100644
index 0000000..2ecdc0c
--- /dev/null
+++ b/Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-mix-lang-stderr.txt
@@ -0,0 +1,2 @@
+CMake Error: Evaluation of \$<LINK_LANGUAGE:...> or \$<LINK_LAND_AND_ID:...> changes
+the linker language for target "LinkLibraries_bad_mix_languages" \(from 'C' to 'CXX'\) which is invalid.
diff --git a/Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-mix-lang.cmake b/Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-mix-lang.cmake
new file mode 100644
index 0000000..e8efa75
--- /dev/null
+++ b/Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-mix-lang.cmake
@@ -0,0 +1,8 @@
+
+enable_language(C)
+enable_language(CXX)
+
+add_library(static_CXX STATIC func.cxx)
+
+add_executable(LinkLibraries_bad_mix_languages main.c)
+target_link_libraries (LinkLibraries_bad_mix_languages PRIVATE $<$<LINK_LANGUAGE:C>:static_CXX>)
diff --git a/Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-usage-result.txt b/Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-usage-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-usage-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-usage-stderr.txt b/Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-usage-stderr.txt
new file mode 100644
index 0000000..469f1fe
--- /dev/null
+++ b/Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-usage-stderr.txt
@@ -0,0 +1,8 @@
+CMake Error at genex_LINK_LANGUAGE-bad-usage.cmake:4 \(target_link_libraries\):
+ Error evaluating generator expression:
+
+ \$<LINK_LANGUAGE>
+
+ \$<LINK_LANGUAGE> is not supported in link libraries expression.
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-usage.cmake b/Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-usage.cmake
new file mode 100644
index 0000000..81cfb0c
--- /dev/null
+++ b/Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-usage.cmake
@@ -0,0 +1,4 @@
+enable_language(C)
+
+add_library(simple SHARED empty.c)
+target_link_libraries(simple PRIVATE lib$<LINK_LANGUAGE>)
diff --git a/Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE.cmake b/Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE.cmake
new file mode 100644
index 0000000..f3fe955
--- /dev/null
+++ b/Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE.cmake
@@ -0,0 +1,72 @@
+
+cmake_minimum_required(VERSION 3.16...3.17)
+
+enable_language(C)
+enable_language(CXX)
+
+add_library(shared_C SHARED func.c)
+add_library(shared_CXX SHARED func.cxx)
+
+
+add_library(static1_C STATIC empty.c)
+target_link_libraries (static1_C INTERFACE $<$<LINK_LANGUAGE:C>:shared_C>)
+
+add_library(static2_C STATIC empty.c)
+target_link_libraries (static2_C PRIVATE $<$<LINK_LANGUAGE:C>:shared_C>)
+
+
+set (binary_dir "${CMAKE_BINARY_DIR}")
+get_property (is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
+if (is_multi_config)
+ string (APPEND binary_dir "/Release")
+endif()
+add_library(import STATIC IMPORTED)
+set_property(TARGET import PROPERTY IMPORTED_LOCATION "${binary_dir}/${CMAKE_STATIC_LIBRARY_PREFIX}static1_C${CMAKE_STATIC_LIBRARY_SUFFIX}")
+target_link_libraries (import INTERFACE $<$<LINK_LANGUAGE:C>:shared_C>)
+target_link_libraries (import INTERFACE $<$<LINK_LANGUAGE:CXX>:shared_CXX>)
+
+
+add_library(interface INTERFACE)
+target_link_libraries (interface INTERFACE $<$<LINK_LANGUAGE:C>:shared_C>
+ $<$<LINK_LANGUAGE:CXX>:shared_CXX>)
+
+
+add_library(interface2 INTERFACE)
+target_link_libraries (interface2 INTERFACE import)
+
+
+add_library(static3 STATIC empty.c)
+target_link_libraries (static3 PRIVATE interface)
+
+
+add_library(LinkLibraries_lib SHARED lib.c)
+target_link_libraries (LinkLibraries_lib PRIVATE $<$<LINK_LANGUAGE:C>:shared_C>)
+
+add_library(LinkLibraries_lib2 SHARED lib.c)
+target_link_libraries (LinkLibraries_lib2 PRIVATE $<$<LINK_LANGUAGE:C>:static1_C>)
+
+add_library(LinkLibraries_lib3 SHARED lib.c)
+target_link_libraries (LinkLibraries_lib3 PRIVATE $<$<LINK_LANGUAGE:C>:static2_C>)
+
+add_executable(LinkLibraries_exe main.c)
+target_link_libraries (LinkLibraries_exe PRIVATE $<$<LINK_LANGUAGE:C>:shared_C>)
+
+add_executable(LinkLibraries_C_import main.c)
+target_link_libraries (LinkLibraries_C_import PRIVATE import)
+add_executable(LinkLibraries_CXX_import main.cxx)
+target_link_libraries (LinkLibraries_CXX_import PRIVATE import)
+
+add_executable(LinkLibraries_C_interface main.c)
+target_link_libraries (LinkLibraries_C_interface PRIVATE interface)
+add_executable(LinkLibraries_CXX_interface main.cxx)
+target_link_libraries (LinkLibraries_CXX_interface PRIVATE interface)
+
+add_executable(LinkLibraries_C_interface2 main.c)
+target_link_libraries (LinkLibraries_C_interface2 PRIVATE interface2)
+add_executable(LinkLibraries_CXX_interface2 main.cxx)
+target_link_libraries (LinkLibraries_CXX_interface2 PRIVATE interface2)
+
+add_executable(LinkLibraries_C_static main.c)
+target_link_libraries (LinkLibraries_C_static PRIVATE static3)
+add_executable(LinkLibraries_CXX_static main.cxx)
+target_link_libraries (LinkLibraries_CXX_static PRIVATE static3)
diff --git a/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-bad-mix-lang-result.txt b/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-bad-mix-lang-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-bad-mix-lang-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-bad-mix-lang-stderr.txt b/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-bad-mix-lang-stderr.txt
new file mode 100644
index 0000000..2ecdc0c
--- /dev/null
+++ b/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-bad-mix-lang-stderr.txt
@@ -0,0 +1,2 @@
+CMake Error: Evaluation of \$<LINK_LANGUAGE:...> or \$<LINK_LAND_AND_ID:...> changes
+the linker language for target "LinkLibraries_bad_mix_languages" \(from 'C' to 'CXX'\) which is invalid.
diff --git a/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-bad-mix-lang.cmake b/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-bad-mix-lang.cmake
new file mode 100644
index 0000000..f80010a
--- /dev/null
+++ b/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-bad-mix-lang.cmake
@@ -0,0 +1,8 @@
+
+enable_language(C)
+enable_language(CXX)
+
+add_library(static_CXX STATIC func.cxx)
+
+add_executable(LinkLibraries_bad_mix_languages main.c)
+target_link_libraries (LinkLibraries_bad_mix_languages PRIVATE $<$<LINK_LANG_AND_ID:C,${CMAKE_C_COMPILER_ID}>:static_CXX>)
diff --git a/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-basic-result.txt b/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-basic-result.txt
new file mode 100644
index 0000000..8d98f9d
--- /dev/null
+++ b/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-basic-result.txt
@@ -0,0 +1 @@
+.*
diff --git a/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-exe_c-result.txt b/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-exe_c-result.txt
new file mode 100644
index 0000000..8d98f9d
--- /dev/null
+++ b/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-exe_c-result.txt
@@ -0,0 +1 @@
+.*
diff --git a/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-exe_cxx-result.txt b/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-exe_cxx-result.txt
new file mode 100644
index 0000000..8d98f9d
--- /dev/null
+++ b/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-exe_cxx-result.txt
@@ -0,0 +1 @@
+.*
diff --git a/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-interface-result.txt b/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-interface-result.txt
new file mode 100644
index 0000000..8d98f9d
--- /dev/null
+++ b/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-interface-result.txt
@@ -0,0 +1 @@
+.*
diff --git a/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-no_language-result.txt b/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-no_language-result.txt
new file mode 100644
index 0000000..573541a
--- /dev/null
+++ b/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-no_language-result.txt
@@ -0,0 +1 @@
+0
diff --git a/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID.cmake b/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID.cmake
new file mode 100644
index 0000000..9feccd0
--- /dev/null
+++ b/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID.cmake
@@ -0,0 +1,73 @@
+
+cmake_minimum_required(VERSION 3.16...3.17)
+
+enable_language(C)
+enable_language(CXX)
+
+
+add_library(shared_C SHARED func.c)
+add_library(shared_CXX SHARED func.cxx)
+
+
+add_library(static1_C STATIC empty.c)
+target_link_libraries (static1_C INTERFACE $<$<LINK_LANG_AND_ID:C,${CMAKE_C_COMPILER_ID}>:shared_C>)
+
+add_library(static2_C STATIC empty.c)
+target_link_libraries (static2_C PRIVATE $<$<LINK_LANG_AND_ID:C,${CMAKE_C_COMPILER_ID}>:shared_C>)
+
+
+set (binary_dir "${CMAKE_BINARY_DIR}")
+get_property (is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
+if (is_multi_config)
+ string (APPEND binary_dir "/Release")
+endif()
+add_library(import STATIC IMPORTED)
+set_property(TARGET import PROPERTY IMPORTED_LOCATION "${binary_dir}/${CMAKE_STATIC_LIBRARY_PREFIX}static1_C${CMAKE_STATIC_LIBRARY_SUFFIX}")
+target_link_libraries (import INTERFACE $<$<LINK_LANG_AND_ID:C,${CMAKE_C_COMPILER_ID}>:shared_C>)
+target_link_libraries (import INTERFACE $<$<LINK_LANG_AND_ID:CXX,${CMAKE_CXX_COMPILER_ID}>:shared_CXX>)
+
+
+add_library(interface INTERFACE)
+target_link_libraries (interface INTERFACE $<$<LINK_LANG_AND_ID:C,${CMAKE_C_COMPILER_ID}>:shared_C>
+ $<$<LINK_LANG_AND_ID:CXX,${CMAKE_CXX_COMPILER_ID}>:shared_CXX>)
+
+
+add_library(interface2 INTERFACE)
+target_link_libraries (interface2 INTERFACE import)
+
+
+add_library(static3 STATIC empty.c)
+target_link_libraries (static3 PRIVATE interface)
+
+
+add_library(LinkLibraries_lib SHARED lib.c)
+target_link_libraries (LinkLibraries_lib PRIVATE $<$<LINK_LANG_AND_ID:C,${CMAKE_C_COMPILER_ID}>:shared_C>)
+
+add_library(LinkLibraries_lib2 SHARED lib.c)
+target_link_libraries (LinkLibraries_lib2 PRIVATE $<$<LINK_LANG_AND_ID:C,${CMAKE_C_COMPILER_ID}>:static1_C>)
+
+add_library(LinkLibraries_lib3 SHARED lib.c)
+target_link_libraries (LinkLibraries_lib3 PRIVATE $<$<LINK_LANG_AND_ID:C,${CMAKE_C_COMPILER_ID}>:static2_C>)
+
+add_executable(LinkLibraries_exe main.c)
+target_link_libraries (LinkLibraries_exe PRIVATE $<$<LINK_LANG_AND_ID:C,${CMAKE_C_COMPILER_ID}>:shared_C>)
+
+add_executable(LinkLibraries_C_import main.c)
+target_link_libraries (LinkLibraries_C_import PRIVATE import)
+add_executable(LinkLibraries_CXX_import main.cxx)
+target_link_libraries (LinkLibraries_CXX_import PRIVATE import)
+
+add_executable(LinkLibraries_C_interface main.c)
+target_link_libraries (LinkLibraries_C_interface PRIVATE interface)
+add_executable(LinkLibraries_CXX_interface main.cxx)
+target_link_libraries (LinkLibraries_CXX_interface PRIVATE interface)
+
+add_executable(LinkLibraries_C_interface2 main.c)
+target_link_libraries (LinkLibraries_C_interface2 PRIVATE interface2)
+add_executable(LinkLibraries_CXX_interface2 main.cxx)
+target_link_libraries (LinkLibraries_CXX_interface2 PRIVATE interface2)
+
+add_executable(LinkLibraries_C_static main.c)
+target_link_libraries (LinkLibraries_C_static PRIVATE static3)
+add_executable(LinkLibraries_CXX_static main.cxx)
+target_link_libraries (LinkLibraries_CXX_static PRIVATE static3)
diff --git a/Tests/RunCMake/target_link_libraries/lib.c b/Tests/RunCMake/target_link_libraries/lib.c
new file mode 100644
index 0000000..b2d1b66
--- /dev/null
+++ b/Tests/RunCMake/target_link_libraries/lib.c
@@ -0,0 +1,10 @@
+
+#if defined(_WIN32)
+__declspec(dllimport)
+#endif
+ void func_c();
+
+void lib()
+{
+ func_c();
+}
diff --git a/Tests/RunCMake/target_link_libraries/main.c b/Tests/RunCMake/target_link_libraries/main.c
new file mode 100644
index 0000000..a908dea
--- /dev/null
+++ b/Tests/RunCMake/target_link_libraries/main.c
@@ -0,0 +1,12 @@
+
+#if defined(_WIN32)
+__declspec(dllimport)
+#endif
+ void func_c();
+
+int main()
+{
+ func_c();
+
+ return 0;
+}
diff --git a/Tests/RunCMake/target_link_libraries/main.cxx b/Tests/RunCMake/target_link_libraries/main.cxx
new file mode 100644
index 0000000..ffaa3b4
--- /dev/null
+++ b/Tests/RunCMake/target_link_libraries/main.cxx
@@ -0,0 +1,12 @@
+
+#if defined(_WIN32)
+__declspec(dllimport)
+#endif
+ void func_cxx();
+
+int main()
+{
+ func_cxx();
+
+ return 0;
+}
diff --git a/Tests/RunCMake/target_link_options/LinkOptionsDevice.cu b/Tests/RunCMake/target_link_options/LinkOptionsDevice.cu
new file mode 100644
index 0000000..96504e1
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/LinkOptionsDevice.cu
@@ -0,0 +1,14 @@
+#include <cuda.h>
+
+#ifdef _WIN32
+__declspec(dllexport)
+#endif
+ int simplelib()
+{
+ return 0;
+}
+
+int main(void)
+{
+ return simplelib();
+}
diff --git a/Tests/RunCMake/target_link_options/RunCMakeTest.cmake b/Tests/RunCMake/target_link_options/RunCMakeTest.cmake
index cdfdd7b..8ef13f9 100644
--- a/Tests/RunCMake/target_link_options/RunCMakeTest.cmake
+++ b/Tests/RunCMake/target_link_options/RunCMakeTest.cmake
@@ -13,8 +13,9 @@ endmacro()
if (NOT CMAKE_C_COMPILER_ID STREQUAL "Intel")
# Intel compiler does not reject bad flags or objects!
set(RunCMake_TEST_OUTPUT_MERGE TRUE)
+ set(RunCMake_TEST_OPTIONS -DCMake_TEST_CUDA=${CMake_TEST_CUDA})
if (NOT RunCMake_GENERATOR_IS_MULTI_CONFIG)
- set(RunCMake_TEST_OPTIONS -DCMAKE_BUILD_TYPE=Release)
+ list(APPEND RunCMake_TEST_OPTIONS -DCMAKE_BUILD_TYPE=Release)
endif()
run_cmake(LINK_OPTIONS)
@@ -27,6 +28,39 @@ if (NOT CMAKE_C_COMPILER_ID STREQUAL "Intel")
run_cmake_target(LINK_OPTIONS mod LinkOptions_mod --config Release)
run_cmake_target(LINK_OPTIONS exe LinkOptions_exe --config Release)
+
+ run_cmake(genex_LINK_LANGUAGE)
+
+ run_cmake_target(genex_LINK_LANGUAGE interface LinkOptions_shared_interface --config Release)
+ run_cmake_target(genex_LINK_LANGUAGE shared_c LinkOptions_shared_c --config Release)
+ run_cmake_target(genex_LINK_LANGUAGE LINKER_LANGUAGE LinkOptions_shared_cxx --config Release)
+ run_cmake_target(genex_LINK_LANGUAGE mod LinkOptions_mod --config Release)
+ run_cmake_target(genex_LINK_LANGUAGE exe LinkOptions_exe --config Release)
+
+ run_cmake(genex_LINK_LANG_AND_ID)
+
+ run_cmake_target(genex_LINK_LANG_AND_ID interface LinkOptions_shared_interface --config Release)
+ run_cmake_target(genex_LINK_LANG_AND_ID shared_c LinkOptions_shared_c --config Release)
+ run_cmake_target(genex_LINK_LANG_AND_ID LINKER_LANGUAGE LinkOptions_shared_cxx --config Release)
+ run_cmake_target(genex_LINK_LANG_AND_ID mod LinkOptions_mod --config Release)
+ run_cmake_target(genex_LINK_LANG_AND_ID exe LinkOptions_exe --config Release)
+
+ run_cmake(genex_DEVICE_LINK)
+
+ run_cmake_target(genex_DEVICE_LINK interface LinkOptions_shared_interface --config Release)
+ run_cmake_target(genex_DEVICE_LINK private LinkOptions_private --config Release)
+ if (CMake_TEST_CUDA)
+ # Separable compilation is only supported on NVCC.
+ if(NOT CMake_TEST_CUDA STREQUAL "Clang")
+ run_cmake_target(genex_DEVICE_LINK CMP0105_UNSET LinkOptions_CMP0105_UNSET --config Release)
+ run_cmake_target(genex_DEVICE_LINK CMP0105_OLD LinkOptions_CMP0105_OLD --config Release)
+ run_cmake_target(genex_DEVICE_LINK CMP0105_NEW LinkOptions_CMP0105_NEW --config Release)
+ run_cmake_target(genex_DEVICE_LINK device LinkOptions_device --config Release)
+ endif()
+
+ run_cmake_target(genex_DEVICE_LINK no_device LinkOptions_no_device --config Release)
+ endif()
+
unset(RunCMake_TEST_OPTIONS)
unset(RunCMake_TEST_OUTPUT_MERGE)
endif()
diff --git a/Tests/RunCMake/target_link_options/genex_DEVICE_LINK-CMP0105_NEW-check.cmake b/Tests/RunCMake/target_link_options/genex_DEVICE_LINK-CMP0105_NEW-check.cmake
new file mode 100644
index 0000000..20c4fab
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/genex_DEVICE_LINK-CMP0105_NEW-check.cmake
@@ -0,0 +1,4 @@
+
+if (NOT actual_stdout MATCHES "BADFLAG_DEVICE_LINK")
+ set (RunCMake_TEST_FAILED "Not found expected 'BADFLAG_DEVICE_LINK'.")
+endif()
diff --git a/Tests/RunCMake/target_link_options/genex_DEVICE_LINK-CMP0105_NEW-result.txt b/Tests/RunCMake/target_link_options/genex_DEVICE_LINK-CMP0105_NEW-result.txt
new file mode 100644
index 0000000..8d98f9d
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/genex_DEVICE_LINK-CMP0105_NEW-result.txt
@@ -0,0 +1 @@
+.*
diff --git a/Tests/RunCMake/target_link_options/genex_DEVICE_LINK-device-check.cmake b/Tests/RunCMake/target_link_options/genex_DEVICE_LINK-device-check.cmake
new file mode 100644
index 0000000..23c3b46
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/genex_DEVICE_LINK-device-check.cmake
@@ -0,0 +1,3 @@
+set (DEVICE_LINK TRUE)
+
+include ("${CMAKE_CURRENT_LIST_DIR}/genex_DEVICE_LINK-validation.cmake")
diff --git a/Tests/RunCMake/target_link_options/genex_DEVICE_LINK-device-result.txt b/Tests/RunCMake/target_link_options/genex_DEVICE_LINK-device-result.txt
new file mode 100644
index 0000000..8d98f9d
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/genex_DEVICE_LINK-device-result.txt
@@ -0,0 +1 @@
+.*
diff --git a/Tests/RunCMake/target_link_options/genex_DEVICE_LINK-interface-check.cmake b/Tests/RunCMake/target_link_options/genex_DEVICE_LINK-interface-check.cmake
new file mode 100644
index 0000000..8431e22
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/genex_DEVICE_LINK-interface-check.cmake
@@ -0,0 +1,3 @@
+set (DEVICE_LINK FALSE)
+
+include ("${CMAKE_CURRENT_LIST_DIR}/genex_DEVICE_LINK-validation.cmake")
diff --git a/Tests/RunCMake/target_link_options/genex_DEVICE_LINK-interface-result.txt b/Tests/RunCMake/target_link_options/genex_DEVICE_LINK-interface-result.txt
new file mode 100644
index 0000000..8d98f9d
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/genex_DEVICE_LINK-interface-result.txt
@@ -0,0 +1 @@
+.*
diff --git a/Tests/RunCMake/target_link_options/genex_DEVICE_LINK-no_device-check.cmake b/Tests/RunCMake/target_link_options/genex_DEVICE_LINK-no_device-check.cmake
new file mode 100644
index 0000000..8431e22
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/genex_DEVICE_LINK-no_device-check.cmake
@@ -0,0 +1,3 @@
+set (DEVICE_LINK FALSE)
+
+include ("${CMAKE_CURRENT_LIST_DIR}/genex_DEVICE_LINK-validation.cmake")
diff --git a/Tests/RunCMake/target_link_options/genex_DEVICE_LINK-no_device-result.txt b/Tests/RunCMake/target_link_options/genex_DEVICE_LINK-no_device-result.txt
new file mode 100644
index 0000000..8d98f9d
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/genex_DEVICE_LINK-no_device-result.txt
@@ -0,0 +1 @@
+.*
diff --git a/Tests/RunCMake/target_link_options/genex_DEVICE_LINK-private-check.cmake b/Tests/RunCMake/target_link_options/genex_DEVICE_LINK-private-check.cmake
new file mode 100644
index 0000000..8431e22
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/genex_DEVICE_LINK-private-check.cmake
@@ -0,0 +1,3 @@
+set (DEVICE_LINK FALSE)
+
+include ("${CMAKE_CURRENT_LIST_DIR}/genex_DEVICE_LINK-validation.cmake")
diff --git a/Tests/RunCMake/target_link_options/genex_DEVICE_LINK-private-result.txt b/Tests/RunCMake/target_link_options/genex_DEVICE_LINK-private-result.txt
new file mode 100644
index 0000000..8d98f9d
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/genex_DEVICE_LINK-private-result.txt
@@ -0,0 +1 @@
+.*
diff --git a/Tests/RunCMake/target_link_options/genex_DEVICE_LINK-validation.cmake b/Tests/RunCMake/target_link_options/genex_DEVICE_LINK-validation.cmake
new file mode 100644
index 0000000..28f5d01
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/genex_DEVICE_LINK-validation.cmake
@@ -0,0 +1,22 @@
+
+if (NOT DEFINED DEVICE_LINK)
+ set (DEVICE_LINK FALSE)
+endif()
+
+if (DEVICE_LINK)
+ set (VALID_ID DEVICE_LINK)
+ set (INVALID_ID NORMAL_LINK)
+else()
+ set (VALID_ID NORMAL_LINK)
+ set (INVALID_ID DEVICE_LINK)
+endif()
+
+if (NOT actual_stdout MATCHES "BADFLAG_${VALID_ID}")
+ set (RunCMake_TEST_FAILED "Not found expected 'BADFLAG_${VALID_ID}'.")
+endif()
+if (actual_stdout MATCHES "BADFLAG_${INVALID_ID}")
+ if (RunCMake_TEST_FAILED)
+ string (APPEND RunCMake_TEST_FAILED "\n")
+ endif()
+ string (APPEND RunCMake_TEST_FAILED "Found unexpected 'BADFLAG_${INVALID_ID}'.")
+endif()
diff --git a/Tests/RunCMake/target_link_options/genex_DEVICE_LINK.cmake b/Tests/RunCMake/target_link_options/genex_DEVICE_LINK.cmake
new file mode 100644
index 0000000..4d0c02f
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/genex_DEVICE_LINK.cmake
@@ -0,0 +1,48 @@
+
+enable_language(C)
+
+set (obj "${CMAKE_C_OUTPUT_EXTENSION}")
+if(BORLAND)
+ set(pre -)
+endif()
+
+add_library(LinkOptions_interface INTERFACE)
+target_link_options (LinkOptions_interface INTERFACE $<DEVICE_LINK:${pre}BADFLAG_DEVICE_LINK${obj}>
+ $<HOST_LINK:${pre}BADFLAG_NORMAL_LINK${obj}>)
+
+add_library(LinkOptions_shared_interface SHARED LinkOptionsLib.c)
+target_link_libraries (LinkOptions_shared_interface PRIVATE LinkOptions_interface)
+
+
+add_library(LinkOptions_private SHARED LinkOptionsLib.c)
+target_link_options (LinkOptions_private PRIVATE $<DEVICE_LINK:${pre}BADFLAG_DEVICE_LINK${obj}>
+ $<HOST_LINK:${pre}BADFLAG_NORMAL_LINK${obj}>)
+
+if (CMake_TEST_CUDA)
+ enable_language(CUDA)
+
+ add_executable(LinkOptions_CMP0105_UNSET LinkOptionsDevice.cu)
+ set_property(TARGET LinkOptions_CMP0105_UNSET PROPERTY CUDA_SEPARABLE_COMPILATION ON)
+ target_link_options(LinkOptions_CMP0105_UNSET PRIVATE $<DEVICE_LINK:${pre}BADFLAG_DEVICE_LINK${obj}>)
+
+ cmake_policy(SET CMP0105 OLD)
+
+ add_executable(LinkOptions_CMP0105_OLD LinkOptionsDevice.cu)
+ set_property(TARGET LinkOptions_CMP0105_OLD PROPERTY CUDA_SEPARABLE_COMPILATION ON)
+ target_link_options(LinkOptions_CMP0105_OLD PRIVATE $<DEVICE_LINK:${pre}BADFLAG_DEVICE_LINK${obj}>)
+
+ cmake_policy(SET CMP0105 NEW)
+
+ add_executable(LinkOptions_CMP0105_NEW LinkOptionsDevice.cu)
+ set_property(TARGET LinkOptions_CMP0105_NEW PROPERTY CUDA_SEPARABLE_COMPILATION ON)
+ target_link_options(LinkOptions_CMP0105_NEW PRIVATE $<DEVICE_LINK:${pre}BADFLAG_DEVICE_LINK${obj}>)
+
+ add_executable(LinkOptions_device LinkOptionsDevice.cu)
+ set_property(TARGET LinkOptions_device PROPERTY CUDA_SEPARABLE_COMPILATION ON)
+ target_link_options(LinkOptions_device PRIVATE $<DEVICE_LINK:${pre}BADFLAG_DEVICE_LINK${obj}>
+ $<HOST_LINK:${pre}BADFLAG_NORMAL_LINK${obj}>)
+
+ add_executable(LinkOptions_no_device LinkOptionsDevice.cu)
+ target_link_options(LinkOptions_no_device PRIVATE $<DEVICE_LINK:${pre}BADFLAG_DEVICE_LINK${obj}>
+ $<HOST_LINK:${pre}BADFLAG_NORMAL_LINK${obj}>)
+endif()
diff --git a/Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-LINKER_LANGUAGE-check.cmake b/Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-LINKER_LANGUAGE-check.cmake
new file mode 100644
index 0000000..aa39810
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-LINKER_LANGUAGE-check.cmake
@@ -0,0 +1,5 @@
+
+set (VALID_LANG CXX)
+set (INVALID_LANG C)
+
+include ("${CMAKE_CURRENT_LIST_DIR}/genex_LINK_LANGUAGE-validation.cmake")
diff --git a/Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-LINKER_LANGUAGE-result.txt b/Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-LINKER_LANGUAGE-result.txt
new file mode 100644
index 0000000..8d98f9d
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-LINKER_LANGUAGE-result.txt
@@ -0,0 +1 @@
+.*
diff --git a/Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-exe-check.cmake b/Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-exe-check.cmake
new file mode 100644
index 0000000..71f641d
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-exe-check.cmake
@@ -0,0 +1,2 @@
+
+include ("${CMAKE_CURRENT_LIST_DIR}/genex_LINK_LANGUAGE-validation.cmake")
diff --git a/Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-exe-result.txt b/Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-exe-result.txt
new file mode 100644
index 0000000..8d98f9d
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-exe-result.txt
@@ -0,0 +1 @@
+.*
diff --git a/Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-interface-check.cmake b/Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-interface-check.cmake
new file mode 100644
index 0000000..ba0120c
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-interface-check.cmake
@@ -0,0 +1,5 @@
+
+set (VALID_LANG C)
+set (INVALID_LANG CXX)
+
+include ("${CMAKE_CURRENT_LIST_DIR}/genex_LINK_LANGUAGE-validation.cmake")
diff --git a/Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-interface-result.txt b/Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-interface-result.txt
new file mode 100644
index 0000000..8d98f9d
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-interface-result.txt
@@ -0,0 +1 @@
+.*
diff --git a/Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-mod-check.cmake b/Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-mod-check.cmake
new file mode 100644
index 0000000..71f641d
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-mod-check.cmake
@@ -0,0 +1,2 @@
+
+include ("${CMAKE_CURRENT_LIST_DIR}/genex_LINK_LANGUAGE-validation.cmake")
diff --git a/Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-mod-result.txt b/Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-mod-result.txt
new file mode 100644
index 0000000..8d98f9d
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-mod-result.txt
@@ -0,0 +1 @@
+.*
diff --git a/Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-shared_c-check.cmake b/Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-shared_c-check.cmake
new file mode 100644
index 0000000..ba0120c
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-shared_c-check.cmake
@@ -0,0 +1,5 @@
+
+set (VALID_LANG C)
+set (INVALID_LANG CXX)
+
+include ("${CMAKE_CURRENT_LIST_DIR}/genex_LINK_LANGUAGE-validation.cmake")
diff --git a/Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-shared_c-result.txt b/Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-shared_c-result.txt
new file mode 100644
index 0000000..8d98f9d
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-shared_c-result.txt
@@ -0,0 +1 @@
+.*
diff --git a/Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-validation.cmake b/Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-validation.cmake
new file mode 100644
index 0000000..f0237ab
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE-validation.cmake
@@ -0,0 +1,17 @@
+
+if (NOT DEFINED VALID_LANG)
+ set (VALID_LANG C)
+endif()
+if (NOT DEFINED INVALID_LANG)
+ set (INVALID_LANG CXX)
+endif()
+
+if (NOT actual_stdout MATCHES "BADFLAG_${VALID_LANG}_LANG")
+ set (RunCMake_TEST_FAILED "Not found expected 'BADFLAG_${VALID_LANG}_LANG'.")
+endif()
+if (actual_stdout MATCHES "BADFLAG_${INVALID_LANG}_LANG")
+ if (RunCMake_TEST_FAILED)
+ string (APPEND RunCMake_TEST_FAILED "\n")
+ endif()
+ string (APPEND RunCMake_TEST_FAILED "Found unexpected 'BADFLAG_${INVALID_LANG}_LANG'.")
+endif()
diff --git a/Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE.cmake b/Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE.cmake
new file mode 100644
index 0000000..61e6159
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/genex_LINK_LANGUAGE.cmake
@@ -0,0 +1,32 @@
+
+enable_language(C)
+enable_language(CXX)
+
+set (obj "${CMAKE_C_OUTPUT_EXTENSION}")
+if(BORLAND)
+ set(pre -)
+endif()
+
+add_library(LinkOptions_interface INTERFACE)
+target_link_options (LinkOptions_interface INTERFACE $<$<LINK_LANGUAGE:C>:${pre}BADFLAG_$<LINK_LANGUAGE>_LANG${obj}>
+ $<$<LINK_LANGUAGE:CXX>:${pre}BADFLAG_$<LINK_LANGUAGE>_LANG${obj}>)
+
+add_library(LinkOptions_shared_interface SHARED LinkOptionsLib.c)
+target_link_libraries (LinkOptions_shared_interface PRIVATE LinkOptions_interface)
+
+add_library(LinkOptions_shared_c SHARED LinkOptionsLib.c)
+target_link_options (LinkOptions_shared_c PRIVATE $<$<LINK_LANGUAGE:C>:${pre}BADFLAG_$<LINK_LANGUAGE>_LANG${obj}>
+ $<$<LINK_LANGUAGE:CXX>:${pre}BADFLAG_$<LINK_LANGUAGE>_LANG${obj}>)
+
+add_library(LinkOptions_shared_cxx SHARED LinkOptionsLib.c)
+target_link_options (LinkOptions_shared_cxx PRIVATE $<$<LINK_LANGUAGE:C>:${pre}BADFLAG_$<LINK_LANGUAGE>_LANG${obj}>
+ $<$<LINK_LANGUAGE:CXX>:${pre}BADFLAG_$<LINK_LANGUAGE>_LANG${obj}>)
+set_property (TARGET LinkOptions_shared_cxx PROPERTY LINKER_LANGUAGE CXX)
+
+add_library(LinkOptions_mod MODULE LinkOptionsLib.c)
+target_link_options (LinkOptions_mod PRIVATE $<$<LINK_LANGUAGE:C>:${pre}BADFLAG_$<LINK_LANGUAGE>_LANG${obj}>
+ $<$<LINK_LANGUAGE:CXX>:${pre}BADFLAG_$<LINK_LANGUAGE>_LANG${obj}>)
+
+add_executable(LinkOptions_exe LinkOptionsExe.c)
+target_link_options (LinkOptions_exe PRIVATE $<$<LINK_LANGUAGE:C>:${pre}BADFLAG_$<LINK_LANGUAGE>_LANG${obj}>
+ $<$<LINK_LANGUAGE:CXX>:${pre}BADFLAG_$<LINK_LANGUAGE>_LANG${obj}>)
diff --git a/Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-LINKER_LANGUAGE-check.cmake b/Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-LINKER_LANGUAGE-check.cmake
new file mode 100644
index 0000000..ed4f851
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-LINKER_LANGUAGE-check.cmake
@@ -0,0 +1,5 @@
+
+set (VALID_LANG CXX)
+set (INVALID_LANG C)
+
+include ("${CMAKE_CURRENT_LIST_DIR}/genex_LINK_LANG_AND_ID-validation.cmake")
diff --git a/Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-LINKER_LANGUAGE-result.txt b/Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-LINKER_LANGUAGE-result.txt
new file mode 100644
index 0000000..8d98f9d
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-LINKER_LANGUAGE-result.txt
@@ -0,0 +1 @@
+.*
diff --git a/Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-exe-check.cmake b/Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-exe-check.cmake
new file mode 100644
index 0000000..6bddee1
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-exe-check.cmake
@@ -0,0 +1,2 @@
+
+include ("${CMAKE_CURRENT_LIST_DIR}/genex_LINK_LANG_AND_ID-validation.cmake")
diff --git a/Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-exe-result.txt b/Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-exe-result.txt
new file mode 100644
index 0000000..8d98f9d
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-exe-result.txt
@@ -0,0 +1 @@
+.*
diff --git a/Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-interface-check.cmake b/Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-interface-check.cmake
new file mode 100644
index 0000000..cf498d9
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-interface-check.cmake
@@ -0,0 +1,5 @@
+
+set (VALID_LANG C)
+set (INVALID_LANG CXX)
+
+include ("${CMAKE_CURRENT_LIST_DIR}/genex_LINK_LANG_AND_ID-validation.cmake")
diff --git a/Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-interface-result.txt b/Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-interface-result.txt
new file mode 100644
index 0000000..8d98f9d
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-interface-result.txt
@@ -0,0 +1 @@
+.*
diff --git a/Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-mod-check.cmake b/Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-mod-check.cmake
new file mode 100644
index 0000000..6bddee1
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-mod-check.cmake
@@ -0,0 +1,2 @@
+
+include ("${CMAKE_CURRENT_LIST_DIR}/genex_LINK_LANG_AND_ID-validation.cmake")
diff --git a/Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-mod-result.txt b/Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-mod-result.txt
new file mode 100644
index 0000000..8d98f9d
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-mod-result.txt
@@ -0,0 +1 @@
+.*
diff --git a/Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-shared_c-check.cmake b/Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-shared_c-check.cmake
new file mode 100644
index 0000000..cf498d9
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-shared_c-check.cmake
@@ -0,0 +1,5 @@
+
+set (VALID_LANG C)
+set (INVALID_LANG CXX)
+
+include ("${CMAKE_CURRENT_LIST_DIR}/genex_LINK_LANG_AND_ID-validation.cmake")
diff --git a/Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-shared_c-result.txt b/Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-shared_c-result.txt
new file mode 100644
index 0000000..8d98f9d
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-shared_c-result.txt
@@ -0,0 +1 @@
+.*
diff --git a/Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-validation.cmake b/Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-validation.cmake
new file mode 100644
index 0000000..a5dc27f
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID-validation.cmake
@@ -0,0 +1,23 @@
+
+if (NOT VALID_LANG)
+ set (VALID_LANG C)
+endif()
+if (NOT INVALID_LANG)
+ set (INVALID_LANG CXX)
+endif()
+
+if (NOT actual_stdout MATCHES "BADFLAG_${VALID_LANG}_LANG_ID")
+ set (RunCMake_TEST_FAILED "Not found expected 'BADFLAG_${VALID_LANG}_LANG_ID'.\n")
+endif()
+if (actual_stdout MATCHES "BADFLAG_${INVALID_LANG}_LANG_ID")
+ if (RunCMake_TEST_FAILED)
+ string (APPEND RunCMake_TEST_FAILED "\n")
+ endif()
+ string (APPEND RunCMake_TEST_FAILED "Found unexpected 'BADFLAG_${INVALID_LANG}_LANG_ID '.")
+endif()
+if (actual_stdout MATCHES "BADFLAG_(${VALID_LANG}|${INVALID_LANG})_BADID")
+ if (RunCMake_TEST_FAILED)
+ string (APPEND RunCMake_TEST_FAILED "\n")
+ endif()
+ string (APPEND RunCMake_TEST_FAILED "Found unexpected 'BADFLAG_(${VALID_LANG}|${INVALID_LANG})_BADID'.")
+endif()
diff --git a/Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID.cmake b/Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID.cmake
new file mode 100644
index 0000000..db0f500
--- /dev/null
+++ b/Tests/RunCMake/target_link_options/genex_LINK_LANG_AND_ID.cmake
@@ -0,0 +1,41 @@
+
+enable_language(C)
+enable_language(CXX)
+
+if(BORLAND)
+ set(pre -)
+endif()
+
+add_library(LinkOptions_interface INTERFACE)
+target_link_options (LinkOptions_interface INTERFACE $<$<LINK_LANG_AND_ID:C,${CMAKE_C_COMPILER_ID}>:${pre}BADFLAG_C_LANG_ID${CMAKE_C_OUTPUT_EXTENSION}>
+ $<$<LINK_LANG_AND_ID:CXX,${CMAKE_CXX_COMPILER_ID}>:${pre}BADFLAG_CXX_LANG_ID${CMAKE_CXX_OUTPUT_EXTENSION}>
+ $<$<LINK_LANG_AND_ID:C,BADID>:${pre}BADFLAG_C_BADID${CMAKE_C_OUTPUT_EXTENSION}>
+ $<$<LINK_LANG_AND_ID:CXX,BADID>:${pre}BADFLAG_CXX_BADID${CMAKE_CXX_OUTPUT_EXTENSION}>)
+
+add_library(LinkOptions_shared_interface SHARED LinkOptionsLib.c)
+target_link_libraries (LinkOptions_shared_interface PRIVATE LinkOptions_interface)
+
+add_library(LinkOptions_shared_c SHARED LinkOptionsLib.c)
+target_link_options (LinkOptions_shared_c PRIVATE $<$<LINK_LANG_AND_ID:C,${CMAKE_C_COMPILER_ID}>:${pre}BADFLAG_C_LANG_ID${CMAKE_C_OUTPUT_EXTENSION}>
+ $<$<LINK_LANG_AND_ID:CXX,${CMAKE_CXX_COMPILER_ID}>:${pre}BADFLAG_CXX_LANG_ID${CMAKE_CXX_OUTPUT_EXTENSION}>
+ $<$<LINK_LANG_AND_ID:C,BADID>:${pre}BADFLAG_C_BADID${CMAKE_C_OUTPUT_EXTENSION}>
+ $<$<LINK_LANG_AND_ID:CXX,BADID>:${pre}BADFLAG_CXX_BADID${CMAKE_CXX_OUTPUT_EXTENSION}>)
+
+add_library(LinkOptions_shared_cxx SHARED LinkOptionsLib.c)
+target_link_options (LinkOptions_shared_cxx PRIVATE $<$<LINK_LANG_AND_ID:C,${CMAKE_C_COMPILER_ID}>:${pre}BADFLAG_C_LANG_ID${CMAKE_C_OUTPUT_EXTENSION}>
+ $<$<LINK_LANG_AND_ID:CXX,${CMAKE_CXX_COMPILER_ID}>:${pre}BADFLAG_CXX_LANG_ID${CMAKE_CXX_OUTPUT_EXTENSION}>
+ $<$<LINK_LANG_AND_ID:C,BADID>:${pre}BADFLAG_C_BADID${CMAKE_C_OUTPUT_EXTENSION}>
+ $<$<LINK_LANG_AND_ID:CXX,BADID>:${pre}BADFLAG_CXX_BADID${CMAKE_CXX_OUTPUT_EXTENSION}>)
+set_property (TARGET LinkOptions_shared_cxx PROPERTY LINKER_LANGUAGE CXX)
+
+add_library(LinkOptions_mod MODULE LinkOptionsLib.c)
+target_link_options (LinkOptions_mod PRIVATE $<$<LINK_LANG_AND_ID:C,${CMAKE_C_COMPILER_ID}>:${pre}BADFLAG_C_LANG_ID${CMAKE_C_OUTPUT_EXTENSION}>
+ $<$<LINK_LANG_AND_ID:CXX,${CMAKE_CXX_COMPILER_ID}>:${pre}BADFLAG_CXX_LANG_ID${CMAKE_CXX_OUTPUT_EXTENSION}>
+ $<$<LINK_LANG_AND_ID:C,BADID>:${pre}BADFLAG_C_BADID${CMAKE_C_OUTPUT_EXTENSION}>
+ $<$<LINK_LANG_AND_ID:CXX,BADID>:${pre}BADFLAG_CXX_BADID${CMAKE_CXX_OUTPUT_EXTENSION}>)
+
+add_executable(LinkOptions_exe LinkOptionsExe.c)
+target_link_options (LinkOptions_exe PRIVATE $<$<LINK_LANG_AND_ID:C,${CMAKE_C_COMPILER_ID}>:${pre}BADFLAG_C_LANG_ID${CMAKE_C_OUTPUT_EXTENSION}>
+ $<$<LINK_LANG_AND_ID:CXX,${CMAKE_CXX_COMPILER_ID}>:${pre}BADFLAG_CXX_LANG_ID${CMAKE_CXX_OUTPUT_EXTENSION}>
+ $<$<LINK_LANG_AND_ID:C,BADID>:${pre}BADFLAG_C_BADID${CMAKE_C_OUTPUT_EXTENSION}>
+ $<$<LINK_LANG_AND_ID:CXX,BADID>:${pre}BADFLAG_CXX_BADID${CMAKE_CXX_OUTPUT_EXTENSION}>)
diff --git a/Tests/SourceGroups/CMakeLists.txt b/Tests/SourceGroups/CMakeLists.txt
index a5740bb..d726395 100644
--- a/Tests/SourceGroups/CMakeLists.txt
+++ b/Tests/SourceGroups/CMakeLists.txt
@@ -30,6 +30,9 @@ source_group(Base\\Sub1\\Base FILES bar.c)
# a group without files, is currently not created
source_group(EmptyGroup)
+# Forward slashes can be delimiters too
+source_group(Base/Nested FILES nested.c)
+
set(root ${CMAKE_CURRENT_SOURCE_DIR})
set(tree_files_without_prefix ${root}/sub1/tree_bar.c
@@ -58,4 +61,5 @@ source_group(PREFIX "" FILES ${tree_files_with_empty_prefix} TREE ${root})
add_executable(SourceGroups main.c bar.c foo.c sub1/foo.c sub1/foobar.c baz.c
${tree_files_with_prefix} ${tree_files_without_prefix}
- ${tree_files_with_empty_prefix} README.txt)
+ ${tree_files_with_empty_prefix} README.txt
+ nested.c)
diff --git a/Tests/SourceGroups/main.c b/Tests/SourceGroups/main.c
index 87225f5..f646b49 100644
--- a/Tests/SourceGroups/main.c
+++ b/Tests/SourceGroups/main.c
@@ -12,6 +12,7 @@ extern int tree_empty_prefix_bar(void);
extern int tree_bar(void);
extern int tree_foobar(void);
extern int tree_baz(void);
+extern int nested(void);
int main()
{
@@ -23,5 +24,8 @@ int main()
"tree_empty_prefix_bar: %d\n",
tree_prefix_foo(), tree_prefix_bar(), tree_bar(), tree_foobar(),
tree_baz(), tree_empty_prefix_foo(), tree_empty_prefix_bar());
+
+ printf("nested: %d\n", nested());
+
return 0;
}
diff --git a/Tests/SourceGroups/nested.c b/Tests/SourceGroups/nested.c
new file mode 100644
index 0000000..4e31480
--- /dev/null
+++ b/Tests/SourceGroups/nested.c
@@ -0,0 +1,4 @@
+int nested(void)
+{
+ return 123;
+}
diff --git a/Tests/SwiftOnly/CMakeLists.txt b/Tests/SwiftOnly/CMakeLists.txt
index f4cbac2..e24279b 100644
--- a/Tests/SwiftOnly/CMakeLists.txt
+++ b/Tests/SwiftOnly/CMakeLists.txt
@@ -1,4 +1,16 @@
cmake_minimum_required(VERSION 3.3)
+
+# NOTE: Force the Release mode configuration as there are some issues with the
+# debug information handling on macOS on certain Xcode builds.
+if(NOT CMAKE_CONFIGURATION_TYPES)
+ set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build" FORCE)
+endif()
+
+# NOTE: enable shared libraries by default. Older Xcode releases do not play
+# well with static libraries, and Windows does not currently support static
+# libraries in Swift.
+set(BUILD_SHARED_LIBS YES)
+
project(SwiftOnly Swift)
if(NOT XCODE_VERSION VERSION_LESS 10.2)
@@ -7,7 +19,19 @@ elseif(NOT XCODE_VERSION VERSION_LESS 8.0)
set(CMAKE_Swift_LANGUAGE_VERSION 3.0)
endif()
+set(CMAKE_Swift_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/swift)
+
add_executable(SwiftOnly main.swift)
+add_library(L L.swift)
+
+add_library(M M.swift)
+target_link_libraries(M PUBLIC
+ L)
+
+add_library(N N.swift)
+target_link_libraries(N PUBLIC
+ M)
+
# Dummy to make sure generation works with such targets.
add_library(SwiftIface INTERFACE)
diff --git a/Tests/SwiftOnly/L.swift b/Tests/SwiftOnly/L.swift
new file mode 100644
index 0000000..79ff87e
--- /dev/null
+++ b/Tests/SwiftOnly/L.swift
@@ -0,0 +1 @@
+public let ThirtyTwo: Int = 32
diff --git a/Tests/SwiftOnly/M.swift b/Tests/SwiftOnly/M.swift
new file mode 100644
index 0000000..dd333fe
--- /dev/null
+++ b/Tests/SwiftOnly/M.swift
@@ -0,0 +1,2 @@
+import L
+public let SixtyFour: Int = ThirtyTwo * 2
diff --git a/Tests/SwiftOnly/N.swift b/Tests/SwiftOnly/N.swift
new file mode 100644
index 0000000..990ddf9
--- /dev/null
+++ b/Tests/SwiftOnly/N.swift
@@ -0,0 +1,2 @@
+import M
+public let OneTwentyEight = SixtyFour * 2
diff --git a/Tests/TryCompile/CMakeLists.txt b/Tests/TryCompile/CMakeLists.txt
index 9ec9b70..df921d8 100644
--- a/Tests/TryCompile/CMakeLists.txt
+++ b/Tests/TryCompile/CMakeLists.txt
@@ -187,7 +187,7 @@ try_compile(SHOULD_FAIL_DUE_TO_BAD_SOURCE
if(SHOULD_FAIL_DUE_TO_BAD_SOURCE AND NOT CMAKE_GENERATOR MATCHES "Watcom WMake|NMake Makefiles")
string(REPLACE "\n" "\n " output " ${output}")
message(SEND_ERROR "try_compile with bad#source.c did not fail:\n${output}")
-elseif(NOT output MATCHES [[(bad#source\.c|bad\\)]])
+elseif(NOT output MATCHES [[(bad#source\.c|bad\.c|bad')]])
string(REPLACE "\n" "\n " output " ${output}")
message(SEND_ERROR "try_compile with bad#source.c failed without mentioning bad source:\n${output}")
else()
diff --git a/Tests/UseSWIG/BasicConfiguration.cmake b/Tests/UseSWIG/BasicConfiguration.cmake
index fd3ac40..d054953 100644
--- a/Tests/UseSWIG/BasicConfiguration.cmake
+++ b/Tests/UseSWIG/BasicConfiguration.cmake
@@ -18,6 +18,9 @@ unset(SWIG_LANG_LIBRARIES)
if(${language} MATCHES csharp)
set(SWIG_LANG_TYPE TYPE SHARED)
endif()
+if(${language} MATCHES fortran)
+ set(SWIG_LANG_TYPE TYPE SHARED)
+endif()
if(${language} MATCHES python)
find_package(Python REQUIRED COMPONENTS Interpreter Development)
set(SWIG_LANG_INCLUDE_DIRECTORIES ${Python_INCLUDE_DIRS})
diff --git a/Tests/UseSWIG/BasicFortran/CMakeLists.txt b/Tests/UseSWIG/BasicFortran/CMakeLists.txt
new file mode 100644
index 0000000..e81fb85
--- /dev/null
+++ b/Tests/UseSWIG/BasicFortran/CMakeLists.txt
@@ -0,0 +1,23 @@
+cmake_minimum_required(VERSION 3.12...3.13)
+
+project(TestBasicFortran CXX Fortran)
+
+include(CTest)
+
+set(language "fortran")
+
+include (../BasicConfiguration.cmake)
+get_target_property(EXAMPLE_PREFIX example PREFIX)
+if (NOT EXAMPLE_PREFIX STREQUAL "${CMAKE_SHARED_LIBRARY_PREFIX}"
+ AND NOT EXAMPLE_PREFIX STREQUAL "EXAMPLE_PREFIX-NOTFOUND")
+ message(FATAL_ERROR "Unexpected library prefix on target: got "
+ "'${EXAMPLE_PREFIX}' but expected '${CMAKE_SHARED_LIBRARY_PREFIX}'")
+endif()
+
+
+add_executable(runme ${CMAKE_CURRENT_SOURCE_DIR}/../runme.f90)
+target_link_libraries(runme example)
+set_target_properties(runme PROPERTIES LINKER_LANGUAGE Fortran)
+
+add_test (NAME BasicFortran
+ COMMAND $<TARGET_FILE:runme>)
diff --git a/Tests/UseSWIG/CMakeLists.txt b/Tests/UseSWIG/CMakeLists.txt
index 3cc910f..d102846 100644
--- a/Tests/UseSWIG/CMakeLists.txt
+++ b/Tests/UseSWIG/CMakeLists.txt
@@ -55,6 +55,21 @@ add_test(NAME UseSWIG.BasicPerl COMMAND
--test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
)
+if (CMake_TEST_UseSWIG_Fortran)
+ check_language(Fortran)
+ if (CMAKE_Fortran_COMPILER)
+ add_test(NAME UseSWIG.BasicFortran COMMAND
+ ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
+ --build-and-test
+ "${CMake_SOURCE_DIR}/Tests/UseSWIG/BasicFortran"
+ "${CMake_BINARY_DIR}/Tests/UseSWIG/BasicFortran"
+ ${build_generator_args}
+ --build-project TestBasicFortran
+ --build-options ${build_options}
+ --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
+ )
+ endif()
+endif()
add_test(NAME UseSWIG.MultipleModules COMMAND
${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
diff --git a/Tests/UseSWIG/runme.f90 b/Tests/UseSWIG/runme.f90
new file mode 100644
index 0000000..1d985d3
--- /dev/null
+++ b/Tests/UseSWIG/runme.f90
@@ -0,0 +1,77 @@
+! File : runme.f90
+program runme
+ use ISO_FORTRAN_ENV
+ implicit none
+ integer, parameter :: STDOUT = OUTPUT_UNIT
+
+ call run()
+contains
+
+subroutine run()
+ use example
+ use iso_c_binding
+ implicit none
+
+ type(Circle) :: c
+ type(Square), target :: s ! 'target' allows it to be pointed to
+ class(Shape), pointer :: sh
+ integer(C_INT) :: n_shapes
+
+ ! ----- Object creation -----
+
+ write(STDOUT,*) "Creating some objects"
+ c = Circle(10.0d0)
+ s = Square(10.0d0)
+
+ ! ----- Access a static member -----
+ write(STDOUT,'(a,i2,a)')"A total of", s%get_nshapes(), " shapes were created"
+
+ ! ----- Member data access -----
+
+ ! Notice how we can do this using functions specific to
+ ! the 'Circle' class.
+ call c%set_x(20.0d0)
+ call c%set_y(30.0d0)
+
+ ! Now use the same functions in the base class
+ sh => s
+ call sh%set_x(-10.0d0)
+ call sh%set_y( 5.0d0)
+
+ write(STDOUT,*)"Here is their current position:"
+ write(STDOUT,'(a,f5.1,a,f5.1,a)')" Circle = (", c%get_x(), ",", c%get_y(), " )"
+ write(STDOUT,'(a,f5.1,a,f5.1,a)')" Square = (", s%get_x(), ",", s%get_y(), " )"
+
+ ! ----- Call some methods -----
+
+ write(STDOUT,*)"Here are some properties of the shapes:"
+ call print_shape(c)
+ call print_shape(s)
+
+ ! ----- Delete everything -----
+
+ ! Note: this invokes the virtual destructor
+ call c%release()
+ call s%release()
+
+ n_shapes = c%get_nshapes()
+ write(STDOUT,*) n_shapes, "shapes remain"
+ if (n_shapes /= 0) then
+ write(STDOUT,*) "Shapes were not freed properly!"
+ stop 1
+ endif
+
+ write(STDOUT,*) "Goodbye"
+end subroutine
+
+subroutine print_shape(s)
+ use example, only : Shape
+ use iso_c_binding
+ implicit none
+ class(Shape), intent(in) :: s
+
+ write(STDOUT,*)" area = ",s%area()
+ write(STDOUT,*)" perimeter = ",s%perimeter()
+end subroutine
+
+end program
diff --git a/Tests/VSWinStorePhone/CMakeLists.txt b/Tests/VSWinStorePhone/CMakeLists.txt
index b8e157d..558d5de 100644
--- a/Tests/VSWinStorePhone/CMakeLists.txt
+++ b/Tests/VSWinStorePhone/CMakeLists.txt
@@ -127,7 +127,7 @@ set_property(SOURCE ${VERTEXSHADER_FILES} PROPERTY VS_SHADER_ENTRYPOINT mainVS)
set_property(SOURCE ${VERTEXSHADER_FILES} PROPERTY VS_SHADER_MODEL 4.0_level_9_3)
set_property(SOURCE ${VERTEXSHADER_FILES} PROPERTY VS_SHADER_FLAGS "/DFLAGS_ADDED")
set_property(SOURCE ${VERTEXSHADER_FILES} PROPERTY VS_SHADER_OUTPUT_HEADER_FILE "$(OutDir)%(Filename).h")
-
+set_property(SOURCE ${VERTEXSHADER_FILES} PROPERTY VS_SETTINGS "$<$<CONFIG:DEBUG>:SourceProperty1=SourceProperty1Value>")
source_group("Source Files" FILES ${SOURCE_FILES})
source_group("Header Files" FILES ${HEADER_FILES})
@@ -135,6 +135,11 @@ source_group("Resource Files" FILES ${RESOURCE_FILES})
add_executable(${EXE_NAME} WIN32 ${SOURCE_FILES} ${HEADER_FILES} ${RESOURCE_FILES})
set_property(TARGET ${EXE_NAME} PROPERTY VS_WINRT_COMPONENT TRUE)
+set_property(TARGET ${EXE_NAME} PROPERTY VS_SOURCE_SETTINGS_FXCompile
+ "TargetProperty1=$<$<CONFIG:DEBUG>:TargetProperty1ValueDebug>$<$<CONFIG:RELEASE>:TargetProperty1ValueRelease>")
+
+add_custom_command(TARGET ${EXE_NAME} POST_BUILD
+ COMMAND ${CMAKE_COMMAND} -Dvcxproj="${CMAKE_CURRENT_BINARY_DIR}/${EXE_NAME}.vcxproj" -P "${CMAKE_CURRENT_SOURCE_DIR}/EnsurePropertiesSet.cmake")
string(SUBSTRING "${CMAKE_SYSTEM_VERSION}" 0, 4, SHORT_VERSION)
diff --git a/Tests/VSWinStorePhone/EnsurePropertiesSet.cmake b/Tests/VSWinStorePhone/EnsurePropertiesSet.cmake
new file mode 100644
index 0000000..528c46f
--- /dev/null
+++ b/Tests/VSWinStorePhone/EnsurePropertiesSet.cmake
@@ -0,0 +1,45 @@
+macro(ensure_props_set projectFile)
+ if(NOT EXISTS "${projectFile}")
+ message(FATAL_ERROR "Project file ${projectFile} does not exist.")
+ return()
+ endif()
+
+ set(SourcePropertyFound FALSE)
+ set(DebugTargetPropertyFound FALSE)
+ set(ReleaseTargetPropertyFound FALSE)
+
+ file(STRINGS "${projectFile}" lines)
+ foreach(line IN LISTS lines)
+ if(line MATCHES "<SourceProperty1.*Debug.*>SourceProperty1Value</SourceProperty1>")
+ message("SourceProperty1 setting found")
+ set(SourcePropertyFound TRUE)
+ endif()
+
+ if(line MATCHES "<TargetProperty1.*Debug.*>TargetProperty1ValueDebug</TargetProperty1>")
+ message("Debug TargetProperty1 setting found")
+ set(DebugTargetPropertyFound TRUE)
+ endif()
+
+ if(line MATCHES "<TargetProperty1.*Release.*>TargetProperty1ValueRelease</TargetProperty1>")
+ message("Release TargetProperty1 setting found")
+ set(ReleaseTargetPropertyFound TRUE)
+ endif()
+ endforeach()
+
+ if (NOT SourcePropertyFound)
+ message(FATAL_ERROR "SourceProperty1 setting not found")
+ return()
+ endif()
+
+ if (NOT DebugTargetPropertyFound)
+ message(FATAL_ERROR "Debug TargetProperty1 setting not found")
+ return()
+ endif()
+
+ if (NOT ReleaseTargetPropertyFound)
+ message(FATAL_ERROR "Release TargetProperty1 setting not found")
+ return()
+ endif()
+endmacro()
+
+ensure_props_set("${vcxproj}")
diff --git a/Tests/VSWindowsFormsResx/WindowsFormsResx/MyForm.cpp b/Tests/VSWindowsFormsResx/WindowsFormsResx/MyForm.cpp
index 154e268..0c37370 100644
--- a/Tests/VSWindowsFormsResx/WindowsFormsResx/MyForm.cpp
+++ b/Tests/VSWindowsFormsResx/WindowsFormsResx/MyForm.cpp
@@ -1 +1 @@
-#include "MyForm.h" \ No newline at end of file
+#include "MyForm.h"
diff --git a/Utilities/GitSetup/setup-user b/Utilities/GitSetup/setup-user
index 0b98879..4cbd184 100755
--- a/Utilities/GitSetup/setup-user
+++ b/Utilities/GitSetup/setup-user
@@ -20,7 +20,14 @@
# Project configuration instructions: NONE
for (( ; ; )); do
- ident="$(git var GIT_AUTHOR_IDENT 2>/dev/null | rev | cut -d' ' -f3- | rev)"
+ if type -p rev >/dev/null && type -p cut >/dev/null; then
+ ident="$(git var GIT_AUTHOR_IDENT 2>/dev/null | rev | cut -d' ' -f3- | rev)"
+ elif user_name=$(git config --get user.name) &&
+ user_email=$(git config --get user.email); then
+ ident="$user_name <$user_email>"
+ else
+ ident=""
+ fi
if test -n "$ident"; then
echo 'Your commits will record as Author:
diff --git a/Utilities/IWYU/mapping.imp b/Utilities/IWYU/mapping.imp
index 3497b53..66cb282 100644
--- a/Utilities/IWYU/mapping.imp
+++ b/Utilities/IWYU/mapping.imp
@@ -27,6 +27,7 @@
{ include: [ "<bits/std_abs.h>", private, "<stdlib.h>", public ] },
{ include: [ "<bits/stdint-intn.h>", private, "<stdint.h>", public ] },
{ include: [ "<bits/stdint-uintn.h>", private, "<stdint.h>", public ] },
+ { include: [ "<bits/string_view.tcc>", private, "<string_view>", public ] },
{ include: [ "<bits/time.h>", private, "<time.h>", public ] },
{ include: [ "<bits/types/clock_t.h>", private, "<time.h>", public ] },
{ include: [ "<bits/types/mbstate_t.h>", private, "<wchar.h>", public ] },
@@ -77,6 +78,7 @@
# Use '-Xiwyu -v7' to see the fully qualified names that need this.
# TODO: Can this be simplified with an @-expression?
#{ symbol: [ "@std::__decay_and_strip<.*>::__type", private, "\"cmConfigure.h\"", public ] },
+ { symbol: [ "std::__decay_and_strip<bool>::__type", private, "\"cmConfigure.h\"", public ] },
{ symbol: [ "std::__decay_and_strip<char const (&)[1]>::__type", private, "\"cmConfigure.h\"", public ] },
{ symbol: [ "std::__decay_and_strip<cmCommand *&>::__type", private, "\"cmConfigure.h\"", public ] },
{ symbol: [ "std::__decay_and_strip<cmGeneratorTarget *&>::__type", private, "\"cmConfigure.h\"", public ] },
@@ -86,61 +88,24 @@
{ symbol: [ "std::__decay_and_strip<std::basic_string<char> &>::__type", private, "\"cmConfigure.h\"", public ] },
{ symbol: [ "std::__decay_and_strip<const std::basic_string<char> &>::__type", private, "\"cmConfigure.h\"", public ] },
{ symbol: [ "std::__decay_and_strip<cmFindPackageCommand::PathLabel &>::__type", private, "\"cmConfigure.h\"", public ] },
+ { symbol: [ "std::__decay_and_strip<cmGlobalNinjaGenerator::TargetAlias &>::__type", private, "\"cmConfigure.h\"", public ] },
{ symbol: [ "std::__decay_and_strip<__gnu_cxx::__normal_iterator<const cmCTestTestHandler::cmCTestTestProperties *, std::vector<cmCTestTestHandler::cmCTestTestProperties, std::allocator<cmCTestTestHandler::cmCTestTestProperties> > > &>::__type", private, "\"cmConfigure.h\"", public ] },
+ { symbol: [ "std::__decay_and_strip<const __gnu_cxx::__normal_iterator<std::pair<cm::string_view, std::function<void (ArgumentParser::Instance &, void *)> > *, std::vector<std::pair<cm::string_view, std::function<void (ArgumentParser::Instance &, void *)> >, std::allocator<std::pair<cm::string_view, std::function<void (ArgumentParser::Instance &, void *)> > > > > &>::__type", private, "\"cmConfigure.h\"", public ] },
{ symbol: [ "std::__success_type<std::chrono::duration<double, std::ratio<1, 1> > >::type", private, "\"cmConfigure.h\"", public ] },
{ symbol: [ "std::__success_type<std::chrono::duration<long, std::ratio<1, 1000000000> > >::type", private, "\"cmConfigure.h\"", public ] },
{ symbol: [ "std::enable_if<true, std::chrono::duration<long, std::ratio<1, 1> > >::type", private, "\"cmConfigure.h\"", public ] },
{ symbol: [ "std::enable_if<true, std::chrono::duration<long, std::ratio<60, 1> > >::type", private, "\"cmConfigure.h\"", public ] },
{ symbol: [ "std::enable_if<true, std::chrono::duration<long, std::ratio<1, 1000> > >::type", private, "\"cmConfigure.h\"", public ] },
- # KWIML
- { include: [ "<stdint.h>", public, "\"cm_kwiml.h\"", public ] },
- { include: [ "<inttypes.h>", public, "\"cm_kwiml.h\"", public ] },
-
- # Self-sufficient wrapper for <sys/stat.h>
- { symbol: [ "mode_t", private, "\"cm_sys_stat.h\"", public ] },
-
- # Wrappers for 3rd-party libraries used from the system.
- { include: [ "<archive.h>", private, "\"cm_libarchive.h\"", public ] },
- { include: [ "<archive_entry.h>", private, "\"cm_libarchive.h\"", public ] },
- { include: [ "@<curl/.+\\.h>", private, "\"cm_curl.h\"", public ] },
- { include: [ "<expat.h>", private, "\"cm_expat.h\"", public ] },
- { include: [ "<expat_external.h>", private, "\"cm_expat.h\"", public ] },
- { include: [ "<json/reader.h>", private, "\"cm_jsoncpp_reader.h\"", public ] },
- { include: [ "<json/value.h>", private, "\"cm_jsoncpp_value.h\"", public ] },
- { include: [ "<json/writer.h>", private, "\"cm_jsoncpp_writer.h\"", public ] },
- { include: [ "<rhash.h>", private, "\"cm_rhash.h\"", public ] },
- { include: [ "<uv.h>", private, "\"cm_uv.h\"", public ] },
- { include: [ "@<uv[/-].+\\.h>", private, "\"cm_uv.h\"", public ] },
- { include: [ "<kwiml/abi.h>", private, "\"cm_kwiml.h\"", public ] },
- { include: [ "<kwiml/int.h>", private, "\"cm_kwiml.h\"", public ] },
- { include: [ "<zconf.h>", private, "\"cm_zlib.h\"", public ] },
- { include: [ "<zlib.h>", private, "\"cm_zlib.h\"", public ] },
-
- # Wrappers for bundled 3rd-party libraries.
- { include: [ "\"cmlibarchive/libarchive/archive.h\"", private, "\"cm_libarchive.h\"", public ] },
- { include: [ "\"cmlibarchive/libarchive/archive_entry.h\"", private, "\"cm_libarchive.h\"", public ] },
- { include: [ "@\"cmcurl/include/curl/.+\\.h\"", private, "\"cm_curl.h\"", public ] },
- { include: [ "\"cmexpat/lib/expat.h\"", private, "\"cm_expat.h\"", public ] },
- { include: [ "\"cmexpat/lib/expat_external.h\"", private, "\"cm_expat.h\"", public ] },
- { include: [ "\"cmjsoncpp/include/json/reader.h\"", private, "\"cm_jsoncpp_reader.h\"", public ] },
- { include: [ "\"cmjsoncpp/include/json/value.h\"", private, "\"cm_jsoncpp_value.h\"", public ] },
- { include: [ "\"cmjsoncpp/include/json/writer.h\"", private, "\"cm_jsoncpp_writer.h\"", public ] },
- { include: [ "\"cmlibrhash/librhash/rhash.h\"", private, "\"cm_rhash.h\"", public ] },
- { include: [ "\"cmlibuv/include/uv.h\"", private, "\"cm_uv.h\"", public ] },
- { include: [ "@\"cmlibuv/include/uv/.+\\.h\"", private, "\"cm_uv.h\"", public ] },
- { include: [ "\"KWIML/include/kwiml/abi.h\"", private, "\"cm_kwiml.h\"", public ] },
- { include: [ "\"KWIML/include/kwiml/int.h\"", private, "\"cm_kwiml.h\"", public ] },
- { include: [ "\"cmzlib/cm_zlib_mangle.h\"", private, "\"cm_zlib.h\"", public ] },
- { include: [ "\"cmzlib/zconf.h\"", private, "\"cm_zlib.h\"", public ] },
- { include: [ "\"cmzlib/zlib.h\"", private, "\"cm_zlib.h\"", public ] },
-
- # System symbols used by libuv
- { symbol: [ "SIGHUP", private, "\"cm_uv.h\"", public ] },
- { symbol: [ "SIGINT", private, "\"cm_uv.h\"", public ] },
- { symbol: [ "ssize_t", private, "\"cm_uv.h\"", public ] },
-
- { symbol: [ "Json::ArrayIndex", private, "\"cm_jsoncpp_value.h\"", public ] },
+ # Wrappers for 3rd-party libraries
+ { include: [ "@<.*curl/curlver.h>", private, "<cm3p/curl/curl.h>", public ] },
+ { include: [ "@<.*json/forwards.h>", private, "<cm3p/json/value.h>", public ] },
+ { include: [ "@<.*uv/.+\\.h>", private, "<cm3p/uv.h>", public ] },
+ { include: [ "@<.*expat_external.h>", private, "<cm3p/expat.h>", public ] },
+ { include: [ "@<.*zconf.h>", private, "<cm3p/zlib.h>", public ] },
+ { include: [ "@<.*cm_zlib_mangle.h>", private, "<cm3p/zlib.h>", public ] },
+ # # System symbols used by libuv
+ { symbol: [ "ssize_t", private, "<cm3p/uv.h>", public ] },
{ symbol: [ "std::ifstream", private, "\"cmsys/FStream.hxx\"", public ] },
{ symbol: [ "std::ofstream", private, "\"cmsys/FStream.hxx\"", public ] },
@@ -152,8 +117,6 @@
{ include: [ "<fstream>", public, "\"cmsys/FStream.hxx\"", public ] },
# major and minor are used as macro arguments. Those are false matches.
- { symbol: [ "major", private, "\"cm_kwiml.h\"", public ] },
- { symbol: [ "minor", private, "\"cm_kwiml.h\"", public ] },
{ symbol: [ "major", private, "\"cmVersion.h\"", public ] },
{ symbol: [ "minor", private, "\"cmVersion.h\"", public ] },
diff --git a/Utilities/KWIML/CMakeLists.txt b/Utilities/KWIML/CMakeLists.txt
index 15e65e5..1d15884 100644
--- a/Utilities/KWIML/CMakeLists.txt
+++ b/Utilities/KWIML/CMakeLists.txt
@@ -17,7 +17,6 @@ if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}")
endif()
set(KWIML_INCLUDE_PREFIX kwiml)
else()
- cmake_minimum_required(VERSION 2.8.2 FATAL_ERROR)
set(kwiml_standalone 0)
if(KWIML_INSTALL_INCLUDE_DIR AND NOT DEFINED KWIML_INCLUDE_PREFIX)
message(FATAL_ERROR "Host project must set KWIML_INCLUDE_PREFIX")
diff --git a/Utilities/KWIML/include/kwiml/abi.h b/Utilities/KWIML/include/kwiml/abi.h
index da525fd..1112cb0 100644
--- a/Utilities/KWIML/include/kwiml/abi.h
+++ b/Utilities/KWIML/include/kwiml/abi.h
@@ -136,6 +136,8 @@ suppression macro KWIML_ABI_NO_VERIFY was defined.
# define KWIML_ABI_SIZEOF_DATA_PTR 8
# elif defined(__i386) || defined(__i386__)
# define KWIML_ABI_SIZEOF_DATA_PTR 4
+# elif defined(_M_ARM64)
+# define KWIML_ABI_SIZEOF_DATA_PTR 8
# endif
#endif
#if !defined(KWIML_ABI_SIZEOF_DATA_PTR)
@@ -461,6 +463,10 @@ suppression macro KWIML_ABI_NO_VERIFY was defined.
# define KWIML_ABI_ENDIAN_ID KWIML_ABI_ENDIAN_ID_BIG
# endif
+/* Aarch64 (Windows) */
+#elif defined(_M_ARM64)
+# define KWIML_ABI_ENDIAN_ID KWIML_ABI_ENDIAN_ID_LITTLE
+
/* Xtensa */
#elif defined(__XTENSA_EB__)
# define KWIML_ABI_ENDIAN_ID KWIML_ABI_ENDIAN_ID_BIG
diff --git a/Utilities/Release/.gitattributes b/Utilities/Release/.gitattributes
new file mode 100644
index 0000000..24e115f
--- /dev/null
+++ b/Utilities/Release/.gitattributes
@@ -0,0 +1 @@
+*.patch -whitespace
diff --git a/Utilities/Release/README.rst b/Utilities/Release/README.rst
index de294d1..9993afa 100644
--- a/Utilities/Release/README.rst
+++ b/Utilities/Release/README.rst
@@ -9,49 +9,57 @@ on ``cmake.org``. See also the `CMake Source Code Guide`_.
Docker
------
-The ``linux/<arch>/`` directories contain Docker specifications that anyone
-may use to produce Linux binaries for CMake:
+The ``<os>/<arch>/`` directories contain Docker specifications that anyone
+may use to produce binaries for CMake on the following platforms:
-* ``linux/<arch>/base/Dockerfile``:
+* ``linux/x86_64/``: Linux on ``x86_64`` architectures.
+* ``win/x86/``: Windows on ``x86_64`` and ``i386`` architectures.
+
+Each ``<os>/<arch>/`` directory contains the following:
+
+* ``<os>/<arch>/base/Dockerfile``:
Produces a base image with a build environment for portable CMake binaries.
This image is published in the `kitware/cmake Docker Hub Repository`_
- with tag ``build-linux-<arch>-base-<date>``.
+ with tag ``build-<os>-<arch>-base-<date>``.
-* ``linux/<arch>/deps/Dockerfile``:
+* ``<os>/<arch>/deps/Dockerfile``:
Produces an image with custom-built dependencies for portable CMake binaries.
This image is published in the `kitware/cmake Docker Hub Repository`_
- with tag ``build-linux-<arch>-deps-<date>``.
+ with tag ``build-<os>-<arch>-deps-<date>``.
-* ``linux/<arch>/Dockerfile``:
- Produce an image containing a portable CMake binary package for Linux.
+* ``<os>/<arch>/Dockerfile``:
+ Produce an image containing a portable CMake binary package.
Build this image using the CMake source directory as the build context.
- The resulting image will have an ``/out`` directory containing the package.
- For example:
+ The resulting image will have an ``/out`` (or ``c:/out``) directory
+ containing the package. For example, on Linux ``x86_64``:
.. code-block:: console
$ docker build --tag=cmake:build --network none \
- -f cmake-src/Utilities/Release/linux/$arch/Dockerfile cmake-src
+ -f cmake-src/Utilities/Release/linux/x86_64/Dockerfile cmake-src
$ docker container create --name cmake-build cmake:build
$ docker cp cmake-build:/out .
- $ ls out/cmake-*-Linux-$arch.*
+ $ ls out/cmake-*-Linux-x86_64.*
-* ``linux/<arch>/test/Dockerfile``:
+ On Windows, the ``win/x86`` specifications support both the ``x86_64``
+ and ``i386`` architectures selected via ``--build-arg ARCH=...``.
+
+* ``<os>/<arch>/test/Dockerfile``:
Produces a base image with a test environment for packaged CMake binaries.
- For example, build the test base image:
+ For example, on Linux ``x86_64``, one may build the test base image:
.. code-block:: console
$ docker build --tag=cmake:test-base \
- cmake-src/Utilities/Release/linux/$arch/test
+ cmake-src/Utilities/Release/linux/x86_64/test
Then create a local ``test/Dockerfile`` to prepare an image with both the
CMake source tree and the above-built package::
FROM cmake:test-base
COPY cmake-src /opt/cmake/src/cmake
- ADD out/cmake-<ver>-Linux-<arch>.tar.gz /opt/
- ENV PATH=/opt/cmake-<ver>-Linux-<arch>/bin:$PATH
+ ADD out/cmake-<ver>-Linux-x86_64.tar.gz /opt/
+ ENV PATH=/opt/cmake-<ver>-Linux-x86_64/bin:$PATH
Build the test image and run it to drive testing:
@@ -61,6 +69,10 @@ may use to produce Linux binaries for CMake:
$ docker run --network none cmake:test bash test-make.bash
$ docker run --network none cmake:test bash test-ninja.bash
+ On Windows, the test scripts are called ``test-nmake.bat`` and
+ ``test-ninja.bat``. In the ``x86`` architecture they accept one
+ argument specifying either ``x86_64`` or ``i386``.
+
.. _`kitware/cmake Docker Hub Repository`: https://hub.docker.com/r/kitware/cmake
Scripts for Kitware
diff --git a/Utilities/Release/create-cmake-release.cmake b/Utilities/Release/create-cmake-release.cmake
index 17a2151..88ac826 100644
--- a/Utilities/Release/create-cmake-release.cmake
+++ b/Utilities/Release/create-cmake-release.cmake
@@ -46,13 +46,9 @@ endfunction()
write_docs_shell_script("create-${CMAKE_CREATE_VERSION}-docs.sh")
write_rel_shell_script("create-${CMAKE_CREATE_VERSION}-macos.sh" osx_release ) # macOS x86_64
-write_rel_shell_script("create-${CMAKE_CREATE_VERSION}-win64.sh" win64_release ) # Windows x64
-write_rel_shell_script("create-${CMAKE_CREATE_VERSION}-win32.sh" win32_release ) # Windows x86
message("Build docs first and then build for each platform:
./create-${CMAKE_CREATE_VERSION}-docs.sh &&
./create-${CMAKE_CREATE_VERSION}-macos.sh &&
- ./create-${CMAKE_CREATE_VERSION}-win64.sh &&
- ./create-${CMAKE_CREATE_VERSION}-win32.sh &&
echo done
")
diff --git a/Utilities/Release/linux/x86_64/test/cache-ninja.txt b/Utilities/Release/linux/x86_64/test/cache-ninja.txt
deleted file mode 100644
index b00370e..0000000
--- a/Utilities/Release/linux/x86_64/test/cache-ninja.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-CMAKE_Fortran_COMPILER:STRING=
-CMake_TEST_IPO_WORKS_C:BOOL=ON
-CMake_TEST_IPO_WORKS_CXX:BOOL=ON
-CMake_TEST_Qt5:BOOL=ON
diff --git a/Utilities/Release/win/x86/Dockerfile b/Utilities/Release/win/x86/Dockerfile
new file mode 100644
index 0000000..a4f7445
--- /dev/null
+++ b/Utilities/Release/win/x86/Dockerfile
@@ -0,0 +1,23 @@
+# escape=`
+
+# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
+# file Copyright.txt or https://cmake.org/licensing for details.
+
+# Produce an image containing a portable CMake binary package for Windows.
+# Build using the CMake source directory as the build context.
+# The resulting image will have a 'c:\out' directory containing the package.
+
+ARG FROM_IMAGE_NAME=kitware/cmake:build-win-x86-deps-2020-04-27
+ARG FROM_IMAGE_DIGEST=@sha256:04e229c0c0ba2247855d0e8c0fb87c1686f983adbafa4ce413e61b3905edb76b
+ARG FROM_IMAGE=$FROM_IMAGE_NAME$FROM_IMAGE_DIGEST
+
+FROM $FROM_IMAGE as build
+COPY . C:\cmake\src\cmake
+ARG ARCH="x86_64"
+ARG TEST="true"
+RUN \cmake\src\cmake\Utilities\Release\win\x86\build.bat %ARCH% %TEST%
+
+# Package in a separate stage so the builder can optionally skip it.
+FROM build as pack
+ARG PACK="ZIP WIX"
+RUN \cmake\src\cmake\Utilities\Release\win\x86\pack.bat %PACK%
diff --git a/Utilities/Release/win/x86/base/Dockerfile b/Utilities/Release/win/x86/base/Dockerfile
new file mode 100644
index 0000000..c2c00f8
--- /dev/null
+++ b/Utilities/Release/win/x86/base/Dockerfile
@@ -0,0 +1,30 @@
+# escape=`
+
+# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
+# file Copyright.txt or https://cmake.org/licensing for details.
+
+# Produce a base image with a build environment for portable CMake binaries.
+# Build using the directory containing this file as its own build context.
+
+ARG FROM_IMAGE_NAME=mcr.microsoft.com/dotnet/framework/sdk:4.8-windowsservercore-ltsc2019
+ARG FROM_IMAGE_DIGEST=@sha256:a94289bfd61ba89cd162f7cf84afe0e307d4d2576b44b9bd277e7b3036ccfa6b
+ARG FROM_IMAGE=$FROM_IMAGE_NAME$FROM_IMAGE_DIGEST
+FROM $FROM_IMAGE
+
+# Use a traditional Windows shell.
+SHELL ["cmd", "/S", "/C"]
+
+# Install Visual Studio Build Tools for desktop development with C++.
+ADD https://aka.ms/vs/16/release/vs_buildtools.exe C:\TEMP\vs_buildtools.exe
+RUN C:\TEMP\vs_buildtools.exe --quiet --wait --norestart --nocache `
+ --installPath C:\BuildTools `
+ --add Microsoft.VisualStudio.Workload.VCTools `
+ --add Microsoft.VisualStudio.Component.VC.Tools.x86.x64 `
+ --add Microsoft.VisualStudio.Component.VC.CLI.Support `
+ --add Microsoft.VisualStudio.Component.VC.ATL `
+ --add Microsoft.VisualStudio.Component.Windows10SDK.18362 `
+ || IF "%ERRORLEVEL%"=="3010" EXIT 0
+RUN del C:\TEMP\vs_buildtools.exe
+
+# Add a toolchain environment loader for each architecture.
+COPY msvc-x86_64.bat msvc-i386.bat C:\
diff --git a/Utilities/Release/win/x86/base/msvc-i386.bat b/Utilities/Release/win/x86/base/msvc-i386.bat
new file mode 100755
index 0000000..a63bdd2
--- /dev/null
+++ b/Utilities/Release/win/x86/base/msvc-i386.bat
@@ -0,0 +1 @@
+@C:\BuildTools\VC\Auxiliary\Build\vcvarsall.bat x86
diff --git a/Utilities/Release/win/x86/base/msvc-x86_64.bat b/Utilities/Release/win/x86/base/msvc-x86_64.bat
new file mode 100755
index 0000000..cffe0e7
--- /dev/null
+++ b/Utilities/Release/win/x86/base/msvc-x86_64.bat
@@ -0,0 +1 @@
+@C:\BuildTools\VC\Auxiliary\Build\vcvarsall.bat x64
diff --git a/Utilities/Release/win/x86/build.bat b/Utilities/Release/win/x86/build.bat
new file mode 100755
index 0000000..2125572
--- /dev/null
+++ b/Utilities/Release/win/x86/build.bat
@@ -0,0 +1,19 @@
+@rem Distributed under the OSI-approved BSD 3-Clause License. See accompanying
+@rem file Copyright.txt or https://cmake.org/licensing for details.
+
+set ARCH=%1
+set TEST=%2
+
+copy \msvc-%ARCH%.bat \msvc.bat
+call \msvc.bat && @echo on || exit /b
+set PATH=C:\ninja;%PATH%
+
+mkdir \cmake\src\cmake-build && ^
+cd \cmake\src\cmake-build && ^
+copy ..\cmake\Utilities\Release\win\x86\cache-%ARCH%.txt CMakeCache.txt && ^
+\cmake\cmake\bin\cmake ..\cmake -GNinja && ^
+ninja && (
+ if "%TEST%"=="true" (
+ bin\ctest --output-on-failure -j %NUMBER_OF_PROCESSORS% -R "^(CMake\.|CMakeLib\.|CMakeServerLib\.|RunCMake\.ctest_memcheck)"
+ )
+)
diff --git a/Utilities/Release/win/x86/cache-i386.txt b/Utilities/Release/win/x86/cache-i386.txt
new file mode 100644
index 0000000..3c0ecc7
--- /dev/null
+++ b/Utilities/Release/win/x86/cache-i386.txt
@@ -0,0 +1,45 @@
+CMAKE_BUILD_TYPE:STRING=Release
+
+# Use APIs from at most Windows 7
+CMAKE_C_FLAGS:STRING=-D_WIN32_WINNT=0x601 -DNTDDI_VERSION=0x06010000
+CMAKE_CXX_FLAGS:STRING=-GR -EHsc -D_WIN32_WINNT=0x601 -DNTDDI_VERSION=0x06010000
+CMAKE_EXE_LINKER_FLAGS:STRING=-machine:x86 -subsystem:console,6.01
+
+# Link C/C++ runtime library statically.
+CMAKE_MSVC_RUNTIME_LIBRARY:STRING=MultiThreaded$<$<CONFIG:Debug>:Debug>
+
+# No ssl support in curl: use native Windows APIs.
+CMAKE_USE_OPENSSL:BOOL=OFF
+
+# Enable cmake-gui with static qt plugins
+BUILD_QtDialog:BOOL=TRUE
+CMake_GUI_DISTRIBUTE_WITH_Qt_LGPL:STRING=3
+CMAKE_PREFIX_PATH:STRING=C:/qt-i386
+CMake_QT_STATIC_QWindowsIntegrationPlugin_LIBRARIES:STRING=c:/qt-i386/plugins/platforms/qwindows.lib;c:/qt-i386/plugins/styles/qwindowsvistastyle.lib;c:/qt-i386/lib/Qt5EventDispatcherSupport.lib;c:/qt-i386/lib/Qt5FontDatabaseSupport.lib;c:/qt-i386/lib/Qt5ThemeSupport.lib;c:/qt-i386/lib/qtfreetype.lib;c:/qt-i386/lib/qtlibpng.lib;imm32.lib;wtsapi32.lib
+
+# Build documentation.
+CMAKE_DOC_DIR:STRING=doc/cmake
+PYTHON_EXECUTABLE:FILEPATH=C:/python3/python.exe
+SPHINX_EXECUTABLE:FILEPATH=C:/python3/Scripts/sphinx-build.exe
+SPHINX_HTML:BOOL=ON
+SPHINX_MAN:BOOL=ON
+SPHINX_QTHELP:BOOL=ON
+QCOLLECTIONGENERATOR_EXECUTABLE:PATH=C:/qt-i386/bin/qhelpgenerator.exe
+
+# No bootstrap with MSVC tools.
+CMAKE_SKIP_BOOTSTRAP_TEST:STRING=TRUE
+
+# No MFC in base image.
+CTEST_RUN_MFC:BOOL=OFF
+
+# No Fortran compiler.
+CMAKE_Fortran_COMPILER:FILEPATH=FALSE
+
+# No Swift compiler.
+CMAKE_Swift_COMPILER:FILEPATH=FALSE
+
+# Skip Qt5 tests because our Qt is static.
+CMake_TEST_Qt5:BOOL=FALSE
+
+# CPack package file name component for this platform.
+CPACK_SYSTEM_NAME:STRING=win32-x86
diff --git a/Utilities/Release/win/x86/cache-x86_64.txt b/Utilities/Release/win/x86/cache-x86_64.txt
new file mode 100644
index 0000000..2ccf93b
--- /dev/null
+++ b/Utilities/Release/win/x86/cache-x86_64.txt
@@ -0,0 +1,45 @@
+CMAKE_BUILD_TYPE:STRING=Release
+
+# Use APIs from at most Windows 7
+CMAKE_C_FLAGS:STRING=-D_WIN32_WINNT=0x601 -DNTDDI_VERSION=0x06010000
+CMAKE_CXX_FLAGS:STRING=-GR -EHsc -D_WIN32_WINNT=0x601 -DNTDDI_VERSION=0x06010000
+CMAKE_EXE_LINKER_FLAGS:STRING=-machine:x64 -subsystem:console,6.01
+
+# Link C/C++ runtime library statically.
+CMAKE_MSVC_RUNTIME_LIBRARY:STRING=MultiThreaded$<$<CONFIG:Debug>:Debug>
+
+# No ssl support in curl: use native Windows APIs.
+CMAKE_USE_OPENSSL:BOOL=OFF
+
+# Enable cmake-gui with static qt plugins
+BUILD_QtDialog:BOOL=TRUE
+CMake_GUI_DISTRIBUTE_WITH_Qt_LGPL:STRING=3
+CMAKE_PREFIX_PATH:STRING=C:/qt-x86_64
+CMake_QT_STATIC_QWindowsIntegrationPlugin_LIBRARIES:STRING=c:/qt-x86_64/plugins/platforms/qwindows.lib;c:/qt-x86_64/plugins/styles/qwindowsvistastyle.lib;c:/qt-x86_64/lib/Qt5EventDispatcherSupport.lib;c:/qt-x86_64/lib/Qt5FontDatabaseSupport.lib;c:/qt-x86_64/lib/Qt5ThemeSupport.lib;c:/qt-x86_64/lib/qtfreetype.lib;c:/qt-x86_64/lib/qtlibpng.lib;imm32.lib;wtsapi32.lib
+
+# Build documentation.
+CMAKE_DOC_DIR:STRING=doc/cmake
+PYTHON_EXECUTABLE:FILEPATH=C:/python3/python.exe
+SPHINX_EXECUTABLE:FILEPATH=C:/python3/Scripts/sphinx-build.exe
+SPHINX_HTML:BOOL=ON
+SPHINX_MAN:BOOL=ON
+SPHINX_QTHELP:BOOL=ON
+QCOLLECTIONGENERATOR_EXECUTABLE:PATH=C:/qt-x86_64/bin/qhelpgenerator.exe
+
+# No bootstrap with MSVC tools.
+CMAKE_SKIP_BOOTSTRAP_TEST:STRING=TRUE
+
+# No MFC in base image.
+CTEST_RUN_MFC:BOOL=OFF
+
+# No Fortran compiler.
+CMAKE_Fortran_COMPILER:FILEPATH=FALSE
+
+# No Swift compiler.
+CMAKE_Swift_COMPILER:FILEPATH=FALSE
+
+# Skip Qt5 tests because our Qt is static.
+CMake_TEST_Qt5:BOOL=FALSE
+
+# CPack package file name component for this platform.
+CPACK_SYSTEM_NAME:STRING=win64-x64
diff --git a/Utilities/Release/win/x86/deps/Dockerfile b/Utilities/Release/win/x86/deps/Dockerfile
new file mode 100644
index 0000000..4b294c1
--- /dev/null
+++ b/Utilities/Release/win/x86/deps/Dockerfile
@@ -0,0 +1,127 @@
+# escape=`
+
+# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
+# file Copyright.txt or https://cmake.org/licensing for details.
+
+# Produce an image with custom-built dependencies for portable CMake binaries.
+# Build using the directory containing this file as its own build context.
+
+ARG FROM_IMAGE_NAME=kitware/cmake:build-win-x86-base-2020-04-27
+ARG FROM_IMAGE_DIGEST=@sha256:c5a8948d636319cdac0180266996558bb6fb037125792b5b837f069d02e53d7c
+ARG FROM_IMAGE=$FROM_IMAGE_NAME$FROM_IMAGE_DIGEST
+
+# Qt Source
+FROM $FROM_IMAGE AS qt-src
+
+# JOM
+ADD http://download.qt-project.org/official_releases/jom/unstable-jom.zip C:\jom\jom.zip
+RUN cd \jom `
+ && powershell -Command " `
+ if ($(Get-FileHash jom.zip).Hash -eq '128fdd846fe24f8594eed37d1d8929a0ea78df563537c0c1b1861a635013fff8') {`
+ Expand-Archive -Path jom.zip -DestinationPath .`
+ } else {`
+ exit 1 `
+ }" `
+ && del jom.zip
+
+# XZ
+ADD https://tukaani.org/xz/xz-5.2.5-windows.zip C:\xz\xz.zip
+RUN cd \xz `
+ && powershell -Command " `
+ if ($(Get-FileHash xz.zip).Hash -eq 'd83b82ca75dfab39a13dda364367b34970c781a9df4d41264db922ac3a8f622d') {`
+ Expand-Archive -Path xz.zip -DestinationPath .`
+ } else {`
+ exit 1 `
+ }" `
+ && del xz.zip
+
+# Git
+ADD https://github.com/git-for-windows/git/releases/download/v2.26.2.windows.1/MinGit-2.26.2-busybox-64-bit.zip C:\git\git.zip
+RUN cd \git `
+ && powershell -Command " `
+ if ($(Get-FileHash git.zip).Hash -eq 'e834ea73fe093fb180dc45f67a1f2a7a566dab53d1d45bc3cd150106f5c40520') {`
+ Expand-Archive -Path git.zip -DestinationPath .`
+ } else {`
+ exit 1 `
+ }" `
+ && del git.zip
+
+# Qt Source
+ADD https://download.qt.io/official_releases/qt/5.12/5.12.1/single/qt-everywhere-src-5.12.1.tar.xz C:\qt-src\qt.tar.xz
+RUN cd \qt-src `
+ && powershell -Command " `
+ if ($(Get-FileHash qt.tar.xz).Hash -eq 'caffbd625c7bc10ff8c5c7a27dbc7d84fa4de146975c0e1ffe904b514ccd6da4') {`
+ \xz\bin_x86-64\xz -d qt.tar.xz `
+ } else {`
+ exit 1 `
+ }" `
+ && tar xvf qt.tar `
+ && del qt.tar `
+ && move qt-everywhere-src-5.12.1 qt
+COPY qt-build.bat qt-install.patch C:\qt-src\
+
+# Qt Build i386
+FROM qt-src as qt-i386
+RUN \qt-src\qt-build.bat i386
+
+# Qt Build x86_64
+FROM qt-src as qt-x86_64
+RUN \qt-src\qt-build.bat x86_64
+
+# Output Stage
+FROM $FROM_IMAGE
+
+# Qt
+COPY --from=qt-i386 C:\qt-i386 C:\qt-i386
+COPY --from=qt-x86_64 C:\qt-x86_64 C:\qt-x86_64
+
+# WIX
+ADD https://github.com/wixtoolset/wix3/releases/download/wix3112rtm/wix311-binaries.zip C:\wix\wix.zip
+RUN cd \wix `
+ && powershell -Command " `
+ if ($(Get-FileHash wix.zip).Hash -eq '2c1888d5d1dba377fc7fa14444cf556963747ff9a0a289a3599cf09da03b9e2e') {`
+ Expand-Archive -Path wix.zip -DestinationPath .`
+ } else {`
+ exit 1 `
+ }" `
+ && del wix.zip
+
+# Python and Sphinx
+ADD https://www.python.org/ftp/python/3.8.2/python-3.8.2-embed-amd64.zip C:\python3\python3.zip
+RUN cd \python3 `
+ && powershell -Command " `
+ if ($(Get-FileHash python3.zip).Hash -eq '2927a3a6d0fe1f6e047a86059220aeda374eed23113b9ef5355acb8452d56453') {`
+ Expand-Archive -Path python3.zip -DestinationPath .`
+ } else {`
+ exit 1 `
+ }" `
+ && del python3.zip `
+ && curl -O https://bootstrap.pypa.io/get-pip.py `
+ && python get-pip.py `
+ && del python38._pth `
+ && set "PY_LIBS=C:\python3\Lib;C:\Python3\Lib\site-packages" `
+ && set "PY_PIP=C:\python3\Scripts" `
+ && Scripts\pip install --no-warn-script-location sphinx==2.1.2
+
+# Ninja
+ADD https://github.com/ninja-build/ninja/releases/download/v1.10.0/ninja-win.zip C:\ninja\ninja.zip
+RUN cd \ninja `
+ && powershell -Command " `
+ if ($(Get-FileHash ninja.zip).Hash -eq '919fd158c16bf135e8a850bb4046ec1ce28a7439ee08b977cd0b7f6b3463d178') {`
+ Expand-Archive -Path ninja.zip -DestinationPath .`
+ } else {`
+ exit 1 `
+ }" `
+ && del ninja.zip
+
+# CMake
+ADD https://github.com/Kitware/CMake/releases/download/v3.17.1/cmake-3.17.1-win64-x64.zip C:\cmake\cmake.zip
+RUN cd \cmake `
+ && powershell -Command " `
+ if ($(Get-FileHash cmake.zip).Hash -eq 'a5af7a2fe73f34070456397e940042e4469f072126c82974f44333ac43d478b1') {`
+ Expand-Archive -Path cmake.zip -DestinationPath .`
+ } else {`
+ exit 1 `
+ }" `
+ && move cmake-*-win64-x64 cmake `
+ && del cmake.zip
diff --git a/Utilities/Release/win/x86/deps/qt-build.bat b/Utilities/Release/win/x86/deps/qt-build.bat
new file mode 100755
index 0000000..e8bfa81
--- /dev/null
+++ b/Utilities/Release/win/x86/deps/qt-build.bat
@@ -0,0 +1,47 @@
+set ARCH=%1
+call \msvc-%ARCH%.bat && @echo on || exit /b
+mkdir \qt-src\qt-build && ^
+cd \qt-src\qt-build && ^
+..\qt\configure.bat ^
+ -prefix C:/qt-%ARCH% ^
+ -static ^
+ -static-runtime ^
+ -release ^
+ -opensource -confirm-license ^
+ -platform win32-msvc ^
+ -mp ^
+ -gui ^
+ -widgets ^
+ -qt-pcre ^
+ -qt-zlib ^
+ -qt-libpng ^
+ -qt-libjpeg ^
+ -no-gif ^
+ -no-icu ^
+ -no-pch ^
+ -no-angle ^
+ -no-opengl ^
+ -no-dbus ^
+ -no-harfbuzz ^
+ -no-accessibility ^
+ -skip declarative ^
+ -skip multimedia ^
+ -skip qtcanvas3d ^
+ -skip qtconnectivity ^
+ -skip qtdeclarative ^
+ -skip qtlocation ^
+ -skip qtmultimedia ^
+ -skip qtsensors ^
+ -skip qtserialport ^
+ -skip qtsvg ^
+ -skip qtwayland ^
+ -skip qtwebchannel ^
+ -skip qtwebengine ^
+ -skip qtwebsockets ^
+ -skip qtxmlpatterns ^
+ -nomake examples -nomake tests ^
+ && ^
+\jom\jom.exe -J %NUMBER_OF_PROCESSORS% && ^
+\jom\jom.exe install && ^
+cd \qt-%ARCH% && ^
+\git\cmd\git apply \qt-src\qt-install.patch
diff --git a/Utilities/Release/win/x86/deps/qt-install.patch b/Utilities/Release/win/x86/deps/qt-install.patch
new file mode 100644
index 0000000..39a649e
--- /dev/null
+++ b/Utilities/Release/win/x86/deps/qt-install.patch
@@ -0,0 +1,26 @@
+diff --git a/lib/cmake/Qt5Core/Qt5CoreConfig.cmake b/lib/cmake/Qt5Core/Qt5CoreConfig.cmake
+index 04ec302..75d5596 100644
+--- a/lib/cmake/Qt5Core/Qt5CoreConfig.cmake
++++ b/lib/cmake/Qt5Core/Qt5CoreConfig.cmake
+@@ -118,7 +118,7 @@ if (NOT TARGET Qt5::Core)
+ list(REMOVE_DUPLICATES Qt5Core_COMPILE_DEFINITIONS)
+ list(REMOVE_DUPLICATES Qt5Core_EXECUTABLE_COMPILE_FLAGS)
+
+- set(_Qt5Core_LIB_DEPENDENCIES "")
++ set(_Qt5Core_LIB_DEPENDENCIES "${_qt5Core_install_prefix}/lib/qtpcre2.lib;netapi32.lib;version.lib")
+
+
+ add_library(Qt5::Core STATIC IMPORTED)
+diff --git a/lib/cmake/Qt5Widgets/Qt5WidgetsConfig.cmake b/lib/cmake/Qt5Widgets/Qt5WidgetsConfig.cmake
+index a07b953..2e07371 100644
+--- a/lib/cmake/Qt5Widgets/Qt5WidgetsConfig.cmake
++++ b/lib/cmake/Qt5Widgets/Qt5WidgetsConfig.cmake
+@@ -118,7 +118,7 @@ if (NOT TARGET Qt5::Widgets)
+ list(REMOVE_DUPLICATES Qt5Widgets_COMPILE_DEFINITIONS)
+ list(REMOVE_DUPLICATES Qt5Widgets_EXECUTABLE_COMPILE_FLAGS)
+
+- set(_Qt5Widgets_LIB_DEPENDENCIES "Qt5::Gui;Qt5::Core")
++ set(_Qt5Widgets_LIB_DEPENDENCIES "Qt5::Gui;Qt5::Core;dwmapi.lib;uxtheme.lib")
+
+
+ add_library(Qt5::Widgets STATIC IMPORTED)
diff --git a/Utilities/Release/win/x86/pack.bat b/Utilities/Release/win/x86/pack.bat
new file mode 100755
index 0000000..2d37eef
--- /dev/null
+++ b/Utilities/Release/win/x86/pack.bat
@@ -0,0 +1,12 @@
+@rem Distributed under the OSI-approved BSD 3-Clause License. See accompanying
+@rem file Copyright.txt or https://cmake.org/licensing for details.
+
+call \msvc.bat && @echo on || exit /b
+set PATH=C:\wix;C:\ninja;%PATH%
+cd \cmake\src\cmake-build && (
+ for %%p in (%*) do (
+ bin\cpack -G %%p
+ )
+) && ^
+mkdir \out && ^
+move cmake-*-win* \out
diff --git a/Utilities/Release/win/x86/test/Dockerfile b/Utilities/Release/win/x86/test/Dockerfile
new file mode 100644
index 0000000..15bcd37
--- /dev/null
+++ b/Utilities/Release/win/x86/test/Dockerfile
@@ -0,0 +1,37 @@
+# escape=`
+
+# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
+# file Copyright.txt or https://cmake.org/licensing for details.
+
+# Produce a base image with a test environment for packaged CMake binaries.
+# Build using the directory containing this file as its own build context.
+
+ARG FROM_IMAGE_NAME=kitware/cmake:build-win-x86-base-2020-04-27
+ARG FROM_IMAGE_DIGEST=@sha256:c5a8948d636319cdac0180266996558bb6fb037125792b5b837f069d02e53d7c
+ARG FROM_IMAGE=$FROM_IMAGE_NAME$FROM_IMAGE_DIGEST
+FROM $FROM_IMAGE
+
+# Python
+ADD https://www.python.org/ftp/python/3.8.2/python-3.8.2-embed-amd64.zip C:\python3\python3.zip
+RUN cd \python3 `
+ && powershell -Command " `
+ if ($(Get-FileHash python3.zip).Hash -eq '2927a3a6d0fe1f6e047a86059220aeda374eed23113b9ef5355acb8452d56453') {`
+ Expand-Archive -Path python3.zip -DestinationPath .`
+ } else {`
+ exit 1 `
+ }" `
+ && del python3.zip `
+ && del python38._pth
+
+# Ninja
+ADD https://github.com/ninja-build/ninja/releases/download/v1.10.0/ninja-win.zip C:\ninja\ninja.zip
+RUN cd \ninja `
+ && powershell -Command " `
+ if ($(Get-FileHash ninja.zip).Hash -eq '919fd158c16bf135e8a850bb4046ec1ce28a7439ee08b977cd0b7f6b3463d178') {`
+ Expand-Archive -Path ninja.zip -DestinationPath .`
+ } else {`
+ exit 1 `
+ }" `
+ && del ninja.zip
+
+COPY test-nmake.bat test-ninja.bat C:\
diff --git a/Utilities/Release/win/x86/test/test-ninja.bat b/Utilities/Release/win/x86/test/test-ninja.bat
new file mode 100755
index 0000000..b8347ef
--- /dev/null
+++ b/Utilities/Release/win/x86/test/test-ninja.bat
@@ -0,0 +1,19 @@
+@rem Distributed under the OSI-approved BSD 3-Clause License. See accompanying
+@rem file Copyright.txt or https://cmake.org/licensing for details.
+
+set ARCH=%1
+call \msvc-%ARCH%.bat && @echo on || exit /b
+set "PATH=C:\cmake\cmake\bin;C:\ninja;C:\python3;%PATH%"
+mkdir \cmake\src\cmake-ninja && ^
+cd \cmake\src\cmake-ninja && ^
+> CMakeCache.txt (
+ @echo CMAKE_Fortran_COMPILER:STRING=
+ @echo CMAKE_Swift_COMPILER:STRING=
+ @echo CMake_TEST_IPO_WORKS_C:BOOL=ON
+ @echo CMake_TEST_IPO_WORKS_CXX:BOOL=ON
+ @echo CMake_TEST_NO_NETWORK:BOOL=ON
+ @echo CTEST_RUN_MFC:BOOL=OFF
+) && ^
+cmake ..\cmake -DCMake_TEST_HOST_CMAKE=1 -G "Ninja" && ^
+ninja && ^
+ctest --output-on-failure -j %NUMBER_OF_PROCESSORS%
diff --git a/Utilities/Release/win/x86/test/test-nmake.bat b/Utilities/Release/win/x86/test/test-nmake.bat
new file mode 100755
index 0000000..5008711
--- /dev/null
+++ b/Utilities/Release/win/x86/test/test-nmake.bat
@@ -0,0 +1,19 @@
+@rem Distributed under the OSI-approved BSD 3-Clause License. See accompanying
+@rem file Copyright.txt or https://cmake.org/licensing for details.
+
+set ARCH=%1
+call \msvc-%ARCH%.bat && @echo on || exit /b
+set "PATH=C:\cmake\cmake\bin;C:\python3;%PATH%"
+mkdir \cmake\src\cmake-nmake && ^
+cd \cmake\src\cmake-nmake && ^
+> CMakeCache.txt (
+ @echo CMAKE_Fortran_COMPILER:STRING=
+ @echo CMAKE_Swift_COMPILER:STRING=
+ @echo CMake_TEST_IPO_WORKS_C:BOOL=ON
+ @echo CMake_TEST_IPO_WORKS_CXX:BOOL=ON
+ @echo CMake_TEST_NO_NETWORK:BOOL=ON
+ @echo CTEST_RUN_MFC:BOOL=OFF
+) && ^
+cmake ..\cmake -DCMake_TEST_HOST_CMAKE=1 -G "NMake Makefiles" && ^
+nmake && ^
+ctest --output-on-failure -j %NUMBER_OF_PROCESSORS%
diff --git a/Utilities/Release/win32_release.cmake b/Utilities/Release/win32_release.cmake
deleted file mode 100644
index 14e5cba..0000000
--- a/Utilities/Release/win32_release.cmake
+++ /dev/null
@@ -1,52 +0,0 @@
-set(CMAKE_RELEASE_DIRECTORY "c:/msys64/home/dashboard/CMakeReleaseDirectory32")
-set(CONFIGURE_WITH_CMAKE TRUE)
-set(CMAKE_CONFIGURE_PATH "c:/Program\\ Files/CMake/bin/cmake.exe")
-set(PROCESSORS 16)
-set(HOST win32)
-set(RUN_LAUNCHER ~/rel/run)
-set(CPACK_BINARY_GENERATORS "WIX ZIP")
-set(CPACK_SOURCE_GENERATORS "")
-set(MAKE_PROGRAM "ninja")
-set(MAKE "${MAKE_PROGRAM} -j16")
-set(qt_prefix "c:/Qt/5.12.1/msvc2017-32-w7-mt")
-set(qt_win_libs
- ${qt_prefix}/plugins/platforms/qwindows.lib
- ${qt_prefix}/plugins/styles/qwindowsvistastyle.lib
- ${qt_prefix}/lib/Qt5EventDispatcherSupport.lib
- ${qt_prefix}/lib/Qt5FontDatabaseSupport.lib
- ${qt_prefix}/lib/Qt5ThemeSupport.lib
- ${qt_prefix}/lib/qtfreetype.lib
- ${qt_prefix}/lib/qtlibpng.lib
- imm32.lib
- wtsapi32.lib
- )
-set(INITIAL_CACHE "CMAKE_BUILD_TYPE:STRING=Release
-CMAKE_DOC_DIR:STRING=doc/cmake
-CMAKE_USE_OPENSSL:BOOL=OFF
-CMAKE_SKIP_BOOTSTRAP_TEST:STRING=TRUE
-CMAKE_Fortran_COMPILER:FILEPATH=FALSE
-CMAKE_GENERATOR:INTERNAL=Ninja
-BUILD_QtDialog:BOOL=TRUE
-CMake_GUI_DISTRIBUTE_WITH_Qt_LGPL:STRING=3
-CMAKE_MSVC_RUNTIME_LIBRARY:STRING=MultiThreaded$<$<CONFIG:Debug>:Debug>
-CMAKE_EXE_LINKER_FLAGS:STRING=-machine:x86 -subsystem:console,6.01
-CMake_QT_STATIC_QWindowsIntegrationPlugin_LIBRARIES:STRING=${qt_win_libs}
-CMAKE_PREFIX_PATH:STRING=${qt_prefix}
-CMake_TEST_Qt4:BOOL=OFF
-CMake_TEST_Qt5:BOOL=OFF
-")
-set(ppflags "-D_WIN32_WINNT=0x601 -DNTDDI_VERSION=0x06010000")
-set(CFLAGS "${ppflags}")
-set(CXXFLAGS "${ppflags}")
-set(ENV ". ~/rel/env32")
-get_filename_component(path "${CMAKE_CURRENT_LIST_FILE}" PATH)
-set(GIT_EXTRA "git config core.autocrlf true")
-if(CMAKE_CREATE_VERSION STREQUAL "nightly")
- # Some tests fail spuriously too often.
- set(EXTRA_CTEST_ARGS "-E 'ConsoleBuf|Module.ExternalData'")
- set(SIGN "")
-else()
- string(APPEND INITIAL_CACHE "CMake_INSTALL_SIGNTOOL:STRING=signtool\n")
- set(SIGN [[signtool sign -v -a -tr http://timestamp.digicert.com -fd sha256 -td sha256 -d "CMake Windows Installer" cmake-*.msi]])
-endif()
-include(${path}/release_cmake.cmake)
diff --git a/Utilities/Release/win64_release.cmake b/Utilities/Release/win64_release.cmake
deleted file mode 100644
index 149d378..0000000
--- a/Utilities/Release/win64_release.cmake
+++ /dev/null
@@ -1,52 +0,0 @@
-set(CMAKE_RELEASE_DIRECTORY "c:/msys64/home/dashboard/CMakeReleaseDirectory64")
-set(CONFIGURE_WITH_CMAKE TRUE)
-set(CMAKE_CONFIGURE_PATH "c:/Program\\ Files/CMake/bin/cmake.exe")
-set(PROCESSORS 16)
-set(HOST win64)
-set(RUN_LAUNCHER ~/rel/run)
-set(CPACK_BINARY_GENERATORS "WIX ZIP")
-set(CPACK_SOURCE_GENERATORS "")
-set(MAKE_PROGRAM "ninja")
-set(MAKE "${MAKE_PROGRAM} -j16")
-set(qt_prefix "c:/Qt/5.12.1/msvc2017-64-w7-mt")
-set(qt_win_libs
- ${qt_prefix}/plugins/platforms/qwindows.lib
- ${qt_prefix}/plugins/styles/qwindowsvistastyle.lib
- ${qt_prefix}/lib/Qt5EventDispatcherSupport.lib
- ${qt_prefix}/lib/Qt5FontDatabaseSupport.lib
- ${qt_prefix}/lib/Qt5ThemeSupport.lib
- ${qt_prefix}/lib/qtfreetype.lib
- ${qt_prefix}/lib/qtlibpng.lib
- imm32.lib
- wtsapi32.lib
- )
-set(INITIAL_CACHE "CMAKE_BUILD_TYPE:STRING=Release
-CMAKE_DOC_DIR:STRING=doc/cmake
-CMAKE_USE_OPENSSL:BOOL=OFF
-CMAKE_SKIP_BOOTSTRAP_TEST:STRING=TRUE
-CMAKE_Fortran_COMPILER:FILEPATH=FALSE
-CMAKE_GENERATOR:INTERNAL=Ninja
-BUILD_QtDialog:BOOL=TRUE
-CMake_GUI_DISTRIBUTE_WITH_Qt_LGPL:STRING=3
-CMAKE_MSVC_RUNTIME_LIBRARY:STRING=MultiThreaded$<$<CONFIG:Debug>:Debug>
-CMAKE_EXE_LINKER_FLAGS:STRING=-machine:x64 -subsystem:console,6.01
-CMake_QT_STATIC_QWindowsIntegrationPlugin_LIBRARIES:STRING=${qt_win_libs}
-CMAKE_PREFIX_PATH:STRING=${qt_prefix}
-CMake_TEST_Qt4:BOOL=OFF
-CMake_TEST_Qt5:BOOL=OFF
-")
-set(ppflags "-D_WIN32_WINNT=0x601 -DNTDDI_VERSION=0x06010000")
-set(CFLAGS "${ppflags}")
-set(CXXFLAGS "${ppflags}")
-set(ENV ". ~/rel/env64")
-get_filename_component(path "${CMAKE_CURRENT_LIST_FILE}" PATH)
-set(GIT_EXTRA "git config core.autocrlf true")
-if(CMAKE_CREATE_VERSION STREQUAL "nightly")
- # Some tests fail spuriously too often.
- set(EXTRA_CTEST_ARGS "-E 'ConsoleBuf|Module.ExternalData'")
- set(SIGN "")
-else()
- string(APPEND INITIAL_CACHE "CMake_INSTALL_SIGNTOOL:STRING=signtool\n")
- set(SIGN [[signtool sign -v -a -tr http://timestamp.digicert.com -fd sha256 -td sha256 -d "CMake Windows Installer" cmake-*.msi]])
-endif()
-include(${path}/release_cmake.cmake)
diff --git a/Utilities/Scripts/update-bzip2.bash b/Utilities/Scripts/update-bzip2.bash
new file mode 100755
index 0000000..83439d1
--- /dev/null
+++ b/Utilities/Scripts/update-bzip2.bash
@@ -0,0 +1,27 @@
+#!/usr/bin/env bash
+
+set -e
+set -x
+shopt -s dotglob
+
+readonly name="bzip2"
+readonly ownership="bzip2 upstream <kwrobot@kitware.com>"
+readonly subtree="Utilities/cmbzip2"
+readonly repo="https://sourceware.org/git/bzip2.git"
+readonly tag="bzip2-1.0.8"
+readonly shortlog=false
+readonly paths="
+ LICENSE
+ README
+ *.c
+ *.h
+"
+
+extract_source () {
+ git_archive
+ pushd "${extractdir}/${name}-reduced"
+ echo "* -whitespace" > .gitattributes
+ popd
+}
+
+. "${BASH_SOURCE%/*}/update-third-party.bash"
diff --git a/Utilities/Scripts/update-curl.bash b/Utilities/Scripts/update-curl.bash
index 5c2a331..bad88fe 100755
--- a/Utilities/Scripts/update-curl.bash
+++ b/Utilities/Scripts/update-curl.bash
@@ -8,7 +8,7 @@ readonly name="curl"
readonly ownership="Curl Upstream <curl-library@cool.haxx.se>"
readonly subtree="Utilities/cmcurl"
readonly repo="https://github.com/curl/curl.git"
-readonly tag="curl-7_65_0"
+readonly tag="curl-7_69_0"
readonly shortlog=false
readonly paths="
CMake/*
@@ -23,6 +23,10 @@ readonly paths="
lib/libcurl.rc
lib/vauth/*.c
lib/vauth/*.h
+ lib/vquic/*.c
+ lib/vquic/*.h
+ lib/vssh/*.c
+ lib/vssh/*.h
lib/vtls/*.c
lib/vtls/*.h
"
diff --git a/Utilities/Scripts/update-libarchive.bash b/Utilities/Scripts/update-libarchive.bash
index 3188658..3db89ff 100755
--- a/Utilities/Scripts/update-libarchive.bash
+++ b/Utilities/Scripts/update-libarchive.bash
@@ -8,7 +8,7 @@ readonly name="LibArchive"
readonly ownership="LibArchive Upstream <libarchive-discuss@googlegroups.com>"
readonly subtree="Utilities/cmlibarchive"
readonly repo="https://github.com/libarchive/libarchive.git"
-readonly tag="v3.3.3"
+readonly tag="v3.4.2"
readonly shortlog=false
readonly paths="
CMakeLists.txt
@@ -25,6 +25,7 @@ extract_source () {
git_archive
pushd "${extractdir}/${name}-reduced"
fromdos build/cmake/Find*.cmake
+ echo "* -whitespace" > .gitattributes
popd
}
diff --git a/Utilities/Scripts/update-librhash.bash b/Utilities/Scripts/update-librhash.bash
index 009ce32..ea7e655 100755
--- a/Utilities/Scripts/update-librhash.bash
+++ b/Utilities/Scripts/update-librhash.bash
@@ -8,11 +8,10 @@ readonly name="librhash"
readonly ownership="librhash upstream <kwrobot@kitware.com>"
readonly subtree="Utilities/cmlibrhash"
readonly repo="https://github.com/rhash/rhash.git"
-readonly tag="master"
+readonly tag="v1.3.9"
readonly shortlog=false
readonly paths="
COPYING
- README
librhash/algorithms.c
librhash/algorithms.h
librhash/byte_order.c
diff --git a/Utilities/Scripts/update-nghttp2.bash b/Utilities/Scripts/update-nghttp2.bash
new file mode 100755
index 0000000..07a8f13
--- /dev/null
+++ b/Utilities/Scripts/update-nghttp2.bash
@@ -0,0 +1,30 @@
+#!/usr/bin/env bash
+
+set -e
+set -x
+shopt -s dotglob
+
+readonly name="nghttp2"
+readonly ownership="nghttp2 upstream <kwrobot@kitware.com>"
+readonly subtree="Utilities/cmnghttp2"
+readonly repo="https://github.com/nghttp2/nghttp2.git"
+readonly tag="v1.40.0"
+readonly shortlog=false
+readonly paths="
+ COPYING
+ lib/*.c
+ lib/*.h
+ lib/includes/nghttp2/nghttp2.h
+ lib/includes/nghttp2/nghttp2ver.h.in
+"
+
+extract_source () {
+ git_archive
+ pushd "${extractdir}/${name}-reduced"
+ echo "* -whitespace" > .gitattributes
+ mv lib/includes/nghttp2/nghttp2ver.h.in lib/includes/nghttp2/nghttp2ver.h
+ sed -i 's/@PACKAGE_VERSION@/1.40.0/;s/@PACKAGE_VERSION_NUM@/0x012800/' lib/includes/nghttp2/nghttp2ver.h
+ popd
+}
+
+. "${BASH_SOURCE%/*}/update-third-party.bash"
diff --git a/Utilities/Sphinx/CMakeLists.txt b/Utilities/Sphinx/CMakeLists.txt
index 17c5018..e5be43a 100644
--- a/Utilities/Sphinx/CMakeLists.txt
+++ b/Utilities/Sphinx/CMakeLists.txt
@@ -89,7 +89,7 @@ if(SPHINX_QTHELP)
find_package(PythonInterp REQUIRED)
find_program(QCOLLECTIONGENERATOR_EXECUTABLE
- NAMES qcollectiongenerator
+ NAMES qcollectiongenerator-qt5 qcollectiongenerator
DOC "qcollectiongenerator tool"
)
if (NOT QCOLLECTIONGENERATOR_EXECUTABLE)
diff --git a/Utilities/Sphinx/CTestConfig.cmake b/Utilities/Sphinx/CTestConfig.cmake
new file mode 100644
index 0000000..9607e38
--- /dev/null
+++ b/Utilities/Sphinx/CTestConfig.cmake
@@ -0,0 +1,14 @@
+# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
+# file Copyright.txt or https://cmake.org/licensing for details.
+
+# If changing this file, also update CTestConfig.cmake
+
+set(CTEST_PROJECT_NAME "CMake")
+set(CTEST_NIGHTLY_START_TIME "1:00:00 UTC")
+
+set(CTEST_DROP_METHOD "http")
+set(CTEST_DROP_SITE "open.cdash.org")
+set(CTEST_DROP_LOCATION "/submit.php?project=CMake")
+set(CTEST_DROP_SITE_CDASH TRUE)
+set(CTEST_CDASH_VERSION "1.6")
+set(CTEST_CDASH_QUERY_VERSION TRUE)
diff --git a/Utilities/cm3p/Setup.Configuration.h b/Utilities/cm3p/Setup.Configuration.h
new file mode 100644
index 0000000..a5cf058
--- /dev/null
+++ b/Utilities/cm3p/Setup.Configuration.h
@@ -0,0 +1,8 @@
+/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
+ file Copyright.txt or https://cmake.org/licensing for details. */
+#ifndef cm3p_Setup_Configuration_h
+#define cm3p_Setup_Configuration_h
+
+#include <cmvssetup/Setup.Configuration.h> // IWYU pragma: export
+
+#endif
diff --git a/Utilities/cm_libarchive.h b/Utilities/cm3p/archive.h
index ea8e9db..956b3ab 100644
--- a/Utilities/cm_libarchive.h
+++ b/Utilities/cm3p/archive.h
@@ -1,16 +1,14 @@
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
-#ifndef cm_libarchive_h
-#define cm_libarchive_h
+#ifndef cm3p_archive_h
+#define cm3p_archive_h
/* Use the libarchive configured for CMake. */
#include "cmThirdParty.h"
#ifdef CMAKE_USE_SYSTEM_LIBARCHIVE
-# include <archive.h>
-# include <archive_entry.h>
+# include <archive.h> // IWYU pragma: export
#else
-# include <cmlibarchive/libarchive/archive.h>
-# include <cmlibarchive/libarchive/archive_entry.h>
+# include <cmlibarchive/libarchive/archive.h> // IWYU pragma: export
#endif
#endif
diff --git a/Utilities/cm3p/archive_entry.h b/Utilities/cm3p/archive_entry.h
new file mode 100644
index 0000000..230e87a
--- /dev/null
+++ b/Utilities/cm3p/archive_entry.h
@@ -0,0 +1,14 @@
+/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
+ file Copyright.txt or https://cmake.org/licensing for details. */
+#ifndef cm3p_archive_entry_h
+#define cm3p_archive_entry_h
+
+/* Use the libarchive configured for CMake. */
+#include "cmThirdParty.h"
+#ifdef CMAKE_USE_SYSTEM_LIBARCHIVE
+# include <archive_entry.h> // IWYU pragma: export
+#else
+# include <cmlibarchive/libarchive/archive_entry.h> // IWYU pragma: export
+#endif
+
+#endif
diff --git a/Utilities/cm_bzlib.h b/Utilities/cm3p/bzlib.h
index 8669e9e..2a0f4dd 100644
--- a/Utilities/cm_bzlib.h
+++ b/Utilities/cm3p/bzlib.h
@@ -1,14 +1,14 @@
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
-#ifndef cm_bzlib_h
-#define cm_bzlib_h
+#ifndef cm3p_bzlib_h
+#define cm3p_bzlib_h
/* Use the bzip2 library configured for CMake. */
#include "cmThirdParty.h"
#ifdef CMAKE_USE_SYSTEM_BZIP2
-# include <bzlib.h>
+# include <bzlib.h> // IWYU pragma: export
#else
-# include <cmbzip2/bzlib.h>
+# include <cmbzip2/bzlib.h> // IWYU pragma: export
#endif
#endif
diff --git a/Utilities/cm_curl.h b/Utilities/cm3p/curl/curl.h
index 673f8ad..6e2b822 100644
--- a/Utilities/cm_curl.h
+++ b/Utilities/cm3p/curl/curl.h
@@ -1,14 +1,14 @@
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
-#ifndef cm_curl_h
-#define cm_curl_h
+#ifndef cm3p_curl_curl_h
+#define cm3p_curl_curl_h
/* Use the curl library configured for CMake. */
#include "cmThirdParty.h"
#ifdef CMAKE_USE_SYSTEM_CURL
-# include <curl/curl.h>
+# include <curl/curl.h> // IWYU pragma: export
#else
-# include <cmcurl/include/curl/curl.h>
+# include <cmcurl/include/curl/curl.h> // IWYU pragma: export
#endif
#endif
diff --git a/Utilities/cm_expat.h b/Utilities/cm3p/expat.h
index fc5b39a..32e6fd0 100644
--- a/Utilities/cm_expat.h
+++ b/Utilities/cm3p/expat.h
@@ -1,14 +1,14 @@
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
-#ifndef cm_expat_h
-#define cm_expat_h
+#ifndef cm3p_expat_h
+#define cm3p_expat_h
/* Use the expat library configured for CMake. */
#include "cmThirdParty.h"
#ifdef CMAKE_USE_SYSTEM_EXPAT
-# include <expat.h>
+# include <expat.h> // IWYU pragma: export
#else
-# include <cmexpat/lib/expat.h>
+# include <cmexpat/lib/expat.h> // IWYU pragma: export
#endif
#endif
diff --git a/Utilities/cm_jsoncpp_writer.h b/Utilities/cm3p/json/reader.h
index d9e5d82..0df09ee 100644
--- a/Utilities/cm_jsoncpp_writer.h
+++ b/Utilities/cm3p/json/reader.h
@@ -1,14 +1,14 @@
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
-#ifndef cm_jsoncpp_writer_h
-#define cm_jsoncpp_writer_h
+#ifndef cm3p_json_reader_h
+#define cm3p_json_reader_h
/* Use the jsoncpp library configured for CMake. */
#include "cmThirdParty.h"
#ifdef CMAKE_USE_SYSTEM_JSONCPP
-# include <json/writer.h>
+# include <json/reader.h> // IWYU pragma: export
#else
-# include <cmjsoncpp/include/json/writer.h>
+# include <cmjsoncpp/include/json/reader.h> // IWYU pragma: export
#endif
#endif
diff --git a/Utilities/cm_jsoncpp_value.h b/Utilities/cm3p/json/value.h
index 742d99a..f59bed6 100644
--- a/Utilities/cm_jsoncpp_value.h
+++ b/Utilities/cm3p/json/value.h
@@ -1,14 +1,14 @@
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
-#ifndef cm_jsoncpp_value_h
-#define cm_jsoncpp_value_h
+#ifndef cm3p_json_value_h
+#define cm3p_json_value_h
/* Use the jsoncpp library configured for CMake. */
#include "cmThirdParty.h"
#ifdef CMAKE_USE_SYSTEM_JSONCPP
-# include <json/value.h>
+# include <json/value.h> // IWYU pragma: export
#else
-# include <cmjsoncpp/include/json/value.h>
+# include <cmjsoncpp/include/json/value.h> // IWYU pragma: export
#endif
#endif
diff --git a/Utilities/cm_jsoncpp_reader.h b/Utilities/cm3p/json/writer.h
index 23af65c..7fcc3e2 100644
--- a/Utilities/cm_jsoncpp_reader.h
+++ b/Utilities/cm3p/json/writer.h
@@ -1,14 +1,14 @@
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
-#ifndef cm_jsoncpp_reader_h
-#define cm_jsoncpp_reader_h
+#ifndef cm3p_json_writer_h
+#define cm3p_json_writer_h
/* Use the jsoncpp library configured for CMake. */
#include "cmThirdParty.h"
#ifdef CMAKE_USE_SYSTEM_JSONCPP
-# include <json/reader.h>
+# include <json/writer.h> // IWYU pragma: export
#else
-# include <cmjsoncpp/include/json/reader.h>
+# include <cmjsoncpp/include/json/writer.h> // IWYU pragma: export
#endif
#endif
diff --git a/Utilities/cm_kwiml.h b/Utilities/cm3p/kwiml/abi.h
index 566f67e..6d0dedf 100644
--- a/Utilities/cm_kwiml.h
+++ b/Utilities/cm3p/kwiml/abi.h
@@ -1,16 +1,14 @@
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
-#ifndef cm_kwiml_h
-#define cm_kwiml_h
+#ifndef cm3p_kwiml_abi_h
+#define cm3p_kwiml_abi_h
/* Use the KWIML library configured for CMake. */
#include "cmThirdParty.h"
#ifdef CMAKE_USE_SYSTEM_KWIML
-# include <kwiml/abi.h>
-# include <kwiml/int.h>
+# include <kwiml/abi.h> // IWYU pragma: export
#else
-# include "KWIML/include/kwiml/abi.h"
-# include "KWIML/include/kwiml/int.h"
+# include <KWIML/include/kwiml/abi.h> // IWYU pragma: export
#endif
#endif
diff --git a/Utilities/cm3p/kwiml/int.h b/Utilities/cm3p/kwiml/int.h
new file mode 100644
index 0000000..4c7c23d
--- /dev/null
+++ b/Utilities/cm3p/kwiml/int.h
@@ -0,0 +1,14 @@
+/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
+ file Copyright.txt or https://cmake.org/licensing for details. */
+#ifndef cm3p_kwiml_int_h
+#define cm3p_kwiml_int_h
+
+/* Use the KWIML library configured for CMake. */
+#include "cmThirdParty.h"
+#ifdef CMAKE_USE_SYSTEM_KWIML
+# include <kwiml/int.h> // IWYU pragma: export
+#else
+# include <KWIML/include/kwiml/int.h> // IWYU pragma: export
+#endif
+
+#endif
diff --git a/Utilities/cm_lzma.h b/Utilities/cm3p/lzma.h
index 0526036..abfacf3 100644
--- a/Utilities/cm_lzma.h
+++ b/Utilities/cm3p/lzma.h
@@ -1,14 +1,14 @@
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
-#ifndef cm_lzma_h
-#define cm_lzma_h
+#ifndef cm3p_lzma_h
+#define cm3p_lzma_h
/* Use the liblzma configured for CMake. */
#include "cmThirdParty.h"
#ifdef CMAKE_USE_SYSTEM_LIBLZMA
-# include <lzma.h>
+# include <lzma.h> // IWYU pragma: export
#else
-# include <cmliblzma/liblzma/api/lzma.h>
+# include <cmliblzma/liblzma/api/lzma.h> // IWYU pragma: export
#endif
#endif
diff --git a/Utilities/cm_rhash.h b/Utilities/cm3p/rhash.h
index 03d9871..9d5e411 100644
--- a/Utilities/cm_rhash.h
+++ b/Utilities/cm3p/rhash.h
@@ -1,14 +1,14 @@
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
-#ifndef cm_rhash_h
-#define cm_rhash_h
+#ifndef cm3p_rhash_h
+#define cm3p_rhash_h
/* Use the LibRHash library configured for CMake. */
#include "cmThirdParty.h"
#ifdef CMAKE_USE_SYSTEM_LIBRHASH
-# include <rhash.h>
+# include <rhash.h> // IWYU pragma: export
#else
-# include <cmlibrhash/librhash/rhash.h>
+# include <cmlibrhash/librhash/rhash.h> // IWYU pragma: export
#endif
#endif
diff --git a/Utilities/cm_uv.h b/Utilities/cm3p/uv.h
index 448f30d..307a09f 100644
--- a/Utilities/cm_uv.h
+++ b/Utilities/cm3p/uv.h
@@ -1,14 +1,14 @@
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
-#ifndef cm_uv_h
-#define cm_uv_h
+#ifndef cm3p_uv_h
+#define cm3p_uv_h
/* Use the libuv library configured for CMake. */
#include "cmThirdParty.h"
#ifdef CMAKE_USE_SYSTEM_LIBUV
-# include <uv.h>
+# include <uv.h> // IWYU pragma: export
#else
-# include <cmlibuv/include/uv.h>
+# include <cmlibuv/include/uv.h> // IWYU pragma: export
#endif
#endif
diff --git a/Utilities/cm_zlib.h b/Utilities/cm3p/zlib.h
index 2314183..fe7baee 100644
--- a/Utilities/cm_zlib.h
+++ b/Utilities/cm3p/zlib.h
@@ -1,14 +1,14 @@
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
-#ifndef cm_zlib_h
-#define cm_zlib_h
+#ifndef cm3p_zlib_h
+#define cm3p_zlib_h
/* Use the zlib library configured for CMake. */
#include "cmThirdParty.h"
#ifdef CMAKE_USE_SYSTEM_ZLIB
-# include <zlib.h>
+# include <zlib.h> // IWYU pragma: export
#else
-# include <cmzlib/zlib.h>
+# include <cmzlib/zlib.h> // IWYU pragma: export
#endif
#endif
diff --git a/Utilities/cm_zstd.h b/Utilities/cm3p/zstd.h
index 4bda996..07cc3e4 100644
--- a/Utilities/cm_zstd.h
+++ b/Utilities/cm3p/zstd.h
@@ -1,14 +1,14 @@
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
-#ifndef cm_zstd_h
-#define cm_zstd_h
+#ifndef cm3p_zstd_h
+#define cm3p_zstd_h
/* Use the libzstd configured for CMake. */
#include "cmThirdParty.h"
#ifdef CMAKE_USE_SYSTEM_ZSTD
-# include <zstd.h>
+# include <zstd.h> // IWYU pragma: export
#else
-# include <cmzstd/lib/zstd.h>
+# include <cmzstd/lib/zstd.h> // IWYU pragma: export
#endif
#endif
diff --git a/Utilities/cmbzip2/.gitattributes b/Utilities/cmbzip2/.gitattributes
new file mode 100644
index 0000000..562b12e
--- /dev/null
+++ b/Utilities/cmbzip2/.gitattributes
@@ -0,0 +1 @@
+* -whitespace
diff --git a/Utilities/cmbzip2/CHANGES b/Utilities/cmbzip2/CHANGES
deleted file mode 100644
index 6e4f65e..0000000
--- a/Utilities/cmbzip2/CHANGES
+++ /dev/null
@@ -1,319 +0,0 @@
- ------------------------------------------------------------------
- This file is part of bzip2/libbzip2, a program and library for
- lossless, block-sorting data compression.
-
- bzip2/libbzip2 version 1.0.5 of 10 December 2007
- Copyright (C) 1996-2007 Julian Seward <jseward@bzip.org>
-
- Please read the WARNING, DISCLAIMER and PATENTS sections in the
- README file.
-
- This program is released under the terms of the license contained
- in the file LICENSE.
- ------------------------------------------------------------------
-
-
-0.9.0
-~~~~~
-First version.
-
-
-0.9.0a
-~~~~~~
-Removed 'ranlib' from Makefile, since most modern Unix-es
-don't need it, or even know about it.
-
-
-0.9.0b
-~~~~~~
-Fixed a problem with error reporting in bzip2.c. This does not effect
-the library in any way. Problem is: versions 0.9.0 and 0.9.0a (of the
-program proper) compress and decompress correctly, but give misleading
-error messages (internal panics) when an I/O error occurs, instead of
-reporting the problem correctly. This shouldn't give any data loss
-(as far as I can see), but is confusing.
-
-Made the inline declarations disappear for non-GCC compilers.
-
-
-0.9.0c
-~~~~~~
-Fixed some problems in the library pertaining to some boundary cases.
-This makes the library behave more correctly in those situations. The
-fixes apply only to features (calls and parameters) not used by
-bzip2.c, so the non-fixedness of them in previous versions has no
-effect on reliability of bzip2.c.
-
-In bzlib.c:
- * 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.
-
-In compress.c:
- * changed setting of nGroups in sendMTFValues() so as to
- do a bit better on small files. This _does_ effect
- bzip2.c.
-
-
-0.9.5a
-~~~~~~
-Major change: add a fallback sorting algorithm (blocksort.c)
-to give reasonable behaviour even for very repetitive inputs.
-Nuked --repetitive-best and --repetitive-fast since they are
-no longer useful.
-
-Minor changes: mostly a whole bunch of small changes/
-bugfixes in the driver (bzip2.c). Changes pertaining to the
-user interface are:
-
- allow decompression of symlink'd files to stdout
- decompress/test files even without .bz2 extension
- give more accurate error messages for I/O errors
- when compressing/decompressing to stdout, don't catch control-C
- read flags from BZIP2 and BZIP environment variables
- decline to break hard links to a file unless forced with -f
- allow -c flag even with no filenames
- preserve file ownerships as far as possible
- make -s -1 give the expected block size (100k)
- add a flag -q --quiet to suppress nonessential warnings
- stop decoding flags after --, so files beginning in - can be handled
- resolved inconsistent naming: bzcat or bz2cat ?
- bzip2 --help now returns 0
-
-Programming-level changes are:
-
- fixed syntax error in GET_LL4 for Borland C++ 5.02
- let bzBuffToBuffDecompress return BZ_DATA_ERROR{_MAGIC}
- fix overshoot of mode-string end in bzopen_or_bzdopen
- wrapped bzlib.h in #ifdef __cplusplus ... extern "C" { ... }
- close file handles under all error conditions
- added minor mods so it compiles with DJGPP out of the box
- fixed Makefile so it doesn't give problems with BSD make
- fix uninitialised memory reads in dlltest.c
-
-0.9.5b
-~~~~~~
-Open stdin/stdout in binary mode for DJGPP.
-
-0.9.5c
-~~~~~~
-Changed BZ_N_OVERSHOOT to be ... + 2 instead of ... + 1. The + 1
-version could cause the sorted order to be wrong in some extremely
-obscure cases. Also changed setting of quadrant in blocksort.c.
-
-0.9.5d
-~~~~~~
-The only functional change is to make bzlibVersion() in the library
-return the correct string. This has no effect whatsoever on the
-functioning of the bzip2 program or library. Added a couple of casts
-so the library compiles without warnings at level 3 in MS Visual
-Studio 6.0. Included a Y2K statement in the file Y2K_INFO. All other
-changes are minor documentation changes.
-
-1.0
-~~~
-Several minor bugfixes and enhancements:
-
-* Large file support. The library uses 64-bit counters to
- count the volume of data passing through it. bzip2.c
- is now compiled with -D_FILE_OFFSET_BITS=64 to get large
- file support from the C library. -v correctly prints out
- file sizes greater than 4 gigabytes. All these changes have
- been made without assuming a 64-bit platform or a C compiler
- which supports 64-bit ints, so, except for the C library
- aspect, they are fully portable.
-
-* Decompression robustness. The library/program should be
- robust to any corruption of compressed data, detecting and
- handling _all_ corruption, instead of merely relying on
- the CRCs. What this means is that the program should
- never crash, given corrupted data, and the library should
- always return BZ_DATA_ERROR.
-
-* Fixed an obscure race-condition bug only ever observed on
- Solaris, in which, if you were very unlucky and issued
- control-C at exactly the wrong time, both input and output
- files would be deleted.
-
-* Don't run out of file handles on test/decompression when
- large numbers of files have invalid magic numbers.
-
-* Avoid library namespace pollution. Prefix all exported
- symbols with BZ2_.
-
-* Minor sorting enhancements from my DCC2000 paper.
-
-* Advance the version number to 1.0, so as to counteract the
- (false-in-this-case) impression some people have that programs
- with version numbers less than 1.0 are in some way, experimental,
- pre-release versions.
-
-* Create an initial Makefile-libbz2_so to build a shared library.
- Yes, I know I should really use libtool et al ...
-
-* Make the program exit with 2 instead of 0 when decompression
- fails due to a bad magic number (ie, an invalid bzip2 header).
- Also exit with 1 (as the manual claims :-) whenever a diagnostic
- message would have been printed AND the corresponding operation
- is aborted, for example
- bzip2: Output file xx already exists.
- When a diagnostic message is printed but the operation is not
- aborted, for example
- bzip2: Can't guess original name for wurble -- using wurble.out
- then the exit value 0 is returned, unless some other problem is
- also detected.
-
- I think it corresponds more closely to what the manual claims now.
-
-
-1.0.1
-~~~~~
-* Modified dlltest.c so it uses the new BZ2_ naming scheme.
-* Modified makefile-msc to fix minor build probs on Win2k.
-* Updated README.COMPILATION.PROBLEMS.
-
-There are no functionality changes or bug fixes relative to version
-1.0.0. This is just a documentation update + a fix for minor Win32
-build problems. For almost everyone, upgrading from 1.0.0 to 1.0.1 is
-utterly pointless. Don't bother.
-
-
-1.0.2
-~~~~~
-A bug fix release, addressing various minor issues which have appeared
-in the 18 or so months since 1.0.1 was released. Most of the fixes
-are to do with file-handling or documentation bugs. To the best of my
-knowledge, there have been no data-loss-causing bugs reported in the
-compression/decompression engine of 1.0.0 or 1.0.1.
-
-Note that this release does not improve the rather crude build system
-for Unix platforms. The general plan here is to autoconfiscate/
-libtoolise 1.0.2 soon after release, and release the result as 1.1.0
-or perhaps 1.2.0. That, however, is still just a plan at this point.
-
-Here are the changes in 1.0.2. Bug-reporters and/or patch-senders in
-parentheses.
-
-* Fix an infinite segfault loop in 1.0.1 when a directory is
- encountered in -f (force) mode.
- (Trond Eivind Glomsrod, Nicholas Nethercote, Volker Schmidt)
-
-* Avoid double fclose() of output file on certain I/O error paths.
- (Solar Designer)
-
-* Don't fail with internal error 1007 when fed a long stream (> 48MB)
- of byte 251. Also print useful message suggesting that 1007s may be
- caused by bad memory.
- (noticed by Juan Pedro Vallejo, fixed by me)
-
-* Fix uninitialised variable silly bug in demo prog dlltest.c.
- (Jorj Bauer)
-
-* Remove 512-MB limitation on recovered file size for bzip2recover
- on selected platforms which support 64-bit ints. At the moment
- all GCC supported platforms, and Win32.
- (me, Alson van der Meulen)
-
-* Hard-code header byte values, to give correct operation on platforms
- using EBCDIC as their native character set (IBM's OS/390).
- (Leland Lucius)
-
-* Copy file access times correctly.
- (Marty Leisner)
-
-* Add distclean and check targets to Makefile.
- (Michael Carmack)
-
-* Parameterise use of ar and ranlib in Makefile. Also add $(LDFLAGS).
- (Rich Ireland, Bo Thorsen)
-
-* Pass -p (create parent dirs as needed) to mkdir during make install.
- (Jeremy Fusco)
-
-* Dereference symlinks when copying file permissions in -f mode.
- (Volker Schmidt)
-
-* Majorly simplify implementation of uInt64_qrm10.
- (Bo Lindbergh)
-
-* Check the input file still exists before deleting the output one,
- when aborting in cleanUpAndFail().
- (Joerg Prante, Robert Linden, Matthias Krings)
-
-Also a bunch of patches courtesy of Philippe Troin, the Debian maintainer
-of bzip2:
-
-* Wrapper scripts (with manpages): bzdiff, bzgrep, bzmore.
-
-* Spelling changes and minor enhancements in bzip2.1.
-
-* Avoid race condition between creating the output file and setting its
- interim permissions safely, by using fopen_output_safely().
- No changes to bzip2recover since there is no issue with file
- permissions there.
-
-* do not print senseless report with -v when compressing an empty
- file.
-
-* bzcat -f works on non-bzip2 files.
-
-* do not try to escape shell meta-characters on unix (the shell takes
- care of these).
-
-* added --fast and --best aliases for -1 -9 for gzip compatibility.
-
-
-1.0.3 (15 Feb 05)
-~~~~~~~~~~~~~~~~~
-Fixes some minor bugs since the last version, 1.0.2.
-
-* Further robustification against corrupted compressed data.
- There are currently no known bitstreams which can cause the
- decompressor to crash, loop or access memory which does not
- belong to it. If you are using bzip2 or the library to
- decompress bitstreams from untrusted sources, an upgrade
- to 1.0.3 is recommended. This fixes CAN-2005-1260.
-
-* The documentation has been converted to XML, from which html
- and pdf can be derived.
-
-* Various minor bugs in the documentation have been fixed.
-
-* Fixes for various compilation warnings with newer versions of
- gcc, and on 64-bit platforms.
-
-* The BZ_NO_STDIO cpp symbol was not properly observed in 1.0.2.
- This has been fixed.
-
-
-1.0.4 (20 Dec 06)
-~~~~~~~~~~~~~~~~~
-Fixes some minor bugs since the last version, 1.0.3.
-
-* Fix file permissions race problem (CAN-2005-0953).
-
-* Avoid possible segfault in BZ2_bzclose. From Coverity's NetBSD
- scan.
-
-* 'const'/prototype cleanups in the C code.
-
-* Change default install location to /usr/local, and handle multiple
- 'make install's without error.
-
-* Sanitise file names more carefully in bzgrep. Fixes CAN-2005-0758
- to the extent that applies to bzgrep.
-
-* Use 'mktemp' rather than 'tempfile' in bzdiff.
-
-* Tighten up a couple of assertions in blocksort.c following automated
- analysis.
-
-* Fix minor doc/comment bugs.
-
-
-1.0.5 (10 Dec 07)
-~~~~~~~~~~~~~~~~~
-Security fix only. Fixes CERT-FI 20469 as it applies to bzip2.
-
diff --git a/Utilities/cmbzip2/CMakeLists.txt b/Utilities/cmbzip2/CMakeLists.txt
index 2aff69c..cb4a038 100644
--- a/Utilities/cmbzip2/CMakeLists.txt
+++ b/Utilities/cmbzip2/CMakeLists.txt
@@ -1,4 +1,13 @@
project(bzip2)
+
+# Disable warnings to avoid changing 3rd party code.
+if(CMAKE_C_COMPILER_ID MATCHES
+ "^(GNU|Clang|AppleClang|XLClang|XL|VisualAge|SunPro|HP|Intel)$")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w")
+elseif(CMAKE_C_COMPILER_ID STREQUAL "PathScale")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -woffall")
+endif()
+
add_definitions(-D_FILE_OFFSET_BITS=64)
add_library(cmbzip2
blocksort.c huffman.c crctable.c randtable.c compress.c decompress.c bzlib.c)
diff --git a/Utilities/cmbzip2/LICENSE b/Utilities/cmbzip2/LICENSE
index f420cff..81a37ea 100644
--- a/Utilities/cmbzip2/LICENSE
+++ b/Utilities/cmbzip2/LICENSE
@@ -2,7 +2,7 @@
--------------------------------------------------------------------------
This program, "bzip2", the associated library "libbzip2", and all
-documentation, are copyright (C) 1996-2007 Julian R Seward. All
+documentation, are copyright (C) 1996-2019 Julian R Seward. All
rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -36,7 +36,7 @@ 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, jseward@bzip.org
-bzip2/libbzip2 version 1.0.5 of 10 December 2007
+Julian Seward, jseward@acm.org
+bzip2/libbzip2 version 1.0.8 of 13 July 2019
--------------------------------------------------------------------------
diff --git a/Utilities/cmbzip2/Makefile-libbz2_so b/Utilities/cmbzip2/Makefile-libbz2_so
deleted file mode 100644
index 8370887..0000000
--- a/Utilities/cmbzip2/Makefile-libbz2_so
+++ /dev/null
@@ -1,59 +0,0 @@
-
-# This Makefile builds a shared version of the library,
-# libbz2.so.1.0.4, with soname libbz2.so.1.0,
-# at least on x86-Linux (RedHat 7.2),
-# with gcc-2.96 20000731 (Red Hat Linux 7.1 2.96-98).
-# Please see the README file for some important info
-# about building the library like this.
-
-# ------------------------------------------------------------------
-# This file is part of bzip2/libbzip2, a program and library for
-# lossless, block-sorting data compression.
-#
-# bzip2/libbzip2 version 1.0.5 of 10 December 2007
-# Copyright (C) 1996-2007 Julian Seward <jseward@bzip.org>
-#
-# Please read the WARNING, DISCLAIMER and PATENTS sections in the
-# README file.
-#
-# This program is released under the terms of the license contained
-# in the file LICENSE.
-# ------------------------------------------------------------------
-
-
-SHELL=/bin/sh
-CC=gcc
-BIGFILES=-D_FILE_OFFSET_BITS=64
-CFLAGS=-fpic -fPIC -Wall -Winline -O2 -g $(BIGFILES)
-
-OBJS= blocksort.o \
- huffman.o \
- crctable.o \
- randtable.o \
- compress.o \
- decompress.o \
- bzlib.o
-
-all: $(OBJS)
- $(CC) -shared -Wl,-soname -Wl,libbz2.so.1.0 -o libbz2.so.1.0.4 $(OBJS)
- $(CC) $(CFLAGS) -o bzip2-shared bzip2.c libbz2.so.1.0.4
- rm -f libbz2.so.1.0
- ln -s libbz2.so.1.0.4 libbz2.so.1.0
-
-clean:
- rm -f $(OBJS) bzip2.o libbz2.so.1.0.4 libbz2.so.1.0 bzip2-shared
-
-blocksort.o: blocksort.c
- $(CC) $(CFLAGS) -c blocksort.c
-huffman.o: huffman.c
- $(CC) $(CFLAGS) -c huffman.c
-crctable.o: crctable.c
- $(CC) $(CFLAGS) -c crctable.c
-randtable.o: randtable.c
- $(CC) $(CFLAGS) -c randtable.c
-compress.o: compress.c
- $(CC) $(CFLAGS) -c compress.c
-decompress.o: decompress.c
- $(CC) $(CFLAGS) -c decompress.c
-bzlib.o: bzlib.c
- $(CC) $(CFLAGS) -c bzlib.c
diff --git a/Utilities/cmbzip2/README b/Utilities/cmbzip2/README
index e17a84e..b9c6099 100644
--- a/Utilities/cmbzip2/README
+++ b/Utilities/cmbzip2/README
@@ -6,8 +6,8 @@ This version is fully compatible with the previous public releases.
This file is part of bzip2/libbzip2, a program and library for
lossless, block-sorting data compression.
-bzip2/libbzip2 version 1.0.5 of 10 December 2007
-Copyright (C) 1996-2007 Julian Seward <jseward@bzip.org>
+bzip2/libbzip2 version 1.0.8 of 13 July 2019
+Copyright (C) 1996-2019 Julian Seward <jseward@acm.org>
Please read the WARNING, DISCLAIMER and PATENTS sections in this file.
@@ -73,7 +73,7 @@ HOW TO BUILD -- Windows 95, NT, DOS, Mac, etc.
It's difficult for me to support compilation on all these platforms.
My approach is to collect binaries for these platforms, and put them
-on the master web site (http://www.bzip.org). Look there. However
+on the master web site (https://sourceware.org/bzip2/). Look there. However
(FWIW), bzip2-1.0.X is very standard ANSI C and should compile
unmodified with MS Visual C. If you have difficulties building, you
might want to read README.COMPILATION.PROBLEMS.
@@ -161,39 +161,22 @@ WHAT'S NEW IN 0.9.5 ?
* Many small improvements in file and flag handling.
* A Y2K statement.
-WHAT'S NEW IN 1.0.0 ?
+WHAT'S NEW IN 1.0.x ?
See the CHANGES file.
-WHAT'S NEW IN 1.0.2 ?
-
- See the CHANGES file.
-
-WHAT'S NEW IN 1.0.3 ?
-
- See the CHANGES file.
-
-WHAT'S NEW IN 1.0.4 ?
-
- See the CHANGES file.
-
-WHAT'S NEW IN 1.0.5 ?
-
- See the CHANGES file.
-
-
-I hope you find bzip2 useful. Feel free to contact me at
- jseward@bzip.org
+I hope you find bzip2 useful. Feel free to contact the developers at
+ bzip2-devel@sourceware.org
if you have any suggestions or queries. Many people mailed me with
comments, suggestions and patches after the releases of bzip-0.15,
bzip-0.21, and bzip2 versions 0.1pl2, 0.9.0, 0.9.5, 1.0.0, 1.0.1,
1.0.2 and 1.0.3, and the changes in bzip2 are largely a result of this
feedback. I thank you for your comments.
-bzip2's "home" is http://www.bzip.org/
+bzip2's "home" is https://sourceware.org/bzip2/
Julian Seward
-jseward@bzip.org
+jseward@acm.org
Cambridge, UK.
18 July 1996 (version 0.15)
@@ -208,3 +191,6 @@ Cambridge, UK.
15 February 2005 (bzip2, version 1.0.3)
20 December 2006 (bzip2, version 1.0.4)
10 December 2007 (bzip2, version 1.0.5)
+ 6 Sept 2010 (bzip2, version 1.0.6)
+27 June 2019 (bzip2, version 1.0.7)
+13 July 2019 (bzip2, version 1.0.8)
diff --git a/Utilities/cmbzip2/README.COMPILATION.PROBLEMS b/Utilities/cmbzip2/README.COMPILATION.PROBLEMS
deleted file mode 100644
index 22b95c6..0000000
--- a/Utilities/cmbzip2/README.COMPILATION.PROBLEMS
+++ /dev/null
@@ -1,58 +0,0 @@
-------------------------------------------------------------------
-This file is part of bzip2/libbzip2, a program and library for
-lossless, block-sorting data compression.
-
-bzip2/libbzip2 version 1.0.5 of 10 December 2007
-Copyright (C) 1996-2007 Julian Seward <jseward@bzip.org>
-
-Please read the WARNING, DISCLAIMER and PATENTS sections in the
-README file.
-
-This program is released under the terms of the license contained
-in the file LICENSE.
-------------------------------------------------------------------
-
-bzip2-1.0.5 should compile without problems on the vast majority of
-platforms. Using the supplied Makefile, I've built and tested it
-myself for x86-linux and amd64-linux. With makefile.msc, Visual C++
-6.0 and nmake, you can build a native Win32 version too. Large file
-support seems to work correctly on at least on amd64-linux.
-
-When I say "large file" I mean a file of size 2,147,483,648 (2^31)
-bytes or above. Many older OSs can't handle files above this size,
-but many newer ones can. Large files are pretty huge -- most files
-you'll encounter are not Large Files.
-
-Early versions of bzip2 (0.1, 0.9.0, 0.9.5) compiled on a wide variety
-of platforms without difficulty, and I hope this version will continue
-in that tradition. However, in order to support large files, I've had
-to include the define -D_FILE_OFFSET_BITS=64 in the Makefile. This
-can cause problems.
-
-The technique of adding -D_FILE_OFFSET_BITS=64 to get large file
-support is, as far as I know, the Recommended Way to get correct large
-file support. For more details, see the Large File Support
-Specification, published by the Large File Summit, at
-
- http://ftp.sas.com/standards/large.file
-
-As a general comment, if you get compilation errors which you think
-are related to large file support, try removing the above define from
-the Makefile, ie, delete the line
-
- BIGFILES=-D_FILE_OFFSET_BITS=64
-
-from the Makefile, and do 'make clean ; make'. This will give you a
-version of bzip2 without large file support, which, for most
-applications, is probably not a problem.
-
-Alternatively, try some of the platform-specific hints listed below.
-
-You can use the spewG.c program to generate huge files to test bzip2's
-large file support, if you are feeling paranoid. Be aware though that
-any compilation problems which affect bzip2 will also affect spewG.c,
-alas.
-
-AIX: I have reports that for large file support, you need to specify
--D_LARGE_FILES rather than -D_FILE_OFFSET_BITS=64. I have not tested
-this myself.
diff --git a/Utilities/cmbzip2/README.XML.STUFF b/Utilities/cmbzip2/README.XML.STUFF
deleted file mode 100644
index 1a5b4c5..0000000
--- a/Utilities/cmbzip2/README.XML.STUFF
+++ /dev/null
@@ -1,45 +0,0 @@
- ----------------------------------------------------------------
- This file is part of bzip2/libbzip2, a program and library for
- lossless, block-sorting data compression.
-
- bzip2/libbzip2 version 1.0.5 of 10 December 2007
- Copyright (C) 1996-2007 Julian Seward <jseward@bzip.org>
-
- Please read the WARNING, DISCLAIMER and PATENTS sections in the
- README file.
-
- This program is released under the terms of the license contained
- in the file LICENSE.
- ----------------------------------------------------------------
-
-The script xmlproc.sh takes an xml file as input,
-and processes it to create .pdf, .html or .ps output.
-It uses format.pl, a perl script to format <pre> blocks nicely,
- and add CDATA tags so writers do not have to use eg. &lt;
-
-The file "entities.xml" must be edited to reflect current
-version, year, etc.
-
-
-Usage:
-
- ./xmlproc.sh -v manual.xml
- Validates an xml file to ensure no dtd-compliance errors
-
- ./xmlproc.sh -html manual.xml
- Output: manual.html
-
- ./xmlproc.sh -pdf manual.xml
- Output: manual.pdf
-
- ./xmlproc.sh -ps manual.xml
- Output: manual.ps
-
-
-Notum bene:
-- pdfxmltex barfs if given a filename with an underscore in it
-
-- xmltex won't work yet - there's a bug in passivetex
- which we are all waiting for Sebastian to fix.
- So we are going the xml -> pdf -> ps route for the time being,
- using pdfxmltex.
diff --git a/Utilities/cmbzip2/blocksort.c b/Utilities/cmbzip2/blocksort.c
index 95adb5e..92d81fe 100644
--- a/Utilities/cmbzip2/blocksort.c
+++ b/Utilities/cmbzip2/blocksort.c
@@ -8,8 +8,8 @@
This file is part of bzip2/libbzip2, a program and library for
lossless, block-sorting data compression.
- bzip2/libbzip2 version 1.0.5 of 10 December 2007
- Copyright (C) 1996-2007 Julian Seward <jseward@bzip.org>
+ bzip2/libbzip2 version 1.0.8 of 13 July 2019
+ Copyright (C) 1996-2019 Julian Seward <jseward@acm.org>
Please read the WARNING, DISCLAIMER and PATENTS sections in the
README file.
@@ -202,9 +202,9 @@ void fallbackQSort3 ( UInt32* fmap,
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 SET_BH(zz) bhtab[(zz) >> 5] |= ((UInt32)1 << ((zz) & 31))
+#define CLEAR_BH(zz) bhtab[(zz) >> 5] &= ~((UInt32)1 << ((zz) & 31))
+#define ISSET_BH(zz) (bhtab[(zz) >> 5] & ((UInt32)1 << ((zz) & 31)))
#define WORD_BH(zz) bhtab[(zz) >> 5]
#define UNALIGNED_BH(zz) ((zz) & 0x01f)
@@ -274,7 +274,7 @@ void fallbackSort ( UInt32* fmap,
r = -1;
while (1) {
- /*-- find the next non-singleton bucket --*/
+ /*-- find the next non-singleton bucket --*/
k = r + 1;
while (ISSET_BH(k) && UNALIGNED_BH(k)) k++;
if (ISSET_BH(k)) {
diff --git a/Utilities/cmbzip2/bz-common.xsl b/Utilities/cmbzip2/bz-common.xsl
deleted file mode 100644
index 66fcd6f..0000000
--- a/Utilities/cmbzip2/bz-common.xsl
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0"?> <!-- -*- sgml -*- -->
-<xsl:stylesheet
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
-
-<!-- we like '1.2 Title' -->
-<xsl:param name="section.autolabel" select="'1'"/>
-<xsl:param name="section.label.includes.component.label" select="'1'"/>
-
-<!-- Do not put 'Chapter' at the start of eg 'Chapter 1. Doing This' -->
-<xsl:param name="local.l10n.xml" select="document('')"/>
-<l:i18n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0">
- <l:l10n language="en">
- <l:context name="title-numbered">
- <l:template name="chapter" text="%n.&#160;%t"/>
- </l:context>
- </l:l10n>
-</l:i18n>
-
-<!-- don't generate sub-tocs for qanda sets -->
-<xsl:param name="generate.toc">
-set toc,title
-book toc,title,figure,table,example,equation
-chapter toc,title
-section toc
-sect1 toc
-sect2 toc
-sect3 toc
-sect4 nop
-sect5 nop
-qandaset toc
-qandadiv nop
-appendix toc,title
-article/appendix nop
-article toc,title
-preface toc,title
-reference toc,title
-</xsl:param>
-
-</xsl:stylesheet>
diff --git a/Utilities/cmbzip2/bz-fo.xsl b/Utilities/cmbzip2/bz-fo.xsl
deleted file mode 100644
index ba3e301..0000000
--- a/Utilities/cmbzip2/bz-fo.xsl
+++ /dev/null
@@ -1,276 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?> <!-- -*- sgml -*- -->
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- xmlns:fo="http://www.w3.org/1999/XSL/Format" version="1.0">
-
-<xsl:import href="http://docbook.sourceforge.net/release/xsl/current/fo/docbook.xsl"/>
-<xsl:import href="bz-common.xsl"/>
-
-<!-- set indent = yes while debugging, then change to NO -->
-<xsl:output method="xml" indent="yes"/>
-
-<!-- ensure only passivetex extensions are on -->
-<xsl:param name="stylesheet.result.type" select="'fo'"/>
-<!-- fo extensions: PDF bookmarks and index terms -->
-<xsl:param name="use.extensions" select="'1'"/>
-<xsl:param name="xep.extensions" select="0"/>
-<xsl:param name="fop.extensions" select="0"/>
-<xsl:param name="saxon.extensions" select="0"/>
-<xsl:param name="passivetex.extensions" select="1"/>
-<xsl:param name="tablecolumns.extension" select="'1'"/>
-
-<!-- ensure we are using single sided -->
-<xsl:param name="double.sided" select="'0'"/>
-
-<!-- insert cross references to page numbers -->
-<xsl:param name="insert.xref.page.number" select="1"/>
-
-<!-- <?custom-pagebreak?> inserts a page break at this point -->
-<xsl:template match="processing-instruction('custom-pagebreak')">
- <fo:block break-before='page'/>
-</xsl:template>
-
-<!-- show links in color -->
-<xsl:attribute-set name="xref.properties">
- <xsl:attribute name="color">blue</xsl:attribute>
-</xsl:attribute-set>
-
-<!-- make pre listings indented a bit + a bg colour -->
-<xsl:template match="programlisting | screen">
- <fo:block start-indent="0.25in" wrap-option="no-wrap"
- white-space-collapse="false" text-align="start"
- font-family="monospace" background-color="#f2f2f9"
- linefeed-treatment="preserve"
- xsl:use-attribute-sets="normal.para.spacing">
- <xsl:apply-templates/>
- </fo:block>
-</xsl:template>
-<!-- make verbatim output prettier -->
-<xsl:template match="literallayout">
- <fo:block start-indent="0.25in" wrap-option="no-wrap"
- white-space-collapse="false" text-align="start"
- font-family="monospace" background-color="#edf7f4"
- linefeed-treatment="preserve"
- space-before="0em" space-after="0em">
- <xsl:apply-templates/>
- </fo:block>
-</xsl:template>
-
-<!-- workaround bug in passivetex fo output for itemizedlist -->
-<xsl:template match="itemizedlist/listitem">
- <xsl:variable name="id">
- <xsl:call-template name="object.id"/></xsl:variable>
- <xsl:variable name="itemsymbol">
- <xsl:call-template name="list.itemsymbol">
- <xsl:with-param name="node" select="parent::itemizedlist"/>
- </xsl:call-template>
- </xsl:variable>
- <xsl:variable name="item.contents">
- <fo:list-item-label end-indent="label-end()">
- <fo:block>
- <xsl:choose>
- <xsl:when test="$itemsymbol='disc'">&#x2022;</xsl:when>
- <xsl:when test="$itemsymbol='bullet'">&#x2022;</xsl:when>
- <xsl:otherwise>&#x2022;</xsl:otherwise>
- </xsl:choose>
- </fo:block>
- </fo:list-item-label>
- <fo:list-item-body start-indent="body-start()">
- <xsl:apply-templates/> <!-- removed extra block wrapper -->
- </fo:list-item-body>
- </xsl:variable>
- <xsl:choose>
- <xsl:when test="parent::*/@spacing = 'compact'">
- <fo:list-item id="{$id}"
- xsl:use-attribute-sets="compact.list.item.spacing">
- <xsl:copy-of select="$item.contents"/>
- </fo:list-item>
- </xsl:when>
- <xsl:otherwise>
- <fo:list-item id="{$id}" xsl:use-attribute-sets="list.item.spacing">
- <xsl:copy-of select="$item.contents"/>
- </fo:list-item>
- </xsl:otherwise>
- </xsl:choose>
-</xsl:template>
-
-<!-- workaround bug in passivetex fo output for orderedlist -->
-<xsl:template match="orderedlist/listitem">
- <xsl:variable name="id">
- <xsl:call-template name="object.id"/></xsl:variable>
- <xsl:variable name="item.contents">
- <fo:list-item-label end-indent="label-end()">
- <fo:block>
- <xsl:apply-templates select="." mode="item-number"/>
- </fo:block>
- </fo:list-item-label>
- <fo:list-item-body start-indent="body-start()">
- <xsl:apply-templates/> <!-- removed extra block wrapper -->
- </fo:list-item-body>
- </xsl:variable>
- <xsl:choose>
- <xsl:when test="parent::*/@spacing = 'compact'">
- <fo:list-item id="{$id}"
- xsl:use-attribute-sets="compact.list.item.spacing">
- <xsl:copy-of select="$item.contents"/>
- </fo:list-item>
- </xsl:when>
- <xsl:otherwise>
- <fo:list-item id="{$id}" xsl:use-attribute-sets="list.item.spacing">
- <xsl:copy-of select="$item.contents"/>
- </fo:list-item>
- </xsl:otherwise>
- </xsl:choose>
-</xsl:template>
-
-<!-- workaround bug in passivetex fo output for variablelist -->
-<xsl:param name="variablelist.as.blocks" select="1"/>
-<xsl:template match="varlistentry" mode="vl.as.blocks">
- <xsl:variable name="id">
- <xsl:call-template name="object.id"/></xsl:variable>
- <fo:block id="{$id}" xsl:use-attribute-sets="list.item.spacing"
- keep-together.within-column="always"
- keep-with-next.within-column="always">
- <xsl:apply-templates select="term"/>
- </fo:block>
- <fo:block start-indent="0.5in" end-indent="0in"
- space-after.minimum="0.2em"
- space-after.optimum="0.4em"
- space-after.maximum="0.6em">
- <fo:block>
- <xsl:apply-templates select="listitem"/>
- </fo:block>
- </fo:block>
-</xsl:template>
-
-
-<!-- workaround bug in footers: force right-align w/two 80|30 cols -->
-<xsl:template name="footer.table">
- <xsl:param name="pageclass" select="''"/>
- <xsl:param name="sequence" select="''"/>
- <xsl:param name="gentext-key" select="''"/>
- <xsl:choose>
- <xsl:when test="$pageclass = 'index'">
- <xsl:attribute name="margin-left">0pt</xsl:attribute>
- </xsl:when>
- </xsl:choose>
- <xsl:variable name="candidate">
- <fo:table table-layout="fixed" width="100%">
- <fo:table-column column-number="1" column-width="80%"/>
- <fo:table-column column-number="2" column-width="20%"/>
- <fo:table-body>
- <fo:table-row height="14pt">
- <fo:table-cell text-align="left" display-align="after">
- <xsl:attribute name="relative-align">baseline</xsl:attribute>
- <fo:block>
- <fo:block> </fo:block><!-- empty cell -->
- </fo:block>
- </fo:table-cell>
- <fo:table-cell text-align="center" display-align="after">
- <xsl:attribute name="relative-align">baseline</xsl:attribute>
- <fo:block>
- <xsl:call-template name="footer.content">
- <xsl:with-param name="pageclass" select="$pageclass"/>
- <xsl:with-param name="sequence" select="$sequence"/>
- <xsl:with-param name="position" select="'center'"/>
- <xsl:with-param name="gentext-key" select="$gentext-key"/>
- </xsl:call-template>
- </fo:block>
- </fo:table-cell>
- </fo:table-row>
- </fo:table-body>
- </fo:table>
- </xsl:variable>
- <!-- Really output a footer? -->
- <xsl:choose>
- <xsl:when test="$pageclass='titlepage' and $gentext-key='book'
- and $sequence='first'">
- <!-- no, book titlepages have no footers at all -->
- </xsl:when>
- <xsl:when test="$sequence = 'blank' and $footers.on.blank.pages = 0">
- <!-- no output -->
- </xsl:when>
- <xsl:otherwise>
- <xsl:copy-of select="$candidate"/>
- </xsl:otherwise>
- </xsl:choose>
-</xsl:template>
-
-
-<!-- fix bug in headers: force right-align w/two 40|60 cols -->
-<xsl:template name="header.table">
- <xsl:param name="pageclass" select="''"/>
- <xsl:param name="sequence" select="''"/>
- <xsl:param name="gentext-key" select="''"/>
- <xsl:choose>
- <xsl:when test="$pageclass = 'index'">
- <xsl:attribute name="margin-left">0pt</xsl:attribute>
- </xsl:when>
- </xsl:choose>
- <xsl:variable name="candidate">
- <fo:table table-layout="fixed" width="100%">
- <xsl:call-template name="head.sep.rule">
- <xsl:with-param name="pageclass" select="$pageclass"/>
- <xsl:with-param name="sequence" select="$sequence"/>
- <xsl:with-param name="gentext-key" select="$gentext-key"/>
- </xsl:call-template>
- <fo:table-column column-number="1" column-width="40%"/>
- <fo:table-column column-number="2" column-width="60%"/>
- <fo:table-body>
- <fo:table-row height="14pt">
- <fo:table-cell text-align="left" display-align="before">
- <xsl:attribute name="relative-align">baseline</xsl:attribute>
- <fo:block>
- <fo:block> </fo:block><!-- empty cell -->
- </fo:block>
- </fo:table-cell>
- <fo:table-cell text-align="center" display-align="before">
- <xsl:attribute name="relative-align">baseline</xsl:attribute>
- <fo:block>
- <xsl:call-template name="header.content">
- <xsl:with-param name="pageclass" select="$pageclass"/>
- <xsl:with-param name="sequence" select="$sequence"/>
- <xsl:with-param name="position" select="'center'"/>
- <xsl:with-param name="gentext-key" select="$gentext-key"/>
- </xsl:call-template>
- </fo:block>
- </fo:table-cell>
- </fo:table-row>
- </fo:table-body>
- </fo:table>
- </xsl:variable>
- <!-- Really output a header? -->
- <xsl:choose>
- <xsl:when test="$pageclass = 'titlepage' and $gentext-key = 'book'
- and $sequence='first'">
- <!-- no, book titlepages have no headers at all -->
- </xsl:when>
- <xsl:when test="$sequence = 'blank' and $headers.on.blank.pages = 0">
- <!-- no output -->
- </xsl:when>
- <xsl:otherwise>
- <xsl:copy-of select="$candidate"/>
- </xsl:otherwise>
- </xsl:choose>
-</xsl:template>
-
-
-<!-- Bug-fix for Suse 10 PassiveTex version -->
-<!-- Precompute attribute values 'cos PassiveTex is too stupid: -->
-<xsl:attribute-set name="component.title.properties">
- <xsl:attribute name="keep-with-next.within-column">always</xsl:attribute>
- <xsl:attribute name="space-before.optimum">
- <xsl:value-of select="concat($body.font.master, 'pt')"/>
- </xsl:attribute>
- <xsl:attribute name="space-before.minimum">
- <xsl:value-of select="$body.font.master * 0.8"/>
- <xsl:text>pt</xsl:text>
- </xsl:attribute>
- <xsl:attribute name="space-before.maximum">
- <xsl:value-of select="$body.font.master * 1.2"/>
- <xsl:text>pt</xsl:text>
- </xsl:attribute>
- <xsl:attribute name="hyphenate">false</xsl:attribute>
-</xsl:attribute-set>
-
-
-</xsl:stylesheet>
diff --git a/Utilities/cmbzip2/bz-html.xsl b/Utilities/cmbzip2/bz-html.xsl
deleted file mode 100644
index 1785fff..0000000
--- a/Utilities/cmbzip2/bz-html.xsl
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0"?> <!-- -*- sgml -*- -->
-<!DOCTYPE xsl:stylesheet [ <!ENTITY bz-css SYSTEM "./bzip.css"> ]>
-
-<xsl:stylesheet
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
-
-<xsl:import href="http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl"/>
-<xsl:import href="bz-common.xsl"/>
-
-<!-- use 8859-1 encoding -->
-<xsl:output method="html" encoding="ISO-8859-1" indent="yes"/>
-
-<!-- we include the css directly when generating one large file -->
-<xsl:template name="user.head.content">
- <style type="text/css" media="screen">
- <xsl:text>&bz-css;</xsl:text>
- </style>
-</xsl:template>
-
-</xsl:stylesheet>
diff --git a/Utilities/cmbzip2/bzdiff b/Utilities/cmbzip2/bzdiff
deleted file mode 100644
index c4c9964..0000000
--- a/Utilities/cmbzip2/bzdiff
+++ /dev/null
@@ -1,76 +0,0 @@
-#!/bin/sh
-# sh is buggy on RS/6000 AIX 3.2. Replace above line with #!/bin/ksh
-
-# Bzcmp/diff wrapped for bzip2,
-# adapted from zdiff by Philippe Troin <phil@fifi.org> for Debian GNU/Linux.
-
-# Bzcmp and bzdiff are used to invoke the cmp or the diff pro-
-# gram on compressed files. All options specified are passed
-# directly to cmp or diff. If only 1 file is specified, then
-# the files compared are file1 and an uncompressed file1.gz.
-# If two files are specified, then they are uncompressed (if
-# necessary) and fed to cmp or diff. The exit status from cmp
-# or diff is preserved.
-
-PATH="/usr/bin:/bin:$PATH"; export PATH
-prog=`echo $0 | sed 's|.*/||'`
-case "$prog" in
- *cmp) comp=${CMP-cmp} ;;
- *) comp=${DIFF-diff} ;;
-esac
-
-OPTIONS=
-FILES=
-for ARG
-do
- case "$ARG" in
- -*) OPTIONS="$OPTIONS $ARG";;
- *) if test -f "$ARG"; then
- FILES="$FILES $ARG"
- else
- echo "${prog}: $ARG not found or not a regular file"
- exit 1
- fi ;;
- esac
-done
-if test -z "$FILES"; then
- echo "Usage: $prog [${comp}_options] file [file]"
- exit 1
-fi
-tmp=`mktemp ${TMPDIR:-/tmp}/bzdiff.XXXXXXXXXX` || {
- echo 'cannot create a temporary file' >&2
- exit 1
-}
-set $FILES
-if test $# -eq 1; then
- FILE=`echo "$1" | sed 's/.bz2$//'`
- bzip2 -cd "$FILE.bz2" | $comp $OPTIONS - "$FILE"
- STAT="$?"
-
-elif test $# -eq 2; then
- case "$1" in
- *.bz2)
- case "$2" in
- *.bz2)
- F=`echo "$2" | sed 's|.*/||;s|.bz2$||'`
- bzip2 -cdfq "$2" > $tmp
- bzip2 -cdfq "$1" | $comp $OPTIONS - $tmp
- STAT="$?"
- /bin/rm -f $tmp;;
-
- *) bzip2 -cdfq "$1" | $comp $OPTIONS - "$2"
- STAT="$?";;
- esac;;
- *) case "$2" in
- *.bz2)
- bzip2 -cdfq "$2" | $comp $OPTIONS "$1" -
- STAT="$?";;
- *) $comp $OPTIONS "$1" "$2"
- STAT="$?";;
- esac;;
- esac
- exit "$STAT"
-else
- echo "Usage: $prog [${comp}_options] file [file]"
- exit 1
-fi
diff --git a/Utilities/cmbzip2/bzdiff.1 b/Utilities/cmbzip2/bzdiff.1
deleted file mode 100644
index adb7a8e..0000000
--- a/Utilities/cmbzip2/bzdiff.1
+++ /dev/null
@@ -1,47 +0,0 @@
-\"Shamelessly copied from zmore.1 by Philippe Troin <phil@fifi.org>
-\"for Debian GNU/Linux
-.TH BZDIFF 1
-.SH NAME
-bzcmp, bzdiff \- compare bzip2 compressed files
-.SH SYNOPSIS
-.B bzcmp
-[ cmp_options ] file1
-[ file2 ]
-.br
-.B bzdiff
-[ diff_options ] file1
-[ file2 ]
-.SH DESCRIPTION
-.I Bzcmp
-and
-.I bzdiff
-are used to invoke the
-.I cmp
-or the
-.I diff
-program on bzip2 compressed files. All options specified are passed
-directly to
-.I cmp
-or
-.IR diff "."
-If only 1 file is specified, then the files compared are
-.I file1
-and an uncompressed
-.IR file1 ".bz2."
-If two files are specified, then they are uncompressed if necessary and fed to
-.I cmp
-or
-.IR diff "."
-The exit status from
-.I cmp
-or
-.I diff
-is preserved.
-.SH "SEE ALSO"
-cmp(1), diff(1), bzmore(1), bzless(1), bzgrep(1), bzip2(1)
-.SH BUGS
-Messages from the
-.I cmp
-or
-.I diff
-programs refer to temporary filenames instead of those specified.
diff --git a/Utilities/cmbzip2/bzgrep b/Utilities/cmbzip2/bzgrep
deleted file mode 100644
index 8ccf919..0000000
--- a/Utilities/cmbzip2/bzgrep
+++ /dev/null
@@ -1,75 +0,0 @@
-#!/bin/sh
-
-# Bzgrep wrapped for bzip2,
-# adapted from zgrep by Philippe Troin <phil@fifi.org> for Debian GNU/Linux.
-## zgrep notice:
-## zgrep -- a wrapper around a grep program that decompresses files as needed
-## Adapted from a version sent by Charles Levert <charles@comm.polymtl.ca>
-
-PATH="/usr/bin:$PATH"; export PATH
-
-prog=`echo $0 | sed 's|.*/||'`
-case "$prog" in
- *egrep) grep=${EGREP-egrep} ;;
- *fgrep) grep=${FGREP-fgrep} ;;
- *) grep=${GREP-grep} ;;
-esac
-pat=""
-while test $# -ne 0; do
- case "$1" in
- -e | -f) opt="$opt $1"; shift; pat="$1"
- if test "$grep" = grep; then # grep is buggy with -e on SVR4
- grep=egrep
- fi;;
- -A | -B) opt="$opt $1 $2"; shift;;
- -*) opt="$opt $1";;
- *) if test -z "$pat"; then
- pat="$1"
- else
- break;
- fi;;
- esac
- shift
-done
-
-if test -z "$pat"; then
- echo "grep through bzip2 files"
- echo "usage: $prog [grep_options] pattern [files]"
- exit 1
-fi
-
-list=0
-silent=0
-op=`echo "$opt" | sed -e 's/ //g' -e 's/-//g'`
-case "$op" in
- *l*) list=1
-esac
-case "$op" in
- *h*) silent=1
-esac
-
-if test $# -eq 0; then
- bzip2 -cdfq | $grep $opt "$pat"
- exit $?
-fi
-
-res=0
-for i do
- if test -f "$i"; then :; else if test -f "$i.bz2"; then i="$i.bz2"; fi; fi
- if test $list -eq 1; then
- bzip2 -cdfq "$i" | $grep $opt "$pat" 2>&1 > /dev/null && echo $i
- r=$?
- elif test $# -eq 1 -o $silent -eq 1; then
- bzip2 -cdfq "$i" | $grep $opt "$pat"
- r=$?
- else
- j=${i//\\/\\\\}
- j=${j//|/\\|}
- j=${j//&/\\&}
- j=`printf "%s" "$j" | tr '\n' ' '`
- bzip2 -cdfq "$i" | $grep $opt "$pat" | sed "s|^|${j}:|"
- r=$?
- fi
- test "$r" -ne 0 && res="$r"
-done
-exit $res
diff --git a/Utilities/cmbzip2/bzgrep.1 b/Utilities/cmbzip2/bzgrep.1
deleted file mode 100644
index 930af8c..0000000
--- a/Utilities/cmbzip2/bzgrep.1
+++ /dev/null
@@ -1,56 +0,0 @@
-\"Shamelessly copied from zmore.1 by Philippe Troin <phil@fifi.org>
-\"for Debian GNU/Linux
-.TH BZGREP 1
-.SH NAME
-bzgrep, bzfgrep, bzegrep \- search possibly bzip2 compressed files for a regular expression
-.SH SYNOPSIS
-.B bzgrep
-[ grep_options ]
-.BI [\ -e\ ] " pattern"
-.IR filename ".\|.\|."
-.br
-.B bzegrep
-[ egrep_options ]
-.BI [\ -e\ ] " pattern"
-.IR filename ".\|.\|."
-.br
-.B bzfgrep
-[ fgrep_options ]
-.BI [\ -e\ ] " pattern"
-.IR filename ".\|.\|."
-.SH DESCRIPTION
-.IR Bzgrep
-is used to invoke the
-.I grep
-on bzip2-compressed files. All options specified are passed directly to
-.I grep.
-If no file is specified, then the standard input is decompressed
-if necessary and fed to grep.
-Otherwise the given files are uncompressed if necessary and fed to
-.I grep.
-.PP
-If
-.I bzgrep
-is invoked as
-.I bzegrep
-or
-.I bzfgrep
-then
-.I egrep
-or
-.I fgrep
-is used instead of
-.I grep.
-If the GREP environment variable is set,
-.I bzgrep
-uses it as the
-.I grep
-program to be invoked. For example:
-
- for sh: GREP=fgrep bzgrep string files
- for csh: (setenv GREP fgrep; bzgrep string files)
-.SH AUTHOR
-Charles Levert (charles@comm.polymtl.ca). Adapted to bzip2 by Philippe
-Troin <phil@fifi.org> for Debian GNU/Linux.
-.SH "SEE ALSO"
-grep(1), egrep(1), fgrep(1), bzdiff(1), bzmore(1), bzless(1), bzip2(1)
diff --git a/Utilities/cmbzip2/bzip.css b/Utilities/cmbzip2/bzip.css
deleted file mode 100644
index 4feb401..0000000
--- a/Utilities/cmbzip2/bzip.css
+++ /dev/null
@@ -1,74 +0,0 @@
-/* Colours:
-#74240f dark brown h1, h2, h3, h4
-#336699 medium blue links
-#339999 turquoise link hover colour
-#202020 almost black general text
-#761596 purple md5sum text
-#626262 dark gray pre border
-#eeeeee very light gray pre background
-#f2f2f9 very light blue nav table background
-#3366cc medium blue nav table border
-*/
-
-a, a:link, a:visited, a:active { color: #336699; }
-a:hover { color: #339999; }
-
-body { font: 80%/126% sans-serif; }
-h1, h2, h3, h4 { color: #74240f; }
-
-dt { color: #336699; font-weight: bold }
-dd {
- margin-left: 1.5em;
- padding-bottom: 0.8em;
-}
-
-/* -- ruler -- */
-div.hr_blue {
- height: 3px;
- background:#ffffff url("/images/hr_blue.png") repeat-x; }
-div.hr_blue hr { display:none; }
-
-/* release styles */
-#release p { margin-top: 0.4em; }
-#release .md5sum { color: #761596; }
-
-
-/* ------ styles for docs|manuals|howto ------ */
-/* -- lists -- */
-ul {
- margin: 0px 4px 16px 16px;
- padding: 0px;
- list-style: url("/images/li-blue.png");
-}
-ul li {
- margin-bottom: 10px;
-}
-ul ul {
- list-style-type: none;
- list-style-image: none;
- margin-left: 0px;
-}
-
-/* header / footer nav tables */
-table.nav {
- border: solid 1px #3366cc;
- background: #f2f2f9;
- background-color: #f2f2f9;
- margin-bottom: 0.5em;
-}
-/* don't have underlined links in chunked nav menus */
-table.nav a { text-decoration: none; }
-table.nav a:hover { text-decoration: underline; }
-table.nav td { font-size: 85%; }
-
-code, tt, pre { font-size: 120%; }
-code, tt { color: #761596; }
-
-div.literallayout, pre.programlisting, pre.screen {
- color: #000000;
- padding: 0.5em;
- background: #eeeeee;
- border: 1px solid #626262;
- background-color: #eeeeee;
- margin: 4px 0px 4px 0px;
-}
diff --git a/Utilities/cmbzip2/bzip2.1 b/Utilities/cmbzip2/bzip2.1
deleted file mode 100644
index a313f2d..0000000
--- a/Utilities/cmbzip2/bzip2.1
+++ /dev/null
@@ -1,454 +0,0 @@
-.PU
-.TH bzip2 1
-.SH NAME
-bzip2, bunzip2 \- a block-sorting file compressor, v1.0.4
-.br
-bzcat \- decompresses files to stdout
-.br
-bzip2recover \- recovers data from damaged bzip2 files
-
-.SH SYNOPSIS
-.ll +8
-.B bzip2
-.RB [ " \-cdfkqstvzVL123456789 " ]
-[
-.I "filenames \&..."
-]
-.ll -8
-.br
-.B bunzip2
-.RB [ " \-fkvsVL " ]
-[
-.I "filenames \&..."
-]
-.br
-.B bzcat
-.RB [ " \-s " ]
-[
-.I "filenames \&..."
-]
-.br
-.B bzip2recover
-.I "filename"
-
-.SH DESCRIPTION
-.I bzip2
-compresses files using the Burrows-Wheeler block sorting
-text compression algorithm, and Huffman coding. Compression is
-generally considerably better than that achieved by more conventional
-LZ77/LZ78-based compressors, and approaches the performance of the PPM
-family of statistical compressors.
-
-The command-line options are deliberately very similar to
-those of
-.I GNU gzip,
-but they are not identical.
-
-.I bzip2
-expects a list of file names to accompany the
-command-line flags. Each file is replaced by a compressed version of
-itself, with the name "original_name.bz2".
-Each compressed file
-has the same modification date, permissions, and, when possible,
-ownership as the corresponding original, so that these properties can
-be correctly restored at decompression time. File name handling is
-naive in the sense that there is no mechanism for preserving original
-file names, permissions, ownerships or dates in filesystems which lack
-these concepts, or have serious file name length restrictions, such as
-MS-DOS.
-
-.I bzip2
-and
-.I bunzip2
-will by default not overwrite existing
-files. If you want this to happen, specify the \-f flag.
-
-If no file names are specified,
-.I bzip2
-compresses from standard
-input to standard output. In this case,
-.I bzip2
-will decline to
-write compressed output to a terminal, as this would be entirely
-incomprehensible and therefore pointless.
-
-.I bunzip2
-(or
-.I bzip2 \-d)
-decompresses all
-specified files. Files which were not created by
-.I bzip2
-will be detected and ignored, and a warning issued.
-.I bzip2
-attempts to guess the filename for the decompressed file
-from that of the compressed file as follows:
-
- filename.bz2 becomes filename
- filename.bz becomes filename
- filename.tbz2 becomes filename.tar
- filename.tbz becomes filename.tar
- anyothername becomes anyothername.out
-
-If the file does not end in one of the recognised endings,
-.I .bz2,
-.I .bz,
-.I .tbz2
-or
-.I .tbz,
-.I bzip2
-complains that it cannot
-guess the name of the original file, and uses the original name
-with
-.I .out
-appended.
-
-As with compression, supplying no
-filenames causes decompression from
-standard input to standard output.
-
-.I bunzip2
-will correctly decompress a file which is the
-concatenation of two or more compressed files. The result is the
-concatenation of the corresponding uncompressed files. Integrity
-testing (\-t)
-of concatenated
-compressed files is also supported.
-
-You can also compress or decompress files to the standard output by
-giving the \-c flag. Multiple files may be compressed and
-decompressed like this. The resulting outputs are fed sequentially to
-stdout. Compression of multiple files
-in this manner generates a stream
-containing multiple compressed file representations. Such a stream
-can be decompressed correctly only by
-.I bzip2
-version 0.9.0 or
-later. Earlier versions of
-.I bzip2
-will stop after decompressing
-the first file in the stream.
-
-.I bzcat
-(or
-.I bzip2 -dc)
-decompresses all specified files to
-the standard output.
-
-.I bzip2
-will read arguments from the environment variables
-.I BZIP2
-and
-.I BZIP,
-in that order, and will process them
-before any arguments read from the command line. This gives a
-convenient way to supply default arguments.
-
-Compression is always performed, even if the compressed
-file is slightly
-larger than the original. Files of less than about one hundred bytes
-tend to get larger, since the compression mechanism has a constant
-overhead in the region of 50 bytes. Random data (including the output
-of most file compressors) is coded at about 8.05 bits per byte, giving
-an expansion of around 0.5%.
-
-As a self-check for your protection,
-.I
-bzip2
-uses 32-bit CRCs to
-make sure that the decompressed version of a file is identical to the
-original. This guards against corruption of the compressed data, and
-against undetected bugs in
-.I bzip2
-(hopefully very unlikely). The
-chances of data corruption going undetected is microscopic, about one
-chance in four billion for each file processed. Be aware, though, that
-the check occurs upon decompression, so it can only tell you that
-something is wrong. It can't help you
-recover the original uncompressed
-data. You can use
-.I bzip2recover
-to try to recover data from
-damaged files.
-
-Return values: 0 for a normal exit, 1 for environmental problems (file
-not found, invalid flags, I/O errors, &c), 2 to indicate a corrupt
-compressed file, 3 for an internal consistency error (eg, bug) which
-caused
-.I bzip2
-to panic.
-
-.SH OPTIONS
-.TP
-.B \-c --stdout
-Compress or decompress to standard output.
-.TP
-.B \-d --decompress
-Force decompression.
-.I bzip2,
-.I bunzip2
-and
-.I bzcat
-are
-really the same program, and the decision about what actions to take is
-done on the basis of which name is used. This flag overrides that
-mechanism, and forces
-.I bzip2
-to decompress.
-.TP
-.B \-z --compress
-The complement to \-d: forces compression, regardless of the
-invocation name.
-.TP
-.B \-t --test
-Check integrity of the specified file(s), but don't decompress them.
-This really performs a trial decompression and throws away the result.
-.TP
-.B \-f --force
-Force overwrite of output files. Normally,
-.I bzip2
-will not overwrite
-existing output files. Also forces
-.I bzip2
-to break hard links
-to files, which it otherwise wouldn't do.
-
-bzip2 normally declines to decompress files which don't have the
-correct magic header bytes. If forced (-f), however, it will pass
-such files through unmodified. This is how GNU gzip behaves.
-.TP
-.B \-k --keep
-Keep (don't delete) input files during compression
-or decompression.
-.TP
-.B \-s --small
-Reduce memory usage, for compression, decompression and testing. Files
-are decompressed and tested using a modified algorithm which only
-requires 2.5 bytes per block byte. This means any file can be
-decompressed in 2300k of memory, albeit at about half the normal speed.
-
-During compression, \-s selects a block size of 200k, which limits
-memory use to around the same figure, at the expense of your compression
-ratio. In short, if your machine is low on memory (8 megabytes or
-less), use \-s for everything. See MEMORY MANAGEMENT below.
-.TP
-.B \-q --quiet
-Suppress non-essential warning messages. Messages pertaining to
-I/O errors and other critical events will not be suppressed.
-.TP
-.B \-v --verbose
-Verbose mode -- show the compression ratio for each file processed.
-Further \-v's increase the verbosity level, spewing out lots of
-information which is primarily of interest for diagnostic purposes.
-.TP
-.B \-L --license -V --version
-Display the software version, license terms and conditions.
-.TP
-.B \-1 (or \-\-fast) to \-9 (or \-\-best)
-Set the block size to 100 k, 200 k .. 900 k when compressing. Has no
-effect when decompressing. See MEMORY MANAGEMENT below.
-The \-\-fast and \-\-best aliases are primarily for GNU gzip
-compatibility. In particular, \-\-fast doesn't make things
-significantly faster.
-And \-\-best merely selects the default behaviour.
-.TP
-.B \--
-Treats all subsequent arguments as file names, even if they start
-with a dash. This is so you can handle files with names beginning
-with a dash, for example: bzip2 \-- \-myfilename.
-.TP
-.B \--repetitive-fast --repetitive-best
-These flags are redundant in versions 0.9.5 and above. They provided
-some coarse control over the behaviour of the sorting algorithm in
-earlier versions, which was sometimes useful. 0.9.5 and above have an
-improved algorithm which renders these flags irrelevant.
-
-.SH MEMORY MANAGEMENT
-.I bzip2
-compresses large files in blocks. The block size affects
-both the compression ratio achieved, and the amount of memory needed for
-compression and decompression. The flags \-1 through \-9
-specify the block size to be 100,000 bytes through 900,000 bytes (the
-default) respectively. At decompression time, the block size used for
-compression is read from the header of the compressed file, and
-.I bunzip2
-then allocates itself just enough memory to decompress
-the file. Since block sizes are stored in compressed files, it follows
-that the flags \-1 to \-9 are irrelevant to and so ignored
-during decompression.
-
-Compression and decompression requirements,
-in bytes, can be estimated as:
-
- Compression: 400k + ( 8 x block size )
-
- Decompression: 100k + ( 4 x block size ), or
- 100k + ( 2.5 x block size )
-
-Larger block sizes give rapidly diminishing marginal returns. Most of
-the compression comes from the first two or three hundred k of block
-size, a fact worth bearing in mind when using
-.I bzip2
-on small machines.
-It is also important to appreciate that the decompression memory
-requirement is set at compression time by the choice of block size.
-
-For files compressed with the default 900k block size,
-.I bunzip2
-will require about 3700 kbytes to decompress. To support decompression
-of any file on a 4 megabyte machine,
-.I bunzip2
-has an option to
-decompress using approximately half this amount of memory, about 2300
-kbytes. Decompression speed is also halved, so you should use this
-option only where necessary. The relevant flag is -s.
-
-In general, try and use the largest block size memory constraints allow,
-since that maximises the compression achieved. Compression and
-decompression speed are virtually unaffected by block size.
-
-Another significant point applies to files which fit in a single block
--- that means most files you'd encounter using a large block size. The
-amount of real memory touched is proportional to the size of the file,
-since the file is smaller than a block. For example, compressing a file
-20,000 bytes long with the flag -9 will cause the compressor to
-allocate around 7600k of memory, but only touch 400k + 20000 * 8 = 560
-kbytes of it. Similarly, the decompressor will allocate 3700k but only
-touch 100k + 20000 * 4 = 180 kbytes.
-
-Here is a table which summarises the maximum memory usage for different
-block sizes. Also recorded is the total compressed size for 14 files of
-the Calgary Text Compression Corpus totalling 3,141,622 bytes. This
-column gives some feel for how compression varies with block size.
-These figures tend to understate the advantage of larger block sizes for
-larger files, since the Corpus is dominated by smaller files.
-
- Compress Decompress Decompress Corpus
- Flag usage usage -s usage Size
-
- -1 1200k 500k 350k 914704
- -2 2000k 900k 600k 877703
- -3 2800k 1300k 850k 860338
- -4 3600k 1700k 1100k 846899
- -5 4400k 2100k 1350k 845160
- -6 5200k 2500k 1600k 838626
- -7 6100k 2900k 1850k 834096
- -8 6800k 3300k 2100k 828642
- -9 7600k 3700k 2350k 828642
-
-.SH RECOVERING DATA FROM DAMAGED FILES
-.I bzip2
-compresses files in blocks, usually 900kbytes long. Each
-block is handled independently. If a media or transmission error causes
-a multi-block .bz2
-file to become damaged, it may be possible to
-recover data from the undamaged blocks in the file.
-
-The compressed representation of each block is delimited by a 48-bit
-pattern, which makes it possible to find the block boundaries with
-reasonable certainty. Each block also carries its own 32-bit CRC, so
-damaged blocks can be distinguished from undamaged ones.
-
-.I bzip2recover
-is a simple program whose purpose is to search for
-blocks in .bz2 files, and write each block out into its own .bz2
-file. You can then use
-.I bzip2
-\-t
-to test the
-integrity of the resulting files, and decompress those which are
-undamaged.
-
-.I bzip2recover
-takes a single argument, the name of the damaged file,
-and writes a number of files "rec00001file.bz2",
-"rec00002file.bz2", etc, containing the extracted blocks.
-The output filenames are designed so that the use of
-wildcards in subsequent processing -- for example,
-"bzip2 -dc rec*file.bz2 > recovered_data" -- processes the files in
-the correct order.
-
-.I bzip2recover
-should be of most use dealing with large .bz2
-files, as these will contain many blocks. It is clearly
-futile to use it on damaged single-block files, since a
-damaged block cannot be recovered. If you wish to minimise
-any potential data loss through media or transmission errors,
-you might consider compressing with a smaller
-block size.
-
-.SH PERFORMANCE NOTES
-The sorting phase of compression gathers together similar strings in the
-file. Because of this, files containing very long runs of repeated
-symbols, like "aabaabaabaab ..." (repeated several hundred times) may
-compress more slowly than normal. Versions 0.9.5 and above fare much
-better than previous versions in this respect. The ratio between
-worst-case and average-case compression time is in the region of 10:1.
-For previous versions, this figure was more like 100:1. You can use the
-\-vvvv option to monitor progress in great detail, if you want.
-
-Decompression speed is unaffected by these phenomena.
-
-.I bzip2
-usually allocates several megabytes of memory to operate
-in, and then charges all over it in a fairly random fashion. This means
-that performance, both for compressing and decompressing, is largely
-determined by the speed at which your machine can service cache misses.
-Because of this, small changes to the code to reduce the miss rate have
-been observed to give disproportionately large performance improvements.
-I imagine
-.I bzip2
-will perform best on machines with very large caches.
-
-.SH CAVEATS
-I/O error messages are not as helpful as they could be.
-.I bzip2
-tries hard to detect I/O errors and exit cleanly, but the details of
-what the problem is sometimes seem rather misleading.
-
-This manual page pertains to version 1.0.4 of
-.I bzip2.
-Compressed data created by this version is entirely forwards and
-backwards compatible with the previous public releases, versions
-0.1pl2, 0.9.0, 0.9.5, 1.0.0, 1.0.1, 1.0.2 and 1.0.3, but with the following
-exception: 0.9.0 and above can correctly decompress multiple
-concatenated compressed files. 0.1pl2 cannot do this; it will stop
-after decompressing just the first file in the stream.
-
-.I bzip2recover
-versions prior to 1.0.2 used 32-bit integers to represent
-bit positions in compressed files, so they could not handle compressed
-files more than 512 megabytes long. Versions 1.0.2 and above use
-64-bit ints on some platforms which support them (GNU supported
-targets, and Windows). To establish whether or not bzip2recover was
-built with such a limitation, run it without arguments. In any event
-you can build yourself an unlimited version if you can recompile it
-with MaybeUInt64 set to be an unsigned 64-bit integer.
-
-
-
-.SH AUTHOR
-Julian Seward, jsewardbzip.org.
-
-http://www.bzip.org
-
-The ideas embodied in
-.I bzip2
-are due to (at least) the following
-people: Michael Burrows and David Wheeler (for the block sorting
-transformation), David Wheeler (again, for the Huffman coder), Peter
-Fenwick (for the structured coding model in the original
-.I bzip,
-and many refinements), and Alistair Moffat, Radford Neal and Ian Witten
-(for the arithmetic coder in the original
-.I bzip).
-I am much
-indebted for their help, support and advice. See the manual in the
-source distribution for pointers to sources of documentation. Christian
-von Roques encouraged me to look for faster sorting algorithms, so as to
-speed up compression. Bela Lubkin encouraged me to improve the
-worst-case compression performance.
-Donna Robinson XMLised the documentation.
-The bz* scripts are derived from those of GNU gzip.
-Many people sent patches, helped
-with portability problems, lent machines, gave advice and were generally
-helpful.
diff --git a/Utilities/cmbzip2/bzip2.1.preformatted b/Utilities/cmbzip2/bzip2.1.preformatted
deleted file mode 100644
index 15e16e5..0000000
--- a/Utilities/cmbzip2/bzip2.1.preformatted
+++ /dev/null
@@ -1,399 +0,0 @@
-bzip2(1) bzip2(1)
-
-
-
-NNAAMMEE
- bzip2, bunzip2 − a blockâ€sorting file compressor, v1.0.4
- bzcat − decompresses files to stdout
- bzip2recover − recovers data from damaged bzip2 files
-
-
-SSYYNNOOPPSSIISS
- bbzziipp22 [ −−ccddffkkqqssttvvzzVVLL112233445566778899 ] [ _f_i_l_e_n_a_m_e_s _._._. ]
- bbuunnzziipp22 [ −−ffkkvvssVVLL ] [ _f_i_l_e_n_a_m_e_s _._._. ]
- bbzzccaatt [ −−ss ] [ _f_i_l_e_n_a_m_e_s _._._. ]
- bbzziipp22rreeccoovveerr _f_i_l_e_n_a_m_e
-
-
-DDEESSCCRRIIPPTTIIOONN
- _b_z_i_p_2 compresses files using the Burrowsâ€Wheeler block
- sorting text compression algorithm, and Huffman coding.
- Compression is generally considerably better than that
- achieved by more conventional LZ77/LZ78â€based compressors,
- and approaches the performance of the PPM family of sta­
- tistical compressors.
-
- The commandâ€line options are deliberately very similar to
- those of _G_N_U _g_z_i_p_, but they are not identical.
-
- _b_z_i_p_2 expects a list of file names to accompany the com­
- mandâ€line flags. Each file is replaced by a compressed
- version of itself, with the name "original_name.bz2".
- Each compressed file has the same modification date, per­
- missions, and, when possible, ownership as the correspond­
- ing original, so that these properties can be correctly
- restored at decompression time. File name handling is
- naive in the sense that there is no mechanism for preserv­
- ing original file names, permissions, ownerships or dates
- in filesystems which lack these concepts, or have serious
- file name length restrictions, such as MSâ€DOS.
-
- _b_z_i_p_2 and _b_u_n_z_i_p_2 will by default not overwrite existing
- files. If you want this to happen, specify the −f flag.
-
- If no file names are specified, _b_z_i_p_2 compresses from
- standard input to standard output. In this case, _b_z_i_p_2
- will decline to write compressed output to a terminal, as
- this would be entirely incomprehensible and therefore
- pointless.
-
- _b_u_n_z_i_p_2 (or _b_z_i_p_2 _−_d_) decompresses all specified files.
- Files which were not created by _b_z_i_p_2 will be detected and
- ignored, and a warning issued. _b_z_i_p_2 attempts to guess
- the filename for the decompressed file from that of the
- compressed file as follows:
-
- filename.bz2 becomes filename
- filename.bz becomes filename
- filename.tbz2 becomes filename.tar
- filename.tbz becomes filename.tar
- anyothername becomes anyothername.out
-
- If the file does not end in one of the recognised endings,
- _._b_z_2_, _._b_z_, _._t_b_z_2 or _._t_b_z_, _b_z_i_p_2 complains that it cannot
- guess the name of the original file, and uses the original
- name with _._o_u_t appended.
-
- As with compression, supplying no filenames causes decom­
- pression from standard input to standard output.
-
- _b_u_n_z_i_p_2 will correctly decompress a file which is the con­
- catenation of two or more compressed files. The result is
- the concatenation of the corresponding uncompressed files.
- Integrity testing (−t) of concatenated compressed files is
- also supported.
-
- You can also compress or decompress files to the standard
- output by giving the −c flag. Multiple files may be com­
- pressed and decompressed like this. The resulting outputs
- are fed sequentially to stdout. Compression of multiple
- files in this manner generates a stream containing multi­
- ple compressed file representations. Such a stream can be
- decompressed correctly only by _b_z_i_p_2 version 0.9.0 or
- later. Earlier versions of _b_z_i_p_2 will stop after decom­
- pressing the first file in the stream.
-
- _b_z_c_a_t (or _b_z_i_p_2 _â€_d_c_) decompresses all specified files to
- the standard output.
-
- _b_z_i_p_2 will read arguments from the environment variables
- _B_Z_I_P_2 and _B_Z_I_P_, in that order, and will process them
- before any arguments read from the command line. This
- gives a convenient way to supply default arguments.
-
- Compression is always performed, even if the compressed
- file is slightly larger than the original. Files of less
- than about one hundred bytes tend to get larger, since the
- compression mechanism has a constant overhead in the
- region of 50 bytes. Random data (including the output of
- most file compressors) is coded at about 8.05 bits per
- byte, giving an expansion of around 0.5%.
-
- As a selfâ€check for your protection, _b_z_i_p_2 uses 32â€bit
- CRCs to make sure that the decompressed version of a file
- is identical to the original. This guards against corrup­
- tion of the compressed data, and against undetected bugs
- in _b_z_i_p_2 (hopefully very unlikely). The chances of data
- corruption going undetected is microscopic, about one
- chance in four billion for each file processed. Be aware,
- though, that the check occurs upon decompression, so it
- can only tell you that something is wrong. It can’t help
- you recover the original uncompressed data. You can use
- _b_z_i_p_2_r_e_c_o_v_e_r to try to recover data from damaged files.
-
- Return values: 0 for a normal exit, 1 for environmental
- problems (file not found, invalid flags, I/O errors, &c),
- 2 to indicate a corrupt compressed file, 3 for an internal
- consistency error (eg, bug) which caused _b_z_i_p_2 to panic.
-
-
-OOPPTTIIOONNSS
- −−cc â€â€â€â€ssttddoouutt
- Compress or decompress to standard output.
-
- −−dd â€â€â€â€ddeeccoommpprreessss
- Force decompression. _b_z_i_p_2_, _b_u_n_z_i_p_2 and _b_z_c_a_t are
- really the same program, and the decision about
- what actions to take is done on the basis of which
- name is used. This flag overrides that mechanism,
- and forces _b_z_i_p_2 to decompress.
-
- −−zz â€â€â€â€ccoommpprreessss
- The complement to −d: forces compression,
- regardless of the invocation name.
-
- −−tt â€â€â€â€tteesstt
- Check integrity of the specified file(s), but don’t
- decompress them. This really performs a trial
- decompression and throws away the result.
-
- −−ff â€â€â€â€ffoorrccee
- Force overwrite of output files. Normally, _b_z_i_p_2
- will not overwrite existing output files. Also
- forces _b_z_i_p_2 to break hard links to files, which it
- otherwise wouldn’t do.
-
- bzip2 normally declines to decompress files which
- don’t have the correct magic header bytes. If
- forced (â€f), however, it will pass such files
- through unmodified. This is how GNU gzip behaves.
-
- −−kk â€â€â€â€kkeeeepp
- Keep (don’t delete) input files during compression
- or decompression.
-
- −−ss â€â€â€â€ssmmaallll
- Reduce memory usage, for compression, decompression
- and testing. Files are decompressed and tested
- using a modified algorithm which only requires 2.5
- bytes per block byte. This means any file can be
- decompressed in 2300k of memory, albeit at about
- half the normal speed.
-
- During compression, −s selects a block size of
- 200k, which limits memory use to around the same
- figure, at the expense of your compression ratio.
- In short, if your machine is low on memory (8
- megabytes or less), use −s for everything. See
- MEMORY MANAGEMENT below.
-
- −−qq â€â€â€â€qquuiieett
- Suppress nonâ€essential warning messages. Messages
- pertaining to I/O errors and other critical events
- will not be suppressed.
-
- −−vv â€â€â€â€vveerrbboossee
- Verbose mode â€â€ show the compression ratio for each
- file processed. Further −v’s increase the ver­
- bosity level, spewing out lots of information which
- is primarily of interest for diagnostic purposes.
-
- −−LL â€â€â€â€lliicceennssee â€â€VV â€â€â€â€vveerrssiioonn
- Display the software version, license terms and
- conditions.
-
- −−11 ((oorr −−−−ffaasstt)) ttoo −−99 ((oorr −−−−bbeesstt))
- Set the block size to 100 k, 200 k .. 900 k when
- compressing. Has no effect when decompressing.
- See MEMORY MANAGEMENT below. The −−fast and −−best
- aliases are primarily for GNU gzip compatibility.
- In particular, −−fast doesn’t make things signifi­
- cantly faster. And −−best merely selects the
- default behaviour.
-
- −− Treats all subsequent arguments as file names, even
- if they start with a dash. This is so you can han­
- dle files with names beginning with a dash, for
- example: bzip2 −†−myfilename.
-
- −−â€â€rreeppeettiittiivveeâ€â€ffaasstt â€â€â€â€rreeppeettiittiivveeâ€â€bbeesstt
- These flags are redundant in versions 0.9.5 and
- above. They provided some coarse control over the
- behaviour of the sorting algorithm in earlier ver­
- sions, which was sometimes useful. 0.9.5 and above
- have an improved algorithm which renders these
- flags irrelevant.
-
-
-MMEEMMOORRYY MMAANNAAGGEEMMEENNTT
- _b_z_i_p_2 compresses large files in blocks. The block size
- affects both the compression ratio achieved, and the
- amount of memory needed for compression and decompression.
- The flags −1 through −9 specify the block size to be
- 100,000 bytes through 900,000 bytes (the default) respec­
- tively. At decompression time, the block size used for
- compression is read from the header of the compressed
- file, and _b_u_n_z_i_p_2 then allocates itself just enough memory
- to decompress the file. Since block sizes are stored in
- compressed files, it follows that the flags −1 to −9 are
- irrelevant to and so ignored during decompression.
-
- Compression and decompression requirements, in bytes, can
- be estimated as:
-
- Compression: 400k + ( 8 x block size )
-
- Decompression: 100k + ( 4 x block size ), or
- 100k + ( 2.5 x block size )
-
- Larger block sizes give rapidly diminishing marginal
- returns. Most of the compression comes from the first two
- or three hundred k of block size, a fact worth bearing in
- mind when using _b_z_i_p_2 on small machines. It is also
- important to appreciate that the decompression memory
- requirement is set at compression time by the choice of
- block size.
-
- For files compressed with the default 900k block size,
- _b_u_n_z_i_p_2 will require about 3700 kbytes to decompress. To
- support decompression of any file on a 4 megabyte machine,
- _b_u_n_z_i_p_2 has an option to decompress using approximately
- half this amount of memory, about 2300 kbytes. Decompres­
- sion speed is also halved, so you should use this option
- only where necessary. The relevant flag is â€s.
-
- In general, try and use the largest block size memory con­
- straints allow, since that maximises the compression
- achieved. Compression and decompression speed are virtu­
- ally unaffected by block size.
-
- Another significant point applies to files which fit in a
- single block â€â€ that means most files you’d encounter
- using a large block size. The amount of real memory
- touched is proportional to the size of the file, since the
- file is smaller than a block. For example, compressing a
- file 20,000 bytes long with the flag â€9 will cause the
- compressor to allocate around 7600k of memory, but only
- touch 400k + 20000 * 8 = 560 kbytes of it. Similarly, the
- decompressor will allocate 3700k but only touch 100k +
- 20000 * 4 = 180 kbytes.
-
- Here is a table which summarises the maximum memory usage
- for different block sizes. Also recorded is the total
- compressed size for 14 files of the Calgary Text Compres­
- sion Corpus totalling 3,141,622 bytes. This column gives
- some feel for how compression varies with block size.
- These figures tend to understate the advantage of larger
- block sizes for larger files, since the Corpus is domi­
- nated by smaller files.
-
- Compress Decompress Decompress Corpus
- Flag usage usage â€s usage Size
-
- â€1 1200k 500k 350k 914704
- â€2 2000k 900k 600k 877703
- â€3 2800k 1300k 850k 860338
- â€4 3600k 1700k 1100k 846899
- â€5 4400k 2100k 1350k 845160
- â€6 5200k 2500k 1600k 838626
- â€7 6100k 2900k 1850k 834096
- â€8 6800k 3300k 2100k 828642
- â€9 7600k 3700k 2350k 828642
-
-
-RREECCOOVVEERRIINNGG DDAATTAA FFRROOMM DDAAMMAAGGEEDD FFIILLEESS
- _b_z_i_p_2 compresses files in blocks, usually 900kbytes long.
- Each block is handled independently. If a media or trans­
- mission error causes a multiâ€block .bz2 file to become
- damaged, it may be possible to recover data from the
- undamaged blocks in the file.
-
- The compressed representation of each block is delimited
- by a 48â€bit pattern, which makes it possible to find the
- block boundaries with reasonable certainty. Each block
- also carries its own 32â€bit CRC, so damaged blocks can be
- distinguished from undamaged ones.
-
- _b_z_i_p_2_r_e_c_o_v_e_r is a simple program whose purpose is to
- search for blocks in .bz2 files, and write each block out
- into its own .bz2 file. You can then use _b_z_i_p_2 −t to test
- the integrity of the resulting files, and decompress those
- which are undamaged.
-
- _b_z_i_p_2_r_e_c_o_v_e_r takes a single argument, the name of the dam­
- aged file, and writes a number of files
- "rec00001file.bz2", "rec00002file.bz2", etc, containing
- the extracted blocks. The output filenames are
- designed so that the use of wildcards in subsequent pro­
- cessing â€â€ for example, "bzip2 â€dc rec*file.bz2 > recov­
- ered_data" â€â€ processes the files in the correct order.
-
- _b_z_i_p_2_r_e_c_o_v_e_r should be of most use dealing with large .bz2
- files, as these will contain many blocks. It is clearly
- futile to use it on damaged singleâ€block files, since a
- damaged block cannot be recovered. If you wish to min­
- imise any potential data loss through media or transmis­
- sion errors, you might consider compressing with a smaller
- block size.
-
-
-PPEERRFFOORRMMAANNCCEE NNOOTTEESS
- The sorting phase of compression gathers together similar
- strings in the file. Because of this, files containing
- very long runs of repeated symbols, like "aabaabaabaab
- ..." (repeated several hundred times) may compress more
- slowly than normal. Versions 0.9.5 and above fare much
- better than previous versions in this respect. The ratio
- between worstâ€case and averageâ€case compression time is in
- the region of 10:1. For previous versions, this figure
- was more like 100:1. You can use the −vvvv option to mon­
- itor progress in great detail, if you want.
-
- Decompression speed is unaffected by these phenomena.
-
- _b_z_i_p_2 usually allocates several megabytes of memory to
- operate in, and then charges all over it in a fairly ran­
- dom fashion. This means that performance, both for com­
- pressing and decompressing, is largely determined by the
- speed at which your machine can service cache misses.
- Because of this, small changes to the code to reduce the
- miss rate have been observed to give disproportionately
- large performance improvements. I imagine _b_z_i_p_2 will per­
- form best on machines with very large caches.
-
-
-CCAAVVEEAATTSS
- I/O error messages are not as helpful as they could be.
- _b_z_i_p_2 tries hard to detect I/O errors and exit cleanly,
- but the details of what the problem is sometimes seem
- rather misleading.
-
- This manual page pertains to version 1.0.4 of _b_z_i_p_2_. Com­
- pressed data created by this version is entirely forwards
- and backwards compatible with the previous public
- releases, versions 0.1pl2, 0.9.0, 0.9.5, 1.0.0, 1.0.1,
- 1.0.2 and 1.0.3, but with the following exception: 0.9.0
- and above can correctly decompress multiple concatenated
- compressed files. 0.1pl2 cannot do this; it will stop
- after decompressing just the first file in the stream.
-
- _b_z_i_p_2_r_e_c_o_v_e_r versions prior to 1.0.2 used 32â€bit integers
- to represent bit positions in compressed files, so they
- could not handle compressed files more than 512 megabytes
- long. Versions 1.0.2 and above use 64â€bit ints on some
- platforms which support them (GNU supported targets, and
- Windows). To establish whether or not bzip2recover was
- built with such a limitation, run it without arguments.
- In any event you can build yourself an unlimited version
- if you can recompile it with MaybeUInt64 set to be an
- unsigned 64â€bit integer.
-
-
-
-
-AAUUTTHHOORR
- Julian Seward, jsewardbzip.org.
-
- http://www.bzip.org
-
- The ideas embodied in _b_z_i_p_2 are due to (at least) the fol­
- lowing people: Michael Burrows and David Wheeler (for the
- block sorting transformation), David Wheeler (again, for
- the Huffman coder), Peter Fenwick (for the structured cod­
- ing model in the original _b_z_i_p_, and many refinements), and
- Alistair Moffat, Radford Neal and Ian Witten (for the
- arithmetic coder in the original _b_z_i_p_)_. I am much
- indebted for their help, support and advice. See the man­
- ual in the source distribution for pointers to sources of
- documentation. Christian von Roques encouraged me to look
- for faster sorting algorithms, so as to speed up compres­
- sion. Bela Lubkin encouraged me to improve the worstâ€case
- compression performance. Donna Robinson XMLised the docu­
- mentation. The bz* scripts are derived from those of GNU
- gzip. Many people sent patches, helped with portability
- problems, lent machines, gave advice and were generally
- helpful.
-
-
-
- bzip2(1)
diff --git a/Utilities/cmbzip2/bzip2.c b/Utilities/cmbzip2/bzip2.c
index 88e5f09..d95d280 100644
--- a/Utilities/cmbzip2/bzip2.c
+++ b/Utilities/cmbzip2/bzip2.c
@@ -7,8 +7,8 @@
This file is part of bzip2/libbzip2, a program and library for
lossless, block-sorting data compression.
- bzip2/libbzip2 version 1.0.5 of 10 December 2007
- Copyright (C) 1996-2007 Julian Seward <jseward@bzip.org>
+ bzip2/libbzip2 version 1.0.8 of 13 July 2019
+ Copyright (C) 1996-2019 Julian Seward <jseward@acm.org>
Please read the WARNING, DISCLAIMER and PATENTS sections in the
README file.
@@ -128,12 +128,12 @@
#if BZ_LCCWIN32
# include <io.h>
# include <fcntl.h>
-# include <sys\stat.h>
+# include <sys/stat.h>
# define NORETURN /**/
# define PATH_SEP '\\'
-# define MY_LSTAT _stat
-# define MY_STAT _stat
+# define MY_LSTAT _stati64
+# define MY_STAT _stati64
# define MY_S_ISREG(x) ((x) & _S_IFREG)
# define MY_S_ISDIR(x) ((x) & _S_IFDIR)
@@ -380,27 +380,27 @@ void compressStream ( FILE *stream, FILE *zStream )
if (verbosity >= 1) {
if (nbytes_in_lo32 == 0 && nbytes_in_hi32 == 0) {
- fprintf ( stderr, " no data compressed.\n");
+ fprintf ( stderr, " no data compressed.\n");
} else {
- Char buf_nin[32], buf_nout[32];
- UInt64 nbytes_in, nbytes_out;
- double nbytes_in_d, nbytes_out_d;
- uInt64_from_UInt32s ( &nbytes_in,
- nbytes_in_lo32, nbytes_in_hi32 );
- uInt64_from_UInt32s ( &nbytes_out,
- nbytes_out_lo32, nbytes_out_hi32 );
- nbytes_in_d = uInt64_to_double ( &nbytes_in );
- nbytes_out_d = uInt64_to_double ( &nbytes_out );
- uInt64_toAscii ( buf_nin, &nbytes_in );
- uInt64_toAscii ( buf_nout, &nbytes_out );
- fprintf ( stderr, "%6.3f:1, %6.3f bits/byte, "
- "%5.2f%% saved, %s in, %s out.\n",
- nbytes_in_d / nbytes_out_d,
- (8.0 * nbytes_out_d) / nbytes_in_d,
- 100.0 * (1.0 - nbytes_out_d / nbytes_in_d),
- buf_nin,
- buf_nout
- );
+ Char buf_nin[32], buf_nout[32];
+ UInt64 nbytes_in, nbytes_out;
+ double nbytes_in_d, nbytes_out_d;
+ uInt64_from_UInt32s ( &nbytes_in,
+ nbytes_in_lo32, nbytes_in_hi32 );
+ uInt64_from_UInt32s ( &nbytes_out,
+ nbytes_out_lo32, nbytes_out_hi32 );
+ nbytes_in_d = uInt64_to_double ( &nbytes_in );
+ nbytes_out_d = uInt64_to_double ( &nbytes_out );
+ uInt64_toAscii ( buf_nin, &nbytes_in );
+ uInt64_toAscii ( buf_nout, &nbytes_out );
+ fprintf ( stderr, "%6.3f:1, %6.3f bits/byte, "
+ "%5.2f%% saved, %s in, %s out.\n",
+ nbytes_in_d / nbytes_out_d,
+ (8.0 * nbytes_out_d) / nbytes_in_d,
+ 100.0 * (1.0 - nbytes_out_d / nbytes_in_d),
+ buf_nin,
+ buf_nout
+ );
}
}
@@ -505,11 +505,11 @@ Bool uncompressStream ( FILE *zStream, FILE *stream )
if (forceOverwrite) {
rewind(zStream);
while (True) {
- if (myfeof(zStream)) break;
- nread = fread ( obuf, sizeof(UChar), 5000, zStream );
- if (ferror(zStream)) goto errhandler_io;
- if (nread > 0) fwrite ( obuf, sizeof(UChar), nread, stream );
- if (ferror(stream)) goto errhandler_io;
+ if (myfeof(zStream)) break;
+ nread = fread ( obuf, sizeof(UChar), 5000, zStream );
+ if (ferror(zStream)) goto errhandler_io;
+ if (nread > 0) fwrite ( obuf, sizeof(UChar), nread, stream );
+ if (ferror(stream)) goto errhandler_io;
}
goto closeok;
}
@@ -554,7 +554,7 @@ static
Bool testStream ( FILE *zStream )
{
BZFILE* bzf = NULL;
- Int32 bzerr, bzerr_dummy, ret, nread, streamNo, i;
+ Int32 bzerr, bzerr_dummy, ret, streamNo, i;
UChar obuf[5000];
UChar unused[BZ_MAX_UNUSED];
Int32 nUnused;
@@ -577,7 +577,7 @@ Bool testStream ( FILE *zStream )
streamNo++;
while (bzerr == BZ_OK) {
- nread = BZ2_bzRead ( &bzerr, bzf, obuf, 5000 );
+ BZ2_bzRead ( &bzerr, bzf, obuf, 5000 );
if (bzerr == BZ_DATA_ERROR_MAGIC) goto errhandler;
}
if (bzerr != BZ_STREAM_END) goto errhandler;
@@ -748,8 +748,8 @@ void panic ( const Char* s )
fprintf ( stderr,
"\n%s: PANIC -- internal consistency error:\n"
"\t%s\n"
- "\tThis is a BUG. Please report it to me at:\n"
- "\tjseward@bzip.org\n",
+ "\tThis is a BUG. Please report it to:\n"
+ "\tbzip2-devel@sourceware.org\n",
progName, s );
showFileNames();
cleanUpAndFail( 3 );
@@ -775,9 +775,9 @@ void compressedStreamEOF ( void )
{
if (noisy) {
fprintf ( stderr,
- "\n%s: Compressed file ends unexpectedly;\n\t"
- "perhaps it is corrupted? *Possible* reason follows.\n",
- progName );
+ "\n%s: Compressed file ends unexpectedly;\n\t"
+ "perhaps it is corrupted? *Possible* reason follows.\n",
+ progName );
perror ( progName );
showFileNames();
cadvise();
@@ -829,7 +829,7 @@ void mySIGSEGVorSIGBUScatcher ( IntNative n )
" The user's manual, Section 4.3, has more info on (1) and (2).\n"
" \n"
" If you suspect this is a bug in bzip2, or are unsure about (1)\n"
- " or (2), feel free to report it to me at: jseward@bzip.org.\n"
+ " or (2), feel free to report it to: bzip2-devel@sourceware.org.\n"
" Section 4.3 of the user's manual describes the info a useful\n"
" bug report should have. If the manual is available on your\n"
" system, please try and read it before mailing me. If you don't\n"
@@ -852,7 +852,7 @@ void mySIGSEGVorSIGBUScatcher ( IntNative n )
" The user's manual, Section 4.3, has more info on (2) and (3).\n"
" \n"
" If you suspect this is a bug in bzip2, or are unsure about (2)\n"
- " or (3), feel free to report it to me at: jseward@bzip.org.\n"
+ " or (3), feel free to report it to: bzip2-devel@sourceware.org.\n"
" Section 4.3 of the user's manual describes the info a useful\n"
" bug report should have. If the manual is available on your\n"
" system, please try and read it before mailing me. If you don't\n"
@@ -1200,12 +1200,12 @@ void compress ( Char *name )
}
if ( srcMode == SM_F2F && fileExists ( outName ) ) {
if (forceOverwrite) {
- remove(outName);
+ remove(outName);
} else {
- fprintf ( stderr, "%s: Output file %s already exists.\n",
- progName, outName );
- setExit(1);
- return;
+ fprintf ( stderr, "%s: Output file %s already exists.\n",
+ progName, outName );
+ setExit(1);
+ return;
}
}
if ( srcMode == SM_F2F && !forceOverwrite &&
@@ -1386,7 +1386,7 @@ void uncompress ( Char *name )
}
if ( srcMode == SM_F2F && fileExists ( outName ) ) {
if (forceOverwrite) {
- remove(outName);
+ remove(outName);
} else {
fprintf ( stderr, "%s: Output file %s already exists.\n",
progName, outName );
@@ -1605,11 +1605,11 @@ void license ( void )
"bzip2, a block-sorting file compressor. "
"Version %s.\n"
" \n"
- " Copyright (C) 1996-2007 by Julian Seward.\n"
+ " Copyright (C) 1996-2019 by Julian Seward.\n"
" \n"
" This program is free software; you can redistribute it and/or modify\n"
" it under the terms set out in the LICENSE file, which is included\n"
- " in the bzip2-1.0.5 source distribution.\n"
+ " in the bzip2 source distribution.\n"
" \n"
" This program is distributed in the hope that it will be useful,\n"
" but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
@@ -1997,18 +1997,20 @@ IntNative main ( IntNative argc, Char *argv[] )
} else {
decode = True;
for (aa = argList; aa != NULL; aa = aa->link) {
- if (ISFLAG("--")) { decode = False; continue; }
+ if (ISFLAG("--")) { decode = False; continue; }
if (aa->name[0] == '-' && decode) continue;
numFilesProcessed++;
testf ( aa->name );
- }
+ }
}
- if (testFailsExist && noisy) {
- fprintf ( stderr,
- "\n"
- "You can use the `bzip2recover' program to attempt to recover\n"
- "data from undamaged sections of corrupted files.\n\n"
- );
+ if (testFailsExist) {
+ if (noisy) {
+ fprintf ( stderr,
+ "\n"
+ "You can use the `bzip2recover' program to attempt to recover\n"
+ "data from undamaged sections of corrupted files.\n\n"
+ );
+ }
setExit(2);
exit(exitValue);
}
diff --git a/Utilities/cmbzip2/bzip2.txt b/Utilities/cmbzip2/bzip2.txt
deleted file mode 100644
index 4fb9c74..0000000
--- a/Utilities/cmbzip2/bzip2.txt
+++ /dev/null
@@ -1,391 +0,0 @@
-
-NAME
- bzip2, bunzip2 - a block-sorting file compressor, v1.0.4
- bzcat - decompresses files to stdout
- bzip2recover - recovers data from damaged bzip2 files
-
-
-SYNOPSIS
- bzip2 [ -cdfkqstvzVL123456789 ] [ filenames ... ]
- bunzip2 [ -fkvsVL ] [ filenames ... ]
- bzcat [ -s ] [ filenames ... ]
- bzip2recover filename
-
-
-DESCRIPTION
- bzip2 compresses files using the Burrows-Wheeler block
- sorting text compression algorithm, and Huffman coding.
- Compression is generally considerably better than that
- achieved by more conventional LZ77/LZ78-based compressors,
- and approaches the performance of the PPM family of sta-
- tistical compressors.
-
- The command-line options are deliberately very similar to
- those of GNU gzip, but they are not identical.
-
- bzip2 expects a list of file names to accompany the com-
- mand-line flags. Each file is replaced by a compressed
- version of itself, with the name "original_name.bz2".
- Each compressed file has the same modification date, per-
- missions, and, when possible, ownership as the correspond-
- ing original, so that these properties can be correctly
- restored at decompression time. File name handling is
- naive in the sense that there is no mechanism for preserv-
- ing original file names, permissions, ownerships or dates
- in filesystems which lack these concepts, or have serious
- file name length restrictions, such as MS-DOS.
-
- bzip2 and bunzip2 will by default not overwrite existing
- files. If you want this to happen, specify the -f flag.
-
- If no file names are specified, bzip2 compresses from
- standard input to standard output. In this case, bzip2
- will decline to write compressed output to a terminal, as
- this would be entirely incomprehensible and therefore
- pointless.
-
- bunzip2 (or bzip2 -d) decompresses all specified files.
- Files which were not created by bzip2 will be detected and
- ignored, and a warning issued. bzip2 attempts to guess
- the filename for the decompressed file from that of the
- compressed file as follows:
-
- filename.bz2 becomes filename
- filename.bz becomes filename
- filename.tbz2 becomes filename.tar
- filename.tbz becomes filename.tar
- anyothername becomes anyothername.out
-
- If the file does not end in one of the recognised endings,
- .bz2, .bz, .tbz2 or .tbz, bzip2 complains that it cannot
- guess the name of the original file, and uses the original
- name with .out appended.
-
- As with compression, supplying no filenames causes decom-
- pression from standard input to standard output.
-
- bunzip2 will correctly decompress a file which is the con-
- catenation of two or more compressed files. The result is
- the concatenation of the corresponding uncompressed files.
- Integrity testing (-t) of concatenated compressed files is
- also supported.
-
- You can also compress or decompress files to the standard
- output by giving the -c flag. Multiple files may be com-
- pressed and decompressed like this. The resulting outputs
- are fed sequentially to stdout. Compression of multiple
- files in this manner generates a stream containing multi-
- ple compressed file representations. Such a stream can be
- decompressed correctly only by bzip2 version 0.9.0 or
- later. Earlier versions of bzip2 will stop after decom-
- pressing the first file in the stream.
-
- bzcat (or bzip2 -dc) decompresses all specified files to
- the standard output.
-
- bzip2 will read arguments from the environment variables
- BZIP2 and BZIP, in that order, and will process them
- before any arguments read from the command line. This
- gives a convenient way to supply default arguments.
-
- Compression is always performed, even if the compressed
- file is slightly larger than the original. Files of less
- than about one hundred bytes tend to get larger, since the
- compression mechanism has a constant overhead in the
- region of 50 bytes. Random data (including the output of
- most file compressors) is coded at about 8.05 bits per
- byte, giving an expansion of around 0.5%.
-
- As a self-check for your protection, bzip2 uses 32-bit
- CRCs to make sure that the decompressed version of a file
- is identical to the original. This guards against corrup-
- tion of the compressed data, and against undetected bugs
- in bzip2 (hopefully very unlikely). The chances of data
- corruption going undetected is microscopic, about one
- chance in four billion for each file processed. Be aware,
- though, that the check occurs upon decompression, so it
- can only tell you that something is wrong. It can't help
- you recover the original uncompressed data. You can use
- bzip2recover to try to recover data from damaged files.
-
- Return values: 0 for a normal exit, 1 for environmental
- problems (file not found, invalid flags, I/O errors, &c),
- 2 to indicate a corrupt compressed file, 3 for an internal
- consistency error (eg, bug) which caused bzip2 to panic.
-
-
-OPTIONS
- -c --stdout
- Compress or decompress to standard output.
-
- -d --decompress
- Force decompression. bzip2, bunzip2 and bzcat are
- really the same program, and the decision about
- what actions to take is done on the basis of which
- name is used. This flag overrides that mechanism,
- and forces bzip2 to decompress.
-
- -z --compress
- The complement to -d: forces compression,
- regardless of the invocation name.
-
- -t --test
- Check integrity of the specified file(s), but don't
- decompress them. This really performs a trial
- decompression and throws away the result.
-
- -f --force
- Force overwrite of output files. Normally, bzip2
- will not overwrite existing output files. Also
- forces bzip2 to break hard links to files, which it
- otherwise wouldn't do.
-
- bzip2 normally declines to decompress files which
- don't have the correct magic header bytes. If
- forced (-f), however, it will pass such files
- through unmodified. This is how GNU gzip behaves.
-
- -k --keep
- Keep (don't delete) input files during compression
- or decompression.
-
- -s --small
- Reduce memory usage, for compression, decompression
- and testing. Files are decompressed and tested
- using a modified algorithm which only requires 2.5
- bytes per block byte. This means any file can be
- decompressed in 2300k of memory, albeit at about
- half the normal speed.
-
- During compression, -s selects a block size of
- 200k, which limits memory use to around the same
- figure, at the expense of your compression ratio.
- In short, if your machine is low on memory (8
- megabytes or less), use -s for everything. See
- MEMORY MANAGEMENT below.
-
- -q --quiet
- Suppress non-essential warning messages. Messages
- pertaining to I/O errors and other critical events
- will not be suppressed.
-
- -v --verbose
- Verbose mode -- show the compression ratio for each
- file processed. Further -v's increase the ver-
- bosity level, spewing out lots of information which
- is primarily of interest for diagnostic purposes.
-
- -L --license -V --version
- Display the software version, license terms and
- conditions.
-
- -1 (or --fast) to -9 (or --best)
- Set the block size to 100 k, 200 k .. 900 k when
- compressing. Has no effect when decompressing.
- See MEMORY MANAGEMENT below. The --fast and --best
- aliases are primarily for GNU gzip compatibility.
- In particular, --fast doesn't make things signifi-
- cantly faster. And --best merely selects the
- default behaviour.
-
- -- Treats all subsequent arguments as file names, even
- if they start with a dash. This is so you can han-
- dle files with names beginning with a dash, for
- example: bzip2 -- -myfilename.
-
- --repetitive-fast --repetitive-best
- These flags are redundant in versions 0.9.5 and
- above. They provided some coarse control over the
- behaviour of the sorting algorithm in earlier ver-
- sions, which was sometimes useful. 0.9.5 and above
- have an improved algorithm which renders these
- flags irrelevant.
-
-
-MEMORY MANAGEMENT
- bzip2 compresses large files in blocks. The block size
- affects both the compression ratio achieved, and the
- amount of memory needed for compression and decompression.
- The flags -1 through -9 specify the block size to be
- 100,000 bytes through 900,000 bytes (the default) respec-
- tively. At decompression time, the block size used for
- compression is read from the header of the compressed
- file, and bunzip2 then allocates itself just enough memory
- to decompress the file. Since block sizes are stored in
- compressed files, it follows that the flags -1 to -9 are
- irrelevant to and so ignored during decompression.
-
- Compression and decompression requirements, in bytes, can
- be estimated as:
-
- Compression: 400k + ( 8 x block size )
-
- Decompression: 100k + ( 4 x block size ), or
- 100k + ( 2.5 x block size )
-
- Larger block sizes give rapidly diminishing marginal
- returns. Most of the compression comes from the first two
- or three hundred k of block size, a fact worth bearing in
- mind when using bzip2 on small machines. It is also
- important to appreciate that the decompression memory
- requirement is set at compression time by the choice of
- block size.
-
- For files compressed with the default 900k block size,
- bunzip2 will require about 3700 kbytes to decompress. To
- support decompression of any file on a 4 megabyte machine,
- bunzip2 has an option to decompress using approximately
- half this amount of memory, about 2300 kbytes. Decompres-
- sion speed is also halved, so you should use this option
- only where necessary. The relevant flag is -s.
-
- In general, try and use the largest block size memory con-
- straints allow, since that maximises the compression
- achieved. Compression and decompression speed are virtu-
- ally unaffected by block size.
-
- Another significant point applies to files which fit in a
- single block -- that means most files you'd encounter
- using a large block size. The amount of real memory
- touched is proportional to the size of the file, since the
- file is smaller than a block. For example, compressing a
- file 20,000 bytes long with the flag -9 will cause the
- compressor to allocate around 7600k of memory, but only
- touch 400k + 20000 * 8 = 560 kbytes of it. Similarly, the
- decompressor will allocate 3700k but only touch 100k +
- 20000 * 4 = 180 kbytes.
-
- Here is a table which summarises the maximum memory usage
- for different block sizes. Also recorded is the total
- compressed size for 14 files of the Calgary Text Compres-
- sion Corpus totalling 3,141,622 bytes. This column gives
- some feel for how compression varies with block size.
- These figures tend to understate the advantage of larger
- block sizes for larger files, since the Corpus is domi-
- nated by smaller files.
-
- Compress Decompress Decompress Corpus
- Flag usage usage -s usage Size
-
- -1 1200k 500k 350k 914704
- -2 2000k 900k 600k 877703
- -3 2800k 1300k 850k 860338
- -4 3600k 1700k 1100k 846899
- -5 4400k 2100k 1350k 845160
- -6 5200k 2500k 1600k 838626
- -7 6100k 2900k 1850k 834096
- -8 6800k 3300k 2100k 828642
- -9 7600k 3700k 2350k 828642
-
-
-RECOVERING DATA FROM DAMAGED FILES
- bzip2 compresses files in blocks, usually 900kbytes long.
- Each block is handled independently. If a media or trans-
- mission error causes a multi-block .bz2 file to become
- damaged, it may be possible to recover data from the
- undamaged blocks in the file.
-
- The compressed representation of each block is delimited
- by a 48-bit pattern, which makes it possible to find the
- block boundaries with reasonable certainty. Each block
- also carries its own 32-bit CRC, so damaged blocks can be
- distinguished from undamaged ones.
-
- bzip2recover is a simple program whose purpose is to
- search for blocks in .bz2 files, and write each block out
- into its own .bz2 file. You can then use bzip2 -t to test
- the integrity of the resulting files, and decompress those
- which are undamaged.
-
- bzip2recover takes a single argument, the name of the dam-
- aged file, and writes a number of files
- "rec00001file.bz2", "rec00002file.bz2", etc, containing
- the extracted blocks. The output filenames are
- designed so that the use of wildcards in subsequent pro-
- cessing -- for example, "bzip2 -dc rec*file.bz2 > recov-
- ered_data" -- processes the files in the correct order.
-
- bzip2recover should be of most use dealing with large .bz2
- files, as these will contain many blocks. It is clearly
- futile to use it on damaged single-block files, since a
- damaged block cannot be recovered. If you wish to min-
- imise any potential data loss through media or transmis-
- sion errors, you might consider compressing with a smaller
- block size.
-
-
-PERFORMANCE NOTES
- The sorting phase of compression gathers together similar
- strings in the file. Because of this, files containing
- very long runs of repeated symbols, like "aabaabaabaab
- ..." (repeated several hundred times) may compress more
- slowly than normal. Versions 0.9.5 and above fare much
- better than previous versions in this respect. The ratio
- between worst-case and average-case compression time is in
- the region of 10:1. For previous versions, this figure
- was more like 100:1. You can use the -vvvv option to mon-
- itor progress in great detail, if you want.
-
- Decompression speed is unaffected by these phenomena.
-
- bzip2 usually allocates several megabytes of memory to
- operate in, and then charges all over it in a fairly ran-
- dom fashion. This means that performance, both for com-
- pressing and decompressing, is largely determined by the
- speed at which your machine can service cache misses.
- Because of this, small changes to the code to reduce the
- miss rate have been observed to give disproportionately
- large performance improvements. I imagine bzip2 will per-
- form best on machines with very large caches.
-
-
-CAVEATS
- I/O error messages are not as helpful as they could be.
- bzip2 tries hard to detect I/O errors and exit cleanly,
- but the details of what the problem is sometimes seem
- rather misleading.
-
- This manual page pertains to version 1.0.4 of bzip2. Com-
- pressed data created by this version is entirely forwards
- and backwards compatible with the previous public
- releases, versions 0.1pl2, 0.9.0, 0.9.5, 1.0.0, 1.0.1,
- 1.0.2 and 1.0.3, but with the following exception: 0.9.0
- and above can correctly decompress multiple concatenated
- compressed files. 0.1pl2 cannot do this; it will stop
- after decompressing just the first file in the stream.
-
- bzip2recover versions prior to 1.0.2 used 32-bit integers
- to represent bit positions in compressed files, so they
- could not handle compressed files more than 512 megabytes
- long. Versions 1.0.2 and above use 64-bit ints on some
- platforms which support them (GNU supported targets, and
- Windows). To establish whether or not bzip2recover was
- built with such a limitation, run it without arguments.
- In any event you can build yourself an unlimited version
- if you can recompile it with MaybeUInt64 set to be an
- unsigned 64-bit integer.
-
-
-AUTHOR
- Julian Seward, jsewardbzip.org.
-
- http://www.bzip.org
-
- The ideas embodied in bzip2 are due to (at least) the fol-
- lowing people: Michael Burrows and David Wheeler (for the
- block sorting transformation), David Wheeler (again, for
- the Huffman coder), Peter Fenwick (for the structured cod-
- ing model in the original bzip, and many refinements), and
- Alistair Moffat, Radford Neal and Ian Witten (for the
- arithmetic coder in the original bzip). I am much
- indebted for their help, support and advice. See the man-
- ual in the source distribution for pointers to sources of
- documentation. Christian von Roques encouraged me to look
- for faster sorting algorithms, so as to speed up compres-
- sion. Bela Lubkin encouraged me to improve the worst-case
- compression performance. Donna Robinson XMLised the docu-
- mentation. The bz* scripts are derived from those of GNU
- gzip. Many people sent patches, helped with portability
- problems, lent machines, gave advice and were generally
- helpful.
-
diff --git a/Utilities/cmbzip2/bzip2recover.c b/Utilities/cmbzip2/bzip2recover.c
index 6e47b60..a8131e0 100644
--- a/Utilities/cmbzip2/bzip2recover.c
+++ b/Utilities/cmbzip2/bzip2recover.c
@@ -7,8 +7,8 @@
This file is part of bzip2/libbzip2, a program and library for
lossless, block-sorting data compression.
- bzip2/libbzip2 version 1.0.5 of 10 December 2007
- Copyright (C) 1996-2007 Julian Seward <jseward@bzip.org>
+ bzip2/libbzip2 version 1.0.8 of 13 July 2019
+ Copyright (C) 1996-2019 Julian Seward <jseward@acm.org>
Please read the WARNING, DISCLAIMER and PATENTS sections in the
README file.
@@ -18,7 +18,7 @@
------------------------------------------------------------------ */
/* This program is a complete hack and should be rewritten properly.
- It isn't very complicated. */
+ It isn't very complicated. */
#include <stdio.h>
#include <errno.h>
@@ -309,11 +309,12 @@ Int32 main ( Int32 argc, Char** argv )
UInt32 buffHi, buffLo, blockCRC;
Char* p;
- strcpy ( progName, argv[0] );
+ strncpy ( progName, argv[0], BZ_MAX_FILENAME-1);
+ progName[BZ_MAX_FILENAME-1]='\0';
inFileName[0] = outFileName[0] = 0;
fprintf ( stderr,
- "bzip2recover 1.0.5: extracts blocks from damaged .bz2 files.\n" );
+ "bzip2recover 1.0.8: extracts blocks from damaged .bz2 files.\n" );
if (argc != 2) {
fprintf ( stderr, "%s: usage is `%s damaged_file_name'.\n",
@@ -393,7 +394,7 @@ Int32 main ( Int32 argc, Char** argv )
bEnd[currBlock] = 0;
}
if (currBlock > 0 &&
- (bEnd[currBlock] - bStart[currBlock]) >= 130) {
+ (bEnd[currBlock] - bStart[currBlock]) >= 130) {
fprintf ( stderr, " block %d runs from " MaybeUInt64_FMT
" to " MaybeUInt64_FMT "\n",
rbCtr+1, bStart[currBlock], bEnd[currBlock] );
@@ -457,6 +458,7 @@ Int32 main ( Int32 argc, Char** argv )
bsPutUChar ( bsWr, 0x50 ); bsPutUChar ( bsWr, 0x90 );
bsPutUInt32 ( bsWr, blockCRC );
bsClose ( bsWr );
+ outFile = NULL;
}
if (wrBlock >= rbCtr) break;
wrBlock++;
@@ -474,8 +476,8 @@ Int32 main ( Int32 argc, Char** argv )
split = outFileName;
} else {
++split;
- }
- /* Now split points to the start of the basename. */
+ }
+ /* Now split points to the start of the basename. */
ofs = split - outFileName;
sprintf (split, "rec%5d", wrBlock+1);
for (p = split; *p != 0; p++) if (*p == ' ') *p = '0';
diff --git a/Utilities/cmbzip2/bzlib.c b/Utilities/cmbzip2/bzlib.c
index aeecef1..2178655 100644
--- a/Utilities/cmbzip2/bzlib.c
+++ b/Utilities/cmbzip2/bzlib.c
@@ -8,8 +8,8 @@
This file is part of bzip2/libbzip2, a program and library for
lossless, block-sorting data compression.
- bzip2/libbzip2 version 1.0.5 of 10 December 2007
- Copyright (C) 1996-2007 Julian Seward <jseward@bzip.org>
+ bzip2/libbzip2 version 1.0.8 of 13 July 2019
+ Copyright (C) 1996-2019 Julian Seward <jseward@acm.org>
Please read the WARNING, DISCLAIMER and PATENTS sections in the
README file.
@@ -43,12 +43,12 @@ void BZ2_bz__AssertH__fail ( int errcode )
fprintf(stderr,
"\n\nbzip2/libbzip2: internal error number %d.\n"
"This is a bug in bzip2/libbzip2, %s.\n"
- "Please report it to me at: jseward@bzip.org. If this happened\n"
+ "Please report it to: bzip2-devel@sourceware.org. If this happened\n"
"when you were using some program which uses libbzip2 as a\n"
"component, you should also report this bug to the author(s)\n"
"of that program. Please make an effort to report this bug;\n"
"timely and accurate bug reports eventually lead to higher\n"
- "quality software. Thanks. Julian Seward, 10 December 2007.\n\n",
+ "quality software. Thanks.\n\n",
errcode,
BZ2_bzlibVersion()
);
@@ -102,7 +102,6 @@ static
void* default_bzalloc ( void* opaque, Int32 items, Int32 size )
{
void* v = malloc ( items * size );
- (void)opaque;
return v;
}
@@ -110,7 +109,6 @@ static
void default_bzfree ( void* opaque, void* addr )
{
if (addr != NULL) free ( addr );
- (void)opaque;
}
@@ -427,7 +425,7 @@ int BZ_API(BZ2_bzCompress) ( bz_stream *strm, int action )
return progress ? BZ_RUN_OK : BZ_PARAM_ERROR;
}
else
- if (action == BZ_FLUSH) {
+ if (action == BZ_FLUSH) {
s->avail_in_expect = strm->avail_in;
s->mode = BZ_M_FLUSHING;
goto preswitch;
@@ -1507,7 +1505,6 @@ int BZ_API(BZ2_bzwrite) (BZFILE* b, void* buf, int len )
/*---------------------------------------------------*/
int BZ_API(BZ2_bzflush) (BZFILE *b)
{
- (void) b;
/* do nothing now... */
return 0;
}
diff --git a/Utilities/cmbzip2/bzlib.h b/Utilities/cmbzip2/bzlib.h
index c5b75d6..8966a6c 100644
--- a/Utilities/cmbzip2/bzlib.h
+++ b/Utilities/cmbzip2/bzlib.h
@@ -8,8 +8,8 @@
This file is part of bzip2/libbzip2, a program and library for
lossless, block-sorting data compression.
- bzip2/libbzip2 version 1.0.5 of 10 December 2007
- Copyright (C) 1996-2007 Julian Seward <jseward@bzip.org>
+ bzip2/libbzip2 version 1.0.8 of 13 July 2019
+ Copyright (C) 1996-2019 Julian Seward <jseward@acm.org>
Please read the WARNING, DISCLAIMER and PATENTS sections in the
README file.
diff --git a/Utilities/cmbzip2/bzlib_private.h b/Utilities/cmbzip2/bzlib_private.h
index 02a667f..ba0f589 100644
--- a/Utilities/cmbzip2/bzlib_private.h
+++ b/Utilities/cmbzip2/bzlib_private.h
@@ -8,8 +8,8 @@
This file is part of bzip2/libbzip2, a program and library for
lossless, block-sorting data compression.
- bzip2/libbzip2 version 1.0.5 of 10 December 2007
- Copyright (C) 1996-2007 Julian Seward <jseward@bzip.org>
+ bzip2/libbzip2 version 1.0.8 of 13 July 2019
+ Copyright (C) 1996-2019 Julian Seward <jseward@acm.org>
Please read the WARNING, DISCLAIMER and PATENTS sections in the
README file.
@@ -32,28 +32,13 @@
#include "bzlib.h"
-
-#if defined(__BORLANDC__)
-# pragma warn -8004 /* Assigned value never used. */
-# pragma warn -8008 /* Condition is always true/false. */
-# pragma warn -8066 /* Unreachable code. */
-# pragma warn -8057 /* Unused parameter. */
-#endif
#if defined(_MSC_VER)
-/* 'integral size mismatch in argument; conversion supplied */
-# pragma warning(disable:4244)
-/* conversion from 'size_t' to 'off_t', possible loss of data */
-# pragma warning(disable:4267)
-/* warning C4127: conditional expression is constant*/
-# pragma warning(disable:4127)
-#endif
-#if defined(__clang__)
-# pragma clang diagnostic ignored "-Wcast-align"
+# pragma warning(push,1)
#endif
/*-- General stuff. --*/
-#define BZ_VERSION "1.0.5, 10-Dec-2007"
+#define BZ_VERSION "1.0.8, 13-Jul-2019"
typedef char Char;
typedef unsigned char Bool;
diff --git a/Utilities/cmbzip2/bzmore b/Utilities/cmbzip2/bzmore
deleted file mode 100644
index 21b1de6..0000000
--- a/Utilities/cmbzip2/bzmore
+++ /dev/null
@@ -1,61 +0,0 @@
-#!/bin/sh
-
-# Bzmore wrapped for bzip2,
-# adapted from zmore by Philippe Troin <phil@fifi.org> for Debian GNU/Linux.
-
-PATH="/usr/bin:$PATH"; export PATH
-
-prog=`echo $0 | sed 's|.*/||'`
-case "$prog" in
- *less) more=less ;;
- *) more=more ;;
-esac
-
-if test "`echo -n a`" = "-n a"; then
- # looks like a SysV system:
- n1=''; n2='\c'
-else
- n1='-n'; n2=''
-fi
-oldtty=`stty -g 2>/dev/null`
-if stty -cbreak 2>/dev/null; then
- cb='cbreak'; ncb='-cbreak'
-else
- # 'stty min 1' resets eof to ^a on both SunOS and SysV!
- cb='min 1 -icanon'; ncb='icanon eof ^d'
-fi
-if test $? -eq 0 -a -n "$oldtty"; then
- trap 'stty $oldtty 2>/dev/null; exit' 0 2 3 5 10 13 15
-else
- trap 'stty $ncb echo 2>/dev/null; exit' 0 2 3 5 10 13 15
-fi
-
-if test $# = 0; then
- if test -t 0; then
- echo usage: $prog files...
- else
- bzip2 -cdfq | eval $more
- fi
-else
- FIRST=1
- for FILE
- do
- if test $FIRST -eq 0; then
- echo $n1 "--More--(Next file: $FILE)$n2"
- stty $cb -echo 2>/dev/null
- ANS=`dd bs=1 count=1 2>/dev/null`
- stty $ncb echo 2>/dev/null
- echo " "
- if test "$ANS" = 'e' -o "$ANS" = 'q'; then
- exit
- fi
- fi
- if test "$ANS" != 's'; then
- echo "------> $FILE <------"
- bzip2 -cdfq "$FILE" | eval $more
- fi
- if test -t; then
- FIRST=0
- fi
- done
-fi
diff --git a/Utilities/cmbzip2/bzmore.1 b/Utilities/cmbzip2/bzmore.1
deleted file mode 100644
index c6868ed..0000000
--- a/Utilities/cmbzip2/bzmore.1
+++ /dev/null
@@ -1,152 +0,0 @@
-.\"Shamelessly copied from zmore.1 by Philippe Troin <phil@fifi.org>
-.\"for Debian GNU/Linux
-.TH BZMORE 1
-.SH NAME
-bzmore, bzless \- file perusal filter for crt viewing of bzip2 compressed text
-.SH SYNOPSIS
-.B bzmore
-[ name ... ]
-.br
-.B bzless
-[ name ... ]
-.SH NOTE
-In the following description,
-.I bzless
-and
-.I less
-can be used interchangeably with
-.I bzmore
-and
-.I more.
-.SH DESCRIPTION
-.I Bzmore
-is a filter which allows examination of compressed or plain text files
-one screenful at a time on a soft-copy terminal.
-.I bzmore
-works on files compressed with
-.I bzip2
-and also on uncompressed files.
-If a file does not exist,
-.I bzmore
-looks for a file of the same name with the addition of a .bz2 suffix.
-.PP
-.I Bzmore
-normally pauses after each screenful, printing --More--
-at the bottom of the screen.
-If the user then types a carriage return, one more line is displayed.
-If the user hits a space,
-another screenful is displayed. Other possibilities are enumerated later.
-.PP
-.I Bzmore
-looks in the file
-.I /etc/termcap
-to determine terminal characteristics,
-and to determine the default window size.
-On a terminal capable of displaying 24 lines,
-the default window size is 22 lines.
-Other sequences which may be typed when
-.I bzmore
-pauses, and their effects, are as follows (\fIi\fP is an optional integer
-argument, defaulting to 1) :
-.PP
-.IP \fIi\|\fP<space>
-display
-.I i
-more lines, (or another screenful if no argument is given)
-.PP
-.IP ^D
-display 11 more lines (a ``scroll'').
-If
-.I i
-is given, then the scroll size is set to \fIi\|\fP.
-.PP
-.IP d
-same as ^D (control-D)
-.PP
-.IP \fIi\|\fPz
-same as typing a space except that \fIi\|\fP, if present, becomes the new
-window size. Note that the window size reverts back to the default at the
-end of the current file.
-.PP
-.IP \fIi\|\fPs
-skip \fIi\|\fP lines and print a screenful of lines
-.PP
-.IP \fIi\|\fPf
-skip \fIi\fP screenfuls and print a screenful of lines
-.PP
-.IP "q or Q"
-quit reading the current file; go on to the next (if any)
-.PP
-.IP "e or q"
-When the prompt --More--(Next file:
-.IR file )
-is printed, this command causes bzmore to exit.
-.PP
-.IP s
-When the prompt --More--(Next file:
-.IR file )
-is printed, this command causes bzmore to skip the next file and continue.
-.PP
-.IP =
-Display the current line number.
-.PP
-.IP \fIi\|\fP/expr
-search for the \fIi\|\fP-th occurrence of the regular expression \fIexpr.\fP
-If the pattern is not found,
-.I bzmore
-goes on to the next file (if any).
-Otherwise, a screenful is displayed, starting two lines before the place
-where the expression was found.
-The user's erase and kill characters may be used to edit the regular
-expression.
-Erasing back past the first column cancels the search command.
-.PP
-.IP \fIi\|\fPn
-search for the \fIi\|\fP-th occurrence of the last regular expression entered.
-.PP
-.IP !command
-invoke a shell with \fIcommand\|\fP.
-The character `!' in "command" are replaced with the
-previous shell command. The sequence "\\!" is replaced by "!".
-.PP
-.IP ":q or :Q"
-quit reading the current file; go on to the next (if any)
-(same as q or Q).
-.PP
-.IP .
-(dot) repeat the previous command.
-.PP
-The commands take effect immediately, i.e., it is not necessary to
-type a carriage return.
-Up to the time when the command character itself is given,
-the user may hit the line kill character to cancel the numerical
-argument being formed.
-In addition, the user may hit the erase character to redisplay the
---More-- message.
-.PP
-At any time when output is being sent to the terminal, the user can
-hit the quit key (normally control\-\\).
-.I Bzmore
-will stop sending output, and will display the usual --More--
-prompt.
-The user may then enter one of the above commands in the normal manner.
-Unfortunately, some output is lost when this is done, due to the
-fact that any characters waiting in the terminal's output queue
-are flushed when the quit signal occurs.
-.PP
-The terminal is set to
-.I noecho
-mode by this program so that the output can be continuous.
-What you type will thus not show on your terminal, except for the / and !
-commands.
-.PP
-If the standard output is not a teletype, then
-.I bzmore
-acts just like
-.I bzcat,
-except that a header is printed before each file.
-.SH FILES
-.DT
-/etc/termcap Terminal data base
-.SH "SEE ALSO"
-more(1), less(1), bzip2(1), bzdiff(1), bzgrep(1)
diff --git a/Utilities/cmbzip2/compress.c b/Utilities/cmbzip2/compress.c
index feea233..5dfa002 100644
--- a/Utilities/cmbzip2/compress.c
+++ b/Utilities/cmbzip2/compress.c
@@ -8,8 +8,8 @@
This file is part of bzip2/libbzip2, a program and library for
lossless, block-sorting data compression.
- bzip2/libbzip2 version 1.0.5 of 10 December 2007
- Copyright (C) 1996-2007 Julian Seward <jseward@bzip.org>
+ bzip2/libbzip2 version 1.0.8 of 13 July 2019
+ Copyright (C) 1996-2019 Julian Seward <jseward@acm.org>
Please read the WARNING, DISCLAIMER and PATENTS sections in the
README file.
@@ -239,7 +239,7 @@ static
void sendMTFValues ( EState* s )
{
Int32 v, t, i, j, gs, ge, totc, bt, bc, iter;
- Int32 nSelectors = 0, alphaSize, minLen, maxLen, selCtr;
+ Int32 nSelectors, alphaSize, minLen, maxLen, selCtr;
Int32 nGroups, nBytes;
/*--
@@ -329,14 +329,14 @@ void sendMTFValues ( EState* s )
/*---
Set up an auxiliary length table which is used to fast-track
- the common case (nGroups == 6).
+ 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;
@@ -385,7 +385,7 @@ void sendMTFValues ( EState* s )
cost[4] = cost45 & 0xffff; cost[5] = cost45 >> 16;
} else {
- /*--- slow version which correctly handles all situations ---*/
+ /*--- 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];
@@ -426,7 +426,7 @@ void sendMTFValues ( EState* s )
# undef BZ_ITUR
} else {
- /*--- slow version which correctly handles all situations ---*/
+ /*--- slow version which correctly handles all situations ---*/
for (i = gs; i <= ge; i++)
s->rfreq[bt][ mtfv[i] ]++;
}
@@ -454,7 +454,7 @@ void sendMTFValues ( EState* s )
AssertH( nGroups < 8, 3002 );
AssertH( nSelectors < 32768 &&
- nSelectors <= (2 + (900000 / BZ_G_SIZE)),
+ nSelectors <= BZ_MAX_SELECTORS,
3003 );
@@ -579,7 +579,7 @@ void sendMTFValues ( EState* s )
# undef BZ_ITAH
} else {
- /*--- slow version which correctly handles all situations ---*/
+ /*--- slow version which correctly handles all situations ---*/
for (i = gs; i <= ge; i++) {
bsW ( s,
s->len [s->selector[selCtr]] [mtfv[i]],
diff --git a/Utilities/cmbzip2/crctable.c b/Utilities/cmbzip2/crctable.c
index 215687b..2b33c25 100644
--- a/Utilities/cmbzip2/crctable.c
+++ b/Utilities/cmbzip2/crctable.c
@@ -8,8 +8,8 @@
This file is part of bzip2/libbzip2, a program and library for
lossless, block-sorting data compression.
- bzip2/libbzip2 version 1.0.5 of 10 December 2007
- Copyright (C) 1996-2007 Julian Seward <jseward@bzip.org>
+ bzip2/libbzip2 version 1.0.8 of 13 July 2019
+ Copyright (C) 1996-2019 Julian Seward <jseward@acm.org>
Please read the WARNING, DISCLAIMER and PATENTS sections in the
README file.
diff --git a/Utilities/cmbzip2/decompress.c b/Utilities/cmbzip2/decompress.c
index bba5e0f..a1a0bac 100644
--- a/Utilities/cmbzip2/decompress.c
+++ b/Utilities/cmbzip2/decompress.c
@@ -8,8 +8,8 @@
This file is part of bzip2/libbzip2, a program and library for
lossless, block-sorting data compression.
- bzip2/libbzip2 version 1.0.5 of 10 December 2007
- Copyright (C) 1996-2007 Julian Seward <jseward@bzip.org>
+ bzip2/libbzip2 version 1.0.8 of 13 July 2019
+ Copyright (C) 1996-2019 Julian Seward <jseward@acm.org>
Please read the WARNING, DISCLAIMER and PATENTS sections in the
README file.
@@ -285,7 +285,7 @@ Int32 BZ2_decompress ( DState* s )
/*--- Now the selectors ---*/
GET_BITS(BZ_X_SELECTOR_1, nGroups, 3);
- if (nGroups < 2 || nGroups > 6) RETURN(BZ_DATA_ERROR);
+ if (nGroups < 2 || nGroups > BZ_N_GROUPS) 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++) {
@@ -296,8 +296,14 @@ Int32 BZ2_decompress ( DState* s )
j++;
if (j >= nGroups) RETURN(BZ_DATA_ERROR);
}
- s->selectorMtf[i] = j;
+ /* Having more than BZ_MAX_SELECTORS doesn't make much sense
+ since they will never be used, but some implementations might
+ "round up" the number of selectors, so just ignore those. */
+ if (i < BZ_MAX_SELECTORS)
+ s->selectorMtf[i] = j;
}
+ if (nSelectors > BZ_MAX_SELECTORS)
+ nSelectors = BZ_MAX_SELECTORS;
/*--- Undo the MTF values for the selectors. ---*/
{
@@ -381,6 +387,13 @@ Int32 BZ2_decompress ( DState* s )
es = -1;
N = 1;
do {
+ /* Check that N doesn't get too big, so that es doesn't
+ go negative. The maximum value that can be
+ RUNA/RUNB encoded is equal to the block size (post
+ the initial RLE), viz, 900k, so bounding N at 2
+ million should guard against overflow without
+ rejecting any legitimate inputs. */
+ if (N >= 2*1024*1024) RETURN(BZ_DATA_ERROR);
if (nextSym == BZ_RUNA) es = es + (0+1) * N; else
if (nextSym == BZ_RUNB) es = es + (1+1) * N;
N = N * 2;
@@ -485,15 +498,28 @@ Int32 BZ2_decompress ( DState* s )
RETURN(BZ_DATA_ERROR);
/*-- Set up cftab to facilitate generation of T^(-1) --*/
+ /* Check: unzftab entries in range. */
+ for (i = 0; i <= 255; i++) {
+ if (s->unzftab[i] < 0 || s->unzftab[i] > nblock)
+ RETURN(BZ_DATA_ERROR);
+ }
+ /* Actually generate cftab. */
s->cftab[0] = 0;
for (i = 1; i <= 256; i++) s->cftab[i] = s->unzftab[i-1];
for (i = 1; i <= 256; i++) s->cftab[i] += s->cftab[i-1];
+ /* Check: cftab entries in range. */
for (i = 0; i <= 256; i++) {
if (s->cftab[i] < 0 || s->cftab[i] > nblock) {
/* s->cftab[i] can legitimately be == nblock */
RETURN(BZ_DATA_ERROR);
}
}
+ /* Check: cftab entries non-descending. */
+ for (i = 1; i <= 256; i++) {
+ if (s->cftab[i-1] > s->cftab[i]) {
+ RETURN(BZ_DATA_ERROR);
+ }
+ }
s->state_out_len = 0;
s->state_out_ch = 0;
diff --git a/Utilities/cmbzip2/dlltest.c b/Utilities/cmbzip2/dlltest.c
index 4e27da2..03fa146 100644
--- a/Utilities/cmbzip2/dlltest.c
+++ b/Utilities/cmbzip2/dlltest.c
@@ -1,175 +1,175 @@
-/*
- minibz2
- libbz2.dll test program.
- by Yoshioka Tsuneo (tsuneo@rr.iij4u.or.jp)
- This file is Public Domain. Welcome any email to me.
-
- usage: minibz2 [-d] [-{1,2,..9}] [[srcfilename] destfilename]
-*/
-
-#define BZ_IMPORT
-#include <stdio.h>
-#include <stdlib.h>
-#include "bzlib.h"
-#ifdef _WIN32
-#include <io.h>
-#endif
-
-
-#ifdef _WIN32
-
-#define BZ2_LIBNAME "libbz2-1.0.2.DLL"
-
-#include <windows.h>
-static int BZ2DLLLoaded = 0;
-static HINSTANCE BZ2DLLhLib;
-int BZ2DLLLoadLibrary(void)
-{
- HINSTANCE hLib;
-
- if(BZ2DLLLoaded==1){return 0;}
- hLib=LoadLibrary(BZ2_LIBNAME);
- if(hLib == NULL){
- fprintf(stderr,"Can't load %s\n",BZ2_LIBNAME);
- return -1;
- }
- BZ2_bzlibVersion=GetProcAddress(hLib,"BZ2_bzlibVersion");
- BZ2_bzopen=GetProcAddress(hLib,"BZ2_bzopen");
- BZ2_bzdopen=GetProcAddress(hLib,"BZ2_bzdopen");
- BZ2_bzread=GetProcAddress(hLib,"BZ2_bzread");
- BZ2_bzwrite=GetProcAddress(hLib,"BZ2_bzwrite");
- BZ2_bzflush=GetProcAddress(hLib,"BZ2_bzflush");
- BZ2_bzclose=GetProcAddress(hLib,"BZ2_bzclose");
- BZ2_bzerror=GetProcAddress(hLib,"BZ2_bzerror");
-
- if (!BZ2_bzlibVersion || !BZ2_bzopen || !BZ2_bzdopen
- || !BZ2_bzread || !BZ2_bzwrite || !BZ2_bzflush
- || !BZ2_bzclose || !BZ2_bzerror) {
- fprintf(stderr,"GetProcAddress failed.\n");
- return -1;
- }
- BZ2DLLLoaded=1;
- BZ2DLLhLib=hLib;
- return 0;
-
-}
-int BZ2DLLFreeLibrary(void)
-{
- if(BZ2DLLLoaded==0){return 0;}
- FreeLibrary(BZ2DLLhLib);
- BZ2DLLLoaded=0;
-}
-#endif /* WIN32 */
-
-void usage(void)
-{
- puts("usage: minibz2 [-d] [-{1,2,..9}] [[srcfilename] destfilename]");
-}
-
-int main(int argc,char *argv[])
-{
- int decompress = 0;
- int level = 9;
- char *fn_r = NULL;
- char *fn_w = NULL;
-
-#ifdef _WIN32
- if(BZ2DLLLoadLibrary()<0){
- fprintf(stderr,"Loading of %s failed. Giving up.\n", BZ2_LIBNAME);
- exit(1);
- }
- printf("Loading of %s succeeded. Library version is %s.\n",
- BZ2_LIBNAME, BZ2_bzlibVersion() );
-#endif
- while(++argv,--argc){
- if(**argv =='-' || **argv=='/'){
- char *p;
-
- for(p=*argv+1;*p;p++){
- if(*p=='d'){
- decompress = 1;
- }else if('1'<=*p && *p<='9'){
- level = *p - '0';
- }else{
- usage();
- exit(1);
- }
- }
- }else{
- break;
- }
- }
- if(argc>=1){
- fn_r = *argv;
- argc--;argv++;
- }else{
- fn_r = NULL;
- }
- if(argc>=1){
- fn_w = *argv;
- argc--;argv++;
- }else{
- fn_w = NULL;
- }
- {
- int len;
- char buff[0x1000];
- char mode[10];
-
- if(decompress){
- BZFILE *BZ2fp_r = NULL;
- FILE *fp_w = NULL;
-
- if(fn_w){
- if((fp_w = fopen(fn_w,"wb"))==NULL){
- printf("can't open [%s]\n",fn_w);
- perror("reason:");
- exit(1);
- }
- }else{
- fp_w = stdout;
- }
- if((fn_r == NULL && (BZ2fp_r = BZ2_bzdopen(fileno(stdin),"rb"))==NULL)
- || (fn_r != NULL && (BZ2fp_r = BZ2_bzopen(fn_r,"rb"))==NULL)){
- printf("can't bz2openstream\n");
- exit(1);
- }
- while((len=BZ2_bzread(BZ2fp_r,buff,0x1000))>0){
- fwrite(buff,1,len,fp_w);
- }
- BZ2_bzclose(BZ2fp_r);
- if(fp_w != stdout) fclose(fp_w);
- }else{
- BZFILE *BZ2fp_w = NULL;
- FILE *fp_r = NULL;
-
- if(fn_r){
- if((fp_r = fopen(fn_r,"rb"))==NULL){
- printf("can't open [%s]\n",fn_r);
- perror("reason:");
- exit(1);
- }
- }else{
- fp_r = stdin;
- }
- mode[0]='w';
- mode[1] = '0' + level;
- mode[2] = '\0';
-
- if((fn_w == NULL && (BZ2fp_w = BZ2_bzdopen(fileno(stdout),mode))==NULL)
- || (fn_w !=NULL && (BZ2fp_w = BZ2_bzopen(fn_w,mode))==NULL)){
- printf("can't bz2openstream\n");
- exit(1);
- }
- while((len=fread(buff,1,0x1000,fp_r))>0){
- BZ2_bzwrite(BZ2fp_w,buff,len);
- }
- BZ2_bzclose(BZ2fp_w);
- if(fp_r!=stdin)fclose(fp_r);
- }
- }
-#ifdef _WIN32
- BZ2DLLFreeLibrary();
-#endif
- return 0;
-}
+/*
+ minibz2
+ libbz2.dll test program.
+ by Yoshioka Tsuneo (tsuneo@rr.iij4u.or.jp)
+ This file is Public Domain. Welcome any email to me.
+
+ usage: minibz2 [-d] [-{1,2,..9}] [[srcfilename] destfilename]
+*/
+
+#define BZ_IMPORT
+#include <stdio.h>
+#include <stdlib.h>
+#include "bzlib.h"
+#ifdef _WIN32
+#include <io.h>
+#endif
+
+
+#ifdef _WIN32
+
+#define BZ2_LIBNAME "libbz2-1.0.2.DLL"
+
+#include <windows.h>
+static int BZ2DLLLoaded = 0;
+static HINSTANCE BZ2DLLhLib;
+int BZ2DLLLoadLibrary(void)
+{
+ HINSTANCE hLib;
+
+ if(BZ2DLLLoaded==1){return 0;}
+ hLib=LoadLibrary(BZ2_LIBNAME);
+ if(hLib == NULL){
+ fprintf(stderr,"Can't load %s\n",BZ2_LIBNAME);
+ return -1;
+ }
+ BZ2_bzlibVersion=GetProcAddress(hLib,"BZ2_bzlibVersion");
+ BZ2_bzopen=GetProcAddress(hLib,"BZ2_bzopen");
+ BZ2_bzdopen=GetProcAddress(hLib,"BZ2_bzdopen");
+ BZ2_bzread=GetProcAddress(hLib,"BZ2_bzread");
+ BZ2_bzwrite=GetProcAddress(hLib,"BZ2_bzwrite");
+ BZ2_bzflush=GetProcAddress(hLib,"BZ2_bzflush");
+ BZ2_bzclose=GetProcAddress(hLib,"BZ2_bzclose");
+ BZ2_bzerror=GetProcAddress(hLib,"BZ2_bzerror");
+
+ if (!BZ2_bzlibVersion || !BZ2_bzopen || !BZ2_bzdopen
+ || !BZ2_bzread || !BZ2_bzwrite || !BZ2_bzflush
+ || !BZ2_bzclose || !BZ2_bzerror) {
+ fprintf(stderr,"GetProcAddress failed.\n");
+ return -1;
+ }
+ BZ2DLLLoaded=1;
+ BZ2DLLhLib=hLib;
+ return 0;
+
+}
+int BZ2DLLFreeLibrary(void)
+{
+ if(BZ2DLLLoaded==0){return 0;}
+ FreeLibrary(BZ2DLLhLib);
+ BZ2DLLLoaded=0;
+}
+#endif /* WIN32 */
+
+void usage(void)
+{
+ puts("usage: minibz2 [-d] [-{1,2,..9}] [[srcfilename] destfilename]");
+}
+
+int main(int argc,char *argv[])
+{
+ int decompress = 0;
+ int level = 9;
+ char *fn_r = NULL;
+ char *fn_w = NULL;
+
+#ifdef _WIN32
+ if(BZ2DLLLoadLibrary()<0){
+ fprintf(stderr,"Loading of %s failed. Giving up.\n", BZ2_LIBNAME);
+ exit(1);
+ }
+ printf("Loading of %s succeeded. Library version is %s.\n",
+ BZ2_LIBNAME, BZ2_bzlibVersion() );
+#endif
+ while(++argv,--argc){
+ if(**argv =='-' || **argv=='/'){
+ char *p;
+
+ for(p=*argv+1;*p;p++){
+ if(*p=='d'){
+ decompress = 1;
+ }else if('1'<=*p && *p<='9'){
+ level = *p - '0';
+ }else{
+ usage();
+ exit(1);
+ }
+ }
+ }else{
+ break;
+ }
+ }
+ if(argc>=1){
+ fn_r = *argv;
+ argc--;argv++;
+ }else{
+ fn_r = NULL;
+ }
+ if(argc>=1){
+ fn_w = *argv;
+ argc--;argv++;
+ }else{
+ fn_w = NULL;
+ }
+ {
+ int len;
+ char buff[0x1000];
+ char mode[10];
+
+ if(decompress){
+ BZFILE *BZ2fp_r = NULL;
+ FILE *fp_w = NULL;
+
+ if(fn_w){
+ if((fp_w = fopen(fn_w,"wb"))==NULL){
+ printf("can't open [%s]\n",fn_w);
+ perror("reason:");
+ exit(1);
+ }
+ }else{
+ fp_w = stdout;
+ }
+ if((fn_r == NULL && (BZ2fp_r = BZ2_bzdopen(fileno(stdin),"rb"))==NULL)
+ || (fn_r != NULL && (BZ2fp_r = BZ2_bzopen(fn_r,"rb"))==NULL)){
+ printf("can't bz2openstream\n");
+ exit(1);
+ }
+ while((len=BZ2_bzread(BZ2fp_r,buff,0x1000))>0){
+ fwrite(buff,1,len,fp_w);
+ }
+ BZ2_bzclose(BZ2fp_r);
+ if(fp_w != stdout) fclose(fp_w);
+ }else{
+ BZFILE *BZ2fp_w = NULL;
+ FILE *fp_r = NULL;
+
+ if(fn_r){
+ if((fp_r = fopen(fn_r,"rb"))==NULL){
+ printf("can't open [%s]\n",fn_r);
+ perror("reason:");
+ exit(1);
+ }
+ }else{
+ fp_r = stdin;
+ }
+ mode[0]='w';
+ mode[1] = '0' + level;
+ mode[2] = '\0';
+
+ if((fn_w == NULL && (BZ2fp_w = BZ2_bzdopen(fileno(stdout),mode))==NULL)
+ || (fn_w !=NULL && (BZ2fp_w = BZ2_bzopen(fn_w,mode))==NULL)){
+ printf("can't bz2openstream\n");
+ exit(1);
+ }
+ while((len=fread(buff,1,0x1000,fp_r))>0){
+ BZ2_bzwrite(BZ2fp_w,buff,len);
+ }
+ BZ2_bzclose(BZ2fp_w);
+ if(fp_r!=stdin)fclose(fp_r);
+ }
+ }
+#ifdef _WIN32
+ BZ2DLLFreeLibrary();
+#endif
+ return 0;
+}
diff --git a/Utilities/cmbzip2/entities.xml b/Utilities/cmbzip2/entities.xml
deleted file mode 100644
index e9e0553..0000000
--- a/Utilities/cmbzip2/entities.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<!-- misc. strings -->
-<!ENTITY bz-url "http://www.bzip.org">
-<!ENTITY bz-email "jseward@bzip.org">
-<!ENTITY bz-lifespan "1996-2007">
-
-<!ENTITY bz-version "1.0.5">
-<!ENTITY bz-date "10 December 2007">
-
-<!ENTITY manual-title "bzip2 Manual">
diff --git a/Utilities/cmbzip2/format.pl b/Utilities/cmbzip2/format.pl
deleted file mode 100755
index 2b391da..0000000
--- a/Utilities/cmbzip2/format.pl
+++ /dev/null
@@ -1,68 +0,0 @@
-#!/usr/bin/perl -w
-#
-# ------------------------------------------------------------------
-# This file is part of bzip2/libbzip2, a program and library for
-# lossless, block-sorting data compression.
-#
-# bzip2/libbzip2 version 1.0.5 of 10 December 2007
-# Copyright (C) 1996-2007 Julian Seward <jseward@bzip.org>
-#
-# Please read the WARNING, DISCLAIMER and PATENTS sections in the
-# README file.
-#
-# This program is released under the terms of the license contained
-# in the file LICENSE.
-# ------------------------------------------------------------------
-#
-use strict;
-
-# get command line values:
-if ( $#ARGV !=1 ) {
- die "Usage: $0 xml_infile xml_outfile\n";
-}
-
-my $infile = shift;
-# check infile exists
-die "Can't find file \"$infile\""
- unless -f $infile;
-# check we can read infile
-if (! -r $infile) {
- die "Can't read input $infile\n";
-}
-# check we can open infile
-open( INFILE,"<$infile" ) or
- die "Can't input $infile $!";
-
-#my $outfile = 'fmt-manual.xml';
-my $outfile = shift;
-#print "Infile: $infile, Outfile: $outfile\n";
-# check we can write to outfile
-open( OUTFILE,">$outfile" ) or
- die "Can't output $outfile $! for writing";
-
-my ($prev, $curr, $str);
-$prev = ''; $curr = '';
-while ( <INFILE> ) {
-
- print OUTFILE $prev;
- $prev = $curr;
- $curr = $_;
- $str = '';
-
- if ( $prev =~ /<programlisting>$|<screen>$/ ) {
- chomp $prev;
- $curr = join( '', $prev, "<![CDATA[", $curr );
- $prev = '';
- next;
- }
- elsif ( $curr =~ /<\/programlisting>|<\/screen>/ ) {
- chomp $prev;
- $curr = join( '', $prev, "]]>", $curr );
- $prev = '';
- next;
- }
-}
-print OUTFILE $curr;
-close INFILE;
-close OUTFILE;
-exit;
diff --git a/Utilities/cmbzip2/huffman.c b/Utilities/cmbzip2/huffman.c
index 87e79e3..43a1899 100644
--- a/Utilities/cmbzip2/huffman.c
+++ b/Utilities/cmbzip2/huffman.c
@@ -8,8 +8,8 @@
This file is part of bzip2/libbzip2, a program and library for
lossless, block-sorting data compression.
- bzip2/libbzip2 version 1.0.5 of 10 December 2007
- Copyright (C) 1996-2007 Julian Seward <jseward@bzip.org>
+ bzip2/libbzip2 version 1.0.8 of 13 July 2019
+ Copyright (C) 1996-2019 Julian Seward <jseward@acm.org>
Please read the WARNING, DISCLAIMER and PATENTS sections in the
README file.
diff --git a/Utilities/cmbzip2/libbz2.def b/Utilities/cmbzip2/libbz2.def
deleted file mode 100644
index 69fef54..0000000
--- a/Utilities/cmbzip2/libbz2.def
+++ /dev/null
@@ -1,27 +0,0 @@
-LIBRARY LIBBZ2
-DESCRIPTION "libbzip2: library for data compression"
-EXPORTS
- BZ2_bzCompressInit
- BZ2_bzCompress
- BZ2_bzCompressEnd
- BZ2_bzDecompressInit
- BZ2_bzDecompress
- BZ2_bzDecompressEnd
- BZ2_bzReadOpen
- BZ2_bzReadClose
- BZ2_bzReadGetUnused
- BZ2_bzRead
- BZ2_bzWriteOpen
- BZ2_bzWrite
- BZ2_bzWriteClose
- BZ2_bzWriteClose64
- BZ2_bzBuffToBuffCompress
- BZ2_bzBuffToBuffDecompress
- BZ2_bzlibVersion
- BZ2_bzopen
- BZ2_bzdopen
- BZ2_bzread
- BZ2_bzwrite
- BZ2_bzflush
- BZ2_bzclose
- BZ2_bzerror
diff --git a/Utilities/cmbzip2/libbz2.lib b/Utilities/cmbzip2/libbz2.lib
deleted file mode 100644
index 9a97a75..0000000
--- a/Utilities/cmbzip2/libbz2.lib
+++ /dev/null
Binary files differ
diff --git a/Utilities/cmbzip2/makefile.msc b/Utilities/cmbzip2/makefile.msc
deleted file mode 100644
index d5f2e59..0000000
--- a/Utilities/cmbzip2/makefile.msc
+++ /dev/null
@@ -1,63 +0,0 @@
-# Makefile for Microsoft Visual C++ 6.0
-# usage: nmake -f makefile.msc
-# K.M. Syring (syring@gsf.de)
-# Fixed up by JRS for bzip2-0.9.5d release.
-
-CC=cl
-CFLAGS= -DWIN32 -MD -Ox -D_FILE_OFFSET_BITS=64 -nologo
-
-OBJS= blocksort.obj \
- huffman.obj \
- crctable.obj \
- randtable.obj \
- compress.obj \
- decompress.obj \
- bzlib.obj
-
-all: lib bzip2 test
-
-bzip2: lib
- $(CC) $(CFLAGS) -o bzip2 bzip2.c libbz2.lib setargv.obj
- $(CC) $(CFLAGS) -o bzip2recover bzip2recover.c
-
-lib: $(OBJS)
- lib /out:libbz2.lib $(OBJS)
-
-test: bzip2
- type words1
- .\\bzip2 -1 < sample1.ref > sample1.rb2
- .\\bzip2 -2 < sample2.ref > sample2.rb2
- .\\bzip2 -3 < sample3.ref > sample3.rb2
- .\\bzip2 -d < sample1.bz2 > sample1.tst
- .\\bzip2 -d < sample2.bz2 > sample2.tst
- .\\bzip2 -ds < sample3.bz2 > sample3.tst
- @echo All six of the fc's should find no differences.
- @echo If fc finds an error on sample3.bz2, this could be
- @echo because WinZip's 'TAR file smart CR/LF conversion'
- @echo is too clever for its own good. Disable this option.
- @echo The correct size for sample3.ref is 120,244. If it
- @echo is 150,251, WinZip has messed it up.
- fc sample1.bz2 sample1.rb2
- fc sample2.bz2 sample2.rb2
- fc sample3.bz2 sample3.rb2
- fc sample1.tst sample1.ref
- fc sample2.tst sample2.ref
- fc sample3.tst sample3.ref
-
-
-
-clean:
- del *.obj
- del libbz2.lib
- del bzip2.exe
- del bzip2recover.exe
- del sample1.rb2
- del sample2.rb2
- del sample3.rb2
- del sample1.tst
- del sample2.tst
- del sample3.tst
-
-.c.obj:
- $(CC) $(CFLAGS) -c $*.c -o $*.obj
-
diff --git a/Utilities/cmbzip2/manual.html b/Utilities/cmbzip2/manual.html
deleted file mode 100644
index bb44953..0000000
--- a/Utilities/cmbzip2/manual.html
+++ /dev/null
@@ -1,2540 +0,0 @@
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>bzip2 and libbzip2, version 1.0.5</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
-<style type="text/css" media="screen">/* Colours:
-#74240f dark brown h1, h2, h3, h4
-#336699 medium blue links
-#339999 turquoise link hover colour
-#202020 almost black general text
-#761596 purple md5sum text
-#626262 dark gray pre border
-#eeeeee very light gray pre background
-#f2f2f9 very light blue nav table background
-#3366cc medium blue nav table border
-*/
-
-a, a:link, a:visited, a:active { color: #336699; }
-a:hover { color: #339999; }
-
-body { font: 80%/126% sans-serif; }
-h1, h2, h3, h4 { color: #74240f; }
-
-dt { color: #336699; font-weight: bold }
-dd {
- margin-left: 1.5em;
- padding-bottom: 0.8em;
-}
-
-/* -- ruler -- */
-div.hr_blue {
- height: 3px;
- background:#ffffff url("/images/hr_blue.png") repeat-x; }
-div.hr_blue hr { display:none; }
-
-/* release styles */
-#release p { margin-top: 0.4em; }
-#release .md5sum { color: #761596; }
-
-
-/* ------ styles for docs|manuals|howto ------ */
-/* -- lists -- */
-ul {
- margin: 0px 4px 16px 16px;
- padding: 0px;
- list-style: url("/images/li-blue.png");
-}
-ul li {
- margin-bottom: 10px;
-}
-ul ul {
- list-style-type: none;
- list-style-image: none;
- margin-left: 0px;
-}
-
-/* header / footer nav tables */
-table.nav {
- border: solid 1px #3366cc;
- background: #f2f2f9;
- background-color: #f2f2f9;
- margin-bottom: 0.5em;
-}
-/* don't have underlined links in chunked nav menus */
-table.nav a { text-decoration: none; }
-table.nav a:hover { text-decoration: underline; }
-table.nav td { font-size: 85%; }
-
-code, tt, pre { font-size: 120%; }
-code, tt { color: #761596; }
-
-div.literallayout, pre.programlisting, pre.screen {
- color: #000000;
- padding: 0.5em;
- background: #eeeeee;
- border: 1px solid #626262;
- background-color: #eeeeee;
- margin: 4px 0px 4px 0px;
-}
-</style>
-</head>
-<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="book" lang="en">
-<div class="titlepage">
-<div>
-<div><h1 class="title">
-<a name="userman"></a>bzip2 and libbzip2, version 1.0.5</h1></div>
-<div><h2 class="subtitle">A program and library for data compression</h2></div>
-<div><div class="authorgroup"><div class="author">
-<h3 class="author">
-<span class="firstname">Julian</span> <span class="surname">Seward</span>
-</h3>
-<div class="affiliation"><span class="orgname">http://www.bzip.org<br></span></div>
-</div></div></div>
-<div><p class="releaseinfo">Version 1.0.5 of 10 December 2007</p></div>
-<div><p class="copyright">Copyright © 1996-2007 Julian Seward</p></div>
-<div><div class="legalnotice">
-<a name="id2499833"></a><p>This program, <code class="computeroutput">bzip2</code>, the
- associated library <code class="computeroutput">libbzip2</code>, and
- all documentation, are copyright © 1996-2007 Julian Seward.
- All rights reserved.</p>
-<p>Redistribution and use in source and binary forms, with
- or without modification, are permitted provided that the
- following conditions are met:</p>
-<div class="itemizedlist"><ul type="bullet">
-<li style="list-style-type: disc"><p>Redistributions of source code must retain the
- above copyright notice, this list of conditions and the
- following disclaimer.</p></li>
-<li style="list-style-type: disc"><p>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.</p></li>
-<li style="list-style-type: disc"><p>Altered source versions must be plainly marked
- as such, and must not be misrepresented as being the original
- software.</p></li>
-<li style="list-style-type: disc"><p>The name of the author may not be used to
- endorse or promote products derived from this software without
- specific prior written permission.</p></li>
-</ul></div>
-<p>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.</p>
-<p>PATENTS: To the best of my knowledge,
- <code class="computeroutput">bzip2</code> and
- <code class="computeroutput">libbzip2</code> do not use any patented
- algorithms. However, I do not have the resources to carry
- out a patent search. Therefore I cannot give any guarantee of
- the above statement.
- </p>
-</div></div>
-</div>
-<hr>
-</div>
-<div class="toc">
-<p><b>Table of Contents</b></p>
-<dl>
-<dt><span class="chapter"><a href="#intro">1. Introduction</a></span></dt>
-<dt><span class="chapter"><a href="#using">2. How to use bzip2</a></span></dt>
-<dd><dl>
-<dt><span class="sect1"><a href="#name">2.1. NAME</a></span></dt>
-<dt><span class="sect1"><a href="#synopsis">2.2. SYNOPSIS</a></span></dt>
-<dt><span class="sect1"><a href="#description">2.3. DESCRIPTION</a></span></dt>
-<dt><span class="sect1"><a href="#options">2.4. OPTIONS</a></span></dt>
-<dt><span class="sect1"><a href="#memory-management">2.5. MEMORY MANAGEMENT</a></span></dt>
-<dt><span class="sect1"><a href="#recovering">2.6. RECOVERING DATA FROM DAMAGED FILES</a></span></dt>
-<dt><span class="sect1"><a href="#performance">2.7. PERFORMANCE NOTES</a></span></dt>
-<dt><span class="sect1"><a href="#caveats">2.8. CAVEATS</a></span></dt>
-<dt><span class="sect1"><a href="#author">2.9. AUTHOR</a></span></dt>
-</dl></dd>
-<dt><span class="chapter"><a href="#libprog">3.
-Programming with <code class="computeroutput">libbzip2</code>
-</a></span></dt>
-<dd><dl>
-<dt><span class="sect1"><a href="#top-level">3.1. Top-level structure</a></span></dt>
-<dd><dl>
-<dt><span class="sect2"><a href="#ll-summary">3.1.1. Low-level summary</a></span></dt>
-<dt><span class="sect2"><a href="#hl-summary">3.1.2. High-level summary</a></span></dt>
-<dt><span class="sect2"><a href="#util-fns-summary">3.1.3. Utility functions summary</a></span></dt>
-</dl></dd>
-<dt><span class="sect1"><a href="#err-handling">3.2. Error handling</a></span></dt>
-<dt><span class="sect1"><a href="#low-level">3.3. Low-level interface</a></span></dt>
-<dd><dl>
-<dt><span class="sect2"><a href="#bzcompress-init">3.3.1. <code class="computeroutput">BZ2_bzCompressInit</code></a></span></dt>
-<dt><span class="sect2"><a href="#bzCompress">3.3.2. <code class="computeroutput">BZ2_bzCompress</code></a></span></dt>
-<dt><span class="sect2"><a href="#bzCompress-end">3.3.3. <code class="computeroutput">BZ2_bzCompressEnd</code></a></span></dt>
-<dt><span class="sect2"><a href="#bzDecompress-init">3.3.4. <code class="computeroutput">BZ2_bzDecompressInit</code></a></span></dt>
-<dt><span class="sect2"><a href="#bzDecompress">3.3.5. <code class="computeroutput">BZ2_bzDecompress</code></a></span></dt>
-<dt><span class="sect2"><a href="#bzDecompress-end">3.3.6. <code class="computeroutput">BZ2_bzDecompressEnd</code></a></span></dt>
-</dl></dd>
-<dt><span class="sect1"><a href="#hl-interface">3.4. High-level interface</a></span></dt>
-<dd><dl>
-<dt><span class="sect2"><a href="#bzreadopen">3.4.1. <code class="computeroutput">BZ2_bzReadOpen</code></a></span></dt>
-<dt><span class="sect2"><a href="#bzread">3.4.2. <code class="computeroutput">BZ2_bzRead</code></a></span></dt>
-<dt><span class="sect2"><a href="#bzreadgetunused">3.4.3. <code class="computeroutput">BZ2_bzReadGetUnused</code></a></span></dt>
-<dt><span class="sect2"><a href="#bzreadclose">3.4.4. <code class="computeroutput">BZ2_bzReadClose</code></a></span></dt>
-<dt><span class="sect2"><a href="#bzwriteopen">3.4.5. <code class="computeroutput">BZ2_bzWriteOpen</code></a></span></dt>
-<dt><span class="sect2"><a href="#bzwrite">3.4.6. <code class="computeroutput">BZ2_bzWrite</code></a></span></dt>
-<dt><span class="sect2"><a href="#bzwriteclose">3.4.7. <code class="computeroutput">BZ2_bzWriteClose</code></a></span></dt>
-<dt><span class="sect2"><a href="#embed">3.4.8. Handling embedded compressed data streams</a></span></dt>
-<dt><span class="sect2"><a href="#std-rdwr">3.4.9. Standard file-reading/writing code</a></span></dt>
-</dl></dd>
-<dt><span class="sect1"><a href="#util-fns">3.5. Utility functions</a></span></dt>
-<dd><dl>
-<dt><span class="sect2"><a href="#bzbufftobuffcompress">3.5.1. <code class="computeroutput">BZ2_bzBuffToBuffCompress</code></a></span></dt>
-<dt><span class="sect2"><a href="#bzbufftobuffdecompress">3.5.2. <code class="computeroutput">BZ2_bzBuffToBuffDecompress</code></a></span></dt>
-</dl></dd>
-<dt><span class="sect1"><a href="#zlib-compat">3.6. <code class="computeroutput">zlib</code> compatibility functions</a></span></dt>
-<dt><span class="sect1"><a href="#stdio-free">3.7. Using the library in a <code class="computeroutput">stdio</code>-free environment</a></span></dt>
-<dd><dl>
-<dt><span class="sect2"><a href="#stdio-bye">3.7.1. Getting rid of <code class="computeroutput">stdio</code></a></span></dt>
-<dt><span class="sect2"><a href="#critical-error">3.7.2. Critical error handling</a></span></dt>
-</dl></dd>
-<dt><span class="sect1"><a href="#win-dll">3.8. Making a Windows DLL</a></span></dt>
-</dl></dd>
-<dt><span class="chapter"><a href="#misc">4. Miscellanea</a></span></dt>
-<dd><dl>
-<dt><span class="sect1"><a href="#limits">4.1. Limitations of the compressed file format</a></span></dt>
-<dt><span class="sect1"><a href="#port-issues">4.2. Portability issues</a></span></dt>
-<dt><span class="sect1"><a href="#bugs">4.3. Reporting bugs</a></span></dt>
-<dt><span class="sect1"><a href="#package">4.4. Did you get the right package?</a></span></dt>
-<dt><span class="sect1"><a href="#reading">4.5. Further Reading</a></span></dt>
-</dl></dd>
-</dl>
-</div>
-<div class="chapter" lang="en">
-<div class="titlepage"><div><div><h2 class="title">
-<a name="intro"></a>1. Introduction</h2></div></div></div>
-<p><code class="computeroutput">bzip2</code> compresses files
-using the Burrows-Wheeler block-sorting text compression
-algorithm, and Huffman coding. Compression is generally
-considerably better than that achieved by more conventional
-LZ77/LZ78-based compressors, and approaches the performance of
-the PPM family of statistical compressors.</p>
-<p><code class="computeroutput">bzip2</code> is built on top of
-<code class="computeroutput">libbzip2</code>, a flexible library for
-handling compressed data in the
-<code class="computeroutput">bzip2</code> format. This manual
-describes both how to use the program and how to work with the
-library interface. Most of the manual is devoted to this
-library, not the program, which is good news if your interest is
-only in the program.</p>
-<div class="itemizedlist"><ul type="bullet">
-<li style="list-style-type: disc"><p><a href="#using">How to use bzip2</a> describes how to use
- <code class="computeroutput">bzip2</code>; this is the only part
- you need to read if you just want to know how to operate the
- program.</p></li>
-<li style="list-style-type: disc"><p><a href="#libprog">Programming with libbzip2</a> describes the
- programming interfaces in detail, and</p></li>
-<li style="list-style-type: disc"><p><a href="#misc">Miscellanea</a> records some
- miscellaneous notes which I thought ought to be recorded
- somewhere.</p></li>
-</ul></div>
-</div>
-<div class="chapter" lang="en">
-<div class="titlepage"><div><div><h2 class="title">
-<a name="using"></a>2. How to use bzip2</h2></div></div></div>
-<div class="toc">
-<p><b>Table of Contents</b></p>
-<dl>
-<dt><span class="sect1"><a href="#name">2.1. NAME</a></span></dt>
-<dt><span class="sect1"><a href="#synopsis">2.2. SYNOPSIS</a></span></dt>
-<dt><span class="sect1"><a href="#description">2.3. DESCRIPTION</a></span></dt>
-<dt><span class="sect1"><a href="#options">2.4. OPTIONS</a></span></dt>
-<dt><span class="sect1"><a href="#memory-management">2.5. MEMORY MANAGEMENT</a></span></dt>
-<dt><span class="sect1"><a href="#recovering">2.6. RECOVERING DATA FROM DAMAGED FILES</a></span></dt>
-<dt><span class="sect1"><a href="#performance">2.7. PERFORMANCE NOTES</a></span></dt>
-<dt><span class="sect1"><a href="#caveats">2.8. CAVEATS</a></span></dt>
-<dt><span class="sect1"><a href="#author">2.9. AUTHOR</a></span></dt>
-</dl>
-</div>
-<p>This chapter contains a copy of the
-<code class="computeroutput">bzip2</code> man page, and nothing
-else.</p>
-<div class="sect1" lang="en">
-<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="name"></a>2.1. NAME</h2></div></div></div>
-<div class="itemizedlist"><ul type="bullet">
-<li style="list-style-type: disc"><p><code class="computeroutput">bzip2</code>,
- <code class="computeroutput">bunzip2</code> - a block-sorting file
- compressor, v1.0.4</p></li>
-<li style="list-style-type: disc"><p><code class="computeroutput">bzcat</code> -
- decompresses files to stdout</p></li>
-<li style="list-style-type: disc"><p><code class="computeroutput">bzip2recover</code> -
- recovers data from damaged bzip2 files</p></li>
-</ul></div>
-</div>
-<div class="sect1" lang="en">
-<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="synopsis"></a>2.2. SYNOPSIS</h2></div></div></div>
-<div class="itemizedlist"><ul type="bullet">
-<li style="list-style-type: disc"><p><code class="computeroutput">bzip2</code> [
- -cdfkqstvzVL123456789 ] [ filenames ... ]</p></li>
-<li style="list-style-type: disc"><p><code class="computeroutput">bunzip2</code> [
- -fkvsVL ] [ filenames ... ]</p></li>
-<li style="list-style-type: disc"><p><code class="computeroutput">bzcat</code> [ -s ] [
- filenames ... ]</p></li>
-<li style="list-style-type: disc"><p><code class="computeroutput">bzip2recover</code>
- filename</p></li>
-</ul></div>
-</div>
-<div class="sect1" lang="en">
-<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="description"></a>2.3. DESCRIPTION</h2></div></div></div>
-<p><code class="computeroutput">bzip2</code> compresses files
-using the Burrows-Wheeler block sorting text compression
-algorithm, and Huffman coding. Compression is generally
-considerably better than that achieved by more conventional
-LZ77/LZ78-based compressors, and approaches the performance of
-the PPM family of statistical compressors.</p>
-<p>The command-line options are deliberately very similar to
-those of GNU <code class="computeroutput">gzip</code>, but they are
-not identical.</p>
-<p><code class="computeroutput">bzip2</code> expects a list of
-file names to accompany the command-line flags. Each file is
-replaced by a compressed version of itself, with the name
-<code class="computeroutput">original_name.bz2</code>. Each
-compressed file has the same modification date, permissions, and,
-when possible, ownership as the corresponding original, so that
-these properties can be correctly restored at decompression time.
-File name handling is naive in the sense that there is no
-mechanism for preserving original file names, permissions,
-ownerships or dates in filesystems which lack these concepts, or
-have serious file name length restrictions, such as
-MS-DOS.</p>
-<p><code class="computeroutput">bzip2</code> and
-<code class="computeroutput">bunzip2</code> will by default not
-overwrite existing files. If you want this to happen, specify
-the <code class="computeroutput">-f</code> flag.</p>
-<p>If no file names are specified,
-<code class="computeroutput">bzip2</code> compresses from standard
-input to standard output. In this case,
-<code class="computeroutput">bzip2</code> will decline to write
-compressed output to a terminal, as this would be entirely
-incomprehensible and therefore pointless.</p>
-<p><code class="computeroutput">bunzip2</code> (or
-<code class="computeroutput">bzip2 -d</code>) decompresses all
-specified files. Files which were not created by
-<code class="computeroutput">bzip2</code> will be detected and
-ignored, and a warning issued.
-<code class="computeroutput">bzip2</code> attempts to guess the
-filename for the decompressed file from that of the compressed
-file as follows:</p>
-<div class="itemizedlist"><ul type="bullet">
-<li style="list-style-type: disc"><p><code class="computeroutput">filename.bz2 </code>
- becomes
- <code class="computeroutput">filename</code></p></li>
-<li style="list-style-type: disc"><p><code class="computeroutput">filename.bz </code>
- becomes
- <code class="computeroutput">filename</code></p></li>
-<li style="list-style-type: disc"><p><code class="computeroutput">filename.tbz2</code>
- becomes
- <code class="computeroutput">filename.tar</code></p></li>
-<li style="list-style-type: disc"><p><code class="computeroutput">filename.tbz </code>
- becomes
- <code class="computeroutput">filename.tar</code></p></li>
-<li style="list-style-type: disc"><p><code class="computeroutput">anyothername </code>
- becomes
- <code class="computeroutput">anyothername.out</code></p></li>
-</ul></div>
-<p>If the file does not end in one of the recognised endings,
-<code class="computeroutput">.bz2</code>,
-<code class="computeroutput">.bz</code>,
-<code class="computeroutput">.tbz2</code> or
-<code class="computeroutput">.tbz</code>,
-<code class="computeroutput">bzip2</code> complains that it cannot
-guess the name of the original file, and uses the original name
-with <code class="computeroutput">.out</code> appended.</p>
-<p>As with compression, supplying no filenames causes
-decompression from standard input to standard output.</p>
-<p><code class="computeroutput">bunzip2</code> will correctly
-decompress a file which is the concatenation of two or more
-compressed files. The result is the concatenation of the
-corresponding uncompressed files. Integrity testing
-(<code class="computeroutput">-t</code>) of concatenated compressed
-files is also supported.</p>
-<p>You can also compress or decompress files to the standard
-output by giving the <code class="computeroutput">-c</code> flag.
-Multiple files may be compressed and decompressed like this. The
-resulting outputs are fed sequentially to stdout. Compression of
-multiple files in this manner generates a stream containing
-multiple compressed file representations. Such a stream can be
-decompressed correctly only by
-<code class="computeroutput">bzip2</code> version 0.9.0 or later.
-Earlier versions of <code class="computeroutput">bzip2</code> will
-stop after decompressing the first file in the stream.</p>
-<p><code class="computeroutput">bzcat</code> (or
-<code class="computeroutput">bzip2 -dc</code>) decompresses all
-specified files to the standard output.</p>
-<p><code class="computeroutput">bzip2</code> will read arguments
-from the environment variables
-<code class="computeroutput">BZIP2</code> and
-<code class="computeroutput">BZIP</code>, in that order, and will
-process them before any arguments read from the command line.
-This gives a convenient way to supply default arguments.</p>
-<p>Compression is always performed, even if the compressed
-file is slightly larger than the original. Files of less than
-about one hundred bytes tend to get larger, since the compression
-mechanism has a constant overhead in the region of 50 bytes.
-Random data (including the output of most file compressors) is
-coded at about 8.05 bits per byte, giving an expansion of around
-0.5%.</p>
-<p>As a self-check for your protection,
-<code class="computeroutput">bzip2</code> uses 32-bit CRCs to make
-sure that the decompressed version of a file is identical to the
-original. This guards against corruption of the compressed data,
-and against undetected bugs in
-<code class="computeroutput">bzip2</code> (hopefully very unlikely).
-The chances of data corruption going undetected is microscopic,
-about one chance in four billion for each file processed. Be
-aware, though, that the check occurs upon decompression, so it
-can only tell you that something is wrong. It can't help you
-recover the original uncompressed data. You can use
-<code class="computeroutput">bzip2recover</code> to try to recover
-data from damaged files.</p>
-<p>Return values: 0 for a normal exit, 1 for environmental
-problems (file not found, invalid flags, I/O errors, etc.), 2
-to indicate a corrupt compressed file, 3 for an internal
-consistency error (eg, bug) which caused
-<code class="computeroutput">bzip2</code> to panic.</p>
-</div>
-<div class="sect1" lang="en">
-<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="options"></a>2.4. OPTIONS</h2></div></div></div>
-<div class="variablelist"><dl>
-<dt><span class="term"><code class="computeroutput">-c --stdout</code></span></dt>
-<dd><p>Compress or decompress to standard
- output.</p></dd>
-<dt><span class="term"><code class="computeroutput">-d --decompress</code></span></dt>
-<dd><p>Force decompression.
- <code class="computeroutput">bzip2</code>,
- <code class="computeroutput">bunzip2</code> and
- <code class="computeroutput">bzcat</code> are really the same
- program, and the decision about what actions to take is done on
- the basis of which name is used. This flag overrides that
- mechanism, and forces bzip2 to decompress.</p></dd>
-<dt><span class="term"><code class="computeroutput">-z --compress</code></span></dt>
-<dd><p>The complement to
- <code class="computeroutput">-d</code>: forces compression,
- regardless of the invokation name.</p></dd>
-<dt><span class="term"><code class="computeroutput">-t --test</code></span></dt>
-<dd><p>Check integrity of the specified file(s), but
- don't decompress them. This really performs a trial
- decompression and throws away the result.</p></dd>
-<dt><span class="term"><code class="computeroutput">-f --force</code></span></dt>
-<dd>
-<p>Force overwrite of output files. Normally,
- <code class="computeroutput">bzip2</code> will not overwrite
- existing output files. Also forces
- <code class="computeroutput">bzip2</code> to break hard links to
- files, which it otherwise wouldn't do.</p>
-<p><code class="computeroutput">bzip2</code> normally declines
- to decompress files which don't have the correct magic header
- bytes. If forced (<code class="computeroutput">-f</code>),
- however, it will pass such files through unmodified. This is
- how GNU <code class="computeroutput">gzip</code> behaves.</p>
-</dd>
-<dt><span class="term"><code class="computeroutput">-k --keep</code></span></dt>
-<dd><p>Keep (don't delete) input files during
- compression or decompression.</p></dd>
-<dt><span class="term"><code class="computeroutput">-s --small</code></span></dt>
-<dd>
-<p>Reduce memory usage, for compression,
- decompression and testing. Files are decompressed and tested
- using a modified algorithm which only requires 2.5 bytes per
- block byte. This means any file can be decompressed in 2300k
- of memory, albeit at about half the normal speed.</p>
-<p>During compression, <code class="computeroutput">-s</code>
- selects a block size of 200k, which limits memory use to around
- the same figure, at the expense of your compression ratio. In
- short, if your machine is low on memory (8 megabytes or less),
- use <code class="computeroutput">-s</code> for everything. See
- <a href="#memory-management">MEMORY MANAGEMENT</a> below.</p>
-</dd>
-<dt><span class="term"><code class="computeroutput">-q --quiet</code></span></dt>
-<dd><p>Suppress non-essential warning messages.
- Messages pertaining to I/O errors and other critical events
- will not be suppressed.</p></dd>
-<dt><span class="term"><code class="computeroutput">-v --verbose</code></span></dt>
-<dd><p>Verbose mode -- show the compression ratio for
- each file processed. Further
- <code class="computeroutput">-v</code>'s increase the verbosity
- level, spewing out lots of information which is primarily of
- interest for diagnostic purposes.</p></dd>
-<dt><span class="term"><code class="computeroutput">-L --license -V --version</code></span></dt>
-<dd><p>Display the software version, license terms and
- conditions.</p></dd>
-<dt><span class="term"><code class="computeroutput">-1</code> (or
- <code class="computeroutput">--fast</code>) to
- <code class="computeroutput">-9</code> (or
- <code class="computeroutput">-best</code>)</span></dt>
-<dd><p>Set the block size to 100 k, 200 k ... 900 k
- when compressing. Has no effect when decompressing. See <a href="#memory-management">MEMORY MANAGEMENT</a> below. The
- <code class="computeroutput">--fast</code> and
- <code class="computeroutput">--best</code> aliases are primarily
- for GNU <code class="computeroutput">gzip</code> compatibility.
- In particular, <code class="computeroutput">--fast</code> doesn't
- make things significantly faster. And
- <code class="computeroutput">--best</code> merely selects the
- default behaviour.</p></dd>
-<dt><span class="term"><code class="computeroutput">--</code></span></dt>
-<dd><p>Treats all subsequent arguments as file names,
- even if they start with a dash. This is so you can handle
- files with names beginning with a dash, for example:
- <code class="computeroutput">bzip2 --
- -myfilename</code>.</p></dd>
-<dt>
-<span class="term"><code class="computeroutput">--repetitive-fast</code>, </span><span class="term"><code class="computeroutput">--repetitive-best</code></span>
-</dt>
-<dd><p>These flags are redundant in versions 0.9.5 and
- above. They provided some coarse control over the behaviour of
- the sorting algorithm in earlier versions, which was sometimes
- useful. 0.9.5 and above have an improved algorithm which
- renders these flags irrelevant.</p></dd>
-</dl></div>
-</div>
-<div class="sect1" lang="en">
-<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="memory-management"></a>2.5. MEMORY MANAGEMENT</h2></div></div></div>
-<p><code class="computeroutput">bzip2</code> compresses large
-files in blocks. The block size affects both the compression
-ratio achieved, and the amount of memory needed for compression
-and decompression. The flags <code class="computeroutput">-1</code>
-through <code class="computeroutput">-9</code> specify the block
-size to be 100,000 bytes through 900,000 bytes (the default)
-respectively. At decompression time, the block size used for
-compression is read from the header of the compressed file, and
-<code class="computeroutput">bunzip2</code> then allocates itself
-just enough memory to decompress the file. Since block sizes are
-stored in compressed files, it follows that the flags
-<code class="computeroutput">-1</code> to
-<code class="computeroutput">-9</code> are irrelevant to and so
-ignored during decompression.</p>
-<p>Compression and decompression requirements, in bytes, can be
-estimated as:</p>
-<pre class="programlisting">Compression: 400k + ( 8 x block size )
-
-Decompression: 100k + ( 4 x block size ), or
- 100k + ( 2.5 x block size )</pre>
-<p>Larger block sizes give rapidly diminishing marginal
-returns. Most of the compression comes from the first two or
-three hundred k of block size, a fact worth bearing in mind when
-using <code class="computeroutput">bzip2</code> on small machines.
-It is also important to appreciate that the decompression memory
-requirement is set at compression time by the choice of block
-size.</p>
-<p>For files compressed with the default 900k block size,
-<code class="computeroutput">bunzip2</code> will require about 3700
-kbytes to decompress. To support decompression of any file on a
-4 megabyte machine, <code class="computeroutput">bunzip2</code> has
-an option to decompress using approximately half this amount of
-memory, about 2300 kbytes. Decompression speed is also halved,
-so you should use this option only where necessary. The relevant
-flag is <code class="computeroutput">-s</code>.</p>
-<p>In general, try and use the largest block size memory
-constraints allow, since that maximises the compression achieved.
-Compression and decompression speed are virtually unaffected by
-block size.</p>
-<p>Another significant point applies to files which fit in a
-single block -- that means most files you'd encounter using a
-large block size. The amount of real memory touched is
-proportional to the size of the file, since the file is smaller
-than a block. For example, compressing a file 20,000 bytes long
-with the flag <code class="computeroutput">-9</code> will cause the
-compressor to allocate around 7600k of memory, but only touch
-400k + 20000 * 8 = 560 kbytes of it. Similarly, the decompressor
-will allocate 3700k but only touch 100k + 20000 * 4 = 180
-kbytes.</p>
-<p>Here is a table which summarises the maximum memory usage
-for different block sizes. Also recorded is the total compressed
-size for 14 files of the Calgary Text Compression Corpus
-totalling 3,141,622 bytes. This column gives some feel for how
-compression varies with block size. These figures tend to
-understate the advantage of larger block sizes for larger files,
-since the Corpus is dominated by smaller files.</p>
-<pre class="programlisting"> Compress Decompress Decompress Corpus
-Flag usage usage -s usage Size
-
- -1 1200k 500k 350k 914704
- -2 2000k 900k 600k 877703
- -3 2800k 1300k 850k 860338
- -4 3600k 1700k 1100k 846899
- -5 4400k 2100k 1350k 845160
- -6 5200k 2500k 1600k 838626
- -7 6100k 2900k 1850k 834096
- -8 6800k 3300k 2100k 828642
- -9 7600k 3700k 2350k 828642</pre>
-</div>
-<div class="sect1" lang="en">
-<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="recovering"></a>2.6. RECOVERING DATA FROM DAMAGED FILES</h2></div></div></div>
-<p><code class="computeroutput">bzip2</code> compresses files in
-blocks, usually 900kbytes long. Each block is handled
-independently. If a media or transmission error causes a
-multi-block <code class="computeroutput">.bz2</code> file to become
-damaged, it may be possible to recover data from the undamaged
-blocks in the file.</p>
-<p>The compressed representation of each block is delimited by
-a 48-bit pattern, which makes it possible to find the block
-boundaries with reasonable certainty. Each block also carries
-its own 32-bit CRC, so damaged blocks can be distinguished from
-undamaged ones.</p>
-<p><code class="computeroutput">bzip2recover</code> is a simple
-program whose purpose is to search for blocks in
-<code class="computeroutput">.bz2</code> files, and write each block
-out into its own <code class="computeroutput">.bz2</code> file. You
-can then use <code class="computeroutput">bzip2 -t</code> to test
-the integrity of the resulting files, and decompress those which
-are undamaged.</p>
-<p><code class="computeroutput">bzip2recover</code> takes a
-single argument, the name of the damaged file, and writes a
-number of files <code class="computeroutput">rec0001file.bz2</code>,
-<code class="computeroutput">rec0002file.bz2</code>, etc, containing
-the extracted blocks. The output filenames are designed so that
-the use of wildcards in subsequent processing -- for example,
-<code class="computeroutput">bzip2 -dc rec*file.bz2 &gt;
-recovered_data</code> -- lists the files in the correct
-order.</p>
-<p><code class="computeroutput">bzip2recover</code> should be of
-most use dealing with large <code class="computeroutput">.bz2</code>
-files, as these will contain many blocks. It is clearly futile
-to use it on damaged single-block files, since a damaged block
-cannot be recovered. If you wish to minimise any potential data
-loss through media or transmission errors, you might consider
-compressing with a smaller block size.</p>
-</div>
-<div class="sect1" lang="en">
-<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="performance"></a>2.7. PERFORMANCE NOTES</h2></div></div></div>
-<p>The sorting phase of compression gathers together similar
-strings in the file. Because of this, files containing very long
-runs of repeated symbols, like "aabaabaabaab ..." (repeated
-several hundred times) may compress more slowly than normal.
-Versions 0.9.5 and above fare much better than previous versions
-in this respect. The ratio between worst-case and average-case
-compression time is in the region of 10:1. For previous
-versions, this figure was more like 100:1. You can use the
-<code class="computeroutput">-vvvv</code> option to monitor progress
-in great detail, if you want.</p>
-<p>Decompression speed is unaffected by these
-phenomena.</p>
-<p><code class="computeroutput">bzip2</code> usually allocates
-several megabytes of memory to operate in, and then charges all
-over it in a fairly random fashion. This means that performance,
-both for compressing and decompressing, is largely determined by
-the speed at which your machine can service cache misses.
-Because of this, small changes to the code to reduce the miss
-rate have been observed to give disproportionately large
-performance improvements. I imagine
-<code class="computeroutput">bzip2</code> will perform best on
-machines with very large caches.</p>
-</div>
-<div class="sect1" lang="en">
-<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="caveats"></a>2.8. CAVEATS</h2></div></div></div>
-<p>I/O error messages are not as helpful as they could be.
-<code class="computeroutput">bzip2</code> tries hard to detect I/O
-errors and exit cleanly, but the details of what the problem is
-sometimes seem rather misleading.</p>
-<p>This manual page pertains to version 1.0.5 of
-<code class="computeroutput">bzip2</code>. Compressed data created by
-this version is entirely forwards and backwards compatible with the
-previous public releases, versions 0.1pl2, 0.9.0 and 0.9.5, 1.0.0,
-1.0.1, 1.0.2 and 1.0.3, but with the following exception: 0.9.0 and
-above can correctly decompress multiple concatenated compressed files.
-0.1pl2 cannot do this; it will stop after decompressing just the first
-file in the stream.</p>
-<p><code class="computeroutput">bzip2recover</code> versions
-prior to 1.0.2 used 32-bit integers to represent bit positions in
-compressed files, so it could not handle compressed files more
-than 512 megabytes long. Versions 1.0.2 and above use 64-bit ints
-on some platforms which support them (GNU supported targets, and
-Windows). To establish whether or not
-<code class="computeroutput">bzip2recover</code> was built with such
-a limitation, run it without arguments. In any event you can
-build yourself an unlimited version if you can recompile it with
-<code class="computeroutput">MaybeUInt64</code> set to be an
-unsigned 64-bit integer.</p>
-</div>
-<div class="sect1" lang="en">
-<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="author"></a>2.9. AUTHOR</h2></div></div></div>
-<p>Julian Seward,
-<code class="computeroutput">jseward@bzip.org</code></p>
-<p>The ideas embodied in
-<code class="computeroutput">bzip2</code> are due to (at least) the
-following people: Michael Burrows and David Wheeler (for the
-block sorting transformation), David Wheeler (again, for the
-Huffman coder), Peter Fenwick (for the structured coding model in
-the original <code class="computeroutput">bzip</code>, and many
-refinements), and Alistair Moffat, Radford Neal and Ian Witten
-(for the arithmetic coder in the original
-<code class="computeroutput">bzip</code>). I am much indebted for
-their help, support and advice. See the manual in the source
-distribution for pointers to sources of documentation. Christian
-von Roques encouraged me to look for faster sorting algorithms,
-so as to speed up compression. Bela Lubkin encouraged me to
-improve the worst-case compression performance.
-Donna Robinson XMLised the documentation.
-Many people sent
-patches, helped with portability problems, lent machines, gave
-advice and were generally helpful.</p>
-</div>
-</div>
-<div class="chapter" lang="en">
-<div class="titlepage"><div><div><h2 class="title">
-<a name="libprog"></a>3. 
-Programming with <code class="computeroutput">libbzip2</code>
-</h2></div></div></div>
-<div class="toc">
-<p><b>Table of Contents</b></p>
-<dl>
-<dt><span class="sect1"><a href="#top-level">3.1. Top-level structure</a></span></dt>
-<dd><dl>
-<dt><span class="sect2"><a href="#ll-summary">3.1.1. Low-level summary</a></span></dt>
-<dt><span class="sect2"><a href="#hl-summary">3.1.2. High-level summary</a></span></dt>
-<dt><span class="sect2"><a href="#util-fns-summary">3.1.3. Utility functions summary</a></span></dt>
-</dl></dd>
-<dt><span class="sect1"><a href="#err-handling">3.2. Error handling</a></span></dt>
-<dt><span class="sect1"><a href="#low-level">3.3. Low-level interface</a></span></dt>
-<dd><dl>
-<dt><span class="sect2"><a href="#bzcompress-init">3.3.1. <code class="computeroutput">BZ2_bzCompressInit</code></a></span></dt>
-<dt><span class="sect2"><a href="#bzCompress">3.3.2. <code class="computeroutput">BZ2_bzCompress</code></a></span></dt>
-<dt><span class="sect2"><a href="#bzCompress-end">3.3.3. <code class="computeroutput">BZ2_bzCompressEnd</code></a></span></dt>
-<dt><span class="sect2"><a href="#bzDecompress-init">3.3.4. <code class="computeroutput">BZ2_bzDecompressInit</code></a></span></dt>
-<dt><span class="sect2"><a href="#bzDecompress">3.3.5. <code class="computeroutput">BZ2_bzDecompress</code></a></span></dt>
-<dt><span class="sect2"><a href="#bzDecompress-end">3.3.6. <code class="computeroutput">BZ2_bzDecompressEnd</code></a></span></dt>
-</dl></dd>
-<dt><span class="sect1"><a href="#hl-interface">3.4. High-level interface</a></span></dt>
-<dd><dl>
-<dt><span class="sect2"><a href="#bzreadopen">3.4.1. <code class="computeroutput">BZ2_bzReadOpen</code></a></span></dt>
-<dt><span class="sect2"><a href="#bzread">3.4.2. <code class="computeroutput">BZ2_bzRead</code></a></span></dt>
-<dt><span class="sect2"><a href="#bzreadgetunused">3.4.3. <code class="computeroutput">BZ2_bzReadGetUnused</code></a></span></dt>
-<dt><span class="sect2"><a href="#bzreadclose">3.4.4. <code class="computeroutput">BZ2_bzReadClose</code></a></span></dt>
-<dt><span class="sect2"><a href="#bzwriteopen">3.4.5. <code class="computeroutput">BZ2_bzWriteOpen</code></a></span></dt>
-<dt><span class="sect2"><a href="#bzwrite">3.4.6. <code class="computeroutput">BZ2_bzWrite</code></a></span></dt>
-<dt><span class="sect2"><a href="#bzwriteclose">3.4.7. <code class="computeroutput">BZ2_bzWriteClose</code></a></span></dt>
-<dt><span class="sect2"><a href="#embed">3.4.8. Handling embedded compressed data streams</a></span></dt>
-<dt><span class="sect2"><a href="#std-rdwr">3.4.9. Standard file-reading/writing code</a></span></dt>
-</dl></dd>
-<dt><span class="sect1"><a href="#util-fns">3.5. Utility functions</a></span></dt>
-<dd><dl>
-<dt><span class="sect2"><a href="#bzbufftobuffcompress">3.5.1. <code class="computeroutput">BZ2_bzBuffToBuffCompress</code></a></span></dt>
-<dt><span class="sect2"><a href="#bzbufftobuffdecompress">3.5.2. <code class="computeroutput">BZ2_bzBuffToBuffDecompress</code></a></span></dt>
-</dl></dd>
-<dt><span class="sect1"><a href="#zlib-compat">3.6. <code class="computeroutput">zlib</code> compatibility functions</a></span></dt>
-<dt><span class="sect1"><a href="#stdio-free">3.7. Using the library in a <code class="computeroutput">stdio</code>-free environment</a></span></dt>
-<dd><dl>
-<dt><span class="sect2"><a href="#stdio-bye">3.7.1. Getting rid of <code class="computeroutput">stdio</code></a></span></dt>
-<dt><span class="sect2"><a href="#critical-error">3.7.2. Critical error handling</a></span></dt>
-</dl></dd>
-<dt><span class="sect1"><a href="#win-dll">3.8. Making a Windows DLL</a></span></dt>
-</dl>
-</div>
-<p>This chapter describes the programming interface to
-<code class="computeroutput">libbzip2</code>.</p>
-<p>For general background information, particularly about
-memory use and performance aspects, you'd be well advised to read
-<a href="#using">How to use bzip2</a> as well.</p>
-<div class="sect1" lang="en">
-<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="top-level"></a>3.1. Top-level structure</h2></div></div></div>
-<p><code class="computeroutput">libbzip2</code> is a flexible
-library for compressing and decompressing data in the
-<code class="computeroutput">bzip2</code> data format. Although
-packaged as a single entity, it helps to regard the library as
-three separate parts: the low level interface, and the high level
-interface, and some utility functions.</p>
-<p>The structure of
-<code class="computeroutput">libbzip2</code>'s interfaces is similar
-to that of Jean-loup Gailly's and Mark Adler's excellent
-<code class="computeroutput">zlib</code> library.</p>
-<p>All externally visible symbols have names beginning
-<code class="computeroutput">BZ2_</code>. This is new in version
-1.0. The intention is to minimise pollution of the namespaces of
-library clients.</p>
-<p>To use any part of the library, you need to
-<code class="computeroutput">#include &lt;bzlib.h&gt;</code>
-into your sources.</p>
-<div class="sect2" lang="en">
-<div class="titlepage"><div><div><h3 class="title">
-<a name="ll-summary"></a>3.1.1. Low-level summary</h3></div></div></div>
-<p>This interface provides services for compressing and
-decompressing data in memory. There's no provision for dealing
-with files, streams or any other I/O mechanisms, just straight
-memory-to-memory work. In fact, this part of the library can be
-compiled without inclusion of
-<code class="computeroutput">stdio.h</code>, which may be helpful
-for embedded applications.</p>
-<p>The low-level part of the library has no global variables
-and is therefore thread-safe.</p>
-<p>Six routines make up the low level interface:
-<code class="computeroutput">BZ2_bzCompressInit</code>,
-<code class="computeroutput">BZ2_bzCompress</code>, and
-<code class="computeroutput">BZ2_bzCompressEnd</code> for
-compression, and a corresponding trio
-<code class="computeroutput">BZ2_bzDecompressInit</code>,
-<code class="computeroutput">BZ2_bzDecompress</code> and
-<code class="computeroutput">BZ2_bzDecompressEnd</code> for
-decompression. The <code class="computeroutput">*Init</code>
-functions allocate memory for compression/decompression and do
-other initialisations, whilst the
-<code class="computeroutput">*End</code> functions close down
-operations and release memory.</p>
-<p>The real work is done by
-<code class="computeroutput">BZ2_bzCompress</code> and
-<code class="computeroutput">BZ2_bzDecompress</code>. These
-compress and decompress data from a user-supplied input buffer to
-a user-supplied output buffer. These buffers can be any size;
-arbitrary quantities of data are handled by making repeated calls
-to these functions. This is a flexible mechanism allowing a
-consumer-pull style of activity, or producer-push, or a mixture
-of both.</p>
-</div>
-<div class="sect2" lang="en">
-<div class="titlepage"><div><div><h3 class="title">
-<a name="hl-summary"></a>3.1.2. High-level summary</h3></div></div></div>
-<p>This interface provides some handy wrappers around the
-low-level interface to facilitate reading and writing
-<code class="computeroutput">bzip2</code> format files
-(<code class="computeroutput">.bz2</code> files). The routines
-provide hooks to facilitate reading files in which the
-<code class="computeroutput">bzip2</code> data stream is embedded
-within some larger-scale file structure, or where there are
-multiple <code class="computeroutput">bzip2</code> data streams
-concatenated end-to-end.</p>
-<p>For reading files,
-<code class="computeroutput">BZ2_bzReadOpen</code>,
-<code class="computeroutput">BZ2_bzRead</code>,
-<code class="computeroutput">BZ2_bzReadClose</code> and
-<code class="computeroutput">BZ2_bzReadGetUnused</code> are
-supplied. For writing files,
-<code class="computeroutput">BZ2_bzWriteOpen</code>,
-<code class="computeroutput">BZ2_bzWrite</code> and
-<code class="computeroutput">BZ2_bzWriteFinish</code> are
-available.</p>
-<p>As with the low-level library, no global variables are used
-so the library is per se thread-safe. However, if I/O errors
-occur whilst reading or writing the underlying compressed files,
-you may have to consult <code class="computeroutput">errno</code> to
-determine the cause of the error. In that case, you'd need a C
-library which correctly supports
-<code class="computeroutput">errno</code> in a multithreaded
-environment.</p>
-<p>To make the library a little simpler and more portable,
-<code class="computeroutput">BZ2_bzReadOpen</code> and
-<code class="computeroutput">BZ2_bzWriteOpen</code> require you to
-pass them file handles (<code class="computeroutput">FILE*</code>s)
-which have previously been opened for reading or writing
-respectively. That avoids portability problems associated with
-file operations and file attributes, whilst not being much of an
-imposition on the programmer.</p>
-</div>
-<div class="sect2" lang="en">
-<div class="titlepage"><div><div><h3 class="title">
-<a name="util-fns-summary"></a>3.1.3. Utility functions summary</h3></div></div></div>
-<p>For very simple needs,
-<code class="computeroutput">BZ2_bzBuffToBuffCompress</code> and
-<code class="computeroutput">BZ2_bzBuffToBuffDecompress</code> are
-provided. These compress data in memory from one buffer to
-another buffer in a single function call. You should assess
-whether these functions fulfill your memory-to-memory
-compression/decompression requirements before investing effort in
-understanding the more general but more complex low-level
-interface.</p>
-<p>Yoshioka Tsuneo
-(<code class="computeroutput">tsuneo@rr.iij4u.or.jp</code>) has
-contributed some functions to give better
-<code class="computeroutput">zlib</code> compatibility. These
-functions are <code class="computeroutput">BZ2_bzopen</code>,
-<code class="computeroutput">BZ2_bzread</code>,
-<code class="computeroutput">BZ2_bzwrite</code>,
-<code class="computeroutput">BZ2_bzflush</code>,
-<code class="computeroutput">BZ2_bzclose</code>,
-<code class="computeroutput">BZ2_bzerror</code> and
-<code class="computeroutput">BZ2_bzlibVersion</code>. You may find
-these functions more convenient for simple file reading and
-writing, than those in the high-level interface. These functions
-are not (yet) officially part of the library, and are minimally
-documented here. If they break, you get to keep all the pieces.
-I hope to document them properly when time permits.</p>
-<p>Yoshioka also contributed modifications to allow the
-library to be built as a Windows DLL.</p>
-</div>
-</div>
-<div class="sect1" lang="en">
-<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="err-handling"></a>3.2. Error handling</h2></div></div></div>
-<p>The library is designed to recover cleanly in all
-situations, including the worst-case situation of decompressing
-random data. I'm not 100% sure that it can always do this, so
-you might want to add a signal handler to catch segmentation
-violations during decompression if you are feeling especially
-paranoid. I would be interested in hearing more about the
-robustness of the library to corrupted compressed data.</p>
-<p>Version 1.0.3 more robust in this respect than any
-previous version. Investigations with Valgrind (a tool for detecting
-problems with memory management) indicate
-that, at least for the few files I tested, all single-bit errors
-in the decompressed data are caught properly, with no
-segmentation faults, no uses of uninitialised data, no out of
-range reads or writes, and no infinite looping in the decompressor.
-So it's certainly pretty robust, although
-I wouldn't claim it to be totally bombproof.</p>
-<p>The file <code class="computeroutput">bzlib.h</code> contains
-all definitions needed to use the library. In particular, you
-should definitely not include
-<code class="computeroutput">bzlib_private.h</code>.</p>
-<p>In <code class="computeroutput">bzlib.h</code>, the various
-return values are defined. The following list is not intended as
-an exhaustive description of the circumstances in which a given
-value may be returned -- those descriptions are given later.
-Rather, it is intended to convey the rough meaning of each return
-value. The first five actions are normal and not intended to
-denote an error situation.</p>
-<div class="variablelist"><dl>
-<dt><span class="term"><code class="computeroutput">BZ_OK</code></span></dt>
-<dd><p>The requested action was completed
- successfully.</p></dd>
-<dt><span class="term"><code class="computeroutput">BZ_RUN_OK, BZ_FLUSH_OK,
- BZ_FINISH_OK</code></span></dt>
-<dd><p>In
- <code class="computeroutput">BZ2_bzCompress</code>, the requested
- flush/finish/nothing-special action was completed
- successfully.</p></dd>
-<dt><span class="term"><code class="computeroutput">BZ_STREAM_END</code></span></dt>
-<dd><p>Compression of data was completed, or the
- logical stream end was detected during
- decompression.</p></dd>
-</dl></div>
-<p>The following return values indicate an error of some
-kind.</p>
-<div class="variablelist"><dl>
-<dt><span class="term"><code class="computeroutput">BZ_CONFIG_ERROR</code></span></dt>
-<dd><p>Indicates that the library has been improperly
- compiled on your platform -- a major configuration error.
- Specifically, it means that
- <code class="computeroutput">sizeof(char)</code>,
- <code class="computeroutput">sizeof(short)</code> and
- <code class="computeroutput">sizeof(int)</code> are not 1, 2 and
- 4 respectively, as they should be. Note that the library
- should still work properly on 64-bit platforms which follow
- the LP64 programming model -- that is, where
- <code class="computeroutput">sizeof(long)</code> and
- <code class="computeroutput">sizeof(void*)</code> are 8. Under
- LP64, <code class="computeroutput">sizeof(int)</code> is still 4,
- so <code class="computeroutput">libbzip2</code>, which doesn't
- use the <code class="computeroutput">long</code> type, is
- OK.</p></dd>
-<dt><span class="term"><code class="computeroutput">BZ_SEQUENCE_ERROR</code></span></dt>
-<dd><p>When using the library, it is important to call
- the functions in the correct sequence and with data structures
- (buffers etc) in the correct states.
- <code class="computeroutput">libbzip2</code> checks as much as it
- can to ensure this is happening, and returns
- <code class="computeroutput">BZ_SEQUENCE_ERROR</code> if not.
- Code which complies precisely with the function semantics, as
- detailed below, should never receive this value; such an event
- denotes buggy code which you should
- investigate.</p></dd>
-<dt><span class="term"><code class="computeroutput">BZ_PARAM_ERROR</code></span></dt>
-<dd><p>Returned when a parameter to a function call is
- out of range or otherwise manifestly incorrect. As with
- <code class="computeroutput">BZ_SEQUENCE_ERROR</code>, this
- denotes a bug in the client code. The distinction between
- <code class="computeroutput">BZ_PARAM_ERROR</code> and
- <code class="computeroutput">BZ_SEQUENCE_ERROR</code> is a bit
- hazy, but still worth making.</p></dd>
-<dt><span class="term"><code class="computeroutput">BZ_MEM_ERROR</code></span></dt>
-<dd><p>Returned when a request to allocate memory
- failed. Note that the quantity of memory needed to decompress
- a stream cannot be determined until the stream's header has
- been read. So
- <code class="computeroutput">BZ2_bzDecompress</code> and
- <code class="computeroutput">BZ2_bzRead</code> may return
- <code class="computeroutput">BZ_MEM_ERROR</code> even though some
- of the compressed data has been read. The same is not true
- for compression; once
- <code class="computeroutput">BZ2_bzCompressInit</code> or
- <code class="computeroutput">BZ2_bzWriteOpen</code> have
- successfully completed,
- <code class="computeroutput">BZ_MEM_ERROR</code> cannot
- occur.</p></dd>
-<dt><span class="term"><code class="computeroutput">BZ_DATA_ERROR</code></span></dt>
-<dd><p>Returned when a data integrity error is
- detected during decompression. Most importantly, this means
- when stored and computed CRCs for the data do not match. This
- value is also returned upon detection of any other anomaly in
- the compressed data.</p></dd>
-<dt><span class="term"><code class="computeroutput">BZ_DATA_ERROR_MAGIC</code></span></dt>
-<dd><p>As a special case of
- <code class="computeroutput">BZ_DATA_ERROR</code>, it is
- sometimes useful to know when the compressed stream does not
- start with the correct magic bytes (<code class="computeroutput">'B' 'Z'
- 'h'</code>).</p></dd>
-<dt><span class="term"><code class="computeroutput">BZ_IO_ERROR</code></span></dt>
-<dd><p>Returned by
- <code class="computeroutput">BZ2_bzRead</code> and
- <code class="computeroutput">BZ2_bzWrite</code> when there is an
- error reading or writing in the compressed file, and by
- <code class="computeroutput">BZ2_bzReadOpen</code> and
- <code class="computeroutput">BZ2_bzWriteOpen</code> for attempts
- to use a file for which the error indicator (viz,
- <code class="computeroutput">ferror(f)</code>) is set. On
- receipt of <code class="computeroutput">BZ_IO_ERROR</code>, the
- caller should consult <code class="computeroutput">errno</code>
- and/or <code class="computeroutput">perror</code> to acquire
- operating-system specific information about the
- problem.</p></dd>
-<dt><span class="term"><code class="computeroutput">BZ_UNEXPECTED_EOF</code></span></dt>
-<dd><p>Returned by
- <code class="computeroutput">BZ2_bzRead</code> when the
- compressed file finishes before the logical end of stream is
- detected.</p></dd>
-<dt><span class="term"><code class="computeroutput">BZ_OUTBUFF_FULL</code></span></dt>
-<dd><p>Returned by
- <code class="computeroutput">BZ2_bzBuffToBuffCompress</code> and
- <code class="computeroutput">BZ2_bzBuffToBuffDecompress</code> to
- indicate that the output data will not fit into the output
- buffer provided.</p></dd>
-</dl></div>
-</div>
-<div class="sect1" lang="en">
-<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="low-level"></a>3.3. Low-level interface</h2></div></div></div>
-<div class="sect2" lang="en">
-<div class="titlepage"><div><div><h3 class="title">
-<a name="bzcompress-init"></a>3.3.1. <code class="computeroutput">BZ2_bzCompressInit</code></h3></div></div></div>
-<pre class="programlisting">typedef struct {
- char *next_in;
- unsigned int avail_in;
- unsigned int total_in_lo32;
- unsigned int total_in_hi32;
-
- char *next_out;
- unsigned int avail_out;
- unsigned int total_out_lo32;
- unsigned int total_out_hi32;
-
- void *state;
-
- void *(*bzalloc)(void *,int,int);
- void (*bzfree)(void *,void *);
- void *opaque;
-} bz_stream;
-
-int BZ2_bzCompressInit ( bz_stream *strm,
- int blockSize100k,
- int verbosity,
- int workFactor );</pre>
-<p>Prepares for compression. The
-<code class="computeroutput">bz_stream</code> structure holds all
-data pertaining to the compression activity. A
-<code class="computeroutput">bz_stream</code> structure should be
-allocated and initialised prior to the call. The fields of
-<code class="computeroutput">bz_stream</code> comprise the entirety
-of the user-visible data. <code class="computeroutput">state</code>
-is a pointer to the private data structures required for
-compression.</p>
-<p>Custom memory allocators are supported, via fields
-<code class="computeroutput">bzalloc</code>,
-<code class="computeroutput">bzfree</code>, and
-<code class="computeroutput">opaque</code>. The value
-<code class="computeroutput">opaque</code> is passed to as the first
-argument to all calls to <code class="computeroutput">bzalloc</code>
-and <code class="computeroutput">bzfree</code>, but is otherwise
-ignored by the library. The call <code class="computeroutput">bzalloc (
-opaque, n, m )</code> is expected to return a pointer
-<code class="computeroutput">p</code> to <code class="computeroutput">n *
-m</code> bytes of memory, and <code class="computeroutput">bzfree (
-opaque, p )</code> should free that memory.</p>
-<p>If you don't want to use a custom memory allocator, set
-<code class="computeroutput">bzalloc</code>,
-<code class="computeroutput">bzfree</code> and
-<code class="computeroutput">opaque</code> to
-<code class="computeroutput">NULL</code>, and the library will then
-use the standard <code class="computeroutput">malloc</code> /
-<code class="computeroutput">free</code> routines.</p>
-<p>Before calling
-<code class="computeroutput">BZ2_bzCompressInit</code>, fields
-<code class="computeroutput">bzalloc</code>,
-<code class="computeroutput">bzfree</code> and
-<code class="computeroutput">opaque</code> should be filled
-appropriately, as just described. Upon return, the internal
-state will have been allocated and initialised, and
-<code class="computeroutput">total_in_lo32</code>,
-<code class="computeroutput">total_in_hi32</code>,
-<code class="computeroutput">total_out_lo32</code> and
-<code class="computeroutput">total_out_hi32</code> will have been
-set to zero. These four fields are used by the library to inform
-the caller of the total amount of data passed into and out of the
-library, respectively. You should not try to change them. As of
-version 1.0, 64-bit counts are maintained, even on 32-bit
-platforms, using the <code class="computeroutput">_hi32</code>
-fields to store the upper 32 bits of the count. So, for example,
-the total amount of data in is <code class="computeroutput">(total_in_hi32
-&lt;&lt; 32) + total_in_lo32</code>.</p>
-<p>Parameter <code class="computeroutput">blockSize100k</code>
-specifies the block size to be used for compression. It should
-be a value between 1 and 9 inclusive, and the actual block size
-used is 100000 x this figure. 9 gives the best compression but
-takes most memory.</p>
-<p>Parameter <code class="computeroutput">verbosity</code> should
-be set to a number between 0 and 4 inclusive. 0 is silent, and
-greater numbers give increasingly verbose monitoring/debugging
-output. If the library has been compiled with
-<code class="computeroutput">-DBZ_NO_STDIO</code>, no such output
-will appear for any verbosity setting.</p>
-<p>Parameter <code class="computeroutput">workFactor</code>
-controls how the compression phase behaves when presented with
-worst case, highly repetitive, input data. If compression runs
-into difficulties caused by repetitive data, the library switches
-from the standard sorting algorithm to a fallback algorithm. The
-fallback is slower than the standard algorithm by perhaps a
-factor of three, but always behaves reasonably, no matter how bad
-the input.</p>
-<p>Lower values of <code class="computeroutput">workFactor</code>
-reduce the amount of effort the standard algorithm will expend
-before resorting to the fallback. You should set this parameter
-carefully; too low, and many inputs will be handled by the
-fallback algorithm and so compress rather slowly, too high, and
-your average-to-worst case compression times can become very
-large. The default value of 30 gives reasonable behaviour over a
-wide range of circumstances.</p>
-<p>Allowable values range from 0 to 250 inclusive. 0 is a
-special case, equivalent to using the default value of 30.</p>
-<p>Note that the compressed output generated is the same
-regardless of whether or not the fallback algorithm is
-used.</p>
-<p>Be aware also that this parameter may disappear entirely in
-future versions of the library. In principle it should be
-possible to devise a good way to automatically choose which
-algorithm to use. Such a mechanism would render the parameter
-obsolete.</p>
-<p>Possible return values:</p>
-<pre class="programlisting">BZ_CONFIG_ERROR
- if the library has been mis-compiled
-BZ_PARAM_ERROR
- if strm is NULL
- or blockSize &lt; 1 or blockSize &gt; 9
- or verbosity &lt; 0 or verbosity &gt; 4
- or workFactor &lt; 0 or workFactor &gt; 250
-BZ_MEM_ERROR
- if not enough memory is available
-BZ_OK
- otherwise</pre>
-<p>Allowable next actions:</p>
-<pre class="programlisting">BZ2_bzCompress
- if BZ_OK is returned
- no specific action needed in case of error</pre>
-</div>
-<div class="sect2" lang="en">
-<div class="titlepage"><div><div><h3 class="title">
-<a name="bzCompress"></a>3.3.2. <code class="computeroutput">BZ2_bzCompress</code></h3></div></div></div>
-<pre class="programlisting">int BZ2_bzCompress ( bz_stream *strm, int action );</pre>
-<p>Provides more input and/or output buffer space for the
-library. The caller maintains input and output buffers, and
-calls <code class="computeroutput">BZ2_bzCompress</code> to transfer
-data between them.</p>
-<p>Before each call to
-<code class="computeroutput">BZ2_bzCompress</code>,
-<code class="computeroutput">next_in</code> should point at the data
-to be compressed, and <code class="computeroutput">avail_in</code>
-should indicate how many bytes the library may read.
-<code class="computeroutput">BZ2_bzCompress</code> updates
-<code class="computeroutput">next_in</code>,
-<code class="computeroutput">avail_in</code> and
-<code class="computeroutput">total_in</code> to reflect the number
-of bytes it has read.</p>
-<p>Similarly, <code class="computeroutput">next_out</code> should
-point to a buffer in which the compressed data is to be placed,
-with <code class="computeroutput">avail_out</code> indicating how
-much output space is available.
-<code class="computeroutput">BZ2_bzCompress</code> updates
-<code class="computeroutput">next_out</code>,
-<code class="computeroutput">avail_out</code> and
-<code class="computeroutput">total_out</code> to reflect the number
-of bytes output.</p>
-<p>You may provide and remove as little or as much data as you
-like on each call of
-<code class="computeroutput">BZ2_bzCompress</code>. In the limit,
-it is acceptable to supply and remove data one byte at a time,
-although this would be terribly inefficient. You should always
-ensure that at least one byte of output space is available at
-each call.</p>
-<p>A second purpose of
-<code class="computeroutput">BZ2_bzCompress</code> is to request a
-change of mode of the compressed stream.</p>
-<p>Conceptually, a compressed stream can be in one of four
-states: IDLE, RUNNING, FLUSHING and FINISHING. Before
-initialisation
-(<code class="computeroutput">BZ2_bzCompressInit</code>) and after
-termination (<code class="computeroutput">BZ2_bzCompressEnd</code>),
-a stream is regarded as IDLE.</p>
-<p>Upon initialisation
-(<code class="computeroutput">BZ2_bzCompressInit</code>), the stream
-is placed in the RUNNING state. Subsequent calls to
-<code class="computeroutput">BZ2_bzCompress</code> should pass
-<code class="computeroutput">BZ_RUN</code> as the requested action;
-other actions are illegal and will result in
-<code class="computeroutput">BZ_SEQUENCE_ERROR</code>.</p>
-<p>At some point, the calling program will have provided all
-the input data it wants to. It will then want to finish up -- in
-effect, asking the library to process any data it might have
-buffered internally. In this state,
-<code class="computeroutput">BZ2_bzCompress</code> will no longer
-attempt to read data from
-<code class="computeroutput">next_in</code>, but it will want to
-write data to <code class="computeroutput">next_out</code>. Because
-the output buffer supplied by the user can be arbitrarily small,
-the finishing-up operation cannot necessarily be done with a
-single call of
-<code class="computeroutput">BZ2_bzCompress</code>.</p>
-<p>Instead, the calling program passes
-<code class="computeroutput">BZ_FINISH</code> as an action to
-<code class="computeroutput">BZ2_bzCompress</code>. This changes
-the stream's state to FINISHING. Any remaining input (ie,
-<code class="computeroutput">next_in[0 .. avail_in-1]</code>) is
-compressed and transferred to the output buffer. To do this,
-<code class="computeroutput">BZ2_bzCompress</code> must be called
-repeatedly until all the output has been consumed. At that
-point, <code class="computeroutput">BZ2_bzCompress</code> returns
-<code class="computeroutput">BZ_STREAM_END</code>, and the stream's
-state is set back to IDLE.
-<code class="computeroutput">BZ2_bzCompressEnd</code> should then be
-called.</p>
-<p>Just to make sure the calling program does not cheat, the
-library makes a note of <code class="computeroutput">avail_in</code>
-at the time of the first call to
-<code class="computeroutput">BZ2_bzCompress</code> which has
-<code class="computeroutput">BZ_FINISH</code> as an action (ie, at
-the time the program has announced its intention to not supply
-any more input). By comparing this value with that of
-<code class="computeroutput">avail_in</code> over subsequent calls
-to <code class="computeroutput">BZ2_bzCompress</code>, the library
-can detect any attempts to slip in more data to compress. Any
-calls for which this is detected will return
-<code class="computeroutput">BZ_SEQUENCE_ERROR</code>. This
-indicates a programming mistake which should be corrected.</p>
-<p>Instead of asking to finish, the calling program may ask
-<code class="computeroutput">BZ2_bzCompress</code> to take all the
-remaining input, compress it and terminate the current
-(Burrows-Wheeler) compression block. This could be useful for
-error control purposes. The mechanism is analogous to that for
-finishing: call <code class="computeroutput">BZ2_bzCompress</code>
-with an action of <code class="computeroutput">BZ_FLUSH</code>,
-remove output data, and persist with the
-<code class="computeroutput">BZ_FLUSH</code> action until the value
-<code class="computeroutput">BZ_RUN</code> is returned. As with
-finishing, <code class="computeroutput">BZ2_bzCompress</code>
-detects any attempt to provide more input data once the flush has
-begun.</p>
-<p>Once the flush is complete, the stream returns to the
-normal RUNNING state.</p>
-<p>This all sounds pretty complex, but isn't really. Here's a
-table which shows which actions are allowable in each state, what
-action will be taken, what the next state is, and what the
-non-error return values are. Note that you can't explicitly ask
-what state the stream is in, but nor do you need to -- it can be
-inferred from the values returned by
-<code class="computeroutput">BZ2_bzCompress</code>.</p>
-<pre class="programlisting">IDLE/any
- Illegal. IDLE state only exists after BZ2_bzCompressEnd or
- before BZ2_bzCompressInit.
- Return value = BZ_SEQUENCE_ERROR
-
-RUNNING/BZ_RUN
- Compress from next_in to next_out as much as possible.
- Next state = RUNNING
- Return value = BZ_RUN_OK
-
-RUNNING/BZ_FLUSH
- Remember current value of next_in. Compress from next_in
- to next_out as much as possible, but do not accept any more input.
- Next state = FLUSHING
- Return value = BZ_FLUSH_OK
-
-RUNNING/BZ_FINISH
- Remember current value of next_in. Compress from next_in
- to next_out as much as possible, but do not accept any more input.
- Next state = FINISHING
- Return value = BZ_FINISH_OK
-
-FLUSHING/BZ_FLUSH
- Compress from next_in to next_out as much as possible,
- but do not accept any more input.
- If all the existing input has been used up and all compressed
- output has been removed
- Next state = RUNNING; Return value = BZ_RUN_OK
- else
- Next state = FLUSHING; Return value = BZ_FLUSH_OK
-
-FLUSHING/other
- Illegal.
- Return value = BZ_SEQUENCE_ERROR
-
-FINISHING/BZ_FINISH
- Compress from next_in to next_out as much as possible,
- but to not accept any more input.
- If all the existing input has been used up and all compressed
- output has been removed
- Next state = IDLE; Return value = BZ_STREAM_END
- else
- Next state = FINISHING; Return value = BZ_FINISH_OK
-
-FINISHING/other
- Illegal.
- Return value = BZ_SEQUENCE_ERROR</pre>
-<p>That still looks complicated? Well, fair enough. The
-usual sequence of calls for compressing a load of data is:</p>
-<div class="orderedlist"><ol type="1">
-<li><p>Get started with
- <code class="computeroutput">BZ2_bzCompressInit</code>.</p></li>
-<li><p>Shovel data in and shlurp out its compressed form
- using zero or more calls of
- <code class="computeroutput">BZ2_bzCompress</code> with action =
- <code class="computeroutput">BZ_RUN</code>.</p></li>
-<li><p>Finish up. Repeatedly call
- <code class="computeroutput">BZ2_bzCompress</code> with action =
- <code class="computeroutput">BZ_FINISH</code>, copying out the
- compressed output, until
- <code class="computeroutput">BZ_STREAM_END</code> is
- returned.</p></li>
-<li><p>Close up and go home. Call
- <code class="computeroutput">BZ2_bzCompressEnd</code>.</p></li>
-</ol></div>
-<p>If the data you want to compress fits into your input
-buffer all at once, you can skip the calls of
-<code class="computeroutput">BZ2_bzCompress ( ..., BZ_RUN )</code>
-and just do the <code class="computeroutput">BZ2_bzCompress ( ..., BZ_FINISH
-)</code> calls.</p>
-<p>All required memory is allocated by
-<code class="computeroutput">BZ2_bzCompressInit</code>. The
-compression library can accept any data at all (obviously). So
-you shouldn't get any error return values from the
-<code class="computeroutput">BZ2_bzCompress</code> calls. If you
-do, they will be
-<code class="computeroutput">BZ_SEQUENCE_ERROR</code>, and indicate
-a bug in your programming.</p>
-<p>Trivial other possible return values:</p>
-<pre class="programlisting">BZ_PARAM_ERROR
- if strm is NULL, or strm-&gt;s is NULL</pre>
-</div>
-<div class="sect2" lang="en">
-<div class="titlepage"><div><div><h3 class="title">
-<a name="bzCompress-end"></a>3.3.3. <code class="computeroutput">BZ2_bzCompressEnd</code></h3></div></div></div>
-<pre class="programlisting">int BZ2_bzCompressEnd ( bz_stream *strm );</pre>
-<p>Releases all memory associated with a compression
-stream.</p>
-<p>Possible return values:</p>
-<pre class="programlisting">BZ_PARAM_ERROR if strm is NULL or strm-&gt;s is NULL
-BZ_OK otherwise</pre>
-</div>
-<div class="sect2" lang="en">
-<div class="titlepage"><div><div><h3 class="title">
-<a name="bzDecompress-init"></a>3.3.4. <code class="computeroutput">BZ2_bzDecompressInit</code></h3></div></div></div>
-<pre class="programlisting">int BZ2_bzDecompressInit ( bz_stream *strm, int verbosity, int small );</pre>
-<p>Prepares for decompression. As with
-<code class="computeroutput">BZ2_bzCompressInit</code>, a
-<code class="computeroutput">bz_stream</code> record should be
-allocated and initialised before the call. Fields
-<code class="computeroutput">bzalloc</code>,
-<code class="computeroutput">bzfree</code> and
-<code class="computeroutput">opaque</code> should be set if a custom
-memory allocator is required, or made
-<code class="computeroutput">NULL</code> for the normal
-<code class="computeroutput">malloc</code> /
-<code class="computeroutput">free</code> routines. Upon return, the
-internal state will have been initialised, and
-<code class="computeroutput">total_in</code> and
-<code class="computeroutput">total_out</code> will be zero.</p>
-<p>For the meaning of parameter
-<code class="computeroutput">verbosity</code>, see
-<code class="computeroutput">BZ2_bzCompressInit</code>.</p>
-<p>If <code class="computeroutput">small</code> is nonzero, the
-library will use an alternative decompression algorithm which
-uses less memory but at the cost of decompressing more slowly
-(roughly speaking, half the speed, but the maximum memory
-requirement drops to around 2300k). See <a href="#using">How to use bzip2</a>
-for more information on memory management.</p>
-<p>Note that the amount of memory needed to decompress a
-stream cannot be determined until the stream's header has been
-read, so even if
-<code class="computeroutput">BZ2_bzDecompressInit</code> succeeds, a
-subsequent <code class="computeroutput">BZ2_bzDecompress</code>
-could fail with
-<code class="computeroutput">BZ_MEM_ERROR</code>.</p>
-<p>Possible return values:</p>
-<pre class="programlisting">BZ_CONFIG_ERROR
- if the library has been mis-compiled
-BZ_PARAM_ERROR
- if ( small != 0 &amp;&amp; small != 1 )
- or (verbosity &lt;; 0 || verbosity &gt; 4)
-BZ_MEM_ERROR
- if insufficient memory is available</pre>
-<p>Allowable next actions:</p>
-<pre class="programlisting">BZ2_bzDecompress
- if BZ_OK was returned
- no specific action required in case of error</pre>
-</div>
-<div class="sect2" lang="en">
-<div class="titlepage"><div><div><h3 class="title">
-<a name="bzDecompress"></a>3.3.5. <code class="computeroutput">BZ2_bzDecompress</code></h3></div></div></div>
-<pre class="programlisting">int BZ2_bzDecompress ( bz_stream *strm );</pre>
-<p>Provides more input and/out output buffer space for the
-library. The caller maintains input and output buffers, and uses
-<code class="computeroutput">BZ2_bzDecompress</code> to transfer
-data between them.</p>
-<p>Before each call to
-<code class="computeroutput">BZ2_bzDecompress</code>,
-<code class="computeroutput">next_in</code> should point at the
-compressed data, and <code class="computeroutput">avail_in</code>
-should indicate how many bytes the library may read.
-<code class="computeroutput">BZ2_bzDecompress</code> updates
-<code class="computeroutput">next_in</code>,
-<code class="computeroutput">avail_in</code> and
-<code class="computeroutput">total_in</code> to reflect the number
-of bytes it has read.</p>
-<p>Similarly, <code class="computeroutput">next_out</code> should
-point to a buffer in which the uncompressed output is to be
-placed, with <code class="computeroutput">avail_out</code>
-indicating how much output space is available.
-<code class="computeroutput">BZ2_bzCompress</code> updates
-<code class="computeroutput">next_out</code>,
-<code class="computeroutput">avail_out</code> and
-<code class="computeroutput">total_out</code> to reflect the number
-of bytes output.</p>
-<p>You may provide and remove as little or as much data as you
-like on each call of
-<code class="computeroutput">BZ2_bzDecompress</code>. In the limit,
-it is acceptable to supply and remove data one byte at a time,
-although this would be terribly inefficient. You should always
-ensure that at least one byte of output space is available at
-each call.</p>
-<p>Use of <code class="computeroutput">BZ2_bzDecompress</code> is
-simpler than
-<code class="computeroutput">BZ2_bzCompress</code>.</p>
-<p>You should provide input and remove output as described
-above, and repeatedly call
-<code class="computeroutput">BZ2_bzDecompress</code> until
-<code class="computeroutput">BZ_STREAM_END</code> is returned.
-Appearance of <code class="computeroutput">BZ_STREAM_END</code>
-denotes that <code class="computeroutput">BZ2_bzDecompress</code>
-has detected the logical end of the compressed stream.
-<code class="computeroutput">BZ2_bzDecompress</code> will not
-produce <code class="computeroutput">BZ_STREAM_END</code> until all
-output data has been placed into the output buffer, so once
-<code class="computeroutput">BZ_STREAM_END</code> appears, you are
-guaranteed to have available all the decompressed output, and
-<code class="computeroutput">BZ2_bzDecompressEnd</code> can safely
-be called.</p>
-<p>If case of an error return value, you should call
-<code class="computeroutput">BZ2_bzDecompressEnd</code> to clean up
-and release memory.</p>
-<p>Possible return values:</p>
-<pre class="programlisting">BZ_PARAM_ERROR
- if strm is NULL or strm-&gt;s is NULL
- or strm-&gt;avail_out &lt; 1
-BZ_DATA_ERROR
- if a data integrity error is detected in the compressed stream
-BZ_DATA_ERROR_MAGIC
- if the compressed stream doesn't begin with the right magic bytes
-BZ_MEM_ERROR
- if there wasn't enough memory available
-BZ_STREAM_END
- if the logical end of the data stream was detected and all
- output in has been consumed, eg s--&gt;avail_out &gt; 0
-BZ_OK
- otherwise</pre>
-<p>Allowable next actions:</p>
-<pre class="programlisting">BZ2_bzDecompress
- if BZ_OK was returned
-BZ2_bzDecompressEnd
- otherwise</pre>
-</div>
-<div class="sect2" lang="en">
-<div class="titlepage"><div><div><h3 class="title">
-<a name="bzDecompress-end"></a>3.3.6. <code class="computeroutput">BZ2_bzDecompressEnd</code></h3></div></div></div>
-<pre class="programlisting">int BZ2_bzDecompressEnd ( bz_stream *strm );</pre>
-<p>Releases all memory associated with a decompression
-stream.</p>
-<p>Possible return values:</p>
-<pre class="programlisting">BZ_PARAM_ERROR
- if strm is NULL or strm-&gt;s is NULL
-BZ_OK
- otherwise</pre>
-<p>Allowable next actions:</p>
-<pre class="programlisting"> None.</pre>
-</div>
-</div>
-<div class="sect1" lang="en">
-<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="hl-interface"></a>3.4. High-level interface</h2></div></div></div>
-<p>This interface provides functions for reading and writing
-<code class="computeroutput">bzip2</code> format files. First, some
-general points.</p>
-<div class="itemizedlist"><ul type="bullet">
-<li style="list-style-type: disc"><p>All of the functions take an
- <code class="computeroutput">int*</code> first argument,
- <code class="computeroutput">bzerror</code>. After each call,
- <code class="computeroutput">bzerror</code> should be consulted
- first to determine the outcome of the call. If
- <code class="computeroutput">bzerror</code> is
- <code class="computeroutput">BZ_OK</code>, the call completed
- successfully, and only then should the return value of the
- function (if any) be consulted. If
- <code class="computeroutput">bzerror</code> is
- <code class="computeroutput">BZ_IO_ERROR</code>, there was an
- error reading/writing the underlying compressed file, and you
- should then consult <code class="computeroutput">errno</code> /
- <code class="computeroutput">perror</code> to determine the cause
- of the difficulty. <code class="computeroutput">bzerror</code>
- may also be set to various other values; precise details are
- given on a per-function basis below.</p></li>
-<li style="list-style-type: disc"><p>If <code class="computeroutput">bzerror</code> indicates
- an error (ie, anything except
- <code class="computeroutput">BZ_OK</code> and
- <code class="computeroutput">BZ_STREAM_END</code>), you should
- immediately call
- <code class="computeroutput">BZ2_bzReadClose</code> (or
- <code class="computeroutput">BZ2_bzWriteClose</code>, depending on
- whether you are attempting to read or to write) to free up all
- resources associated with the stream. Once an error has been
- indicated, behaviour of all calls except
- <code class="computeroutput">BZ2_bzReadClose</code>
- (<code class="computeroutput">BZ2_bzWriteClose</code>) is
- undefined. The implication is that (1)
- <code class="computeroutput">bzerror</code> should be checked
- after each call, and (2) if
- <code class="computeroutput">bzerror</code> indicates an error,
- <code class="computeroutput">BZ2_bzReadClose</code>
- (<code class="computeroutput">BZ2_bzWriteClose</code>) should then
- be called to clean up.</p></li>
-<li style="list-style-type: disc"><p>The <code class="computeroutput">FILE*</code> arguments
- passed to <code class="computeroutput">BZ2_bzReadOpen</code> /
- <code class="computeroutput">BZ2_bzWriteOpen</code> should be set
- to binary mode. Most Unix systems will do this by default, but
- other platforms, including Windows and Mac, will not. If you
- omit this, you may encounter problems when moving code to new
- platforms.</p></li>
-<li style="list-style-type: disc"><p>Memory allocation requests are handled by
- <code class="computeroutput">malloc</code> /
- <code class="computeroutput">free</code>. At present there is no
- facility for user-defined memory allocators in the file I/O
- functions (could easily be added, though).</p></li>
-</ul></div>
-<div class="sect2" lang="en">
-<div class="titlepage"><div><div><h3 class="title">
-<a name="bzreadopen"></a>3.4.1. <code class="computeroutput">BZ2_bzReadOpen</code></h3></div></div></div>
-<pre class="programlisting">typedef void BZFILE;
-
-BZFILE *BZ2_bzReadOpen( int *bzerror, FILE *f,
- int verbosity, int small,
- void *unused, int nUnused );</pre>
-<p>Prepare to read compressed data from file handle
-<code class="computeroutput">f</code>.
-<code class="computeroutput">f</code> should refer to a file which
-has been opened for reading, and for which the error indicator
-(<code class="computeroutput">ferror(f)</code>)is not set. If
-<code class="computeroutput">small</code> is 1, the library will try
-to decompress using less memory, at the expense of speed.</p>
-<p>For reasons explained below,
-<code class="computeroutput">BZ2_bzRead</code> will decompress the
-<code class="computeroutput">nUnused</code> bytes starting at
-<code class="computeroutput">unused</code>, before starting to read
-from the file <code class="computeroutput">f</code>. At most
-<code class="computeroutput">BZ_MAX_UNUSED</code> bytes may be
-supplied like this. If this facility is not required, you should
-pass <code class="computeroutput">NULL</code> and
-<code class="computeroutput">0</code> for
-<code class="computeroutput">unused</code> and
-n<code class="computeroutput">Unused</code> respectively.</p>
-<p>For the meaning of parameters
-<code class="computeroutput">small</code> and
-<code class="computeroutput">verbosity</code>, see
-<code class="computeroutput">BZ2_bzDecompressInit</code>.</p>
-<p>The amount of memory needed to decompress a file cannot be
-determined until the file's header has been read. So it is
-possible that <code class="computeroutput">BZ2_bzReadOpen</code>
-returns <code class="computeroutput">BZ_OK</code> but a subsequent
-call of <code class="computeroutput">BZ2_bzRead</code> will return
-<code class="computeroutput">BZ_MEM_ERROR</code>.</p>
-<p>Possible assignments to
-<code class="computeroutput">bzerror</code>:</p>
-<pre class="programlisting">BZ_CONFIG_ERROR
- if the library has been mis-compiled
-BZ_PARAM_ERROR
- if f is NULL
- or small is neither 0 nor 1
- or ( unused == NULL &amp;&amp; nUnused != 0 )
- or ( unused != NULL &amp;&amp; !(0 &lt;= nUnused &lt;= BZ_MAX_UNUSED) )
-BZ_IO_ERROR
- if ferror(f) is nonzero
-BZ_MEM_ERROR
- if insufficient memory is available
-BZ_OK
- otherwise.</pre>
-<p>Possible return values:</p>
-<pre class="programlisting">Pointer to an abstract BZFILE
- if bzerror is BZ_OK
-NULL
- otherwise</pre>
-<p>Allowable next actions:</p>
-<pre class="programlisting">BZ2_bzRead
- if bzerror is BZ_OK
-BZ2_bzClose
- otherwise</pre>
-</div>
-<div class="sect2" lang="en">
-<div class="titlepage"><div><div><h3 class="title">
-<a name="bzread"></a>3.4.2. <code class="computeroutput">BZ2_bzRead</code></h3></div></div></div>
-<pre class="programlisting">int BZ2_bzRead ( int *bzerror, BZFILE *b, void *buf, int len );</pre>
-<p>Reads up to <code class="computeroutput">len</code>
-(uncompressed) bytes from the compressed file
-<code class="computeroutput">b</code> into the buffer
-<code class="computeroutput">buf</code>. If the read was
-successful, <code class="computeroutput">bzerror</code> is set to
-<code class="computeroutput">BZ_OK</code> and the number of bytes
-read is returned. If the logical end-of-stream was detected,
-<code class="computeroutput">bzerror</code> will be set to
-<code class="computeroutput">BZ_STREAM_END</code>, and the number of
-bytes read is returned. All other
-<code class="computeroutput">bzerror</code> values denote an
-error.</p>
-<p><code class="computeroutput">BZ2_bzRead</code> will supply
-<code class="computeroutput">len</code> bytes, unless the logical
-stream end is detected or an error occurs. Because of this, it
-is possible to detect the stream end by observing when the number
-of bytes returned is less than the number requested.
-Nevertheless, this is regarded as inadvisable; you should instead
-check <code class="computeroutput">bzerror</code> after every call
-and watch out for
-<code class="computeroutput">BZ_STREAM_END</code>.</p>
-<p>Internally, <code class="computeroutput">BZ2_bzRead</code>
-copies data from the compressed file in chunks of size
-<code class="computeroutput">BZ_MAX_UNUSED</code> bytes before
-decompressing it. If the file contains more bytes than strictly
-needed to reach the logical end-of-stream,
-<code class="computeroutput">BZ2_bzRead</code> will almost certainly
-read some of the trailing data before signalling
-<code class="computeroutput">BZ_SEQUENCE_END</code>. To collect the
-read but unused data once
-<code class="computeroutput">BZ_SEQUENCE_END</code> has appeared,
-call <code class="computeroutput">BZ2_bzReadGetUnused</code>
-immediately before
-<code class="computeroutput">BZ2_bzReadClose</code>.</p>
-<p>Possible assignments to
-<code class="computeroutput">bzerror</code>:</p>
-<pre class="programlisting">BZ_PARAM_ERROR
- if b is NULL or buf is NULL or len &lt; 0
-BZ_SEQUENCE_ERROR
- if b was opened with BZ2_bzWriteOpen
-BZ_IO_ERROR
- if there is an error reading from the compressed file
-BZ_UNEXPECTED_EOF
- if the compressed file ended before
- the logical end-of-stream was detected
-BZ_DATA_ERROR
- if a data integrity error was detected in the compressed stream
-BZ_DATA_ERROR_MAGIC
- if the stream does not begin with the requisite header bytes
- (ie, is not a bzip2 data file). This is really
- a special case of BZ_DATA_ERROR.
-BZ_MEM_ERROR
- if insufficient memory was available
-BZ_STREAM_END
- if the logical end of stream was detected.
-BZ_OK
- otherwise.</pre>
-<p>Possible return values:</p>
-<pre class="programlisting">number of bytes read
- if bzerror is BZ_OK or BZ_STREAM_END
-undefined
- otherwise</pre>
-<p>Allowable next actions:</p>
-<pre class="programlisting">collect data from buf, then BZ2_bzRead or BZ2_bzReadClose
- if bzerror is BZ_OK
-collect data from buf, then BZ2_bzReadClose or BZ2_bzReadGetUnused
- if bzerror is BZ_SEQUENCE_END
-BZ2_bzReadClose
- otherwise</pre>
-</div>
-<div class="sect2" lang="en">
-<div class="titlepage"><div><div><h3 class="title">
-<a name="bzreadgetunused"></a>3.4.3. <code class="computeroutput">BZ2_bzReadGetUnused</code></h3></div></div></div>
-<pre class="programlisting">void BZ2_bzReadGetUnused( int* bzerror, BZFILE *b,
- void** unused, int* nUnused );</pre>
-<p>Returns data which was read from the compressed file but
-was not needed to get to the logical end-of-stream.
-<code class="computeroutput">*unused</code> is set to the address of
-the data, and <code class="computeroutput">*nUnused</code> to the
-number of bytes. <code class="computeroutput">*nUnused</code> will
-be set to a value between <code class="computeroutput">0</code> and
-<code class="computeroutput">BZ_MAX_UNUSED</code> inclusive.</p>
-<p>This function may only be called once
-<code class="computeroutput">BZ2_bzRead</code> has signalled
-<code class="computeroutput">BZ_STREAM_END</code> but before
-<code class="computeroutput">BZ2_bzReadClose</code>.</p>
-<p>Possible assignments to
-<code class="computeroutput">bzerror</code>:</p>
-<pre class="programlisting">BZ_PARAM_ERROR
- if b is NULL
- or unused is NULL or nUnused is NULL
-BZ_SEQUENCE_ERROR
- if BZ_STREAM_END has not been signalled
- or if b was opened with BZ2_bzWriteOpen
-BZ_OK
- otherwise</pre>
-<p>Allowable next actions:</p>
-<pre class="programlisting">BZ2_bzReadClose</pre>
-</div>
-<div class="sect2" lang="en">
-<div class="titlepage"><div><div><h3 class="title">
-<a name="bzreadclose"></a>3.4.4. <code class="computeroutput">BZ2_bzReadClose</code></h3></div></div></div>
-<pre class="programlisting">void BZ2_bzReadClose ( int *bzerror, BZFILE *b );</pre>
-<p>Releases all memory pertaining to the compressed file
-<code class="computeroutput">b</code>.
-<code class="computeroutput">BZ2_bzReadClose</code> does not call
-<code class="computeroutput">fclose</code> on the underlying file
-handle, so you should do that yourself if appropriate.
-<code class="computeroutput">BZ2_bzReadClose</code> should be called
-to clean up after all error situations.</p>
-<p>Possible assignments to
-<code class="computeroutput">bzerror</code>:</p>
-<pre class="programlisting">BZ_SEQUENCE_ERROR
- if b was opened with BZ2_bzOpenWrite
-BZ_OK
- otherwise</pre>
-<p>Allowable next actions:</p>
-<pre class="programlisting">none</pre>
-</div>
-<div class="sect2" lang="en">
-<div class="titlepage"><div><div><h3 class="title">
-<a name="bzwriteopen"></a>3.4.5. <code class="computeroutput">BZ2_bzWriteOpen</code></h3></div></div></div>
-<pre class="programlisting">BZFILE *BZ2_bzWriteOpen( int *bzerror, FILE *f,
- int blockSize100k, int verbosity,
- int workFactor );</pre>
-<p>Prepare to write compressed data to file handle
-<code class="computeroutput">f</code>.
-<code class="computeroutput">f</code> should refer to a file which
-has been opened for writing, and for which the error indicator
-(<code class="computeroutput">ferror(f)</code>)is not set.</p>
-<p>For the meaning of parameters
-<code class="computeroutput">blockSize100k</code>,
-<code class="computeroutput">verbosity</code> and
-<code class="computeroutput">workFactor</code>, see
-<code class="computeroutput">BZ2_bzCompressInit</code>.</p>
-<p>All required memory is allocated at this stage, so if the
-call completes successfully,
-<code class="computeroutput">BZ_MEM_ERROR</code> cannot be signalled
-by a subsequent call to
-<code class="computeroutput">BZ2_bzWrite</code>.</p>
-<p>Possible assignments to
-<code class="computeroutput">bzerror</code>:</p>
-<pre class="programlisting">BZ_CONFIG_ERROR
- if the library has been mis-compiled
-BZ_PARAM_ERROR
- if f is NULL
- or blockSize100k &lt; 1 or blockSize100k &gt; 9
-BZ_IO_ERROR
- if ferror(f) is nonzero
-BZ_MEM_ERROR
- if insufficient memory is available
-BZ_OK
- otherwise</pre>
-<p>Possible return values:</p>
-<pre class="programlisting">Pointer to an abstract BZFILE
- if bzerror is BZ_OK
-NULL
- otherwise</pre>
-<p>Allowable next actions:</p>
-<pre class="programlisting">BZ2_bzWrite
- if bzerror is BZ_OK
- (you could go directly to BZ2_bzWriteClose, but this would be pretty pointless)
-BZ2_bzWriteClose
- otherwise</pre>
-</div>
-<div class="sect2" lang="en">
-<div class="titlepage"><div><div><h3 class="title">
-<a name="bzwrite"></a>3.4.6. <code class="computeroutput">BZ2_bzWrite</code></h3></div></div></div>
-<pre class="programlisting">void BZ2_bzWrite ( int *bzerror, BZFILE *b, void *buf, int len );</pre>
-<p>Absorbs <code class="computeroutput">len</code> bytes from the
-buffer <code class="computeroutput">buf</code>, eventually to be
-compressed and written to the file.</p>
-<p>Possible assignments to
-<code class="computeroutput">bzerror</code>:</p>
-<pre class="programlisting">BZ_PARAM_ERROR
- if b is NULL or buf is NULL or len &lt; 0
-BZ_SEQUENCE_ERROR
- if b was opened with BZ2_bzReadOpen
-BZ_IO_ERROR
- if there is an error writing the compressed file.
-BZ_OK
- otherwise</pre>
-</div>
-<div class="sect2" lang="en">
-<div class="titlepage"><div><div><h3 class="title">
-<a name="bzwriteclose"></a>3.4.7. <code class="computeroutput">BZ2_bzWriteClose</code></h3></div></div></div>
-<pre class="programlisting">void BZ2_bzWriteClose( int *bzerror, BZFILE* f,
- int abandon,
- unsigned int* nbytes_in,
- unsigned int* nbytes_out );
-
-void BZ2_bzWriteClose64( int *bzerror, BZFILE* f,
- int abandon,
- unsigned int* nbytes_in_lo32,
- unsigned int* nbytes_in_hi32,
- unsigned int* nbytes_out_lo32,
- unsigned int* nbytes_out_hi32 );</pre>
-<p>Compresses and flushes to the compressed file all data so
-far supplied by <code class="computeroutput">BZ2_bzWrite</code>.
-The logical end-of-stream markers are also written, so subsequent
-calls to <code class="computeroutput">BZ2_bzWrite</code> are
-illegal. All memory associated with the compressed file
-<code class="computeroutput">b</code> is released.
-<code class="computeroutput">fflush</code> is called on the
-compressed file, but it is not
-<code class="computeroutput">fclose</code>'d.</p>
-<p>If <code class="computeroutput">BZ2_bzWriteClose</code> is
-called to clean up after an error, the only action is to release
-the memory. The library records the error codes issued by
-previous calls, so this situation will be detected automatically.
-There is no attempt to complete the compression operation, nor to
-<code class="computeroutput">fflush</code> the compressed file. You
-can force this behaviour to happen even in the case of no error,
-by passing a nonzero value to
-<code class="computeroutput">abandon</code>.</p>
-<p>If <code class="computeroutput">nbytes_in</code> is non-null,
-<code class="computeroutput">*nbytes_in</code> will be set to be the
-total volume of uncompressed data handled. Similarly,
-<code class="computeroutput">nbytes_out</code> will be set to the
-total volume of compressed data written. For compatibility with
-older versions of the library,
-<code class="computeroutput">BZ2_bzWriteClose</code> only yields the
-lower 32 bits of these counts. Use
-<code class="computeroutput">BZ2_bzWriteClose64</code> if you want
-the full 64 bit counts. These two functions are otherwise
-absolutely identical.</p>
-<p>Possible assignments to
-<code class="computeroutput">bzerror</code>:</p>
-<pre class="programlisting">BZ_SEQUENCE_ERROR
- if b was opened with BZ2_bzReadOpen
-BZ_IO_ERROR
- if there is an error writing the compressed file
-BZ_OK
- otherwise</pre>
-</div>
-<div class="sect2" lang="en">
-<div class="titlepage"><div><div><h3 class="title">
-<a name="embed"></a>3.4.8. Handling embedded compressed data streams</h3></div></div></div>
-<p>The high-level library facilitates use of
-<code class="computeroutput">bzip2</code> data streams which form
-some part of a surrounding, larger data stream.</p>
-<div class="itemizedlist"><ul type="bullet">
-<li style="list-style-type: disc"><p>For writing, the library takes an open file handle,
- writes compressed data to it,
- <code class="computeroutput">fflush</code>es it but does not
- <code class="computeroutput">fclose</code> it. The calling
- application can write its own data before and after the
- compressed data stream, using that same file handle.</p></li>
-<li style="list-style-type: disc"><p>Reading is more complex, and the facilities are not as
- general as they could be since generality is hard to reconcile
- with efficiency. <code class="computeroutput">BZ2_bzRead</code>
- reads from the compressed file in blocks of size
- <code class="computeroutput">BZ_MAX_UNUSED</code> bytes, and in
- doing so probably will overshoot the logical end of compressed
- stream. To recover this data once decompression has ended,
- call <code class="computeroutput">BZ2_bzReadGetUnused</code> after
- the last call of <code class="computeroutput">BZ2_bzRead</code>
- (the one returning
- <code class="computeroutput">BZ_STREAM_END</code>) but before
- calling
- <code class="computeroutput">BZ2_bzReadClose</code>.</p></li>
-</ul></div>
-<p>This mechanism makes it easy to decompress multiple
-<code class="computeroutput">bzip2</code> streams placed end-to-end.
-As the end of one stream, when
-<code class="computeroutput">BZ2_bzRead</code> returns
-<code class="computeroutput">BZ_STREAM_END</code>, call
-<code class="computeroutput">BZ2_bzReadGetUnused</code> to collect
-the unused data (copy it into your own buffer somewhere). That
-data forms the start of the next compressed stream. To start
-uncompressing that next stream, call
-<code class="computeroutput">BZ2_bzReadOpen</code> again, feeding in
-the unused data via the <code class="computeroutput">unused</code> /
-<code class="computeroutput">nUnused</code> parameters. Keep doing
-this until <code class="computeroutput">BZ_STREAM_END</code> return
-coincides with the physical end of file
-(<code class="computeroutput">feof(f)</code>). In this situation
-<code class="computeroutput">BZ2_bzReadGetUnused</code> will of
-course return no data.</p>
-<p>This should give some feel for how the high-level interface
-can be used. If you require extra flexibility, you'll have to
-bite the bullet and get to grips with the low-level
-interface.</p>
-</div>
-<div class="sect2" lang="en">
-<div class="titlepage"><div><div><h3 class="title">
-<a name="std-rdwr"></a>3.4.9. Standard file-reading/writing code</h3></div></div></div>
-<p>Here's how you'd write data to a compressed file:</p>
-<pre class="programlisting">FILE* f;
-BZFILE* b;
-int nBuf;
-char buf[ /* whatever size you like */ ];
-int bzerror;
-int nWritten;
-
-f = fopen ( "myfile.bz2", "w" );
-if ( !f ) {
- /* handle error */
-}
-b = BZ2_bzWriteOpen( &amp;bzerror, f, 9 );
-if (bzerror != BZ_OK) {
- BZ2_bzWriteClose ( b );
- /* handle error */
-}
-
-while ( /* condition */ ) {
- /* get data to write into buf, and set nBuf appropriately */
- nWritten = BZ2_bzWrite ( &amp;bzerror, b, buf, nBuf );
- if (bzerror == BZ_IO_ERROR) {
- BZ2_bzWriteClose ( &amp;bzerror, b );
- /* handle error */
- }
-}
-
-BZ2_bzWriteClose( &amp;bzerror, b );
-if (bzerror == BZ_IO_ERROR) {
- /* handle error */
-}</pre>
-<p>And to read from a compressed file:</p>
-<pre class="programlisting">FILE* f;
-BZFILE* b;
-int nBuf;
-char buf[ /* whatever size you like */ ];
-int bzerror;
-int nWritten;
-
-f = fopen ( "myfile.bz2", "r" );
-if ( !f ) {
- /* handle error */
-}
-b = BZ2_bzReadOpen ( &amp;bzerror, f, 0, NULL, 0 );
-if ( bzerror != BZ_OK ) {
- BZ2_bzReadClose ( &amp;bzerror, b );
- /* handle error */
-}
-
-bzerror = BZ_OK;
-while ( bzerror == BZ_OK &amp;&amp; /* arbitrary other conditions */) {
- nBuf = BZ2_bzRead ( &amp;bzerror, b, buf, /* size of buf */ );
- if ( bzerror == BZ_OK ) {
- /* do something with buf[0 .. nBuf-1] */
- }
-}
-if ( bzerror != BZ_STREAM_END ) {
- BZ2_bzReadClose ( &amp;bzerror, b );
- /* handle error */
-} else {
- BZ2_bzReadClose ( &amp;bzerror, b );
-}</pre>
-</div>
-</div>
-<div class="sect1" lang="en">
-<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="util-fns"></a>3.5. Utility functions</h2></div></div></div>
-<div class="sect2" lang="en">
-<div class="titlepage"><div><div><h3 class="title">
-<a name="bzbufftobuffcompress"></a>3.5.1. <code class="computeroutput">BZ2_bzBuffToBuffCompress</code></h3></div></div></div>
-<pre class="programlisting">int BZ2_bzBuffToBuffCompress( char* dest,
- unsigned int* destLen,
- char* source,
- unsigned int sourceLen,
- int blockSize100k,
- int verbosity,
- int workFactor );</pre>
-<p>Attempts to compress the data in <code class="computeroutput">source[0
-.. sourceLen-1]</code> into the destination buffer,
-<code class="computeroutput">dest[0 .. *destLen-1]</code>. If the
-destination buffer is big enough,
-<code class="computeroutput">*destLen</code> is set to the size of
-the compressed data, and <code class="computeroutput">BZ_OK</code>
-is returned. If the compressed data won't fit,
-<code class="computeroutput">*destLen</code> is unchanged, and
-<code class="computeroutput">BZ_OUTBUFF_FULL</code> is
-returned.</p>
-<p>Compression in this manner is a one-shot event, done with a
-single call to this function. The resulting compressed data is a
-complete <code class="computeroutput">bzip2</code> format data
-stream. There is no mechanism for making additional calls to
-provide extra input data. If you want that kind of mechanism,
-use the low-level interface.</p>
-<p>For the meaning of parameters
-<code class="computeroutput">blockSize100k</code>,
-<code class="computeroutput">verbosity</code> and
-<code class="computeroutput">workFactor</code>, see
-<code class="computeroutput">BZ2_bzCompressInit</code>.</p>
-<p>To guarantee that the compressed data will fit in its
-buffer, allocate an output buffer of size 1% larger than the
-uncompressed data, plus six hundred extra bytes.</p>
-<p><code class="computeroutput">BZ2_bzBuffToBuffDecompress</code>
-will not write data at or beyond
-<code class="computeroutput">dest[*destLen]</code>, even in case of
-buffer overflow.</p>
-<p>Possible return values:</p>
-<pre class="programlisting">BZ_CONFIG_ERROR
- if the library has been mis-compiled
-BZ_PARAM_ERROR
- if dest is NULL or destLen is NULL
- or blockSize100k &lt; 1 or blockSize100k &gt; 9
- or verbosity &lt; 0 or verbosity &gt; 4
- or workFactor &lt; 0 or workFactor &gt; 250
-BZ_MEM_ERROR
- if insufficient memory is available
-BZ_OUTBUFF_FULL
- if the size of the compressed data exceeds *destLen
-BZ_OK
- otherwise</pre>
-</div>
-<div class="sect2" lang="en">
-<div class="titlepage"><div><div><h3 class="title">
-<a name="bzbufftobuffdecompress"></a>3.5.2. <code class="computeroutput">BZ2_bzBuffToBuffDecompress</code></h3></div></div></div>
-<pre class="programlisting">int BZ2_bzBuffToBuffDecompress( char* dest,
- unsigned int* destLen,
- char* source,
- unsigned int sourceLen,
- int small,
- int verbosity );</pre>
-<p>Attempts to decompress the data in <code class="computeroutput">source[0
-.. sourceLen-1]</code> into the destination buffer,
-<code class="computeroutput">dest[0 .. *destLen-1]</code>. If the
-destination buffer is big enough,
-<code class="computeroutput">*destLen</code> is set to the size of
-the uncompressed data, and <code class="computeroutput">BZ_OK</code>
-is returned. If the compressed data won't fit,
-<code class="computeroutput">*destLen</code> is unchanged, and
-<code class="computeroutput">BZ_OUTBUFF_FULL</code> is
-returned.</p>
-<p><code class="computeroutput">source</code> is assumed to hold
-a complete <code class="computeroutput">bzip2</code> format data
-stream.
-<code class="computeroutput">BZ2_bzBuffToBuffDecompress</code> tries
-to decompress the entirety of the stream into the output
-buffer.</p>
-<p>For the meaning of parameters
-<code class="computeroutput">small</code> and
-<code class="computeroutput">verbosity</code>, see
-<code class="computeroutput">BZ2_bzDecompressInit</code>.</p>
-<p>Because the compression ratio of the compressed data cannot
-be known in advance, there is no easy way to guarantee that the
-output buffer will be big enough. You may of course make
-arrangements in your code to record the size of the uncompressed
-data, but such a mechanism is beyond the scope of this
-library.</p>
-<p><code class="computeroutput">BZ2_bzBuffToBuffDecompress</code>
-will not write data at or beyond
-<code class="computeroutput">dest[*destLen]</code>, even in case of
-buffer overflow.</p>
-<p>Possible return values:</p>
-<pre class="programlisting">BZ_CONFIG_ERROR
- if the library has been mis-compiled
-BZ_PARAM_ERROR
- if dest is NULL or destLen is NULL
- or small != 0 &amp;&amp; small != 1
- or verbosity &lt; 0 or verbosity &gt; 4
-BZ_MEM_ERROR
- if insufficient memory is available
-BZ_OUTBUFF_FULL
- if the size of the compressed data exceeds *destLen
-BZ_DATA_ERROR
- if a data integrity error was detected in the compressed data
-BZ_DATA_ERROR_MAGIC
- if the compressed data doesn't begin with the right magic bytes
-BZ_UNEXPECTED_EOF
- if the compressed data ends unexpectedly
-BZ_OK
- otherwise</pre>
-</div>
-</div>
-<div class="sect1" lang="en">
-<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="zlib-compat"></a>3.6. <code class="computeroutput">zlib</code> compatibility functions</h2></div></div></div>
-<p>Yoshioka Tsuneo has contributed some functions to give
-better <code class="computeroutput">zlib</code> compatibility.
-These functions are <code class="computeroutput">BZ2_bzopen</code>,
-<code class="computeroutput">BZ2_bzread</code>,
-<code class="computeroutput">BZ2_bzwrite</code>,
-<code class="computeroutput">BZ2_bzflush</code>,
-<code class="computeroutput">BZ2_bzclose</code>,
-<code class="computeroutput">BZ2_bzerror</code> and
-<code class="computeroutput">BZ2_bzlibVersion</code>. These
-functions are not (yet) officially part of the library. If they
-break, you get to keep all the pieces. Nevertheless, I think
-they work ok.</p>
-<pre class="programlisting">typedef void BZFILE;
-
-const char * BZ2_bzlibVersion ( void );</pre>
-<p>Returns a string indicating the library version.</p>
-<pre class="programlisting">BZFILE * BZ2_bzopen ( const char *path, const char *mode );
-BZFILE * BZ2_bzdopen ( int fd, const char *mode );</pre>
-<p>Opens a <code class="computeroutput">.bz2</code> file for
-reading or writing, using either its name or a pre-existing file
-descriptor. Analogous to <code class="computeroutput">fopen</code>
-and <code class="computeroutput">fdopen</code>.</p>
-<pre class="programlisting">int BZ2_bzread ( BZFILE* b, void* buf, int len );
-int BZ2_bzwrite ( BZFILE* b, void* buf, int len );</pre>
-<p>Reads/writes data from/to a previously opened
-<code class="computeroutput">BZFILE</code>. Analogous to
-<code class="computeroutput">fread</code> and
-<code class="computeroutput">fwrite</code>.</p>
-<pre class="programlisting">int BZ2_bzflush ( BZFILE* b );
-void BZ2_bzclose ( BZFILE* b );</pre>
-<p>Flushes/closes a <code class="computeroutput">BZFILE</code>.
-<code class="computeroutput">BZ2_bzflush</code> doesn't actually do
-anything. Analogous to <code class="computeroutput">fflush</code>
-and <code class="computeroutput">fclose</code>.</p>
-<pre class="programlisting">const char * BZ2_bzerror ( BZFILE *b, int *errnum )</pre>
-<p>Returns a string describing the more recent error status of
-<code class="computeroutput">b</code>, and also sets
-<code class="computeroutput">*errnum</code> to its numerical
-value.</p>
-</div>
-<div class="sect1" lang="en">
-<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="stdio-free"></a>3.7. Using the library in a <code class="computeroutput">stdio</code>-free environment</h2></div></div></div>
-<div class="sect2" lang="en">
-<div class="titlepage"><div><div><h3 class="title">
-<a name="stdio-bye"></a>3.7.1. Getting rid of <code class="computeroutput">stdio</code></h3></div></div></div>
-<p>In a deeply embedded application, you might want to use
-just the memory-to-memory functions. You can do this
-conveniently by compiling the library with preprocessor symbol
-<code class="computeroutput">BZ_NO_STDIO</code> defined. Doing this
-gives you a library containing only the following eight
-functions:</p>
-<p><code class="computeroutput">BZ2_bzCompressInit</code>,
-<code class="computeroutput">BZ2_bzCompress</code>,
-<code class="computeroutput">BZ2_bzCompressEnd</code>
-<code class="computeroutput">BZ2_bzDecompressInit</code>,
-<code class="computeroutput">BZ2_bzDecompress</code>,
-<code class="computeroutput">BZ2_bzDecompressEnd</code>
-<code class="computeroutput">BZ2_bzBuffToBuffCompress</code>,
-<code class="computeroutput">BZ2_bzBuffToBuffDecompress</code></p>
-<p>When compiled like this, all functions will ignore
-<code class="computeroutput">verbosity</code> settings.</p>
-</div>
-<div class="sect2" lang="en">
-<div class="titlepage"><div><div><h3 class="title">
-<a name="critical-error"></a>3.7.2. Critical error handling</h3></div></div></div>
-<p><code class="computeroutput">libbzip2</code> contains a number
-of internal assertion checks which should, needless to say, never
-be activated. Nevertheless, if an assertion should fail,
-behaviour depends on whether or not the library was compiled with
-<code class="computeroutput">BZ_NO_STDIO</code> set.</p>
-<p>For a normal compile, an assertion failure yields the
-message:</p>
-<div class="blockquote"><blockquote class="blockquote">
-<p>bzip2/libbzip2: internal error number N.</p>
-<p>This is a bug in bzip2/libbzip2, 1.0.5 of 10 December 2007.
-Please report it to me at: jseward@bzip.org. If this happened
-when you were using some program which uses libbzip2 as a
-component, you should also report this bug to the author(s)
-of that program. Please make an effort to report this bug;
-timely and accurate bug reports eventually lead to higher
-quality software. Thanks. Julian Seward, 10 December 2007.
-</p>
-</blockquote></div>
-<p>where <code class="computeroutput">N</code> is some error code
-number. If <code class="computeroutput">N == 1007</code>, it also
-prints some extra text advising the reader that unreliable memory
-is often associated with internal error 1007. (This is a
-frequently-observed-phenomenon with versions 1.0.0/1.0.1).</p>
-<p><code class="computeroutput">exit(3)</code> is then
-called.</p>
-<p>For a <code class="computeroutput">stdio</code>-free library,
-assertion failures result in a call to a function declared
-as:</p>
-<pre class="programlisting">extern void bz_internal_error ( int errcode );</pre>
-<p>The relevant code is passed as a parameter. You should
-supply such a function.</p>
-<p>In either case, once an assertion failure has occurred, any
-<code class="computeroutput">bz_stream</code> records involved can
-be regarded as invalid. You should not attempt to resume normal
-operation with them.</p>
-<p>You may, of course, change critical error handling to suit
-your needs. As I said above, critical errors indicate bugs in
-the library and should not occur. All "normal" error situations
-are indicated via error return codes from functions, and can be
-recovered from.</p>
-</div>
-</div>
-<div class="sect1" lang="en">
-<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="win-dll"></a>3.8. Making a Windows DLL</h2></div></div></div>
-<p>Everything related to Windows has been contributed by
-Yoshioka Tsuneo
-(<code class="computeroutput">tsuneo@rr.iij4u.or.jp</code>), so
-you should send your queries to him (but perhaps Cc: me,
-<code class="computeroutput">jseward@bzip.org</code>).</p>
-<p>My vague understanding of what to do is: using Visual C++
-5.0, open the project file
-<code class="computeroutput">libbz2.dsp</code>, and build. That's
-all.</p>
-<p>If you can't open the project file for some reason, make a
-new one, naming these files:
-<code class="computeroutput">blocksort.c</code>,
-<code class="computeroutput">bzlib.c</code>,
-<code class="computeroutput">compress.c</code>,
-<code class="computeroutput">crctable.c</code>,
-<code class="computeroutput">decompress.c</code>,
-<code class="computeroutput">huffman.c</code>,
-<code class="computeroutput">randtable.c</code> and
-<code class="computeroutput">libbz2.def</code>. You will also need
-to name the header files <code class="computeroutput">bzlib.h</code>
-and <code class="computeroutput">bzlib_private.h</code>.</p>
-<p>If you don't use VC++, you may need to define the
-proprocessor symbol
-<code class="computeroutput">_WIN32</code>.</p>
-<p>Finally, <code class="computeroutput">dlltest.c</code> is a
-sample program using the DLL. It has a project file,
-<code class="computeroutput">dlltest.dsp</code>.</p>
-<p>If you just want a makefile for Visual C, have a look at
-<code class="computeroutput">makefile.msc</code>.</p>
-<p>Be aware that if you compile
-<code class="computeroutput">bzip2</code> itself on Win32, you must
-set <code class="computeroutput">BZ_UNIX</code> to 0 and
-<code class="computeroutput">BZ_LCCWIN32</code> to 1, in the file
-<code class="computeroutput">bzip2.c</code>, before compiling.
-Otherwise the resulting binary won't work correctly.</p>
-<p>I haven't tried any of this stuff myself, but it all looks
-plausible.</p>
-</div>
-</div>
-<div class="chapter" lang="en">
-<div class="titlepage"><div><div><h2 class="title">
-<a name="misc"></a>4. Miscellanea</h2></div></div></div>
-<div class="toc">
-<p><b>Table of Contents</b></p>
-<dl>
-<dt><span class="sect1"><a href="#limits">4.1. Limitations of the compressed file format</a></span></dt>
-<dt><span class="sect1"><a href="#port-issues">4.2. Portability issues</a></span></dt>
-<dt><span class="sect1"><a href="#bugs">4.3. Reporting bugs</a></span></dt>
-<dt><span class="sect1"><a href="#package">4.4. Did you get the right package?</a></span></dt>
-<dt><span class="sect1"><a href="#reading">4.5. Further Reading</a></span></dt>
-</dl>
-</div>
-<p>These are just some random thoughts of mine. Your mileage
-may vary.</p>
-<div class="sect1" lang="en">
-<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="limits"></a>4.1. Limitations of the compressed file format</h2></div></div></div>
-<p><code class="computeroutput">bzip2-1.0.X</code>,
-<code class="computeroutput">0.9.5</code> and
-<code class="computeroutput">0.9.0</code> use exactly the same file
-format as the original version,
-<code class="computeroutput">bzip2-0.1</code>. This decision was
-made in the interests of stability. Creating yet another
-incompatible compressed file format would create further
-confusion and disruption for users.</p>
-<p>Nevertheless, this is not a painless decision. Development
-work since the release of
-<code class="computeroutput">bzip2-0.1</code> in August 1997 has
-shown complexities in the file format which slow down
-decompression and, in retrospect, are unnecessary. These
-are:</p>
-<div class="itemizedlist"><ul type="bullet">
-<li style="list-style-type: disc"><p>The run-length encoder, which is the first of the
- compression transformations, is entirely irrelevant. The
- original purpose was to protect the sorting algorithm from the
- very worst case input: a string of repeated symbols. But
- algorithm steps Q6a and Q6b in the original Burrows-Wheeler
- technical report (SRC-124) show how repeats can be handled
- without difficulty in block sorting.</p></li>
-<li style="list-style-type: disc">
-<p>The randomisation mechanism doesn't really need to be
- there. Udi Manber and Gene Myers published a suffix array
- construction algorithm a few years back, which can be employed
- to sort any block, no matter how repetitive, in O(N log N)
- time. Subsequent work by Kunihiko Sadakane has produced a
- derivative O(N (log N)^2) algorithm which usually outperforms
- the Manber-Myers algorithm.</p>
-<p>I could have changed to Sadakane's algorithm, but I find
- it to be slower than <code class="computeroutput">bzip2</code>'s
- existing algorithm for most inputs, and the randomisation
- mechanism protects adequately against bad cases. I didn't
- think it was a good tradeoff to make. Partly this is due to
- the fact that I was not flooded with email complaints about
- <code class="computeroutput">bzip2-0.1</code>'s performance on
- repetitive data, so perhaps it isn't a problem for real
- inputs.</p>
-<p>Probably the best long-term solution, and the one I have
- incorporated into 0.9.5 and above, is to use the existing
- sorting algorithm initially, and fall back to a O(N (log N)^2)
- algorithm if the standard algorithm gets into
- difficulties.</p>
-</li>
-<li style="list-style-type: disc"><p>The compressed file format was never designed to be
- handled by a library, and I have had to jump though some hoops
- to produce an efficient implementation of decompression. It's
- a bit hairy. Try passing
- <code class="computeroutput">decompress.c</code> through the C
- preprocessor and you'll see what I mean. Much of this
- complexity could have been avoided if the compressed size of
- each block of data was recorded in the data stream.</p></li>
-<li style="list-style-type: disc"><p>An Adler-32 checksum, rather than a CRC32 checksum,
- would be faster to compute.</p></li>
-</ul></div>
-<p>It would be fair to say that the
-<code class="computeroutput">bzip2</code> format was frozen before I
-properly and fully understood the performance consequences of
-doing so.</p>
-<p>Improvements which I was able to incorporate into 0.9.0,
-despite using the same file format, are:</p>
-<div class="itemizedlist"><ul type="bullet">
-<li style="list-style-type: disc"><p>Single array implementation of the inverse BWT. This
- significantly speeds up decompression, presumably because it
- reduces the number of cache misses.</p></li>
-<li style="list-style-type: disc"><p>Faster inverse MTF transform for large MTF values.
- The new implementation is based on the notion of sliding blocks
- of values.</p></li>
-<li style="list-style-type: disc"><p><code class="computeroutput">bzip2-0.9.0</code> now reads
- and writes files with <code class="computeroutput">fread</code>
- and <code class="computeroutput">fwrite</code>; version 0.1 used
- <code class="computeroutput">putc</code> and
- <code class="computeroutput">getc</code>. Duh! Well, you live
- and learn.</p></li>
-</ul></div>
-<p>Further ahead, it would be nice to be able to do random
-access into files. This will require some careful design of
-compressed file formats.</p>
-</div>
-<div class="sect1" lang="en">
-<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="port-issues"></a>4.2. Portability issues</h2></div></div></div>
-<p>After some consideration, I have decided not to use GNU
-<code class="computeroutput">autoconf</code> to configure 0.9.5 or
-1.0.</p>
-<p><code class="computeroutput">autoconf</code>, admirable and
-wonderful though it is, mainly assists with portability problems
-between Unix-like platforms. But
-<code class="computeroutput">bzip2</code> doesn't have much in the
-way of portability problems on Unix; most of the difficulties
-appear when porting to the Mac, or to Microsoft's operating
-systems. <code class="computeroutput">autoconf</code> doesn't help
-in those cases, and brings in a whole load of new
-complexity.</p>
-<p>Most people should be able to compile the library and
-program under Unix straight out-of-the-box, so to speak,
-especially if you have a version of GNU C available.</p>
-<p>There are a couple of
-<code class="computeroutput">__inline__</code> directives in the
-code. GNU C (<code class="computeroutput">gcc</code>) should be
-able to handle them. If you're not using GNU C, your C compiler
-shouldn't see them at all. If your compiler does, for some
-reason, see them and doesn't like them, just
-<code class="computeroutput">#define</code>
-<code class="computeroutput">__inline__</code> to be
-<code class="computeroutput">/* */</code>. One easy way to do this
-is to compile with the flag
-<code class="computeroutput">-D__inline__=</code>, which should be
-understood by most Unix compilers.</p>
-<p>If you still have difficulties, try compiling with the
-macro <code class="computeroutput">BZ_STRICT_ANSI</code> defined.
-This should enable you to build the library in a strictly ANSI
-compliant environment. Building the program itself like this is
-dangerous and not supported, since you remove
-<code class="computeroutput">bzip2</code>'s checks against
-compressing directories, symbolic links, devices, and other
-not-really-a-file entities. This could cause filesystem
-corruption!</p>
-<p>One other thing: if you create a
-<code class="computeroutput">bzip2</code> binary for public distribution,
-please consider linking it statically (<code class="computeroutput">gcc
--static</code>). This avoids all sorts of library-version
-issues that others may encounter later on.</p>
-<p>If you build <code class="computeroutput">bzip2</code> on
-Win32, you must set <code class="computeroutput">BZ_UNIX</code> to 0
-and <code class="computeroutput">BZ_LCCWIN32</code> to 1, in the
-file <code class="computeroutput">bzip2.c</code>, before compiling.
-Otherwise the resulting binary won't work correctly.</p>
-</div>
-<div class="sect1" lang="en">
-<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="bugs"></a>4.3. Reporting bugs</h2></div></div></div>
-<p>I tried pretty hard to make sure
-<code class="computeroutput">bzip2</code> is bug free, both by
-design and by testing. Hopefully you'll never need to read this
-section for real.</p>
-<p>Nevertheless, if <code class="computeroutput">bzip2</code> dies
-with a segmentation fault, a bus error or an internal assertion
-failure, it will ask you to email me a bug report. Experience from
-years of feedback of bzip2 users indicates that almost all these
-problems can be traced to either compiler bugs or hardware
-problems.</p>
-<div class="itemizedlist"><ul type="bullet">
-<li style="list-style-type: disc">
-<p>Recompile the program with no optimisation, and
- see if it works. And/or try a different compiler. I heard all
- sorts of stories about various flavours of GNU C (and other
- compilers) generating bad code for
- <code class="computeroutput">bzip2</code>, and I've run across two
- such examples myself.</p>
-<p>2.7.X versions of GNU C are known to generate bad code
- from time to time, at high optimisation levels. If you get
- problems, try using the flags
- <code class="computeroutput">-O2</code>
- <code class="computeroutput">-fomit-frame-pointer</code>
- <code class="computeroutput">-fno-strength-reduce</code>. You
- should specifically <span class="emphasis"><em>not</em></span> use
- <code class="computeroutput">-funroll-loops</code>.</p>
-<p>You may notice that the Makefile runs six tests as part
- of the build process. If the program passes all of these, it's
- a pretty good (but not 100%) indication that the compiler has
- done its job correctly.</p>
-</li>
-<li style="list-style-type: disc">
-<p>If <code class="computeroutput">bzip2</code>
- crashes randomly, and the crashes are not repeatable, you may
- have a flaky memory subsystem.
- <code class="computeroutput">bzip2</code> really hammers your
- memory hierarchy, and if it's a bit marginal, you may get these
- problems. Ditto if your disk or I/O subsystem is slowly
- failing. Yup, this really does happen.</p>
-<p>Try using a different machine of the same type, and see
- if you can repeat the problem.</p>
-</li>
-<li style="list-style-type: disc"><p>This isn't really a bug, but ... If
- <code class="computeroutput">bzip2</code> tells you your file is
- corrupted on decompression, and you obtained the file via FTP,
- there is a possibility that you forgot to tell FTP to do a
- binary mode transfer. That absolutely will cause the file to
- be non-decompressible. You'll have to transfer it
- again.</p></li>
-</ul></div>
-<p>If you've incorporated
-<code class="computeroutput">libbzip2</code> into your own program
-and are getting problems, please, please, please, check that the
-parameters you are passing in calls to the library, are correct,
-and in accordance with what the documentation says is allowable.
-I have tried to make the library robust against such problems,
-but I'm sure I haven't succeeded.</p>
-<p>Finally, if the above comments don't help, you'll have to
-send me a bug report. Now, it's just amazing how many people
-will send me a bug report saying something like:</p>
-<pre class="programlisting">bzip2 crashed with segmentation fault on my machine</pre>
-<p>and absolutely nothing else. Needless to say, a such a
-report is <span class="emphasis"><em>totally, utterly, completely and
-comprehensively 100% useless; a waste of your time, my time, and
-net bandwidth</em></span>. With no details at all, there's no way
-I can possibly begin to figure out what the problem is.</p>
-<p>The rules of the game are: facts, facts, facts. Don't omit
-them because "oh, they won't be relevant". At the bare
-minimum:</p>
-<pre class="programlisting">Machine type. Operating system version.
-Exact version of bzip2 (do bzip2 -V).
-Exact version of the compiler used.
-Flags passed to the compiler.</pre>
-<p>However, the most important single thing that will help me
-is the file that you were trying to compress or decompress at the
-time the problem happened. Without that, my ability to do
-anything more than speculate about the cause, is limited.</p>
-</div>
-<div class="sect1" lang="en">
-<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="package"></a>4.4. Did you get the right package?</h2></div></div></div>
-<p><code class="computeroutput">bzip2</code> is a resource hog.
-It soaks up large amounts of CPU cycles and memory. Also, it
-gives very large latencies. In the worst case, you can feed many
-megabytes of uncompressed data into the library before getting
-any compressed output, so this probably rules out applications
-requiring interactive behaviour.</p>
-<p>These aren't faults of my implementation, I hope, but more
-an intrinsic property of the Burrows-Wheeler transform
-(unfortunately). Maybe this isn't what you want.</p>
-<p>If you want a compressor and/or library which is faster,
-uses less memory but gets pretty good compression, and has
-minimal latency, consider Jean-loup Gailly's and Mark Adler's
-work, <code class="computeroutput">zlib-1.2.1</code> and
-<code class="computeroutput">gzip-1.2.4</code>. Look for them at
-<a href="http://www.zlib.org" target="_top">http://www.zlib.org</a> and
-<a href="http://www.gzip.org" target="_top">http://www.gzip.org</a>
-respectively.</p>
-<p>For something faster and lighter still, you might try Markus F
-X J Oberhumer's <code class="computeroutput">LZO</code> real-time
-compression/decompression library, at
-<a href="http://www.oberhumer.com/opensource" target="_top">http://www.oberhumer.com/opensource</a>.</p>
-</div>
-<div class="sect1" lang="en">
-<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="reading"></a>4.5. Further Reading</h2></div></div></div>
-<p><code class="computeroutput">bzip2</code> is not research
-work, in the sense that it doesn't present any new ideas.
-Rather, it's an engineering exercise based on existing
-ideas.</p>
-<p>Four documents describe essentially all the ideas behind
-<code class="computeroutput">bzip2</code>:</p>
-<div class="literallayout"><p>Michael Burrows and D. J. Wheeler:<br>
-  "A block-sorting lossless data compression algorithm"<br>
-   10th May 1994. <br>
-   Digital SRC Research Report 124.<br>
-   ftp://ftp.digital.com/pub/DEC/SRC/research-reports/SRC-124.ps.gz<br>
-   If you have trouble finding it, try searching at the<br>
-   New Zealand Digital Library, http://www.nzdl.org.<br>
-<br>
-Daniel S. Hirschberg and Debra A. LeLewer<br>
-  "Efficient Decoding of Prefix Codes"<br>
-   Communications of the ACM, April 1990, Vol 33, Number 4.<br>
-   You might be able to get an electronic copy of this<br>
-   from the ACM Digital Library.<br>
-<br>
-David J. Wheeler<br>
-   Program bred3.c and accompanying document bred3.ps.<br>
-   This contains the idea behind the multi-table Huffman coding scheme.<br>
-   ftp://ftp.cl.cam.ac.uk/users/djw3/<br>
-<br>
-Jon L. Bentley and Robert Sedgewick<br>
-  "Fast Algorithms for Sorting and Searching Strings"<br>
-   Available from Sedgewick's web page,<br>
-   www.cs.princeton.edu/~rs<br>
-</p></div>
-<p>The following paper gives valuable additional insights into
-the algorithm, but is not immediately the basis of any code used
-in bzip2.</p>
-<div class="literallayout"><p>Peter Fenwick:<br>
-   Block Sorting Text Compression<br>
-   Proceedings of the 19th Australasian Computer Science Conference,<br>
-     Melbourne, Australia.  Jan 31 - Feb 2, 1996.<br>
-   ftp://ftp.cs.auckland.ac.nz/pub/peter-f/ACSC96paper.ps</p></div>
-<p>Kunihiko Sadakane's sorting algorithm, mentioned above, is
-available from:</p>
-<div class="literallayout"><p>http://naomi.is.s.u-tokyo.ac.jp/~sada/papers/Sada98b.ps.gz<br>
-</p></div>
-<p>The Manber-Myers suffix array construction algorithm is
-described in a paper available from:</p>
-<div class="literallayout"><p>http://www.cs.arizona.edu/people/gene/PAPERS/suffix.ps<br>
-</p></div>
-<p>Finally, the following papers document some
-investigations I made into the performance of sorting
-and decompression algorithms:</p>
-<div class="literallayout"><p>Julian Seward<br>
-   On the Performance of BWT Sorting Algorithms<br>
-   Proceedings of the IEEE Data Compression Conference 2000<br>
-     Snowbird, Utah.  28-30 March 2000.<br>
-<br>
-Julian Seward<br>
-   Space-time Tradeoffs in the Inverse B-W Transform<br>
-   Proceedings of the IEEE Data Compression Conference 2001<br>
-     Snowbird, Utah.  27-29 March 2001.<br>
-</p></div>
-</div>
-</div>
-</div></body>
-</html>
diff --git a/Utilities/cmbzip2/manual.pdf b/Utilities/cmbzip2/manual.pdf
deleted file mode 100644
index 10c10de..0000000
--- a/Utilities/cmbzip2/manual.pdf
+++ /dev/null
Binary files differ
diff --git a/Utilities/cmbzip2/manual.ps b/Utilities/cmbzip2/manual.ps
deleted file mode 100644
index b8b610c..0000000
--- a/Utilities/cmbzip2/manual.ps
+++ /dev/null
@@ -1,82900 +0,0 @@
-%!PS-Adobe-3.0
-%%Creator: xpdf/pdftops 3.01
-%%LanguageLevel: 2
-%%DocumentSuppliedResources: (atend)
-%%DocumentMedia: plain 612 792 0 () ()
-%%BoundingBox: 0 0 612 792
-%%Pages: 38
-%%EndComments
-%%BeginDefaults
-%%PageMedia: plain
-%%EndDefaults
-%%BeginProlog
-%%BeginResource: procset xpdf 3.01 0
-/xpdf 75 dict def xpdf begin
-% PDF special state
-/pdfDictSize 15 def
-/pdfSetup {
- 3 1 roll 2 array astore
- /setpagedevice where {
- pop 3 dict begin
- /PageSize exch def
- /ImagingBBox null def
- /Policies 1 dict dup begin /PageSize 3 def end def
- { /Duplex true def } if
- currentdict end setpagedevice
- } {
- pop pop
- } ifelse
-} def
-/pdfStartPage {
- pdfDictSize dict begin
- /pdfFillCS [] def
- /pdfFillXform {} def
- /pdfStrokeCS [] def
- /pdfStrokeXform {} def
- /pdfFill [0] def
- /pdfStroke [0] def
- /pdfFillOP false def
- /pdfStrokeOP false def
- /pdfLastFill false def
- /pdfLastStroke false def
- /pdfTextMat [1 0 0 1 0 0] def
- /pdfFontSize 0 def
- /pdfCharSpacing 0 def
- /pdfTextRender 0 def
- /pdfTextRise 0 def
- /pdfWordSpacing 0 def
- /pdfHorizScaling 1 def
- /pdfTextClipPath [] def
-} def
-/pdfEndPage { end } def
-% PDF color state
-/cs { /pdfFillXform exch def dup /pdfFillCS exch def
- setcolorspace } def
-/CS { /pdfStrokeXform exch def dup /pdfStrokeCS exch def
- setcolorspace } def
-/sc { pdfLastFill not { pdfFillCS setcolorspace } if
- dup /pdfFill exch def aload pop pdfFillXform setcolor
- /pdfLastFill true def /pdfLastStroke false def } def
-/SC { pdfLastStroke not { pdfStrokeCS setcolorspace } if
- dup /pdfStroke exch def aload pop pdfStrokeXform setcolor
- /pdfLastStroke true def /pdfLastFill false def } def
-/op { /pdfFillOP exch def
- pdfLastFill { pdfFillOP setoverprint } if } def
-/OP { /pdfStrokeOP exch def
- pdfLastStroke { pdfStrokeOP setoverprint } if } def
-/fCol {
- pdfLastFill not {
- pdfFillCS setcolorspace
- pdfFill aload pop pdfFillXform setcolor
- pdfFillOP setoverprint
- /pdfLastFill true def /pdfLastStroke false def
- } if
-} def
-/sCol {
- pdfLastStroke not {
- pdfStrokeCS setcolorspace
- pdfStroke aload pop pdfStrokeXform setcolor
- pdfStrokeOP setoverprint
- /pdfLastStroke true def /pdfLastFill false def
- } if
-} def
-% build a font
-/pdfMakeFont {
- 4 3 roll findfont
- 4 2 roll matrix scale makefont
- dup length dict begin
- { 1 index /FID ne { def } { pop pop } ifelse } forall
- /Encoding exch def
- currentdict
- end
- definefont pop
-} def
-/pdfMakeFont16 {
- exch findfont
- dup length dict begin
- { 1 index /FID ne { def } { pop pop } ifelse } forall
- /WMode exch def
- currentdict
- end
- definefont pop
-} def
-% graphics state operators
-/q { gsave pdfDictSize dict begin } def
-/Q {
- end grestore
- /pdfLastFill where {
- pop
- pdfLastFill {
- pdfFillOP setoverprint
- } {
- pdfStrokeOP setoverprint
- } ifelse
- } if
-} def
-/cm { concat } def
-/d { setdash } def
-/i { setflat } def
-/j { setlinejoin } def
-/J { setlinecap } def
-/M { setmiterlimit } def
-/w { setlinewidth } def
-% path segment operators
-/m { moveto } def
-/l { lineto } def
-/c { curveto } def
-/re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
- neg 0 rlineto closepath } def
-/h { closepath } def
-% path painting operators
-/S { sCol stroke } def
-/Sf { fCol stroke } def
-/f { fCol fill } def
-/f* { fCol eofill } def
-% clipping operators
-/W { clip newpath } def
-/W* { eoclip newpath } def
-% text state operators
-/Tc { /pdfCharSpacing exch def } def
-/Tf { dup /pdfFontSize exch def
- dup pdfHorizScaling mul exch matrix scale
- pdfTextMat matrix concatmatrix dup 4 0 put dup 5 0 put
- exch findfont exch makefont setfont } def
-/Tr { /pdfTextRender exch def } def
-/Ts { /pdfTextRise exch def } def
-/Tw { /pdfWordSpacing exch def } def
-/Tz { /pdfHorizScaling exch def } def
-% text positioning operators
-/Td { pdfTextMat transform moveto } def
-/Tm { /pdfTextMat exch def } def
-% text string operators
-/cshow where {
- pop
- /cshow2 {
- dup {
- pop pop
- 1 string dup 0 3 index put 3 index exec
- } exch cshow
- pop pop
- } def
-}{
- /cshow2 {
- currentfont /FontType get 0 eq {
- 0 2 2 index length 1 sub {
- 2 copy get exch 1 add 2 index exch get
- 2 copy exch 256 mul add
- 2 string dup 0 6 5 roll put dup 1 5 4 roll put
- 3 index exec
- } for
- } {
- dup {
- 1 string dup 0 3 index put 3 index exec
- } forall
- } ifelse
- pop pop
- } def
-} ifelse
-/awcp {
- exch {
- false charpath
- 5 index 5 index rmoveto
- 6 index eq { 7 index 7 index rmoveto } if
- } exch cshow2
- 6 {pop} repeat
-} def
-/Tj {
- fCol
- 1 index stringwidth pdfTextMat idtransform pop
- sub 1 index length dup 0 ne { div } { pop pop 0 } ifelse
- pdfWordSpacing pdfHorizScaling mul 0 pdfTextMat dtransform 32
- 4 3 roll pdfCharSpacing pdfHorizScaling mul add 0
- pdfTextMat dtransform
- 6 5 roll Tj1
-} def
-/Tj16 {
- fCol
- 2 index stringwidth pdfTextMat idtransform pop
- sub exch div
- pdfWordSpacing pdfHorizScaling mul 0 pdfTextMat dtransform 32
- 4 3 roll pdfCharSpacing pdfHorizScaling mul add 0
- pdfTextMat dtransform
- 6 5 roll Tj1
-} def
-/Tj16V {
- fCol
- 2 index stringwidth pdfTextMat idtransform exch pop
- sub exch div
- 0 pdfWordSpacing pdfTextMat dtransform 32
- 4 3 roll pdfCharSpacing add 0 exch
- pdfTextMat dtransform
- 6 5 roll Tj1
-} def
-/Tj1 {
- 0 pdfTextRise pdfTextMat dtransform rmoveto
- currentpoint 8 2 roll
- pdfTextRender 1 and 0 eq {
- 6 copy awidthshow
- } if
- pdfTextRender 3 and dup 1 eq exch 2 eq or {
- 7 index 7 index moveto
- 6 copy
- currentfont /FontType get 3 eq { fCol } { sCol } ifelse
- false awcp currentpoint stroke moveto
- } if
- pdfTextRender 4 and 0 ne {
- 8 6 roll moveto
- false awcp
- /pdfTextClipPath [ pdfTextClipPath aload pop
- {/moveto cvx}
- {/lineto cvx}
- {/curveto cvx}
- {/closepath cvx}
- pathforall ] def
- currentpoint newpath moveto
- } {
- 8 {pop} repeat
- } ifelse
- 0 pdfTextRise neg pdfTextMat dtransform rmoveto
-} def
-/TJm { pdfFontSize 0.001 mul mul neg 0
- pdfTextMat dtransform rmoveto } def
-/TJmV { pdfFontSize 0.001 mul mul neg 0 exch
- pdfTextMat dtransform rmoveto } def
-/Tclip { pdfTextClipPath cvx exec clip newpath
- /pdfTextClipPath [] def } def
-% Level 2 image operators
-/pdfImBuf 100 string def
-/pdfIm {
- image
- { currentfile pdfImBuf readline
- not { pop exit } if
- (%-EOD-) eq { exit } if } loop
-} def
-/pdfImM {
- fCol imagemask
- { currentfile pdfImBuf readline
- not { pop exit } if
- (%-EOD-) eq { exit } if } loop
-} def
-/pdfImClip {
- gsave
- 0 2 4 index length 1 sub {
- dup 4 index exch 2 copy
- get 5 index div put
- 1 add 3 index exch 2 copy
- get 3 index div put
- } for
- pop pop rectclip
-} def
-/pdfImClipEnd { grestore } def
-% shading operators
-/colordelta {
- false 0 1 3 index length 1 sub {
- dup 4 index exch get 3 index 3 2 roll get sub abs 0.004 gt {
- pop true
- } if
- } for
- exch pop exch pop
-} def
-/funcCol { func n array astore } def
-/funcSH {
- dup 0 eq {
- true
- } {
- dup 6 eq {
- false
- } {
- 4 index 4 index funcCol dup
- 6 index 4 index funcCol dup
- 3 1 roll colordelta 3 1 roll
- 5 index 5 index funcCol dup
- 3 1 roll colordelta 3 1 roll
- 6 index 8 index funcCol dup
- 3 1 roll colordelta 3 1 roll
- colordelta or or or
- } ifelse
- } ifelse
- {
- 1 add
- 4 index 3 index add 0.5 mul exch 4 index 3 index add 0.5 mul exch
- 6 index 6 index 4 index 4 index 4 index funcSH
- 2 index 6 index 6 index 4 index 4 index funcSH
- 6 index 2 index 4 index 6 index 4 index funcSH
- 5 3 roll 3 2 roll funcSH pop pop
- } {
- pop 3 index 2 index add 0.5 mul 3 index 2 index add 0.5 mul
- funcCol sc
- dup 4 index exch mat transform m
- 3 index 3 index mat transform l
- 1 index 3 index mat transform l
- mat transform l pop pop h f*
- } ifelse
-} def
-/axialCol {
- dup 0 lt {
- pop t0
- } {
- dup 1 gt {
- pop t1
- } {
- dt mul t0 add
- } ifelse
- } ifelse
- func n array astore
-} def
-/axialSH {
- dup 0 eq {
- true
- } {
- dup 8 eq {
- false
- } {
- 2 index axialCol 2 index axialCol colordelta
- } ifelse
- } ifelse
- {
- 1 add 3 1 roll 2 copy add 0.5 mul
- dup 4 3 roll exch 4 index axialSH
- exch 3 2 roll axialSH
- } {
- pop 2 copy add 0.5 mul axialCol sc
- exch dup dx mul x0 add exch dy mul y0 add
- 3 2 roll dup dx mul x0 add exch dy mul y0 add
- dx abs dy abs ge {
- 2 copy yMin sub dy mul dx div add yMin m
- yMax sub dy mul dx div add yMax l
- 2 copy yMax sub dy mul dx div add yMax l
- yMin sub dy mul dx div add yMin l
- h f*
- } {
- exch 2 copy xMin sub dx mul dy div add xMin exch m
- xMax sub dx mul dy div add xMax exch l
- exch 2 copy xMax sub dx mul dy div add xMax exch l
- xMin sub dx mul dy div add xMin exch l
- h f*
- } ifelse
- } ifelse
-} def
-/radialCol {
- dup t0 lt {
- pop t0
- } {
- dup t1 gt {
- pop t1
- } if
- } ifelse
- func n array astore
-} def
-/radialSH {
- dup 0 eq {
- true
- } {
- dup 8 eq {
- false
- } {
- 2 index dt mul t0 add radialCol
- 2 index dt mul t0 add radialCol colordelta
- } ifelse
- } ifelse
- {
- 1 add 3 1 roll 2 copy add 0.5 mul
- dup 4 3 roll exch 4 index radialSH
- exch 3 2 roll radialSH
- } {
- pop 2 copy add 0.5 mul dt mul t0 add axialCol sc
- exch dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add
- 0 360 arc h
- dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add
- 0 360 arc h f*
- } ifelse
-} def
-end
-%%EndResource
-%%EndProlog
-%%BeginSetup
-xpdf begin
-%%BeginResource: font DTUUHP+NimbusSanL-Bold
-%!PS-AdobeFont-1.0: NimbusSanL-Bold 1.05
-%%CreationDate: Wed Dec 22 1999
-% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development
-% (URW)++,Copyright 1999 by (URW)++ Design & Development
-% See the file COPYING (GNU General Public License) for license conditions.
-% As a special exception, permission is granted to include this font
-% program in a Postscript or PDF file that consists of a document that
-% contains text to be displayed or printed using this font, regardless
-% of the conditions or license applying to the document itself.
-12 dict begin
-/FontInfo 10 dict dup begin
-/version (1.05) readonly def
-/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file COPYING (GNU General Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def
-/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def
-/FullName (Nimbus Sans L Bold) readonly def
-/FamilyName (Nimbus Sans L) readonly def
-/Weight (Bold) readonly def
-/ItalicAngle 0.0 def
-/isFixedPitch false def
-/UnderlinePosition -155 def
-/UnderlineThickness 69 def
-end readonly def
-/FontName /DTUUHP+NimbusSanL-Bold def
-/PaintType 0 def
-/WMode 0 def
-/FontBBox {-173 -307 1003 949} readonly def
-/FontType 1 def
-/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
-/Encoding StandardEncoding def
-currentdict end
-currentfile eexec
-d9d66f633b846a989b9974b0179fc6cc445bc2c03103c68570a7b354a4a280ae
-6fbf7f9888e039ab60fcaf852eb4ce3afeb979d5ea70fde44a2ae5c8c0166c27
-bf9665eea11c7d2329c1a211dd26bb372be5822f5ea70d99eb578c7befd44cdf
-045a363056e5e1cc51525ea6fc061dcebb337208eff729802376a2801424f670
-0e7e6397b28f15bc10b40012b0a3eaeb2693e8f7f627c4c9c7c6c5bff105c1e4
-1b2b9e8f09253b76040d268b80719e1b3f5a55ab7b8d62a63193c4ae94c086c1
-552833ddd8f116b5df33205ae709b3aa63da7bebb165b67281827b48fb5edbed
-02a1a5c0784fc57d3487daa59520bada1be3fb9795669924321ce4f466cd8e3f
-7e8ec2494aee80e2dd7a48a6861af5b9f0ccaa4a2fe2b03498eacacd6b9c39c6
-a8f2e39e06bbb061cf2ec380a32efad0b790974bb5cc3daf0992471456967362
-77de34813f27abe99302f86bb4d293a37f84667e7f3dfee4cfe9d1a676a5728c
-aeb5222ff50da97e74b2cdebf725fbca7015a188891c8a376b9dd8a642c4b184
-b1bbf3f376a6d6e31ef1c8354ddf8039cb20faabcb34d4749b3c8c8d6972ceb1
-06b8a5aae3ae40a91f1f2b1155681a9cc933f87528c99a2b0268b43a3e829e7f
-3bd863cb52950773bd9b0731dc4992541d7de7a055ca65ddd2317f1705c20d1f
-93291bcc254cbaba425c032b3b15050d41da14ffe1b3d684eea428095a01e931
-98d4f849b239ad9d79f4502f0271affb0c297f2f347bfb9c137782646f648f77
-0076b85f5a929fcdea2703333f6918b8f125627f8b505c688e30f258ded1aecf
-2c86edcd88c29249a8081731737195fab7adbb54743bd66511194dee2516959b
-a20701e2d97342248297425491f6c9471ec9a98e630d734dac19721f0b324432
-c8d7a0b751453f89f7008ba37bc48e0831ee3ecbd8a0a292d63cfc890b28f695
-9e29ac3b4ddb78a6883b9272ce34a012a82adec0b6b641e3940a438a098ccfbf
-c50544b94facfd9d7ae09ad0632015f81d2f77fc6d80a42ec11d67d8a91c376c
-13c8e3444cdfde4d2a1ed021410f4d6a4e97804ae949bd913094d23108c9d384
-56f11025e2d24939114b6bcf579a0315c52f3ca1bcc2860fc1a0b9fb8a37ae2f
-c20c0fd44d215fc2af737fd0339b070d54e664021240071c665de4170dfa182d
-4e385685fb41a2d85888b1149e9a766cb4f309b4e2baa28cf1f8cc12c4b19e33
-f046ce97b53deb549fea96cf6ce66357c4904b7932f5b1ce03cfe3a10c976b9c
-c9ad11d7a02816f8e11666ca8b3ee1411df2ca94172659bad929e3e3e5248f48
-0690cec6d8f7061608cf2672f65abdc96b4fca84d5c847440cf9523d3bf23f6b
-d4365582e4b187b6a1a0282ed323bf221edd0a4ce11ce7eda738d1af48b2e19f
-eb3da1664de99c447c35dfd45069fded1fcd70b4a6855e91ffbd7146efe88012
-0bff1d6d1acb53d5e07fb5795f561a4a3e953bba7c03a9762adae18e58dce6b3
-b1a703122ef3b16963ac7cb9682ce60e17947e7e675d19901c7e8272ce4c9fdf
-536abdffa429b820a82aee9a73d7dcf77dde4d8e251cb3b3a5b0a91c0fcd7fbb
-ead7a812ff194fd049f28b82f4c2d73e41cc73c1c9f668931a2c7eba5400a1b9
-0902efe6792f207136e1e16b41794e6cbf7316889a602d35c37ef36dec95af26
-e9bb0900456f2ebf2705ecce7b2ed90343d23e006ecb282d4b3629bb0c3892f3
-ff9c17fe6c5fab68358e1cd44aff021948ac9fb8410a3de22e0a01e367c52470
-2a8cfd284cf9e8f505d5dbd7bbe242fe071fea0094a55ed1cd7c9be6b7c56c98
-16ad1985fb7624f5e48cf6c0c2ed85b466f64c52f017b20cdabb85d24452e086
-3942362e764a2bda0f6c1b24426e302ddc4403a087efb2850cf3275c7b24275a
-ae270f212831f4c4a5d95deab61923ca126e587e8f5ed4f2d5738f06e8c4f911
-b346b8ecdac481dedd2f546305a7cd63cb67d40093c618fbbdf498c8d7ead8c7
-1f5f022d0bbcfaa8670e3b3b999a1697c947af38d7e1a360e3f0825a9aa77840
-d7a9dfd575ce2f04d308f7c553ebf569ac84f2c12aa0869ce107c713a3cce624
-5059bfb3f5aa27d10e337086144ab09286be3825a3482c5422454c6a9cbbf205
-833316780eb88302796fc427a0fb9e53a7bf24577feb3fa5d85cb6344f908007
-183522d3c760c11fc7da8d14bb5dd800576a6b4d1b991c1bf3db0f9ca2ac5d22
-91079a199f2f6e6dc68213d33ea893b74f6aff30ed1b51f8b53a015ffd4d2076
-b71f73225b151cfcf11e2a2917cf1b3f60e2b4d442307c394e1625f7e60eb12a
-f2eb9ca7b17b082f1664d09cb7a3f38aea99a13f659089426126f47fad5b6dc7
-64101cd437da3c22bc43e7a8de07253eb371470ee1e4e42a5d1fa2c4db5565ad
-79d6271ae28e8fde5d4cb24064c145de44ed486a1e7df2df921f2b1be5fdb120
-d8b781c3655ea72dc22a2a2d37579f0af60b42320ab25c8d769124352448a154
-7a381b388a4d9a54e82f199ba35f1a3981823ab698e3f87d38d32addd4f13832
-77fcc9acee7fbd3285f689a85b76d0feb9e70f09bad0ce144770a6cc203ce40e
-15912de0e3465dbc7918e3ea49ade57ee8c48c75937f5d25498c45170693067e
-6902937c9b43ab6080111663d5dc6d88f72a39c5e7bad677229498323a3e7a22
-2fe2552b00cb91ce2848a1a53538b7af2503a3671903e10df0e9641dbb70577a
-e828dd3cae98fa9e1a74f4377f908d3cd79461408ed29832bc4c9865550ccb00
-45359282255057a4bd4859915cf1e45ecdb7329f90bbf63e0a22a54b05c5acd1
-9c7c4dfc25482a27a20c7ab908546c3577e87ade93ea46436314a0a7c524b892
-4b012239e77cd65ae2949bbf7e46a5a2269b7ffb1cf8a5bc7eea1944d2b0bf37
-bfc36adad9a599fa133f77935f24ef518819d054345df144731dd2332b0f7f5e
-84c46af486941cf1293e86ee719c9bab6263470c7009c3933f1857b0a863e36c
-288d37e6ac85e6a1b4e6e91c0a9fe367bec427ea3713e8d1f0523ecff6067717
-244ca21c177968583815f023420a660f7aa4cdc8bf25ac3b3e429942b9f5123d
-84234c186d9226487c76dfef5d26165771c0e75f0ace7e3882e49de831b46c12
-e30dc37395241d7619c05abc40f5a36f8042b461fb6c3a5181f77b14e9e6d978
-37356b4b31fac3850df1869063724316104c799b6a2f42c361a375e4d29eba7f
-850fe29efbc2cef627a25db549a4d4c48f9fc9a2f32fa50c1ce6b5a545a95f7e
-bf2e9ed710ae91ace1281a44e49aee4133ccc04926a6dba24b721c21188c89a5
-2a49745501cfaa4364cf49e3ec2a59d9ee46f33362634f9758827b199fd07dba
-939bd7387124656831862f70a97c5a05959572c74865f5902e95093fecdbea3b
-bba9b47dace807262de0c7ef04843259f58a323471237cd573298c5d0a0650ad
-2acabd71cb44c63675192845e3d01b3b28af871f347d4a460cc28d9e94409443
-30e893d27b06132063ab727a38f447a2a4633d29adac01bdccc7634e64dfdc55
-9141f69e1202c4a0fd48479b0ed95a7605c94901373e1100a6cbfc113fcce445
-e0317cc94a8507dd637c37676954b9d34c6727aacf17285876db16dd0e11384c
-2b996e85e82fd8fd2b8f9b83bccb398b997364f0ddb71e60ccc50cdd5d122eec
-c36b86a89fbbb5bfb227fba3a7b7de7c907e58780fc276c24ff066982691a97a
-50d14362d27d790375a47162decc53c5c11e8a7499788dfd86aefffe7e674aed
-26706e2d079e9a571c6a32accc8c0dcf23508f58477d05f9a1fc679c0da64254
-27ae33293d02c9eca01daf2d0a1b07e5515d36e18caa3ab1b6c5736dfdefe384
-dbcd244f0c11087a873c4501c6de2a5a57e346fd3f92a0451e63fff6b99c6dfc
-64ed8673dc54ef6509d0d043925bce39072fc64ddf2c49b8602d1a51ee822f19
-d7b2135aa84626bfe3ff321a6bec3a003ad97e7699cfa34bf41f9c2b38df4794
-cb5ae36c95f42b44212de67a96ca9d047587998636673a031c4eb03cf1a55326
-f5d94dde75086b44f095ede0068fb6b9d256759041cda04ecacbd8d7784159af
-ae31a9c637d9a5c0c6840dd9e30eacc66d4d6fd6f12a603aa2db3e9866693070
-0d69cddc416d4b76cf6b835c7bebf914816b87edcd5a24e346eba2dded30f5a0
-dc033e93b040a6ee7f8ab3c44c61017c758c11c2e2fe3c4f18996287a48fa9f8
-fd068c42d0d3384ff27c5a88ef630125562663ee95a66b7b588b417b20d3ae84
-6ecf2693940d4733f9e70b0455b6097e73553eed34df8da712c29d76326670b7
-13f19d4b5ada1833d46fd6cfb92b85eb946cc74252718cc5e605cd6c3c5a46e8
-51536cddcc3cb244c78e629fab784fd76372ca9417fa67f292a7e780b78186d7
-f391cd91b6222e88c0bcff66208814965511967b2ed0d075c77b57701608b647
-b4e462d3e56e06c0403f858582a754dcbf8841fe81d39359d8c5a77c8ae6b795
-c11b84f702de09f22498a189a4c69d726a63260784066562a50544e5d07aebb5
-8265c1c6607bfc6008f2edfc9d0de71646548e59bb374996a4412ac22ab47dc8
-357153c7c9061e95952a729a80fb45f3650fb0c84a07c1956dcc0856d7b0fa71
-3f09c1b995b0c48c57c9367c0601a46cdaefd0460735682d5aafe8545cba587b
-ca6e8144ff14a25b2fce9b23d8ebf715c5a544bd646d5460d2f8cbd44b6d8203
-54e4b7377db351ff26b7b9336a7dca3a610d3a92541054c544064447ac6d1a15
-cf1d1a3797cfe85fb55b56ac01fbb6f47e9c8e5c2929bdc7ee14f6d868464493
-df4759cc80405ef270a816607f248c5c1d5c56035a8ffc1fc1b5f69aabe2f964
-cba4c0ed5416a20f102c82bdfe59ddb4a16140c85d55af2aa52c92ee85c37881
-9c95865704b3cc39da6270dfaca8c3611edbb6da767bb50a03d6a06ed9890104
-da2a575ea45e16da2e1fdcd603c91af6beb934ea33023152c25c27c3c771b553
-1a9aa1ae684e1539e549972c97321fa0710759b6d4b9e55ef1b41bda01d77786
-87c22cb79310a9000bade74a8ac97b3eb2ff024bfd60c0ad7fdedb23c805f64e
-fd139e015e0d1d3591be5930c356e6b8c1a4f0ad9af94eded4ee9aaa436d4cf9
-58c5897d06b7c97cdec22745c46e7b37695a8c66140f7f8421138892f4851c3f
-d355b1de1d32145d39243d0590a90f1c4ec2c246d3f3779b319c38d4221576be
-fd17d8bc8819cf8ec30075305f8637d1ddf0f7255ad456cc290f10ec39ddc2f5
-290092718e7d268531aaeb377701dafa933b94ce763c1954ef0cce19d77c9208
-157c38b279c578c56b7e523afccc91fe6819483de18ceebbe74b81844ddb84c6
-22d4f29661e89e5417ce43c28028e9e1c54063afd716088b6e8fe0cd1702c2c3
-31273573f5c3d760c8a2c7cbb362ed650ea8ff54f19e097f14af9739885af15b
-46ed31cdef73db671b22efd41ff3f6bbd29625fae7571f9542fc06c77e28d2f6
-3ba2c9cf89da564de3a6fb3f0ff981c5c482a1e1de730041b7f1c890c4528bf1
-8e79f2fa4ed8a738f09a68a5b53edf6cbcf8861003917a89989146af7ab2e5a2
-836279643900c27a90463679a22f0ca5077728f6ae8a28324f9adcc19fa493b5
-e2465c6d98cb608f8dc52cdd6c52bad1a1502779b638df9336e12f035b3c310c
-b92b3add047365f2d25b0ec7e05cc46f31c0575eaf4ebea0b660aa20d9e7edf9
-0aa077e3000e25176038ccc92d4f9fdbae6b05aa2e17ad004e13308464a20cdd
-0271ed0f964e73cb11f18c2b795dba31c3ffd5648c63dab395238ba7c0cc7db6
-b206e6179c6ad7c2534c46a2b9c1d7fe6bc693df35118b708933677ab3a76cee
-9ac0303c2c0967d718a1691f6a922abb6b37625fc01908c10242731b79a1a82c
-fce9efbd1c6bd483fd867bc2938609ee52c0271a7ed1fde1b8667b98e22fd450
-86f515fd2ac2c11c50fce95f3e506ac6518dd4e532ddb100d87a9240bdcdafc2
-0c8bec467d76261165e9d8bdac9197ec798c81cfe80e3619f432674cadf44ff4
-3f61089abeb13d665e7901f4a1ba84115333210009d55e051b692aebee9d9bf3
-d0219c290191c17f7317aaf402b88ba353c25f126e2d32bef73d528c65af0840
-3ed4086daff574762531794fdbf637b765273911297b75338691e9ef4d2ad452
-22454c6a9cbbf205039d6d35c09a0ce284e9a776773a98e09e6a816dd71d80c3
-d80abcb006353b4b7c48c76bd9c1ed9db78bf62e9ad2222e5bee9fde0281f0e6
-11fd6f899938cee729a184be7cbdb0b84fc9c380d6c69cdd6e0f3f6780af684b
-cec6361673853b400f47e00177ff1ee7f9eb8c285a49e137e08d5d7663df71ab
-71ca71adc0857055686a04777a2e1408ce629e018c97524af5588991be92e4fa
-4a27745aa950a72d479c48d6f8c30d4258a882f199b4359f92a963fc650230c5
-79edf743f2cfe86a197296dd675bf05f25ed969de77bfdd0b518cbb5c30b4e42
-27c5117f235b34f7fc32413a980a38968ff9b8151280a0259214790e421d0f39
-eeebe98adba820401c2d47d4132cc68cae0f59b049d7489f62259bfc55091c81
-89e2480dcb77f689965151b7f6706af675a871370d2195b07457af8809f7abfe
-7d3672d76a74f55ec749ef40f755a3eed96cce000644ca0c497afaab7294afdc
-13c3239f54f3eeee809bcd936ff447277d2f3613936e7b39e683f25b60505f2b
-f4343ed0902badeb62495cef53789b9e74baf866be33efe66c1c5faa95f60ac9
-156a26bb9f72cb73e891ee4b905f72845b3ae05e025879f07a7b91fd06204148
-60832d64b6bd5abe0472aa7aff07fa05d23a01238b6f624ae8db25bb71ddd893
-1fc6003f23292a428a5a99df5861e0ae858c398d66d027a32a71d6e62d62b6a1
-a1db86b1ea3005a201618f22899cb1e7d70f65fdcfbf7962ee0d0d15412d006c
-cfebd0e0892888f26238bd1f7f090de03c41ee4ba53548f469fda2d94f6b3da8
-a606fcc3554e3f261b8490a3b8cde3ee846542668ce3b371318f9864c45a4223
-fa2a86e12034bba867c4abeb461c609c8d47e184703bd6c891f39076ee06bfd3
-bffa679de07d8c8eed9b4b24ff74c6db2cf84108f28e4f0fdb78e0e726a9bd3f
-2a1b94daee18fd20f2c902cbeba13c1b281d0a11a96b20800e4cf939dd32bda8
-25aa63d9f86f380af4dd379d80441dc4fbc0719a69ebc16e1617940a19eb0b44
-96581982d45b08e512000e3915490a1a79b908e1e63ae129750fa45dd33c0e9e
-2e767a89c6f11e33f193da18dc6c820dbed8d370492c19ad9d6407e50cb62446
-d3ab009d9e8f3c51eac2139ab64ffa19b70405813652fbbe33fbe5bc95d40b5f
-9ef833a4b1b51e56065abfef1036eeab8e04f096aac0d2813c2e721e0db97368
-c17f0cc971c9ca18a2db11745f67d42ce5148e2e8b2c0e13e4bb16a2789f0c4c
-e7b65be454ea623212bb2ce5afc6b5b3ad5bfed65063354becbc1531389977e4
-6599896d9ddbdf3ad6fdd8a44b14ec8cc9f131d73cba91e28cb54b37655e4b44
-db0457ae7bfd3c6b73bacf09861a7fe4b664928230fa03cb99ebb763703ff8d2
-68877c3a3b1cf915891578aec60c1f7d1e447fc777d8eb3573ba2a9ce47c99ca
-a9d52f2f12b101fe48658edc7543ef85dfe01b72dc4dda597951ea4298fd444a
-ee33b14ff2f91b7297922daa7e346493080868f56aaa2176c9f2c1284e4b2672
-a3b75face39df1c8b7a825a3a5c25871d190e48574e1d03a5fb094d418c47ac1
-687e8347036cc44fed3d84fe5d4b84a61fac9968b8d004c28539a3681476ac45
-56538901ff2764c1c46f5ffe048cd3a7eafc6a9fe98ff9b3cfdf3ac035a9d3f6
-8d75440d43a1842cc1e8b6b9b6d49a9bd093620735c9c7c11c21652a5262a86f
-c10413a373a9e02a488bd9a16a51fb51b027b2c5cde35cb1aed91ce58703e1e9
-ebdc1a161d754ee437412182f7d532426841e2455add22c031a2171426881bbe
-4090d1cbfc498ef46749308b73ebf4dc5a06adde6f83bfb368388bf7c2d900cf
-57932ba4c9db0f15faff7cbd701050a1db98bdc9a5f9f428980ecfb1e999f460
-231e59b5c62c7879278f10f6a61f79cc9da24d35a2d26996d8a4a106e081b8c8
-3fcc015b775acb00f78953a834018c146c65cd715bfb5f90c03feac01839c6ba
-156e327c97350d2851dd77e8263b967742472dc1e3b8f0e980de9f1815007cea
-51619d84375b777d5cf32a144affd8ef0f4fee2df1f839b2a5d900ec8e76363d
-c829f1d03d211175ab982226616b19c51800e4b5d4b28aba82980eaac6131940
-026e3c2297e197fb8f130fb15d2c4098b97c84074d4e50b5c6606bb0f3230931
-52b39a58964b4ca44caf45f63af49b330ab3dd863f5ebfa8ab0db6cc37838a64
-72c601c215037e94ac89420fea13d52174ed5c933e8c8525f88e6ce482661861
-58b904ba7fdb864cfe04bd7ce6070fc5ef576b1de985a8c4eeca7fe32b90d320
-9091d8931bc21c6f969288b1cab44bc53755d8d8f257466803dfd5725dbb5830
-4be6c784fb6f8c5e66802028759c0597246fc103eb63b58f361b144668713570
-8c6be071b51fde425a0aa5724986ca67e87eacb8f517fb3103e52595ba002e02
-82e54cb82b04c993d991d70b5eaac7a639213ec0f82a1d7750f3f6e94d8ac7a0
-8a586b816a9fbe78ff96bf1e3cd52798089f279a0a0d93e0314883988bba0f78
-7ce5745f8b07eb3b750c1d0a13fa4b0338346220ff9ff10cfe04f29e2c24aef0
-f77f6748b63b0c6d53461536034450820c73116cc66feb9c7f7d08e0a47d4c92
-ec61c5342099c27d93a79d9c9f278142ba03b51d6e1e03944abe063baac32629
-1b5dc30de8512f0cb3a973cc43afc2be532ed012c3eb58266cbeebf611f91aa1
-489d0174e713b976f3a0b36c575df597a3d8b12d4c5441e3a478f0933eb129ea
-e44484e084bdde7d2d9ba23a6bf1bbdd51d96ba4a5207af1044e917186b7e66d
-accde1295b615f37f1395827e29e3a1711fb2b6c50374df468be421cc531eae4
-b3cd2473c979d11c11beaf14aa9b6cce4acc8208f22f9fbb6713bb8306e5b5a4
-d46d11e604114d9a5a4be0615a843d10de54ad62d582302fffcfab7f785b11c4
-83081286cfa04302f7b92f64dbb42f3f97cde0c047662be6a3e58986c54b7c3e
-2ac1b0d19bc1490311150931aed3497abaa74303d3f0a3f3af8667c4b0b91385
-cdc9bd2ae98ac32a2d943e0583a0f3c74fcb803559fea211098b48385d3d8d32
-9e2cda61d7589e5383fa32abfcac50355549f1e819eb31531dadc47f5e759790
-d355444f1efa6b1dfc7713d446008225808fffbdc81a3b1b374c7f2901e27e2c
-41c477de0e52e9005288b7175117b32c326b3ad2b9f9342865d0bdd0ba6044ac
-395c2c69bf82a7aa9b77842a3bc7b4a675b0c32a4e4504d2a9fe8762170f54c3
-4dc3620cdea9d1877f274559ac6d37aa83f90346130472775858c18746db4558
-4f2fa7698926c4fb2eef0951579dae63c2d3c7b9e1fc811ee5dda4dc5b5e61fd
-c0ed21724902532087dbef11b1fd0d71eca9f271a3d1bf8ded5df19db6761547
-97d0a12f94147d64bade52704f880d0fcb89f4958547c6839c9e111892797f29
-4e65f7a54e14ea3d3f50712979f84852e57b9c1d70474a3593d53f21603e00e0
-e79ff355914f9a3d4ab1e14410eac9926928e714248535b178d6fe9e0e84ce99
-59f66fb52f37a4e3dfa5488b76d9ae2f62d4495bca11cc148dc20e29a694fabd
-e65c7629ebc40ff0c0fa109631655d3ef9848e16aa7c73cfd4aed02f8f125ab5
-0d628ce52fcae577c7ef0ab688a2f4fa9a0e2a9b10b93130f0b357f4679c1f7c
-9bd270f34f0bfd86459b402c74224a621dfad6ed316d05e15d31707fae7a9b62
-f8f75537326742f1e9d0c7483489f4f4fa38e0f327f24fbfb26307ead2720bd9
-678f45875eb05036341ba38660630b7d005304d4388ff7eb3be9c2635c21af0a
-02d12fd19a4e52181a9c7f2356b2a16eae4e8ed5b1ea0c01565c26856787fdfc
-2aaaf11958ff3414ab62ca19e947db6b78030e2c528f3d1c0215cadbb0c34f72
-6751da03c604bae7b97f379864bb54be9799bd387e88d6c7053f83dbae1cfb04
-f2ac87d12dcbe17a5183780fab4589e8b0d70934e856f11629a91e6d13da7704
-73cc80e0b80bdd42a71eee5f43a4dab994ee7cfeff83d08169aa298c98a85477
-dfc729ed6db098b4ae47a25b8ae7587b8cb2d59cc0989c06129fc201e7c9b763
-f8b3f651a5c735edc975cec4ce461e81ac9d5e3b08a708fc536b46b9566a58c3
-0402aafd2b6018dd063877b880f85e09895dd4c9d89b5f264ad72cbea438c153
-054e1a5ece2091e1d4105f46b047b75ff3be86491e694c1e2e03bff36812d148
-d9923f5d89a28fbc4f45fbc3db74cc37bf3cf41b070d72a4cd571524fa6df788
-3153e77818641287ae22b1c72331fbff019ccecbc1709615ad749dc77cb6b331
-30ca3d0fa05cc47447c17d96cf6ded782ff6b505193915aebe31f1f7b95dc9fd
-91a124f9551224117174ae1e05754dedcec813a8aa4934b73de1b20d7c10a20d
-83a8b085cc2d431b87397e5f8286c0a80704101475ec9845b2bf7ecb9ae457fd
-abad09e4e8ee411d4a20518597b08d5dd66afebba03f632ff2ed520270893f00
-35cf0716f4a092faf8a0c2a3f73ca46afd2a825eee041bbc2b649330fe821807
-707a06ed91847b434d34742844947d54e80422f5b5b56f6dbda934089c32ad12
-375b31af9aa91329c253fafd3cff4858c39ae5efbed4d590819d2f5963b7e08a
-99e157ca1c18b20c62a8f7bd278f560e871b6126d9cdcec52c6839417bc70dd2
-49fa373ca6dd557540906729f2fc5476c38595d958ab2b6c14629f9e16a2a9ce
-9f6e2dd760e55a38a3432e74126135364cec00a7b6dbf0cd48555df9f31e71aa
-9d573bb077085030aa3146d0693fe683884ab380f052c38b31b0e3483d122c4d
-d15a6a93eafec3523f4b2744935de9d1660fb4d8a76d82045862b59ea2183961
-f9868bf03e4a71db61e03fae93bea1092ac5ec83d71dad123d5663149d4bd0be
-e643435aabc919942bbc60d4ab56ecdecad30d270589775a3ff718cef0e2ea46
-b8c75fa911752ef13410185e5cea25aee6fae74489355d3328e0cbe8d4c55d46
-4114b4a4c85309dff4f2a5c2b14fc4f4779f4e3a8bd29076baec35cd59ecadca
-09e93d8dd4786052d970484ea3cb45b37c4a6f74249e9f5eb7583b018dcdabfe
-67259769ae1a904f20b3ef352cd191bbed998f4b2c06465d7355e82ffa718e08
-9dfa5c8fdaac95d8e05cf8b5a899b8484c5ea104eef3e5b21436ed396662222c
-8cfd00b5a854ba9338da205f16e5c0f451bc1c6cf34f0da069af5ccfb460cccb
-b6f393a99f6138e0ece299e0c0f7f1d0c83e0b936cac2dc38f08292245e7afdc
-6538c4fecc7d712ef83997088f73ae6ff0ab83d0ae76a7811cc07b41a57d1d34
-04681526d327b489094dd961f2f60a0c6c275f09f0a171e88056f58735d2f502
-65a167d12ff3395df58c3b901a68f0d96f8ef54ac5548086229adac495fbc256
-afe832991f1839aeddf1a87abc217835e58af4199823165fb9899fc831b47bfe
-4c3c1f5a2696e9a5f310afb8138eea06fda0688e0d0d7cd1ceff93a72c57289d
-332525c3bc60e51ab25526a4876affb2c64657caf14b34fca46a78e41b0c1955
-01fa1a0c0d77d5f7026234af489b316872e64b4d449efc540fb0da553063a71b
-d8ee44b0f9a20adb9f60b99803f1760c0cde357784e87042133aa085e9a37a5b
-b5685e73354ca0e9a48d886fd12841674bc0713d43301883f1c2f6190b47a4b9
-996c0e528b6572c96232ecbc57c57073463ae36b5b2974163cff75828a20c47f
-926e99faab51f19fdbe0f89bb71ffba9eb95a82b3a712b54578f665a89edf193
-d575ed95bb883f9d6797029ff0cc8a75459fac0cca4530e17d93c9834a8d9c9b
-376d3e40f3e44e6e895f25c90a803cf8b0f3056037809e3ed618475c199f43cb
-a7eeff84d38f49aafa4e469aa78cddb87ea76a87da1b888c38e225499d1bb089
-32d599918227c97b1e4de521460f1a175ff2fc500bb95574d9eac64cd00896f6
-27589fe5351f46a46d1fe8ae16fdc945decb08c0b7d841c5516535ab65b84724
-04796bd7b7083a606977316dffaeec0e8681c10df4deef6335403e5b08889558
-48bfb1b8708a5c41c5147fbed3942ac26ce66357c4904b79147dca55f039b648
-ae18d0d6d330a621301e3c1d6e478fc6fcee4c3382d463491a167596ff51f17d
-1afdd4ee7ab8f1b27b4ef2b665cb6818637b5e982447f6d7ab2806f769d254f9
-f5981812a9458a39f51366773a8980c7c6dced448d878af3bc088237815d2727
-40093cb7c3a4e6e86ec6cd61fa8ad13b20e270f97ee5be1799f2966a0ca2a7c9
-32de08bb021adf9466f1b88ffef315b818954057877d3d59f173c1b1874fffdd
-e3749a0dba7d62d70483b1a7c7720c1e95c59faeed0c8be1913177c6dbaa6905
-a6bd1a153906aa1b6919ebd1befb9a54d9b84cd9d548b1abe83933670ea719b8
-6337d01283b95306db92fe059da52d107ec47819bd163b3830c989df4052614a
-9866b057aeaed455fc9864df1960e97806cf95011394e2052861152024969836
-77be8008c246f14aea1c26e620fb331f96cd32a23b1c87d534d678181a198758
-4bffe069fb5a0c6b63ca8a9cfb6c3fd6ecf07c5bc59712ec7d02a5b988c3fbbf
-695fc7068a644d8885ccd88987532539e5cefc64fb97ec1376ef0a97970db510
-4c19b7a64a1b4f7eedfec2515996238dadbbfa8afd8004f12867de20912c2774
-1ceca6f2956b340ccb5e30f2b1f5f6376e6d3a272be05c29125f6d74bbee7879
-8836ee673971ab724dc89867d5a939da0cb41678fbb8d8ed35efa28de86728f7
-953c9c5896b867e4b7df3322563aff8a31cca8901b5542af2c7254547c7c09d0
-15baa7cbdc7352960ac650a543f05e290341d245ddd331a556ac7fc0ee7eb246
-718b71073b9a32776f6215fd8fa2297a2e9be23728cbb24c53ea10a4544ddfb5
-7d6292640840c77bf03728c3e5d2665ed7db7410c9ecb32c249a45664f72f8f4
-2e81a2e086b535f6473b1a3319d134317edbd1864cba7b79f89ef99d16c8871a
-28fbc4cb45f982bac6de81ef637a7e1022a5579f73867e40e31ec8903632e33f
-b24abe53b1f3a3097779b977bbeb41c21857909d3e25f7bc88e6d3fe6f183da0
-0133a99ae39080012df8498b9ce322ea9b76343c2e8be3676f08602470da2761
-ed9de407fba38be82de624e1552be40a0e10b55ad74367b91c80b8bc5cf59f64
-b79072369d9e492ee6b9f9df0b91ae608a44020ed6874038974ccc9afa88d6b7
-8114af4de09e77e4b0a1a1fb27e226a62385b969bbebb657ea927fd86e050ff1
-3ebd001a022333f8caca13c54f9b345cd5b6553c90b4f7fb949d7d65d9bf9fd9
-46a3c7c531f6a6479aab0d5a7015b56959777892feea7990edbd2b423f6e9ce4
-583caac124c268628a9cb703dd96aacd35b1031e08a741d02adfd579267df790
-5ef26af14b2bbdc22a1eb33b58719a1e8463f28784f4c15cb3c25cfb2e20a508
-7854a53f4ab398b02177de500a049d6c9faa13fd40c19178e878f1cc26221c59
-b40545f5f4442abba06656ead5afd938adeb3ea50c699862d48e767c223c1f22
-246e58c5694d1e23511710817a9fd18a1620cc651345e6d3302d85139f7a5734
-7e423be145e165baf46019fe831f97602ec87b3cdfb8fea12869c98f115d1b66
-5aa588fa82484acded7ca2c13a17bda305f63ee226ee1f37cf247f1aea9ff92e
-2fa4c1e0448a5dde45294699a9490a5ea94cf81c53491fc19e2ade5af005c300
-a5fc99b893ed1d469788e94de823006f8848dc9d021f19b934278d44e8c73da9
-3728f389563e10ae6017c5caf3b4b340be1d7d2b7f24a8cfcc1ed1eb920cd366
-6fa12f35e45673fb12b45a6ed7e84937576e5327c82d7f27f6c0255f75ef4b02
-cd492b23ec1f346bdf8e007042a82ab730ab2805569d7b978a4b114577514548
-0d426dc4a8ad86de85b23ab5aa8a50a30bbdd8ef5e9ff8e7954a69987fb5401e
-a9d039d5e05ef245e3c70a85236969f32bd1e5d29d71a2013493945e803838dc
-7241a73c4c1f14548eaadcba64aebc29fd2253fa59b6b039bb2edc9e4a7c8e83
-317ec39a07b8c8297e4b08d4e6f01a53e3d690f1d1db49f19640c16441be6ae8
-d1cbdf853394cf665f741938733fbc700e8d82c4cf1d72456008a0fe55c8b677
-a4f3e197aac9b976343923dd4c5a181454319fc509d499bf14740ef1387f354d
-d71c3bc5b9d4d2d9e0e7a3bc60c79c8e6d344bebeb3b2dc2c3605fdf1002f061
-d52f718b57d1f6c1406b1fdf2ce37ee45693ba72284c5652b2d88b29ad55d9bd
-78032a76ae6427c19749ca1503fdfa6eda4861f0b0c72684589efe6c01d9c964
-1201b79c5ce03520510e13bc5461fa3d2897e2b7c65ebb571e2d0ce319248d4a
-fcde6d70c38d25f6bbf0c09b64553c3fdadc64c293deda6e2ed8c191d7f432ac
-5bcc1ac3183c92d545abbd4da7e768140b9f5a5077b08dc8eae64727eade3e5c
-05e07036b08c31ba5ae366c642f816b5fa60e148795d3d4ce050f09c443d6fe0
-d44f8859d43da39643d4fb8c5e2e34f1b32142ddef07b1c02c09f4cc9509eabe
-99350ccd3a9d2d6fb809016dbe0c1a29fd1d25cc83125ba7d0143e09203f9e34
-99c6d07cc78bfdb82f72c577aff1045cd2ce2e3de0300283ae5ac540d498e467
-0e3718e3dac6dcdf1c7ab2d5f75c5b6e56bc32d8ddace4ce7f9272aae188f3b7
-d6d31b380592cfc0de45eabdd87cfaa15143cce738ede40bd9a06db0b3d5f570
-be5b21b328b3ac4ff46abb190ec17e73d31af389dc8e887280f84caf7b317c27
-38593005aa586b3c4918fa95a9435e45db40bb52d2f6034686463c87280b8085
-877297a871dd11fa1d782568fe813cbdab6daba828c1c264c3db809cb9da6635
-640c3e991dc41cb1841ea1556b7560d47526bdc012a8f1dacb30f38ed0f4721b
-b98b107526258d66804fb0dd4c52d827850d8f0a764a53cd81f66269a8cc114c
-06482a5b2b752416707d28e88291bca02b7746161794437f61e7e3353ecc92c4
-151af9a2f0b0e0e7b8be3106fa8b455e60d1b8e7a30a45922fe00f7ac9031be3
-b9e1dcae83017ffa27f196e1b8da6cff1bc25c0d776dbf675838c24c57a3078c
-d2f6dad8722aa8997078f22bfab7e8f995538174d577c28d1660e5484270e63b
-90ff29111a71bcfdda204034ad6df026ba9fe61c02bc99e0553cae82fc1f84a6
-f8c744cf34a92b3fa239b23fa2aa469c5765c02abeea272fc928d24714c14ea1
-2dc6871a82973f1b57a2063379dc471f0dd0684ab5ce9ab8088512b548c0e96c
-59f314ee81f9ba0a793072325d5b2a478eca04739746
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-cleartomark
-%%EndResource
-/F122_0 /DTUUHP+NimbusSanL-Bold 1 1
-[ /.notdef/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash
- /ogonek/ring/.notdef/breve/minus/.notdef/Zcaron/zcaron
- /caron/dotlessi/dotlessj/ff/ffi/ffl/notequal/infinity
- /lessequal/greaterequal/partialdiff/summation/product/pi/grave/quotesingle
- /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright
- /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash
- /zero/one/two/three/four/five/six/seven
- /eight/nine/colon/semicolon/less/equal/greater/question
- /at/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/bracketleft/backslash/bracketright/asciicircum/underscore
- /quoteleft/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/braceleft/bar/braceright/asciitilde/.notdef
- /Euro/integral/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl
- /circumflex/perthousand/Scaron/guilsinglleft/OE/Omega/radical/approxequal
- /.notdef/.notdef/.notdef/quotedblleft/quotedblright/bullet/endash/emdash
- /tilde/trademark/scaron/guilsinglright/oe/Delta/lozenge/Ydieresis
- /.notdef/exclamdown/cent/sterling/currency/yen/brokenbar/section
- /dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron
- /degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered
- /cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown
- /Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla
- /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis
- /Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply
- /Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls
- /agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla
- /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis
- /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide
- /oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]
-pdfMakeFont
-%%BeginResource: font VXAMRV+NimbusRomNo9L-Regu
-%!PS-AdobeFont-1.0: NimbusRomNo9L-Regu 1.05
-%%CreationDate: Wed Dec 22 1999
-% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development
-% (URW)++,Copyright 1999 by (URW)++ Design & Development
-% See the file COPYING (GNU General Public License) for license conditions.
-% As a special exception, permission is granted to include this font
-% program in a Postscript or PDF file that consists of a document that
-% contains text to be displayed or printed using this font, regardless
-% of the conditions or license applying to the document itself.
-12 dict begin
-/FontInfo 10 dict dup begin
-/version (1.05) readonly def
-/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file COPYING (GNU General Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def
-/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def
-/FullName (Nimbus Roman No9 L Regular) readonly def
-/FamilyName (Nimbus Roman No9 L) readonly def
-/Weight (Regular) readonly def
-/ItalicAngle 0.0 def
-/isFixedPitch false def
-/UnderlinePosition -100 def
-/UnderlineThickness 50 def
-end readonly def
-/FontName /VXAMRV+NimbusRomNo9L-Regu def
-/PaintType 0 def
-/WMode 0 def
-/FontBBox {-168 -281 1000 924} readonly def
-/FontType 1 def
-/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
-/Encoding StandardEncoding def
-currentdict end
-currentfile eexec
-d9d66f633b846a989b9974b0179fc6cc445bc2c03103c68570a7b354a4a280ae
-6fbf7f9888e039ab60fcaf852eb4ce3afeb979d5ea70fde44a2ae5c8c0166c27
-bf9665eea11c7d2329c1a211dd26bb372be5822f5ea70d99eb578c7befd44cdf
-045a363056e5e1cc51525ea6fc061dcebb337208eff729802376a2801424f670
-0e7e6397b28f15bc10b40012b0a3eaeb2693e8f7f627c4c9c7c6c5bff105c1e4
-1b2b9e8f09253b76040d268b80719e1b3f5a55ab7b8e152a40e590419249f2e4
-c36159f8e54b532468e36965a38646781ab0b7f6a3e851fd10caa49adfc1e546
-2fd2ec6150dc6e19523050f6148348a561ad8d2e2721eff8a570cb33460a745b
-926c889304c09753c2d78fb0ca95dc6de5b8c524752c83601e7e9f73df660674
-f05ad83a166da9be89f22feabd4b2665960f6fb5bc32928e1230c212e5d69cee
-0b3311a1738a11747ae263106916d8e95f25b25b4bc6afb03b79abb95dda518b
-41a49458111d2a1433c043627ef9460d324ffe22935f4f6da88b8b91ae95b34e
-08408a34ec8eac3f65b6ae3e3e2524867ee9d29068f81e4372f4470beeb4d6be
-ee4df956becc0cb77f8490117b22b2fb75c938ed0a5e208d88bc38b2ab8b9cfb
-f1d53084b6f43df336481eca0aa2d5317bc83fc0e1d4db01d0b7707eef217e94
-a7f985102ded27d8e8b009f7ef6db91b91e78bfae7bd688e10b3dc9ac77cdee8
-47aa4dc8ec78241e593d26ec7a60696151a2ae5325d736e99e01bdcbde69579f
-92eeec224b6757eedc64a75455bb665df42a0e4ce7b99bf3e7d66f8ffc8c13f9
-d7a1ff7a9d5ff7ac43396779f11c9b008c33a2043d48b61b88b03104b1425f09
-675b559ca4302c001ee80d2b739cc0fd1023bf4f1ff9c01e892e59cca7c26011
-b8e0b6d29cc29fc72792fda5e7d5d88ef98f9dba960c96534c399c54865eab86
-0fa2e0d6c7c44b553eac1574d55e7970744d4792fffbdce6fb4365bdbc2965bb
-2e9edad9e0ebf0b620db415ad98297f5ae83d9c710436657e74d26e83957c745
-89834337035a7501803947f6880b70e56a3a404c62d57b849d28804cbe0f5884
-435a0e12dcc9ba414abb732bfbae237001f557dea5e972ba0838a3c7c9eb75aa
-4a050da0a529bdffbf9011c360564fd17a02c18860af6b86efd4e2c125686c9a
-5e114e95c71fc89a5de9c589bfe5ac0480cff716345265d2435edae67cfc4801
-5bc08e7a48d683acdb91e05f469c0c8919d73a5d07a1ccb173e30e76680acb09
-02a40a3e11916198bd69f1a26e88330f50692d0d5917e99e7a01b327413e24aa
-e98ea484e45897e6ae4d6997b6e8bbf61c9406e916d56985cb2bd297e8acfc6e
-cf2d2281ad84696b7c6cb584bd85cc20ba14add3bc3e25db91124c0acf22e902
-3cfbf04cc40de331991e9075d22ab5ee0e849b340050e6c417c664a782d05549
-db2ef572f193b1c12b4635c2b358747046de5858ec32b3b2e79d42750657977f
-acdd2ee5a7c9320d907438dba63aa05ed410fc7000f53549091be71be45da4ab
-a315f95b724a60f17c70833e889cfe7ea206a7abc4393cb6ef47be3700ba5638
-6831391809ef8384aea8c22735e8062a9f9101add125a321fb65399cbcd9c9e6
-0f46fbf271b2b1ec80832cc054bab5ca80d4561da0a380d56d5cb3d90ae89a19
-48cd824eb1e7ac6127a6dba3e8ea40f00add89749d77ec0eebe26fd6ea5d8cce
-f7239681b3d94898236ae92ff3912e0afe84b6c7e08134c158b640b4aecab5f2
-a90028e67d33df31b461a2846f83d90979bb22618e2a17c5d159fb59d5177e12
-edf1320f596e7a4c379329adb367f92bf2869a9a97398e0c20f5f017ca9db7ba
-b3bab72b87a7b6bf4febd03132f9075c271f2054078396df8403dc91461325f6
-12cf1421f3099ccd799c2c099492c4f071336d985c0c360b2f5a5877fd00b6f9
-2e5911dddfb31d17a60124ee8da6cbda94196d7ed42804610e4f730daf2f2d5a
-b767c320c62543e26534314facae006ba2064623902c8ac479eeebb609e8c3e4
-1516ce412cb410bd026231e22a9cd0f664d769e4e45cbb75b7341f06d8e37285
-beaa9ab71aabe3cbfe5a348681aa246047ca29ca6b442feade254c7582d32d3c
-71b5e645c82e92f057eb5f859bee23daa95c575edaaf9896d6c10980a09db34e
-084c8a754e31b618c6991baa856cb86877044e10c2f189b284e3195a2db6b910
-2574e2461d2fae65b7321c0093a2a34996c0b77123503e9edc623dd02c44fb76
-3c550840bdf969582d226510ebf89944e59684eb2e2c463e69702266fbcf8d1d
-4c0be400495e227b9cb21c8086f328782ca7294dcf3ecdc1a62714143a4c1b98
-e5de1dd554fba60571188a58f0354a6b9ef580689b78a0c8515ca05a35832616
-7e0a90f68f3c306ab60aab20872fb167673f41e8e87ff0111f579cbd0da68b56
-3e35d2ebf9f28b104082e36187373efc7a33f62d3fe4a390b63a76e9b2531871
-6bd59861f51b561dcc115192a6fc22d15a5af03ba09cdfa66b660cf4288e9d79
-26e797256659b0ff64bb5d900990c3cb588e1e18810bcb009a91e5f4f8d9db1a
-f2a063bdabd9c3332f4bdb701bb94b4fd24570b440ae74b8d924e48e7c2defb0
-53a19e5b4df39abf4f6fc6160b5fcca00608422a3091cd03e726b1ea1d203b3f
-c44173460b490498eda3121881ebd21cb5b571d21a6228cc0a1b035ebe97f26b
-0b58179bd22ac950ec3a98458051a874297cd6bfe731c5b413819503111f1f6e
-ebfb5628c955f5fcaed76f2402ce351f77e471d1c9821dad627ff25131590577
-5ff9335dd28d85a11bf155765632b34a3aa1df9c01134bd8fe927e0064319951
-e2c1d374c9acfc30932712a5c3e0fe3c7e355e3356e9135a143f1b4e2738e208
-8f44633dd9300bafc770625a64b2bd20d4f672701310e5d1d5b2dd502802539a
-65344601924c473b7618f9b87bf6eb49474fe62891097b9b381dfc9dd22f6ceb
-340efd950b74e614a2908eea7b0d395e15943d0a9072e2c0e6c91d9141c84281
-6a59f02111333723db78c2c287675d73152ee3c63397f5ea6203c707568137e0
-12438b86ead16d71a0a56d00e6ace9d80aff646b05d829dcf08dce2fed1a17d3
-83a7c9e7c2a5caeb38bda802e6696bab17a5d1e5d6c51b6371c642d5588a2945
-1f3c8b0cd56806531579f7c0d10a9fbe254ea910522d955c86ddd693b8660bbd
-17b2b23fea57af15b1720e42c6de537074c071c50c114ac54c45ba2fee00d13a
-2573bb9243648a1be2569cf68ff78e4cacacdb34dad918a30005c31f17781633
-6b74af8b9931bec0c1892780020c1a92470e3ad7f1bb6ef26c835f13a9c56ded
-51df4a7847c993b88b9fda9a8955d8bdbf6ba773d06645e292ce26d9df4bbd4f
-3d20f52161853827837c837f33425990818b958adcc3ae79b5791ff04daa32fe
-54050aa9d34606f16c7763de770cc33c9acb60e5354d5a27a687ca6e0fd74a4b
-5cffeadf6ad0ba87b906c09201ff65ce6c3f620bbfaaccbe54da884b87e906b5
-f5285d3841ecf78f0a1ee4a80724da3a4fd49ffbaa66be3402a2480a6f8fc164
-343a369e2b8947fd5f58a4697234c742685421ce3d57398c5ed6f6b049fdf39f
-6870236751d9ef2210e680b4d8a6daab758bd7fa7da9680604e5bf85d1826611
-2ca08e8922a1d46ac853f4bdca37f7fe80d2d27854012e4a8f70bd854ea4c189
-ea6939096b56168aeb971aaafe1bca667137a76761cba2fbffceafe3e98d5590
-db3dbc44b3f9d4ef0419cae23086898bb25a222eea19c1a760389672933ea7c2
-8b31025619bd108b79d51d54e23f401f42165f0d513bb2409ce66ba3e83fc000
-4372873eb8b4405a8f5bd88cc2f21d2d60fa4024707869c5fd40d94028ed13b2
-5762cc7924d100d3ce0dd32cfca124ec1fce4cce8c137070a18f05cd73809449
-bcdeb0ac24dcf63679d46aa8b3a4a5d0dbfa9342716619cd3683dfa7a9d6683e
-5a7a03ddb47833fdff8935f2f004f58ede6447adce4fda1b734c75c52d16c406
-9428cdf68855946014584f7fe49b03f896e0054cffff5da4728bf4ce1d892052
-701b48b81f58f5ea344e8ebfe13baa70cb43ce4a979d8225ed78417648672e61
-07eb7b31f81cf52b4136288200e640654e83534eadf05301faf2f3a859772c3a
-545fc20429119ff00c259aa582af4e3cde1c99769f4e433d9b178edcecf142ad
-ffaa6da004a90f53e70048aa8d15a26bfcf7b02ed70bc262d165e99f87ca7424
-0eb98f3d7fc0d4926ae43c8d322bb9eca24a4c45f7dbb0feaa9a900e3521d6b3
-87b52a30acb29c914b06793f19a1efbe3be7d0b8e20cad99d292c315b12376d5
-655121189a833132715762ca7118685814f71aaa08b89e466c7468bca01bd98b
-63ec7cc3ac41dd06c5bbda86227afcc1f7796b5f878946c135bfa75a98db1b57
-0f38c49770ae23986ffaedbf6644df58a252c29ac821f4584b96b5ddafa9b3a1
-aa0ef6d17fc1e75916753bc8c799497e1279ec783ea86df307cd54b58c2b3ebb
-fd722006d127834b089670e5f1e7ba8bc4a0f6181bb4efbb8f99e4475181449f
-2fcb255da4233f7ab097ef0108ba3fc12cda0618870eacb9fe4195dfab182242
-bae0956d09e388d10da2f940186e25c9926886e9806c70105dc75259fb1e5da2
-675e4e114f84862e6b822a10a9d364b1cd13dca3d385b83499c715ecd7598766
-b215910f002358d592fc36d0bd482ee9cc338378ea1566839526a5783f250818
-078b97d73b1d62a1aad3d5a9753bfef23f7b3e6d5bd318c463aa04490b9063a0
-e83e3e68109b182720d2b1c13b498f8f495661c0f4e6455b96a6a92ff806f1cb
-3b1c6eac82d9a687b83c572c42df22beae31d1239719186f14ef637fe4e7c7b1
-fe8f4f1bd8367d76d467be95c394a818198d922bcaeeee371fe17e396b27cec5
-f0554778587fc7d78acdf317a8efdfc82c2f57b6411b3ab68f96e3e7cd321a6d
-4783435056ab5a0095726435be6885bf2784fb2cbeffc0f8248dcd594d34b21c
-98e67de50b6876c3d6d4d4ca7ce0b9013ebe754b104dcfc0719a10cdd9985e19
-2cdf4e88876c2dd4e79e23afa70ab5b4758af32ee87b8415b881ac15c5c3e1bc
-d17a5b961efb3a8dc987deded6f28a240d66f004ad05ce1c551e29b45668db2b
-305c9b1af5cd5388a0802d80f18e0f4bc8065baf393ffab9a4d674312c2033d2
-7c78b5e9461fb09b9b2caaab70ceb3afa574c89bc620328211c85656f63a8ddd
-97c827297327b7980c2fe0acb1c34866aa3c5d7408e257eba3c53de8338bdf96
-cb7ba55fe31bddbf7807148c0a132bdbbe8a2c21a23e11889da13e429914f7f5
-7132936359a0cc65e5993caf52902f76f75d6cb46dd20a3c0be80d45f2c746bf
-236733462080fbdc8c5c1dbe9781f45aba74af8033a6ef2bdb16f7b0930d6b6e
-7ca7fac8cfb2dfab8c063d961077585d24e8fbb5e0b0bee9c4509b23361dd06a
-dd25767833b9a770780b311f608cae7adde000297a2672211f0de8cf7f5fbc62
-78faba25d035fe3a7cc3a4743c0efe1c4a5e9cadf1e05bc7982648d5c9fb2992
-4a9ee1570ba2ab068cce168552299361d62a2bc2c0da48ee94d1cedf1e2d29bb
-43864ab5b770a14c98a432ab76c17998904f052a50ef845100533ba5cfb24c84
-da53581ec4f2201ca9fdae76ef365515188ace4cfc939ad6d193413ca7ee225b
-0137f4637f09952213be725cc7aec579b2fe85f7c6af18d70c4fda0557567e64
-d430f09aca7bf28984977ba0f5849a5a86729d5640bbe4c30b17ab03262a02bd
-8ee077ead7fdaefd37af16007d83714aca07fcf882adc4792583aabb279579df
-6741f637cdf8598fb5827528771444b0aa82dd5e00e70edefa7405a1d8a7797b
-ef021a53ba68c7ff6780c94f1393d1745ab1fd7c728c6112766a3c2e21dff002
-9e45a5c5668f8b084f22cd6a6cfb056cf0f402a73b2c02118259352eff6d680b
-877ce3024c37d532c186f3d4a97603704cc0ddb25cac00aeb4cf601f6fb45655
-8939ab962cb9e16a2400938d226056535ebe5707cf0a8678b54e6e3a103b2eff
-0bb7306d7c7c3f523b2aec267a5f1e3f99208d8ec9ab27d658c26f635c2984ab
-5a4d214768c6dc775bcc616838159aa10d5bd93cfc8b2d836eae5ed480fb6ddb
-24253a62a1b798bfa51b068b6888b76d2233b6fb11794f166254cb3ac8cfb650
-429866dbeb8d09e6d03889899a4e8bfc9a855ea4660f928d0aae8247eec1668c
-8e798398d53e52a5684caa59c47cb38c8f1009a8aa12a269a587593874c2dc78
-0ba989078910f3d70211147751e9f7264d6e64f1b05410ed3427bb7d0704443e
-f2baeb0fb9e3f1c1c14b178e716feb4644240447a3f02211350e36e1a586a042
-9ab336c6b44c0d2977294e704e8695b6daf079bca033b6bd3485eb7a78582fb9
-373716136c63eadbab3a2577738f553f81135829f9118f4bfe20cd51190bd7c5
-17035ebe97f26b0b58973ea9b5e0d111d9eacf2fa54b223c4f40c139ab891a41
-c7d5ba5338bfd58090ea727c3fd9d0c0217c05798787881d07cefe019518ccdd
-a7ad72305f06a98717cda80c5daaafc50e3c6d78d2b5d851beec46731a6c29ed
-ddcb9089de5cc2ddb696d3b7de3b67f066527ae22cc1ae6285dd1ad42e0809ee
-65812268d28e7105859262e9368a3aa7fd0207d47de5ea5591927f5e568386d3
-a61fcbe872945a272c75384be1e85b26aa094704715f1957de37a2fde2577ba3
-85000d0708fc918d52360cda828cedd17cb7d625155ceb6931a29025b44ec8fc
-3678fa08027b20fb9649d07f01484f2fd2e1746f290e32434fcd4d15acf0708b
-ee3fe9948d3ae141749b47810558d71d592735c1c86ee375be7413b2cf462660
-0b115cd043ede5612ab895cee0909da8d165408cd5c4c34114ee4d7fab4c37b6
-a31cb829c4bab2dd04b1a7097dec24c6429c13482667116522f94edc99de551c
-a693362be4d277e12829bc466e13d09841b5d9af504be4ea59e9c2459eea5ac2
-c678e3fa30cdfc5ab855d56c1ad8374f9769a6b575a1dee5aaaab4f716dcebe0
-0fab8b0b5522294ce3164f8446679fcc7aff5bf49062cea58f5c661a895ae753
-8891536066f8416ff5e357fc34cc34d6b68abe2fb2c540a7123bbf90d2671f65
-90515b96cdd1bd2c1396bc15503caa4ccd3ce28e0361801bdc5da98887b2c39d
-b84a0a4de7859c7da394acc497641ece12ad8a7d62ac5f8e6bda0577fe64d581
-35390a37a1570cb25b23b747b236f3f2606a3ff6e487a78069a068e7af13a8e9
-315016ebb2552f644065408a69f1bb6fed50486b2a05d403cd56ec5d3671c9ce
-091995d384491b65eeaf33078529238342c32a4b81788c31e62ba0614bafcf9c
-3c1cd422c605740a8939487e26bb9233d4cde68afe7a0cadc3aecd739c9c425d
-09cb50b4b4be28115ba7fc59b541513cd6fd08039cf40a1f5b90a8bd1263806f
-ec35aaa4100ecc05416ece2f061cfdbc321cf3324f1eda91976cabb8d2d9acc9
-b93c575c363fa691e18215311431841de8187a20d6664348c7a8adb06e867d02
-07bd48fe8067168c4412fc80cdba62f8b9209f5407670a26db1f7f5d67c4d227
-90bcd0f1e8640e5f9288c410487290808b88f9421d506386ac95cd959fd1ed07
-778de2f62958ff409d37332aa4ba88c735f2a56e4e746ee98b9667072874b21a
-5f98225aeecabf5cc818f3fa54edde178b40a1b1d6e2f900365e2b503346b213
-ddb43a269c5a973d303dbf615ac3caabfc39fe2144681e7cd633056bc77d95a9
-16f54291575aff7a3a4c13eca61a8d261b3a74307aac38b50c0e55222626e717
-db6e122547b3b8a766fb877deeea52ece2e74ba02ca7676f0e037cffaf287340
-c19bbfd9378d8e898225eda3fbf814ad51f976241a7285dbcc62610fe998ebc9
-7dc5961af9d70a6786e8922e7932a539f1606101440c6855f2284eb34a895cae
-44637b6a0b1c6386c21f11f2e7ee2adf012ea6ff35314981226505bd4b0ea25d
-371be9fb6fc0425d8f374cc51fcb15600ff7a49a4104bc29a369c8336438bd4a
-45b7c8fd52577a49acdb394cbbc16c844ad99f85b5af1e8018900d50862d7c7b
-045ee4bf7972eb05aa5696a004f3ec9be95c4c14180c7c8098a3a0443c0dfaad
-91e9c3a37509b29066af112db77107b9daf2e45e72dcd78660d5d56018cdf1e4
-ca787593c31a2d6ef925e37e4ee77e687e149bf506664975ccbf5fdc20b5c306
-984208ffb9ec2f79e76a7a029cf5981fd2d07176083d7fa0d9fa7b1e6c6da9fe
-423bf29011478ba39fbdc7e77ba230ee7b89728c9312602dda359f1ee65ba362
-d1f36657943255d62f0c84fe8a630204a8e64d8f940e9ddaf3c2ddc16fd131c7
-f302a2f9fb65ecccad4616977b2ec724fc6a4c39417962e0de1dcfa69aec8a02
-07179266935b655d20af3d45228ac3796fd2b7b6e0580904a27fe0c8023f4fa0
-fd70e469e5f309690c6ab737e9e0dd1db57fb312362b64ff1955401395b42086
-07e7f9449a8953149f324b4d5785c2a0a4c28eb487fd0bfd65462a1a4a741be1
-b1876330912edefcace1dfacea7628d16a4716d3989e1b31830cbc2bf9fce144
-9f0e80bdcbcfcf477a2c30a72ec227b20a0af16fcb8356bc205f18c6088c1d6d
-c579f1dcd23ffa147d72821b7a63fc011d5718fed41b16ea1d83ecd8d2ade289
-54eaa105f82f777b6635c160d0e3d67fbff2080db2a99d489a070d865c39ac9d
-2a88ab5fbce010919edc0ab213a09038fac6d3c81a4972e3c5683f49480fa5fe
-b8cd3279398028dab63ef7e8e1df85a63f93273f187f8f8619c14ab824c97c3c
-70d06fbc0a1b4be1b2b7f11ef469adef71617b304b51c462ab3c6c0e831c9ad3
-cb80c5e0d0fafd079d7f4f245d542ea892c6fe3c3d6d1ac2c92371b7a33aab5a
-ab8375b4cae9661c9d314999093b2a04ea1cb671c9f07ecefba615e023cb0f72
-b6eed231ad31b1f4d03e807e56c1e1663986eed65e3ee47a2dd11c1211236973
-4b4607a6570f534debc72ac06dbb2149f9efb793a917b3b604271fb764fab871
-f7aa5a5fcc54533951454fe7afa29cddef96e951aaa9b8eeb3f9b418bd132974
-c601b6fa29471dc34814fc81a1e1a5155951c12022aadce5826302220b18dfc3
-d30b2277d08e7cc7a87bf1b8ec4507b43cefb117119d86de3be51bf870390ea3
-d8daa3f74ccd3712d1c00261e853dc3078dd411189872a50d85d58cee8fffb1f
-0288029490412f3e58f83dada08fa695b18efd0a4f289705385a411fcb2d7a47
-ffe38977fce18188c0043c448d27e160ee752be0d44d0f83b6bf642c694aa530
-e223aefa3fdb17ee7aeaba75b9a86d7cb0f50ad4d5ce68d4ed48cb0c188f9dc4
-34548b48403078f63079bce8529f910ab280ebcae7df9f824dca756f9d647dc4
-d42da412230a6231307e7495424f98c9f129cc4a326a3dd8e476e18d666f94fe
-53edc87e47f6d84abb643ff3b4084437da26b4a298f819f4b6823eddac11bc85
-b9f5c5d0aa1e7b0ddca82c8e01944b3ea48978c1b8f4ff47779a5523f600d33b
-896b659c31f4f6f7decbae0fe1f83dde18f77f53db140a36b0f6f4b883ebcbb2
-b6d353bf2ca6102173b6dfba0f452d011f6cf7d661a470c3c5dd189c1e83fc4b
-9372ed67ef4ed9a5b98f85c8d73d490133b7362ab976a385cec705a2eb89d7f3
-2fbd60c08b86a30219aa2988f79e6386062be839c1f9d30affde82cade3494ee
-13041755e76cc07ccb3a4a701461290b5b79728eddfc63b2ed5cd4bbe0c4c365
-75488d590258ce2084f898d7c58b3f65b09dea2f8d4f71e80b2a2f8f31d5fcef
-7a7744b64d7baa701e473b85c65814b0a93e3ffbd7b2af85e00ffbfab9bb7766
-f444709a47902c919bd2a4becdce07b64053aea1058e26024b46153d6bb92c0b
-59861b2ddaf3d38dbea5bfedcc49938eb98188a3c4dceefa1f308559f7712ccf
-288219c6a3d4eefb81a2c5f154990fd8f09713a0531017d74b47e1f97aa6f0f3
-92ce5bb7475c676247d57bb14ff676f11a4b5b564ac26bfa9d85c9cb0414fafb
-c35b46eacf74dd964fbddab28fd7bb304b9bf4e12cd15b3bbb163dd66e89f24e
-6485c6ea63365d29907f6ba96d313f9b2ab7d175d549f4235653ef979a5c63cb
-6ee50cc333387a0ed88d30d9fd2197d31a0894ed0a47b15d92dca463a8c84b3a
-986d396e6530b2e9ba127bb5662ca948a8f0c563b9c868644b8d01064db6aa72
-090dda0521e6d778192a8c6d4d4639e80e309194cb76fc5d4615f396dd85b06f
-71dfc7f39a259e322c5e7d28646310eac92e5f6afdd6071b21e6664e1cdd3848
-c864ce0e380fdc48b251d52b5094ead64d380b6818e2c8b1a4eb8f9c18adde6d
-6e4ce1def2ae8f2649f1e5aaa05720a358a74e181568a10b536f68b7a0292787
-12c34acfa5bbafc4aa3eaa4d8ebb26e20bb00d228b4eac4a163e0b72899874a3
-f85e82c396d9e2891d8e0d6e5571d4ef116879cd2f5485dde4b9d40f638a3a95
-de5ddd14adbe72f5bbadf0d9950a195f64fd3209c6d47b46b7708f855da96cb5
-e9e1260f6699d945a611a7ea348db3c86be4b32fc2687f15c4c86957018d428d
-f6244a1fb6a99122bf89d7add01c80f2b2bb2c7168b02c400bfc98d65394948d
-c736741f9e0244fe096571f087c5d6d7d022c726a4cecf37cf2ddeb1e9d77098
-60c5d43121bc2e4b72a2d895a5ad2f449196aefe8c01784323de3804363b88c9
-1c86124f431e6dd0744c3d073fff4bbc2b98bdef713bdefc2da4e0e22eda76d0
-34424ce13529bc04c078dfbf8b3efd96cf662c4e151f15d4f8ea52641689d4a0
-5f7c9ec4efa5119db9e3a61e4a669c29348a1e71382c093499cd35d7d1227a5f
-5bc3db96823c167100074c70040a55142148196567c20c7eecbb25ed6e31f563
-9add24d52aceea4b88114eb6dba9461c2e5262fb9529e9f6f0bde20d3e209a8f
-0c9fd81b99b00d268f764593baa894f7ae50634766c922f751ed183aacaec03d
-b7d96d012cd0d111904245be9537edb0f8769ad1a8abbd8d1cbbe5e79c53c00d
-983c69d8865e93b6495a2f15ad9ab1da7503bd5b85ebe27aba01f71e56482be9
-d4342ac2562d8e6d1e4146447561ef5068d17306d66a52fa41644897a9b161c8
-5dd4161aa3d956e7961aa8020467e76a833e01c974e32aa2b8cf27d62fc81ee4
-d74649bf9530306481f430a539a95dcc2502f712947f6a68dda00589ef404132
-1dbc8b94afd827bbd5f77820353fddec5d98fdd256e858581054789781ab090a
-816e65ad3dc4a68b4ef2356e7cd2f906a859dad680d649457bae159f91805d52
-fb6dcfa5d0ac6373fa8325a817563bc9ed89a17d8cdee9b7516f38908e426f05
-1517eec7941cbadb22390e3e2e17d62ca67f37d01377c5a1e09bef5b795b4446
-54b383193351e05ed8bbd8b0b138cf62a428c78744582eec90a41c3bd44a4e73
-c9b32ea4936c211269ba5f883d45b16681f8afa0646a4031ef69cf4936305336
-5758f50534e6974342f4d232b5024dba0eb297e3aa3e9ef0935bd47998370420
-ead844c7e336288356715ceb8cb8492ecdc8fd8f1183360fa32850051442f4d7
-c0250d658c633de21048f4676a1875df6a8a61f0fc7c25dd5acd0220798ca70e
-f09a72b19595172afb9085b9a5971ad1b9a3a2508884a3bce88c984f58389620
-95584866c59f89120c7f491cde35b9d179f11db0d3c30370138852050cf14b18
-c06dadc218335bb465dd88304f1c1cd11062ca72649491fdc62d571c082cc816
-261444906d399760159f6b1e6df4b42a7a84750aa61c034b11a6e7eddcdeb54d
-e1f5151042a8e9f6a23a81a235fbc3908a85a6b05d8162bbdf3a672715b6fcce
-554e98df1f4583e03e456469890f07f83bc0a8954fc5edc7898f21f6917d30fa
-36faee98f622ef313cc8431931d83d271cef880dba07b832a01384994e964233
-f2e29de305c3863191f877dfba44214da68bdbfbde1e3b8b9659d7800df5bd19
-28bb1425a51abc317efdda09d29e04ec8b17bd3b78085595120b58fb421916c6
-af4b92776ef8a8211cc376a37566422bf2e2a840be57a357ab9b9adaa20600d5
-c49f228d2f7bb606fcfa867342884fcd426a72ca4c5d09612bbe26a2d9d3c8fe
-15a55e095b6705f2a2f2a00c9f1cbae16b91e13798b96d5ae66b5a8d1cd751cc
-9747bd951a55ec3fcc11f58f8afb40913166ab60a01b697507fe0753d085e5a8
-8153cfcbb70e29b7073ab33f7be2b6bd070ed974d0cfe4d41f7f57f05cef38c4
-251aa826e4a1d37459212c1b411b6b51faa564da0ff48ee6402b3c9fb77d502f
-61feeb32602da2b5fa880c537f60e1394571392c3fba4d110ff47a42d923c153
-f7a83bc1ffe67cd11ff1a763950f2d7b6d9575f45562c3a9de6d4ebf59482d7a
-716f39eca97fd68be71aa73987d570ce2ddf953c6ec97cbb76b147ceb8973564
-7ee159434e3af6588f47ff9722b7e90f4d9fd0c5b9e9f3a14f9bfba60ca6556b
-0473dc073a961731d322161500e15ada373d503552c0b76fc6576088e630cf29
-b9b0c82cb348259edd482520a84965a53cd673138aa57c32e41fcf50fe24a447
-4ed23401f43f5206de7fb3b6d1750223115919d85b54eae8298a19212e5c66e0
-c05c6dd7d7f8dd877123205b7e391a189e11fc30fdc6532fca87770985b357a4
-fbf9c5d261a4c998e2fe8eb96e27dac9daf1d3f0ec7422a85d9c7b241857209c
-f372c03c1100d8ebf3ce4ab3c0efc1f979c5999bac6d4abb6abab1d059c53f7e
-34f972f56df329bdb8485e39cc98cbf20ccb70a2a3cfdad4deb3267578b02f0b
-0340f42bac749465951198d2ea2bf7995852a50b5876597e55e1a1977b9e2f0b
-8a8fb0f03839dcf6bd5542827208d443ed4b9c0145e4522274a02e4420f738e7
-962c6d9fee17520ecf6d6772e5e77d6ed395304699dd65d7a610d793e38ce3dc
-e461843d5af1e27bed5652bb84d5e85622b48bec72e1622ab11506ade702cb2e
-8ca3ffb8add5c2470207bed74f2b34faf8cb61dd5e0bf54f2b8e1c7ea1fee81e
-0e0a16747443630b04990ee1be9db5764a580222b27332072e74a60ab7b789da
-aee741eb538e3ac7e38b333c7f6dadcad5b9383ab433359862dcb30ba53a413b
-5e9947eb637e78eedc4b8b17cec6b82f4cb8d2d71a37921e69d428723823ec95
-0f683a6bfb55d22dfb161e1d6b6db49dacece6e43ad2c51a70e6342a85169fde
-f8060d7da7e20b4db176bb862c29749077d7104bcb313e5c886a01cb16f11f62
-984c5f853516c1419df929d29eaf4490a3aebd24358eac006a594afcb839778f
-d0925e2daabe74c7ddcce9a4f454633b52b445fea99105fb0699485956fc737f
-25625d53dcf0b9e2386bbf0900e0e011e8adfe162d5876a850a6507512690d2d
-d1f00992f4dbbca2c63cd70b16dce15d1c128b9d6881f3f7ffeb68d7174ae769
-3b6f5e02523c7f046de294e18255b689d2ef529e6dfe489956afc909284a4d43
-b0ca1d9f8b9be4e4da535522cd9b6e64841c81138ee358ef6768e7f78af8033a
-6885457da6ba42cb4bdd4f35233b8e5ac02b7d8fbf2092bb8ce890decb6e99ca
-152d2aa56c5ab4179ba7936c74dd6c342a392131fb96c14c3b24d9f0e4d8b1cb
-862ea5e7b13e204c914bf95f55ff32e4308fe5b2949fa454560e8dec474ef52b
-65bbbed017d5eaed0d89a3c86fc63bf01d3a6a10a5fe389b1af013ebcbff2a17
-7f6e854dfec5dbf19d4e977a07a42287a2dbd42a78e589a002cca47eb865bd5e
-601a98bb3a8572f20ef1c0a2b3500f615b1b8f9b04215f91acec454312ec1dce
-08f413b9e2ddddcfd2bd85125dc5a043a45c0b9d3c86ac30b21f34cae2d347a1
-e93586eb95fdd3d1db7157b21b7ed1702d31876a1cfce58d619a66df8ccc3116
-319854a57965fe23d2d2d7e02f4d95d810e8a13d29872274fa6f48b7333b743c
-7af418c1fdaf467acd5483a47c5e99a7bd81e18ef98763ecc08820176a109145
-af183870faf171a3c24f603654896e2d1b0ac6224cfc765bf747e194cd18c740
-6c61fd10b6b7dce9c0a6577a87ae840e88f99cbf1c1d6cc83623d2fe80bd710c
-ec79256f89f26b45f75281d3de9636a134f63e244df4a623c63a895fe66e1464
-1959655f235bd056d65e3a50f55a041447594422eeffacce6af7cc9768f72158
-18ed408e47358ad45fce20e4848cc38f70943755e9233ac711e663f2c7d77b46
-c878e70669ad30ed18b6f832e4d7f54a23c837ed440ae97883348a0b5fe95232
-779187e429b6f855ed7cffccc8d6784d8bcd92548e3257ac87231c36f119ddfb
-f28ab8dc8b253a1fa09f016887fc29b6659b40bf3dd9db6ead8c8c3e504b10f8
-37dac82a816e06722397867df32fa25da0713e92ede9e4d41577ef58ac70b402
-a4427a7c86f7c1d7f378b62db43ca4bc3a8669f6e924d719f18799d1a9e5969d
-76bde4fc976074f2d623721d38e3f5c73428d6824049dea9416a450be02dcb55
-908e37faf4a56a36519311ddb3d1cb66837c2964a2dd0d34a23dde43eb30c88d
-b6ea541956b904db911d009f0b209bfdc139f48878c811ec38a21692f9b866c0
-a59d9d736d429de0db4b0526463d0348157019a262b2c3e0bf54095d06110593
-3646fcd24134d6b3a2a906a891187692967e93f69a54ff3ab8050418585ed1f5
-9822b134f8841589fe146d05ab00c8e22651c43723216c053851a5d1f9bdfaf8
-59c55523acf1e394d27500a1cdd551c773c9a6d7b3882f31f29c281fb6c6250d
-8a1c3c8dd110c1910014da6fd1d57b8ae102b261fb65a3019bd75e81ccebde3f
-3e23764e9a5dbe640ca98585da2a4af9de5a5045598a905ee7b82bbaabdd0d92
-bb5351d3a0b3071e8666fce45202af6000790c1c1d0a5bf0c4623b9815b8d3b7
-7c39970a509db6a4a0fface38a60e2dccab7f5b7ad1c0f42a74da16147589a2d
-3dadde9bb1a63a4047ea20dde1109f8856bb81184f4256994b5005d654e49086
-7bb8396fc8d807ebdefbb74e9894bf0ec793699f0e68263885581a17c87d7082
-371d3d4884b50e1295c517fc56b91ebb6b4c23b150d542cd0768924232a5ac00
-8a98f5ce9adc8dd3e65f085b35640919767237d0f9703cbd691a987a0aa0444a
-5ea0d887837482a7248865cd78b6f665301cb67cceb1f689198821227c1acd81
-3d0a50674832bd33b2672756d5186c89528180e190d1525c3e806caddc1e4157
-46055910cee4f60f40b1065f435be8a39eb454d88f5bc45ba818e5b006e5a38d
-29974f68ee1962448f7a9fd83c7f107c7788eb8975dedee759a2bbca40c811b9
-d857cf8e510376d48abd60567f307d6ec471f99b03cc7b5e8140dc0450af3832
-242a353515b5b347774f32b8b6c033adc43b2bf7185480e47c868308f3906bee
-e44131b11b2b14e77f33686307842337cd1f9695491bbbdf271b5345c44d6a75
-58c59d6d5bf8b24af38248368644e331a88cf73d0eba9dfa6f80f11af0293bb8
-40d9755540afd18fb03e0b26b6432277434166123d80044808f6f1115ca55b87
-60f82520eb81166f8363b150bac7f45983d1f4ea0b503fa8d041261e2fd14caa
-c7db8e5b1bdb04a65cbb660526d8b21eeff68105486474803acc96e7b882bc9f
-5a1d5f1e333b2b2aacf4272a05a41aea04b2c18a82b1c66a40753a3690aef089
-b9fe83dd0d86fb7b7045f041b690928b7b2b67162a1f5564117652fa7899a444
-bccc231189c60ceb72abb4038d7d0ab5a027bea7ee75542416b12a16ee00900c
-db94b2c89b2345d209cd68307e101cd06dbb79e76c725dc7180becca0eab9f8c
-ae1714c57bee7e7f54c84e7a2ab9a2b1ddd4d160cb4825b69c1bf5ee26b18391
-acd6fab3f890d8cbff5ba3666b8d7853652da2bd5db79ad8de358e55a5e02270
-e1a2d09adfed75088a71593ff0f54d5c527518cc767584e4380b8fce58b04ca2
-05a69ee280da655169029a16a3df3b86fc4ab635300397767c7d9ec3b3fbd60a
-bbf51ad4a3cb348539fb9b7eb072ece9afb2b3c00e2b91bb40a82d2ddfa58e9d
-f40699038c9a7bf930a83996afe9580c5338405108ac04fd713bb22ca2024475
-f540fe14290ab1818d9bb19483aba2f39a958ea417ec73792233ab538cb70e0a
-455c6b7e0bc86eab1df73eec1e16a6f95cd23b8f695fd2b919dd282bd1129baa
-93fb68080d90c29776bf27fa42dc0721e380ecf88286484417664e41c5b257ca
-bd4835c1d64318507de5dc2f1060644b2b125f17aff1b95a37b9b667906d48c0
-9fa7d875d59cb6f7fef2e37ec418540f8f13c2d70cbe9566299dfb80c06df99e
-b045dd3baefd87b24316700fa1c9f72157b927052cda3fd2b480df750298d645
-7c412ca39f6325d66c77be38bd8e491d8f710c5f91f432e13f89056940029532
-db065329782579b79d9f6ba60552dbd6a302e628f75e0d3582d25eb03e7deb33
-54790b02521553eb0c286cb415cde225b5d65cb79db060d13afe862d5885b567
-2430481620475f50546ac782370e3ea1c95600a524d288b5d4028be7cfbea855
-528953e607721b7488f7d7f9dd5ad14332b32bbef72240036a3e1646fe5418a7
-1fd206ad3fc75b7dcd9813caf5d29ddbb12d7ff94e37bccd72ba1086dc431b5b
-713ed14ab7e9f1bff7dddfa9bf22624e4caf3cc0d4194f0b6a36b1c67e43f117
-4bb23054ed01209d28bc55224028648a4a3073d56835afa9e004fb999372f29a
-d76db663c2a29b5638567058904a4933be88e75ca1f365739a65c27bdc195e7e
-09cfb2426fa829ca3859306b556d1bfadb5d9493c66e34dd7f63583e4532a075
-532cee2d8976f785d7909093787e8aa5fc7912ca8fa89d346634ef71f98c9fa3
-cdfd931ccc699caa314c402ebcd6bbcfcd3ef7ede19e6c8b5ea9bbe73ae35b72
-e214974b2bbb26a115750327d20732b6f6795c25e4c0b1a63b5054383d428d2b
-85ac1f719ce35a18de6f4753cb615aec6212a272d89b3750863536fcf5f791db
-3b7b39a66ebbe9fb1876bb089ec2cba092d291aac88f09c720aac4dd8fdc22d6
-4367c4c5330d4e0ed7d454728af2b4801618edada4fa3e5357fb91458dc13288
-7650401bbca16d73bea8cd5127797f92c8b5314663e02cefabd1edd89e4486ba
-4d371138ea6a07ce358d31bc9ecae64f409546e9101fff7ec710b45f910510aa
-b51eb2374992009a28262a370d42109a0aa5ebbc16d2ec5d58e0a5e7e6f80a02
-5cf8a581f3bbf98752edf64feba585fbeb56b27a79384a22c868693c05084423
-f7cd396cb48e68f76bab6512f76da2772f3d137881ebaf1d3ca6e1c98d54732a
-fc24bfe29efcd703c489dd8dcc69da4b86b5650788bfeab8bf66c5c1df7697af
-ab33d0c14caf16b9810ea74c32ccb5bbac2613c6a3d946436ccf934a20b81cfe
-5e712765d1983bd77cc45612a31c893a5583238c944f91f2d6d1069386621108
-108b0e65b4f6d76bfd0e1158005e8ba53ab48e865e9f6d07835d4e9e124b01b6
-41baaa6cff413e7ef8eed73f1cccaef55a87d71afb309ba162d3e15dda6f04da
-2de8db583beabac1e5680df43bc063095de043b2ad4c8600ef63a8090b64785e
-5288892b63a87d8c805d1000b6524109a41e05e517e07f0a76466125650b3d97
-008057de3d3380b0c352e70ac04fcc21108e619a707fbf7f59869cc9a2d571c9
-f77114250c1c41dcd527323edb2fb883dabf371dccf42389a260fbf53464bd24
-d5ae5be48163f142733b205e110d77de5cc07117d7d6d347cc8b035fa387b249
-fde3beeeac843c89bbb871114f5313437a784c051e021da4f80adb2d5e392f0e
-46068df67f46afeca052378d97597f21c39db6a2ca7c10c57421499da8d5bdec
-128109432f86a0ce63ca2be7fd64e29e8392bdd0013d4990884f7cf49e7b88ad
-846af39a3aa1ec3c85f21db07952d1b45cfc20d6848536b63d2572f44ff718ad
-c2cfacaf395cc64b34290bf19a19d756b38142c6a7471ab436c6b81abed86fbf
-8553dd8d5a052f4d53d6124ea4ddf235f4a792f8aa485fb068d39c682eda37c3
-2fcc58da51f74c24bac8db5cf825407f88daba78f41d8ba078fceb0236c2deff
-e61cc0abbdbec3bfa099b49cd1218dbff85cc705730ea545cdff4421ee5a5355
-9ccea2cf6257b757e4c6b853a476f0c97ece80a41fee4994b05eec575f87bba6
-9066eceb28ac92e1f4483f8744ede06a05ea038565096458785453b2462d103f
-300aff3783f7a2ee1a27cb223e7145b6b74fb5a95a5445b5800d0b7e4451be83
-8a7679e3a29c9bd79be0ce900f8cede4f5fbfcf46b6354268087bb020914f246
-fe06d18cc7e9cb1003bc96fb5961043d919c9298e61dc5c7cb39886e65939fc9
-037e0484b62d1ee35842b3ddb879a7fe175f07451c4456361bb646e5dd87ad6d
-ded8388fa78806f8c993bf16f539a4526503d8baf83d1f0a594db7fb1a11e7da
-d2f9db98c5d8206ea4a44ed134d784b05ac0ca245b2a5adbd93efa4a566e93c4
-84fac7ef0ad46254101b308dc4e39c549942af85c96a5dd31e5d9a99149f49ff
-99cfc5783d2cf9c320640a5029bbd61c86d4a6ae9fee690c5ac5e92d6b07aea0
-31c6110df41e63bd7039d6ba8ea9ef33beb3cdb415f4497245606963da60194a
-8383663ba3f3be2d6e0b4865ddddb484f625beb57eadfc694125ee35480efadd
-70248037bf40187f54cb53a51fd0a916d0b1a54311f43cb39856b5e4e17ddf0e
-54466ad34cdbed8fee17c87f00bfe4832eea2acaf9e93aa5091b62febfba9b01
-5960618d7135ad546cf4d00c8c725c6da697406891b75361c81cfc2d13a03836
-8f2bc045495a1d24628606990f351b6f6f197ec7b52169495bc0047335c4a3d6
-1a7aaa63fba1aca730ba1fa90ca04a0fab27b145b2dd0b4c03f01c79bb77758b
-fa630d02a5200c48499964fdac705d1f6b0aaddc58b47a35077f5ee2fbcab957
-919e5bf614a1468207592bfc36bdd62ea9389142350d0835243f485c99a49ee0
-b6fce33e9f1ca586f704d27c59621206abe70ac31608ca67a512dd60f07510cc
-e0ab7715f3a662f824a011ec47e60f84664e474a255712aad0bbb1c7c1488a49
-0a75447e9feaba451fcd1106d7da535ad82757494620a195b2f0b1622c62351d
-89b62f4f9bb812fed256952928d864147176ff0e03bdd2ba75977cbd0b5ec371
-4478c47d97601280566d937243a0c8b0b33450773897ed5535bea6d7eafd5413
-5c4a4976ee0153f4eb913aed8a1497b743e5e1ace625936b3da74119b49bb536
-1a6fefc0eb959394bd745cea919b1e62c8cac77754c59b725a26c606a7c5b3c1
-45fa3e24e5fd96e230497a0178f21cdd53c733a6bf29605879f61cd4b7ad1117
-1412b03ef42e4f8261df1544138958b3e96ac45e3a45c1bbd0a6d3f1fc4df057
-d0013bd3dea861453e54eb4721124ee277fa0eed1bdb6ca37e30dff04e91b88f
-308edd43cb7dd7e9722e57dcc7f3633209505409a1f98a133874895e00b32c01
-85baefdb0b4e97f75488ea0f76424d9196a2437fc9f67fe2933ff34232768eac
-722a84a7fc52fdf3ad248c69fd7d4c45fc33ffc6a04b562ce367d96b03c0ff8d
-75174dbdc09bdb35a9f4840a6adc555f42d20bf5e2d3da34a991f63648ebe86f
-3e155514afb82c1b3e37fcdcf8c594acf65fdfcf5965f42cb35543ffb1a1e40f
-622e6ed20b4979a37835cf08e40b8bcb015db8eb1a044dced8f6bf6360d0fa20
-e656d90efbf461da451852f58439db9281f60edf5de4af016f8715eee83eb666
-d48784d39764e33008e5d9195ef62439f3af1b989bd952fe0a0d30a85708bb1b
-a353efd6594a3ca201115b3659dc1a80619f155c6649f944dfa3e543971f8dd2
-b0a30afe77658ab82e630bcd4fcc33af8810da1360730055255aacc77fbe09dd
-9b13d44a41e0a1d3789d94bd78494a33ae60b9ad7290e4d1ed6924820140e2a8
-ae5137fe7c2570af124263b99d11ece45cf80a6e11f56dc6d77e50fab50608fa
-09eb1520f22ec16571e92a193f1699f81e352bcd9e0c838a8c1d5bfe80d76957
-7129c9c46fda7235dcc34f604171a75f069f9e00adf56e84ab1f74f093bb6995
-743f9e027fc4d9e6bcd647b2ec7f0d7af2e2efd2dbbb68c83ceb1c760fa71ed5
-0394d38963fdcbf3891934a4cbdab80107778a63f1101017becd233ba0c2e602
-e9075c5e509f2ace7b7d5c346dfb58d0ba3e005e38ea7428dfd0100b7e1fddb2
-7fe8cca96b04f9b349693acba904d44e143e03e82d16158beb36dfa21f57a039
-d6bb9bdd1a787fb9df968004388f8655e9d8b6f435117836bc910697aa1737d0
-55c73fcf23f8b56b58b09195b7cbff574a2418b1ab9f74dc607066fcb798b880
-5fb0d761cd5cca51f9ff0d2e67cabdb026f2a9b292fa472b97ab89af60cba974
-71fdef1417b14e6ff5440867aced2ff9837c1cd1e1aea23bc3cf3444e35f7cb5
-97c2f8d5576ffeaa83e06a9e6383e9225ffe0db4b1575e1f87f28b373716b668
-4f3e9e694d6d56495d21673d165cfae5c6ca112d16a40247216da4debabb7e8d
-34fcb858707d82cb8868dcd8e956d1ddf8bbf6cd57c293f8e3427f14c99e910d
-a7bef26c09e31ca66550496574c0c8f70e7efc9f74bb45fb1ff13b31d8982b44
-038c1218b874ac95ab907d01bca78f00fdec53773064be453a82efa3ce336c46
-69345e172763413f021d75570ddb0a16c806e444d8b9895af997ee7425d2ae29
-1d57d9aa91a5d9e992a7275381ac332a2396900e4d821f69a349d48a5197f98f
-3534ab2a47926edacfc5281c09ea8ddff7ccbdec5b95857c9b2d82829376bec9
-79a6ed53c42f6be0c80a9fe6b90c06624a29adc0e268241e145b18dea609cf8e
-e79720d031691f5912c7b4c1fd4358a6ed07abe23973f5b296ea3e36d8081d64
-50835e84fe95a56764117785baf8b08ac40dcf7453f4c67100445ea6a77ab755
-e3b4882dd0a9d74332f72322d36ab9dbf2199028eb6c6d0f43e79065e0fa47a7
-68bfe8609fe6ad82e7a1fadbe827d86ab6f3db8d0650c31e80c7b5ae24c703da
-104ebb4cbf0d63b0248ac1c47a8ef14a095d902bb390c48760ba7da6fe56fb44
-df02ee166b522a550efab2006e814f4053d0f21f3ee790ca6d17e8ea5ae31083
-5889c2ca6b3fcd267131d33f3f71bbaa5d414479fd6c9e84ae481defa4eacf99
-93a6fe4ff57f5e09fb99b8fce71b958080971e61bf0ccbdd2a86448782aa9871
-0cb686013548fb3f691436501545d2ddb46a3424b643590da9b3069d76eefeda
-946b6ae4a531f7d8b3bf98ab35d37ca5b36729548c06d230b597ab2cfd12dd01
-7fd2398830db4b4f2dd298e945659a564470b22656e28a2defb63714b5dcec1a
-5cca4f9f3a07077c87c06bcc145edea8424d9f44ef8e73fa98fd216cf3fd8408
-52ec5988a7749f0d6923f6c0ef50e9b2a7a61c006316b49c51a0127004566d81
-066e7f1ed02f5f570cef07df070ee98d836ad6048fa77c8888dadea64b72d4ef
-1404634b59cb590e5113d384e43ddcea459dec60c3f1cbec10e33100bc7eb8bc
-7e339177105ad6a478ed9e096477601347e97c3916a3981920b16bf4d64d8fb8
-694341db499b9ca3cf34e140d7db4d6c5c291f100c2d419752e89ba7fac3e8f7
-5b4a63616197bcacae3e0170b7467670f67acd1acab2e0502f02f416b851a5cf
-6f83c3cd9992dc925b388cf75b423edf1d5d234a341adf12cff88bec1da95ad5
-dcff92b3cca7418cc86ab1f1969ea85824d243bc5cf4fafd8f426556dd9017ee
-0242046f909acaed3ff2a91564303d13c8df20ff52e25e60cb7168902daac679
-b794ef58e0ec9a5b5a97a1143b09157c97f9946d98077de28e8908b84f73a018
-e0c3bc6f4a6ee088edde6f1e0f568799d86765d843965381467a99c8b91632e5
-eed53fdeb8673bd6c9b3757773febbf86ee428d4b386985e810db8124f5bf974
-df99afad632f03e338642c9312787ac47a9d2f4a10fc5399b6ae9029a0336d89
-2aabb090e581b749473ff20815277881f985146a028f6dfb0acd19954a0bdbb8
-b4ed1a65d3b9866dac29c6aa8aed39d956433ba649f283aaea848f6cf8f96268
-cc669613981e4705d9220970608e67028de79d0b3668b4a3db70f61c9fc01078
-37ec51eab70d92a017d96cd8893eccbe23081dafeaf81ca2c9d45d38cf554c84
-99a6b479ebfbd96be8f7f4599b10dd45b4ac860ea6aa410f161df2b33c08586d
-87218a790509800164b41e3cd0a7d30d9584813c42fe3935ee56c6f22cde9fd4
-05615ab2abac9dfcac550140c4540d6dff9ed67f530570744d0be3e56041e1d8
-ceb5a6925b3bc52c206f6dd87f2c4de70ec19487d2ddaf20ef6b26fcd60631ba
-b1677d0ab695dd68b2a3b27a70b0b48fcc872991bd0b9688a966e72239b58d3b
-2e58862eb4db390e169100e539c238299449bda356a0968c866ba0e0bf3b88f7
-6cfd39fe10ae30eb6ca7149b41e412cf556969b4c816a1945c0878e2a79e7ece
-7e52754c8dfa755d79fb15e5576a8846307527460b6d9182154e23b84ea9d443
-7fcbb470e9833d2f3f90aa88d0e44b175a9358ad0d846ae6744c4b69a5e24692
-eb37b5b9678729be88cb9f84d2773ba99b29ad2056420328116840ccb475ab76
-27bc7efd2dbe6dcdf596e94c09aa959f2d43d48a80ce2faa7c30be324d18b8f8
-70f77be72199e931d5d5f3acf48ff8060e168b48d066b2354fea58713c1a5367
-330c9491fdb6fe9654a8fd66803fdb1990bcf5bf2d8665980d162f1be17663f6
-857563371b1056144cf54ad30f1fae5707f7bbe87fae41d2c683e8a02931de24
-29e66f35188ff3594f37f7ec5021e8ccf00248be459f80ef9a46d0344e153789
-69729194731a49135ae771aac663c0037db67200c9677bf1f39abbbc54802741
-23d36a35f128c1c35dfac1a29a9c1a488f6d7df23933488c858667bfe24948db
-86bd0087f94b0c6325a403de4a434bf767c137f248c85257a72e39b51351d401
-8b530913ea8be8bfbeb039233bc3432db0b61aa281a0ce2f01b0399b066fde7e
-abcafdd46c4d6bcf2924de2ed3972c01ae0213dc1553928895c2b541b1b254e7
-a1ae46069a110c55de12f66358815cfb07cf0de59865be85f1a8f2b61d0ebae2
-7d341bdc37eab342af148a05d0fa415b86cda706746c75e0fb71a610e455a64a
-d8515705ec8d265f3e4ed9c0203744c86a1fe55ff52b6c8f4ba71e0a26651cd5
-fc38d93b2370b1e38c29343c96dd9b3d4a39b78f7bc7f2eed735f46bb46f96b1
-becbcaa7cd99ef23d16bcb3f38a605dbb908b28b1039d2ea1fc5d7afc11f1aa3
-798b407ec236421ccca18fc1f27a12d7e0b253039827104461c51ccb2283c9e2
-6fcb819b656a1aaf1b29821bcecc50b911d1a05330c43a0c6025ec90dc134042
-77ad9424c2d2e642a1223dc74ff16f70b54c0ff578157f0c701279facaeb2563
-cb3855872d3933c0a7be7b633e7e3ef053e1213e4cd7e1c57804eccd8026e581
-beb4c2fc59cacb4c1e7696d165316d7f3391ede443873c7ac48277e47eebc64e
-3023d06ffccb05a1a71b64b7da4ce1b6256c4970b179c91e1b5d6ade81c151d4
-dc3cccff1d6ebd118285d56ff7631f2c7e2b89cd70b2ef7a3894366fd177c06a
-39e3971747f671898a0109008e3190b0aef909597ffe91d7c7c2069b5680298e
-eee7c04e58cd328c1bafac2a8bcb63f6d9a6a56f29f3551ce1d2512b5885d1b7
-8397e464b5f81f4803eebfc0cc632fb653f52fc7ebe2f64ab5ce16e840bd0577
-cdfa24a928e2888ef6171e43aedaf88616344cd64b3a2c0873dbbf8eb1fdc08c
-cd86f324775672bc550241d139bdeca9e6ee36d49fbb117eb5eb456d99258067
-94ba27cc50585d2544b2f1f16c19ba41b0cb308c4f50039a843e66b20e04db1e
-b0e99faa3556d8e95f4526f0a105d4b761df415148051c604077ce2025732152
-e6db72d810bb8d81c733ba78c0deb8799abaa20d3d77152b2dd109d70efb2bdd
-7f17c1b79bcecf6b30cf0f852ac61197e0f601d2602205bc37708fb4306a782b
-1f2a39bb03554a1d10100221f99ccb45b538bf2a94ddf8c4e0b10c62f4af712c
-a44387b0038bf2474dbd2242c735db0d79246d73a43137d535eee525502ee440
-9021ae2414e9f443740cdacdaabcfaa0084a60ac34303dd559269eb088e2925c
-632bdaae44dae0ae57f3080be448c56aa549b620d1729b6cc2974e571a5697b0
-4ff3e6f6542c4fcb2abc9261d97d6e6e60538d69b36c8189491a978a7d00b9b6
-3e62a1f51d6002e12d0604d53af0188e565ceec8ba572bfde122249dacc9d9d7
-75047c69ef0485adf9f0dcec0f0c926ab91b551ebd9b8f4aa03817c25ca92395
-518304be94b5d56bbdb833cee92c32b792c6a31f37448b319880e4cac35d2edf
-dff530d0f7773e5148d41ae56e02633781cb2abb15ec2d94ae52d3c8fcfd3097
-45d95f67b560165f57393a42fc7474b5284c7cc0b893f84f8733768264ffa8dd
-0bed83d99c035bd1a83597f0d614797c583ec8c5b96b9739f304edfe1e00ab42
-38f353a82e7c71d74877d8519add9b8c78f611174599512f11c22c10cb360307
-b262f1f78c7f9a85f1fd21e94d72abd413650ea6a69b057e021ada9787d06185
-c57c0947f9a2a81822054e855f802160649e25ddc82969d94c052c289f35bb57
-c77de5dfc63716c5b0a87bc7ed859663c457f080089e3d729b9bb1299050788a
-79ada19db21011b01a47b278615be5359e71ecec7c06a67c4943e6106e152824
-ccb1fd39c485e90efebb1b2192d93c8bc52e356e51e5fc805cd7e43543e9c500
-d0ac85b7230350f9f403340a16bbdbbc3bdf0f7a571aaec4d6fdbecb288c210f
-b7c244f1908305a0b1632a8123001175e36124b543ff92c16576d373b9bdece7
-67889128ffa3497ff846f8befaf5de3b7c339f049adc9116c9a7bb8bae435798
-08dca2d9c151d9329c345919930e8437054501bba38c2bd5102a20e4291203f6
-eece2f70bff3df08aeb8ddf1806e9657ee4a5e3fd5a8fd979d90d45734f14f71
-5d339ac91b7fa18a17be81583c08544a8a32729c17975014d629b139c0b3c236
-bc9a99231ffb339b7761a2586eac564be734ef37992cec6c06c2c93de2b340fb
-3a27a52dabe69d9178d9a544430cff229335edd6f817bc52c690917fbf322852
-d4a7a709a593704568cf142b45eff164d817880cc93782c223247c65fa99aca3
-5c66a26093f9ffbc25ca9b3cf6b8ba478695c68212e80e3868a0db1a1c84bcdc
-df05fe054733a1b794ed1cc483a57b97ca2e97fcb1ceb9cc2ae7d5e0e064cc8e
-01cc628180359749622ac1cfbb57d51b25974ecb15dc83f99dbfba2d779adaf9
-6a9307bf3faef5d2ba5135a15d13c4215570e772376a4a4a3a5ec4028ef11004
-b93acaf38128de94531c23f114fec41cb2e2027e8ee138aef6ad017f5d97a600
-1063be706b65da0eda2234e7e9a9c27c084c4564b362ffa93ec9127cbc9366ce
-7b74805943c9961be5a5b5ec87675b02f756af1b70074d03374ae931cff31757
-4145af416a9098bba84ed2d3ed44019257c0f34e7f94dbd10fd04fd15ffd1b64
-f65b2c02e581175436150a074de43f8e11fbc56e806486665cedbcf387504d6f
-0687a13d668c69dddbc37adf91ad0091a770ee23850ae2fcbd6b9de9d8a8c8b8
-eccde66b7122c7b9602dbd0f6b7f7e4890933451c7a3904382d7801bcd992f76
-4cd41d74bc8723eba2647db7f813b465d11052e0f4ef593049942915c614ede3
-4f8f2b77bedec635eb3461d66cbfd4be1689a839b1feaa41c0f0fa23669806bb
-52fea1fa5ab524a447ef3cfea4583a7790baa418ff8917388daadc5a3d1a9fcc
-7f4a826c912eba5d4b82d4c29b639d56532b37ee9aed6bf06137a3af899c70a1
-ce4c9940e6ea87b6e274696c4a15d6aa3c17f9334aa84fcf1edb48e306640e57
-892b25e67c6f87e4e4cdf1a9cf12f69c0028b5fb768e839e1b8f75f3ab2d9763
-6e1be8c5a73bfa8675853695ee32887dd6df5f03f88e637d45f752d22f6c76b3
-71b9a514078c3200ddd2e998f33f1ae5c0a5fdc932f7c4727512caec232a681f
-bbdec1a919bddaebf5efbd06869bcfe0637b72cefaac13f915f25cd3a926c0a5
-4875435ee6a413e2554fe4ecfcb96c1b5d8719e84dd34939dfd7795eedecbceb
-786df32b6360bffed553a74b444a35e0ab0517cf7aa9c4e420e5bea4a5aac950
-54cfb55d1a1e57b58b8fb382e8ea2acbfb9b43d1ab67e0c1450ed3091758c1b3
-8155fd6996500a55fa5d134f17e55978d930425e0c03748364c46d3bef68a390
-649e09e48c2fab92108eef8603c70a977a388d4d24971296aaabcb932bc96033
-f648a6ada265aca938a6512f456fdc194f7186808deb3c16769d3faa850f78fb
-58610c776c2ef3f208404def2940e484a801cdc45aeac88fa9852d1319159340
-3478b1b7f204ff297b67bddf1d38e256f864d3a83d6919ca7db1bbb1f5b8f6e7
-8ba272d1fb28d760618dac6f5633b9481645c9b8eb3a3384518103cc68aceb05
-5a91dd8def04b49d363b0c6daf63aef5d85b1e79504c23b3bb50a4b7194838d6
-b417b0ccbcd95a46834f9bbb2ac30fb2d9b9c31cf4b608e1379399a95f8dfa94
-53998a743c5a5bf33ed1e10177dc4a2a347f5fa4d09470cb5d71b07bf459c800
-0119a2164b143f03fce36c19384a01cec5b9080491b82b9ff115f795d969f480
-b7232d0375a9d46faff31fecc9351b42923e9ab6207d2723915d7843db279505
-280d70d9c80a1821a257aec764b7e85a1e8da7c40d42a0f77385ea66a7643435
-e20af708470f645046bbeac12d840fe3260ce75e20563014d9e2ebdaa57ef06c
-0ddb55fdf6ec3e064312d13e25299b153169788e8a4decc095eb37eaf8e8ce2c
-cd7174f44ee8f3875c5a3de3c7ce22296e99c44628f52cd3d18eb9215c34e563
-0ba85b5fcf3a211021a19945510c7e39ab56d977f74fd50ba8a70def82fa6777
-6930390700b4636330a998b535126d610e8a1cb63f618d69896fb47576857f5f
-8926ddb4833966695a26402aecc48bbcadc04c2833afcedeee14254a9e77603a
-5bb7b9de3c97007901143a7901c00b77a13e72940a6507a76164989e71d91eb2
-3080c585be2f8734909fa1efa7fc6a2464d95e4c5051fb8d6065a7d9a453cbdd
-033626544b72108e4c4c087b4e4dd972893371ba7b8e8291ea4f98d03c61ce6d
-d56734f17a66697f2260af9b3f8b9a36717b490e1ce649d839a66133da7742d2
-dbcaa22ff915fcadffa0383cf34c2290fa42fe23128e29e7bb1c59e55b7ac347
-fe66481f485d7bd09f55cb51d208d0765a510d5f6958fcd3ff5a5ed27d06a02a
-f7ecadce4b4ac5f1d0210c5637f07382193d77945e249d2c4973aa43dea41dc0
-51cd72643bda4f749dd5846a9d3a7346d39f78eaad738d2d255df0f0cab5fb10
-96a0ac86bb013980dedfc84ddfef081700fc3c66b6d5a125c9e83df17d92658c
-10d79a8aaa222004c20aaae6128132c64f96a7a7c869489a63860c15d53f958b
-d6fb81cd165bf253d996c15295f7c2fc52c13b51aded1c774cb35a0ab258bca3
-ab438786ff7e648f42ab568fdd9cd598c52b5748b0c44458d4e0b8080ad19cbc
-55d8aa1a78cafed7bd41a864488d8ab0bc12f6689027c65c70a2b26bd2590026
-3e80ba6189672adfe377e9fb516cc6bbb0f2e341dc9e2f34a8bb00b4079ea28f
-7c8138c415306e00bdd8e71176faf06fac92e38e8e15dc6ec6cdb389d1a15310
-ca67408a9686f21bf6fbbfa7ce032974e2b860a3a72561508bcf22ede4122185
-b83532444134af2bac5ced1932c9cc06b70160d0cefc8f76ed1108b629e81060
-ce6c30e0bc9ac232fef7ab1c99e21792921bddc20f2afd3b083dba29641458a1
-1ba80613610b01543d336ebc45ae15c276c9ff18fecdc0cde3be18e044497217
-b9a812d926538fc42871f439282c1717833170bdbffbd7e2034d794eee9177ed
-28045b2dc45959426e35d30fde
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-cleartomark
-%%EndResource
-/F130_0 /VXAMRV+NimbusRomNo9L-Regu 1 1
-[ /.notdef/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash
- /ogonek/ring/.notdef/breve/minus/.notdef/Zcaron/zcaron
- /caron/dotlessi/dotlessj/ff/ffi/ffl/notequal/infinity
- /lessequal/greaterequal/partialdiff/summation/product/pi/grave/quotesingle
- /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright
- /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash
- /zero/one/two/three/four/five/six/seven
- /eight/nine/colon/semicolon/less/equal/greater/question
- /at/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/bracketleft/backslash/bracketright/asciicircum/underscore
- /quoteleft/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/braceleft/bar/braceright/asciitilde/.notdef
- /Euro/integral/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl
- /circumflex/perthousand/Scaron/guilsinglleft/OE/Omega/radical/approxequal
- /.notdef/.notdef/.notdef/quotedblleft/quotedblright/bullet/endash/emdash
- /tilde/trademark/scaron/guilsinglright/oe/Delta/lozenge/Ydieresis
- /.notdef/exclamdown/cent/sterling/currency/yen/brokenbar/section
- /dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron
- /degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered
- /cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown
- /Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla
- /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis
- /Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply
- /Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls
- /agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla
- /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis
- /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide
- /oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]
-pdfMakeFont
-%%BeginResource: font MFECUR+NimbusMonL-Regu
-%!PS-AdobeFont-1.0: NimbusMonL-Regu 1.05
-%%CreationDate: Wed Dec 22 1999
-% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development
-% (URW)++,Copyright 1999 by (URW)++ Design & Development
-% See the file COPYING (GNU General Public License) for license conditions.
-% As a special exception, permission is granted to include this font
-% program in a Postscript or PDF file that consists of a document that
-% contains text to be displayed or printed using this font, regardless
-% of the conditions or license applying to the document itself.
-12 dict begin
-/FontInfo 10 dict dup begin
-/version (1.05) readonly def
-/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file COPYING (GNU General Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def
-/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def
-/FullName (Nimbus Mono L Regular) readonly def
-/FamilyName (Nimbus Mono L) readonly def
-/Weight (Regular) readonly def
-/ItalicAngle 0.0 def
-/isFixedPitch false def
-/UnderlinePosition -100 def
-/UnderlineThickness 50 def
-end readonly def
-/FontName /MFECUR+NimbusMonL-Regu def
-/PaintType 0 def
-/WMode 0 def
-/FontBBox {-12 -237 650 811} readonly def
-/FontType 1 def
-/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
-/Encoding StandardEncoding def
-currentdict end
-currentfile eexec
-d9d66f633b846a989b9974b0179fc6cc445bc2c03103c68570a7b354a4a280ae
-6fbf7f9888e039ab60fcaf852eb4ce3afeb979d5ea70fde44a2ae5c8c0166c27
-bf9665eea11c7d2329c1a211dd26bb372be5822f5ea70d99eb578c7befd44cdf
-045a363056e5e1cc51525ea6fc061dcebb337208eff729802376a2801424f670
-0e7e6397b28f15bc10b40012b0a3eaeb2693e8f7f627c4c9c7c6c5bff105c1e4
-1b2b9e8f09253b76040d268b80719e1b3f5a55ab7b89290699b50c1bf1baeffe
-1f57be7b5ea025241a248a6d4cfa5067a1da6eba4cfc940599ba3f3c934d7248
-b8e4ac5816f0d2ce8b3c4193ce39d19fffdb75254573173cb51ccd83c2f2d06b
-2483cf9b07b21ec6f502f028c273887bb06dae2afac10e9fd3c7cf51bca7b277
-b706e425302dc78975ac0e43b87073257a5cd7424b6865fca89d886e8f95c4f6
-d457623dbbc0d16bafeb4c649f5d72b09b18502eeab687e915e9b536a361b4f1
-44c3cd4cc683b5f05a4ecb4823a5eb5179bb7eee8b76c21b2491a97808f6318b
-585b0bad98f42fb4a755bcb74cd354f794c8bea5b90fb9681bd5849d45247e39
-930c882490230e1662d39cca875bffeac3e79a78de6e1298abe9817ae98675c4
-16220ad0d3a36580ee2f2a17aaa1246c416d58a4c52fbb26aaf3b6f75833af8e
-3aa996218dafa571fbc7cad90ece9c883c813d8f168c5e86bbfa0f0a5cb36e35
-2de4caa0f8d3227f72c5056bfb5bca6bf9c60e037a0e44670a8d3cbc9a19f379
-ca8db30b711f518a8c7569211ac70c46eed2af62a37f238bd0bd12d60332e673
-c6e784b3eba3f2e71e9993b97e8a38f85048937e958f1cd8fc6e661048546135
-56b810fa1ff611b96495081c04542df7fef085dec619dc8c84cc57683d212813
-9d14728aa32723e1d15f2af8f03422cfafd8ea4c92dabfe00e6110bca39fc555
-bc066ef848e437b50688daf26d001aed7e74605ddf9c0ed36be45455aef92689
-8cf32baf2418e02118593f54fe1857807bfa0b93b5cdccd81d28bede22cda6ee
-2e32422c1e8da8866e526300f9059e85ca54122ecbffdc011460913e0d28f7f5
-fbc9d7f9f6934b3d8efc1a91cba4128f6bbc5eb55e5e7b73647bff70662bafbb
-145cfa65df3db858bc3fc577b1bd8bc74fb8a61bfa71b8304aeeb36d8efe12fa
-6f5eee0eae0830e5177dc745250fc362f78231fc3ac9864559dba92dda2feb96
-2629293435bf4a89f913fd15702cf325981ca3a08b327f7ee35794a9e88326e0
-24559b547fc6da61b7a3b9357f72c767baa9c79c4e7b77f70ec01ac0b8596425
-5f7346dc8cedc702d3d57b09ef89cdd33756619af59acb9d17a3abeaa6c65218
-6d6855348a1095746b34af15df313091c59e5bf9e79b156cd7903c1c42e115e9
-c5203037c808bd295195e074fc4a46fbb1ff01c814878f0c177f552bdc9bb698
-349d73aec17997374ec90b69293a064442141a44c6fe8e3c283c02a4655c579b
-f21b53d1fd37996c682745600785c7b52c4eeb47fa5fd640739e1f09d5c5dd2b
-b7515a4cce0a21281d315563895972bee88bbc7401be9e20cb160b6bc81ed469
-6d66169bdc648aaae8a9495b072911cc814c19d53b95de0071e3a439d3c09c3c
-1cd422c605740a8939487e26bb9233d4cdefcca49bbeb1b913570a51b2f96d30
-2ef8913c6bb60b54f7ea4b8ca16ad3b4194dcba28439eb31a9443caf061c4d88
-c22cec8d9d8d85d7aa225fd64bfae7376abd40f822ba1ecc9339e09403195752
-fc03a5c4742ad93064d975906ed63acb495aae324403d3bca118179e10256543
-1bc84d47e0c016234eec0c52255ae783417941cc884efadb63f8269876f00a8e
-1e1f19eafffa00453203a0752750f8c876aaf87826baf77b81d336ffc29249c9
-a6a44f40381294447840632ee59a3c4530391f35da45c16a001f793782be488b
-5e01d7f75dbd53fb31f956f16202d3d94a300866814ba44c79764cc25acb57f2
-333dfcf3d97a98fca949b1da71ab27885183d8baafc9bc743143f2f1002ad752
-1e55d207de23e97d1760cd918a55148e37e05f6347e8cc299eed28d7319abcdf
-a4a279d5f64cc2151f91a0be9e8382a35b535a6b5f41f3708169881c243391c6
-67d9121ba21f6bb22be1ec9933d9af1dde9693d7704c1141ce2b977ff5181299
-6a57f7806814440a28b1dfb62c4dedb82f0ebaabef3367bebcd43246d54d8eb6
-7af07b164374998f06a0b7e271ad6ea974698a806002374d270c6dd5c9dfd5db
-e056fe1b3d58482a0cc98d4d5603c59ec2e13b446023692b9ac2dd7cf767d2dc
-a7c62bb3578847085cab79f139bd312cb07ce13e38c3fb8f695bcf4021c282b0
-9b20ba67f378cbb8832751b8f3eed370a572139431b9187893b592529fb1b6c5
-19f51798bce9e56ca50185d42fbd85819c3a1153d65997511b19acf87e69c07d
-2ca1a7401c2b23f99c19f95da0df136472f9fb574b21aebbf0c2f892b9260001
-9a9173f108e72c3eb4a93719293e8be026b833cd709c7c05c1a2e7250cad2586
-ca70fb7d927e36a2e4a6f34e754c8dd8ea2571cd82054700d386cdf3420f37bc
-b6a70b9a92e46cebee13f6641c67bc40979f9b86e052164612d3dce7be67fa71
-b26ee9f425b54b3577cb4acf3dad02f2e55d2986dea88a5a1955b78c0cd5decd
-213c55c9c57183a7dd5832d49ee81724a19abb7da0779f1aa6a77d5d31434a09
-c6f53b7e27123dac042f58dc27653d940358bb8100b416b920aee20672559f62
-8b20c687d77ff83cca449e94fcf4f06614fc539802340619e3a791a18581ffb6
-9bb5961d1e70e55615cce5c9e1466d77435e486f15175cf87fff65e58127b5c3
-024b93c1c296aab24f29483aeba00736ed30be5bb5284d7afc43294b927bec1b
-86814a5ac25a3b9cd1f25c813cae791f937375e013159624a360955a58e8fa94
-e49593a97150702c71dd8dbfc3774094df930414ffc68cbd4b4a25041cb3b657
-a54c9bf780142d2586eb5dd9ecc1eb5ea69245d5d9c2af868974ae5d46e3a544
-74e96780ae66023778659d9a45853c24da18dd5ca0489ccceff253b009c06cf5
-826adbd0e8fcf23edd75c3d3de8a4c789a895e06d20606e4f8e3c1bd77976e71
-de409203ef1342bdbf2c11bbab4af5a709f0462aa8fa3a02cbed6f23fb4d5e3d
-1751acbd41eecd8571518a9e13889c221ba5568cadf730f9da026fb38e30a25e
-87ef6a13484d6ee31c174bfa4b80cc38134d7b18c85c83b4f14d3c7b0a0b7069
-7baa1a397252ac47b67306e45d64061535d05540c86b9599df909e105bb55100
-3a0271c25bc5d596da2a446e35c019b5dead7b289614bd5085d49ecd0464b494
-cd1ab564a93ac9cbf438fa558bbef71c2fe003573a03979a10fe8bd54a053724
-a529f46ffe55cec8d6bbaf1f57d16185595c82a1ef42e3c81cbc55bf50587630
-404b2090df6d9d25468c1eb7a4b2b3da7f5b718157ef8b5f23af088301e46411
-b51e6e0d464096ce22bbc2028488d9af49792b4a17cbbba8ace8fc51e1de01b0
-97e6db05466bf66978305642b6790c08e59a7055f9442cc2cfc23095df2c27ea
-decc1ba54d6b81ecc873a9c71796a1ece75765b878d12e4da9e19d026ac44dfa
-2dc7e540506546aac70e7b82ae7fa98bf36549f4d540fffd53abaf7ed9044ca5
-6b4e9044a2b23c3e7c70152e96f4e64f6b1918946789d4f703675f3dd6e8e5a8
-f0add5f7e442c35cc782c92db2007596ec1a76d2d22ca5b00f7f9aa9819327a4
-db8d0b03369a05de96b8c4eaec254cba0f39ef6ca005c53afd0ec32f1c092367
-efd9f773bd00b95a60523bc0392b050b15ad70f7cb42f6d36587144cae2447ab
-aa4b4d9377a7e86ac489685833e1c14c3e17638b00884a46c1efa2b158f6239b
-1bbed6fc68ff606278fd4216c2a6d7888f0f0e5dfc9950962d4964901a47d6cc
-2e3243e1dde9ce7f435a7dfb19349a3017ce44b87dc6baec18354a2042c87ed6
-c1e3a1a505cc679e32789f75780f84082cc653a010d14dba84da0191a510359c
-1d24d700c58e54718f1d85396e7c5d3a365637085b6f79c061df17bfcd260ea0
-6b8416c9042c2831eb041346a22bc54f9d7ba43f8c4487fc240baec20ad4aaa8
-c03f180b614c59db6e5ec1531aefc908c46b93419b9f5b2d4eba0a67ba43d685
-1ad44d4b43b7796de5c9a11f726a90fb1a389a342143f98f49237fb451c43eb5
-981562d923d684923dcaee71b52ab4ce6269169a35f545e74584fa440c41eb82
-41ab194c78a5b980d021b3eb7994846d963b78eb6e149cca7713c12f77023002
-b8a797c9ccd0c2bd70dbe44f81f9d274a5ff3824ee34cb4317fa4971d67d90a2
-f3d1b1b84960f0fbee40e6341c5271b5b945b9098f3095986ab7db2e0714cca0
-301f6b8378559d86f0b0d95c2dfe94ac8e10df0c8c16dba12505a0d467dccb84
-16bfeb18784bdc10624f15da1a880ffbcbafbed0e1c7360962478006db59c78b
-ddcee524b6f9b15a8849ee19aa00fa3f71a3c2c96e68dd0248a94ecc43a60ac3
-88e49e005250706880485df109ce1506c0a4edc40f5ae5fe347d52ff63b26c7c
-185a698e171244aa1095620494949d526276175a7e120340d3247cbca4e3df53
-641d6d392abc61c85a22e06cdbc89cf37bffdf8a79361c6dd69e6774772f699b
-92f7a7184a00fdd7f36fb8a08ccde5bbcab3731366c3b74072044d3ef2ebc1cb
-33118b8c09c04174baef8df1bb4a1e1f848c1a5178ec58ea621f6f8a63d0fcf3
-13db79f885ac659c881ab7e40798a4339e6a78ba27cd9e6803c3d4df196c462b
-d08555bed51d7cf5821204728356cf813f554517ac5e28e6c4047c0100610635
-7d25c33330758f71bd1043365bda5d1d9214c8b159d0f8fb69e40e6fb4ef4668
-a228938436dd209dda5925597151f8633297862799152b0317bf21f9572f503b
-b10826aa7f8d15f5d780ea27f1b8ca0ba3dd732d3e3effcfad6e6ad8769db6c1
-df22ace8467481d16e8af6f56032c90c8f2500ce66afb94d378d893e84208048
-ec0cf900507f02e40da3e99386f939e05d9737b0b11b7dfae473496d056be5e0
-7f1cd25454f4b290cc43d936450c3d675ceef5da533db25ec07addc7e8355d8b
-8abb095ddd61c91da2dbeac0574e9ec9d316ed13df03c997d7a4a9c7a6a3a165
-ec1ce316e820e13291132ae91660d5d1812146abfa137726e8700395b4274502
-7d53b1e5cba817beb577bddcb956e89aa2d1ab24128b9ae8e06d9f0a6dab93bd
-f7ee8e2ff918255c3722a8b0e8520dd02ba7c92aba13ebad9ce0ad0f16f728d0
-ad49bcb12b429811d8ca1b5ae29b7d5393401eb5802db4d4497cad43ead218ec
-c674f42143bc174c525bd736b77dc28bfc7e107366eb9091eeda60664a771782
-cb41506406dfd29c974c5a18da88b473ae58a2f1fbe5680a40138a9d2fb7955b
-3fdda23b2cbe7e27c1dc4aea3069b1e7e25068c9051672b8c9a3a37d6e6fdb24
-3bc20d303198f9b8ad8154b3f4a4f2acb17c31a0489c1366eb8a13012c6b8cca
-4d416b911de781563e26c08538e038dd8ef92435a054348add815687ddb99dda
-88f1e2c5887707cd4be47f71ab81a3d6cc3e039bd09697734840f8bd0b88aac6
-191c6db089943f99ee4174e5fab3baf3a8429e273c4d1a5140e0073f86105402
-3f60df69e65809b7a1a5a8aee4d25bdde9fd6d05a3fcf4be5f253e41fc49e121
-df89f259ba981d2617209b53ebd92e430a69668995961177b159933501771905
-08f625b26b5085c04b325e7fb6bb45eebe3bc9f5c5114eb37f19937635d71a72
-39a0039003764d10cb403b58c61bf411aa8f5d717bcff23fb338da58d13ca81f
-acb3316d2b5b675e86a95cfb525199a21af248a1245c92ee37688c6e76a95187
-3b411697a1ea6694e6ccaddef3d57114cfde70609de67972edd1db95d923e077
-4bce7cc77605f9ba5226fb792829b1b8eaa15361ff78f190a0563fd61aac4452
-ee1b0d293e695416c667735dd886d10e4467b613dd9bb899f2bd75f2f13193f0
-481fcd3b4e2aaec6cf2829b1521dd4b6471ba31aa0aa4d63a6456203896a111b
-89c106f1ea85bfe0c0104b1292a1f8d49334578375b55deae2d7381f5cfcc023
-5ddfb3d8546054a0e6d5d81e4254383385ba593a7d3a8e0beb34285dd95d97ca
-3eb598b643834644b611e6db4b8b4360c847120038768e218031e097ba0bdea7
-732f7e460155a496b91b3241c74f9ee0c99ec7adf6a87b701a0ceb07fef5fa44
-44e127de3e777c23a8d938f9879df1dabb7adb31247a53174f919a2a5a4f920c
-9415f3976a8f4b739e114b2c49d67bcedc1852686cb041e3ee94ef94d9f2096e
-76f1c558f40812444c6f0f4dac3a4bd22b82e32d8bbf1504f8232ef00dd2f3ff
-5c4b8349a9d1becb8c59a9f4763f2566a7a513a6c11f54d1fdc1867ab741f3c6
-e2b44aa95479e4e9813350473bc7897b9ec592f01f97697a17967d344a4bc9a5
-62786f28f87e3639d091922f4994671b22efd41ff3f6b8a651117d0a2a97ccfc
-80a69c974fb2ccb36dd6a4897bf88ebc67bfd892e35e6940e94893e1cdfd2799
-8cfcf2b3737a6232e4783eb4a8ae56b83ed7661377b30225a75a1b90b73079e2
-6aa33fd37b81f7d60de62931b6be9d16367a5fab1d14d281d3e8d09dc525f549
-ed03a449df4655802bc3265010f286df86602740d8a86aaa228b9c47e3e78c0b
-22d2600d5cd55a3116058daa7e34174144f78a8f72e0dcb8cc64addcc52df0df
-3f8c21d9cc04e187be53f8fed4f33633ba03afa178fa5ce769a7eb0e1b9bf5bd
-de0ea74dc99598a66696bf6d5071da995a30b8144acdea116cfc447255a99cce
-4ec01bc8a0b355c0881f6e9eb48725d61ee0b245e0f7cc35b9e76fe11f681017
-f794ed8d4c4c7a02e17bd16a02347f28318ccaafe0575734058121e3ad8064ec
-a0086a58f216020a2dca29376981a2595bfac2a0394d448949b52ffb47e5c5e0
-d6371cb4a417ac834d6c9fa0018c5efb16e39e32c85088b266d74af5630b2544
-d4cf403482c490f86d35f81cc44b34200400c10c6dff035423e725d41d2b5ee0
-c3f03a603a161713216af97036ed38ff8d9b09f189ad191a0d03369c3fcd5a3a
-f88a57338971d7bcb5f3fbf8735ad8459524d93a92eac1c2bf5f0e6e1cf675f1
-6d72b35ceaf34d8fac178a1dd823ca0448ee1fa2f616b803c38b89238aaa1ae7
-cb057ecdbad28147da46a34b8a1f1d389e082cc3e8eb1a7e5c0c932341824c21
-570e003d8c11c87d7082371d3d4804da32fde118c6c5b5b08828e5783200c6ea
-0a7ab73343f5fd681a3116fd818c7054a5199212eb0f3a9a0d87bc364670ee2f
-7a5081a1e48a58748d297e014dd5db7faaf7a27459f115741bf4facfa1b395e3
-e97452bdaff906af9c52c5908748f1e13cc85d165bc893c1eba728458b708f8a
-9e8990a6f258bda0989aad0959e7326d1d6bccb50c4fab15a6ea3cbe94724fc2
-8f174df93fbff41adbb9d4fac0124d33151d06753d4d879ac4f15aec5d1cc0b7
-a9e861f790a16eb0821b2a7b7b42d6f3e389c51a1d7c652859ffbe66646d4199
-a62ed28a30c8932dc4d2855e7e6311d79cedba8beefe2cd529f4b45382f3e6e6
-a7659da9b786fe7bc2e431ee3f11873ab2709200b715343cc25c5365d06be9ac
-829458ff77f4d509d9c3917237d759da6775e09c2eaf4ce966a14157ea2780bc
-e3249446573c82b33ec5ca150022a83301f00f41eea3694059b14b2a9abcea30
-65cfd06b9dce3823477bf80938d355427666a8287a65e231a2357aed80d27a61
-58140c2cdb1f44caefd6b629fa661440c361dde7817154052436a36bbc1bf382
-e30285979c4568b180417740a17150952e3eb4091f583083d75a05a2d91009de
-46da396794dbb5288e2a2e6191d3f22e335f0275f33e9af2154cddbcc99b149c
-6d7aad7fdedb23c805f09725b60b5ec77e8ac9953a3578b23c6023a196f35333
-a36fab2ca195e397fc82318434e9f2844d17bbdc177989fd8af61ddb46512d2c
-f5d7821941b18b7c1f1be16df6e6bed4a1655edcaf6300fa8765e903b03a95a7
-0a7e6d55457f451a8177e0e9c9f3aec8d174843e3a99ed698689019e96cb4683
-bb24c71e22f4895656acc67ecd671963abeffef53724a645b98e5d2680297fe5
-2d43ddfdfd5536f7c239a5092076512a2a9821f12338e388bd5115ff4f4d2c01
-d741f821874380838988c17bd975fc388a253c8c006c67963ce3c4404baa0750
-c56760e367b566ed129911eb056bee42f12bec9980177f1b3713068073cf34c3
-70d6ee202c49b42809afd1f8786e14a6c63794eb2ddf49d5a06f34de23356260
-96ea26d57b94a928e5312147ecc40bbc6a204c4b3ee9d4f4361f8df9e1c1ae68
-ef60fbeb99339842e652479362b19d33de080f9625b5c167bf2b11775929b12c
-fa9e9a89cf84f249a1078f5584425e2ad8ac82adc298867ebea1ec6c0428fdc5
-01dccde39e5fc147959ea254217153c0b550ef96c229664c22286a7827ebbf15
-c7fcdc57dbb5914bb0460b6e0c0f58c98b264925d9996d9e0d31fb70e66eb9e4
-d928015f2c12acdb7d77a66408f2767c05f93292fae45492e5dcea337cbab346
-da82c905ddb016bba5d31e740b813c3d709d78d7ac50326f90d2e4af4c1dd893
-e26f9767db437b52a758d6237e52c4a2a71624d2b1f79dbe83b6b7839deb413b
-f34b91b3dfbc88b7b0b78ab579594ac3d57471074f78e59a64d75b4e6ed3cf22
-33f6ebc86e289402dea3907b0a2406188246e8e44054f81854dae0fedaef8952
-c05c8f5c4591673102a0f24f7deea7e19e27863a27c00b510690b331413df839
-5ae5a37f8c6b25082073bcede7c8ecdbbba2c09467afcebb48f4a4e25cb069c2
-b7acc265f988955a79ba95b3f4d8c6cf94164941723601923409e9d81ba8aeea
-64e8f1f09794779a1262020bc301b1966a789fa2f37d7521db536c0c8da36b7d
-906398a8a41230cda975088fa5a6070d88882dd8dee7af696ef5ba2c5a525d61
-d35a6834907c4846cfc69b17edf77c58e501a0600a04ab4b36d9007ac54ccfb5
-14a47193ed01d4fd5e3c8cf04b3e38c4895de3eee14dfbe6351bbbea6530046f
-89e913d022c0cafe528a33c4e84d465fe6fb031b48d904c5120d452a6c1fdfb9
-08e242a05d015a9ab2536dbadf0ffd0190d355edcd3174cfdda0974e2a33cbfb
-2a3d557ed2f6f284cb3c990c3071b7efc678a5d27518ec1912cbaa890dd6bbc8
-824eb1e7ac6127a67e68428ffd67e650fd44c9ec448a309056ce45e4a4a2b769
-8183ac418981f617dc469a566e713aedce2bbc7cdddf1f7affc6d11e94757130
-c4ec7b55dba7356b21e5267c5ed99f427a19daf476e48993e856c852d35ca1bb
-b32d59ce688ed184fa9ea1622c306cd788d6372c5b4a94b001f198e33209bb59
-46af1ef7b066d049825bb78318a38ca23ec9a93bc4b4b12806c1a0e5be179e3d
-0c0e5bda654e506e74e0ef1a8b12c18bc3f041d5e61a8f03436f146e4daae3b9
-6b8c7ae139f42e8dcf772cb5742104aaf776f3dd19bad920df77b42aac654d32
-2de3779c42639b50059d13b81c3904df76a0ab47046a0132378f9201359f71c8
-12eb4837bcbf3f1498bf8c7b2298e6b2e528f9898ddfaf75b5358a73a67e6307
-707fb13b2360ffdc5659ed8e70ecbab711d89f8c6558622d67737b1108ad5139
-b126a6c7be8b25709fa7cc2a625a0796b7d08b11f098edb80f8aa08a5668ae91
-4ff1c470dbcc7775a73fbd857cdb9a5d0c122d4765caa8d9d35514390c9b339a
-c04a78342e186e5c49dba4cd9ab165b4c139e76b88c807cc4b5db7b5063c2f81
-16721670497a0183c643c5a70ab2405d5d8b6773a4a2d39b3cd0d763c12ec296
-9b3c3ab916656fcca5d715e7dac796937b2b6d4adb251fb79b183e6eab23796a
-0bd0bf5bcab03529467a265781716b0186573b862b2a2057c427d85d7b547c7a
-9e7fdf7a674587df709ffd0a63d0852ea0d02c13e8038762de82362739de9ede
-0db4296421d462d8286e2152aa67298c9ff511e8de1a26089d383bdbbf27066b
-f322738cd2cf198bdefe566ced1808dafc015c8ae972117776594e9c506a3223
-d4ced495d6229c9bec17c47071415f80482f9ecaaeba6a135d2173254dde6be3
-f0ce9a7a81ec2e9af4add855b08309d34e780adf0f7c9029d2ce0d5f807ef0ee
-531217450c82b7f3643456772549acc2ba6a5938c517fd775114ed44ec69a45f
-d9110c969edd9e6f8b4bfb953aed79a1daf47c7238871e4d537100c4d8981d82
-a2344eb7df5baebad28e34870d52d97a66dfc75740cda6b403c1964c0feb034d
-d3e5c8b4a37acb9f5718f7b6a3d267694df8baaabd38154d16c162ebe43b473f
-ec1f060846ee8402d67942ee080dac9b18eb8b09d384ac24f85d287ea3e2c59a
-0f2c1d6bad36e262e031acd399a2b9a7940908d65f142fb209416e891a6abeeb
-389e2df002436d43fa1161b71382d1842788af1a9e6f39ed56e8bf63991fa790
-a52ce312aaede90df1be57e3c1151dd0350ffe7e476cac5f34cf8505bcbd25f3
-29aeed3a52bfe1f10366dfc4a15fe212b1cc9da76c8272d7ce85c2930d797b82
-4a67de55c50d45cb3640db2a79ecb647a2fd2d948114eea9bad6312319f8db5a
-a29d60b22439d45760751904f5de5d8c5c9d0211ac9d30b9459dd05eeea240f0
-97f0c239068c514b8213609014e6bc50633d0ecf774c210aee7c75a5bac24e62
-813181e4d040ad1bd4bd4ec7b99b8a37abd694cb67483d1c5dd5c17f54ea7f20
-50d0ea8ce1cbfa5395e62e10c5d17a423ac76bfba25a38fd474b5b4117ccfccd
-30a2ffa484af429168b1b5679b67542755e989b39387fcd9b1d8f8ba313a758c
-58641f34ccbc8f2556ad1b17c33f601ea76ac75ee6b681aef12c0712a14e7b8e
-a8a5bd316223d5142e8b53a6f81a8a608a3dc32f20c5e417a6aff0f725dd7867
-429fdcdc16a22ef6112fdfc5282c61a1aa9b134c1b420de7b359be8373cf3716
-d7b3ae832ec15e305ff6c8e9d4197f8b0150b30e1b9e7f15275b4b7a65dfc611
-97c0e5f91561f3e6203950edfd6cea20d0649071442b2916ebce5f4d3da73914
-5a2bfe6d055580af134b7dddbb9baf9477454eee8abc7b33eea500102e395212
-78d08c08ae455bc0fc5bf5a0a577e5f5fc71490add5a623ccca134b62c19d3a6
-4019415ecee0168621be2b4856ef3b3944c0db9aef7d3e933a034184934bfd4e
-3fe21d4d2625e6464e9ff9cc25e793eb7b8701d3fa07ff9a3020f76d668d083f
-59c6f6751179d60eb17b9c4e35f3815aa5ed3793a2030d317f1610215fa920a5
-5ff29a67e8e6f186f00b5ce164677eb1961eeee35b5a7891d4296967a9d096bc
-76b0d072eabab7ea758da89fbdc25b8261d9fa08099b6e84494fe034c3edd5f0
-c45e67ffe588b2532efb3dd1c34be9ce299712eac0e4c4cbee6f30e958c9dea0
-15c5c4fef7cd440ea982f91c07928463807fe07f27ef61a5deefa47879847835
-d4e50aa1dd0ad2b3d01069cc7b4741b3f680131f7d5cafc6b3978c3c1d608ac9
-d24342092746628cb71fa01e3c675f14463f9edd4c339ada41ba4b6a0faa5117
-204463bc7b94d01edc1b3d5781898c85516617f29b4dce2d32c2686ddbfdb838
-f67b097be600f6aeefb6eca5f729b45be307232f92731c10c3330672c9584141
-7192e62a0ebae828fadd77bfc2ecdc1e562daf5660354e0edd5b7177bd8e9d24
-f77e526e649044cfd49633d48cea64de714e59438ad980e0b1ffd51ee19692ed
-665e2ff332bb54bdbf75316c4b1a39c538312fd649e8c462994dc8f14bf056ff
-0804de76474d0ee084e363c8b7081b1c08e252e05e49679e6c7ac81f42e9372d
-e5af64f59c4fb62f3e2e7b16ff53bbbc006e3d9b0f29434db5a63210944053da
-ab56b1075a0c3832220752d104fa1770d3acfbc31704a1b7852c077058f616e0
-a4373c1c92c7b60566691573502e9a92d583a3163bf31fc100c92e6405ee4d54
-09d23a83225bf6d1de2c7bead011ad64547d6835ac9a7378033c85592a0c3497
-a03c16190ebdabb792ca0bf803dcbc3bdf0f7a571aae00f596ee01eb476bad97
-3a27a219aafcc0fa245c6731a2e8e561c63b7bc3147b9433a8203fddb7138b0c
-1611c7e62375f2a114f7bfab36cb1a94b9e10ca63833ab245af595217779bc7f
-d12e68a65919eca4fae72f755669580ab0009452bf086ea835f91a0d5b384b40
-82bd515f006865bbee2c50db43b4457a793693806b86f68a2b2419fc3e937a72
-c6f414de148d2a62a71ee9fcab710d6dc08ad6c4ac443365e7a78843f80cd769
-c56efecc2d63487b5fcead1aaaf9481a7361723388f5b51c2d9cea90486cb9f9
-79f6f5ee718d4a49ed91cb091adcbd0e7b3ad963368c9cde877666a742cf5073
-aaf79428b3095f989fc1fa6f5ab1d724d92c33c1325c05a39423b8a83bba9359
-97793fda280740aeb6be3193be5f4feeca2a8f28efa9c8e016f0fc87c8f3392d
-5715b9b9a7aa3c61ac84461e2c3220372568aaed851f1cc40481e326197ecab1
-f3cd792fbeb27a58a5f889a5f6321473148c6d311ca89be96039ac9423700d87
-ab0d7e8b89717d1a62ca14e01f51bd77832bb6dbf76b201a04d222852050cc5c
-c6a4996789a0bfd6ce364592300282f102e66f4ae9e50d60d886cacb099df960
-c42e2213017c567f27326e677bbd04a239631950b566eb39e4f675d2e989f56f
-74da3a0469d988ea0122ecc3670d458ad82bcf7ad04bf3ca9b00d76ee569f98b
-a375285a1abbff253b8f179f71f496286330e364049c72ecad4d82a933af0189
-03de5e4abcfc637803167e56911f826735a7c41e7936f4bea148397bcfb18cda
-fb03182ed7c511aa9de0c6e6c80b24cb535f03ee16bbcb514d65ca9ac2ef15c1
-aa1825759fc4ecafc7c0d9401f139b3f20ee915955268578a933b184a86f2017
-03cbf4db79be18c09c8cb07d85739b8653ad37b8c0b647161e5cac746b3c0b94
-2ae2a0540f38dbee122cad0cf739ef1b49b6dbbd5d08c97c04dca33030f18718
-583337a015395e1fa932df0328c7ddd9546b7812ba06d82a35f8110d55fa377d
-fa6880f52645890d58478e4ee3b72f08b2d7113b2453729b37e4fffad13c5f62
-06b3c767a45c80bd479d1e24df660e46c83c48166fccec13b9cc4e62a6aaa813
-7c424885f83d7647b80849c0a77bed562f134034cda9fd6e8d7dec9e43f0c018
-9287de759676f20005556cedc67c31509a8bf56a5c972b5d247f21d8b6a58953
-7d92101841166d7781d4d80cdc35ca382d8c2dac3ea3a34f93dce0ff8c76ef12
-390d5d57d88f3bc00d46513f0358c43a22c413d9a6ba6b3e13913474b9e53bf5
-31136a5edf9192965aca98e06316c05fd3d6e88fe09cc08e327ed027b81eb146
-63e3073ea5d1d59b74149c5f5242d3cb253c36a84cc837d76b2ba36104aef0d8
-f9f4404d63c42f3d635dc9195ea582b589cb5b54ab01af9ae53f3ec95992c09f
-a5bfe86e6ef6948bc387730a9cff0cdd365650aeaa5e1d52d8f88dd49d36e6f0
-786c7f4ef8c2a5a242e84cfd4dc50adfea0c2ac27839699b92fa8feb6436f2aa
-d02710777083723ca7e481f83b637f19ffb7511de223a0a261324189edb38d88
-6ff5cb1356e8d567afe76f96cb72f88016e39e99af6aad499ac60c8a3205f253
-82c0312e1f2b6ee7b37d178bd4e67550276a7421b4f514fd293ad32bb1121234
-bff93d2297dd32dfdd7e7ba91c0544f79dfea965f4f67494f3ddd97d7881fcfb
-20ed71f6b5cd27b12d04098a9293e273148590fbb65f6fba63e7bcf14dfe6f0b
-51f870be20174f991329a5ef3d3c9fce206799a01ca102ee7999c2a97a19e796
-bb5f88922b76f922d302dd833ec532022b13ec573b375cf75e49718b2278f2b2
-4ce9865f20902d6358440efc9eab6e0e069ac7c193c88a044cf33f6a39388f6a
-296f42c637533cc503adfc71c5f898c408a7e5479868ebd29c9ed02939ffd49a
-2812baa355be429858e0c6aac60817d684778b71fb9a73e7ac4fcb078bb1a75a
-b425ea09ad8585ab3fad79429321a8f96e2e1f02ad70e2fdbeee625bb434b0be
-f8eb957f817c5699c7293e47daa4ead6d47f00fbb6c8674ef1f7729cdb19749a
-ca9cd399a4abcf28ff71edececb2a955ffbe9ebf4bdab56256e7cd66304ed4ab
-1b3fddf6431296aa641a8795a4006a049fd3b35074a865c901636b70619ec26d
-aaaa8c8c9060938337144209f3e3de01e92293ca89583cbb4c2edec074bb4c05
-15130c3ebfd78dc687f0ad0981c0d27fcaeb28f470193ca13d98277dbfcfbf38
-f8353dbd04380abef7176b0b4199d7319ebfd88ece219ba6edec59fd158987e8
-9adc035b8fb2141be0e0f25d56e077e5992e4f95640abca7aeac3d929be02d40
-9a86dbcc043637c5e0f1a5a12579e57b042b386be96c9a8b3c4e79c8dd28a52b
-a1159728785a75f2e579b8669a36a9f9e7807ff9d5aa0d8652609a47264a2003
-fd202bc8fe9cf80e2ef05ea5e5fbae676a77bbdc4308ab92eb0dd9a960f4865b
-8305eef47abc2353287f52c766ea1c1b86fdacf0986e56a87462ac820e61051e
-7f22cd8ea7dcc7838a45a08ea3fec105d80fe5ee5e87732bfc2e9d664a7ab43b
-05321557d69ceed6b679797a67a0c38b9d101bbe870d746568325c52d4ca255b
-b23f9672ce2b4e3fe944f5dbc388e575abd897d969ac2a81915e3fec3d7409ed
-14de1e4cf7737b6e46f6c71142db06a799a7208539c649244ce73a58f2247e81
-4f241aba74d6ae593d47c227137ccddcf1f523a730a234c91ac3ae8a456cad1e
-91a9480c438b047be40bb2e4038f8ebc34ecc3a8037454b7342c317871fc1d97
-42f26e3d956da7679a072cab96b27fb2ddf480d2f40ed88b2e5b0b82892c8314
-cec9bdc12433159714891b8591a051cf2cce7580af74d5096f53a65347488bcb
-948fb028f310575d3429123ebecd9b09d83f30ab8c8ab65d49d691fac27e3612
-66ea08634f4c7d3a648ec068c2cf31f116951934864dca2755daacb6d22803f0
-9488117ef66e9b12663da9d00a3eb0280ba412e4b6f6397ee7800f250fbfa023
-3162addcca4dc23190a52397cda3285291842a2b269c4e07f17a0035fcbe785b
-6a570e4b75692658ed47b6dbf297adf1b3b164740d1e851f08deca9c05a263a8
-3364c544cece706e77a32f6d5d10f8d4170d5246d92c2c9fae457e0f5e4ecd4d
-08b4edfd42a1791cca41078d5e520807817206193d8a649eb39b64c80e126feb
-240e1784da3c66378196828104c49e5fb86475a80c21de71e0aa36ac5e529ade
-427c03c2236db0deca99c7c486ff463a72723efb519263916e73c25da625d0fb
-e45258ad2abf3445b72cbf3e7e64d507198f666edec002e233cc0af6a8c1095c
-3cd232e2ec50b2ede3e09b61e25996b4a64c0eec9d55025b1f47e53e0b128bef
-a34646b4e2c13699d112c958590058e6b606cbd978cbb0ef69eee350bbf71ff1
-8213a42d135e77e2c53a8121aa3dd1e903dc0e961810d103bd70a2b448f29ec5
-c3d907d7243d76c6ae04c22a8fbc6c1a05f9b9ec97cbb0e76928f4aa26c913e0
-3f8c371efb61f370751eea6af25a3df4ab3da3e4aa263c2477343e4b19915219
-c4c52cf43dbf373c316b80619f479d9b531e62f26ef9fc6da13e9cf0bce74d13
-c2832f1c9d9432437d253dccf73cd699342521a3cfe8f85ccdcd23e9b240c961
-fce15ef77fad8438674b55da638df2492b29fc1a003859f382a776260ae5067f
-93dd176181c10c4a45e8f237c5c9781e01d2e1e0890e1a6e75e2bbfda4d29613
-efdcdfb21317d770fa6c1ac3800f328bdb82b48b7320ddcf64add23374971af1
-50470fd002c01ef412c5bb4984737840da5c9e0e4d4b2b7747056a3865af6db4
-f4b9cd84d27dd2e45aa0d9f32d0cf58a5f1baa374359223cfdd07c18017660a2
-9227404eef0abbd0e29bd8698752e85448a5c3cf596dc805a87ff903ff890e48
-b7971764fcd8f921eefcc55b2d20cd5908a6fa35d56bea96a39ab521d985c50c
-4e0213b30325d295a00d32d97e95646867122dbef37a3c866fd72e2f29ed8758
-a362a4f17875cba8be23d04a35714d4c27c4417039fc8bcd25365c8a4bb41815
-ce1f74949d6b6aa58fef0c4cbb8d54ce92d65d0a65f13ac6063de4a55ba5561d
-509f2fec155b2181a169ecf14f1fab587569f260c0cacded8021ed8d7cae5ad1
-332f1061e166686b41277495597c16e728d6a8ff49f824df503a63322b442182
-665a12900dd48d1361342575fdd5c9d9ddd7bc73a937b2ac6257255414029a65
-9001199e9e1f16cf3cf876bee000302935493ae997e3f112420d7d3f06739b79
-eddc1bf7ecfc5316549d2ff228a4e28b522d6cfaae3148bea2755a45bc27dfc5
-128a9a38777cd3b07f91edacedba2565b55218d7891da863243cf68e7800b82f
-0341740a1f5dc6dcf0125cda844867fe4945326f13a954430753a28ea8491bdd
-c545e71e4d52cabc3f05dce434101d36a62328c5fe6b5df3864f9f5aec22f399
-43f72fed081d3724306477a06eb9b6fcc9faeb77e62ee4e20cc51600b1bb081a
-1c5a00e064d5755838b251807ae57c85675cf04b69a66bef0c19c364969d3547
-55efcf31f8ae346582462e986e3a1d653c205e5d58d21de4553832c885e543bd
-11eea2d3c08f883000966c99281251fbc2920917700037278d4934f3441dd535
-bdd3c52111ed0b282ca23cfa97ab25c8726acb13d50599245e532432572c35ac
-b9391685d9e1deed1f95fcb151594cd63e79691b5972ba2c3a0c0a2ffaf3c9fa
-5ac47d9177a691742e4634db6631c8696d0a30bce1d86a4fb737ab85296ea479
-fe90c51cce54d64087bfc80ae56abb5d04f5516bffb681e6b39f480767f2120e
-97d1e8488f1f540e2ebf63eb74596670f5892f4c327971f697c7530778c3676f
-2792289cb12486935c447d4eaf4afec65fe6c6962306449e33fb19fb9806f87a
-8b91874ddf3e3138481fdc711f0954d73f11fba39efdeb55ed13b16b932525e9
-9f3c86ae60f9096efd4968759def8d629ff2838decbe4c68833ba0d64d1d3330
-b84cfe8ceb23f4b5d55aa5a9b51ee595aee0cd668b20c687d77ff83c803ab994
-c743b43d9882837c42a58cf704490fddcb5646d48cfd2e30464d710c1440513f
-4417dfd66d39e0fa6c596e17d07964ebf2caecd0a9fd78e003541ba53468e719
-b7dac2685ccb9b7d857aff1d4432a72f61829010924781f5d15ffcf8d504e361
-6f86c6638469db4ad281d8ec365848b6f7ae1047114a2cd3cf3d1e46e0b4f40e
-1a8d3e1df1c1b677702d7fbd5a5924f91c726de2e37b436250eb71610dd82cd5
-5c049fd044b4407784fd83387eb6a788103430fab4f682294b287dac43f3061e
-d99c74309ae973bb998bbb2a691402843a1a28ee62ae8e8baf4d645d156b94ab
-34680095425ad8b4dc27289e3c6818d6032f91535459d7595b2b9bfc2f44e782
-30f0af49c0a2223e1cee9e1289f682ed5e8ea7db99663a234719667bcffa8077
-e0118b0b9702538421dfada01d97d7a8f232464b9fc209cf278bd5fef80c14be
-011a9f6fc78dd20ab012a30780db2507f4d5e1e493f30814ab1c70cda75ce959
-b5d515b2ee8640dd4bcda6710703a9e5670abadae856b86ef8e4143a5f03fc16
-a6c57ac7c3a96c50e45191b0b1c4f6acd622c400cd0f2ae9e9d51236f1b945d3
-71adc5feab8aa8422a28755b63978aaff787158a68c26fd29ab6e849b076b852
-2190caef1a86663f4e12cdf25ba7bf882ef2e0e21c77c14fdf940792d7bb28f8
-892a9ca0bbabe1c70c152f30f366bc86b5bb1eb3b54425617682a5463238c999
-aba3a7bf788a297d2a555dbb218b19ce501aac43d94a0bb6ae290628821efb0c
-84ceecb30c140917a458db6fd011f3cbfb4a1cb5ea019db628c106e2a55f1c13
-448edd4a9a159ebb369d509da296da724f729fc7560c00c41f4309e32ea6fb71
-16f62325a5af317f106a8d8c2c01ecce6775d45fdbefdf6925e9a44604dda13b
-27cc9a960a21eea2af9bdf6b3cd357d6097ad40df7403005746a30833e814eac
-8db72c383fa42ba9fd007a263ce3b74c1356bd522d2611e4e960c9ff5204d46f
-ee332f9f134e75c791a6d20923ece8d4dfedcf96ab45dfd751739dbd47b4863a
-f0fda172848cd279afd9fac3cc5744c1fa8a5fb4955c6c1c952f56da06430aee
-084507664f93c71d881b63041cdec58306100a0e8c77421d75679ce33e2a0a63
-ac2f813006cea69e00352ffd5f5914b63dbad5905a590ce0903ed9b9679779e2
-d9da62f478768776a173832a8f3cd66b6b62484d190baf2d834241000b0eec79
-f1e53b42a74b159bf781ee4415ab6acff86c5b0593cf463bf95d8fa82293a548
-84bb226f40f24591e5ad463ae4b672905e7a4222edf976e8ad889e71986b3818
-bd3eeb6a0c96787c6fdf3a4faed94f0ba0269fd082ac451531e3b0c01f996090
-3f821dcd64642868f07aa0feada34088a85e6644ef07f4402b4b293073e9d308
-bb298b0e44be36bdda218259b4f48f1b638f5007d3aa8ece802b485e7e9075d2
-6ec881fbdecb3cf58c8a3afe0d9835e7b468c648e52b2eddb81dcba4e9678bf4
-b173541dbec382423e80877ba2df94a605bbc2cdca2b76f74d2eb425d8191958
-804617f21172f397bb762aa7dfd0485cd020397a5d3e9fc9405ec7edccbcbdf4
-295a0057b7684a701bb7ea01e8978fb3367ecd089be19aab2828f6825d275d3f
-60662c1e2ec5e98ecb99a96d6fe379e2fd158a7106b2190902f0ed71969b6daf
-3f9e460f16f1b40cc2aa08330b9fc2e24802bed034b71de445a14bb33f642989
-4f76319eddee328319ee9577740fc803b81714a99bf0a5722981427ba0858546
-c0f77f3919070060704c3bd991d94909d2012146b88c0d35fba7c2de864e35b7
-caf0099c4630443625be3769b01526f3f0c8c821da9d546bc258c004a4d2b46b
-886f1ef916f50d3f5fd139e0570b4151dd41f1f1b5dab0db7787105c77b86901
-73c562d3eef6ef741078659467f333450d7d80c67c91a26ba8c77adcee6f4c56
-c7f248dd92520db35768e703f7bd171f9e663b9daebeb9611cf48425b6b35c1e
-8bc7a0b45441ad3854ac9b37061839f578256a8e41766d1a6b29a99a0195620f
-a090d0ef4120667902b0587946206f294b78775d60ebec668f6e4fb9ca897e85
-76151b245aff8232a90f97a5a93e935c88579dc0f2e9da7cbd02426b3b15ed50
-30acf50107f7b4d4e2c32dd75d6d8c4539176a2244e761ebf1ffbf97d336fdd6
-ef9cf138326e10bdb57638235348eef8ffd33c84b426ec1c81fd8d4a3907d52d
-1ba7e9b64dd56b8fbc2362e30f2451b69b0d7cbea1f3101afcd44242d3ff5b66
-89a7c05449b281035e983c6b8c68859734b232a73996a19d116ac4a94f7b482e
-1f984371e7e9919c312250c35f6f7fee25ec23e562dcc25cb29ea79dff0e7c8c
-fa19280288c26dd5c32f4aeb98c85afda533191809267f0555498da5688b7c20
-219a058efaa597125535871922ff9b20cfbf4c4b35bdfa4bde73ca8ce6abf14c
-510ed2072a01c8adfada0064777509d4f97bd2baf66e7151ade76e407066efdd
-2e08a15790c81d545b340019bd350c7b90b36adc8658c1848020a77f918e1527
-b3974710af503a79d7947dce93bd81161cd7e0b1125d2fe0edaeb91baf1279e7
-312fbed646472b352310fdfbefdcc4c20ccfed0d6626083b0261d7c47d966984
-8dca4298b9ddb58fe21bb391c7d45d9b562d38c4dc23acb5aa87e3ddf59ee238
-c91318db2491a24110af90539a16940141d1efdf4a13d202f9b9401bc89d7297
-5269cd5515f9a6186a6ef866cfa03730f726d7a4075e0bc6f094e9584a84cf1e
-78489bb68dc09ee3f1356f4e45b8621e06078a6727eb72c36fca805213c1675d
-4365255d90164f33ce6b2231113f64fdcf5a789cd61002b2a38d2ca5bf1f5361
-c9ae0f4efb51337e344fb7ce15f8edbdc9ec82a9435175f59b6c19ae2dd0b10a
-944565e4b14bd1dcda02d42be27fb9f0330636091228e3b89709c8148932a5f8
-c5ba5bfecfef6de83eb414adc613d8534c4e4528d934c37e768d08e103b8ed2a
-e1e49bb1b3e6cbcdc3ff63dac7994b8c09203d82a99710449277c20a34e01538
-67c5d5e6abebba650c441d3fe56de997e928193682e5f1faa93a5bc800862132
-ed3b6c005cc0e604231e3e61d17214ca38148c875c268a861a14b54e659dd932
-cbe6ea7109b273975d6ceed351f0b0876a0b647946d29097dd98b5f6bda7b43a
-e6481f17743fda503b34a120c8c06f4798c1fcd4e521a30d76f2340df562b63d
-dd4b27da8b583547d285f3848bb9fddb60d0ed22a4cb27a2784e8d7662e84ffa
-eea50afc03b0815b72bbe9558c8959d0ccc00a8c8c9f740f95b671a66dfdfc68
-77fac12c1995d977495c9ccacd924e45a66f8739de156ee6962c7930f8aac374
-894f8bc396ff69f2249392c7c4248f9cf9ffff9eaf635e66a34511f39a066b88
-4866e776b8d6eca0319f23ca604ead742bb6f6f3b046454a1c0fc242551112b5
-c745e9b8f12723867b2b895c0f93c99df1d542b86c1c9db47390f2d6c3b57ecc
-66b1a6ab514a47fd9aa6240b46c54a92fdf80fc44eeed4b8a136fb88b1fa5b9c
-a2fe682cca4d0c5a3e994cfebdc270f48e3af91ae6bc9172bd9c73053a761364
-6ef9e68ef58c718a478e7d81e57f34a791c26269819c78574d7cc12632684219
-a1f8e1c5ce8b358d6fbf23984e59d9533ad310d158ab5baa9feda08717a7f5e0
-57684c455a7e3d833f82b4e13e9a92b0b8fba5cdd72a7e46709074ddc82e449a
-c906474441066fdd9cb7f341f3a2ee9f2fbf5e4e1a350a45fcad6b2e05825b6c
-89077d742619cf1f8434a3b5cc44998176667cfd5c5f4ee51326d1ee3e449915
-00bdaf57c88a107ac49c14cebf18d010c5b3206ec88fd06e3c5114581ee5a5e8
-c4ee5a5c3d48653fb23d28f26862c433ed083af01ed3df8e147548f9cdd882f8
-ca3088106b9c73b9e28786ffa643c343a940bf850f312666e635b8db95c6f70b
-83d645fd947f6df322d26f8f9081cae71ba8b9d0de67d535b61146c956801d6b
-ff9a69365bda9bc97d8d93142d4c367d5255587ada25e4fb061f8e430f73d2a9
-7142d9e4c17435b78805946e4fde624ea5d9b5c511c9afe2cfaf447cf08235b8
-575ddab8af93588e0c8206f08f883170ed4463da31a53cef67f01aab8f645acc
-c2c764f24bf831dcf005833ccd1296025368b3d51a04efd095fd1355e93de563
-e71dd047ef49f5bf8c17b01b2884872257d743ac6fdd8f54e27a241d7c75b387
-a8841d8cede676e35d4f01acba2acebd8b22113bfbef80d5eab1e8cf56f649a4
-516ec097872a597e83519fc1397c7d4a4f6db7daf044835b17d085578f5a3776
-fd5ed9235c018354e801fac338aa7ee581e97d91df0196ea4bcb09f0e6f2e2bf
-b5470827f1b6bb0b7133c19bf43bbe824ebdaf9526ab15ff8ae8848bf0decb3f
-cfa7d3f5ed71191894c705a27cd9aa30fd384ce6a5f0bc51c5651dd2510a3481
-d086aa87595f885c4c0afcb02b1837cedf85c5e64d440e36581874a117043b75
-78da94a069cf2bd57ae70c230e8d1a0d4637223d14a9868835d8923feb404323
-43c22d0f0e8201c20247c78abf9267915069d6471862c2a0c51ee3ce3153e305
-4a4ec6ea52dcb55df358d1a0d8aafa79fe08ebe4d22e9ecb9d2e50a7f367cded
-7169f84285c482fc1effbde6feea424ecdda2494127c7b896dd05f5e62f5fd1c
-031de960d6ec59954e8405081601df741edd97f227fd426e0998ca7b9b498beb
-4cda9a16715cb699c46d1386469958079ddf5ff174d70338206208f0b9ade386
-03e8dcf31e09f44976c1ad762896a615d9bfe54978b7c3914458c8af4d33dc62
-9f9af5171df3b9e548b24011ec5f02e31dc379582e16f3c999f047b82e7f27f0
-4bfdd827c9a1d19e4230695d4ec499afdb6147146cb6f5a8a26efbd6d0c5f205
-34cb9c37fa4c4b6122f55bacb756173282abd6a2e5219c25b86a5181021f0bac
-6f17f89f3b8f74c281aeea7c1d4ffac602c2364c9e1ec8b0a623bd3541765cf7
-aa5febbb6e857810a564850259ac4ce6d641f7b765dd46584c43c8113c8583f9
-e7763d3f4f83649e12e15557f48dcb0a637140b2f7479f78f1f64bcf8a07acc0
-43b9d9ac1f8b2c3b00c36b46d8e514c998fcd47354b364e8c2434e774ac7098b
-24c3bfadbaab5bdb8ab0a6b9773aea4175615241249a2a58222df8c53c32d01d
-6adc5fb4a933605fff98c7d011266380b305403a79867936156240a5c555105b
-95cec3873530fa6d37e8cfc286118a9618c60d6282412d0ccc5a8e3af47a42ec
-29cee0176d1c4802144619a5bf1cdf9ec5b8d6f87c379c476ab941da24420a86
-04a0b1ad7884b5e05136139afccf0b7101cae4b8f0bfdbe276aad1b95e2c0d57
-3902bfdee651a202b99189cada176a22facd053bbc73af1c90cbda10635798e9
-8de05c338e90b3dc4afb8d29010590b641db4a9ab707294e55e44c97e275b52f
-b88f52a6c7e545cdc73de46da699c8c3d895880368aa035a137fa8686ef4f64e
-09167b9e523312b175a166de5e1297c60db361d9505c12b48c1780a00be2a9a1
-43bc6362c731eb26a61097c62c28d2cc8d75ba3c63e31a49b9cb5b8b7fe1fbbb
-6153bc87b4538ef5cd4919811329ae933d86ef556883323ed5a6db5c98c11b2c
-cc04c4f937289590e5f7ee8d57940f21373a81b8b92eb7ca978c1a07af7b1065
-3e6498a6e2fa734269d61cf0dedd647eddbbe395e1e8190552f9a4332082bee0
-87f28fd6bb19e48de8ad662f41b4a5de657511f2329fe6b541f50ec43be24d5e
-e7336712535ece6a590426e10422d130f4fd8b0fe314c9fe068c6a45835994ae
-7bfda8ae49fab23905e4d8b374fc654f336b36b2080df61abc288b26b9ca7b42
-68e46f120b82cdcb74715e6d09aac096fd117ace3383beaca52aa248cfe307ca
-8930a34b7062fb153d968c93169dd223449ca68765480cfdc5df39be45055d37
-8ba14daa5a4745a9f7b76ab664ef3d5b2fba29c60a06d1a088c05eec6d95c080
-1974ec344b24dfd892db7874e3e9df0fd61ef8f59b525f92f2b374999f923f34
-668e55cc90ff2890107a7528853f44177fa52a071f0ce997ae94b590289411e4
-c0669c936d4b885de8427b60b2f8820bc9d6781bf275a95921d8cf4f55cc8cc7
-73ff7d001f4fc5c41ea1c755ee48c5550677755aee061a3ac85bc0d9c1e5b410
-f38ddb877fef4ad4142c87c42b6fead87f1daa99ee0fbe7e7eee948672373a3f
-7ace2444607921c61cefa7360f3194685acf836165e19395c2b2c9cb5778d9a2
-6f35f91d61e5e4838aa23909b46a899a1e02e27ebfb5368f1080272f6ae9adc5
-44f512191bf17dba3eb22d98b9b934f359fc86c9e451d2d4194632a7db5b1270
-6a58cea47392fa8cc24f6b4ec5d172e9e5601617d8e22e837c0b35b4281364e5
-81757e2fccb98fa88879d7ccc568fa9b183504b491329320c968b5611eb1f337
-a6e50d6faac591da994aa47761865ab84651c328bf259be59bd752f110f89081
-7553823cc67e36721e95f1c4e2e372e020f2b2ffb045aa70ca4dd6d55d88e32d
-c8a17492ef28a44d4a536fca8bd75b3dc392fc296377b2c4743897c32eb65283
-e776e8f8fd97c661c67c3f0d97343af141bf6b77499a13af4605e36d3f4c3fab
-12bc5daa5db1d12dfe5915acf14409e9302b1bbc8c5861948eae329ea31132df
-8494560e564bc16073c7a777fefb30cac6f4b8943c70195289946a60f06d4306
-4536c2740995b7247451c9e1619f7e277af4bcbfff6b68553ae23eef7b179c16
-cab6aae7b6f5fc72e0d7cac34611d1353716580948ba69dc534a3fa592984244
-c1bbd0a6d3f1fc4d9c8ff48e770f5c65be3b5a961e2ab8931e73c8222e6eb481
-86e92906bf2b44fef5a59b460bc88ad1837730515d82c337c349cd087329ffff
-0718e22bd3f09fede7042992a191575008890c5966f1230ab186f019f1794671
-8e619ce8706fd94bf0fb1d6ec22513150c1b9496742a94e048df079bde5d7bf3
-9db82668e5f5453962990f4e3e0245cd2e767c5cf3754c1371bb37bb7e14db75
-a90fcd5de1a7d75748289177ebe65a397762b5b1dbd468e7cbb3fec66a6b3f2e
-8e9a1802bb2cc4506b3ad1632d674f1d54a0c1c08787f274b48d60e9111d8035
-be3af44a3a12e16175ebbafdee5cfce2a9a26cb9826c86207f8ea895e5c2fd66
-216be83f81fa47f39dbaff3789865b1bef63bae463b7d166dfba5e3e9967697d
-f6c91c7dbb765bdb91f4ee5920567a94199416484e75cb6b1c0d1bdd62e831f2
-4b6d7b1009bea14c78ca6b8f1020cb05c9bfd13076d5f335d0b8ae417fa26c75
-d04a28a778d8858e64736fa0a5ba789b58b4d05540ecdf28ee044ea18704076f
-c3c92090d119bc67594021aaa4e89a063ac0e64f2198c5cdb3951c7681ababbf
-6e96666f467a0fdc729efcd2f1d94e193d8fd56802063840696f3eca394c2841
-6b7e6bd4759aaceebdf82bb473d49256e653943469db71794ae96b3d130bf97d
-752a9b3bc4449bb756039609a4f9fcc63c637d8672f2f24dbd49a5f9f5139c54
-23c4a1cba345784f28b7933dd3d2c9938b35e63678b045ec314fd9e9188f1b18
-ca034a26f5d7e2e779cfe4d16560ed2e4f3ac2bf1b5324c6b342e29b5ba3c9e0
-7bf1bff519f91bd9cbd4c198f0b98431d83d7309d0a4b62bcd450d62649e5b41
-335d87c297d288942a637999c2dbdaaaeda4f68d166265a37df001b1a4a5f561
-64a9a7af810851d98af3e01b0e4bbcdf33d3035b98118b48c6452da0caecca10
-228a308a0a3844d57628b2dfd7189f1fd252ea1ce3cbbab7e71329b886cc36ef
-b40f642aa54698e87f4ce8b310f0ee29968ae04de003fbaff84d866e4220b607
-3b3c5fdfef88354a54d4318dd852ffeb9be81630c673e425fd3bb6ddec9f298f
-a9982f8a5859b983bcc09b989f4a71ee4a54d38a220c3ce7491e7d996d8b0e11
-b085acb8f217be35f3eb7fa08bd8ea8c66df8ad00e329ae732ce12801aa8b1a9
-40db1a7b303967c185b90229a1188eeda3a1565dad1c08181fb35ba03667d513
-9f2b6a71dd27e11c7db9a7eced6404cb09250fa0ae2f0fe7fa61147039cb8685
-e7a1566e25b40b1f23ffda5515c107e3487ede0a148f2d8500f102b4f517c956
-87b2e0399387f4a9067ecc725bcb327ba5e98d5c68fb54ac99834146bbd7e91c
-b04d9576bb16e39608c14c25aae446d250b388610b2714757631c18feb700057
-c0022456c9ea28140a150dc6fea0333ecf9c291d95505de3c053c1f957f76a06
-a5e96f792200eb5f1811e86d70c9bf1e0d28da28b8c6042555a27ddd0aa168b0
-0f3c113217d990f6ead0a6ecc4ff4c92c577121d2b1dcbff547c03184360a6b6
-3788919d20302f0c35541b48cb6e926be087b1f7308041dc8cb8f161d8a8bd32
-ecc861efd6ebe16568dd47b82fd1a02200733fef4176a7477185d79e44c128fd
-c54f4f28cee76dcded7399bcfebbfa620a6f5e4df5350fe6005f84541a6e77cd
-97ddcf704455f96435edb3666d9cb57521f35e258eeb2163944c90cbdb3d4a70
-c94b9d3905fff429f16560c6bc44aa27bb481e24d03f29f135eef38d973d12e9
-c251de1d9b976d4d7bb7b4f62dc7a6093d186d240db797432dfb5e71f8fa09d1
-b9b6cbde7b4674bb3f38967091b8b375c0e7dfddc0a206b0d8908707521254a3
-35be48528674c8597822a0a9e9ca84f0b3d2a44ec9deca0db51fa2ef3db16851
-7939ebef52b5af799ff6fe86b0cc459be94187af479e95651233f2515e01ccc9
-57130b01e6e97df375396f8499535a1fcc0dae920db25db41477263a847b578e
-8ac94e59fcb69b97a1ebf8d84e2fab6925bd16077d5a58403539acb40adbb89a
-55623d7e09a8481e71b47416751f01881ece4d94ea9cff6dabb3546ff2cde4cf
-1ba77ecadcd4499637e26c5064a342d71cf50d725c40286ad352bf97e0da521d
-58055ff97c68768b4435db372f0b3d23845d7709ac47b2a965327f62573a8fe9
-e9c5c435ddf12478bcdfde41c0e4303b03949446ec9291c553eebd9add6bfb9a
-45165ce3820af4264dd3b54ac41e4b2df6ede1286973660e37281c7540beb69d
-16a86ae03b8c5ce7ac142585f72a0cba8cfa3c71a54db60d1305790ffbaeee1f
-f31774926a1da96a37574c9a5b66daad0a68adf9f104123941ac4d3342c13bac
-b9b124ec9db917032e3f495107f3cab93d57751e88a5369e27358ecf4f9348ea
-543fb55c0492862ce28cfb1f28e0e5ffaa32df8fdca241db555619583fad76d5
-04ef599f233c424359768f6e8f0cea95774901577277dfd8f90418598e
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-cleartomark
-%%EndResource
-/F134_0 /MFECUR+NimbusMonL-Regu 1 1
-[ /.notdef/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash
- /ogonek/ring/.notdef/breve/minus/.notdef/Zcaron/zcaron
- /caron/dotlessi/dotlessj/ff/ffi/ffl/notequal/infinity
- /lessequal/greaterequal/partialdiff/summation/product/pi/grave/quotesingle
- /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright
- /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash
- /zero/one/two/three/four/five/six/seven
- /eight/nine/colon/semicolon/less/equal/greater/question
- /at/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/bracketleft/backslash/bracketright/asciicircum/underscore
- /quoteleft/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/braceleft/bar/braceright/asciitilde/.notdef
- /Euro/integral/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl
- /circumflex/perthousand/Scaron/guilsinglleft/OE/Omega/radical/approxequal
- /.notdef/.notdef/.notdef/quotedblleft/quotedblright/bullet/endash/emdash
- /tilde/trademark/scaron/guilsinglright/oe/Delta/lozenge/Ydieresis
- /.notdef/exclamdown/cent/sterling/currency/yen/brokenbar/section
- /dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron
- /degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered
- /cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown
- /Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla
- /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis
- /Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply
- /Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls
- /agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla
- /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis
- /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide
- /oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]
-pdfMakeFont
-%%BeginResource: font ZOVMRD+CMMI10
-%!PS-AdobeFont-1.1: CMMI10 1.100
-%%CreationDate: 1996 Jul 23 07:53:57
-% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
-11 dict begin
-/FontInfo 7 dict dup begin
-/version (1.100) readonly def
-/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
-/FullName (CMMI10) readonly def
-/FamilyName (Computer Modern) readonly def
-/Weight (Medium) readonly def
-/ItalicAngle -14.04 def
-/isFixedPitch false def
-end readonly def
-/FontName /ZOVMRD+CMMI10 def
-/PaintType 0 def
-/FontType 1 def
-/FontMatrix [0.001 0 0 0.001 0 0] readonly def
-/Encoding 256 array
-0 1 255 {1 index exch /.notdef put} for
-dup 45 /arrowhookright put
-dup 58 /period put
-readonly def
-/FontBBox{-32 -250 1048 750}readonly def
-currentdict end
-currentfile eexec
-d9d66f633b846a97b686a97e45a3d0aa0529731c99a784ccbe85b4993b2eebde
-3b12d472b7cf54651ef21185116a69ab1096ed4bad2f646635e019b6417cc77b
-532f85d811c70d1429a19a5307ef63eb5c5e02c89fc6c20f6d9d89e7d91fe470
-b72befda23f5df76be05af4ce93137a219ed8a04a9d7d6fdf37e6b7fcde0d90b
-986423e5960a5d9fbb4c956556e8df90cbfaec476fa36fd9a5c8175c9af513fe
-d919c2ddd26bdc0d99398b9f4d03d5993dfc0930297866e1cd0a319b6b1fd958
-9e394a533a081c36d456a09920001a3d2199583eb9b84b4dee08e3d12939e321
-990cd249827d9648574955f61baaa11263a91b6c3d47a5190165b0c25abf6d3e
-6ec187e4b05182126bb0d0323d943170b795255260f9fd25f2248d04f45dfbfb
-def7ff8b19bfef637b210018ae02572b389b3f76282beb29cc301905d388c721
-59616893e774413f48de0b408bc66dce3fe17cb9f84d205839d58014d6a88823
-d9320ae93af96d97a02c4d5a2bb2b8c7925c4578003959c46e3ce1a2f0eac4bf
-8b9b325e46435bde60bc54d72bc8acb5c0a34413ac87045dc7b84646a324b808
-6fd8e34217213e131c3b1510415ce45420688ed9c1d27890ec68bd7c1235faf9
-1dab3a369dd2fc3be5cf9655c7b7eda7361d7e05e5831b6b8e2eec542a7b38ee
-03be4bac6079d038acb3c7c916279764547c2d51976baba94ba9866d79f13909
-95aa39b0f03103a07cbdf441b8c5669f729020af284b7ff52a29c6255fcaacf1
-74109050fba2602e72593fbcbfc26e726ee4aef97b7632bc4f5f353b5c67fed2
-3ea752a4a57b8f7feff1d7341d895f0a3a0be1d8e3391970457a967eff84f6d8
-47750b1145b8cc5bd96ee7aa99ddc9e06939e383bda41175233d58ad263ebf19
-afc0e2f840512d321166547b306c592b8a01e1fa2564b9a26dac14256414e4c8
-42616728d918c74d13c349f4186ec7b9708b86467425a6fdb3a396562f7ee4d8
-40b43621744cf8a23a6e532649b66c2a0002dd04f8f39618e4f572819dd34837
-b5a08e643fdca1505af6a1fa3ddfd1fa758013caed8acddbbb334d664dff5b53
-95601766777978d01677b8d19e1b10a078432d2884bb42d1f224976325883657
-05acb022d1e9cb556e37af91917c78e98229e3a4dbf03ae741998542977ad6df
-1760fc1f1a479464922afda2cba7961e9da696b71205e19c542c97f25419c43c
-fa1a042ba0cf5622ffbd3e775d0d564135d99b9ffba011eebc4066b003ce2f88
-825936d7393d05d3804601cee9d123120fdf73624a9d4e361a28e998acec53f8
-7a62a0aee33be2e96542534a8af24497d1c377cd7f723767b44857d94c6cda7a
-c3d6f0087fa36655dd2b81eaecb31fe4f4a2fb1ea9fbe8b83d35826ac93fbb4f
-2bee014f41f8f276510cf5ce35c3954e8cafc521d0c3ab80ea8c7fc29427a1d4
-42d6f6c1800919e58de9ae12304d718ad80febbb412da54153469cd51a288628
-ad109baa77981525b3d9b0efe593537fcbb8520d38cccbd5db171a0385a432c1
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-cleartomark
-%%EndResource
-/F147_0 /ZOVMRD+CMMI10 1 1
-[ /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/arrowhookright/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/period/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef]
-pdfMakeFont
-%%BeginResource: font ERVBFT+NimbusMonL-Bold
-%!PS-AdobeFont-1.0: NimbusMonL-Bold 1.05
-%%CreationDate: Wed Dec 22 1999
-% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development
-% (URW)++,Copyright 1999 by (URW)++ Design & Development
-% See the file COPYING (GNU General Public License) for license conditions.
-% As a special exception, permission is granted to include this font
-% program in a Postscript or PDF file that consists of a document that
-% contains text to be displayed or printed using this font, regardless
-% of the conditions or license applying to the document itself.
-12 dict begin
-/FontInfo 10 dict dup begin
-/version (1.05) readonly def
-/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file COPYING (GNU General Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def
-/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def
-/FullName (Nimbus Mono L Bold) readonly def
-/FamilyName (Nimbus Mono L) readonly def
-/Weight (Bold) readonly def
-/ItalicAngle 0.0 def
-/isFixedPitch false def
-/UnderlinePosition -100 def
-/UnderlineThickness 50 def
-end readonly def
-/FontName /ERVBFT+NimbusMonL-Bold def
-/PaintType 0 def
-/WMode 0 def
-/FontBBox {-43 -278 681 871} readonly def
-/FontType 1 def
-/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
-/Encoding StandardEncoding def
-currentdict end
-currentfile eexec
-d9d66f633b846a989b9974b0179fc6cc445bc2c03103c68570a7b354a4a280ae
-6fbf7f9888e039ab60fcaf852eb4ce3afeb979d5ea70fde44a2ae5c8c0166c27
-bf9665eea11c7d2329c1a211dd26bb372be5822f5ea70d99eb578c7befd44cdf
-045a363056e5e1cc51525ea6fc061dcebb337208eff729802376a2801424f670
-0e7e6397b28f15bc10b40012b0a3eaeb2693e8f7f627c4c9c7c6c5bff105c1e4
-1b2b9e8f09253b76040d268b80719e1b3f5a55ab7b892ad5e69acacc6c1640eb
-3067bfc64938f41636db8831883bddabc6777dee17f2e84f1d530bc76f51c621
-75ec6b727a82c193d1c0801ac492bbe281b46626bd21f2adbbfd144793ef754a
-ea5f1cda3310e83d78a098160c66d6b0c68d4976898d9dc1a08d01740ac3e7f6
-8d3ce0a7e109104248cb86318400bd82ef894efd9c9456e97055286c144d3efc
-d2625110f1ae76241079bec19939ac962e0ba813359c15b07c74d5e9868e2167
-ea1199d21ca8827cddf1be8357261bd32e79fea6bc475577c5f6848345bce58d
-f5435281572ae6b33b53607ebee6f862d4c752aee43c00cdbfd258c7765b1358
-5d6165ee034e5815de79cc26c4a720607bafa6049710ee3782bc2cd84fe2473f
-1335d20a3b6e9e8355af36673cdbe63c27d4f0e183fedab10031b1ee33b9573a
-2e1961b7c6baa41f7c3ee707fe86071ede5756a00d7b3bf0a21b7c3cf41093cd
-66eccccc22f4534912cb900b08e69574b07f246305dcbc238780278aeb8c9e55
-3d096a944ec7aa9f697f354aa137df90a9547efec1cbd568cb999979f5aec6af
-a84edaee1564d178541cf4631081781608fd38964257cf89b1c8e0120b3f6af0
-793597ad553cee5cccd5c4f09cb0b4e998e6e76243191af7e93833d067833f0e
-53670d7e996ed67cfe6699a6e3815932ad272af4829c2ee08a30d3938c928d1c
-e89af71192ec1247ca233093aafa54ffa58f4aaf3fe9c62302e598f4ff8cc32c
-4d318391f7a36d0d8b416dd36d776b301425cbaf82d520141238781111a14cce
-7927e2af21ef837558002539aaeb170fa7e7e37efd447c37db455d2f08533155
-53f3c5c3be4817680efd0ba3a114db6aaba6c4d0d57b09ef8baad463996718c1
-9d155a62d7ae82eae4c82760c594a6ba3c7ee4290f0d898bb3e404ccaa91fea4
-eaa2146ac6a23f6c5a8aae834a0587d990024bbe8de485c71b916ad96dd66792
-a732a188e6a57c459ebbd7756cfd54770e2a8d81bd4618d916a30ec7084b2492
-5f77ab14169547eedfefb6f03c7d5365cef512df194628d5fbea6cf56d0f5346
-b6b6c1da1dd8d8321b88807b579bb6a0c8f69cd919e311b6ade903b470f4e0a3
-dd5015c6432452ecec048dcd14814e47def4a53c5ca6fa9e91d8a28c719f9348
-509c0e17d632f8cb3f7468bb0e7f7f6525c086dc7efb997a60e059d3d4938489
-23e60f7c67fa6aa8062594f122a48c54aa7c049859928a3dfc72752acad074aa
-416c667fcd176da4d7d31a9f6be6f146d4a9dc78f419fab7c9e6c74d40ea659c
-24098088bea26bf5a725fe56025d1fcf8465ed7103702aef74973f6fb697e645
-e902d65354a44bb3489007c555a6a08bb057eca27c93bfcee9de42e2782fed4d
-664ad7f2d238b7eda1ca4ad473bb9559e11a9f214e258ce1a2a60512975b112b
-336864238a36732c3adacbfd52c85a0dc809ff955f9c81401f72107f3d263999
-a69836d76d228ab4f954b00da07bc4a4e165f2dc5ecd8138cc408ac22217b15d
-8baf04408d4b47e55129b0e596c93d10cd42372292e1ff483868e8510076f7f1
-ed8ead1bdee2b49533f87ddbef2abdcbca432307f7ad0b3c3d4721f3e67e609b
-b06f8b7e66af7c843aa1f71bdadf0f4fb6baac84815c8154a0023cfb68282b4c
-8e24e478f81f8d26ef82d6d0e1da4a65478f4a1f65a7dfb4d1700207850c33f8
-148158a784b452ac6874080039e2259431c05c4522f1d67522e273b443ae9820
-adb5303cd0d839ffd17eb1fc6957159a569f64873b4b3bf99349c486a3af2b20
-b6b9c41263300ab0844d24daf780b4f324eda854d4e210daedc0e34f4b67fca2
-1265ea3764f8f755007b62e9e18e80bd30f3b96124065198c0a5985ba2172550
-8c8eabe77b26df4451f5068956fce111041a7d23f681ff2c1b93344fe688708b
-61a47674c318d078fc4bf79217659987dcd1bda1e1b74068960036c472906152
-cafe4a8a702d271a02c790ea3e440e4f415556ec703a23b7aaf7bc50c5a32f7f
-fee6426433e945c28be038cbe5ee0e7933945f052757d480c58d4d7dc4ab924f
-985e054fd553d1c037beaba29b14e823a4091b08ed602a69d1c3eb0fd63faa93
-36db22e6588d3d2fa727916163030958cc89b3ce99ddeda6190f97e039f9821d
-ab4e4d9a15cb5094041790b995d8950412bbf049bd1d8afeb8bddafc6aef748a
-f2523b8313e13f90f966c134e39d52e10b63e30aadca42bbac5962e4e3f71337
-bc2fd40679beb44e111250352f04cb0404158bad9f74416c94003bd12c88d9e9
-5cac3a3eb575733eb44a3c32946dacdb3405f5b4a2513fdf9e6bb2e6e21c5385
-6c527ccc120eaf95d400847dfc9e6a40806330442e1895b53a6188e57c65b466
-da203785fc322efd64f2e6f66f996bf7ca035bb2117648a8857f1b10469aee10
-dd22d785de27f01f1d725b56b380917004a06afc0046335f97a2ff20ea44f794
-c1dfd6b107549e39247a5cb3f9c37af849e9c5f06214a570113d91ad4e14d9cb
-aadf8ef93a933795c0cbfb7204dc605b4b3b95b9fed0372d8df634f7293298a3
-6aa4abd1f212ecd5d4ac49d467567385f80e163b9464f6554e48ff78d45aa402
-b5ee093a8f96da45504e41bfb1a72f579031efa801690a32f4e248a5f773027d
-da3f3721d4fb481fd1b8e81054aa4a700e9964a87871e01f03fe80ac4215cdf2
-7a4944cf89a893638730631261114f8aab967fe29e280124fa8d51fc94b1c552
-db58e038097172d5f634ceafb877d7caca03436cf6bf40afe4dc99ce08d3605a
-78e2c90ffe766fd3ac0e8b2ab247c3f689a55e350cbe80a9a452bf8666d5710a
-6fbbc45e4690afc625bb7a8a29bc17aa582b6e200bd5123e26b2d445992a3a5f
-7aa128c3f6230588c41c6c456655961b823e65d7471ad16f9aea07c2b3d39c45
-726f023ea4780719a3656ae18670daa3bc084e60fdf2ba1ff0204f285d72d9a8
-269430e406cd36741bb227a1aa28cedf9484689a78dd5495337bde66b5a790fe
-4af761c0b505ff974e4c7f67348eb1887b5b9315a7b3455d3677bc77b61d48ec
-f5ebdc73b25eeaf12a6c896a54b499ba5f2897b7da9465c34561b23e0e740eec
-fc7adf944329e003f5266b94a425f3864b167a34d0b9d259fcd8d741c9dc0fb5
-bffb8c8cef470f923d7962cb5806c67763358a9f6ccf78220f28e45a84b0ff35
-c585c18b19c61b51cbe58007fb852e0a92ed6d704f15ff0f863528db72ea3dd4
-3ea0af466fa5b60ac4490aa5db18a649c442a60b4f824e914915376a127dbe30
-85a3c56ef4233579b756eb62e04fea0a55503f88bfdf011436d9d5088e027c26
-daa8165842a4ddd43fc3ab8dadbb4d53c5ba9a5b51f33d505fe3ed168109f1f3
-9ac5c3357e48cd9e3adccf2daaad831000e27307d6cb2aa6ecf5f92cff39b266
-73b1d3587e029313101a9075ab35de260f23f3d3bab5f7a6134fd07c076dcd99
-7bf2e7c40ff0c0fa1096312b791d638b0038138ed5c578e51309444691c1b182
-8b346fe0286e13e3907beda13044177c788b4948a4dd398aa9fc317665b250a1
-3570a783821db58159b825b14c2a639f62995a049eeeb8904226a8f8e14a7959
-731a74dc4b215d7ec095ebe86a3bf07080cdb0dce6d06fcc2e3a57bb04944f90
-8f395bd65117984c1596303c2781e3997bbfb6ab9f354ebcea7404785d8dfb04
-b19a3a6792807fe5debd6eeec1ba9ba9a37473d6c435bdefd5b2ea9c21d9ec79
-0043b5ad1b0a50f9a24594d00f8fd155681c33df8f0c0b3cd5a4fc275da65dfc
-6c65ed8713956bb94b6281a4f39c8ef72b932adf3f6ecfa697ff7d84f93e7a29
-8fab7b48172e32ba7b3135f4a2501961f4a1c50403fc38c715743b55095ecc1a
-38f11f1475521fa00f950776279e8a377fb4ca4870c8daa4fc67efe4db8e37c0
-d56ad93cd334ebe18dd6d92a3ea48b29e7e76eec5e8aa0db20ad690869053422
-8567c4b72be2093426677988f8ac9f7fcde0dac8bae175066a485f3b1d0c2129
-9e38a93996a0eb7a3357ee43bcdf8749bcfd7e7e0a23c7d9e118c4da7fff5661
-07454fc1ab28a875af7e512b2432256c401ea462d9aeb0a2f97270cf2aa8ec53
-1e5248ad52b1b74a376faaf7772e948f433cea2f0ed4dabec00855a394fedb83
-1daff1d977e9b816ebd27801505dcaa51f9ab531e6c1358b275d3a6ba38f4f4c
-528f2dceea3a404a6362e3cfef9d904b573571a4e634d4852f3b922495af19c3
-c63c736d1e8a5b15cfc4da58f26f22be233b4579377227110f8fe5b0df57b495
-2c14d2011b6215b855c36d901f001e24261089f5edd39f7e5bbb2bf90c6f5c5e
-7ba8928434f52689365ed48123414ead2e00f8860e60afb5f59d2715c4ee2b3b
-2b10399ca1c3f70259c63762f64a5a1cb6b1995030a7d775a04cd77a95436e4b
-c3b1f3d1959ded9f35fdd7fcde9b051245446dcac11fb3d0228ce4c012a2f201
-81ec3dd2aa1bd66ec02c93e4784268f754c9f0eba42d27b755bc58ad00e09e04
-e05fd21ed0c160353d2f5467b5903b4e1d1b8666acce06ada99c063c684d8738
-3d338c579595d1e2ab301c4236183cf2c3be0320ee83cde4ea050160b58787f2
-bad8154825c9b29cc14682e15db5f53aba109799c10f25fa2e54560fdafe6c91
-c246ae56edebe0aa30e152b61fa64e517f6cc41ac7b3c25ecada33e3f6d6ee5f
-562542e0e66d9c07aa9889505d51452cc2ee73e3683e3fabe26f003b87d9fbdc
-a376e85ad9547c23e463fa073429d32ca0e58326385a89106d5b72cde3c00c11
-c5f40d1e8b61e6cb1cc6416e28afa6caa469682ec8365081a21d77a8b1df7167
-6344226bb9a7533c0fdfe153878a3af3088e520b94933d0099c2ff89974bf795
-d871b9e5d40cd7aac72a99f351d824f86d33cc89bd70dd41f1a866657bac3a58
-a4eedf997eb49f8d967e148f381e753d5e67080d2843d44a3585e078615bea47
-6c882773d995f4154fdb773a7d9e29fe46e464e602cd206063c96fc51c30ffed
-cecdfa28a951dd5211acd684ed3efd9feaa5aa98b091aece8681999d7c8ce708
-1c64f09e18e64198b841d7824e03de11101493975ecb1b7d556714725a14bdb4
-5d9237ecf693202198964c1554a04ab3485bbf9ff863441da3511d8fe6363e32
-a38a11f4dc6a1ee18bfa3a1c2c93a90675b0c21959054b17b1af4d533c87ac69
-08d0c344fe817d6817a74fdb46f35d3b48b9128784f43a68d809425c6570c600
-9a76199111e88a1c9802de558332000dbb9d1211929d509af5915b7ae8ea1c3d
-d2598f5007de8e7383f7453fc6a9c0b91c80e9b1742bf6418dca69450785fb73
-12dd228889cfbc3f6711a26022b29f9295ee1ca8459305fbf2b93cb3fff5b6e7
-2b5c1d2c4d453f0b9a53b6f361136b1048b30e7c90e0de8edda423e55ccb2e2e
-ee7b502af2baf30a92af542869b8f26ee28509dc01492095e0c27ccaa30e0db6
-3f02f11dc0ce8a94b8a8a7ef735e4fab04830ef077a8d788b224c184339274fd
-5f7b547b77f81bad985c73b05a79d3c8661a9c2b71c7313d8b9cb50ae03aee95
-2dbf1afc9ddfc00d59e6f99021dffbb66acddaedf48df5462fc528dfdafa5e5b
-a039d6bb9bdd1a78e47684a3c53ca307abd566093c2a4f6b9f0be52d4f1f2758
-ec48370eab4e1e6ab393a23358bae52fed3b270124639dd0a56ca6afce77494b
-34f46433cac90eb63e7e0d25de6c8a0670b14e83d08a531cf2148002f9a6df19
-7f87c989b831c509df23057b3ec569eb5f5f530edd047a53b5b59f483703bdcf
-b578fdc44ca7487e3d39479ca4760457e7018af01116b29bbdf7c3e0f5c07a8f
-7f502c15059d9635b7ce630194962e4183c3838d9401260a743d8ebae1665ce8
-73bcfe5d090a8984e98030fe6b21dbcb49398b6905ec04ed310e37cd069a85d3
-7cd9e3a02dd8e036b2a79192ec036cf7e10653e08928cb8bf4911122d27e195f
-48d3dfaa34122ef2df8e023c9ea1f246af2879f5df632719bf7a91f266d823aa
-caefce067bf74ee0d625cf128c3930ab83521380e0ceb5daa2384da4ab23c34d
-0db8a4acce1a33b6deea3581efe521279147ac1b36e4f6b2c08df2b2dbab051d
-264a250a06ed06aa906c2682ad2ecdccbfd880941bd824d021f086560bfbb359
-e2519a2708a4976f42913465e18872a93cda809a85730a4930ef1e3e733292c8
-06c80c8865645c6a69b128b1333c3ac8c616d3e3a0163aba54c7a51a063fbce1
-4018cabe1b1ebdafaefc27d2b22afc96449cd515cced671baa88d51c5c778bfe
-00208127f1fc35db9c6afe4fc91dd0bb1277181508d7b9868a055025c65394e9
-ab7a95494118d20fbdd7ce0b5f11492df5e8c54c1ce1ecd2e7279e07fe6a62d5
-63d7ffd38f04ba75057cf190319634f57aa246f03f5f904ff952d7b1006d43bc
-ce88d89ade52e861aefad538b644942b6b97e778000de2f2ac2b2280d85a823a
-176d8387ca420a441980d3e866604325917f78572ec9ba14a0944e37480ad3ff
-9c10590c0705840d09c8bb076a5aae81b5e315ca901e262b773143a554360fda
-3dc799fd07482666f47c17d8a5bad6efa53f20707869c5fd40d940a885310cd6
-d5ca9c351731fa69fdf0bfb148e17ac26ff43bfbb38c101867ed95d789ed2b0f
-61820249b398fac0c5eee32032984302eb1804b82bad515d721213732ad43b95
-d4a02e17b22159ca29e300042804b75807782b9bda49255cccf4e35c461ff59b
-65e36f6c6345dbb2e8c2f5445031999c2d8f0444cf4198ac17db48199c3b3fec
-02a130d230aba456406e1070178bdaafc422343ed9edbf471c965d2b891586db
-a34bb2d66f98f716e605799f3800c68000941a52d691640583cce11b94cb5599
-29fd0d5e8a9307831fe15fcd232eb361721d0da9e7ce111ff1ebc256a407372a
-253180e51f1800ffb0313c2c3f3c4fcddd59f824dcd0eaa1e59837487288b558
-7f8e6d27954208fb815ed1d54a36476a95c660751a2ce7d475c72ff1784c363f
-a641595eb92e65d9e7bfe18eeffeddfe82d9f6f0cee37e6a9e60b44939263272
-4816df40ed24551f0d07d813aba49a80bd3560188e5d0170385fd15c34b45465
-3d5d59bf7624ab116452ac28dc9217b11c75a08d68e55b10e9567a9d3d8d5da8
-89116318aff25efab611da69e132ba2ff888d68c84c056544c0fe9137faa8344
-4008487c34ff2c2376558ce20108f76582965fb06c2129e607a0e60889d97fac
-2c71a026299b071ea7f9995a542b7e31efede8a4d341210a37f7b4bb96aa7c31
-c873cc0c3edff7b23d8a22e7e601ffbbab0f671b02ba487cf6b588ebecd26f9b
-b7e8de0cbda870662bcca90716c0ff768a9c7c69c1dcb4086f1e881c6dd5b3f5
-0ac517ca096f28b1c7ac9195f99e44d444017a3bd54a68f4588f0a7562553053
-8bfaf7788a7243c30446213bc987e3383913f24b36b33e4b082e507cae63358c
-9675599f6d746305a417fe8848f37bf85f4535e28ddbc5868dd6dbd3148cdc1f
-2c2d224f00c3af4c1ddbfd88bf79eec76e45ef546cae548825a0bca6bf93b0b1
-373af60a7b24a75079d6645d0908a9f55ed0fe7397100a730a6f4e55678714bd
-90c887e46a2c7703b13b1dda74a819b97abfe6275a24e73901540168737a8b32
-ca1902b7577b8761b3c4a6b60dfad490e35d71c5f35d8ef382fe66433336951d
-e4ee981f980168853438755f135c333b8723d5778e2e3067dc73b7fd99aafbe1
-d5a2d1cf443905fb45730ce8fff14674abded9f94b45756a646b4cb1f789c7e8
-0748f3641a22c01b10adbdc77760c0e2a0b9055c4f9107d935f5c2fb2fdd2845
-6d6d2d2096e4baf14bcc8d716adf053bfe40845f02c0d18fccc453f3f8e45458
-69f802f506ca21d0fab24d7f3d6d6c219637a2dcbc58614c1456a9c6b0b0f57d
-09cce675fff4f626b1b68c0a63fb9a16145d58176cf27ff5d3513dbec6014f3a
-2b5de7ce69c8ac2fc184bad23950b28cf0414801764967ff97022cd4865d994e
-585ff2c992d480de31f549f26a18e4721133f3d88316976bdae41431d44ec8d7
-4eacb29aeb132ff49e3c646ef025eb541dcc54f38b8aeb562887ed6cdd07ffa6
-cf3b2f89e4b0fbb5226702068b8043b6e2f284e4350c97a7498e6440bc3c8d2d
-27d8aa1eac980e960613180ae4224624b2c6f92ed4666e391ae5e159c0ce207a
-7433e462cd92aeb67eb89fdcd20e46f17f3d15ee679c064176a2db0ad5c38eed
-7595cf6ab9750fca76e8e5ea2443b9d13da375ca2a2dc87fbd3d81ed58e366ef
-94952cbd918134ea08f90516854207a2fd92799c410ed1fb6a9c36877d0b777e
-ef59b03f19bc6b8fda91ab8ae21c89d117825a1595466da10f20b86d6d223cdb
-6976312c7fb7bffb58feadfcd019bacedce96ec239b5a799005e94bdefb9ec40
-e717a597326b5330f38fbf708d002c9eb8d8ea0834241a35e3a07a58a030e678
-5812bb5de1cb511426cf49ff39647db65d8a7f2f87ca5e903eb1478984abcc17
-c7ee0b1f7d1e9e3b81c663abcce77a90f1cff1b01f116d2995e65cba0b3f1a3e
-80079ece2fc25e0f5cf24507c99e5b6e87a417cdf29a1a8c58aa747afa962c25
-14671fbe467e22931a723a236aedff5676acde6ee71dc9eec11301af96927274
-a732813a49a473edb7e9886b6c45605681a563f32745d60cb4a26a7064406756
-c9add724e9b400097377258e81cfe085b1abdb3a00354353b50c9bd11a6e655a
-d264a203708f739a46e4322a1a8204e32ae385d4f7694d6ad63f975986ffd869
-355b7ea9c0feef8f6d7bcce3128a0e45853de0a5f442bb805166c7906c9f1023
-df70bca683907a0bbc11249670f81c522441aa6fc4e7889a38d15ead8cad4ccf
-e95ff5438d0edc450e6399f0228ea318dc2979e7e5a36eb76f9d81061ec8c615
-217d9dc7a1d0924dd953ad2b741e48357953d43186da75f340c58b7d2a6c7eaa
-3038fa4b66b0ccea51af9610e5558d82bf79a301d73d57b6feaef32d6f19e801
-e37a3c1ea341bee088e322faf9ab5ab1934b70f894853984abd5f34c4d3fea05
-5ab4fc70179cc9f1379f98b3d1f529f3c2aa4ae63b8d2bfd46afdbcda8ea11be
-f32c93eb4d435fc37486a1cbaadc3c98de581ebad18f35175d7b3e67c9194d5b
-bb3cd1918e86daacb86055a548fab07ce7c933bd984eb713405d2b3f48124432
-a88e10b97f7be3a270405594d3e06c17b47719e2678f0f069ff1abfe7d3672d7
-6a748a9e277ffdd25f5477d0c9d60d7e8da9e0ef30e5fd6c70d47d31637bc0cd
-4d67f5ed2b103889a61fd11075aabce9f2517ec9b53d7db5b27790d9bb1e19c3
-d7c3a7e1b95516ee38062d4ea759151e4de0449e6aae79500c42b4efe4936d0d
-000fb3391330c035d9d6b9e25671f9ac599a40c37b2439c06fdfd988abcbaf77
-0e42d324e8ca78613f35ea64aa88c3c43e51cebe8ed1067cad94ea0387783e03
-e76af474f739b9249d1e95eef85ab528e8cd2da99e33c7ef0ee9df694db43f3d
-fe467e6fd1b5291ecbf6b1ac7a25c002dee8be0727ec5439715bfd8f854843ea
-1d080677f64889d70165f1bad110a8baf3885629f8ddbc3d3b09c57dea28b4f6
-7a3c042ce64d636d0bdef920ab5ef9544f52ad533837867c4930fd4dd3213e18
-ae2ca622e0e218b1bd54bd60e01d4cddfc2e9b64c6c99e79ab2c3e52cbefa598
-434213d475b6292190b89be95b3c6660133e1b498bd7ff2fd14aab2aca0dffaf
-62d9df30c19ca0e949007dcf8453e70e60a519674d305523d33bfc3119037236
-19cc4ab1707db2c4984c6d4fb4310932e9ede7808cfc7d343a7fda08068966d4
-7877d7de7c0f5ffbfaae5666be3bdb48de31c5ab6bcfa7d35816e5862bc4a13c
-ecf2355935040fac37141f7bef7e58f7b025e187df3950edfd6cea20d0649071
-442b2916ebce5f4d3ce055efdabf1c2dc348ac0ae6777f679e2f62a0a3ee9124
-7fc855bfc6f0c337a74c44ea1f5dd32ce6183a4c80a6b967861f6101c28b72da
-d6aa1128f196627e24179c18f384e27cf7f81f43138381d177f93f8082cc9d56
-1b3c99f1bea073a1a81f8bcea131e3587b397937c4029d486fe6842a709558f7
-43cd16c8f0a5e4fbb3e522663b82e2544a6fecefd3d8a2b222301fd4988c0136
-859e86087fad63292bc4187412731a966710ca9ccb86329560d64be31ca4b526
-82245c1a487046ad21dd9a270e3fae72fecdcf9608784f649a25474034ac744d
-44e14e72d02ff17b2252aa5273de3ba3cd71a95070a9fed0dff80653b3d346c7
-56119529e5bcb6011d341e368827cddf22d4f99f1781829df808507e2b4ceb13
-211b08f55444e75a005639a20c33706f8985f3308c08f77e72dbfbe049ae8177
-c2da2e62eb58f0fbb369f5bab0fff49f9d4765f931fe66f8aa107d8116becdfb
-466d282527bab6fa29721678837cb46d60148a7fd9cae63d6aa634d23ee21161
-ef9e834520f367903a65bef7996ab77d37ba97aeb2a7a8c3502aac988e7a0430
-9d67a06db4a90714fd1a933402df0830026920bf1f71cb0379bda8714415c9bc
-e7795fa4ebc37e819b3d8ee65375bfdd6b36bda41b7791864389e9b589919ee6
-2872bac2e221b28150d3024a984033899e5372ab474b9b4494f7bb4331b6213e
-7953565f35d2ea6da212956dab01571cbeeef86293c58a259860e294f69730e6
-f141680cf75d40e829f9679e98341fd1e0817cb8e40cd6c4fa691ac691fb59df
-b78e87add951eac41ad1b4f4fa45d2e346e0fa73157a7d2b2df89ea56a80e885
-9e0d0331d216db4f1b95d662bad40e472f21bbe05576ce4a2d27af01880f438a
-30c17bc65fb460ac1b3e01aa43aa3677ba05a437fcca3ce4c2864d99c701d79e
-3a199dbc7e2f00be8d4347f96b61ba0f88e90b49d412d0ed162e82715ea04c27
-af3feb0a7b3e4dd17c875a51e9bbed3c9e10eaabeec0f029d94fa90d60605b52
-2dcff539fbc323e7f0e1cbfc1a192a44345efc070bd5d5939d9f4383897704f0
-e785126abd9f582f1afe88a727784afdac3dca49892c6beb52cb1adee18034e8
-e88a441890175575951fd87594b63751e69165496d566bd23c8db4b9239bbaa9
-ef5058f5b51c74cf70632f88f1a05e1b40078c183ea8433427f63a5f68a1b81c
-bd46625b8ba2cf713c001cca4c74a186f93aaa3869a517dd64f1e81c71823239
-1934faea604cf4d9ddf974fb09c5786bde05978bb25209b5c7648602dd62c32c
-61ec4b5ce1177185354dd5cdf15540121b6d82457ff3111db1aab1889fb0e3c8
-38cbc7a671ba16a4bc567d9cdd427205e8f4de7edc64c00bb6080071130b43d3
-6e7919a5b7c29c68ac505ff107d1e2ab66a3417612ba2f461548f1e72c702a19
-7a6311dae649e46768d85d759281429b97a35379b84c763d35cfd434a4e3bbb8
-4c6e5ee8dff3a7449bec14c785bce1d4c617217ee6315fda000f0c54d1054e80
-c8f9f452daaa465f633ffc3eeda9c76e7a77024eaf39bd5bc9562fa44f3da9ae
-7e665a33bd22aae6dbc1d9efab63741e30775eeffb819ff933342c8e6b978f8a
-2aa20c2f2810072c4f2437e7cc13861002ab6d5ee84a6f80549683a34da3cec9
-e3471d112332ea260153836fa24e22eec0cdb0a5b3b0773cfd237daa67c55aa4
-cbf1cc30f43183a93bf7d7068ead32ac8064bb1f0a8bb61cf5472bcab360cf71
-b61c3443eae4f1ec7fc0d883559f8a2ff2522dcd7dad5f395e9ab2454cca6dad
-07bb58bdeb1e54f75816dabea8d170974909b2fad53f9a69d97eb11ff20c6aef
-eb6d76e9fa93c317115602db90359be638da383d9e01f6bdacb5ac5bd7c77d42
-d80646ace9f2384774610f63f97d70c4e81a2871be0a5b028c88afd82a3b6376
-5d5064a6786a829a6e6320120395b1541bfd6e3ec182d50982d7bec4140f146a
-06890a79b85a6f20f9bf616f5f56e02752c5d177a48aa2f8ecb67e42e2314850
-d2109c0965a55d1e0f470371443991f9b8859ac70bd6f049dbf57ccc8e2e3c67
-eb8d1b4f36c660746008460ebc0f7284c802925206b968477a503dfa6879794e
-7ed82fcc58443fa1d95fd561bc9d3a2ccb2bfa19916d8a88e6f7eff0ce0a7d4d
-90c77f63bc75f3368f7a97dea9d9392e3f499ae4b8e53602636cd53ebdb42213
-c2668a3c618a76f6f5a96fc33c0e41ef620a63e3c52512c66b59f810c6b85923
-d81ff8618f42ee19b10d4d088bd6b784e4f9bd6bffe083161181b2f79b374fd4
-b846650d4b95b6c3e58449d8f0a201aec72d87588c54fbb3112045040109a3d2
-d98c778ed3fe07f54010773b628baf29ad3b91072fbdef7cde0b969d0b695bf2
-5d386c6b8647bfd55c169374c57d5bd8fb29af5c5a6718d7cee318a06ad35d96
-fbf879929e28bd43b583aff2769688e087b00ea95b28629a71c6ea847f988357
-da9e23422fe2ebc4c33f183679233e0d1d8150ec58ca6ca0bda2a529e6f6d146
-92010b1eda6360aac940ed23410455209383b68c3a1fd68a0ef92d16cd4deda9
-9dbedb1ce18a79817fb3d043f919f1b98c62ecc70dc27886b258428ae2d1075e
-ef8c1225f96be5ee3c1b4e127d26bc2abc6d457333a0d5cce99dff00f3f41e0b
-a9fd7bac9e96691cd316abe913a6edf95c6c5d37086cf3cb960b82684ce473ed
-574fd8c6ca059bd679441c22e6c39376d3a33c8011361c834bbd7b87c345a9f0
-c6cc1328b5af926f763bebc13be92238da171124de119a097d65e5d623cbf157
-a4e93e250a6bc34bc54feb2889da3f5993eff0bf38ef6e440d0bdb405746aa70
-4e5de570b0347d52b25ae9e0ffd758b8d6da1a57e47289a26d0ed30e31474273
-c2315c74a39e6b26f558dec140d384cd3bbd7246bf46a0f7becce45fe0c343ce
-78016204e814dccc58061d48ffc808423452985b12d28c94eaba89eda793f7b2
-8d9fde11f30434bdf73c48484a814ebe541f4e6eb817de43146ae4e04fa7129a
-ec0e4b92ae22a1d2344375f68314d839aade59c4ac1d556538fd7a9f7ee9a139
-f3620952c6c45f7181a6448a807a1bf62cb59f440199297cbc8a360d0168c153
-7c6b3ba56dd0f7f104271138846a6f305f2c8a7536512c54a1c46232606a6649
-81a8083d59a4b5e8ca2cd0b70dd0b44bef1c2ae9ebcbaeecbc7c4bfb2ce309f7
-830ba06f3c8e79fddf737451a67d8c4425c51e11f832d99198c16dee864b4c9a
-e48863f5a3cd0e6f3c5b31a6bff527bce260aefbc40b1d8065d2f88f97dd9ff4
-8b21d069ae8cebaa511f0d00c1da76207821859bb191d5f9261adff3e6417788
-5b493db49420f472496a8207d3f2d64fa3304de0e78d6259a626d8fdf81c51d0
-f81ef8c619507f0544ebd3aa8d1f200a5ce240a1171441438d6bbb19c0850bdf
-4a0147baf4787513752e4e052a09d6b94bec96107e64f6b2692bedf2a38863e1
-15ac2564c0eb10fb923ef3d505f750bfb6407856406cc92e9b2a3a810fb49ef8
-e8f445c2e32b30d352fba6fe345c8af241307e76c13ed376554b857b23f2b10e
-9f4f1d6b25ee850d744332fb73349790426bc3adf811998f84f4721247ed9dc2
-cb33d343ed9fcbdd001d97708408a4885ef05908333546167859788124f50eaf
-7f9cd5b7a9f4a77b2337f51569fe3fb45e41dc50394ec963851fef76ed67592c
-bac68e378043d77137974cb61772228d63d46d92821662203dcc0dd1db375bd6
-95c9153c7226202ee545aa36b0bfba49bba59e918e3bcad377cb461d52442b9c
-d159764090efaa0a887a12b0c9884d4eb0cbae8b2b5fe1d68b8b13abcde73223
-234063907a8012134dc42337f131ce012a98e582fcc50c9507c1f87b83d62dfc
-bb951dd48c3fb078aaebfa25ae1908f87d97915d86bea53e23c2c4fd426210cb
-a517ee3681183d327a5ab42c02977c3221213e76ed5f986ad6bcc14f50651367
-f142a4dc6379213974fb90a7be
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-cleartomark
-%%EndResource
-/F392_0 /ERVBFT+NimbusMonL-Bold 1 1
-[ /.notdef/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash
- /ogonek/ring/.notdef/breve/minus/.notdef/Zcaron/zcaron
- /caron/dotlessi/dotlessj/ff/ffi/ffl/notequal/infinity
- /lessequal/greaterequal/partialdiff/summation/product/pi/grave/quotesingle
- /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright
- /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash
- /zero/one/two/three/four/five/six/seven
- /eight/nine/colon/semicolon/less/equal/greater/question
- /at/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/bracketleft/backslash/bracketright/asciicircum/underscore
- /quoteleft/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/braceleft/bar/braceright/asciitilde/.notdef
- /Euro/integral/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl
- /circumflex/perthousand/Scaron/guilsinglleft/OE/Omega/radical/approxequal
- /.notdef/.notdef/.notdef/quotedblleft/quotedblright/bullet/endash/emdash
- /tilde/trademark/scaron/guilsinglright/oe/Delta/lozenge/Ydieresis
- /.notdef/exclamdown/cent/sterling/currency/yen/brokenbar/section
- /dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron
- /degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered
- /cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown
- /Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla
- /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis
- /Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply
- /Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls
- /agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla
- /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis
- /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide
- /oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]
-pdfMakeFont
-%%BeginResource: font BZXIEB+CMSY10
-%!PS-AdobeFont-1.1: CMSY10 1.0
-%%CreationDate: 1991 Aug 15 07:20:57
-% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
-11 dict begin
-/FontInfo 7 dict dup begin
-/version (1.0) readonly def
-/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
-/FullName (CMSY10) readonly def
-/FamilyName (Computer Modern) readonly def
-/Weight (Medium) readonly def
-/ItalicAngle -14.035 def
-/isFixedPitch false def
-end readonly def
-/FontName /BZXIEB+CMSY10 def
-/PaintType 0 def
-/FontType 1 def
-/FontMatrix [0.001 0 0 0.001 0 0] readonly def
-/Encoding 256 array
-0 1 255 {1 index exch /.notdef put} for
-dup 32 /arrowleft put
-readonly def
-/FontBBox{-29 -960 1116 775}readonly def
-currentdict end
-currentfile eexec
-d9d66f633b846a97b686a97e45a3d0aa052f09f9c8ade9d907c058b87e9b6964
-7d53359e51216774a4eaa1e2b58ec3176bd1184a633b951372b4198d4e8c5ef4
-a213acb58aa0a658908035bf2ed8531779838a960dfe2b27ea49c37156989c85
-e21b3abf72e39a89232cd9f4237fc80c9e64e8425aa3bef7ded60b122a52922a
-221a37d9a807dd01161779dde7d31ff2b87f97c73d63eecdda4c49501773468a
-27d1663e0b62f461f6e40a5d6676d1d12b51e641c1d4e8e2771864fc104f8cbf
-5b78ec1d88228725f1c453a678f58a7e1b7bd7ca700717d288eb8da1f57c4f09
-0abf1d42c5ddd0c384c7e22f8f8047be1d4c1cc8e33368fb1ac82b4e96146730
-de3302b2e6b819cb6ae455b1af3187ffe8071aa57ef8a6616b9cb7941d44ec7a
-71a7bb3df755178d7d2e4bb69859efa4bbc30bd6bb1531133fd4d9438ff99f09
-4ecc068a324d75b5f696b8688eeb2f17e5ed34ccd6d047a4e3806d000c199d7c
-515db70a8d4f6146fe068dc1e5de8bc5703711da090312ba3fc00a08c453c609
-c627a8bd98d9e826f964721e92bbdc978e88eea0a9c14802ebcc41f810428fa8
-b9972032a01769a7c72d1a65276f414deedaf1d22be23f4705bf5ef31b6a3b69
-0c896320f09e9875b50220a5bdbbd57c041b5ea97f421685a7256b0d9755edbe
-d05190dabf1c3dbf558258163c8231d89167a816bba55fb1f14ad04320ae381d
-f783a9eacee8ae5c1838775fe2380bdd1f3afcccc96d2a2dfc999b52a6689c51
-af82b8d63205b339103134dac7e3c45e6693940276041bb07ebdb9b729e8ef0d
-ee8bf450fa42551be65217fea902e28decc09580b504f0f52f1e8fc5ce7ac28d
-c4e47f908fdaeba23827a97a0aa741aa7708f7bbfec6fa69cc4f7c3bd4
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-cleartomark
-%%EndResource
-/F564_0 /BZXIEB+CMSY10 1 1
-[ /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /arrowleft/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
- /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef]
-pdfMakeFont
-%%BeginResource: font WWWUTU+NimbusRomNo9L-ReguItal
-%!PS-AdobeFont-1.0: NimbusRomNo9L-ReguItal 1.05
-%%CreationDate: Wed Dec 22 1999
-% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development
-% (URW)++,Copyright 1999 by (URW)++ Design & Development
-% See the file COPYING (GNU General Public License) for license conditions.
-% As a special exception, permission is granted to include this font
-% program in a Postscript or PDF file that consists of a document that
-% contains text to be displayed or printed using this font, regardless
-% of the conditions or license applying to the document itself.
-12 dict begin
-/FontInfo 10 dict dup begin
-/version (1.05) readonly def
-/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file COPYING (GNU General Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def
-/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def
-/FullName (Nimbus Roman No9 L Regular Italic) readonly def
-/FamilyName (Nimbus Roman No9 L) readonly def
-/Weight (Regular) readonly def
-/ItalicAngle -15.5 def
-/isFixedPitch false def
-/UnderlinePosition -100 def
-/UnderlineThickness 50 def
-end readonly def
-/FontName /WWWUTU+NimbusRomNo9L-ReguItal def
-/PaintType 0 def
-/WMode 0 def
-/FontBBox {-169 -270 1010 924} readonly def
-/FontType 1 def
-/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
-/Encoding StandardEncoding def
-currentdict end
-currentfile eexec
-d9d66f633b846a989b9974b0179fc6cc445bc2c03103c68570a7b354a4a280ae
-6fbf7f9888e039ab60fcaf852eb4ce3afeb979d5ea70fde44a2ae5c8c0166c27
-bf9665eea11c7d2329c1a211dd26bb372be5822f5ea70d99eb578c7befd44cdf
-045a363056e5e1cc51525ea6fc061dcebb337208eff729802376a2801424f670
-0e7e6397b28f15bc10b40012b0a3eaeb2693e8f7f627c4c9c7c6c5bff105c1e4
-1b2b9e8f09253b76040d268b80719e1b3f5a55ab7b8e134d4cb5abced39ac635
-da001e9934c198a7f9b9ed0028a85e9ae00421dfd8eaa3bb3b4b4ce45d209303
-237bd51809fe4d880900b1eeb236aca87b9ff6ebe6b994a60af5d67ccc42bd56
-77295c346eb4c62bdc1ef22ee07daad928dfb73455f091f32408ed6430b97417
-683af27a03718a156e3f6e7b6e4f2e8177503cd82ddbf4557a3ccff4c858ae7a
-f7efed6cc521a28342436b953e4650b5792be85ea2f989eb6d986905a61fa38b
-96e1bbc830b74469150fb0b598a794fd80d10870084a877273a9502c3456e5ef
-74350e6e3be5863e8ba185eb59fb87b36566af71200b6ed389d1287d4e925e33
-b2383ed05d87d48586e698fbc5d562ed9d8a09ec3eaa1b1f300224af20c23f26
-a2eadc74562571da84b3914d1d80b127c6ff4706c7046bbb372a0013e0ab94f0
-c27946583871d272bf4f20fa84e89d745de7bba885cc09ba72e0f530ed4ef7d1
-864b3c67007ed98800284235372f0a70c912e21e851afbf812165b8df912cd1a
-013e271f0b347967876c68ae4c4107ef8ad1f170916210034c66394a9d971b68
-fbfc1131e37fc178eb97c1b2a0f573add9d7c0bf944e6529734df8a7ef54485b
-a3375cc30e9e328943733cbd352bc15b06c85bfb4a96994291c72a0eae84fb01
-0f1b24d0125fb8c16d60561df8bb7aa7ddfe9549afb70c1e89424214609fde41
-9a142892e30f02754fd234ceb3c59a2a04c06bab7ae40e8fdec50559b8347684
-391c750987802d5452c47c1e0b5f222de9a0eeafee19d796ff375a1e1ef0aeed
-1bcac4f485fcaee18aec585d1a9d80f41871dda45fef1eae82c5893118987beb
-4d9e345c27c7419fe65e4853b40537d822e34ff1e0bd2819d21ef607981259e8
-9f1040a2d708d7463858aa5381759ac49df4dddeb209a278fe60bd2508aca0f4
-6a249a05b652e4c7bf1b676943cdc4602910fa3ea7636985a10f637832a5abab
-9c7a580d605929d6d7154506217252a755beb8462d30a798ffa9b26e500eab24
-7e9fd612c776ae60423995dc1852686cb041e66357a9acd4b6a4e9846b1dc803
-23dab6b7765205d82b50cc6394e725c19df00f7db427341d514047e4bc594efb
-a262eb2c414e43d8acc9cb195d12f3b2a9748f38edb3ac3447d27d20d1e62bbe
-22f6378e508f0cd6f17ef1c500407f6d442e92ef2e00b8de78660d87fd1c7209
-ea67cdb37076e1eaaed128814a948e27e1f2fa81fe54be6c57ef8c2b2e460f08
-6ff1bb529c9100b1d878dc9a077d21805e89d8b0fbc2a074e4b55a869c96fca7
-8117347b9cfa480ff4a37b34b040a99fba99942bd86ce4b46ff5c69babca7a3a
-f5018da05556bff71ecc844b2b718598f0825cda3d19d714fb66472621113ad7
-bb240de7dfbd1f17ffd8f2ef4b85a8eb6e1bfdf26c7f98168197c02c4aa535c2
-0f9ef9b7cb7f1d174b2e94953f541c3b84d43366e0e00a028b98f990b4d01515
-3ccc2e1853473bb9b25857e4b8f9d6695ef332bd3baa9ee551a4b142defb7f03
-97cd075ef9cd41082ccbf63e849c48835e105923e725d41d2b5ee0c3f03a603a
-161713216af97bd21aa87e3a80d75383603152011530b8abd2294d041e90a040
-f61baf86be97f8daa8326eb1a2b4511425785f35f75835683515af6cd0e73194
-2b25d5fa8c7e12ccde33aa193d61a35eba7f7e101843e35dfdf3e07a1442b0eb
-f2a9084634736a21128843df49c84b1061d0826777a754076c4c3d0a68b32dba
-ed4b5c0746ddecdd79fbcc7a4425eddaa7f49257148f05ff52ff6bac71cb65ca
-8ad5869cc9fd7c4c194ae8d5d20a730a035234d8f9a6363e7a49fc22bbd34d08
-eb7fd43a678be52b95eccf029a6b18a512d30ceb0b6adf80ff1232dfda1a5752
-b5222edd9012b45cf0df0644b2e713afef21255a08232efbd5d5f7506bfd050a
-f0daf55b5db595d29361f8253c26c37e09b4f87056edd8c90e0df4fc74072541
-8ad8ccea562e4ce72acc8e9f39284fca274c572ffec24ba30ef9db07054965bd
-2205d717c9b3b0723061cd74ec688b915ab6689904d5762629c891f2fc0cdfb1
-8d8a4d2260dc93d7ac1107b197d7e8418bbacfc660d888697296b7cc6581024c
-e583b0114ffe3b3a960d601ff23c0f633e2b85300042f717c4718c0547fd9b19
-e74d0e18f6908e4528065888c136dc8767b74025ef5faf470a272f57f548d738
-c5d2ff6def4366c1c08e0b09855e04ec3bbd8cb6b770f638ac7d852b7b2250f6
-cfbb5669c9112fbf73546a9c1e968a1e1a06128efee6422e41df1519c7346635
-31fea419bba8067c6d0e964143a0906762197b8de95502ae9bb54ced17de5ce8
-9d628716bf1e306aad09bd7f8cb2b7dae5bfa9ef53e716d5aa2ca014eae837c6
-c0f2d5f535ae93682e855b1bdd6ce955627284a4712f67c1d6de9f80d4dda43a
-9fe34fe4fab544459a1dfa0d1383c50bb3e6c3df078acb88db37ecb38aaabbb3
-cc59d3fbe6a84f1f9521b6e05d0a0b2e0fceae8eeea4f41976945501f32bb383
-455467d21777796688e57ae9b7b392d167b63bfdc1102565649b53694f1eb3e8
-5ec2f094ab06d427b5e1e7412b3369336c766a7fc778190dd5aeebef9b6a034e
-133314cb512667f1a4eef90a1251ca9e8aaf7966ec96004c09c4dfacbb0d4c45
-60d8df4183d3598fb9584a4433c9131f8602474f27e4916b43de80ed1d02f6e4
-d208b014c0a44d94ef709930eca646b2f07d8358d48d0a768b6f13492e3cb877
-fe38c58a7f5468af52ffc11b8c02bd91484cdc022abe678a7f2e298a7fad967a
-2ea7dc427e6ac154766ca4ae15fd414a76064823f3145724184e30ec4f1494c8
-78f7f63edea60daf2448de8a79801ecfd86a06ef122451dd2380bb1a4256a7ea
-806d131e66d5a6e3079f7c2d7c143e2879f5316ffebb1bfa166a088b8fa9cb7f
-4a5f0875a8ff5d378e9e8205c6155ea85756475ca5149eb72643b4ae1f907c0c
-fc8f63150cdc6209b1951af23ff68188360939501770eac39ed55dadc4dfb1c5
-b2ef39c93d0326a804f62e8f187a224444098835ff670ad55b49f3cd0aba2901
-293ae04427916ee14c81f4044a05d9c8ad14ad4b5567e8e0147780a0bd294c5a
-10a50a5cc7656f901588419108d2570e804a5e590004008776c8cf20b56d5ef1
-fa32538c480bcc1955321f954008871ba180177dea952fefec536f6522582647
-bc205dd139a18d2a41956baa4b002169cf042ab2ebf91ff203dc2e2559171910
-2119e94673a275d73f3909d0834b170e2b62beedcca27afb44a35ac51dcb5719
-82706f101b216b4af3523974378a05c327702b132335ff288adf62578f30cdcc
-cf826898361bd49238f368ae2182fbb631e375e903ed9efb911a047119b40830
-a39909494e86aee21694223df1a57ac8e5b4f0465d0868939ac77ccb448d3f58
-36631cebdc06bf2865c58437568cd734efbfa870214853232ccb48cc57c8c32e
-97cdeb89cf5e0c032e81de377b368f7d57187f0828675a52382d41de6cd9fb52
-2a1ccfde3192c650fcd7d1f86db03c401e6eebd0d40bf23c10e021ed66bc5b7c
-ae57d0905bd24925c8573f069139883bbde13df3ae05bec1771eddb9b003555f
-9d69657ac718c065a32ef7ca8a1ff5880fc66196e8123050a47ebe4dd5c1a4a7
-40ce1cf340bf08021fceef8172d9cdeb063f4e4c2205ae4503c71aec1836f9bf
-96ccd0a712e33407446ceab96221d7b3f4342fc74aafa802481acecee7243807
-390b2d12c844193560738e576d27b0f5a90b25e1b5a27de8a2c74b3303526191
-5ee0251065475f26bf0bbca5549f13e1357797a5728b46ba9570c095d938112c
-b3ba212c26cd6bb569ea276e1d8397569f8d4c78528490187a172d2e30dd0228
-d69fdaa25fbdb477c88d52f0ba137280d68656036c17b8852b03c21621d0b21c
-6c016f18cacfa9a998e972f40eda07278da54fe5119babf0145d6824f051cd63
-91bc93472f780f00e261dc74d6673da37d8d9291e25af279829f8d47bb524c19
-8b598ce1c576ac8542b5ead99b039ac2996a6d791a22a5d5bb0fa3eb65d1fa01
-401d5c7d44a9cfe082e9314ada6f4ac8ecea5be8e5a1cb6a1dba1c615e69ec9b
-0f231b64ac31c545859f0195bb9b403121df7be1ea1488b413825d8e1d7afbfc
-e5a8e1e52d9c3ea6de3ce75d013cb7396e825bac3a50d0bffd2d30c6f1c5dc0d
-83c1b68dd8b6042382285812093db4c5d7f6eaa8a4acbeba794f63610456a641
-42fdfd0c4c5f0c4486a6170b7701ca64cd1408f686fbd2afb56ba307722b2bba
-c542123f766171b43aae5ac053094a04ac4faa3cbdadcec81ab5aaac58d3a7b7
-1dbedcfe63d062b11dbcacefea89c6f8916389d3f7d93da89ebd8c37414c7db6
-d6512a4e8c76145ac170faf136a023b3c31cbae9775e436d6cb2835b77b56458
-6905d558a3cfab0f1f3426557a66bf775292df056cfaaca8c087b4c0bcc2aae1
-fa49f346602384f743be6b1aa26134ba2872366c17f1dd356221838a40be3a4d
-0b8502a964d360ea9bc58e4ffbf283c8294679197faf5d23aad1c89c3da84902
-c95619fa0ab76ca0c7ae725a1c5d9c40e84cc84eba8fc95361f3a738ddbcb593
-b3110db2f69ecf9da21d788d36a1bf986e2dd78c9e62f643e6677f80991f90a0
-8bd35484fc4aef3243bc3b460f57bf6f0a503b57f84723738e1b94c3029520c1
-f8d787f99305ef87fe64293b5fbf0a378306459c022f4127f2e2207ba818aac4
-1c860b70833b92cb7228ab2c8f68d03b6ecb67d4f83cb160c170298e1bff339f
-306505ea4fe86929f115b3c55c7fbdb7f09eb38f7c8ca86c9c89d9b92dae37a9
-5839a181e6e55835da3e81c8846980ec5c16646a31bbffe54a8505e005c9200c
-cb2b476083d7e55e63648146e8e615d349ed779b787232605beb38346e3578bf
-d043797edc00f6df91c9a02958ea01f55f00d576c8a8d236e81b59eaf96bdfe3
-4de4125a3893acea97aa8d6373b736d4cc0166095bbb75b7341f06d8e3fb732a
-5539fa8a27abc1d82f1a86a76870450fdebbe889dd048cbf2f184dcca5377649
-9ca0053aa9a88ab4d6f279f8a3ba704ed057dc2a361d07e5af6c9c8ce4b08c05
-d06635afce1cd7fb1288df9ca1f9a556d1a120691297d8134214da14db45cdbf
-5545abb75134d45257b1e373eaf23fb600370cf8e7de02e7211639b11f8fa0d5
-6627c5718f554ca3351ac95c04dbe894e20692065af2c7a9e239449df4a65917
-2e0fa2bd3ebffbffd9093569851a31db46c8c30c1fb8339a7f742a2c89212831
-15459844298972b8b06e2c699d6acaaf331a023047e5b2041fc39d830b0851a5
-8ef1e329b688034f9c91927cbaae2ec2c84f8502127055ade448d6dd7eea3aae
-392dce03347141b3b85f3018b3396b9fb1e4a59c50d9e8b82610088575eec663
-5686e7234e72e4690ce386fcf9d16b54c9c692e9324427dee7e096b6d4c45501
-da2d0eda66a1f29e90c00fd2c62ae43a97f611794c4704d179ce0bd63ffc4f50
-ab3ca7086bf942283fb0d175888a13e5278aaaa25a26e3df4fbf13e64519ad94
-44af171207f3f89b369ccd6162c0ba1320d30d3a596d9f58976f94434c1fb773
-e70be87528a9bd5fb7e494e6cdba0a3cabab8dc2073ea7f5b956bf5d5ca1b258
-25a73e0824ce8d00f4c945c0afdc4b57f7c0162a14b30154b61ab030a73679af
-d43e322a04fc7b3c814f3b2d07585eae6a5254b43bc836c6000bf23a56fbfbfe
-8478f1cd00150ee39f0aad2c7ae3313b8d619b84ddd8cd3878a4b306950873da
-9a592f520b7d7e0cf9b9c97d35139eef9c329763869e64d89a52fed016e1cd40
-4497359d9d4d6bb70222418282cd9ed7f12c16cc1aa6b3eea9c812b7c3910209
-2831b0f05e644f58e878c1eaa3d587c89b26db8b9952e0bead12c7db6aa5a042
-9e33012db0551fe6a589baa800905a7cb35d220efbb675a96444edd18ad89dbc
-ebc4087162e977b4cc680a0e3490bfaf28a556c3bb9299935097e3e048679849
-a85ce906f55bdf564f3cca2b0a70b404d02520b77614e577231cb2310dde1ba5
-cea1ef926ad191c98a21ed76ebb8f407ea2ae2ff56014216abb118c0218590f5
-f3284f9a187a85b3f5091f05b21d747f6fe7384a27ae6a8ddb923df4f61900e9
-adb8be5d338613e1486d710e892b5b733061951d164ae233023a69e02457e90d
-dfb6d8a53ea0a57f3c9e27614633ace3c6cf57dc8c81d0c079642c4a0745d281
-2bc6ac4587a56e65d6955e50f4380d94f9628c130102e2a3325d694865a0dd90
-01ab118f393fd86d01aedb5612fcb49e8b81fa6fadf7b69650fcef45a0a724d9
-ecf8ced5cf56913fb68a39c71350acd855433cc25b25ade198cda46bfccf1fac
-f1c841a1e6058a73e26e580cb46384885c417799d92822689c2f58bc1e0a040a
-9d7d3d73de3c18688d62581d54a0eadf9deffb3db34a9f052bce33d5fe8e8ae9
-78e4b0bdcc2a8ffdcaa5b4c0f4a0256d94364e70e1749dbc2b147d69ec539b47
-ef868ac4807f7ac1f01c93b3361942915581efc754453f221f4a70bb903ec310
-62cca7ac392f6f70b61f49822cfd65c668070babc1102322e4cf224902f0cc6e
-26bb2c119c3c66434f4a85164c49ed51084a1f0795eb631f6d38123619cc5ced
-c8c6908f380a4a3f7939d0b03187e448fa44333ed8d8c2504c3fce0235795d86
-f7a7bb423d1a7ca81b27b4f81c93ac95ba336a0d8e6bb90c96ae775ee34c07da
-5cd019a73b7944424d242dd7d96ea0349307ed426fe0c7fb8b5cbe3d295a3069
-b975fafbe78109cab35ac2fa5154f66af9b9ea522cd4847408d1ce24cf7fc770
-4f222fedc962ff21d09aa2ae6cc1b14cfbcab5d0016607362d3c8f6347f7a54e
-821327ddd475396b465b1bf5894703c6de1e9947e64867e68efb2620c7f46367
-c0c345f294b781943f0c96500688a08347b0272c60e5d6a7810a44c4e5654d09
-05931a57e1fe6ff7edd1e77a1e1c39070b49e4d72a62f06340f9a76d0553905b
-35e5711434d25cc3b14557bbaf66a82a6ef543bbfd14c314ddee0ee99090482f
-c1dd06eecf203ec9511a3ad6ccecdd1139ccf31dc72e407853d159c1622131df
-f560bd84c30c58439b06aef79bf53ffaa90ab3727e59f164271a69c5bf36f0d8
-3f9c0099933b6bdfc2f613d4f3565dfbd0c85e8723491ead13697f8945f63a6a
-612990613b54bb7a19c1d3a13c14f19694e3b1293293a51c64ebe436738eb61e
-2ccef09ca77eeb35c7bf10db2a9b1eabbe4fb88ccefeae6359bf5e136ee974ea
-a1a5c7152d54de8dfab89422943ad50e5884f330ad4078763ea071c6265e555d
-a610d246133435db11c37e786302e3e8889ece1d9ec3670d82babfed7be2fb7e
-fdb78e1b6e1c682b930f48bf0a28301b463a5ca77c368f7d57187f0828675a52
-382d41de6cd9fb522cf52d8792796fccac48d9528d6ba65cca775eea0d9e272c
-084f8017bb4ff779b615a46518b256b2c43b27e28b988bf6b60d783d56905a5d
-7794904c0cb95e2aa83512f47d2c393b778b7611053d31bbc4670c6ffe45ff25
-2b7064e4740e8895169607d57c89956b526a664b28a2a9f7c42d6a40c4a95aa6
-6be98967f52a855db02c498f141fd6afffc0a69b14bbd009a0c0f023d4d6706c
-cc05401aa96d550b6ce0190281ba4cebf16acfa4fd94730cd977d6c120c124ba
-ef8489e22a13c30552196e99046201ccff11cb3aff92a63e47a10a3a6433bfc0
-e77047453b71527f209c939d8516182ca5f0966ccbf971fede25e3fefd92cf8b
-fd11ac59dff36c25aaa8c771a83d9cbb7dccb37f4f7572f11f702bc27ea9510b
-a2d4baa94f5953beb927aaf2426421f0093c603bd63827e28f17d57cef476577
-c1f13eb8beeada42a1eb221cac3dccd5d84a6f74fa2b289c3cab6e2fc94dd92b
-d96a015b218ca7facbe18f9c7a580610905847a649e4477773b87686f7f28b33
-24148f4213ccaac483b43be2a9763fdbbdbbd50a0f9d59fc31f5b7b2ac0f915a
-89abd64d84faa62a4c3167fbbf651a6236ead6ad931c11435921cbdc4ed66f67
-fe83bc059fa0c625001ad5b3bf638293646d33076f3afafa8b8fd7307da5c53b
-5845999c1624e9ed30cd48483403f9afdabbcbe80fa5025bea2cbc081e2b32c7
-42685421ce3d574a414b340075cb02e80d7427d4cc503ee02f5b33e509d76e0b
-21b5d5a252757c4b7893dd9870f9371eca57ae78ac688ee28c31d597bc018496
-3fa54a8e160a77dc8b0627d7319885fb2ae0e2e2c9fbcde4b5a7acb04bf1e611
-b73b0dee3ac8f44c4ca15dbeca20c35a7a8805f3c22e6fba8e9b22722dd25ae3
-ba2dec2a0c9a13509f4c9fd3dba03ef6e49a632bf7de5ec45b64a1f4e3a36976
-1b7a9c7b95bd29b09b930b0d82f2c39f9bc3c24d99c58a664d4adedf7b74e13e
-6d85e03e615a60a2aee9f790c6d0a2e6e82e6840e51b38c4579fb95337423fba
-437d97ab42bafb1097b2e2952e86c88e94ba7020e83163b5d810de8f57625819
-d86d7ae834d7135e30f2e21dd061ff15f22de6c9243d2caaa5abf67abee3a6f5
-306273037adcd10e8f00818ee88ad2ea98d6b7f1ee7e3d1db49a57fa350664d6
-021078ee1ebfbdbe5aee9efab2acd9809ccfb180f8017a84ba6bfc1ba5940eca
-3076c863f8d9df3e4afb32361acab13bacd3e465d094b64bece987be66fa501d
-5deba893368ea3fdd3b3a4201d3bd68b3464ead10c6f0ddf513a630e0133fec8
-08630e4b3c8b0aad1bbeed508e7e03d41b3d060a92b1958407843e4cabd78d79
-ff72fc0e92f4903cfd05856f457dd15b1aab99c1d29804d2f3134c9817f45fd2
-efebb92545f056f4ca76ea74ad464cd041b7cbb8892f2dba833118b83e20c039
-99939ffc6cc50503bb871565797ec537e26eb622fd30303273748af2afd97e07
-a9c2a96f4ef8754dc3ea8f3348cb30d76bdaa84d2e933c94c99d13e74f19970f
-5d2bd19712926e230dd02aeae6461edd83ac935ec2f420649f82d4160a072700
-10141602c3a6572740d8e97fd08e56b987062bb57237bbb3056a36e97e399a7a
-cf9653743a9984ef36254d60772a0eedca800923461a3e4443a5ef469aefceec
-aa1831e56b0d8ea6ccb76bb9dbb6ab7584ee268bdd0f5f0d57eddba9b97d74a2
-910f178f388a50fa32aad7b87b3235efcabd4b5009190d12e8c770f6e70dbe10
-e747e1984a1c41d701e6220b001fe25b9a677c996f8fd91bd40fa7e07f57e8bd
-5d2381442b337924e56de4d18cdc352314caebf065f610b00b50302bae3ad612
-dad9059a3d7f3bd63827e28f17d57cef4a8cb8af1f080a993c3c74871e4b7bdb
-2602d07587aed02aa783d80234b6eecc77d163847e63d3c9aa412d10acea7a5c
-5ece5b893bb3031facee72701acd225d6b6a752cb2f84de3ceab2b97b606a0bf
-c6874869a86e3a55a4e1d7abd94719f604ea68b1108ebb5bebc3ef465bdd2cdb
-864ecfe0d6959d5114eaaf1612c970caa2c94729178e6af130a1df211a3795a9
-b5fb934e47f6c48155a19acce788036b4867f90d40c1e4ff7460399f1f08f98a
-0aa3e0d8e354195a2563759dfe0183c8d67b449516ed8f5cf3288f7298d62092
-922f07027352bc7c9612cfca46f1cf2ed1417ab863c2615f2d26ee13d7a04a18
-8336ec9961e76af2f506e3db3d67a2a4fb2dbbb0ca34be6db9789a1cda607d9b
-35f0eac47f488bbe74f8f04b49dc492ec8f096e6710ad59d248a0c98497541d8
-5f9134d5215b0a05fc29db1aa71e432a2c0b00106bf3124df0b72c144375a280
-9cc5ed8335b3e970eaad9178f43011b55d7f3e11d89be1058361893016254440
-353b88162a4e7913721092e05573497ed693f3120176dc08253d2356559041d8
-741a6b9c41f8eb695369633632ffc35a1e2e4ed6258f0a8eef0bf6bb028efed8
-a679be4bc197cc868255f748ca953312eef556d8fdae4e9706c3116e76140587
-db18492730a14e96c211fcd0aeb0d4324b1b4abd0150637c6c135fcca1823fde
-20482dbbab536f87e1d3f0ac4b5154e33bfaade3ac4af8b8d2082658d35a251e
-a0d718f702ed8d957555331c9593abbf64b2194dac9f098773ef4313cd8a48e7
-4d60513d6ee1c132e59ebf5dce2359b61efd16fb4cce810172abb3939e874792
-a862462c72895461ed4dd265abbf52c11c50e607fd3bebeff0397398f656066c
-5f64fc4e67cf5f984fe818c9500cb10beadc1ac513c0c8e60701144b949ce67d
-08cec1adeb70fb01f48abfea22412f4b07b710a8d774228ae156bfdd556c0f49
-bda072c0926a08150f77ee338b3b4303bd2186da21b89df804cd531c499ef953
-9b1ed325e5ef952af05cf67a9fe64b1af975c18348809161ad382debfde45495
-5b32472edf5098b6d1f8fc8807f81ee5be3659bd0f47542ee81e20cbaef168dd
-4b991069cda2f850b1faa40e74fad79ed5f74a0fde1c060996a2280e9c9d21f5
-d23174d3ef4d9eb6e337d443cfccaeab8b0015e6427f9439c8473a1364faf782
-f58bd8bd775899092844ba570c427dff47b8cc4859fd9042ce78aa27ffea8b5a
-c52be0d97cd01c7250a6eda489b5a17e23167239e0d7fd8f3429529ef02548e9
-b7bc1dcfc729600ff98d9f9b33ecdd10ff78baa313b7e35c51dfe8c6a17568fd
-bfbd434860a8ef3821b336783fa328279c05b05aba37f8d26da43391c9cfbd71
-6b240148995a005448afbe45ef2c2853aa3c1cf3ba6434ec79e8dbacef443569
-8e6ef17bdf960e9a37f0b34f4aa39641492bcce95afe55d168e510f934288da7
-c61eb3e1a42f18abc608995cd8c9afcc591751bcd9759387d3924751b1a2c79a
-0cf18b53d3ed8096e2c559dd001e8bf6824b3eedafedd8b89fa23f4aeed14435
-a7d05da7b0607edf2aab0816e866f6791e834bff5f5c6699edb97df199549d54
-3d039671a481d094352ec76d2f7e5119887ee3ad1117f749a85b3b6f37e3d25f
-25397d1d019da9c5c6fbbfbaeb4fdf0a423f6394968f2eabc560f76e75b07b54
-a6d87328604fc86be37a1e8e5790eb845cca88bbc2e01eab28a6d6615229658b
-7554a85064aacf698949e4f56f2bd61bd5af31bd6012ef0c1bb627cbeec71b52
-e99af95f699617a8462e14e144424a64e4c1cda80a13cf7b20929041b2df6686
-15c2f77a73f9cdbca33cd11188a9a608b240b27e7cfc5234fdad6db5d6565787
-d99f45709674690ee704de4ce6accc37343eaac02dd8ca368221d607c4ea24dc
-05aaa5162120301a8fb4c3166ef0e813aab536200a8d54d3e0679cbad59cae0d
-d9c251016336c63243b42f4a439af0f1b4d4cc3ee9c24dae5ec87c10b4b046eb
-3877eae636101c3231319957690cf7cd562fb48e44abd46bfd8640de5348a01d
-8389dbe26165729c3ea1023b354cc6b6928922cffb2df9ea60d853a74067b442
-a7d4938296e2ffdeee8b33dae2ecf5be2451fbe3829f9c1d45820c9849176a43
-22694f059367670d68ad12080a84603821f867ca37dc727c3c5254103af21cd9
-034f679aea5d4bc81366245725fa46cd671ac9251817e8abbe9f06f182b738e9
-05769b0d6a504170334d09bb7b809c249ca9678658b36fef98a0f8936cc9167f
-31837fb2e92319b8e4df5168494fe90a12a88b93bae098fac2f3af2c087759cf
-0fdc3d901e921222a19e53c654d13e52a6f272bd65e3deee14e3e59c6dd9b794
-dbd476ccd4deb50e94d207123a5bb6276e40177c13adee9227e283b51bdc8e50
-2af8d9f3d4cdf61a9bffdb5047aa305f7c61fbb49440b70993c9620020fadf15
-4b5248e8e2a6fd5638a447a593b320039eb53a709e992a481c0de5f19640c17f
-cdcfacfbf7b5252c0274c53f6de78a11db640076e01a11be6a63c3a8be0e3fb0
-f0c1f40b379b80399771b0b23aa0fb934ee3184f0c18d5cb40285510a4eb92f1
-6f089ce3cf32b52add23b0f6a436637a17a71f90e8c91adeaff7eb97220a17b7
-354ea80c678e158c1ecd586f0e2e6d7ab5a179500d404e19a65db6c9568b0799
-330d69b254d29e704196964553817ab428be257c5d51aac61ee9cffcd3ec4615
-1d6e9992ad91a791d1c2465df24757dcbc64f3788b15868b905e53ccd04625c7
-f04fa267d68a6aeb59443ead9bc171f845b2b0d7ac7e788c21411a1d4b3935d6
-ef2093333ce092da5d06fcf6c1f1afc68db00cc1d0090f21046b54694f5162cc
-cb07ac6e81a3b657871db0692cd70edcfb645c335167e08eb15caa6cbf6419b0
-1cb28d3beb8c5ab6c8f77663a2c258177a1feb9abb560e903b45a1d14644a08d
-778a0db918b36ed5a2d6d409adf41a21b13211679094cf290c4652633d861e1e
-2cf20b69ccdcf17ac7d4bc15febe037998b98c176369d225995e578f62f6e548
-049da929686caf8b58bf1baf99bfd7196c8084419d381078ad0bc6bffbe163de
-15a4d0e6fb53208aff06f08967882b17c0696f060218ae037682036cb39365b7
-33d8c2b0f2414f3c919473a6abc8d419f70b541a62082602990c3c35a55217d5
-96fea82048181950779a3fc5f67bdad8df84e5433fa67bccd05ec886d857b789
-18ffbf083fa0b9f98cf5cfc9ae29d607d2ed11fa02131fd7c258431b20f7b113
-c316b7163644fdef029d33366200e9c4b5727940490a81aa139dddf9493f6b32
-0ee84950a6a549460032d0ba7fb3b2ded2e4028bd3ef456005bfc1456c681f25
-82dad6da15127a1ef14550d9557b86c2bc37440d538ee5146f320c9db07aed68
-70f6fa748a5b87fde0e3ef4cf1567e743eea26076ba668b46f3f7ad99f4df367
-fd40d87cca35267a09a3a33f8212655b747323e9d5f184cde766906f6f85ef2b
-3ad0dc0edcd150e589dae9c0e19d464ad618c32e14a5dbcaa6ecbcd990cc49ad
-c6de19129debd2de99b506adf4dbdea4ff1364e300447c9c0deda2cdf1d3648b
-1a83bd4be46e1797fb5b6216077a54f12c7ace9c28320026a19492e58193d082
-c0b5473a5a603ce22ea377511b725ad9c23b1a1b906b465fa02d0fb620e23074
-66c9d077730916850cd2abcc2412a364f4a0efde3fb741dea91fbba138e74dcb
-809627282be317d8f1dbb22220c9696bf39a27fc38aff90eaf458151a00a8a88
-9d4f5d933b1eee63054c65798ad32079ce573d53c620b6a0f81fd931b5a24707
-ebb30cf01b0c63b55ee8c08b805a9a45aea8aacf49982ce6d3e8726c6a122437
-1b9b116a56de605482449dabbb83d353ebdf355fcb8cde5658c699b8a55718a8
-6e051b42221dda48257e9f56d09f31a77630930abb0fce0d49ec9cb27c6ce480
-4c3b36d45ec195e7f78dc930370ed66cd4b6763085ec4c626693e69b39e993b1
-70b2289f29dcf94d5d2763a8211a92c40442371aa2f4297c9958c833421ee693
-a74b256e425979afe86b286bbda0983e14194250d9fecd03a8ba1fe615e93ae1
-d60d43f6858ea9cd47ddf88a1bfb5e90b60a28cdb269d9e1e43b0cf470a95b48
-aa5299e7159e7ccb18200914b93c3b0df79f181789fdfd6693613d0d42778883
-88847927f59d40f0cb5334f62eafe4f380076cfb7720174eceab1eb5050ea12c
-e4293db115c4f9bd4d21910a69d566a706f5c0e1bcb344203503855e6643b125
-17b6db03c41f13a347ad39e47a46d626f8a31a163bda6d23264657b412bdec99
-c87a103d26
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-cleartomark
-%%EndResource
-/F637_0 /WWWUTU+NimbusRomNo9L-ReguItal 1 1
-[ /.notdef/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash
- /ogonek/ring/.notdef/breve/minus/.notdef/Zcaron/zcaron
- /caron/dotlessi/dotlessj/ff/ffi/ffl/notequal/infinity
- /lessequal/greaterequal/partialdiff/summation/product/pi/grave/quotesingle
- /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright
- /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash
- /zero/one/two/three/four/five/six/seven
- /eight/nine/colon/semicolon/less/equal/greater/question
- /at/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/bracketleft/backslash/bracketright/asciicircum/underscore
- /quoteleft/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/braceleft/bar/braceright/asciitilde/.notdef
- /Euro/integral/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl
- /circumflex/perthousand/Scaron/guilsinglleft/OE/Omega/radical/approxequal
- /.notdef/.notdef/.notdef/quotedblleft/quotedblright/bullet/endash/emdash
- /tilde/trademark/scaron/guilsinglright/oe/Delta/lozenge/Ydieresis
- /.notdef/exclamdown/cent/sterling/currency/yen/brokenbar/section
- /dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron
- /degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered
- /cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown
- /Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla
- /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis
- /Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply
- /Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls
- /agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla
- /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis
- /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide
- /oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]
-pdfMakeFont
-612 792 false pdfSetup
-%%EndSetup
-%%Page: 1 1
-%%BeginPageSetup
-%%PageOrientation: Portrait
-pdfStartPage
-0 0 612 792 re W
-%%EndPageSetup
-[] 0 d
-1 i
-0 j
-0 J
-10 M
-1 w
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-false op
-false OP
-0 0 612 792 re
-W
-q
-[1 0 0 1 72 756] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 463.019 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -36] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -720] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-117.436 701.916 Td
-/F122_0 24.7902 Tf
-(bzip2) 63.3638 Tj
--278 TJm
-(and) 44.077 Tj
--278 TJm
-(libbzip2,) 99.1856 Tj
--278 TJm
-(ver) 37.2101 Tj
-15 TJm
-(sion) 50.9687 Tj
--278 TJm
-(1.0.5) 55.1334 Tj
-[1 0 0 1 72 696.784] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -15.4939] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -681.29] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90.4929 661.631 Td
-/F122_0 20.6585 Tf
-(A) 14.9154 Tj
--278 TJm
-(pr) 20.6585 Tj
-20 TJm
-(ogram) 63.1324 Tj
--278 TJm
-(and) 36.7308 Tj
--278 TJm
-(librar) 51.6669 Tj
--10 TJm
-(y) 11.4861 Tj
--278 TJm
-(f) 6.87928 Tj
-20 TJm
-(or) 20.6585 Tj
--278 TJm
-(data) 42.4739 Tj
--278 TJm
-(compression) 128.579 Tj
-[1 0 0 1 72 657.035] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -144] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -513.035] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-207.676 503.285 Td
-/F122_0 11.9552 Tf
-(J) 6.64709 Tj
-20 TJm
-(ulian) 27.9034 Tj
--278 TJm
-(Se) 14.6212 Tj
-15 TJm
-(war) 20.5988 Tj
-20 TJm
-(d,) 10.6282 Tj
--278 TJm
-(http://www) 61.103 Tj
-40 TJm
-(.bzip.or) 42.5127 Tj
-15 TJm
-(g) 7.30463 Tj
-[1 0 0 1 72 500.625] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -435.826] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 463.019 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-Q
-showpage
-%%PageTrailer
-pdfEndPage
-%%Page: 2 2
-%%BeginPageSetup
-%%PageOrientation: Portrait
-pdfStartPage
-0 0 612 792 re W
-%%EndPageSetup
-[] 0 d
-1 i
-0 j
-0 J
-10 M
-1 w
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-false op
-false OP
-0 0 612 792 re
-W
-q
-[1 0 0 1 72 741.554] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 14.4459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 187.197 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 140.398 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -140.398 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 280.796 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.974 -13.9477] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -0.4981] cm
-q
-[] 0 d
-0 J
-0.4981 w
-0 0.2491 m
-475.465 0.2491 l
-S
-Q
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 479.251 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -21.5542] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -720] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 709.534 Td
-/F122_0 14.3462 Tf
-(bzip2) 36.6689 Tj
--489 TJm
-(and) 25.5075 Tj
--488 TJm
-(libbzip2,) 57.3991 Tj
--542 TJm
-(ver) 21.5336 Tj
-15 TJm
-(sion) 29.4958 Tj
--488 TJm
-(1.0.5:) 36.6832 Tj
--766 TJm
-(A) 10.358 Tj
--488 TJm
-(pr) 14.3462 Tj
-20 TJm
-(ogram) 43.842 Tj
--489 TJm
-(and) 25.5075 Tj
--489 TJm
-(librar) 35.8798 Tj
--10 TJm
-(y) 7.97649 Tj
--488 TJm
-(f) 4.77728 Tj
-20 TJm
-(or) 14.3462 Tj
--489 TJm
-(data) 29.4958 Tj
-72 692.319 Td
-(compression) 89.2907 Tj
-[1 0 0 1 72 689.349] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -689.349] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 680.364 Td
-/F130_0 9.9626 Tf
-(by) 9.9626 Tj
--250 TJm
-(Julian) 23.8007 Tj
--250 TJm
-(Se) 9.9626 Tj
-25 TJm
-(w) 7.193 Tj
-10 TJm
-(ard) 12.7222 Tj
-[1 0 0 1 72 678.207] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -678.207] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 668.409 Td
-/F130_0 9.9626 Tf
-(Cop) 16.6077 Tj
-10 TJm
-(yright) 23.8007 Tj
-[1 0 0 1 114.799 668.409] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -114.799 -668.409] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-114.799 668.409 Td
-/F130_0 9.9626 Tf
-(\251) 7.57158 Tj
-[1 0 0 1 122.371 668.409] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -122.371 -668.409] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-124.861 668.409 Td
-/F130_0 9.9626 Tf
-(1996-2007) 43.1679 Tj
--250 TJm
-(Julian) 23.8007 Tj
--250 TJm
-(Se) 9.9626 Tj
-25 TJm
-(w) 7.193 Tj
-10 TJm
-(ard) 12.7222 Tj
-[1 0 0 1 72 666.252] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -7.9701] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -658.282] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 650.875 Td
-/F130_0 7.9701 Tf
-(This) 14.1708 Tj
--250 TJm
-(program,) 28.9952 Tj
-[1 0 0 1 119.151 650.875] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -119.151 -650.875] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-119.151 650.875 Td
-/F134_0 7.9701 Tf
-(bzip2) 23.9103 Tj
-[1 0 0 1 143.061 650.875] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -143.061 -650.875] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-143.061 650.875 Td
-/F130_0 7.9701 Tf
-(,) 1.99253 Tj
--250 TJm
-(the) 9.73946 Tj
--250 TJm
-(associated) 32.7571 Tj
--250 TJm
-(library) 21.2483 Tj
-[1 0 0 1 216.768 650.875] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -216.768 -650.875] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-216.768 650.875 Td
-/F134_0 7.9701 Tf
-(libbzip2) 38.2565 Tj
-[1 0 0 1 255.024 650.875] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -255.024 -650.875] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-255.024 650.875 Td
-/F130_0 7.9701 Tf
-(,) 1.99253 Tj
--250 TJm
-(and) 11.5088 Tj
--250 TJm
-(all) 7.9701 Tj
--250 TJm
-(documentation,) 49.3668 Tj
--250 TJm
-(are) 9.73149 Tj
--250 TJm
-(cop) 11.5088 Tj
-10 TJm
-(yright) 19.0406 Tj
--250 TJm
-(\251) 6.05728 Tj
--250 TJm
-(1996-2007) 34.5344 Tj
--250 TJm
-(Julian) 19.0406 Tj
--250 TJm
-(Se) 7.9701 Tj
-25 TJm
-(w) 5.75441 Tj
-10 TJm
-(ard.) 12.1703 Tj
--310 TJm
-(All) 10.1858 Tj
--250 TJm
-(rights) 18.1559 Tj
--250 TJm
-(reserv) 19.471 Tj
-15 TJm
-(ed.) 9.5163 Tj
-[1 0 0 1 72 649.149] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -7.9701] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -641.179] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 633.34 Td
-/F130_0 7.9701 Tf
-(Redistrib) 29.2264 Tj
-20 TJm
-(ution) 16.3865 Tj
--250 TJm
-(and) 11.5088 Tj
--250 TJm
-(use) 10.6241 Tj
--250 TJm
-(in) 6.20074 Tj
--250 TJm
-(source) 20.802 Tj
--250 TJm
-(and) 11.5088 Tj
--250 TJm
-(binary) 20.3636 Tj
--250 TJm
-(forms,) 20.5868 Tj
--250 TJm
-(with) 14.1708 Tj
--250 TJm
-(or) 6.63909 Tj
--250 TJm
-(without) 24.3566 Tj
--250 TJm
-(modi\002cation,) 42.2894 Tj
--250 TJm
-(are) 9.73149 Tj
--250 TJm
-(permitted) 30.5494 Tj
--250 TJm
-(pro) 10.6241 Tj
-15 TJm
-(vided) 17.7096 Tj
--250 TJm
-(that) 11.9551 Tj
--250 TJm
-(the) 9.73946 Tj
--250 TJm
-(follo) 15.0555 Tj
-25 TJm
-(wing) 15.9402 Tj
--250 TJm
-(conditions) 33.2114 Tj
--250 TJm
-(are) 9.73149 Tj
--250 TJm
-(met:) 14.1708 Tj
-[1 0 0 1 72 631.615] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -23.7789] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 5.5791 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -77.5791 -607.836] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-77.5791 607.836 Td
-/F130_0 7.9701 Tf
-(\225) 2.78954 Tj
-[1 0 0 1 80.3686 607.836] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.9926 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.594 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -83.9552 -607.836] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-83.9552 607.836 Td
-/F130_0 7.9701 Tf
-(Redistrib) 29.2264 Tj
-20 TJm
-(utions) 19.4869 Tj
--250 TJm
-(of) 6.63909 Tj
--250 TJm
-(source) 20.802 Tj
--250 TJm
-(code) 15.0475 Tj
--250 TJm
-(must) 15.5018 Tj
--250 TJm
-(retain) 18.1479 Tj
--250 TJm
-(the) 9.73946 Tj
--250 TJm
-(abo) 11.5088 Tj
-15 TJm
-(v) 3.98505 Tj
-15 TJm
-(e) 3.53872 Tj
--250 TJm
-(cop) 11.5088 Tj
-10 TJm
-(yright) 19.0406 Tj
--250 TJm
-(notice,) 21.4714 Tj
--250 TJm
-(this) 11.5168 Tj
--250 TJm
-(list) 9.74743 Tj
--250 TJm
-(of) 6.63909 Tj
--250 TJm
-(conditions) 33.2114 Tj
--250 TJm
-(and) 11.5088 Tj
--250 TJm
-(the) 9.73946 Tj
--250 TJm
-(follo) 15.0555 Tj
-25 TJm
-(wing) 15.9402 Tj
--250 TJm
-(disclaimer) 33.2034 Tj
-55 TJm
-(.) 1.99253 Tj
-[1 0 0 1 470.908 607.836] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -398.908 -17.5343] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 5.5791 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -77.5791 -590.302] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-77.5791 590.302 Td
-/F130_0 7.9701 Tf
-(\225) 2.78954 Tj
-[1 0 0 1 80.3686 590.302] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.9926 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.594 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -83.9552 -590.302] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-83.9552 590.302 Td
-/F130_0 7.9701 Tf
-(The) 12.3935 Tj
--270 TJm
-(origin) 19.0406 Tj
--270 TJm
-(of) 6.63909 Tj
--270 TJm
-(this) 11.5168 Tj
--270 TJm
-(softw) 17.7096 Tj
-10 TJm
-(are) 9.73149 Tj
--270 TJm
-(must) 15.5018 Tj
--270 TJm
-(not) 10.1858 Tj
--270 TJm
-(be) 7.52377 Tj
--270 TJm
-(misrepresented;) 50.4667 Tj
--279 TJm
-(you) 11.9551 Tj
--270 TJm
-(must) 15.5018 Tj
--270 TJm
-(not) 10.1858 Tj
--270 TJm
-(claim) 17.7096 Tj
--270 TJm
-(that) 11.9551 Tj
--270 TJm
-(you) 11.9551 Tj
--270 TJm
-(wrote) 18.1479 Tj
--270 TJm
-(the) 9.73946 Tj
--270 TJm
-(original) 24.795 Tj
--270 TJm
-(softw) 17.7096 Tj
-10 TJm
-(are.) 11.724 Tj
--740 TJm
-(If) 5.30809 Tj
--270 TJm
-(you) 11.9551 Tj
--270 TJm
-(use) 10.6241 Tj
--270 TJm
-(this) 11.5168 Tj
--270 TJm
-(softw) 17.7096 Tj
-10 TJm
-(are) 9.73149 Tj
--270 TJm
-(in) 6.20074 Tj
--269 TJm
-(a) 3.53872 Tj
-83.9552 580.737 Td
-(product,) 26.3412 Tj
--250 TJm
-(an) 7.52377 Tj
--250 TJm
-(ackno) 19.0326 Tj
-25 TJm
-(wledgment) 35.4191 Tj
--250 TJm
-(in) 6.20074 Tj
--250 TJm
-(the) 9.73946 Tj
--250 TJm
-(product) 24.3487 Tj
--250 TJm
-(documentation) 47.3743 Tj
--250 TJm
-(w) 5.75441 Tj
-10 TJm
-(ould) 14.1708 Tj
--250 TJm
-(be) 7.52377 Tj
--250 TJm
-(appreciated) 36.7342 Tj
--250 TJm
-(b) 3.98505 Tj
-20 TJm
-(ut) 6.20074 Tj
--250 TJm
-(is) 5.31606 Tj
--250 TJm
-(not) 10.1858 Tj
--250 TJm
-(required.) 28.5489 Tj
-[1 0 0 1 403.817 580.737] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -331.817 -17.5342] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 5.5791 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -77.5791 -563.203] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-77.5791 563.203 Td
-/F130_0 7.9701 Tf
-(\225) 2.78954 Tj
-[1 0 0 1 80.3686 563.203] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.9926 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.594 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -83.9552 -563.203] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-83.9552 563.203 Td
-/F130_0 7.9701 Tf
-(Altered) 23.9023 Tj
--250 TJm
-(source) 20.802 Tj
--250 TJm
-(v) 3.98505 Tj
-15 TJm
-(ersions) 22.5793 Tj
--250 TJm
-(must) 15.5018 Tj
--250 TJm
-(be) 7.52377 Tj
--250 TJm
-(plainly) 22.1409 Tj
--250 TJm
-(mark) 16.3786 Tj
-10 TJm
-(ed) 7.52377 Tj
--250 TJm
-(as) 6.63909 Tj
--250 TJm
-(such,) 16.6017 Tj
--250 TJm
-(and) 11.5088 Tj
--250 TJm
-(must) 15.5018 Tj
--250 TJm
-(not) 10.1858 Tj
--250 TJm
-(be) 7.52377 Tj
--250 TJm
-(misrepresented) 48.251 Tj
--250 TJm
-(as) 6.63909 Tj
--250 TJm
-(being) 17.7096 Tj
--250 TJm
-(the) 9.73946 Tj
--250 TJm
-(original) 24.795 Tj
--250 TJm
-(softw) 17.7096 Tj
-10 TJm
-(are.) 11.724 Tj
-[1 0 0 1 464.405 563.203] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -392.405 -17.5343] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 5.5791 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -77.5791 -545.669] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-77.5791 545.669 Td
-/F130_0 7.9701 Tf
-(\225) 2.78954 Tj
-[1 0 0 1 80.3686 545.669] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.9926 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.594 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -83.9552 -545.669] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-83.9552 545.669 Td
-/F130_0 7.9701 Tf
-(The) 12.3935 Tj
--250 TJm
-(name) 17.2632 Tj
--250 TJm
-(of) 6.63909 Tj
--250 TJm
-(the) 9.73946 Tj
--250 TJm
-(author) 20.3636 Tj
--250 TJm
-(may) 13.7245 Tj
--250 TJm
-(not) 10.1858 Tj
--250 TJm
-(be) 7.52377 Tj
--250 TJm
-(used) 14.6092 Tj
--250 TJm
-(to) 6.20074 Tj
--250 TJm
-(endorse) 24.787 Tj
--250 TJm
-(or) 6.63909 Tj
--250 TJm
-(promote) 26.5643 Tj
--250 TJm
-(products) 27.449 Tj
--250 TJm
-(deri) 12.3935 Tj
-25 TJm
-(v) 3.98505 Tj
-15 TJm
-(ed) 7.52377 Tj
--250 TJm
-(from) 15.4939 Tj
--250 TJm
-(this) 11.5168 Tj
--250 TJm
-(softw) 17.7096 Tj
-10 TJm
-(are) 9.73149 Tj
--250 TJm
-(without) 24.3566 Tj
--250 TJm
-(speci\002c) 24.3487 Tj
--250 TJm
-(prior) 15.4939 Tj
--250 TJm
-(written) 22.5793 Tj
--250 TJm
-(permission.) 36.9733 Tj
-[1 0 0 1 533.577 545.669] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -461.577 -9.6956] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -535.973] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 528.135 Td
-/F130_0 7.9701 Tf
-(THIS) 17.7096 Tj
--401 TJm
-(SOFTW) 27.0107 Tj
-120 TJm
-(ARE) 15.9402 Tj
--401 TJm
-(IS) 7.08542 Tj
--400 TJm
-(PR) 9.74743 Tj
-40 TJm
-(O) 5.75441 Tj
-50 TJm
-(VIDED) 24.787 Tj
--401 TJm
-(BY) 11.0705 Tj
--401 TJm
-(THE) 15.4939 Tj
--401 TJm
-(A) 5.75441 Tj
-55 TJm
-(UTHOR) 27.449 Tj
--401 TJm
-("AS) 13.4376 Tj
--401 TJm
-(IS") 10.3372 Tj
--401 TJm
-(AND) 17.2632 Tj
--400 TJm
-(ANY) 17.2632 Tj
--401 TJm
-(EXPRESS) 34.1041 Tj
--401 TJm
-(OR) 11.0705 Tj
--401 TJm
-(IMPLIED) 32.3188 Tj
--401 TJm
-(W) 7.52377 Tj
-120 TJm
-(ARRANTIES,) 46.7128 Tj
--401 TJm
-(INCLUDING,) 46.2585 Tj
--400 TJm
-(B) 5.31606 Tj
-10 TJm
-(UT) 10.6241 Tj
-72 518.571 Td
-(NO) 11.5088 Tj
-40 TJm
-(T) 4.86973 Tj
--304 TJm
-(LIMITED) 32.7571 Tj
--304 TJm
-(T) 4.86973 Tj
-18 TJm
-(O,) 7.74694 Tj
--305 TJm
-(THE) 15.4939 Tj
--304 TJm
-(IMPLIED) 32.3188 Tj
--304 TJm
-(W) 7.52377 Tj
-120 TJm
-(ARRANTIES) 44.7202 Tj
--304 TJm
-(OF) 10.1858 Tj
--304 TJm
-(MERCHANT) 44.7202 Tj
-93 TJm
-(ABILITY) 31.8724 Tj
--304 TJm
-(AND) 17.2632 Tj
--305 TJm
-(FITNESS) 31.442 Tj
--304 TJm
-(FOR) 15.5018 Tj
--304 TJm
-(A) 5.75441 Tj
--304 TJm
-(P) 4.43138 Tj
-92 TJm
-(AR) 11.0705 Tj
-60 TJm
-(TICULAR) 34.5344 Tj
--304 TJm
-(PURPOSE) 34.9887 Tj
--304 TJm
-(ARE) 15.9402 Tj
--305 TJm
-(DI) 8.40846 Tj
-1 TJm
-(S-) 7.08542 Tj
-72 509.006 Td
-(CLAIMED.) 38.2963 Tj
--576 TJm
-(IN) 8.40846 Tj
--287 TJm
-(NO) 11.5088 Tj
--288 TJm
-(EVENT) 26.118 Tj
--288 TJm
-(SHALL) 25.6797 Tj
--288 TJm
-(THE) 15.4939 Tj
--287 TJm
-(A) 5.75441 Tj
-55 TJm
-(UTHOR) 27.449 Tj
--288 TJm
-(BE) 10.1858 Tj
--288 TJm
-(LIABLE) 28.3337 Tj
--288 TJm
-(FOR) 15.5018 Tj
--288 TJm
-(ANY) 17.2632 Tj
--287 TJm
-(DIRECT) 28.78 Tj
-74 TJm
-(,) 1.99253 Tj
--288 TJm
-(INDIRECT) 37.1885 Tj
-74 TJm
-(,) 1.99253 Tj
--288 TJm
-(INCIDENT) 37.6268 Tj
-93 TJm
-(AL,) 12.6167 Tj
--288 TJm
-(SPECIAL,) 34.3193 Tj
--288 TJm
-(EXEMPLAR) 42.9509 Tj
-65 TJm
-(Y) 5.75441 Tj
-129 TJm
-(,) 1.99253 Tj
-72 499.442 Td
-(OR) 11.0705 Tj
--299 TJm
-(CONSEQ) 31.8804 Tj
-10 TJm
-(UENTIAL) 34.5265 Tj
--300 TJm
-(D) 5.75441 Tj
-40 TJm
-(AMA) 18.5942 Tj
-40 TJm
-(GES) 15.0555 Tj
--299 TJm
-(\(INCLUDING,) 48.9125 Tj
--299 TJm
-(B) 5.31606 Tj
-10 TJm
-(UT) 10.6241 Tj
--299 TJm
-(NO) 11.5088 Tj
-40 TJm
-(T) 4.86973 Tj
--300 TJm
-(LIMITED) 32.7571 Tj
--299 TJm
-(T) 4.86973 Tj
-18 TJm
-(O,) 7.74694 Tj
--299 TJm
-(PR) 9.74743 Tj
-40 TJm
-(OCUREMENT) 49.59 Tj
--299 TJm
-(OF) 10.1858 Tj
--300 TJm
-(SUBSTITUTE) 47.8206 Tj
--299 TJm
-(GOODS) 27.449 Tj
--299 TJm
-(OR) 11.0705 Tj
--300 TJm
-(SER) 14.6172 Tj
-80 TJm
-(VICES) 23.0256 Tj
-1 TJm
-(;) 2.21569 Tj
-72 489.878 Td
-(LOSS) 19.4869 Tj
--360 TJm
-(OF) 10.1858 Tj
--360 TJm
-(USE,) 17.048 Tj
--360 TJm
-(D) 5.75441 Tj
-40 TJm
-(A) 5.75441 Tj
-111 TJm
-(T) 4.86973 Tj
-93 TJm
-(A,) 7.74694 Tj
--360 TJm
-(OR) 11.0705 Tj
--359 TJm
-(PR) 9.74743 Tj
-40 TJm
-(OFITS;) 24.3566 Tj
--360 TJm
-(OR) 11.0705 Tj
--360 TJm
-(B) 5.31606 Tj
-10 TJm
-(USINESS) 32.3267 Tj
--360 TJm
-(INTERR) 28.78 Tj
-40 TJm
-(UPTION\)) 31.8724 Tj
--360 TJm
-(HO) 11.5088 Tj
-35 TJm
-(WEVER) 28.3337 Tj
--360 TJm
-(CA) 11.0705 Tj
-55 TJm
-(USED) 20.8099 Tj
--359 TJm
-(AND) 17.2632 Tj
--360 TJm
-(ON) 11.5088 Tj
--360 TJm
-(ANY) 17.2632 Tj
--360 TJm
-(THEOR) 26.5643 Tj
-65 TJm
-(Y) 5.75441 Tj
--360 TJm
-(OF) 10.1858 Tj
--360 TJm
-(LIAB) 18.5942 Tj
-1 TJm
-(ILITY) 20.802 Tj
-128 TJm
-(,) 1.99253 Tj
-72 480.314 Td
-(WHETHER) 38.9578 Tj
--247 TJm
-(IN) 8.40846 Tj
--247 TJm
-(CONTRA) 32.7651 Tj
-40 TJm
-(CT) 10.1858 Tj
-74 TJm
-(,) 1.99253 Tj
--247 TJm
-(STRICT) 27.457 Tj
--247 TJm
-(LIABILITY) 39.3962 Tj
-129 TJm
-(,) 1.99253 Tj
--246 TJm
-(OR) 11.0705 Tj
--247 TJm
-(T) 4.86973 Tj
-18 TJm
-(OR) 11.0705 Tj
-60 TJm
-(T) 4.86973 Tj
--247 TJm
-(\(INCLUDING) 46.92 Tj
--247 TJm
-(NEGLIGENCE) 50.4667 Tj
--247 TJm
-(OR) 11.0705 Tj
--247 TJm
-(O) 5.75441 Tj
-40 TJm
-(THER) 20.8099 Tj
-55 TJm
-(WISE\)) 22.133 Tj
--247 TJm
-(ARISING) 32.3188 Tj
--247 TJm
-(IN) 8.40846 Tj
--247 TJm
-(ANY) 17.2632 Tj
--247 TJm
-(W) 7.52377 Tj
-120 TJm
-(A) 5.75441 Tj
-105 TJm
-(Y) 5.75441 Tj
--247 TJm
-(OUT) 16.3786 Tj
-72 470.75 Td
-(OF) 10.1858 Tj
--250 TJm
-(THE) 15.4939 Tj
--250 TJm
-(USE) 15.0555 Tj
--250 TJm
-(OF) 10.1858 Tj
--250 TJm
-(THIS) 17.7096 Tj
--250 TJm
-(SOFTW) 27.0107 Tj
-120 TJm
-(ARE,) 17.9327 Tj
--250 TJm
-(EVEN) 21.2483 Tj
--250 TJm
-(IF) 7.08542 Tj
--250 TJm
-(AD) 11.5088 Tj
-40 TJm
-(VISED) 23.464 Tj
--250 TJm
-(OF) 10.1858 Tj
--250 TJm
-(THE) 15.4939 Tj
--250 TJm
-(POSSIBILITY) 47.8206 Tj
--250 TJm
-(OF) 10.1858 Tj
--250 TJm
-(SUCH) 21.2563 Tj
--250 TJm
-(D) 5.75441 Tj
-40 TJm
-(AMA) 18.5942 Tj
-40 TJm
-(GE.) 12.6167 Tj
-[1 0 0 1 72 469.598] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -7.9701] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -461.628] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 453.216 Td
-/F130_0 7.9701 Tf
-(P) 4.43138 Tj
-92 TJm
-(A) 5.75441 Tj
-111 TJm
-(TENTS:) 27.0107 Tj
--296 TJm
-(T) 4.86973 Tj
-80 TJm
-(o) 3.98505 Tj
--295 TJm
-(the) 9.73946 Tj
--296 TJm
-(best) 12.8398 Tj
--295 TJm
-(of) 6.63909 Tj
--296 TJm
-(my) 10.1858 Tj
--295 TJm
-(kno) 11.9551 Tj
-25 TJm
-(wledge,) 25.0102 Tj
-[1 0 0 1 208.544 453.216] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -208.544 -453.216] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-208.544 453.216 Td
-/F134_0 7.9701 Tf
-(bzip2) 23.9103 Tj
-[1 0 0 1 232.454 453.216] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -232.454 -453.216] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-234.81 453.216 Td
-/F130_0 7.9701 Tf
-(and) 11.5088 Tj
-[1 0 0 1 248.674 453.216] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -248.674 -453.216] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-248.674 453.216 Td
-/F134_0 7.9701 Tf
-(libbzip2) 38.2565 Tj
-[1 0 0 1 286.931 453.216] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -286.931 -453.216] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-289.286 453.216 Td
-/F130_0 7.9701 Tf
-(do) 7.9701 Tj
--296 TJm
-(not) 10.1858 Tj
--295 TJm
-(use) 10.6241 Tj
--296 TJm
-(an) 7.52377 Tj
-15 TJm
-(y) 3.98505 Tj
--295 TJm
-(patented) 27.0027 Tj
--296 TJm
-(algorithms.) 36.0886 Tj
--893 TJm
-(Ho) 9.73946 Tj
-25 TJm
-(we) 9.29314 Tj
-25 TJm
-(v) 3.98505 Tj
-15 TJm
-(er) 6.19277 Tj
-40 TJm
-(,) 1.99253 Tj
--307 TJm
-(I) 2.65404 Tj
--295 TJm
-(do) 7.9701 Tj
--296 TJm
-(not) 10.1858 Tj
--295 TJm
-(ha) 7.52377 Tj
-20 TJm
-(v) 3.98505 Tj
-15 TJm
-(e) 3.53872 Tj
--296 TJm
-(the) 9.73946 Tj
--295 TJm
-(resources) 30.0951 Tj
--296 TJm
-(to) 6.20074 Tj
-72 443.652 Td
-(carry) 16.3706 Tj
--250 TJm
-(out) 10.1858 Tj
--250 TJm
-(a) 3.53872 Tj
--250 TJm
-(patent) 19.4789 Tj
--250 TJm
-(search.) 22.3482 Tj
--620 TJm
-(Therefore) 31.4181 Tj
--250 TJm
-(I) 2.65404 Tj
--250 TJm
-(cannot) 21.2483 Tj
--250 TJm
-(gi) 6.20074 Tj
-25 TJm
-(v) 3.98505 Tj
-15 TJm
-(e) 3.53872 Tj
--250 TJm
-(an) 7.52377 Tj
-15 TJm
-(y) 3.98505 Tj
--250 TJm
-(guarantee) 30.9798 Tj
--250 TJm
-(of) 6.63909 Tj
--250 TJm
-(the) 9.73946 Tj
--250 TJm
-(abo) 11.5088 Tj
-15 TJm
-(v) 3.98505 Tj
-15 TJm
-(e) 3.53872 Tj
--250 TJm
-(statement.) 32.5419 Tj
-[1 0 0 1 72 441.926] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -391.074] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 374.394 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 46.7993 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -46.7993 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 93.5986 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.2765 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-Q
-showpage
-%%PageTrailer
-pdfEndPage
-%%Page: 3 3
-%%BeginPageSetup
-%%PageOrientation: Portrait
-pdfStartPage
-0 0 612 792 re W
-%%EndPageSetup
-[] 0 d
-1 i
-0 j
-0 J
-10 M
-1 w
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-false op
-false OP
-0 0 612 792 re
-W
-q
-[1 0 0 1 72 741.554] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 14.4459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 187.197 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 140.398 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -140.398 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 280.796 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.974 -13.9477] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -0.4981] cm
-q
-[] 0 d
-0 J
-0.4981 w
-0 0.2491 m
-475.465 0.2491 l
-S
-Q
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 479.251 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -468 -21.5542] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -720] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 707.441 Td
-/F122_0 17.2154 Tf
-(T) 10.5186 Tj
-80 TJm
-(ab) 20.0904 Tj
-10 TJm
-(le) 14.3576 Tj
--278 TJm
-(of) 16.2513 Tj
--278 TJm
-(Contents) 74.5943 Tj
-[1 0 0 1 72 698.619] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -11.7401] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -686.879] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 686.879 Td
-/F130_0 9.9626 Tf
-(1.) 7.47195 Tj
--310 TJm
-(Introduction) 49.2551 Tj
-[1 0 0 1 131.815 686.879] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -136.796 -686.879] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-145.733 686.879 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 511.108 686.879] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -511.108 -686.879] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-511.108 686.879 Td
-/F130_0 9.9626 Tf
-(1) 4.9813 Tj
-[1 0 0 1 516.09 686.879] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -0.0996] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -11.8556] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -674.923] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 674.923 Td
-/F130_0 9.9626 Tf
-(2.) 7.47195 Tj
--310 TJm
-(Ho) 12.1743 Tj
-25 TJm
-(w) 7.193 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(use) 13.2801 Tj
--250 TJm
-(bzip2) 22.1369 Tj
-[1 0 0 1 152.318 674.923] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -157.3 -674.923] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-167.054 674.923 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 511.108 674.923] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -511.108 -674.923] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-511.108 674.923 Td
-/F130_0 9.9626 Tf
-(2) 4.9813 Tj
-[1 0 0 1 516.09 674.923] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7984] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -662.968] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 662.968 Td
-/F130_0 9.9626 Tf
-(2.1.) 14.9439 Tj
--310 TJm
-(N) 7.193 Tj
-35 TJm
-(AME) 22.1369 Tj
-[1 0 0 1 119.014 662.968] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -123.995 -662.968] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-132.691 662.968 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 511.108 662.968] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -511.108 -662.968] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-511.108 662.968 Td
-/F130_0 9.9626 Tf
-(2) 4.9813 Tj
-[1 0 0 1 516.09 662.968] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -0.0995] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -11.8556] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -651.013] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 651.013 Td
-/F130_0 9.9626 Tf
-(2.2.) 14.9439 Tj
--310 TJm
-(SYNOPSIS) 47.0534 Tj
-[1 0 0 1 137.085 651.013] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -142.067 -651.013] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-150.582 651.013 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 511.108 651.013] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -511.108 -651.013] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-511.108 651.013 Td
-/F130_0 9.9626 Tf
-(2) 4.9813 Tj
-[1 0 0 1 516.09 651.013] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -0.0996] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -11.8556] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -639.058] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 639.058 Td
-/F130_0 9.9626 Tf
-(2.3.) 14.9439 Tj
--310 TJm
-(DESCRIPTION) 64.7569 Tj
-[1 0 0 1 154.789 639.058] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -159.77 -639.058] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-168.29 639.058 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 511.108 639.058] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -511.108 -639.058] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-511.108 639.058 Td
-/F130_0 9.9626 Tf
-(3) 4.9813 Tj
-[1 0 0 1 516.09 639.058] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -0.0995] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -11.8557] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -627.103] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 627.103 Td
-/F130_0 9.9626 Tf
-(2.4.) 14.9439 Tj
--310 TJm
-(OPTIONS) 42.0621 Tj
-[1 0 0 1 132.094 627.103] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -137.076 -627.103] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-145.873 627.103 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 511.108 627.103] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -511.108 -627.103] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-511.108 627.103 Td
-/F130_0 9.9626 Tf
-(4) 4.9813 Tj
-[1 0 0 1 516.09 627.103] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -0.0995] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -11.8556] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -615.147] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 615.147 Td
-/F130_0 9.9626 Tf
-(2.5.) 14.9439 Tj
--310 TJm
-(MEMOR) 37.6387 Tj
-65 TJm
-(Y) 7.193 Tj
--250 TJm
-(MAN) 23.2427 Tj
-35 TJm
-(A) 7.193 Tj
-40 TJm
-(GEMENT) 41.5042 Tj
-[1 0 0 1 207.9 615.147] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -212.881 -615.147] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-221.412 615.147 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 511.108 615.147] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -511.108 -615.147] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-511.108 615.147 Td
-/F130_0 9.9626 Tf
-(5) 4.9813 Tj
-[1 0 0 1 516.09 615.147] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -0.0996] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -11.8556] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -603.192] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 603.192 Td
-/F130_0 9.9626 Tf
-(2.6.) 14.9439 Tj
--310 TJm
-(RECO) 26.5703 Tj
-50 TJm
-(VERING) 37.6287 Tj
--250 TJm
-(D) 7.193 Tj
-40 TJm
-(A) 7.193 Tj
-111 TJm
-(T) 6.08715 Tj
-93 TJm
-(A) 7.193 Tj
--250 TJm
-(FR) 12.1843 Tj
-40 TJm
-(OM) 16.0497 Tj
--250 TJm
-(D) 7.193 Tj
-40 TJm
-(AMA) 23.2427 Tj
-40 TJm
-(GED) 20.4731 Tj
--250 TJm
-(FILES) 26.5703 Tj
-[1 0 0 1 293.449 603.192] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -298.43 -603.192] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-308.464 603.192 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 511.108 603.192] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -511.108 -603.192] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-511.108 603.192 Td
-/F130_0 9.9626 Tf
-(6) 4.9813 Tj
-[1 0 0 1 516.09 603.192] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -0.0995] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -11.8557] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -591.237] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 591.237 Td
-/F130_0 9.9626 Tf
-(2.7.) 14.9439 Tj
--310 TJm
-(PERFORMANCE) 73.6236 Tj
--250 TJm
-(NO) 14.386 Tj
-40 TJm
-(TES) 17.7135 Tj
-[1 0 0 1 197.847 591.237] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -202.829 -591.237] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-211.958 591.237 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 511.108 591.237] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -511.108 -591.237] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-511.108 591.237 Td
-/F130_0 9.9626 Tf
-(6) 4.9813 Tj
-[1 0 0 1 516.09 591.237] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -0.0995] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -11.8557] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -579.282] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 579.282 Td
-/F130_0 9.9626 Tf
-(2.8.) 14.9439 Tj
--310 TJm
-(CA) 13.8381 Tj
-135 TJm
-(VEA) 20.4731 Tj
-111 TJm
-(TS) 11.6264 Tj
-[1 0 0 1 133.519 579.282] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -138.5 -579.282] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-148.799 579.282 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 511.108 579.282] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -511.108 -579.282] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-511.108 579.282 Td
-/F130_0 9.9626 Tf
-(7) 4.9813 Tj
-[1 0 0 1 516.09 579.282] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -0.0995] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -11.8556] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -567.327] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 567.327 Td
-/F130_0 9.9626 Tf
-(2.9.) 14.9439 Tj
--310 TJm
-(A) 7.193 Tj
-55 TJm
-(UTHOR) 34.3112 Tj
-[1 0 0 1 130.989 567.327] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -135.97 -567.327] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-145.32 567.327 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 511.108 567.327] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -511.108 -567.327] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-511.108 567.327 Td
-/F130_0 9.9626 Tf
-(7) 4.9813 Tj
-[1 0 0 1 516.09 567.327] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -0.2192] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -11.736] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -555.372] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 555.372 Td
-/F130_0 9.9626 Tf
-(3.) 7.47195 Tj
--310 TJm
-(Programming) 54.7943 Tj
--250 TJm
-(with) 17.7135 Tj
-[1 0 0 1 160.049 555.372] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -160.049 -555.372] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-160.049 555.372 Td
-/F134_0 9.9626 Tf
-(libbzip2) 47.8205 Tj
-[1 0 0 1 207.87 555.372] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -215.342 -555.372] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-224.856 555.372 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 511.108 555.372] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -511.108 -555.372] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-511.108 555.372 Td
-/F130_0 9.9626 Tf
-(8) 4.9813 Tj
-[1 0 0 1 516.09 555.372] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7984] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -543.416] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 543.416 Td
-/F130_0 9.9626 Tf
-(3.1.) 14.9439 Tj
--310 TJm
-(T) 6.08715 Tj
-80 TJm
-(op-le) 20.4731 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(el) 7.193 Tj
--250 TJm
-(structure) 34.8591 Tj
-[1 0 0 1 164.921 543.416] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -169.902 -543.416] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-179.997 543.416 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 511.108 543.416] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -511.108 -543.416] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-511.108 543.416 Td
-/F130_0 9.9626 Tf
-(8) 4.9813 Tj
-[1 0 0 1 516.09 543.416] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7983] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -531.461] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 531.461 Td
-/F130_0 9.9626 Tf
-(3.1.1.) 22.4159 Tj
--310 TJm
-(Lo) 11.0684 Tj
-25 TJm
-(w-le) 17.7035 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(el) 7.193 Tj
--250 TJm
-(summary) 37.0808 Tj
-[1 0 0 1 177.374 531.461] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -182.355 -531.461] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-192.866 531.461 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 511.108 531.461] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -511.108 -531.461] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-511.108 531.461 Td
-/F130_0 9.9626 Tf
-(9) 4.9813 Tj
-[1 0 0 1 516.09 531.461] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7984] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -519.506] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 519.506 Td
-/F130_0 9.9626 Tf
-(3.1.2.) 22.4159 Tj
--310 TJm
-(High-le) 30.4357 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(el) 7.193 Tj
--250 TJm
-(summary) 37.0808 Tj
-[1 0 0 1 179.287 519.506] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -184.268 -519.506] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-193.822 519.506 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 511.108 519.506] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -511.108 -519.506] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-511.108 519.506 Td
-/F130_0 9.9626 Tf
-(9) 4.9813 Tj
-[1 0 0 1 516.09 519.506] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7984] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -507.551] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 507.551 Td
-/F130_0 9.9626 Tf
-(3.1.3.) 22.4159 Tj
--310 TJm
-(Utility) 26.0223 Tj
--250 TJm
-(functions) 37.0808 Tj
--250 TJm
-(summary) 37.0808 Tj
-[1 0 0 1 202.669 507.551] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -207.65 -507.551] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-216.582 507.551 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 511.108 507.551] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -511.108 -507.551] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-511.108 507.551 Td
-/F130_0 9.9626 Tf
-(9) 4.9813 Tj
-[1 0 0 1 516.09 507.551] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7983] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -495.596] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 495.596 Td
-/F130_0 9.9626 Tf
-(3.2.) 14.9439 Tj
--310 TJm
-(Error) 21.0211 Tj
--250 TJm
-(handling) 34.8691 Tj
-[1 0 0 1 148.413 495.596] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -153.394 -495.596] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-162.611 495.596 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 495.596] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -495.596] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 495.596 Td
-/F130_0 9.9626 Tf
-(10) 9.9626 Tj
-[1 0 0 1 516.09 495.596] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7984] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -483.641] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 483.641 Td
-/F130_0 9.9626 Tf
-(3.3.) 14.9439 Tj
--310 TJm
-(Lo) 11.0684 Tj
-25 TJm
-(w-le) 17.7035 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(el) 7.193 Tj
--250 TJm
-(interf) 21.579 Tj
-10 TJm
-(ace) 13.2702 Tj
-[1 0 0 1 167.571 483.641] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -172.552 -483.641] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-181.045 483.641 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 483.641] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -483.641] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 483.641 Td
-/F130_0 9.9626 Tf
-(11) 9.9626 Tj
-[1 0 0 1 516.09 483.641] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -0.0995] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -11.8557] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -471.685] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 471.685 Td
-/F130_0 9.9626 Tf
-(3.3.1.) 22.4159 Tj
-[1 0 0 1 97.5043 471.685] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -97.5043 -471.685] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-97.5043 471.685 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompressInit) 107.596 Tj
-[1 0 0 1 205.101 471.685] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -210.082 -471.685] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-219.736 471.685 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 471.685] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -471.685] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 471.685 Td
-/F130_0 9.9626 Tf
-(11) 9.9626 Tj
-[1 0 0 1 516.09 471.685] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -1.5341] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -10.421] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -459.73] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 459.73 Td
-/F130_0 9.9626 Tf
-(3.3.2.) 22.4159 Tj
-[1 0 0 1 97.5043 459.73] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -97.5043 -459.73] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-97.5043 459.73 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompress) 83.6858 Tj
-[1 0 0 1 181.19 459.73] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -186.172 -459.73] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-194.497 459.73 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 459.73] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -459.73] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 459.73 Td
-/F130_0 9.9626 Tf
-(13) 9.9626 Tj
-[1 0 0 1 516.09 459.73] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -1.5342] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -10.421] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -447.775] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 447.775 Td
-/F130_0 9.9626 Tf
-(3.3.3.) 22.4159 Tj
-[1 0 0 1 97.5043 447.775] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -97.5043 -447.775] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-97.5043 447.775 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompressEnd) 101.619 Tj
-[1 0 0 1 199.123 447.775] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -204.105 -447.775] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-214.533 447.775 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 447.775] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -447.775] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 447.775 Td
-/F130_0 9.9626 Tf
-(16) 9.9626 Tj
-[1 0 0 1 516.09 447.775] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -1.5342] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -10.421] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -435.82] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 435.82 Td
-/F130_0 9.9626 Tf
-(3.3.4.) 22.4159 Tj
-[1 0 0 1 97.5043 435.82] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -97.5043 -435.82] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-97.5043 435.82 Td
-/F134_0 9.9626 Tf
-(BZ2_bzDecompressInit) 119.551 Tj
-[1 0 0 1 217.056 435.82] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -222.037 -435.82] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-232.355 435.82 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 435.82] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -435.82] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 435.82 Td
-/F130_0 9.9626 Tf
-(16) 9.9626 Tj
-[1 0 0 1 516.09 435.82] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -1.5341] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -10.421] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -423.865] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 423.865 Td
-/F130_0 9.9626 Tf
-(3.3.5.) 22.4159 Tj
-[1 0 0 1 97.5043 423.865] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -97.5043 -423.865] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-97.5043 423.865 Td
-/F134_0 9.9626 Tf
-(BZ2_bzDecompress) 95.641 Tj
-[1 0 0 1 193.146 423.865] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -198.127 -423.865] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-207.116 423.865 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 423.865] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -423.865] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 423.865 Td
-/F130_0 9.9626 Tf
-(17) 9.9626 Tj
-[1 0 0 1 516.09 423.865] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -1.5342] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -10.421] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -411.91] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 411.91 Td
-/F130_0 9.9626 Tf
-(3.3.6.) 22.4159 Tj
-[1 0 0 1 97.5043 411.91] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -97.5043 -411.91] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-97.5043 411.91 Td
-/F134_0 9.9626 Tf
-(BZ2_bzDecompressEnd) 113.574 Tj
-[1 0 0 1 211.078 411.91] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -216.06 -411.91] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-224.938 411.91 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 411.91] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -411.91] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 411.91 Td
-/F130_0 9.9626 Tf
-(18) 9.9626 Tj
-[1 0 0 1 516.09 411.91] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -1.5342] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -10.421] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -399.954] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 399.954 Td
-/F130_0 9.9626 Tf
-(3.4.) 14.9439 Tj
--310 TJm
-(High-le) 30.4357 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(el) 7.193 Tj
--250 TJm
-(interf) 21.579 Tj
-10 TJm
-(ace) 13.2702 Tj
-[1 0 0 1 169.483 399.954] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -174.465 -399.954] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-184.216 399.954 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 399.954] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -399.954] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 399.954 Td
-/F130_0 9.9626 Tf
-(18) 9.9626 Tj
-[1 0 0 1 516.09 399.954] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7983] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -387.999] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 387.999 Td
-/F130_0 9.9626 Tf
-(3.4.1.) 22.4159 Tj
-[1 0 0 1 97.5043 387.999] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -97.5043 -387.999] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-97.5043 387.999 Td
-/F134_0 9.9626 Tf
-(BZ2_bzReadOpen) 83.6858 Tj
-[1 0 0 1 181.19 387.999] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -186.172 -387.999] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-194.497 387.999 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 387.999] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -387.999] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 387.999 Td
-/F130_0 9.9626 Tf
-(19) 9.9626 Tj
-[1 0 0 1 516.09 387.999] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -1.5342] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -10.421] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -376.044] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 376.044 Td
-/F130_0 9.9626 Tf
-(3.4.2.) 22.4159 Tj
-[1 0 0 1 97.5043 376.044] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -97.5043 -376.044] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-97.5043 376.044 Td
-/F134_0 9.9626 Tf
-(BZ2_bzRead) 59.7756 Tj
-[1 0 0 1 157.28 376.044] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -162.261 -376.044] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-171.472 376.044 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 376.044] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -376.044] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 376.044 Td
-/F130_0 9.9626 Tf
-(20) 9.9626 Tj
-[1 0 0 1 516.09 376.044] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -1.31] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -10.6452] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -364.089] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 364.089 Td
-/F130_0 9.9626 Tf
-(3.4.3.) 22.4159 Tj
-[1 0 0 1 97.5043 364.089] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -97.5043 -364.089] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-97.5043 364.089 Td
-/F134_0 9.9626 Tf
-(BZ2_bzReadGetUnused) 113.574 Tj
-[1 0 0 1 211.078 364.089] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -216.06 -364.089] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-224.938 364.089 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 364.089] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -364.089] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 364.089 Td
-/F130_0 9.9626 Tf
-(21) 9.9626 Tj
-[1 0 0 1 516.09 364.089] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -1.31] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -10.6452] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -352.134] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 352.134 Td
-/F130_0 9.9626 Tf
-(3.4.4.) 22.4159 Tj
-[1 0 0 1 97.5043 352.134] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -97.5043 -352.134] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-97.5043 352.134 Td
-/F134_0 9.9626 Tf
-(BZ2_bzReadClose) 89.6634 Tj
-[1 0 0 1 187.168 352.134] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -192.149 -352.134] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-201.914 352.134 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 352.134] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -352.134] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 352.134 Td
-/F130_0 9.9626 Tf
-(22) 9.9626 Tj
-[1 0 0 1 516.09 352.134] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -1.31] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -10.6451] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -340.179] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 340.179 Td
-/F130_0 9.9626 Tf
-(3.4.5.) 22.4159 Tj
-[1 0 0 1 97.5043 340.179] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -97.5043 -340.179] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-97.5043 340.179 Td
-/F134_0 9.9626 Tf
-(BZ2_bzWriteOpen) 89.6634 Tj
-[1 0 0 1 187.168 340.179] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -192.149 -340.179] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-201.914 340.179 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 340.179] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -340.179] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 340.179 Td
-/F130_0 9.9626 Tf
-(22) 9.9626 Tj
-[1 0 0 1 516.09 340.179] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -1.5342] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -10.421] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -328.223] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 328.223 Td
-/F130_0 9.9626 Tf
-(3.4.6.) 22.4159 Tj
-[1 0 0 1 97.5043 328.223] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -97.5043 -328.223] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-97.5043 328.223 Td
-/F134_0 9.9626 Tf
-(BZ2_bzWrite) 65.7532 Tj
-[1 0 0 1 163.258 328.223] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -168.239 -328.223] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-176.675 328.223 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 328.223] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -328.223] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 328.223 Td
-/F130_0 9.9626 Tf
-(23) 9.9626 Tj
-[1 0 0 1 516.09 328.223] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -1.31] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -10.6452] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -316.268] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 316.268 Td
-/F130_0 9.9626 Tf
-(3.4.7.) 22.4159 Tj
-[1 0 0 1 97.5043 316.268] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -97.5043 -316.268] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-97.5043 316.268 Td
-/F134_0 9.9626 Tf
-(BZ2_bzWriteClose) 95.641 Tj
-[1 0 0 1 193.146 316.268] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -198.127 -316.268] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-207.116 316.268 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 316.268] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -316.268] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 316.268 Td
-/F130_0 9.9626 Tf
-(23) 9.9626 Tj
-[1 0 0 1 516.09 316.268] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -1.31] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -10.6451] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -304.313] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 304.313 Td
-/F130_0 9.9626 Tf
-(3.4.8.) 22.4159 Tj
--310 TJm
-(Handling) 37.0808 Tj
--250 TJm
-(embedded) 40.9463 Tj
--250 TJm
-(compressed) 47.0334 Tj
--250 TJm
-(data) 16.5977 Tj
--250 TJm
-(streams) 30.4357 Tj
-[1 0 0 1 279.56 304.313] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -284.541 -304.313] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-294.601 304.313 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 304.313] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -304.313] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 304.313 Td
-/F130_0 9.9626 Tf
-(24) 9.9626 Tj
-[1 0 0 1 516.09 304.313] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7984] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -292.358] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 292.358 Td
-/F130_0 9.9626 Tf
-(3.4.9.) 22.4159 Tj
--310 TJm
-(Standard) 35.417 Tj
--250 TJm
-(\002le-reading/writing) 77.4791 Tj
--250 TJm
-(code) 18.8094 Tj
-[1 0 0 1 234.19 292.358] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -239.172 -292.358] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-247.564 292.358 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 292.358] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -292.358] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 292.358 Td
-/F130_0 9.9626 Tf
-(25) 9.9626 Tj
-[1 0 0 1 516.09 292.358] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7984] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -280.403] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 280.403 Td
-/F130_0 9.9626 Tf
-(3.5.) 14.9439 Tj
--310 TJm
-(Utility) 26.0223 Tj
--250 TJm
-(functions) 37.0808 Tj
-[1 0 0 1 155.625 280.403] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -160.607 -280.403] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-170.645 280.403 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 280.403] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -280.403] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 280.403 Td
-/F130_0 9.9626 Tf
-(26) 9.9626 Tj
-[1 0 0 1 516.09 280.403] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7983] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -268.448] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 268.448 Td
-/F130_0 9.9626 Tf
-(3.5.1.) 22.4159 Tj
-[1 0 0 1 97.5043 268.448] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -97.5043 -268.448] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-97.5043 268.448 Td
-/F134_0 9.9626 Tf
-(BZ2_bzBuffToBuffCompress) 143.461 Tj
-[1 0 0 1 240.966 268.448] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -245.948 -268.448] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-255.38 268.448 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 268.448] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -268.448] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 268.448 Td
-/F130_0 9.9626 Tf
-(26) 9.9626 Tj
-[1 0 0 1 516.09 268.448] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -1.5342] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -10.421] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -256.492] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 256.492 Td
-/F130_0 9.9626 Tf
-(3.5.2.) 22.4159 Tj
-[1 0 0 1 97.5043 256.492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -97.5043 -256.492] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-97.5043 256.492 Td
-/F134_0 9.9626 Tf
-(BZ2_bzBuffToBuffDecompress) 155.417 Tj
-[1 0 0 1 252.922 256.492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -257.903 -256.492] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-267.999 256.492 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 256.492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -256.492] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 256.492 Td
-/F130_0 9.9626 Tf
-(27) 9.9626 Tj
-[1 0 0 1 516.09 256.492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -1.5342] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -10.421] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -244.537] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 244.537 Td
-/F130_0 9.9626 Tf
-(3.6.) 14.9439 Tj
-[1 0 0 1 90.0324 244.537] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90.0324 -244.537] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90.0324 244.537 Td
-/F134_0 9.9626 Tf
-(zlib) 23.9102 Tj
-[1 0 0 1 113.943 244.537] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -113.943 -244.537] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-116.433 244.537 Td
-/F130_0 9.9626 Tf
-(compatibility) 53.1405 Tj
--250 TJm
-(functions) 37.0808 Tj
-[1 0 0 1 209.144 244.537] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -214.126 -244.537] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-223.971 244.537 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 244.537] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -244.537] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 244.537 Td
-/F130_0 9.9626 Tf
-(28) 9.9626 Tj
-[1 0 0 1 516.09 244.537] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7983] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -232.582] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 232.582 Td
-/F130_0 9.9626 Tf
-(3.7.) 14.9439 Tj
--310 TJm
-(Using) 23.8007 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(library) 26.5603 Tj
--250 TJm
-(in) 7.7509 Tj
--250 TJm
-(a) 4.42339 Tj
-[1 0 0 1 177.195 232.582] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -177.195 -232.582] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-177.195 232.582 Td
-/F134_0 9.9626 Tf
-(stdio) 29.8878 Tj
-[1 0 0 1 207.083 232.582] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -207.083 -232.582] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-207.083 232.582 Td
-/F130_0 9.9626 Tf
-(-free) 18.7994 Tj
--250 TJm
-(en) 9.40469 Tj
-40 TJm
-(vironment) 40.9562 Tj
-[1 0 0 1 278.335 232.582] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -283.316 -232.582] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-291.775 232.582 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 232.582] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -232.582] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 232.582 Td
-/F130_0 9.9626 Tf
-(28) 9.9626 Tj
-[1 0 0 1 516.09 232.582] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7984] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -220.627] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 220.627 Td
-/F130_0 9.9626 Tf
-(3.7.1.) 22.4159 Tj
--310 TJm
-(Getting) 29.8878 Tj
--250 TJm
-(rid) 11.0684 Tj
--250 TJm
-(of) 8.29885 Tj
-[1 0 0 1 154.231 220.627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -154.231 -220.627] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-154.231 220.627 Td
-/F134_0 9.9626 Tf
-(stdio) 29.8878 Tj
-[1 0 0 1 184.119 220.627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -189.1 -220.627] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-198.175 220.627 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 220.627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -220.627] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 220.627 Td
-/F130_0 9.9626 Tf
-(29) 9.9626 Tj
-[1 0 0 1 516.09 220.627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7984] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -208.672] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 208.672 Td
-/F130_0 9.9626 Tf
-(3.7.2.) 22.4159 Tj
--310 TJm
-(Critical) 29.8878 Tj
--250 TJm
-(error) 19.3573 Tj
--250 TJm
-(handling) 34.8691 Tj
-[1 0 0 1 186.599 208.672] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -191.58 -208.672] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-201.629 208.672 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 208.672] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -208.672] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 208.672 Td
-/F130_0 9.9626 Tf
-(29) 9.9626 Tj
-[1 0 0 1 516.09 208.672] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7983] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -196.717] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 196.717 Td
-/F130_0 9.9626 Tf
-(3.8.) 14.9439 Tj
--310 TJm
-(Making) 30.9936 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(W) 9.40469 Tj
-40 TJm
-(indo) 17.7135 Tj
-25 TJm
-(ws) 11.0684 Tj
--250 TJm
-(DLL) 19.3673 Tj
-[1 0 0 1 189.828 196.717] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -194.809 -196.717] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-203.243 196.717 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 196.717] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -196.717] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 196.717 Td
-/F130_0 9.9626 Tf
-(29) 9.9626 Tj
-[1 0 0 1 516.09 196.717] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1569] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7983] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -184.761] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 184.761 Td
-/F130_0 9.9626 Tf
-(4.) 7.47195 Tj
--310 TJm
-(Miscellanea) 48.1393 Tj
-[1 0 0 1 130.699 184.761] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -135.68 -184.761] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-144.898 184.761 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 184.761] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -184.761] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 184.761 Td
-/F130_0 9.9626 Tf
-(31) 9.9626 Tj
-[1 0 0 1 516.09 184.761] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -0.0995] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -11.8557] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -172.806] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 172.806 Td
-/F130_0 9.9626 Tf
-(4.1.) 14.9439 Tj
--310 TJm
-(Limitations) 45.9475 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(compressed) 47.0334 Tj
--250 TJm
-(\002le) 12.7322 Tj
--250 TJm
-(format) 26.5603 Tj
-[1 0 0 1 255.231 172.806] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -260.212 -172.806] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-269.154 172.806 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 172.806] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -172.806] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 172.806 Td
-/F130_0 9.9626 Tf
-(31) 9.9626 Tj
-[1 0 0 1 516.09 172.806] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7983] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -160.851] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 160.851 Td
-/F130_0 9.9626 Tf
-(4.2.) 14.9439 Tj
--310 TJm
-(Portability) 42.0721 Tj
--250 TJm
-(issues) 23.8007 Tj
-[1 0 0 1 158.395 160.851] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -163.376 -160.851] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-172.03 160.851 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 160.851] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -160.851] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 160.851 Td
-/F130_0 9.9626 Tf
-(32) 9.9626 Tj
-[1 0 0 1 516.09 160.851] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1569] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7983] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -148.896] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 148.896 Td
-/F130_0 9.9626 Tf
-(4.3.) 14.9439 Tj
--310 TJm
-(Reporting) 39.8504 Tj
--250 TJm
-(b) 4.9813 Tj
-20 TJm
-(ugs) 13.8381 Tj
-[1 0 0 1 150.993 148.896] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -155.975 -148.896] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-166.115 148.896 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 148.896] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -148.896] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 148.896 Td
-/F130_0 9.9626 Tf
-(32) 9.9626 Tj
-[1 0 0 1 516.09 148.896] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7984] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -136.941] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 136.941 Td
-/F130_0 9.9626 Tf
-(4.4.) 14.9439 Tj
--310 TJm
-(Did) 14.9439 Tj
--250 TJm
-(you) 14.9439 Tj
--250 TJm
-(get) 12.1743 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(right) 18.8194 Tj
--250 TJm
-(package?) 37.0609 Tj
-[1 0 0 1 212.602 136.941] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 3.0884 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 3.0884 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -218.778 -136.941] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-229.109 136.941 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 136.941] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -136.941] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 136.941 Td
-/F130_0 9.9626 Tf
-(33) 9.9626 Tj
-[1 0 0 1 516.09 136.941] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7983] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -124.986] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 124.986 Td
-/F130_0 9.9626 Tf
-(4.5.) 14.9439 Tj
--310 TJm
-(Further) 29.3299 Tj
--250 TJm
-(Reading) 33.2053 Tj
-[1 0 0 1 155.058 124.986] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -160.039 -124.986] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-170.361 124.986 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 124.986] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -124.986] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 124.986 Td
-/F130_0 9.9626 Tf
-(34) 9.9626 Tj
-[1 0 0 1 516.09 124.986] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1569] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 0 -62.0143] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 374.394 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 41.3997 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -494.668 -50.8518] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-536.068 50.8518 Td
-/F130_0 9.9626 Tf
-(iii) 8.30881 Tj
-[1 0 0 1 453.269 50.8518] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 93.5985 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.2765 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-Q
-showpage
-%%PageTrailer
-pdfEndPage
-%%Page: 4 4
-%%BeginPageSetup
-%%PageOrientation: Portrait
-pdfStartPage
-0 0 612 792 re W
-%%EndPageSetup
-[] 0 d
-1 i
-0 j
-0 J
-10 M
-1 w
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-false op
-false OP
-0 0 612 792 re
-W
-q
-[1 0 0 1 72 741.554] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 14.4459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 187.197 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 140.398 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -140.398 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 280.796 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.974 -13.9477] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -0.4981] cm
-q
-[] 0 d
-0 J
-0.4981 w
-0 0.2491 m
-475.465 0.2491 l
-S
-Q
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 479.251 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -468 -21.5542] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -720] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 701.916 Td
-/F122_0 24.7902 Tf
-(1.) 20.675 Tj
--278 TJm
-(Intr) 39.937 Tj
-20 TJm
-(oduction) 104.664 Tj
-[1 0 0 1 72 701.606] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -691.643] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 679.998 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 101.888 679.998] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -101.888 -679.998] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-104.507 679.998 Td
-/F130_0 9.9626 Tf
-(compresses) 45.9276 Tj
--263 TJm
-(\002les) 16.6077 Tj
--263 TJm
-(using) 21.589 Tj
--263 TJm
-(the) 12.1743 Tj
--262 TJm
-(Burro) 23.2427 Tj
-25 TJm
-(ws-Wheeler) 48.1293 Tj
--263 TJm
-(block-sorting) 53.1305 Tj
--263 TJm
-(te) 7.193 Tj
-15 TJm
-(xt) 7.7509 Tj
--263 TJm
-(compression) 50.3609 Tj
--263 TJm
-(algorithm,) 41.2352 Tj
--266 TJm
-(and) 14.386 Tj
--263 TJm
-(Huf) 15.4918 Tj
-25 TJm
-(fman) 20.4731 Tj
--263 TJm
-(coding.) 29.6088 Tj
-72 668.043 Td
-(Compression) 52.5826 Tj
--203 TJm
-(is) 6.64505 Tj
--204 TJm
-(generally) 37.0708 Tj
--203 TJm
-(considerably) 50.9089 Tj
--203 TJm
-(better) 22.6848 Tj
--204 TJm
-(t) 2.7696 Tj
-1 TJm
-(han) 14.386 Tj
--204 TJm
-(that) 14.9439 Tj
--203 TJm
-(achie) 21.0211 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(ed) 9.40469 Tj
--203 TJm
-(by) 9.9626 Tj
--204 TJm
-(more) 20.4731 Tj
--203 TJm
-(con) 14.386 Tj
-40 TJm
-(v) 4.9813 Tj
-15 TJm
-(entional) 32.0995 Tj
--203 TJm
-(LZ77/LZ78-based) 73.0458 Tj
--204 TJm
-(compressors,) 52.2937 Tj
-72 656.087 Td
-(and) 14.386 Tj
--250 TJm
-(approaches) 44.8118 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(performance) 50.341 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(PPM) 19.9352 Tj
--250 TJm
-(f) 3.31755 Tj
-10 TJm
-(amily) 22.6948 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(statistical) 37.6387 Tj
--250 TJm
-(compressors.) 52.2937 Tj
-[1 0 0 1 72 653.931] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -643.968] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 634.17 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 101.888 634.17] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -101.888 -634.17] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-105.073 634.17 Td
-/F130_0 9.9626 Tf
-(is) 6.64505 Tj
--320 TJm
-(b) 4.9813 Tj
-20 TJm
-(uilt) 13.2901 Tj
--319 TJm
-(on) 9.9626 Tj
--320 TJm
-(top) 12.7322 Tj
--320 TJm
-(of) 8.29885 Tj
-[1 0 0 1 176.712 634.17] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -176.712 -634.17] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-176.712 634.17 Td
-/F134_0 9.9626 Tf
-(libbzip2) 47.8205 Tj
-[1 0 0 1 224.533 634.17] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -224.533 -634.17] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-224.533 634.17 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--337 TJm
-(a) 4.42339 Tj
--320 TJm
-(\003e) 9.9626 Tj
-15 TJm
-(xible) 19.9252 Tj
--320 TJm
-(library) 26.5603 Tj
--319 TJm
-(for) 11.6164 Tj
--320 TJm
-(handling) 34.8691 Tj
--320 TJm
-(compressed) 47.0334 Tj
--320 TJm
-(data) 16.5977 Tj
--319 TJm
-(in) 7.7509 Tj
--320 TJm
-(the) 12.1743 Tj
-[1 0 0 1 449.816 634.17] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -449.816 -634.17] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-449.816 634.17 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 479.704 634.17] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -479.704 -634.17] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-482.889 634.17 Td
-/F130_0 9.9626 Tf
-(format.) 29.0509 Tj
--1039 TJm
-(This) 17.7135 Tj
-72 622.214 Td
-(manual) 29.3299 Tj
--316 TJm
-(describes) 37.0708 Tj
--316 TJm
-(both) 17.7135 Tj
--317 TJm
-(ho) 9.9626 Tj
-25 TJm
-(w) 7.193 Tj
--316 TJm
-(to) 7.7509 Tj
--316 TJm
-(use) 13.2801 Tj
--316 TJm
-(the) 12.1743 Tj
--316 TJm
-(program) 33.7533 Tj
--316 TJm
-(and) 14.386 Tj
--317 TJm
-(ho) 9.9626 Tj
-25 TJm
-(w) 7.193 Tj
--316 TJm
-(to) 7.7509 Tj
--316 TJm
-(w) 7.193 Tj
-10 TJm
-(ork) 13.2801 Tj
--316 TJm
-(with) 17.7135 Tj
--316 TJm
-(the) 12.1743 Tj
--317 TJm
-(library) 26.5603 Tj
--316 TJm
-(interf) 21.579 Tj
-10 TJm
-(ace.) 15.7608 Tj
--1017 TJm
-(Most) 20.4831 Tj
--316 TJm
-(of) 8.29885 Tj
--316 TJm
-(the) 12.1743 Tj
--317 TJm
-(manual) 29.3299 Tj
--316 TJm
-(is) 6.64505 Tj
-72 610.259 Td
-(de) 9.40469 Tj
-25 TJm
-(v) 4.9813 Tj
-20 TJm
-(oted) 17.1556 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(this) 14.396 Tj
--250 TJm
-(library) 26.5603 Tj
-65 TJm
-(,) 2.49065 Tj
--250 TJm
-(not) 12.7322 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(program,) 36.2439 Tj
--250 TJm
-(which) 24.3486 Tj
--250 TJm
-(is) 6.64505 Tj
--250 TJm
-(good) 19.9252 Tj
--250 TJm
-(ne) 9.40469 Tj
-25 TJm
-(ws) 11.0684 Tj
--250 TJm
-(if) 6.08715 Tj
--250 TJm
-(your) 18.2614 Tj
--250 TJm
-(interest) 29.3299 Tj
--250 TJm
-(is) 6.64505 Tj
--250 TJm
-(only) 17.7135 Tj
--250 TJm
-(in) 7.7509 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(program.) 36.2439 Tj
-[1 0 0 1 72 608.102] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 0 -29.7236] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 6.9739 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -78.9739 -578.379] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-78.9739 578.379 Td
-/F130_0 9.9626 Tf
-(\225) 3.48691 Tj
-[1 0 0 1 82.4608 578.379] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.9925 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 1] sc
-/DeviceRGB {} CS
-[0 0 1] SC
-[1 0 0 1 -86.944 -578.379] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 578.379 Td
-/F130_0 9.9626 Tf
-(Ho) 12.1743 Tj
-25 TJm
-(w) 7.193 Tj
--259 TJm
-(to) 7.7509 Tj
--260 TJm
-(use) 13.2801 Tj
--259 TJm
-(bzip2) 22.1369 Tj
-[1 0 0 1 156.985 578.379] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 1] sc
-/DeviceRGB {} CS
-[0 0 1] SC
-/DeviceRGB {} cs
-[0 0 1] sc
-/DeviceRGB {} CS
-[0 0 1] SC
-[1 0 0 1 -156.985 -578.379] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-159.57 578.379 Td
-/F130_0 9.9626 Tf
-([2]) 11.6164 Tj
-[1 0 0 1 171.186 578.379] cm
-/DeviceRGB {} cs
-[0 0 1] sc
-/DeviceRGB {} CS
-[0 0 1] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -171.186 -578.379] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-173.771 578.379 Td
-/F130_0 9.9626 Tf
-(describes) 37.0708 Tj
--259 TJm
-(ho) 9.9626 Tj
-25 TJm
-(w) 7.193 Tj
--260 TJm
-(to) 7.7509 Tj
--259 TJm
-(use) 13.2801 Tj
-[1 0 0 1 259.119 578.379] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -259.119 -578.379] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-259.119 578.379 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 289.007 578.379] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -289.007 -578.379] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-289.007 578.379 Td
-/F130_0 9.9626 Tf
-(;) 2.7696 Tj
--264 TJm
-(this) 14.396 Tj
--260 TJm
-(is) 6.64505 Tj
--259 TJm
-(the) 12.1743 Tj
--260 TJm
-(only) 17.7135 Tj
--259 TJm
-(part) 15.4918 Tj
--259 TJm
-(you) 14.9439 Tj
--260 TJm
-(need) 18.8094 Tj
--259 TJm
-(to) 7.7509 Tj
--260 TJm
-(read) 17.1456 Tj
--259 TJm
-(if) 6.08715 Tj
--260 TJm
-(you) 14.9439 Tj
--259 TJm
-(just) 14.396 Tj
--260 TJm
-(w) 7.193 Tj
-10 TJm
-(ant) 12.1743 Tj
--259 TJm
-(to) 7.7509 Tj
--260 TJm
-(kno) 14.9439 Tj
-25 TJm
-(w) 7.193 Tj
-86.944 566.424 Td
-(ho) 9.9626 Tj
-25 TJm
-(w) 7.193 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(operate) 29.3199 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(program.) 36.2439 Tj
-[1 0 0 1 199.302 566.424] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -127.302 -21.9178] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 6.9739 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -78.9739 -544.506] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-78.9739 544.506 Td
-/F130_0 9.9626 Tf
-(\225) 3.48691 Tj
-[1 0 0 1 82.4608 544.506] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.9925 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 1] sc
-/DeviceRGB {} CS
-[0 0 1] SC
-[1 0 0 1 -86.944 -544.506] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 544.506 Td
-/F130_0 9.9626 Tf
-(Programming) 54.7943 Tj
--250 TJm
-(with) 17.7135 Tj
--250 TJm
-(libbzip2) 32.6574 Tj
-[1 0 0 1 197.09 544.506] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 1] sc
-/DeviceRGB {} CS
-[0 0 1] SC
-/DeviceRGB {} cs
-[0 0 1] sc
-/DeviceRGB {} CS
-[0 0 1] SC
-[1 0 0 1 -197.09 -544.506] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-199.58 544.506 Td
-/F130_0 9.9626 Tf
-([8]) 11.6164 Tj
-[1 0 0 1 211.197 544.506] cm
-/DeviceRGB {} cs
-[0 0 1] sc
-/DeviceRGB {} CS
-[0 0 1] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -211.197 -544.506] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-213.687 544.506 Td
-/F130_0 9.9626 Tf
-(describes) 37.0708 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(programming) 54.2364 Tj
--250 TJm
-(interf) 21.579 Tj
-10 TJm
-(aces) 17.1456 Tj
--250 TJm
-(in) 7.7509 Tj
--250 TJm
-(detail,) 24.6275 Tj
--250 TJm
-(and) 14.386 Tj
-[1 0 0 1 417.501 544.506] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -345.501 -21.9178] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 6.9739 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -78.9739 -522.588] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-78.9739 522.588 Td
-/F130_0 9.9626 Tf
-(\225) 3.48691 Tj
-[1 0 0 1 82.4608 522.588] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.9925 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 1] sc
-/DeviceRGB {} CS
-[0 0 1] SC
-[1 0 0 1 -86.944 -522.588] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 522.588 Td
-/F130_0 9.9626 Tf
-(Miscellanea) 48.1393 Tj
-[1 0 0 1 135.083 522.588] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 1] sc
-/DeviceRGB {} CS
-[0 0 1] SC
-/DeviceRGB {} cs
-[0 0 1] sc
-/DeviceRGB {} CS
-[0 0 1] SC
-[1 0 0 1 -135.083 -522.588] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-137.573 522.588 Td
-/F130_0 9.9626 Tf
-([31]) 16.5977 Tj
-[1 0 0 1 154.171 522.588] cm
-/DeviceRGB {} cs
-[0 0 1] sc
-/DeviceRGB {} CS
-[0 0 1] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -154.171 -522.588] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-156.662 522.588 Td
-/F130_0 9.9626 Tf
-(records) 29.3199 Tj
--250 TJm
-(some) 21.031 Tj
--250 TJm
-(miscellaneous) 56.4481 Tj
--250 TJm
-(notes) 21.031 Tj
--250 TJm
-(which) 24.3486 Tj
--250 TJm
-(I) 3.31755 Tj
--250 TJm
-(thought) 30.4457 Tj
--250 TJm
-(ought) 22.6948 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(be) 9.40469 Tj
--250 TJm
-(recorded) 34.8492 Tj
--250 TJm
-(some) 21.031 Tj
-25 TJm
-(where.) 26.8293 Tj
-[1 0 0 1 492.31 522.588] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -420.31 -471.736] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 374.394 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 43.0633 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -496.332 -50.8518] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-539.395 50.8518 Td
-/F130_0 9.9626 Tf
-(1) 4.9813 Tj
-[1 0 0 1 453.269 50.8518] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 93.5985 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.2765 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-Q
-showpage
-%%PageTrailer
-pdfEndPage
-%%Page: 5 5
-%%BeginPageSetup
-%%PageOrientation: Portrait
-pdfStartPage
-0 0 612 792 re W
-%%EndPageSetup
-[] 0 d
-1 i
-0 j
-0 J
-10 M
-1 w
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-false op
-false OP
-0 0 612 792 re
-W
-q
-[1 0 0 1 72 741.554] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 14.4459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 187.197 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 140.398 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -140.398 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 280.796 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.974 -13.9477] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -0.4981] cm
-q
-[] 0 d
-0 J
-0.4981 w
-0 0.2491 m
-475.465 0.2491 l
-S
-Q
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 479.251 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -21.5542] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -720] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 701.916 Td
-/F122_0 24.7902 Tf
-(2.) 20.675 Tj
--278 TJm
-(Ho) 33.0453 Tj
-15 TJm
-(w) 19.2868 Tj
--278 TJm
-(to) 23.4019 Tj
--278 TJm
-(use) 42.7135 Tj
--278 TJm
-(bzip2) 63.3638 Tj
-[1 0 0 1 72 696.784] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -14.944] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -671.877] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 656.35 Td
-/F122_0 17.2154 Tf
-(T) 10.5186 Tj
-80 TJm
-(ab) 20.0904 Tj
-10 TJm
-(le) 14.3576 Tj
--278 TJm
-(of) 16.2513 Tj
--278 TJm
-(Contents) 74.5943 Tj
-[1 0 0 1 72 647.528] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -11.7401] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -635.788] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 635.788 Td
-/F130_0 9.9626 Tf
-(2.1.) 14.9439 Tj
--310 TJm
-(N) 7.193 Tj
-35 TJm
-(AME) 22.1369 Tj
-[1 0 0 1 119.014 635.788] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -123.995 -635.788] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-132.691 635.788 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 511.108 635.788] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -511.108 -635.788] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-511.108 635.788 Td
-/F130_0 9.9626 Tf
-(2) 4.9813 Tj
-[1 0 0 1 516.09 635.788] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -0.0995] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -11.8556] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -623.832] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 623.832 Td
-/F130_0 9.9626 Tf
-(2.2.) 14.9439 Tj
--310 TJm
-(SYNOPSIS) 47.0534 Tj
-[1 0 0 1 137.085 623.832] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -142.067 -623.832] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-150.582 623.832 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 511.108 623.832] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -511.108 -623.832] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-511.108 623.832 Td
-/F130_0 9.9626 Tf
-(2) 4.9813 Tj
-[1 0 0 1 516.09 623.832] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -0.0996] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -11.8556] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -611.877] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 611.877 Td
-/F130_0 9.9626 Tf
-(2.3.) 14.9439 Tj
--310 TJm
-(DESCRIPTION) 64.7569 Tj
-[1 0 0 1 154.789 611.877] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -159.77 -611.877] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-168.29 611.877 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 511.108 611.877] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -511.108 -611.877] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-511.108 611.877 Td
-/F130_0 9.9626 Tf
-(3) 4.9813 Tj
-[1 0 0 1 516.09 611.877] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -0.0995] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -11.8557] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -599.922] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 599.922 Td
-/F130_0 9.9626 Tf
-(2.4.) 14.9439 Tj
--310 TJm
-(OPTIONS) 42.0621 Tj
-[1 0 0 1 132.094 599.922] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -137.076 -599.922] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-145.873 599.922 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 511.108 599.922] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -511.108 -599.922] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-511.108 599.922 Td
-/F130_0 9.9626 Tf
-(4) 4.9813 Tj
-[1 0 0 1 516.09 599.922] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -0.0995] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -11.8556] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -587.967] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 587.967 Td
-/F130_0 9.9626 Tf
-(2.5.) 14.9439 Tj
--310 TJm
-(MEMOR) 37.6387 Tj
-65 TJm
-(Y) 7.193 Tj
--250 TJm
-(MAN) 23.2427 Tj
-35 TJm
-(A) 7.193 Tj
-40 TJm
-(GEMENT) 41.5042 Tj
-[1 0 0 1 207.9 587.967] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -212.881 -587.967] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-221.412 587.967 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 511.108 587.967] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -511.108 -587.967] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-511.108 587.967 Td
-/F130_0 9.9626 Tf
-(5) 4.9813 Tj
-[1 0 0 1 516.09 587.967] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -0.0996] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -11.8556] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -576.012] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 576.012 Td
-/F130_0 9.9626 Tf
-(2.6.) 14.9439 Tj
--310 TJm
-(RECO) 26.5703 Tj
-50 TJm
-(VERING) 37.6287 Tj
--250 TJm
-(D) 7.193 Tj
-40 TJm
-(A) 7.193 Tj
-111 TJm
-(T) 6.08715 Tj
-93 TJm
-(A) 7.193 Tj
--250 TJm
-(FR) 12.1843 Tj
-40 TJm
-(OM) 16.0497 Tj
--250 TJm
-(D) 7.193 Tj
-40 TJm
-(AMA) 23.2427 Tj
-40 TJm
-(GED) 20.4731 Tj
--250 TJm
-(FILES) 26.5703 Tj
-[1 0 0 1 293.449 576.012] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -298.43 -576.012] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-308.464 576.012 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 511.108 576.012] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -511.108 -576.012] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-511.108 576.012 Td
-/F130_0 9.9626 Tf
-(6) 4.9813 Tj
-[1 0 0 1 516.09 576.012] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -0.0995] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -11.8557] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -564.056] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 564.056 Td
-/F130_0 9.9626 Tf
-(2.7.) 14.9439 Tj
--310 TJm
-(PERFORMANCE) 73.6236 Tj
--250 TJm
-(NO) 14.386 Tj
-40 TJm
-(TES) 17.7135 Tj
-[1 0 0 1 197.847 564.056] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -202.829 -564.056] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-211.958 564.056 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 511.108 564.056] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -511.108 -564.056] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-511.108 564.056 Td
-/F130_0 9.9626 Tf
-(6) 4.9813 Tj
-[1 0 0 1 516.09 564.056] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -0.0995] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -11.8556] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -552.101] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 552.101 Td
-/F130_0 9.9626 Tf
-(2.8.) 14.9439 Tj
--310 TJm
-(CA) 13.8381 Tj
-135 TJm
-(VEA) 20.4731 Tj
-111 TJm
-(TS) 11.6264 Tj
-[1 0 0 1 133.519 552.101] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -138.5 -552.101] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-148.799 552.101 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 511.108 552.101] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -511.108 -552.101] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-511.108 552.101 Td
-/F130_0 9.9626 Tf
-(7) 4.9813 Tj
-[1 0 0 1 516.09 552.101] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -0.0996] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -11.8556] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -540.146] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 540.146 Td
-/F130_0 9.9626 Tf
-(2.9.) 14.9439 Tj
--310 TJm
-(A) 7.193 Tj
-55 TJm
-(UTHOR) 34.3112 Tj
-[1 0 0 1 130.989 540.146] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -135.97 -540.146] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-145.32 540.146 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 511.108 540.146] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -511.108 -540.146] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-511.108 540.146 Td
-/F130_0 9.9626 Tf
-(7) 4.9813 Tj
-[1 0 0 1 516.09 540.146] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -0.2191] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -520.002] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 508.266 Td
-/F130_0 9.9626 Tf
-(This) 17.7135 Tj
--250 TJm
-(chapter) 29.3199 Tj
--250 TJm
-(contains) 33.2053 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(cop) 14.386 Tj
-10 TJm
-(y) 4.9813 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(the) 12.1743 Tj
-[1 0 0 1 213.837 508.266] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -213.837 -508.266] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-213.837 508.266 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 243.725 508.266] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -243.725 -508.266] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-246.215 508.266 Td
-/F130_0 9.9626 Tf
-(man) 17.1556 Tj
--250 TJm
-(page,) 21.3 Tj
--250 TJm
-(and) 14.386 Tj
--250 TJm
-(nothing) 30.4457 Tj
--250 TJm
-(else.) 17.9825 Tj
-[1 0 0 1 72 506.109] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -496.146] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 473.513 Td
-/F122_0 20.6585 Tf
-(2.1.) 34.4584 Tj
--278 TJm
-(NAME) 60.8186 Tj
-[1 0 0 1 72 473.513] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -31.8804] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.9739 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -78.9739 -441.632] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-78.9739 441.632 Td
-/F130_0 9.9626 Tf
-(\225) 3.48691 Tj
-[1 0 0 1 82.4608 441.632] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.9925 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -86.944 -441.632] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 441.632 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 116.832 441.632] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -116.832 -441.632] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-116.832 441.632 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 121.813 441.632] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -121.813 -441.632] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-121.813 441.632 Td
-/F134_0 9.9626 Tf
-(bunzip2) 41.8429 Tj
-[1 0 0 1 163.656 441.632] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -163.656 -441.632] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-166.147 441.632 Td
-/F130_0 9.9626 Tf
-(-) 3.31755 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(block-sorting) 53.1305 Tj
--250 TJm
-(\002le) 12.7322 Tj
--250 TJm
-(compressor) 45.9276 Tj
-40 TJm
-(,) 2.49065 Tj
--250 TJm
-(v1.0.4) 24.9065 Tj
-[1 0 0 1 325.129 441.632] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -253.129 -21.9179] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.9739 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -78.9739 -419.715] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-78.9739 419.715 Td
-/F130_0 9.9626 Tf
-(\225) 3.48691 Tj
-[1 0 0 1 82.4608 419.715] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.9925 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -86.944 -419.715] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 419.715 Td
-/F134_0 9.9626 Tf
-(bzcat) 29.8878 Tj
-[1 0 0 1 116.832 419.715] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -116.832 -419.715] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-119.322 419.715 Td
-/F130_0 9.9626 Tf
-(-) 3.31755 Tj
--250 TJm
-(decompresses) 55.3323 Tj
--250 TJm
-(\002les) 16.6077 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(stdout) 24.3586 Tj
-[1 0 0 1 236.651 419.715] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -164.651 -21.9178] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.9739 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -78.9739 -397.797] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-78.9739 397.797 Td
-/F130_0 9.9626 Tf
-(\225) 3.48691 Tj
-[1 0 0 1 82.4608 397.797] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.9925 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -86.944 -397.797] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 397.797 Td
-/F134_0 9.9626 Tf
-(bzip2recover) 71.7307 Tj
-[1 0 0 1 158.675 397.797] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -158.675 -397.797] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-161.166 397.797 Td
-/F130_0 9.9626 Tf
-(-) 3.31755 Tj
--250 TJm
-(reco) 17.1456 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(ers) 11.6164 Tj
--250 TJm
-(data) 16.5977 Tj
--250 TJm
-(from) 19.3673 Tj
--250 TJm
-(damaged) 35.965 Tj
--250 TJm
-(bzip2) 22.1369 Tj
--250 TJm
-(\002les) 16.6077 Tj
-[1 0 0 1 323.545 397.797] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -251.545 -12.1195] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -375.715] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 353.081 Td
-/F122_0 20.6585 Tf
-(2.2.) 34.4584 Tj
--278 TJm
-(SYNOPSIS) 105.627 Tj
-[1 0 0 1 72 352.823] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -31.6223] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.9739 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -78.9739 -321.201] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-78.9739 321.201 Td
-/F130_0 9.9626 Tf
-(\225) 3.48691 Tj
-[1 0 0 1 82.4608 321.201] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.9925 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -86.944 -321.201] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 321.201 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 116.832 321.201] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -116.832 -321.201] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-119.322 321.201 Td
-/F130_0 9.9626 Tf
-([) 3.31755 Tj
--250 TJm
-(-cdfkqstvzVL123456789) 100.164 Tj
--250 TJm
-(]) 3.31755 Tj
--250 TJm
-([) 3.31755 Tj
--250 TJm
-(\002lenames) 38.1866 Tj
--250 TJm
-(...) 7.47195 Tj
--620 TJm
-(]) 3.31755 Tj
-[1 0 0 1 297.045 321.201] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -225.045 -21.9178] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.9739 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -78.9739 -299.283] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-78.9739 299.283 Td
-/F130_0 9.9626 Tf
-(\225) 3.48691 Tj
-[1 0 0 1 82.4608 299.283] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.9925 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -86.944 -299.283] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 299.283 Td
-/F134_0 9.9626 Tf
-(bunzip2) 41.8429 Tj
-[1 0 0 1 128.787 299.283] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -128.787 -299.283] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-131.278 299.283 Td
-/F130_0 9.9626 Tf
-([) 3.31755 Tj
--250 TJm
-(-fkvsVL) 33.7533 Tj
--250 TJm
-(]) 3.31755 Tj
--250 TJm
-([) 3.31755 Tj
--250 TJm
-(\002lenames) 38.1866 Tj
--250 TJm
-(...) 7.47195 Tj
--620 TJm
-(]) 3.31755 Tj
-[1 0 0 1 242.589 299.283] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -170.589 -21.9178] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.9739 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -78.9739 -277.365] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-78.9739 277.365 Td
-/F130_0 9.9626 Tf
-(\225) 3.48691 Tj
-[1 0 0 1 82.4608 277.365] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.9925 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -86.944 -277.365] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 277.365 Td
-/F134_0 9.9626 Tf
-(bzcat) 29.8878 Tj
-[1 0 0 1 116.832 277.365] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -116.832 -277.365] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-119.322 277.365 Td
-/F130_0 9.9626 Tf
-([) 3.31755 Tj
--250 TJm
-(-s) 7.193 Tj
--250 TJm
-(]) 3.31755 Tj
--250 TJm
-([) 3.31755 Tj
--250 TJm
-(\002lenames) 38.1866 Tj
--250 TJm
-(...) 7.47195 Tj
--620 TJm
-(]) 3.31755 Tj
-[1 0 0 1 204.074 277.365] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -132.074 -21.9178] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.9739 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -78.9739 -255.447] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-78.9739 255.447 Td
-/F130_0 9.9626 Tf
-(\225) 3.48691 Tj
-[1 0 0 1 82.4608 255.447] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.9925 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -86.944 -255.447] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 255.447 Td
-/F134_0 9.9626 Tf
-(bzip2recover) 71.7307 Tj
-[1 0 0 1 158.675 255.447] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -158.675 -255.447] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-161.166 255.447 Td
-/F130_0 9.9626 Tf
-(\002lename) 34.3112 Tj
-[1 0 0 1 195.476 255.447] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -123.477 -204.596] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 374.394 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.7545] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 43.0633 -6.7545] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -496.332 -50.8519] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-539.395 50.8519 Td
-/F130_0 9.9626 Tf
-(2) 4.9813 Tj
-[1 0 0 1 453.269 50.8519] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 93.5985 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.2765 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-Q
-showpage
-%%PageTrailer
-pdfEndPage
-%%Page: 6 6
-%%BeginPageSetup
-%%PageOrientation: Portrait
-pdfStartPage
-0 0 612 792 re W
-%%EndPageSetup
-[] 0 d
-1 i
-0 j
-0 J
-10 M
-1 w
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-false op
-false OP
-0 0 612 792 re
-W
-q
-[1 0 0 1 72 741.554] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 14.4459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 187.197 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 -8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 105.519 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -371.59 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-477.109 749.245 Td
-/F130_0 9.9626 Tf
-(Ho) 12.1743 Tj
-25 TJm
-(w) 7.193 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(use) 13.2801 Tj
--250 TJm
-(bzip2) 22.1369 Tj
-[1 0 0 1 266.071 747.089] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 280.796 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.974 -5.0363] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -0.4981] cm
-q
-[] 0 d
-0 J
-0.4981 w
-0 0.2491 m
-475.465 0.2491 l
-S
-Q
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 479.251 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -21.5542] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -720] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 704.93 Td
-/F122_0 20.6585 Tf
-(2.3.) 34.4584 Tj
--278 TJm
-(DESCRIPTION) 141.18 Tj
-[1 0 0 1 72 704.672] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -694.709] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 683.012 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 101.888 683.012] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -101.888 -683.012] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-104.56 683.012 Td
-/F130_0 9.9626 Tf
-(compresses) 45.9276 Tj
--268 TJm
-(\002les) 16.6077 Tj
--268 TJm
-(using) 21.589 Tj
--268 TJm
-(the) 12.1743 Tj
--269 TJm
-(Burro) 23.2427 Tj
-25 TJm
-(ws-Wheeler) 48.1293 Tj
--268 TJm
-(block) 22.1369 Tj
--268 TJm
-(sorting) 27.6761 Tj
--268 TJm
-(te) 7.193 Tj
-15 TJm
-(xt) 7.7509 Tj
--268 TJm
-(compression) 50.3609 Tj
--268 TJm
-(algorithm,) 41.2352 Tj
--273 TJm
-(and) 14.386 Tj
--268 TJm
-(Huf) 15.4918 Tj
-25 TJm
-(fman) 20.4731 Tj
--269 TJm
-(c) 4.42339 Tj
-1 TJm
-(od) 9.9626 Tj
--1 TJm
-(i) 2.7696 Tj
-1 TJm
-(ng.) 12.4533 Tj
-72 671.057 Td
-(Compression) 52.5826 Tj
--203 TJm
-(is) 6.64505 Tj
--204 TJm
-(generally) 37.0708 Tj
--203 TJm
-(considerably) 50.9089 Tj
--203 TJm
-(better) 22.6848 Tj
--204 TJm
-(t) 2.7696 Tj
-1 TJm
-(han) 14.386 Tj
--204 TJm
-(that) 14.9439 Tj
--203 TJm
-(achie) 21.0211 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(ed) 9.40469 Tj
--203 TJm
-(by) 9.9626 Tj
--204 TJm
-(more) 20.4731 Tj
--203 TJm
-(con) 14.386 Tj
-40 TJm
-(v) 4.9813 Tj
-15 TJm
-(entional) 32.0995 Tj
--203 TJm
-(LZ77/LZ78-based) 73.0458 Tj
--204 TJm
-(compressors,) 52.2937 Tj
-72 659.101 Td
-(and) 14.386 Tj
--250 TJm
-(approaches) 44.8118 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(performance) 50.341 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(PPM) 19.9352 Tj
--250 TJm
-(f) 3.31755 Tj
-10 TJm
-(amily) 22.6948 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(statistical) 37.6387 Tj
--250 TJm
-(compressors.) 52.2937 Tj
-[1 0 0 1 72 656.945] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -646.982] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 637.184 Td
-/F130_0 9.9626 Tf
-(The) 15.4918 Tj
--250 TJm
-(command-line) 57.5539 Tj
--250 TJm
-(options) 29.3399 Tj
--250 TJm
-(are) 12.1643 Tj
--250 TJm
-(deliberately) 47.0334 Tj
--250 TJm
-(v) 4.9813 Tj
-15 TJm
-(ery) 12.7222 Tj
--250 TJm
-(similar) 27.6761 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(those) 21.031 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(GNU) 21.579 Tj
-[1 0 0 1 364.869 637.184] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -364.869 -637.184] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-364.869 637.184 Td
-/F134_0 9.9626 Tf
-(gzip) 23.9102 Tj
-[1 0 0 1 388.779 637.184] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -388.779 -637.184] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-388.779 637.184 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--250 TJm
-(b) 4.9813 Tj
-20 TJm
-(ut) 7.7509 Tj
--250 TJm
-(the) 12.1743 Tj
-15 TJm
-(y) 4.9813 Tj
--250 TJm
-(are) 12.1643 Tj
--250 TJm
-(not) 12.7322 Tj
--250 TJm
-(identical.) 36.8018 Tj
-[1 0 0 1 72 635.027] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -625.064] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 615.266 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 101.888 615.266] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -101.888 -615.266] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-105.175 615.266 Td
-/F130_0 9.9626 Tf
-(e) 4.42339 Tj
-15 TJm
-(xpects) 25.4544 Tj
--330 TJm
-(a) 4.42339 Tj
--330 TJm
-(list) 12.1843 Tj
--330 TJm
-(of) 8.29885 Tj
--330 TJm
-(\002le) 12.7322 Tj
--329 TJm
-(names) 25.4544 Tj
--330 TJm
-(to) 7.7509 Tj
--330 TJm
-(accompan) 40.3884 Tj
-15 TJm
-(y) 4.9813 Tj
--330 TJm
-(the) 12.1743 Tj
--330 TJm
-(command-line) 57.5539 Tj
--330 TJm
-(\003ags.) 21.31 Tj
--1099 TJm
-(Each) 19.9152 Tj
--330 TJm
-(\002le) 12.7322 Tj
--330 TJm
-(is) 6.64505 Tj
--330 TJm
-(replaced) 33.7433 Tj
--330 TJm
-(by) 9.9626 Tj
--330 TJm
-(a) 4.42339 Tj
--330 TJm
-(compressed) 47.0334 Tj
-72 603.311 Td
-(v) 4.9813 Tj
-15 TJm
-(ersion) 24.3486 Tj
--349 TJm
-(of) 8.29885 Tj
--348 TJm
-(itself,) 22.4159 Tj
--373 TJm
-(with) 17.7135 Tj
--349 TJm
-(the) 12.1743 Tj
--349 TJm
-(name) 21.579 Tj
-[1 0 0 1 204.444 603.311] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -204.444 -603.311] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-204.444 603.311 Td
-/F134_0 9.9626 Tf
-(original_name.bz2) 101.619 Tj
-[1 0 0 1 306.063 603.311] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -306.063 -603.311] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-306.063 603.311 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
--1212 TJm
-(Each) 19.9152 Tj
--348 TJm
-(compressed) 47.0334 Tj
--349 TJm
-(\002le) 12.7322 Tj
--348 TJm
-(has) 13.2801 Tj
--349 TJm
-(the) 12.1743 Tj
--348 TJm
-(same) 20.4731 Tj
--349 TJm
-(modi\002cation) 50.3709 Tj
--349 TJm
-(date,) 19.0883 Tj
-72 591.356 Td
-(permissions,) 50.092 Tj
--344 TJm
-(and,) 16.8766 Tj
--344 TJm
-(when) 21.579 Tj
--325 TJm
-(possible,) 35.1481 Tj
--344 TJm
-(o) 4.9813 Tj
-25 TJm
-(wnership) 36.5229 Tj
--325 TJm
-(as) 8.29885 Tj
--325 TJm
-(the) 12.1743 Tj
--326 TJm
-(corresponding) 56.996 Tj
--325 TJm
-(original,) 33.4843 Tj
--344 TJm
-(so) 8.85675 Tj
--325 TJm
-(that) 14.9439 Tj
--325 TJm
-(these) 20.4731 Tj
--325 TJm
-(properties) 39.8404 Tj
--325 TJm
-(can) 13.8281 Tj
--326 TJm
-(be) 9.40469 Tj
--325 TJm
-(correctly) 35.4071 Tj
-72 579.4 Td
-(restored) 32.0895 Tj
--308 TJm
-(at) 7.193 Tj
--308 TJm
-(decompression) 59.7656 Tj
--307 TJm
-(time.) 20.2042 Tj
--484 TJm
-(File) 15.5018 Tj
--308 TJm
-(name) 21.579 Tj
--308 TJm
-(handling) 34.8691 Tj
--308 TJm
-(is) 6.64505 Tj
--307 TJm
-(nai) 12.1743 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--308 TJm
-(in) 7.7509 Tj
--308 TJm
-(the) 12.1743 Tj
--308 TJm
-(sense) 21.579 Tj
--308 TJm
-(that) 14.9439 Tj
--308 TJm
-(there) 19.9152 Tj
--307 TJm
-(is) 6.64505 Tj
--308 TJm
-(no) 9.9626 Tj
--308 TJm
-(mechanism) 45.3796 Tj
--308 TJm
-(for) 11.6164 Tj
--308 TJm
-(preserving) 42.0521 Tj
-72 567.445 Td
-(original) 30.9936 Tj
--334 TJm
-(\002le) 12.7322 Tj
--333 TJm
-(names,) 27.9451 Tj
--355 TJm
-(permissions,) 50.092 Tj
--355 TJm
-(o) 4.9813 Tj
-25 TJm
-(wnerships) 40.3983 Tj
--333 TJm
-(or) 8.29885 Tj
--334 TJm
-(dates) 20.4731 Tj
--334 TJm
-(in) 7.7509 Tj
--333 TJm
-(\002lesystems) 44.2838 Tj
--334 TJm
-(which) 24.3486 Tj
--334 TJm
-(lack) 16.5977 Tj
--333 TJm
-(these) 20.4731 Tj
--334 TJm
-(concepts,) 37.3498 Tj
--355 TJm
-(or) 8.29885 Tj
--333 TJm
-(ha) 9.40469 Tj
-20 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--334 TJm
-(serious) 28.224 Tj
--334 TJm
-(\002le) 12.7322 Tj
-72 555.49 Td
-(name) 21.579 Tj
--250 TJm
-(length) 24.9065 Tj
--250 TJm
-(restrictions,) 46.7644 Tj
--250 TJm
-(such) 18.2614 Tj
--250 TJm
-(as) 8.29885 Tj
--250 TJm
-(MS-DOS.) 40.1294 Tj
-[1 0 0 1 72 553.333] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -543.371] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 533.572 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 101.888 533.572] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -101.888 -533.572] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-104.379 533.572 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 121.255 533.572] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -121.255 -533.572] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-121.255 533.572 Td
-/F134_0 9.9626 Tf
-(bunzip2) 41.8429 Tj
-[1 0 0 1 163.098 533.572] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -163.098 -533.572] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-165.589 533.572 Td
-/F130_0 9.9626 Tf
-(will) 15.5018 Tj
--250 TJm
-(by) 9.9626 Tj
--250 TJm
-(def) 12.7222 Tj
-10 TJm
-(ault) 14.9439 Tj
--250 TJm
-(not) 12.7322 Tj
--250 TJm
-(o) 4.9813 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(erwrite) 28.2141 Tj
--250 TJm
-(e) 4.42339 Tj
-15 TJm
-(xisting) 27.1282 Tj
--250 TJm
-(\002les.) 19.0983 Tj
--620 TJm
-(If) 6.63509 Tj
--250 TJm
-(you) 14.9439 Tj
--250 TJm
-(w) 7.193 Tj
-10 TJm
-(ant) 12.1743 Tj
--250 TJm
-(this) 14.396 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(happen,) 31.2626 Tj
--250 TJm
-(specify) 28.772 Tj
--250 TJm
-(the) 12.1743 Tj
-[1 0 0 1 495.977 533.572] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -495.977 -533.572] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-495.977 533.572 Td
-/F134_0 9.9626 Tf
-(-f) 11.9551 Tj
-[1 0 0 1 507.932 533.572] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -507.932 -533.572] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-510.423 533.572 Td
-/F130_0 9.9626 Tf
-(\003ag.) 17.4346 Tj
-[1 0 0 1 72 531.415] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -521.453] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 511.654 Td
-/F130_0 9.9626 Tf
-(If) 6.63509 Tj
--284 TJm
-(no) 9.9626 Tj
--285 TJm
-(\002le) 12.7322 Tj
--284 TJm
-(names) 25.4544 Tj
--284 TJm
-(are) 12.1643 Tj
--284 TJm
-(speci\002ed,) 37.9077 Tj
-[1 0 0 1 193.935 511.654] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -193.935 -511.654] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-193.935 511.654 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 223.823 511.654] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -223.823 -511.654] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-226.655 511.654 Td
-/F130_0 9.9626 Tf
-(compresses) 45.9276 Tj
--284 TJm
-(from) 19.3673 Tj
--285 TJm
-(standard) 33.7533 Tj
--284 TJm
-(input) 20.4831 Tj
--284 TJm
-(to) 7.7509 Tj
--284 TJm
-(standard) 33.7533 Tj
--285 TJm
-(output.) 27.9551 Tj
--825 TJm
-(In) 8.29885 Tj
--285 TJm
-(this) 14.396 Tj
--284 TJm
-(case,) 19.6363 Tj
-[1 0 0 1 491.778 511.654] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -491.778 -511.654] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-491.778 511.654 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 521.666 511.654] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -521.666 -511.654] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-524.499 511.654 Td
-/F130_0 9.9626 Tf
-(will) 15.5018 Tj
-72 499.699 Td
-(decline) 28.772 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(write) 20.4731 Tj
--250 TJm
-(compressed) 47.0334 Tj
--250 TJm
-(output) 25.4644 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(terminal,) 35.696 Tj
--250 TJm
-(as) 8.29885 Tj
--250 TJm
-(this) 14.396 Tj
--250 TJm
-(w) 7.193 Tj
-10 TJm
-(ould) 17.7135 Tj
--250 TJm
-(be) 9.40469 Tj
--250 TJm
-(entirely) 30.4357 Tj
--250 TJm
-(incomprehensible) 70.8341 Tj
--250 TJm
-(and) 14.386 Tj
--250 TJm
-(therefore) 35.955 Tj
--250 TJm
-(pointless.) 37.9177 Tj
-[1 0 0 1 72 497.542] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -487.58] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 477.781 Td
-/F134_0 9.9626 Tf
-(bunzip2) 41.8429 Tj
-[1 0 0 1 113.843 477.781] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -113.843 -477.781] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-116.176 477.781 Td
-/F130_0 9.9626 Tf
-(\(or) 11.6164 Tj
-[1 0 0 1 130.125 477.781] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -130.125 -477.781] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-130.125 477.781 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
--600 TJm
-(-d) 11.9551 Tj
-[1 0 0 1 177.946 477.781] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -177.946 -477.781] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-177.946 477.781 Td
-/F130_0 9.9626 Tf
-(\)) 3.31755 Tj
--234 TJm
-(decompresses) 55.3323 Tj
--234 TJm
-(all) 9.9626 Tj
--234 TJm
-(speci\002ed) 35.417 Tj
--235 TJm
-(\002les.) 19.0983 Tj
--609 TJm
-(Files) 19.3773 Tj
--234 TJm
-(which) 24.3486 Tj
--234 TJm
-(were) 19.3573 Tj
--234 TJm
-(not) 12.7322 Tj
--235 TJm
-(created) 28.762 Tj
--234 TJm
-(by) 9.9626 Tj
-[1 0 0 1 445.012 477.781] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -445.012 -477.781] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-445.012 477.781 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 474.9 477.781] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -474.9 -477.781] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-477.233 477.781 Td
-/F130_0 9.9626 Tf
-(will) 15.5018 Tj
--234 TJm
-(be) 9.40469 Tj
--234 TJm
-(detected) 33.1954 Tj
-72 465.826 Td
-(and) 14.386 Tj
--280 TJm
-(i) 2.7696 Tj
-1 TJm
-(gnored,) 30.1568 Tj
--287 TJm
-(and) 14.386 Tj
--280 TJm
-(a) 4.42339 Tj
--279 TJm
-(w) 7.193 Tj
-10 TJm
-(arning) 25.4544 Tj
--280 TJm
-(issued.) 27.3972 Tj
-[1 0 0 1 216.033 465.826] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -216.033 -465.826] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-216.033 465.826 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 245.921 465.826] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -245.921 -465.826] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-248.705 465.826 Td
-/F130_0 9.9626 Tf
-(attempts) 33.7633 Tj
--279 TJm
-(to) 7.7509 Tj
--280 TJm
-(guess) 22.1369 Tj
--279 TJm
-(the) 12.1743 Tj
--280 TJm
-(\002lename) 34.3112 Tj
--279 TJm
-(for) 11.6164 Tj
--280 TJm
-(the) 12.1743 Tj
--279 TJm
-(decompressed) 56.4381 Tj
--280 TJm
-(\002le) 12.7322 Tj
--279 TJm
-(from) 19.3673 Tj
--280 TJm
-(that) 14.9439 Tj
--279 TJm
-(of) 8.29885 Tj
--280 TJm
-(the) 12.1743 Tj
-72 453.871 Td
-(compressed) 47.0334 Tj
--250 TJm
-(\002le) 12.7322 Tj
--250 TJm
-(as) 8.29885 Tj
--250 TJm
-(follo) 18.8194 Tj
-25 TJm
-(ws:) 13.8381 Tj
-[1 0 0 1 72 451.714] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -29.7236] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.9739 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -78.9739 -421.991] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-78.9739 421.991 Td
-/F130_0 9.9626 Tf
-(\225) 3.48691 Tj
-[1 0 0 1 82.4608 421.991] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.9925 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -86.944 -421.991] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 421.991 Td
-/F134_0 9.9626 Tf
-(filename.bz2) 71.7307 Tj
-[1 0 0 1 164.653 421.991] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -164.653 -421.991] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-167.143 421.991 Td
-/F130_0 9.9626 Tf
-(becomes) 34.8591 Tj
-[1 0 0 1 204.493 421.991] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -204.493 -421.991] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-204.493 421.991 Td
-/F134_0 9.9626 Tf
-(filename) 47.8205 Tj
-[1 0 0 1 252.313 421.991] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -180.313 -21.9178] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.9739 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -78.9739 -400.073] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-78.9739 400.073 Td
-/F130_0 9.9626 Tf
-(\225) 3.48691 Tj
-[1 0 0 1 82.4608 400.073] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.9925 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -86.944 -400.073] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 400.073 Td
-/F134_0 9.9626 Tf
-(filename.bz) 65.7532 Tj
-[1 0 0 1 158.675 400.073] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -158.675 -400.073] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-161.166 400.073 Td
-/F130_0 9.9626 Tf
-(becomes) 34.8591 Tj
-[1 0 0 1 198.515 400.073] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -198.515 -400.073] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-198.515 400.073 Td
-/F134_0 9.9626 Tf
-(filename) 47.8205 Tj
-[1 0 0 1 246.336 400.073] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -174.336 -21.9178] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.9739 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -78.9739 -378.155] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-78.9739 378.155 Td
-/F130_0 9.9626 Tf
-(\225) 3.48691 Tj
-[1 0 0 1 82.4608 378.155] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.9925 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -86.944 -378.155] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 378.155 Td
-/F134_0 9.9626 Tf
-(filename.tbz2) 77.7083 Tj
-[1 0 0 1 164.653 378.155] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -164.653 -378.155] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-167.143 378.155 Td
-/F130_0 9.9626 Tf
-(becomes) 34.8591 Tj
-[1 0 0 1 204.493 378.155] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -204.493 -378.155] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-204.493 378.155 Td
-/F134_0 9.9626 Tf
-(filename.tar) 71.7307 Tj
-[1 0 0 1 276.224 378.155] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -204.224 -21.9178] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.9739 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -78.9739 -356.237] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-78.9739 356.237 Td
-/F130_0 9.9626 Tf
-(\225) 3.48691 Tj
-[1 0 0 1 82.4608 356.237] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.9925 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -86.944 -356.237] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 356.237 Td
-/F134_0 9.9626 Tf
-(filename.tbz) 71.7307 Tj
-[1 0 0 1 164.653 356.237] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -164.653 -356.237] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-167.143 356.237 Td
-/F130_0 9.9626 Tf
-(becomes) 34.8591 Tj
-[1 0 0 1 204.493 356.237] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -204.493 -356.237] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-204.493 356.237 Td
-/F134_0 9.9626 Tf
-(filename.tar) 71.7307 Tj
-[1 0 0 1 276.224 356.237] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -204.224 -21.9178] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.9739 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -78.9739 -334.319] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-78.9739 334.319 Td
-/F130_0 9.9626 Tf
-(\225) 3.48691 Tj
-[1 0 0 1 82.4608 334.319] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.9925 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -86.944 -334.319] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 334.319 Td
-/F134_0 9.9626 Tf
-(anyothername) 71.7307 Tj
-[1 0 0 1 164.653 334.319] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -164.653 -334.319] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-167.143 334.319 Td
-/F130_0 9.9626 Tf
-(becomes) 34.8591 Tj
-[1 0 0 1 204.493 334.319] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -204.493 -334.319] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-204.493 334.319 Td
-/F134_0 9.9626 Tf
-(anyothername.out) 95.641 Tj
-[1 0 0 1 300.134 334.319] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -228.134 -11.4968] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -322.823] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 312.402 Td
-/F130_0 9.9626 Tf
-(If) 6.63509 Tj
--342 TJm
-(the) 12.1743 Tj
--342 TJm
-(\002le) 12.7322 Tj
--342 TJm
-(does) 18.2614 Tj
--342 TJm
-(not) 12.7322 Tj
--343 TJm
-(end) 14.386 Tj
--342 TJm
-(in) 7.7509 Tj
--342 TJm
-(one) 14.386 Tj
--342 TJm
-(of) 8.29885 Tj
--342 TJm
-(the) 12.1743 Tj
--342 TJm
-(recognised) 43.158 Tj
--342 TJm
-(endings,) 33.4843 Tj
-[1 0 0 1 309.305 312.402] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -309.305 -312.402] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-309.305 312.402 Td
-/F134_0 9.9626 Tf
-(.bz2) 23.9102 Tj
-[1 0 0 1 333.215 312.402] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -333.215 -312.402] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-333.215 312.402 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 339.344 312.402] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -339.344 -312.402] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-339.344 312.402 Td
-/F134_0 9.9626 Tf
-(.bz) 17.9327 Tj
-[1 0 0 1 357.276 312.402] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -357.276 -312.402] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-357.276 312.402 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 363.405 312.402] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -363.405 -312.402] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-363.405 312.402 Td
-/F134_0 9.9626 Tf
-(.tbz2) 29.8878 Tj
-[1 0 0 1 393.293 312.402] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -393.293 -312.402] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-396.701 312.402 Td
-/F130_0 9.9626 Tf
-(or) 8.29885 Tj
-[1 0 0 1 408.409 312.402] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -408.409 -312.402] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-408.409 312.402 Td
-/F134_0 9.9626 Tf
-(.tbz) 23.9102 Tj
-[1 0 0 1 432.319 312.402] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -432.319 -312.402] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-432.319 312.402 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 438.448 312.402] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -438.448 -312.402] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-438.448 312.402 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 468.336 312.402] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468.336 -312.402] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-471.744 312.402 Td
-/F130_0 9.9626 Tf
-(complains) 40.9562 Tj
--342 TJm
-(that) 14.9439 Tj
--342 TJm
-(it) 5.53921 Tj
-72 300.446 Td
-(cannot) 26.5603 Tj
--250 TJm
-(guess) 22.1369 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(name) 21.579 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(original) 30.9936 Tj
--250 TJm
-(\002le,) 15.2229 Tj
--250 TJm
-(and) 14.386 Tj
--250 TJm
-(uses) 17.1556 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(original) 30.9936 Tj
--250 TJm
-(name) 21.579 Tj
--250 TJm
-(with) 17.7135 Tj
-[1 0 0 1 370.009 300.446] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -370.009 -300.446] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-370.009 300.446 Td
-/F134_0 9.9626 Tf
-(.out) 23.9102 Tj
-[1 0 0 1 393.92 300.446] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -393.92 -300.446] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-396.41 300.446 Td
-/F130_0 9.9626 Tf
-(appended.) 40.6673 Tj
-[1 0 0 1 72 298.29] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -288.327] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 278.529 Td
-/F130_0 9.9626 Tf
-(As) 11.0684 Tj
--250 TJm
-(with) 17.7135 Tj
--250 TJm
-(compression,) 52.8516 Tj
--250 TJm
-(supplying) 39.3025 Tj
--250 TJm
-(no) 9.9626 Tj
--250 TJm
-(\002lenames) 38.1866 Tj
--250 TJm
-(causes) 26.0024 Tj
--250 TJm
-(decompression) 59.7656 Tj
--250 TJm
-(from) 19.3673 Tj
--250 TJm
-(standard) 33.7533 Tj
--250 TJm
-(input) 20.4831 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(standard) 33.7533 Tj
--250 TJm
-(output.) 27.9551 Tj
-[1 0 0 1 72 276.372] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -266.409] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 256.611 Td
-/F134_0 9.9626 Tf
-(bunzip2) 41.8429 Tj
-[1 0 0 1 113.843 256.611] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -113.843 -256.611] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-116.409 256.611 Td
-/F130_0 9.9626 Tf
-(will) 15.5018 Tj
--257 TJm
-(correctly) 35.4071 Tj
--258 TJm
-(decompress) 47.0334 Tj
--257 TJm
-(a) 4.42339 Tj
--258 TJm
-(\002le) 12.7322 Tj
--257 TJm
-(which) 24.3486 Tj
--258 TJm
-(is) 6.64505 Tj
--258 TJm
-(the) 12.1743 Tj
--257 TJm
-(concatenation) 55.3323 Tj
--258 TJm
-(of) 8.29885 Tj
--257 TJm
-(tw) 9.9626 Tj
-10 TJm
-(o) 4.9813 Tj
--258 TJm
-(or) 8.29885 Tj
--257 TJm
-(more) 20.4731 Tj
--258 TJm
-(compressed) 47.0334 Tj
--257 TJm
-(\002les.) 19.0983 Tj
--665 TJm
-(The) 15.4918 Tj
--258 TJm
-(result) 22.1369 Tj
--257 TJm
-(is) 6.64505 Tj
-72 244.656 Td
-(the) 12.1743 Tj
--239 TJm
-(concatenation) 55.3323 Tj
--238 TJm
-(of) 8.29885 Tj
--239 TJm
-(the) 12.1743 Tj
--239 TJm
-(corresponding) 56.996 Tj
--239 TJm
-(uncompressed) 56.996 Tj
--238 TJm
-(\002les.) 19.0983 Tj
--613 TJm
-(Inte) 15.4918 Tj
-15 TJm
-(grity) 18.8194 Tj
--238 TJm
-(testing) 26.5703 Tj
--239 TJm
-(\() 3.31755 Tj
-[1 0 0 1 382.247 244.656] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -382.247 -244.656] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-382.247 244.656 Td
-/F134_0 9.9626 Tf
-(-t) 11.9551 Tj
-[1 0 0 1 394.202 244.656] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -394.202 -244.656] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-394.202 244.656 Td
-/F130_0 9.9626 Tf
-(\)) 3.31755 Tj
--239 TJm
-(of) 8.29885 Tj
--238 TJm
-(concatenated) 52.0048 Tj
--239 TJm
-(compressed) 47.0334 Tj
--239 TJm
-(\002les) 16.6077 Tj
--239 TJm
-(is) 6.64505 Tj
-72 232.7 Td
-(also) 16.0497 Tj
--250 TJm
-(supported.) 41.7831 Tj
-[1 0 0 1 72 230.544] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -220.581] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 210.783 Td
-/F130_0 9.9626 Tf
-(Y) 7.193 Tj
-110 TJm
-(ou) 9.9626 Tj
--399 TJm
-(can) 13.8281 Tj
--399 TJm
-(also) 16.0497 Tj
--399 TJm
-(compress) 37.6287 Tj
--400 TJm
-(or) 8.29885 Tj
--399 TJm
-(decompress) 47.0334 Tj
--399 TJm
-(\002les) 16.6077 Tj
--399 TJm
-(to) 7.7509 Tj
--399 TJm
-(the) 12.1743 Tj
--399 TJm
-(standard) 33.7533 Tj
--399 TJm
-(output) 25.4644 Tj
--399 TJm
-(by) 9.9626 Tj
--400 TJm
-(gi) 7.7509 Tj
-25 TJm
-(ving) 17.7135 Tj
--399 TJm
-(the) 12.1743 Tj
-[1 0 0 1 409.67 210.783] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -409.67 -210.783] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-409.67 210.783 Td
-/F134_0 9.9626 Tf
-(-c) 11.9551 Tj
-[1 0 0 1 421.625 210.783] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -421.625 -210.783] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-425.602 210.783 Td
-/F130_0 9.9626 Tf
-(\003ag.) 17.4346 Tj
--757 TJm
-(Multiple) 34.3212 Tj
--400 TJm
-(\002l) 8.30881 Tj
-1 TJm
-(es) 8.29885 Tj
--400 TJm
-(may) 17.1556 Tj
--399 TJm
-(be) 9.40469 Tj
-72 198.828 Td
-(compressed) 47.0334 Tj
--367 TJm
-(and) 14.386 Tj
--367 TJm
-(decompressed) 56.4381 Tj
--367 TJm
-(lik) 10.5205 Tj
-10 TJm
-(e) 4.42339 Tj
--367 TJm
-(this.) 16.8866 Tj
--1321 TJm
-(The) 15.4918 Tj
--367 TJm
-(resulting) 34.8691 Tj
--367 TJm
-(outputs) 29.3399 Tj
--367 TJm
-(are) 12.1643 Tj
--367 TJm
-(fed) 12.7222 Tj
--367 TJm
-(sequentially) 48.1492 Tj
--366 TJm
-(to) 7.7509 Tj
--367 TJm
-(stdout.) 26.8492 Tj
--1322 TJm
-(Compression) 52.5826 Tj
--367 TJm
-(of) 8.29885 Tj
-72 186.872 Td
-(multiple) 33.2153 Tj
--289 TJm
-(\002les) 16.6077 Tj
--289 TJm
-(in) 7.7509 Tj
--289 TJm
-(this) 14.396 Tj
--289 TJm
-(manner) 29.8778 Tj
--288 TJm
-(generates) 37.6188 Tj
--289 TJm
-(a) 4.42339 Tj
--289 TJm
-(stream) 26.5603 Tj
--289 TJm
-(containing) 42.0621 Tj
--289 TJm
-(multiple) 33.2153 Tj
--289 TJm
-(compressed) 47.0334 Tj
--289 TJm
-(\002le) 12.7322 Tj
--289 TJm
-(representations.) 62.8042 Tj
--853 TJm
-(Such) 19.9252 Tj
--289 TJm
-(a) 4.42339 Tj
--289 TJm
-(stream) 26.5603 Tj
-72 174.917 Td
-(can) 13.8281 Tj
--391 TJm
-(be) 9.40469 Tj
--391 TJm
-(decompressed) 56.4381 Tj
--390 TJm
-(correctly) 35.4071 Tj
--391 TJm
-(only) 17.7135 Tj
--391 TJm
-(by) 9.9626 Tj
-[1 0 0 1 238.116 174.917] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -238.116 -174.917] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-238.116 174.917 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 268.004 174.917] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -268.004 -174.917] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-271.897 174.917 Td
-/F130_0 9.9626 Tf
-(v) 4.9813 Tj
-15 TJm
-(ersion) 24.3486 Tj
--391 TJm
-(0.9.0) 19.9252 Tj
--391 TJm
-(or) 8.29885 Tj
--391 TJm
-(l) 2.7696 Tj
-1 TJm
-(ater) 14.9339 Tj
-55 TJm
-(.) 2.49065 Tj
--733 TJm
-(Earlier) 27.1082 Tj
--391 TJm
-(v) 4.9813 Tj
-15 TJm
-(ersions) 28.224 Tj
--391 TJm
-(of) 8.29885 Tj
-[1 0 0 1 448.071 174.917] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -448.071 -174.917] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-448.071 174.917 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 477.958 174.917] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -477.958 -174.917] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-481.852 174.917 Td
-/F130_0 9.9626 Tf
-(will) 15.5018 Tj
--391 TJm
-(stop) 16.6077 Tj
--391 TJm
-(after) 18.2515 Tj
-72 162.962 Td
-(decompressing) 59.7656 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(\002rst) 15.5018 Tj
--250 TJm
-(\002le) 12.7322 Tj
--250 TJm
-(in) 7.7509 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(stream.) 29.0509 Tj
-[1 0 0 1 72 160.805] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -150.843] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 141.044 Td
-/F134_0 9.9626 Tf
-(bzcat) 29.8878 Tj
-[1 0 0 1 101.888 141.044] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -101.888 -141.044] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-104.379 141.044 Td
-/F130_0 9.9626 Tf
-(\(or) 11.6164 Tj
-[1 0 0 1 118.486 141.044] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -118.486 -141.044] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-118.486 141.044 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
--600 TJm
-(-dc) 17.9327 Tj
-[1 0 0 1 172.284 141.044] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -172.284 -141.044] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-172.284 141.044 Td
-/F130_0 9.9626 Tf
-(\)) 3.31755 Tj
--250 TJm
-(decompresses) 55.3323 Tj
--250 TJm
-(all) 9.9626 Tj
--250 TJm
-(speci\002ed) 35.417 Tj
--250 TJm
-(\002les) 16.6077 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(standard) 33.7533 Tj
--250 TJm
-(output.) 27.9551 Tj
-[1 0 0 1 72 138.887] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -128.925] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 119.126 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 101.888 119.126] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -101.888 -119.126] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-104.866 119.126 Td
-/F130_0 9.9626 Tf
-(will) 15.5018 Tj
--299 TJm
-(read) 17.1456 Tj
--299 TJm
-(ar) 7.74094 Tj
-18 TJm
-(guments) 33.7633 Tj
--299 TJm
-(from) 19.3673 Tj
--299 TJm
-(the) 12.1743 Tj
--299 TJm
-(en) 9.40469 Tj
-40 TJm
-(vironment) 40.9562 Tj
--298 TJm
-(v) 4.9813 Tj
-25 TJm
-(ariables) 30.9837 Tj
-[1 0 0 1 316.903 119.126] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -316.903 -119.126] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-316.903 119.126 Td
-/F134_0 9.9626 Tf
-(BZIP2) 29.8878 Tj
-[1 0 0 1 346.791 119.126] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -346.791 -119.126] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-349.769 119.126 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 367.133 119.126] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -367.133 -119.126] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-367.133 119.126 Td
-/F134_0 9.9626 Tf
-(BZIP) 23.9102 Tj
-[1 0 0 1 391.043 119.126] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -391.043 -119.126] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-391.043 119.126 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--299 TJm
-(in) 7.7509 Tj
--299 TJm
-(that) 14.9439 Tj
--299 TJm
-(order) 21.0211 Tj
-40 TJm
-(,) 2.49065 Tj
--311 TJm
-(and) 14.386 Tj
--299 TJm
-(will) 15.5018 Tj
--299 TJm
-(process) 29.8778 Tj
--299 TJm
-(them) 19.9252 Tj
-72 107.171 Td
-(before) 25.4445 Tj
--250 TJm
-(an) 9.40469 Tj
-15 TJm
-(y) 4.9813 Tj
--250 TJm
-(ar) 7.74094 Tj
-18 TJm
-(guments) 33.7633 Tj
--250 TJm
-(read) 17.1456 Tj
--250 TJm
-(from) 19.3673 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(command) 39.2925 Tj
--250 TJm
-(line.) 17.4346 Tj
--310 TJm
-(This) 17.7135 Tj
--250 TJm
-(gi) 7.7509 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(es) 8.29885 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(con) 14.386 Tj
-40 TJm
-(v) 4.9813 Tj
-15 TJm
-(enient) 24.3486 Tj
--250 TJm
-(w) 7.193 Tj
-10 TJm
-(ay) 9.40469 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(supply) 26.5703 Tj
--250 TJm
-(def) 12.7222 Tj
-10 TJm
-(ault) 14.9439 Tj
--250 TJm
-(ar) 7.74094 Tj
-18 TJm
-(guments.) 36.2539 Tj
-[1 0 0 1 72 105.014] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -95.0517] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 85.2534 Td
-/F130_0 9.9626 Tf
-(Compression) 52.5826 Tj
--294 TJm
-(is) 6.64505 Tj
--294 TJm
-(al) 7.193 Tj
-10 TJm
-(w) 7.193 Tj
-10 TJm
-(ays) 13.2801 Tj
--294 TJm
-(performed,) 43.9849 Tj
--305 TJm
-(e) 4.42339 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(en) 9.40469 Tj
--294 TJm
-(if) 6.08715 Tj
--294 TJm
-(the) 12.1743 Tj
--294 TJm
-(compressed) 47.0334 Tj
--294 TJm
-(\002le) 12.7322 Tj
--293 TJm
-(is) 6.64505 Tj
--294 TJm
-(slightly) 29.8978 Tj
--294 TJm
-(lar) 10.5105 Tj
-18 TJm
-(ger) 12.7222 Tj
--294 TJm
-(than) 17.1556 Tj
--294 TJm
-(the) 12.1743 Tj
--294 TJm
-(original.) 33.4843 Tj
--884 TJm
-(Files) 19.3773 Tj
--294 TJm
-(of) 8.29885 Tj
--294 TJm
-(less) 14.9439 Tj
--294 TJm
-(than) 17.1556 Tj
-72 73.2982 Td
-(about) 22.1369 Tj
--246 TJm
-(one) 14.386 Tj
--246 TJm
-(hundred) 32.6474 Tj
--245 TJm
-(bytes) 21.031 Tj
--246 TJm
-(tend) 17.1556 Tj
--246 TJm
-(to) 7.7509 Tj
--246 TJm
-(get) 12.1743 Tj
--246 TJm
-(l) 2.7696 Tj
-1 TJm
-(ar) 7.74094 Tj
-18 TJm
-(ger) 12.7222 Tj
-40 TJm
-(,) 2.49065 Tj
--247 TJm
-(since) 20.4731 Tj
--246 TJm
-(the) 12.1743 Tj
--246 TJm
-(compression) 50.3609 Tj
--245 TJm
-(mechanism) 45.3796 Tj
--246 TJm
-(has) 13.2801 Tj
--246 TJm
-(a) 4.42339 Tj
--246 TJm
-(constant) 33.2053 Tj
--246 TJm
-(o) 4.9813 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(erhead) 26.5503 Tj
--245 TJm
-(in) 7.7509 Tj
--246 TJm
-(the) 12.1743 Tj
--246 TJm
-(re) 7.74094 Tj
-15 TJm
-(gion) 17.7135 Tj
--246 TJm
-(of) 8.29885 Tj
-[1 0 0 1 72 50.8518] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 374.394 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.8541] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 43.0633 -6.7545] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -496.332 -50.9514] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-539.395 50.9514 Td
-/F130_0 9.9626 Tf
-(3) 4.9813 Tj
-[1 0 0 1 453.269 50.8518] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 93.5985 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.2765 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-Q
-showpage
-%%PageTrailer
-pdfEndPage
-%%Page: 7 7
-%%BeginPageSetup
-%%PageOrientation: Portrait
-pdfStartPage
-0 0 612 792 re W
-%%EndPageSetup
-[] 0 d
-1 i
-0 j
-0 J
-10 M
-1 w
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-false op
-false OP
-0 0 612 792 re
-W
-q
-[1 0 0 1 72 741.554] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 14.4459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 187.197 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 -8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 105.519 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -371.59 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-477.109 749.245 Td
-/F130_0 9.9626 Tf
-(Ho) 12.1743 Tj
-25 TJm
-(w) 7.193 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(use) 13.2801 Tj
--250 TJm
-(bzip2) 22.1369 Tj
-[1 0 0 1 266.071 747.089] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 280.796 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.974 -5.0363] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -0.4981] cm
-q
-[] 0 d
-0 J
-0.4981 w
-0 0.2491 m
-475.465 0.2491 l
-S
-Q
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 479.251 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -540 -741.554] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 710.037 Td
-/F130_0 9.9626 Tf
-(50) 9.9626 Tj
--264 TJm
-(bytes.) 23.5217 Tj
--351 TJm
-(Random) 33.7633 Tj
--264 TJm
-(dat) 12.1743 Tj
-1 TJm
-(a) 4.42339 Tj
--264 TJm
-(\(including) 40.9562 Tj
--264 TJm
-(the) 12.1743 Tj
--264 TJm
-(output) 25.4644 Tj
--263 TJm
-(of) 8.29885 Tj
--264 TJm
-(most) 19.3773 Tj
--264 TJm
-(\002le) 12.7322 Tj
--263 TJm
-(compressors\)) 53.1206 Tj
--264 TJm
-(is) 6.64505 Tj
--264 TJm
-(coded) 23.7907 Tj
--263 TJm
-(at) 7.193 Tj
--264 TJm
-(about) 22.1369 Tj
--264 TJm
-(8.05) 17.4346 Tj
--263 TJm
-(bits) 14.396 Tj
--264 TJm
-(per) 12.7222 Tj
--264 TJm
-(byte,) 19.6462 Tj
--267 TJm
-(gi) 7.7509 Tj
-25 TJm
-(ving) 17.7135 Tj
--264 TJm
-(an) 9.40469 Tj
-72 698.082 Td
-(e) 4.42339 Tj
-15 TJm
-(xpansion) 35.9749 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(around) 27.6661 Tj
--250 TJm
-(0.5%.) 23.2427 Tj
-[1 0 0 1 72 695.925] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.8441] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -686.081] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 676.283 Td
-/F130_0 9.9626 Tf
-(As) 11.0684 Tj
--268 TJm
-(a) 4.42339 Tj
--268 TJm
-(self-check) 40.9363 Tj
--269 TJm
-(for) 11.6164 Tj
--268 TJm
-(your) 18.2614 Tj
--268 TJm
-(protection,) 42.889 Tj
-[1 0 0 1 217.273 676.283] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -217.273 -676.283] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-217.273 676.283 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 247.161 676.283] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -247.161 -676.283] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-249.833 676.283 Td
-/F130_0 9.9626 Tf
-(uses) 17.1556 Tj
--268 TJm
-(32-bit) 23.8007 Tj
--268 TJm
-(CRCs) 23.8106 Tj
--269 TJm
-(to) 7.7509 Tj
--268 TJm
-(mak) 17.1556 Tj
-10 TJm
-(e) 4.42339 Tj
--268 TJm
-(sure) 16.5977 Tj
--268 TJm
-(that) 14.9439 Tj
--268 TJm
-(the) 12.1743 Tj
--269 TJm
-(decompressed) 56.4381 Tj
--268 TJm
-(v) 4.9813 Tj
-15 TJm
-(ersion) 24.3486 Tj
--268 TJm
-(of) 8.29885 Tj
--268 TJm
-(a) 4.42339 Tj
--268 TJm
-(\002le) 12.7322 Tj
--269 TJm
-(is) 6.64505 Tj
-72 664.328 Td
-(identical) 34.3112 Tj
--200 TJm
-(to) 7.7509 Tj
--199 TJm
-(the) 12.1743 Tj
--200 TJm
-(original.) 33.4843 Tj
--586 TJm
-(This) 17.7135 Tj
--200 TJm
-(guards) 26.5603 Tj
--199 TJm
-(ag) 9.40469 Tj
-5 TJm
-(ainst) 18.8194 Tj
--200 TJm
-(corruption) 41.5042 Tj
--199 TJm
-(of) 8.29885 Tj
--200 TJm
-(the) 12.1743 Tj
--200 TJm
-(compressed) 47.0334 Tj
--199 TJm
-(data,) 19.0883 Tj
--210 TJm
-(and) 14.386 Tj
--199 TJm
-(ag) 9.40469 Tj
-5 TJm
-(ainst) 18.8194 Tj
--200 TJm
-(undetected) 43.158 Tj
--200 TJm
-(b) 4.9813 Tj
-20 TJm
-(ugs) 13.8381 Tj
--199 TJm
-(in) 7.7509 Tj
-[1 0 0 1 510.112 664.328] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -510.112 -664.328] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-510.112 664.328 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 540 664.328] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -540 -664.328] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 652.373 Td
-/F130_0 9.9626 Tf
-(\(hopefully) 41.5042 Tj
--275 TJm
-(v) 4.9813 Tj
-15 TJm
-(ery) 12.7222 Tj
--274 TJm
-(unlik) 20.4831 Tj
-10 TJm
-(ely\).) 17.9825 Tj
--384 TJm
-(The) 15.4918 Tj
--275 TJm
-(chances) 31.5316 Tj
--275 TJm
-(of) 8.29885 Tj
--275 TJm
-(data) 16.5977 Tj
--274 TJm
-(corruption) 41.5042 Tj
--275 TJm
-(going) 22.6948 Tj
--275 TJm
-(undetected) 43.158 Tj
--274 TJm
-(is) 6.64505 Tj
--275 TJm
-(microscopic,) 51.1878 Tj
--281 TJm
-(about) 22.1369 Tj
--275 TJm
-(one) 14.386 Tj
--274 TJm
-(chance) 27.6562 Tj
--275 TJm
-(in) 7.7509 Tj
--275 TJm
-(four) 16.5977 Tj
-72 640.417 Td
-(billion) 26.0223 Tj
--279 TJm
-(for) 11.6164 Tj
--279 TJm
-(each) 18.2515 Tj
--279 TJm
-(\002le) 12.7322 Tj
--280 TJm
-(processed.) 41.7732 Tj
--795 TJm
-(Be) 11.0684 Tj
--279 TJm
-(a) 4.42339 Tj
-15 TJm
-(w) 7.193 Tj
-10 TJm
-(are,) 14.655 Tj
--286 TJm
-(though,) 30.1668 Tj
--287 TJm
-(that) 14.9439 Tj
--279 TJm
-(the) 12.1743 Tj
--279 TJm
-(check) 23.2328 Tj
--279 TJm
-(occurs) 26.0024 Tj
--279 TJm
-(upon) 19.9252 Tj
--279 TJm
-(decompression,) 62.2563 Tj
--287 TJm
-(so) 8.85675 Tj
--279 TJm
-(it) 5.53921 Tj
--279 TJm
-(can) 13.8281 Tj
--279 TJm
-(only) 17.7135 Tj
--280 TJm
-(tell) 12.7322 Tj
--279 TJm
-(you) 14.9439 Tj
-72 628.462 Td
-(that) 14.9439 Tj
--237 TJm
-(something) 41.5142 Tj
--236 TJm
-(is) 6.64505 Tj
--237 TJm
-(wrong.) 27.9451 Tj
--611 TJm
-(It) 6.08715 Tj
--237 TJm
-(can') 17.1456 Tj
-18 TJm
-(t) 2.7696 Tj
--237 TJm
-(help) 17.1556 Tj
--237 TJm
-(you) 14.9439 Tj
--236 TJm
-(reco) 17.1456 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(er) 7.74094 Tj
--237 TJm
-(the) 12.1743 Tj
--237 TJm
-(original) 30.9936 Tj
--237 TJm
-(uncompressed) 56.996 Tj
--236 TJm
-(data.) 19.0883 Tj
--612 TJm
-(Y) 7.193 Tj
-110 TJm
-(ou) 9.9626 Tj
--236 TJm
-(can) 13.8281 Tj
--237 TJm
-(use) 13.2801 Tj
-[1 0 0 1 458.159 628.462] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -458.159 -628.462] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-458.159 628.462 Td
-/F134_0 9.9626 Tf
-(bzip2recover) 71.7307 Tj
-[1 0 0 1 529.89 628.462] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -529.89 -628.462] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-532.249 628.462 Td
-/F130_0 9.9626 Tf
-(to) 7.7509 Tj
-72 616.507 Td
-(try) 11.0684 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(reco) 17.1456 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(er) 7.74094 Tj
--250 TJm
-(data) 16.5977 Tj
--250 TJm
-(from) 19.3673 Tj
--250 TJm
-(damaged) 35.965 Tj
--250 TJm
-(\002les.) 19.0983 Tj
-[1 0 0 1 72 614.35] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.8441] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -604.506] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 594.708 Td
-/F130_0 9.9626 Tf
-(Return) 27.1182 Tj
--298 TJm
-(v) 4.9813 Tj
-25 TJm
-(alues:) 23.2427 Tj
--406 TJm
-(0) 4.9813 Tj
--298 TJm
-(for) 11.6164 Tj
--298 TJm
-(a) 4.42339 Tj
--298 TJm
-(normal) 28.224 Tj
--298 TJm
-(e) 4.42339 Tj
-15 TJm
-(xit,) 13.0112 Tj
--310 TJm
-(1) 4.9813 Tj
--298 TJm
-(for) 11.6164 Tj
--297 TJm
-(en) 9.40469 Tj
-40 TJm
-(vironmental) 48.1492 Tj
--298 TJm
-(problems) 37.0808 Tj
--298 TJm
-(\(\002le) 16.0497 Tj
--298 TJm
-(not) 12.7322 Tj
--298 TJm
-(found,) 25.7334 Tj
--310 TJm
-(in) 7.7509 Tj
-40 TJm
-(v) 4.9813 Tj
-25 TJm
-(alid) 14.9439 Tj
--298 TJm
-(\003ags,) 21.31 Tj
--310 TJm
-(I/O) 13.2801 Tj
--298 TJm
-(errors,) 25.7234 Tj
--310 TJm
-(etc.\),) 19.9152 Tj
--310 TJm
-(2) 4.9813 Tj
--298 TJm
-(to) 7.7509 Tj
-72 582.753 Td
-(indicate) 31.5416 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(corrupt) 28.772 Tj
--250 TJm
-(compressed) 47.0334 Tj
--250 TJm
-(\002le,) 15.2229 Tj
--250 TJm
-(3) 4.9813 Tj
--250 TJm
-(for) 11.6164 Tj
--250 TJm
-(an) 9.40469 Tj
--250 TJm
-(internal) 30.4357 Tj
--250 TJm
-(consistenc) 41.5042 Tj
-15 TJm
-(y) 4.9813 Tj
--250 TJm
-(error) 19.3573 Tj
--250 TJm
-(\(e) 7.74094 Tj
-15 TJm
-(g,) 7.47195 Tj
--250 TJm
-(b) 4.9813 Tj
-20 TJm
-(ug\)) 13.2801 Tj
--250 TJm
-(which) 24.3486 Tj
--250 TJm
-(caused) 27.1082 Tj
-[1 0 0 1 443.065 582.753] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -443.065 -582.753] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-443.065 582.753 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 472.953 582.753] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.953 -582.753] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-475.444 582.753 Td
-/F130_0 9.9626 Tf
-(to) 7.7509 Tj
--250 TJm
-(panic.) 24.0696 Tj
-[1 0 0 1 72 580.596] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.8441] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -570.752] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 548.118 Td
-/F122_0 20.6585 Tf
-(2.4.) 34.4584 Tj
--278 TJm
-(OPTIONS) 92.9839 Tj
-[1 0 0 1 72 547.86] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.8441] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.8441] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -528.172] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 516.475 Td
-/F134_0 9.9626 Tf
-(-c) 11.9551 Tj
--600 TJm
-(--stdout) 47.8205 Tj
-[1 0 0 1 137.753 516.475] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -68.2441 -0.1544] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -516.32] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-108 504.52 Td
-/F130_0 9.9626 Tf
-(Compress) 39.8504 Tj
--250 TJm
-(or) 8.29885 Tj
--250 TJm
-(decompress) 47.0334 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(standard) 33.7533 Tj
--250 TJm
-(output.) 27.9551 Tj
-[1 0 0 1 72 502.363] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -3.8664] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.8441] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -488.652] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 478.854 Td
-/F134_0 9.9626 Tf
-(-d) 11.9551 Tj
--600 TJm
-(--decompress) 71.7307 Tj
-[1 0 0 1 161.664 478.854] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -92.1544 -1.5341] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -477.32] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-108 466.899 Td
-/F130_0 9.9626 Tf
-(F) 5.53921 Tj
-15 TJm
-(orce) 17.1456 Tj
--296 TJm
-(decompression.) 62.2563 Tj
-[1 0 0 1 200.214 466.899] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -200.214 -466.899] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-200.214 466.899 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 230.102 466.899] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -230.102 -466.899] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-230.102 466.899 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 235.659 466.899] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -235.659 -466.899] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-235.659 466.899 Td
-/F134_0 9.9626 Tf
-(bunzip2) 41.8429 Tj
-[1 0 0 1 277.502 466.899] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -277.502 -466.899] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-280.454 466.899 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 297.791 466.899] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -297.791 -466.899] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-297.791 466.899 Td
-/F134_0 9.9626 Tf
-(bzcat) 29.8878 Tj
-[1 0 0 1 327.679 466.899] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -327.679 -466.899] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-330.631 466.899 Td
-/F130_0 9.9626 Tf
-(are) 12.1643 Tj
--296 TJm
-(really) 22.6848 Tj
--296 TJm
-(the) 12.1743 Tj
--297 TJm
-(same) 20.4731 Tj
--296 TJm
-(program,) 36.2439 Tj
--308 TJm
-(and) 14.386 Tj
--296 TJm
-(the) 12.1743 Tj
--296 TJm
-(decision) 33.2053 Tj
--297 TJm
-(about) 22.1369 Tj
-108 454.944 Td
-(what) 19.3673 Tj
--303 TJm
-(actions) 28.224 Tj
--303 TJm
-(to) 7.7509 Tj
--303 TJm
-(tak) 12.1743 Tj
-10 TJm
-(e) 4.42339 Tj
--303 TJm
-(is) 6.64505 Tj
--303 TJm
-(done) 19.3673 Tj
--303 TJm
-(on) 9.9626 Tj
--304 TJm
-(the) 12.1743 Tj
--303 TJm
-(basis) 19.9252 Tj
--303 TJm
-(of) 8.29885 Tj
--303 TJm
-(which) 24.3486 Tj
--303 TJm
-(name) 21.579 Tj
--303 TJm
-(is) 6.64505 Tj
--303 TJm
-(used.) 20.7521 Tj
--939 TJm
-(This) 17.7135 Tj
--303 TJm
-(\003ag) 14.9439 Tj
--303 TJm
-(o) 4.9813 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(errides) 27.1082 Tj
--303 TJm
-(that) 14.9439 Tj
--303 TJm
-(mechanism,) 47.8703 Tj
--316 TJm
-(and) 14.386 Tj
-108 442.988 Td
-(forces) 24.3386 Tj
--250 TJm
-(bzip2) 22.1369 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(decompress.) 49.5241 Tj
-[1 0 0 1 72 440.832] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -3.8665] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.8441] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -427.121] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 417.323 Td
-/F134_0 9.9626 Tf
-(-z) 11.9551 Tj
--600 TJm
-(--compress) 59.7756 Tj
-[1 0 0 1 149.709 417.323] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -80.1993 -1.5342] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -415.789] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-108 405.368 Td
-/F130_0 9.9626 Tf
-(The) 15.4918 Tj
--250 TJm
-(complement) 49.2551 Tj
--250 TJm
-(to) 7.7509 Tj
-[1 0 0 1 187.969 405.368] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -187.969 -405.368] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-187.969 405.368 Td
-/F134_0 9.9626 Tf
-(-d) 11.9551 Tj
-[1 0 0 1 199.924 405.368] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -199.924 -405.368] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-199.924 405.368 Td
-/F130_0 9.9626 Tf
-(:) 2.7696 Tj
--310 TJm
-(forces) 24.3386 Tj
--250 TJm
-(compression,) 52.8516 Tj
--250 TJm
-(re) 7.74094 Tj
-15 TJm
-(g) 4.9813 Tj
-5 TJm
-(ardless) 27.6661 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(in) 7.7509 Tj
-40 TJm
-(v) 4.9813 Tj
-20 TJm
-(okation) 29.8878 Tj
--250 TJm
-(name.) 24.0696 Tj
-[1 0 0 1 72 403.211] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -3.8665] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.8441] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -389.5] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 379.702 Td
-/F134_0 9.9626 Tf
-(-t) 11.9551 Tj
--600 TJm
-(--test) 35.8654 Tj
-[1 0 0 1 125.798 379.702] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -56.2889 -0.1544] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -379.548] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-108 367.747 Td
-/F130_0 9.9626 Tf
-(Check) 25.4544 Tj
--270 TJm
-(inte) 14.9439 Tj
-15 TJm
-(grity) 18.8194 Tj
--271 TJm
-(of) 8.29885 Tj
--270 TJm
-(the) 12.1743 Tj
--271 TJm
-(speci\002ed) 35.417 Tj
--270 TJm
-(\002le\(s\),) 25.7334 Tj
--276 TJm
-(b) 4.9813 Tj
-20 TJm
-(ut) 7.7509 Tj
--270 TJm
-(don') 18.2614 Tj
-18 TJm
-(t) 2.7696 Tj
--270 TJm
-(decompress) 47.0334 Tj
--271 TJm
-(them.) 22.4159 Tj
--742 TJm
-(This) 17.7135 Tj
--271 TJm
-(really) 22.6848 Tj
--270 TJm
-(performs) 35.965 Tj
--270 TJm
-(a) 4.42339 Tj
--271 TJm
-(trial) 16.0497 Tj
--270 TJm
-(decompres-) 46.4755 Tj
-108 355.791 Td
-(sion) 16.6077 Tj
--250 TJm
-(and) 14.386 Tj
--250 TJm
-(thro) 16.0497 Tj
-25 TJm
-(ws) 11.0684 Tj
--250 TJm
-(a) 4.42339 Tj
-15 TJm
-(w) 7.193 Tj
-10 TJm
-(ay) 9.40469 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(result.) 24.6275 Tj
-[1 0 0 1 72 353.635] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -3.8664] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.8441] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -339.924] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 330.126 Td
-/F134_0 9.9626 Tf
-(-f) 11.9551 Tj
--600 TJm
-(--force) 41.8429 Tj
-[1 0 0 1 131.776 330.126] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -62.2665 -0.1544] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -329.971] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-108 318.171 Td
-/F130_0 9.9626 Tf
-(F) 5.53921 Tj
-15 TJm
-(orce) 17.1456 Tj
--338 TJm
-(o) 4.9813 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(erwrite) 28.2141 Tj
--339 TJm
-(of) 8.29885 Tj
--338 TJm
-(output) 25.4644 Tj
--338 TJm
-(\002les.) 19.0983 Tj
--1150 TJm
-(Normally) 38.1866 Tj
-65 TJm
-(,) 2.49065 Tj
-[1 0 0 1 289.831 318.171] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -289.831 -318.171] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-289.831 318.171 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 319.719 318.171] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -319.719 -318.171] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-323.089 318.171 Td
-/F130_0 9.9626 Tf
-(will) 15.5018 Tj
--338 TJm
-(not) 12.7322 Tj
--339 TJm
-(o) 4.9813 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(erwrite) 28.2141 Tj
--338 TJm
-(e) 4.42339 Tj
-15 TJm
-(xisting) 27.1282 Tj
--338 TJm
-(output) 25.4644 Tj
--338 TJm
-(\002les.) 19.0983 Tj
--1150 TJm
-(Also) 18.8194 Tj
--339 TJm
-(forces) 24.3386 Tj
-[1 0 0 1 108 306.215] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -108 -306.215] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-108 306.215 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 137.888 306.215] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -137.888 -306.215] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-140.379 306.215 Td
-/F130_0 9.9626 Tf
-(to) 7.7509 Tj
--250 TJm
-(break) 22.1269 Tj
--250 TJm
-(hard) 17.7035 Tj
--250 TJm
-(links) 19.3773 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(\002les,) 19.0983 Tj
--250 TJm
-(which) 24.3486 Tj
--250 TJm
-(it) 5.53921 Tj
--250 TJm
-(otherwise) 38.7346 Tj
--250 TJm
-(w) 7.193 Tj
-10 TJm
-(ouldn') 26.0123 Tj
-18 TJm
-(t) 2.7696 Tj
--250 TJm
-(do.) 12.4533 Tj
-[1 0 0 1 72 304.681] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.8441] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -294.837] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-108 284.416 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 137.888 284.416] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -137.888 -284.416] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-141.211 284.416 Td
-/F130_0 9.9626 Tf
-(normally) 35.9749 Tj
--334 TJm
-(declines) 32.6474 Tj
--333 TJm
-(to) 7.7509 Tj
--334 TJm
-(decompress) 47.0334 Tj
--333 TJm
-(\002les) 16.6077 Tj
--334 TJm
-(which) 24.3486 Tj
--333 TJm
-(don') 18.2614 Tj
-18 TJm
-(t) 2.7696 Tj
--334 TJm
-(ha) 9.40469 Tj
-20 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--333 TJm
-(the) 12.1743 Tj
--334 TJm
-(correct) 27.6562 Tj
--333 TJm
-(magic) 24.3486 Tj
--334 TJm
-(header) 26.5503 Tj
--333 TJm
-(bytes.) 23.5217 Tj
--561 TJm
-(If) 6.63509 Tj
--334 TJm
-(forced) 25.4445 Tj
-108 272.461 Td
-(\() 3.31755 Tj
-[1 0 0 1 111.318 272.461] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -111.318 -272.461] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-111.318 272.461 Td
-/F134_0 9.9626 Tf
-(-f) 11.9551 Tj
-[1 0 0 1 123.273 272.461] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -123.273 -272.461] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-123.273 272.461 Td
-/F130_0 9.9626 Tf
-(\),) 5.8082 Tj
--250 TJm
-(ho) 9.9626 Tj
-25 TJm
-(we) 11.6164 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(er) 7.74094 Tj
-40 TJm
-(,) 2.49065 Tj
--250 TJm
-(it) 5.53921 Tj
--250 TJm
-(will) 15.5018 Tj
--250 TJm
-(pass) 17.1556 Tj
--250 TJm
-(such) 18.2614 Tj
--250 TJm
-(\002les) 16.6077 Tj
--250 TJm
-(through) 30.9936 Tj
--250 TJm
-(unmodi\002ed.) 47.8803 Tj
--310 TJm
-(This) 17.7135 Tj
--250 TJm
-(is) 6.64505 Tj
--250 TJm
-(ho) 9.9626 Tj
-25 TJm
-(w) 7.193 Tj
--250 TJm
-(GNU) 21.579 Tj
-[1 0 0 1 412.585 272.461] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -412.585 -272.461] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-412.585 272.461 Td
-/F134_0 9.9626 Tf
-(gzip) 23.9102 Tj
-[1 0 0 1 436.496 272.461] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -436.496 -272.461] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-438.986 272.461 Td
-/F130_0 9.9626 Tf
-(beha) 18.8094 Tj
-20 TJm
-(v) 4.9813 Tj
-15 TJm
-(es.) 10.7895 Tj
-[1 0 0 1 72 270.304] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -3.8665] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.8441] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -256.594] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 246.795 Td
-/F134_0 9.9626 Tf
-(-k) 11.9551 Tj
--600 TJm
-(--keep) 35.8654 Tj
-[1 0 0 1 125.798 246.795] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -56.2889 -1.5342] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -245.261] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-108 234.84 Td
-/F130_0 9.9626 Tf
-(K) 7.193 Tj
-25 TJm
-(eep) 13.8281 Tj
--250 TJm
-(\(don') 21.579 Tj
-18 TJm
-(t) 2.7696 Tj
--250 TJm
-(delete\)) 27.1082 Tj
--250 TJm
-(input) 20.4831 Tj
--250 TJm
-(\002les) 16.6077 Tj
--250 TJm
-(during) 26.0123 Tj
--250 TJm
-(compression) 50.3609 Tj
--250 TJm
-(or) 8.29885 Tj
--250 TJm
-(decompression.) 62.2563 Tj
-[1 0 0 1 72 232.683] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -3.8665] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.8441] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -218.973] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 209.174 Td
-/F134_0 9.9626 Tf
-(-s) 11.9551 Tj
--600 TJm
-(--small) 41.8429 Tj
-[1 0 0 1 131.776 209.174] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -62.2665 -0.1544] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -209.02] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-108 197.219 Td
-/F130_0 9.9626 Tf
-(Reduce) 29.8778 Tj
--347 TJm
-(memory) 33.2053 Tj
--347 TJm
-(usage,) 25.1755 Tj
--371 TJm
-(for) 11.6164 Tj
--346 TJm
-(compression,) 52.8516 Tj
--371 TJm
-(decompression) 59.7656 Tj
--347 TJm
-(and) 14.386 Tj
--347 TJm
-(testing.) 29.0609 Tj
--1201 TJm
-(Files) 19.3773 Tj
--347 TJm
-(are) 12.1643 Tj
--347 TJm
-(decompressed) 56.4381 Tj
--346 TJm
-(and) 14.386 Tj
--347 TJm
-(tested) 23.2427 Tj
-108 185.264 Td
-(using) 21.589 Tj
--388 TJm
-(a) 4.42339 Tj
--388 TJm
-(modi\002ed) 35.427 Tj
--388 TJm
-(algorithm) 38.7446 Tj
--389 TJm
-(which) 24.3486 Tj
--388 TJm
-(only) 17.7135 Tj
--388 TJm
-(requires) 32.0895 Tj
--388 TJm
-(2.5) 12.4533 Tj
--388 TJm
-(bytes) 21.031 Tj
--388 TJm
-(per) 12.7222 Tj
--388 TJm
-(block) 22.1369 Tj
--389 TJm
-(byte.) 19.6462 Tj
--1448 TJm
-(This) 17.7135 Tj
--389 TJm
-(means) 25.4544 Tj
--388 TJm
-(an) 9.40469 Tj
-15 TJm
-(y) 4.9813 Tj
--388 TJm
-(\002le) 12.7322 Tj
--388 TJm
-(can) 13.8281 Tj
--388 TJm
-(be) 9.40469 Tj
-108 173.309 Td
-(decompressed) 56.4381 Tj
--250 TJm
-(in) 7.7509 Tj
--250 TJm
-(2300k) 24.9065 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(memory) 33.2053 Tj
-65 TJm
-(,) 2.49065 Tj
--250 TJm
-(albeit) 22.1369 Tj
--250 TJm
-(at) 7.193 Tj
--250 TJm
-(about) 22.1369 Tj
--250 TJm
-(half) 15.4918 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(normal) 28.224 Tj
--250 TJm
-(speed.) 25.1755 Tj
-[1 0 0 1 72 171.152] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.8441] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -161.308] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-108 151.51 Td
-/F130_0 9.9626 Tf
-(During) 28.224 Tj
--252 TJm
-(compr) 25.4544 Tj
-1 TJm
-(ession,) 27.3972 Tj
-[1 0 0 1 194.09 151.51] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -194.09 -151.51] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-194.09 151.51 Td
-/F134_0 9.9626 Tf
-(-s) 11.9551 Tj
-[1 0 0 1 206.046 151.51] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -206.046 -151.51] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-208.551 151.51 Td
-/F130_0 9.9626 Tf
-(selects) 26.5603 Tj
--251 TJm
-(a) 4.42339 Tj
--252 TJm
-(block) 22.1369 Tj
--251 TJm
-(size) 15.4918 Tj
--252 TJm
-(of) 8.29885 Tj
--252 TJm
-(200k,) 22.4159 Tj
--251 TJm
-(which) 24.3486 Tj
--252 TJm
-(limits) 22.7048 Tj
--251 TJm
-(memory) 33.2053 Tj
--252 TJm
-(use) 13.2801 Tj
--251 TJm
-(to) 7.7509 Tj
--252 TJm
-(around) 27.6661 Tj
--251 TJm
-(the) 12.1743 Tj
--252 TJm
-(same) 20.4731 Tj
--251 TJm
-(\002gure,) 25.7334 Tj
--252 TJm
-(at) 7.193 Tj
-108 139.554 Td
-(the) 12.1743 Tj
--287 TJm
-(e) 4.42339 Tj
-15 TJm
-(xpense) 27.6661 Tj
--287 TJm
-(of) 8.29885 Tj
--288 TJm
-(your) 18.2614 Tj
--287 TJm
-(compression) 50.3609 Tj
--287 TJm
-(ratio.) 20.7521 Tj
--843 TJm
-(In) 8.29885 Tj
--287 TJm
-(short,) 22.4159 Tj
--297 TJm
-(if) 6.08715 Tj
--287 TJm
-(your) 18.2614 Tj
--287 TJm
-(machine) 33.7533 Tj
--287 TJm
-(is) 6.64505 Tj
--287 TJm
-(lo) 7.7509 Tj
-25 TJm
-(w) 7.193 Tj
--287 TJm
-(on) 9.9626 Tj
--288 TJm
-(memory) 33.2053 Tj
--287 TJm
-(\(8) 8.29885 Tj
--287 TJm
-(me) 12.1743 Tj
-15 TJm
-(g) 4.9813 Tj
-5 TJm
-(abytes) 25.4544 Tj
--287 TJm
-(or) 8.29885 Tj
--287 TJm
-(less\),) 20.7521 Tj
-108 127.599 Td
-(use) 13.2801 Tj
-[1 0 0 1 123.771 127.599] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -123.771 -127.599] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-123.771 127.599 Td
-/F134_0 9.9626 Tf
-(-s) 11.9551 Tj
-[1 0 0 1 135.726 127.599] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -135.726 -127.599] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-138.216 127.599 Td
-/F130_0 9.9626 Tf
-(for) 11.6164 Tj
--250 TJm
-(e) 4.42339 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(erything.) 35.696 Tj
--620 TJm
-(See) 14.386 Tj
-[1 0 0 1 220.079 127.599] cm
-/DeviceRGB {} cs
-[0 0 1] sc
-/DeviceRGB {} CS
-[0 0 1] SC
-[1 0 0 1 -220.079 -127.599] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-220.079 127.599 Td
-/F130_0 9.9626 Tf
-(MEMOR) 37.6387 Tj
-65 TJm
-(Y) 7.193 Tj
--250 TJm
-(MAN) 23.2427 Tj
-35 TJm
-(A) 7.193 Tj
-40 TJm
-(GEMENT) 41.5042 Tj
-[1 0 0 1 337.946 127.599] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 1] sc
-/DeviceRGB {} CS
-[0 0 1] SC
-/DeviceRGB {} cs
-[0 0 1] sc
-/DeviceRGB {} CS
-[0 0 1] SC
-[1 0 0 1 -337.946 -127.599] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-340.437 127.599 Td
-/F130_0 9.9626 Tf
-([5]) 11.6164 Tj
-[1 0 0 1 352.053 127.599] cm
-/DeviceRGB {} cs
-[0 0 1] sc
-/DeviceRGB {} CS
-[0 0 1] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -352.053 -127.599] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-354.544 127.599 Td
-/F130_0 9.9626 Tf
-(belo) 17.1556 Tj
-25 TJm
-(w) 7.193 Tj
-65 TJm
-(.) 2.49065 Tj
-[1 0 0 1 72 125.443] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -3.8665] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.8441] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -111.732] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 101.934 Td
-/F134_0 9.9626 Tf
-(-q) 11.9551 Tj
--600 TJm
-(--quiet) 41.8429 Tj
-[1 0 0 1 131.776 101.934] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -62.2665 -1.5342] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -100.399] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-108 89.9784 Td
-/F130_0 9.9626 Tf
-(Suppress) 35.9749 Tj
--221 TJm
-(non-essential) 52.5726 Tj
--220 TJm
-(w) 7.193 Tj
-10 TJm
-(arning) 25.4544 Tj
--221 TJm
-(messages.) 40.1194 Tj
--300 TJm
-(Messages) 38.7346 Tj
--221 TJm
-(pertaining) 40.3983 Tj
--221 TJm
-(to) 7.7509 Tj
--220 TJm
-(I/O) 13.2801 Tj
--221 TJm
-(errors) 23.2328 Tj
--221 TJm
-(and) 14.386 Tj
--220 TJm
-(other) 20.4731 Tj
--221 TJm
-(critical) 27.6661 Tj
--221 TJm
-(e) 4.42339 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(ents) 16.0497 Tj
--221 TJm
-(wi) 9.9626 Tj
-1 TJm
-(ll) 5.53921 Tj
--221 TJm
-(not) 12.7322 Tj
-108 78.0232 Td
-(be) 9.40469 Tj
--250 TJm
-(suppressed.) 46.2065 Tj
-[1 0 0 1 72 75.8664] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -3.8664] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -21.1482] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 374.394 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 43.0633 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -496.332 -50.8518] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-539.395 50.8518 Td
-/F130_0 9.9626 Tf
-(4) 4.9813 Tj
-[1 0 0 1 453.269 50.8518] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 93.5985 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.2765 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-Q
-showpage
-%%PageTrailer
-pdfEndPage
-%%Page: 8 8
-%%BeginPageSetup
-%%PageOrientation: Portrait
-pdfStartPage
-0 0 612 792 re W
-%%EndPageSetup
-[] 0 d
-1 i
-0 j
-0 J
-10 M
-1 w
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-false op
-false OP
-0 0 612 792 re
-W
-q
-[1 0 0 1 72 741.554] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 14.4459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 187.197 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 -8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 105.519 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -371.59 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-477.109 749.245 Td
-/F130_0 9.9626 Tf
-(Ho) 12.1743 Tj
-25 TJm
-(w) 7.193 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(use) 13.2801 Tj
--250 TJm
-(bzip2) 22.1369 Tj
-[1 0 0 1 266.071 747.089] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 280.796 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.974 -5.0363] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -0.4981] cm
-q
-[] 0 d
-0 J
-0.4981 w
-0 0.2491 m
-475.465 0.2491 l
-S
-Q
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 479.251 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -21.5542] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -720] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 710.037 Td
-/F134_0 9.9626 Tf
-(-v) 11.9551 Tj
--600 TJm
-(--verbose) 53.798 Tj
-[1 0 0 1 143.731 710.037] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -74.2217 -0.1544] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -709.883] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-108 698.082 Td
-/F130_0 9.9626 Tf
-(V) 7.193 Tj
-111 TJm
-(erbose) 26.0024 Tj
--323 TJm
-(mode) 22.1369 Tj
--322 TJm
-(--) 6.63509 Tj
--323 TJm
-(sho) 13.8381 Tj
-25 TJm
-(w) 7.193 Tj
--322 TJm
-(the) 12.1743 Tj
--323 TJm
-(compression) 50.3609 Tj
--323 TJm
-(ratio) 18.2614 Tj
--322 TJm
-(for) 11.6164 Tj
--323 TJm
-(each) 18.2515 Tj
--322 TJm
-(\002le) 12.7322 Tj
--323 TJm
-(processed.) 41.7732 Tj
--1056 TJm
-(Further) 29.3299 Tj
-[1 0 0 1 430.015 698.082] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -430.015 -698.082] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-430.015 698.082 Td
-/F134_0 9.9626 Tf
-(-v) 11.9551 Tj
-[1 0 0 1 441.97 698.082] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -441.97 -698.082] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-441.97 698.082 Td
-/F130_0 9.9626 Tf
-(') 3.31755 Tj
-55 TJm
-(s) 3.87545 Tj
--323 TJm
-(increase) 32.6375 Tj
--322 TJm
-(the) 12.1743 Tj
--323 TJm
-(v) 4.9813 Tj
-15 TJm
-(erbosity) 32.0995 Tj
-108 686.127 Td
-(le) 7.193 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(el,) 9.68365 Tj
--250 TJm
-(spe) 13.2801 Tj
-25 TJm
-(wing) 19.9252 Tj
--250 TJm
-(out) 12.7322 Tj
--250 TJm
-(lots) 14.396 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(information) 47.0434 Tj
--250 TJm
-(which) 24.3486 Tj
--250 TJm
-(is) 6.64505 Tj
--250 TJm
-(primarily) 37.0808 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(interest) 29.3299 Tj
--250 TJm
-(for) 11.6164 Tj
--250 TJm
-(diagnostic) 40.9562 Tj
--250 TJm
-(purposes.) 37.9077 Tj
-[1 0 0 1 72 683.97] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -3.985] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -670.023] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 660.224 Td
-/F134_0 9.9626 Tf
-(-L) 11.9551 Tj
--600 TJm
-(--license) 53.798 Tj
--600 TJm
-(-V) 11.9551 Tj
--600 TJm
-(--version) 53.798 Tj
-[1 0 0 1 221.44 660.224] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -151.93 -0.1544] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -660.07] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-108 648.269 Td
-/F130_0 9.9626 Tf
-(Display) 30.9936 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(softw) 22.1369 Tj
-10 TJm
-(are) 12.1643 Tj
--250 TJm
-(v) 4.9813 Tj
-15 TJm
-(ersion,) 26.8392 Tj
--250 TJm
-(license) 27.6661 Tj
--250 TJm
-(terms) 22.1369 Tj
--250 TJm
-(and) 14.386 Tj
--250 TJm
-(conditions.) 44.0048 Tj
-[1 0 0 1 72 646.112] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -3.985] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -632.165] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 622.366 Td
-/F134_0 9.9626 Tf
-(-1) 11.9551 Tj
-[1 0 0 1 83.9552 622.366] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -83.9552 -622.366] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.4458 622.366 Td
-/F130_0 9.9626 Tf
-(\(or) 11.6164 Tj
-[1 0 0 1 100.553 622.366] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -100.553 -622.366] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-100.553 622.366 Td
-/F134_0 9.9626 Tf
-(--fast) 35.8654 Tj
-[1 0 0 1 136.418 622.366] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -136.418 -622.366] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-136.418 622.366 Td
-/F130_0 9.9626 Tf
-(\)) 3.31755 Tj
--250 TJm
-(to) 7.7509 Tj
-[1 0 0 1 152.468 622.366] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -152.468 -622.366] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-152.468 622.366 Td
-/F134_0 9.9626 Tf
-(-9) 11.9551 Tj
-[1 0 0 1 164.423 622.366] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -164.423 -622.366] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-166.914 622.366 Td
-/F130_0 9.9626 Tf
-(\(or) 11.6164 Tj
-[1 0 0 1 181.021 622.366] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -181.021 -622.366] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-181.021 622.366 Td
-/F134_0 9.9626 Tf
-(-best) 29.8878 Tj
-[1 0 0 1 210.909 622.366] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -210.909 -622.366] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-210.909 622.366 Td
-/F130_0 9.9626 Tf
-(\)) 3.31755 Tj
-[1 0 0 1 214.226 622.366] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -142.226 -1.7832] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -620.583] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-108 610.411 Td
-/F130_0 9.9626 Tf
-(Set) 12.7322 Tj
--288 TJm
-(the) 12.1743 Tj
--289 TJm
-(block) 22.1369 Tj
--288 TJm
-(size) 15.4918 Tj
--288 TJm
-(to) 7.7509 Tj
--288 TJm
-(100) 14.9439 Tj
--289 TJm
-(k,) 7.47195 Tj
--298 TJm
-(200) 14.9439 Tj
--288 TJm
-(k) 4.9813 Tj
--288 TJm
-(...) 7.47195 Tj
--850 TJm
-(900) 14.9439 Tj
--288 TJm
-(k) 4.9813 Tj
--288 TJm
-(when) 21.579 Tj
--289 TJm
-(compressing.) 52.8516 Tj
--849 TJm
-(Has) 15.4918 Tj
--289 TJm
-(no) 9.9626 Tj
--288 TJm
-(ef) 7.74094 Tj
-25 TJm
-(fect) 14.9339 Tj
--288 TJm
-(when) 21.579 Tj
--288 TJm
-(decompressing.) 62.2563 Tj
--850 TJm
-(See) 14.386 Tj
-[1 0 0 1 108 598.456] cm
-/DeviceRGB {} cs
-[0 0 1] sc
-/DeviceRGB {} CS
-[0 0 1] SC
-[1 0 0 1 -108 -598.456] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-108 598.456 Td
-/F130_0 9.9626 Tf
-(MEMOR) 37.6387 Tj
-65 TJm
-(Y) 7.193 Tj
--297 TJm
-(MAN) 23.2427 Tj
-35 TJm
-(A) 7.193 Tj
-40 TJm
-(GEMENT) 41.5042 Tj
-[1 0 0 1 226.338 598.456] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 1] sc
-/DeviceRGB {} CS
-[0 0 1] SC
-/DeviceRGB {} cs
-[0 0 1] sc
-/DeviceRGB {} CS
-[0 0 1] SC
-[1 0 0 1 -226.338 -598.456] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-229.3 598.456 Td
-/F130_0 9.9626 Tf
-([5]) 11.6164 Tj
-[1 0 0 1 240.916 598.456] cm
-/DeviceRGB {} cs
-[0 0 1] sc
-/DeviceRGB {} CS
-[0 0 1] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -240.916 -598.456] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-243.878 598.456 Td
-/F130_0 9.9626 Tf
-(belo) 17.1556 Tj
-25 TJm
-(w) 7.193 Tj
-65 TJm
-(.) 2.49065 Tj
--904 TJm
-(The) 15.4918 Tj
-[1 0 0 1 297.278 598.456] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -297.278 -598.456] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-297.278 598.456 Td
-/F134_0 9.9626 Tf
-(--fast) 35.8654 Tj
-[1 0 0 1 333.144 598.456] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -333.144 -598.456] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-336.106 598.456 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 353.454 598.456] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -353.454 -598.456] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-353.454 598.456 Td
-/F134_0 9.9626 Tf
-(--best) 35.8654 Tj
-[1 0 0 1 389.319 598.456] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -389.319 -598.456] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-392.281 598.456 Td
-/F130_0 9.9626 Tf
-(aliases) 26.5603 Tj
--297 TJm
-(are) 12.1643 Tj
--298 TJm
-(primarily) 37.0808 Tj
--297 TJm
-(for) 11.6164 Tj
--297 TJm
-(GNU) 21.579 Tj
-[1 0 0 1 516.09 598.456] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -516.09 -598.456] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-516.09 598.456 Td
-/F134_0 9.9626 Tf
-(gzip) 23.9102 Tj
-[1 0 0 1 540 598.456] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -540 -598.456] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-108 586.501 Td
-/F130_0 9.9626 Tf
-(compatibility) 53.1405 Tj
-65 TJm
-(.) 2.49065 Tj
--356 TJm
-(In) 8.29885 Tj
--265 TJm
-(particular) 38.1767 Tj
-40 TJm
-(,) 2.49065 Tj
-[1 0 0 1 220.423 586.501] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -220.423 -586.501] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-220.423 586.501 Td
-/F134_0 9.9626 Tf
-(--fast) 35.8654 Tj
-[1 0 0 1 256.288 586.501] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -256.288 -586.501] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-258.932 586.501 Td
-/F130_0 9.9626 Tf
-(doesn') 26.5603 Tj
-18 TJm
-(t) 2.7696 Tj
--265 TJm
-(mak) 17.1556 Tj
-10 TJm
-(e) 4.42339 Tj
--266 TJm
-(things) 24.3586 Tj
--265 TJm
-(signi\002cantly) 49.2651 Tj
--265 TJm
-(f) 3.31755 Tj
-10 TJm
-(aster) 18.8094 Tj
-55 TJm
-(.) 2.49065 Tj
--712 TJm
-(And) 17.1556 Tj
-[1 0 0 1 444.622 586.501] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.622 -586.501] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-444.622 586.501 Td
-/F134_0 9.9626 Tf
-(--best) 35.8654 Tj
-[1 0 0 1 480.487 586.501] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -480.487 -586.501] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-483.131 586.501 Td
-/F130_0 9.9626 Tf
-(merely) 27.6661 Tj
--265 TJm
-(selects) 26.5603 Tj
-108 574.546 Td
-(the) 12.1743 Tj
--250 TJm
-(def) 12.7222 Tj
-10 TJm
-(ault) 14.9439 Tj
--250 TJm
-(beha) 18.8094 Tj
-20 TJm
-(viour) 21.031 Tj
-55 TJm
-(.) 2.49065 Tj
-[1 0 0 1 72 574.446] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -3.985] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -560.498] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 548.643 Td
-/F134_0 9.9626 Tf
-(--) 11.9551 Tj
-[1 0 0 1 83.9552 548.643] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -14.4458 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -548.643] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-108 536.688 Td
-/F130_0 9.9626 Tf
-(T) 6.08715 Tj
-35 TJm
-(reats) 18.8094 Tj
--261 TJm
-(all) 9.9626 Tj
--261 TJm
-(subsequent) 44.2738 Tj
--260 TJm
-(ar) 7.74094 Tj
-18 TJm
-(guments) 33.7633 Tj
--261 TJm
-(as) 8.29885 Tj
--261 TJm
-(\002le) 12.7322 Tj
--261 TJm
-(names,) 27.9451 Tj
--263 TJm
-(e) 4.42339 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(en) 9.40469 Tj
--261 TJm
-(if) 6.08715 Tj
--261 TJm
-(the) 12.1743 Tj
-15 TJm
-(y) 4.9813 Tj
--260 TJm
-(start) 17.1556 Tj
--261 TJm
-(with) 17.7135 Tj
--261 TJm
-(a) 4.42339 Tj
--261 TJm
-(dash.) 20.7521 Tj
--685 TJm
-(This) 17.7135 Tj
--260 TJm
-(is) 6.64505 Tj
--261 TJm
-(so) 8.85675 Tj
--261 TJm
-(you) 14.9439 Tj
--261 TJm
-(can) 13.8281 Tj
--260 TJm
-(handle) 26.5603 Tj
--261 TJm
-(\002les) 16.6077 Tj
-108 524.732 Td
-(with) 17.7135 Tj
--250 TJm
-(names) 25.4544 Tj
--250 TJm
-(be) 9.40469 Tj
-15 TJm
-(ginning) 30.4457 Tj
--250 TJm
-(with) 17.7135 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(dash,) 20.7521 Tj
--250 TJm
-(for) 11.6164 Tj
--250 TJm
-(e) 4.42339 Tj
-15 TJm
-(xample:) 32.0995 Tj
-[1 0 0 1 302.27 524.732] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -302.27 -524.732] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-302.27 524.732 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
--600 TJm
-(--) 11.9551 Tj
--600 TJm
-(-myfilename) 65.7532 Tj
-[1 0 0 1 421.821 524.732] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -421.821 -524.732] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-421.821 524.732 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
-[1 0 0 1 72 522.576] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -3.985] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -508.628] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 498.83 Td
-/F134_0 9.9626 Tf
-(--repetitive-fast) 101.619 Tj
-[1 0 0 1 173.619 498.83] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -173.619 -498.83] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-173.619 498.83 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 178.6 498.83] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -183.582 -498.83] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-183.582 498.83 Td
-/F134_0 9.9626 Tf
-(--repetitive-best) 101.619 Tj
-[1 0 0 1 285.2 498.83] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -215.691 -1.5342] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -497.295] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-108 486.874 Td
-/F130_0 9.9626 Tf
-(These) 23.7907 Tj
--207 TJm
-(\003ags) 18.8194 Tj
--206 TJm
-(are) 12.1643 Tj
--207 TJm
-(redundant) 39.8404 Tj
--207 TJm
-(in) 7.7509 Tj
--206 TJm
-(v) 4.9813 Tj
-15 TJm
-(ersions) 28.224 Tj
--207 TJm
-(0.9.5) 19.9252 Tj
--207 TJm
-(and) 14.386 Tj
--206 TJm
-(abo) 14.386 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(e.) 6.91404 Tj
--591 TJm
-(The) 15.4918 Tj
-15 TJm
-(y) 4.9813 Tj
--207 TJm
-(pro) 13.2801 Tj
-15 TJm
-(vided) 22.1369 Tj
--207 TJm
-(some) 21.031 Tj
--207 TJm
-(c) 4.42339 Tj
-1 TJm
-(o) 4.9813 Tj
--1 TJm
-(a) 4.42339 Tj
-1 TJm
-(rse) 11.6164 Tj
--207 TJm
-(control) 28.224 Tj
--207 TJm
-(o) 4.9813 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(er) 7.74094 Tj
--207 TJm
-(the) 12.1743 Tj
--206 TJm
-(beha) 18.8094 Tj
-20 TJm
-(viour) 21.031 Tj
-108 474.919 Td
-(of) 8.29885 Tj
--250 TJm
-(the) 12.1743 Tj
--251 TJm
-(sorting) 27.6761 Tj
--250 TJm
-(algorithm) 38.7446 Tj
--250 TJm
-(in) 7.7509 Tj
--251 TJm
-(earlier) 25.4445 Tj
--250 TJm
-(v) 4.9813 Tj
-15 TJm
-(ersions,) 30.7147 Tj
--250 TJm
-(which) 24.3486 Tj
--251 TJm
-(w) 7.193 Tj
-10 TJm
-(as) 8.29885 Tj
--250 TJm
-(sometimes) 42.62 Tj
--250 TJm
-(useful.) 26.8392 Tj
--622 TJm
-(0.9.5) 19.9252 Tj
--251 TJm
-(and) 14.386 Tj
--250 TJm
-(abo) 14.386 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--250 TJm
-(ha) 9.40469 Tj
-20 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--251 TJm
-(an) 9.40469 Tj
--250 TJm
-(impro) 23.8007 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(ed) 9.40469 Tj
-108 462.964 Td
-(algorithm) 38.7446 Tj
--250 TJm
-(which) 24.3486 Tj
--250 TJm
-(renders) 29.3199 Tj
--250 TJm
-(these) 20.4731 Tj
--250 TJm
-(\003ags) 18.8194 Tj
--250 TJm
-(irrele) 21.0211 Tj
-25 TJm
-(v) 4.9813 Tj
-25 TJm
-(ant.) 14.6649 Tj
-[1 0 0 1 72 460.807] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -3.985] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -436.897] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 414.264 Td
-/F122_0 20.6585 Tf
-(2.5.) 34.4584 Tj
--278 TJm
-(MEMOR) 79.184 Tj
-50 TJm
-(Y) 13.7792 Tj
--278 TJm
-(MANA) 61.9548 Tj
-50 TJm
-(GEMENT) 88.3771 Tj
-[1 0 0 1 72 414.005] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -404.043] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 392.346 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 101.888 392.346] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -101.888 -392.346] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-104.454 392.346 Td
-/F130_0 9.9626 Tf
-(compresses) 45.9276 Tj
--258 TJm
-(lar) 10.5105 Tj
-18 TJm
-(ge) 9.40469 Tj
--257 TJm
-(\002les) 16.6077 Tj
--258 TJm
-(in) 7.7509 Tj
--257 TJm
-(blocks.) 28.503 Tj
--666 TJm
-(The) 15.4918 Tj
--257 TJm
-(block) 22.1369 Tj
--258 TJm
-(size) 15.4918 Tj
--258 TJm
-(af) 7.74094 Tj
-25 TJm
-(fects) 18.8094 Tj
--257 TJm
-(both) 17.7135 Tj
--258 TJm
-(the) 12.1743 Tj
--257 TJm
-(compression) 50.3609 Tj
--258 TJm
-(ratio) 18.2614 Tj
--257 TJm
-(achie) 21.0211 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(ed,) 11.8953 Tj
--260 TJm
-(and) 14.386 Tj
--258 TJm
-(the) 12.1743 Tj
--257 TJm
-(amount) 29.8878 Tj
-72 380.391 Td
-(of) 8.29885 Tj
--215 TJm
-(memory) 33.2053 Tj
--215 TJm
-(needed) 28.2141 Tj
--215 TJm
-(for) 11.6164 Tj
--215 TJm
-(compression) 50.3609 Tj
--214 TJm
-(and) 14.386 Tj
--215 TJm
-(decompression.) 62.2563 Tj
--597 TJm
-(The) 15.4918 Tj
--215 TJm
-(\003ags) 18.8194 Tj
-[1 0 0 1 337.719 380.391] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -337.719 -380.391] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-337.719 380.391 Td
-/F134_0 9.9626 Tf
-(-1) 11.9551 Tj
-[1 0 0 1 349.674 380.391] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -349.674 -380.391] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-351.815 380.391 Td
-/F130_0 9.9626 Tf
-(through) 30.9936 Tj
-[1 0 0 1 384.95 380.391] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -384.95 -380.391] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-384.95 380.391 Td
-/F134_0 9.9626 Tf
-(-9) 11.9551 Tj
-[1 0 0 1 396.905 380.391] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -396.905 -380.391] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-399.046 380.391 Td
-/F130_0 9.9626 Tf
-(specify) 28.772 Tj
--215 TJm
-(the) 12.1743 Tj
--215 TJm
-(block) 22.1369 Tj
--215 TJm
-(size) 15.4918 Tj
--215 TJm
-(to) 7.7509 Tj
--214 TJm
-(be) 9.40469 Tj
--215 TJm
-(100,000) 32.3785 Tj
-72 368.435 Td
-(bytes) 21.031 Tj
--278 TJm
-(through) 30.9936 Tj
--277 TJm
-(900,000) 32.3785 Tj
--278 TJm
-(bytes) 21.031 Tj
--278 TJm
-(\(the) 15.4918 Tj
--277 TJm
-(def) 12.7222 Tj
-10 TJm
-(ault\)) 18.2614 Tj
--278 TJm
-(respecti) 30.9837 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(ely) 12.1743 Tj
-65 TJm
-(.) 2.49065 Tj
--786 TJm
-(At) 9.9626 Tj
--278 TJm
-(decompression) 59.7656 Tj
--278 TJm
-(time,) 20.2042 Tj
--284 TJm
-(the) 12.1743 Tj
--278 TJm
-(block) 22.1369 Tj
--278 TJm
-(size) 15.4918 Tj
--277 TJm
-(used) 18.2614 Tj
--278 TJm
-(for) 11.6164 Tj
--278 TJm
-(compression) 50.3609 Tj
-72 356.48 Td
-(is) 6.64505 Tj
--243 TJm
-(read) 17.1456 Tj
--242 TJm
-(from) 19.3673 Tj
--243 TJm
-(the) 12.1743 Tj
--242 TJm
-(header) 26.5503 Tj
--243 TJm
-(of) 8.29885 Tj
--242 TJm
-(the) 12.1743 Tj
--243 TJm
-(compressed) 47.0334 Tj
--242 TJm
-(\002le,) 15.2229 Tj
--244 TJm
-(and) 14.386 Tj
-[1 0 0 1 275.174 356.48] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -275.174 -356.48] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-275.174 356.48 Td
-/F134_0 9.9626 Tf
-(bunzip2) 41.8429 Tj
-[1 0 0 1 317.017 356.48] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -317.017 -356.48] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-319.433 356.48 Td
-/F130_0 9.9626 Tf
-(then) 17.1556 Tj
--243 TJm
-(all) 9.9626 Tj
-1 TJm
-(o) 4.9813 Tj
--1 TJm
-(c) 4.42339 Tj
-1 TJm
-(ates) 15.4918 Tj
--243 TJm
-(itself) 19.9252 Tj
--242 TJm
-(just) 14.396 Tj
--243 TJm
-(enough) 29.3299 Tj
--243 TJm
-(memory) 33.2053 Tj
--242 TJm
-(to) 7.7509 Tj
--243 TJm
-(decompress) 47.0334 Tj
-72 344.525 Td
-(the) 12.1743 Tj
--303 TJm
-(\002le.) 15.2229 Tj
--940 TJm
-(Since) 22.1369 Tj
--304 TJm
-(block) 22.1369 Tj
--303 TJm
-(sizes) 19.3673 Tj
--303 TJm
-(are) 12.1643 Tj
--303 TJm
-(stored) 24.3486 Tj
--304 TJm
-(in) 7.7509 Tj
--303 TJm
-(compressed) 47.0334 Tj
--303 TJm
-(\002les,) 19.0983 Tj
--317 TJm
-(it) 5.53921 Tj
--303 TJm
-(follo) 18.8194 Tj
-25 TJm
-(ws) 11.0684 Tj
--304 TJm
-(that) 14.9439 Tj
--303 TJm
-(the) 12.1743 Tj
--303 TJm
-(\003ags) 18.8194 Tj
-[1 0 0 1 406.35 344.525] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -406.35 -344.525] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-406.35 344.525 Td
-/F134_0 9.9626 Tf
-(-1) 11.9551 Tj
-[1 0 0 1 418.305 344.525] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -418.305 -344.525] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-421.327 344.525 Td
-/F130_0 9.9626 Tf
-(to) 7.7509 Tj
-[1 0 0 1 432.1 344.525] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -432.1 -344.525] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-432.1 344.525 Td
-/F134_0 9.9626 Tf
-(-9) 11.9551 Tj
-[1 0 0 1 444.055 344.525] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.055 -344.525] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-447.077 344.525 Td
-/F130_0 9.9626 Tf
-(are) 12.1643 Tj
--303 TJm
-(irrele) 21.0211 Tj
-25 TJm
-(v) 4.9813 Tj
-25 TJm
-(ant) 12.1743 Tj
--304 TJm
-(to) 7.7509 Tj
--303 TJm
-(and) 14.386 Tj
--303 TJm
-(so) 8.85675 Tj
-72 332.57 Td
-(ignored) 30.4357 Tj
--250 TJm
-(during) 26.0123 Tj
--250 TJm
-(decompression.) 62.2563 Tj
-[1 0 0 1 72 330.413] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -320.45] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 310.652 Td
-/F130_0 9.9626 Tf
-(Compression) 52.5826 Tj
--250 TJm
-(and) 14.386 Tj
--250 TJm
-(decompression) 59.7656 Tj
--250 TJm
-(requirements,) 54.5054 Tj
--250 TJm
-(in) 7.7509 Tj
--250 TJm
-(bytes,) 23.5217 Tj
--250 TJm
-(can) 13.8281 Tj
--250 TJm
-(be) 9.40469 Tj
--250 TJm
-(estimated) 38.1866 Tj
--250 TJm
-(as:) 11.0684 Tj
-[1 0 0 1 72 308.495] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -60.7721] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 59.7758 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 56.1893] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -299.13] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 299.13 Td
-/F134_0 9.9626 Tf
-(Compression:) 71.7307 Tj
--1278 TJm
-(400k) 23.9102 Tj
--426 TJm
-(+) 5.97756 Tj
--426 TJm
-(\() 5.97756 Tj
--426 TJm
-(8) 5.97756 Tj
--426 TJm
-(x) 5.97756 Tj
--426 TJm
-(block) 29.8878 Tj
--426 TJm
-(size) 23.9102 Tj
--426 TJm
-(\)) 5.97756 Tj
-90 275.22 Td
-(Decompression:) 83.6858 Tj
--426 TJm
-(100k) 23.9102 Tj
--426 TJm
-(+) 5.97756 Tj
--426 TJm
-(\() 5.97756 Tj
--426 TJm
-(4) 5.97756 Tj
--426 TJm
-(x) 5.97756 Tj
--426 TJm
-(block) 29.8878 Tj
--426 TJm
-(size) 23.9102 Tj
--426 TJm
-(\),) 11.9551 Tj
--426 TJm
-(or) 11.9551 Tj
-153.66 263.265 Td
-(100k) 23.9102 Tj
--426 TJm
-(+) 5.97756 Tj
--426 TJm
-(\() 5.97756 Tj
--426 TJm
-(2.5) 17.9327 Tj
--426 TJm
-(x) 5.97756 Tj
--426 TJm
-(block) 29.8878 Tj
--426 TJm
-(size) 23.9102 Tj
--426 TJm
-(\)) 5.97756 Tj
-[1 0 0 1 72 247.723] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -237.761] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 225.805 Td
-/F130_0 9.9626 Tf
-(Lar) 13.8281 Tj
-18 TJm
-(ger) 12.7222 Tj
--292 TJm
-(block) 22.1369 Tj
--292 TJm
-(sizes) 19.3673 Tj
--291 TJm
-(gi) 7.7509 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--292 TJm
-(rapidly) 28.224 Tj
--292 TJm
-(diminishing) 47.6113 Tj
--292 TJm
-(mar) 15.4918 Tj
-18 TJm
-(ginal) 19.9252 Tj
--291 TJm
-(returns.) 30.1568 Tj
--871 TJm
-(Most) 20.4831 Tj
--292 TJm
-(of) 8.29885 Tj
--291 TJm
-(the) 12.1743 Tj
--292 TJm
-(compression) 50.3609 Tj
--292 TJm
-(comes) 25.4544 Tj
--292 TJm
-(from) 19.3673 Tj
--291 TJm
-(the) 12.1743 Tj
--292 TJm
-(\002rst) 15.5018 Tj
--292 TJm
-(tw) 9.9626 Tj
-10 TJm
-(o) 4.9813 Tj
--292 TJm
-(or) 8.29885 Tj
-72 213.85 Td
-(three) 19.9152 Tj
--232 TJm
-(hundred) 32.6474 Tj
--232 TJm
-(k) 4.9813 Tj
--232 TJm
-(of) 8.29885 Tj
--232 TJm
-(block) 22.1369 Tj
--232 TJm
-(size,) 17.9825 Tj
--235 TJm
-(a) 4.42339 Tj
--232 TJm
-(f) 3.31755 Tj
-10 TJm
-(act) 11.6164 Tj
--232 TJm
-(w) 7.193 Tj
-10 TJm
-(orth) 16.0497 Tj
--232 TJm
-(bearing) 29.8778 Tj
--232 TJm
-(in) 7.7509 Tj
--232 TJm
-(mind) 20.4831 Tj
--232 TJm
-(when) 21.579 Tj
--231 TJm
-(using) 21.589 Tj
-[1 0 0 1 354.025 213.85] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -354.025 -213.85] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-354.025 213.85 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 383.913 213.85] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -383.913 -213.85] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-386.223 213.85 Td
-/F130_0 9.9626 Tf
-(on) 9.9626 Tj
--232 TJm
-(small) 21.589 Tj
--232 TJm
-(machines.) 40.1194 Tj
--304 TJm
-(It) 6.08715 Tj
--232 TJm
-(is) 6.64505 Tj
--232 TJm
-(also) 16.0497 Tj
--231 TJm
-(important) 38.7446 Tj
-72 201.895 Td
-(to) 7.7509 Tj
--250 TJm
-(appreciate) 40.9363 Tj
--250 TJm
-(that) 14.9439 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(decompression) 59.7656 Tj
--250 TJm
-(memory) 33.2053 Tj
--250 TJm
-(requirement) 48.1393 Tj
--250 TJm
-(is) 6.64505 Tj
--250 TJm
-(set) 11.0684 Tj
--250 TJm
-(at) 7.193 Tj
--250 TJm
-(compression) 50.3609 Tj
--250 TJm
-(time) 17.7135 Tj
--250 TJm
-(by) 9.9626 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(choice) 26.0024 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(block) 22.1369 Tj
--250 TJm
-(size.) 17.9825 Tj
-[1 0 0 1 72 199.738] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -189.776] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 179.977 Td
-/F130_0 9.9626 Tf
-(F) 5.53921 Tj
-15 TJm
-(or) 8.29885 Tj
--388 TJm
-(\002les) 16.6077 Tj
--389 TJm
-(compressed) 47.0334 Tj
--388 TJm
-(with) 17.7135 Tj
--389 TJm
-(the) 12.1743 Tj
--388 TJm
-(def) 12.7222 Tj
-10 TJm
-(ault) 14.9439 Tj
--389 TJm
-(900k) 19.9252 Tj
--388 TJm
-(block) 22.1369 Tj
--389 TJm
-(size,) 17.9825 Tj
-[1 0 0 1 302.002 179.977] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -302.002 -179.977] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-302.002 179.977 Td
-/F134_0 9.9626 Tf
-(bunzip2) 41.8429 Tj
-[1 0 0 1 343.846 179.977] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -343.846 -179.977] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-347.715 179.977 Td
-/F130_0 9.9626 Tf
-(will) 15.5018 Tj
--388 TJm
-(require) 28.2141 Tj
--389 TJm
-(about) 22.1369 Tj
--388 TJm
-(3700) 19.9252 Tj
--389 TJm
-(kbytes) 26.0123 Tj
--388 TJm
-(to) 7.7509 Tj
--389 TJm
-(decompress.) 49.5241 Tj
-72 168.022 Td
-(T) 6.08715 Tj
-80 TJm
-(o) 4.9813 Tj
--424 TJm
-(support) 29.8878 Tj
--425 TJm
-(decompression) 59.7656 Tj
--424 TJm
-(of) 8.29885 Tj
--424 TJm
-(an) 9.40469 Tj
-15 TJm
-(y) 4.9813 Tj
--425 TJm
-(\002l) 8.30881 Tj
-1 TJm
-(e) 4.42339 Tj
--425 TJm
-(on) 9.9626 Tj
--424 TJm
-(a) 4.42339 Tj
--424 TJm
-(4) 4.9813 Tj
--425 TJm
-(me) 12.1743 Tj
-15 TJm
-(g) 4.9813 Tj
-5 TJm
-(abyte) 21.579 Tj
--424 TJm
-(machine,) 36.2439 Tj
-[1 0 0 1 348.272 168.022] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -348.272 -168.022] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-348.272 168.022 Td
-/F134_0 9.9626 Tf
-(bunzip2) 41.8429 Tj
-[1 0 0 1 390.115 168.022] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -390.115 -168.022] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-394.342 168.022 Td
-/F130_0 9.9626 Tf
-(has) 13.2801 Tj
--424 TJm
-(an) 9.40469 Tj
--425 TJm
-(option) 25.4644 Tj
--424 TJm
-(to) 7.7509 Tj
--424 TJm
-(decompress) 47.0334 Tj
--424 TJm
-(using) 21.589 Tj
-72 156.067 Td
-(approximately) 57.5539 Tj
--281 TJm
-(half) 15.4918 Tj
--281 TJm
-(this) 14.396 Tj
--280 TJm
-(amount) 29.8878 Tj
--281 TJm
-(of) 8.29885 Tj
--281 TJm
-(memory) 33.2053 Tj
-65 TJm
-(,) 2.49065 Tj
--288 TJm
-(about) 22.1369 Tj
--281 TJm
-(2300) 19.9252 Tj
--281 TJm
-(kbytes.) 28.503 Tj
--805 TJm
-(Decompression) 61.9773 Tj
--280 TJm
-(speed) 22.6848 Tj
--281 TJm
-(is) 6.64505 Tj
--281 TJm
-(also) 16.0497 Tj
--281 TJm
-(halv) 17.1556 Tj
-15 TJm
-(ed,) 11.8953 Tj
--288 TJm
-(so) 8.85675 Tj
--281 TJm
-(you) 14.9439 Tj
--281 TJm
-(should) 26.5703 Tj
-72 144.112 Td
-(use) 13.2801 Tj
--250 TJm
-(this) 14.396 Tj
--250 TJm
-(option) 25.4644 Tj
--250 TJm
-(only) 17.7135 Tj
--250 TJm
-(where) 24.3386 Tj
--250 TJm
-(necessary) 38.7246 Tj
-65 TJm
-(.) 2.49065 Tj
--620 TJm
-(The) 15.4918 Tj
--250 TJm
-(rele) 14.9339 Tj
-25 TJm
-(v) 4.9813 Tj
-25 TJm
-(ant) 12.1743 Tj
--250 TJm
-(\003ag) 14.9439 Tj
--250 TJm
-(is) 6.64505 Tj
-[1 0 0 1 305.024 144.112] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -305.024 -144.112] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-305.024 144.112 Td
-/F134_0 9.9626 Tf
-(-s) 11.9551 Tj
-[1 0 0 1 316.979 144.112] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -316.979 -144.112] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-316.979 144.112 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
-[1 0 0 1 72 141.955] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -131.992] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 122.194 Td
-/F130_0 9.9626 Tf
-(In) 8.29885 Tj
--204 TJm
-(general,) 31.8106 Tj
--214 TJm
-(try) 11.0684 Tj
--204 TJm
-(and) 14.386 Tj
--205 TJm
-(use) 13.2801 Tj
--204 TJm
-(the) 12.1743 Tj
--204 TJm
-(lar) 10.5105 Tj
-18 TJm
-(gest) 16.0497 Tj
--205 TJm
-(block) 22.1369 Tj
--204 TJm
-(size) 15.4918 Tj
--205 TJm
-(memory) 33.2053 Tj
--204 TJm
-(constraints) 43.1679 Tj
--204 TJm
-(allo) 14.9439 Tj
-25 TJm
-(w) 7.193 Tj
-65 TJm
-(,) 2.49065 Tj
--214 TJm
-(since) 20.4731 Tj
--204 TJm
-(that) 14.9439 Tj
--205 TJm
-(maximises) 42.62 Tj
--204 TJm
-(the) 12.1743 Tj
--204 TJm
-(compression) 50.3609 Tj
--205 TJm
-(achie) 21.0211 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(ed.) 11.8953 Tj
-72 110.239 Td
-(Compression) 52.5826 Tj
--250 TJm
-(and) 14.386 Tj
--250 TJm
-(decompression) 59.7656 Tj
--250 TJm
-(speed) 22.6848 Tj
--250 TJm
-(are) 12.1643 Tj
--250 TJm
-(virtually) 33.7633 Tj
--250 TJm
-(unaf) 17.7035 Tj
-25 TJm
-(fected) 24.3386 Tj
--250 TJm
-(by) 9.9626 Tj
--250 TJm
-(block) 22.1369 Tj
--250 TJm
-(size.) 17.9825 Tj
-[1 0 0 1 72 108.082] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -98.1193] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 88.321 Td
-/F130_0 9.9626 Tf
-(Another) 32.6474 Tj
--296 TJm
-(signi\002cant) 41.5142 Tj
--296 TJm
-(point) 20.4831 Tj
--295 TJm
-(applies) 28.224 Tj
--296 TJm
-(to) 7.7509 Tj
--296 TJm
-(\002les) 16.6077 Tj
--296 TJm
-(which) 24.3486 Tj
--296 TJm
-(\002t) 8.30881 Tj
--296 TJm
-(in) 7.7509 Tj
--296 TJm
-(a) 4.42339 Tj
--295 TJm
-(single) 23.8007 Tj
--296 TJm
-(block) 22.1369 Tj
--296 TJm
-(--) 6.63509 Tj
--296 TJm
-(that) 14.9439 Tj
--296 TJm
-(means) 25.4544 Tj
--296 TJm
-(most) 19.3773 Tj
--295 TJm
-(\002les) 16.6077 Tj
--296 TJm
-(you') 18.2614 Tj
-50 TJm
-(d) 4.9813 Tj
--296 TJm
-(encounter) 39.2825 Tj
--296 TJm
-(using) 21.589 Tj
--296 TJm
-(a) 4.42339 Tj
-72 76.3658 Td
-(lar) 10.5105 Tj
-18 TJm
-(ge) 9.40469 Tj
--290 TJm
-(block) 22.1369 Tj
--290 TJm
-(size.) 17.9825 Tj
--859 TJm
-(The) 15.4918 Tj
--290 TJm
-(amount) 29.8878 Tj
--290 TJm
-(of) 8.29885 Tj
--290 TJm
-(real) 14.9339 Tj
--290 TJm
-(memory) 33.2053 Tj
--289 TJm
-(touched) 31.5416 Tj
--290 TJm
-(is) 6.64505 Tj
--290 TJm
-(proportional) 49.2551 Tj
--290 TJm
-(to) 7.7509 Tj
--290 TJm
-(the) 12.1743 Tj
--290 TJm
-(size) 15.4918 Tj
--290 TJm
-(of) 8.29885 Tj
--290 TJm
-(the) 12.1743 Tj
--289 TJm
-(\002le,) 15.2229 Tj
--300 TJm
-(since) 20.4731 Tj
--290 TJm
-(the) 12.1743 Tj
--290 TJm
-(\002le) 12.7322 Tj
--290 TJm
-(is) 6.64505 Tj
--290 TJm
-(smaller) 29.3299 Tj
-[1 0 0 1 72 50.8518] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 374.394 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.8541] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 43.0633 -6.7545] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -496.332 -50.9514] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-539.395 50.9514 Td
-/F130_0 9.9626 Tf
-(5) 4.9813 Tj
-[1 0 0 1 453.269 50.8518] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 93.5985 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.2765 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-Q
-showpage
-%%PageTrailer
-pdfEndPage
-%%Page: 9 9
-%%BeginPageSetup
-%%PageOrientation: Portrait
-pdfStartPage
-0 0 612 792 re W
-%%EndPageSetup
-[] 0 d
-1 i
-0 j
-0 J
-10 M
-1 w
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-false op
-false OP
-0 0 612 792 re
-W
-q
-[1 0 0 1 72 741.554] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 14.4459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 187.197 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 -8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 105.519 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -371.59 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-477.109 749.245 Td
-/F130_0 9.9626 Tf
-(Ho) 12.1743 Tj
-25 TJm
-(w) 7.193 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(use) 13.2801 Tj
--250 TJm
-(bzip2) 22.1369 Tj
-[1 0 0 1 266.071 747.089] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 280.796 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.974 -5.0363] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -0.4981] cm
-q
-[] 0 d
-0 J
-0.4981 w
-0 0.2491 m
-475.465 0.2491 l
-S
-Q
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 479.251 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -540 -741.554] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 710.037 Td
-/F130_0 9.9626 Tf
-(than) 17.1556 Tj
--362 TJm
-(a) 4.42339 Tj
--362 TJm
-(block.) 24.6275 Tj
--1293 TJm
-(F) 5.53921 Tj
-15 TJm
-(or) 8.29885 Tj
--362 TJm
-(e) 4.42339 Tj
-15 TJm
-(xample,) 31.8205 Tj
--390 TJm
-(compressing) 50.3609 Tj
--362 TJm
-(a) 4.42339 Tj
--362 TJm
-(\002le) 12.7322 Tj
--362 TJm
-(20,000) 27.3972 Tj
--362 TJm
-(bytes) 21.031 Tj
--362 TJm
-(long) 17.7135 Tj
--362 TJm
-(with) 17.7135 Tj
--362 TJm
-(the) 12.1743 Tj
--362 TJm
-(\003ag) 14.9439 Tj
-[1 0 0 1 406.528 710.037] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -406.528 -710.037] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-406.528 710.037 Td
-/F134_0 9.9626 Tf
-(-9) 11.9551 Tj
-[1 0 0 1 418.483 710.037] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -418.483 -710.037] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-422.09 710.037 Td
-/F130_0 9.9626 Tf
-(will) 15.5018 Tj
--362 TJm
-(cause) 22.1269 Tj
--362 TJm
-(the) 12.1743 Tj
--362 TJm
-(compressor) 45.9276 Tj
--362 TJm
-(to) 7.7509 Tj
-72 698.082 Td
-(allocate) 30.9837 Tj
--271 TJm
-(around) 27.6661 Tj
--272 TJm
-(7600k) 24.9065 Tj
--271 TJm
-(of) 8.29885 Tj
--272 TJm
-(memory) 33.2053 Tj
-65 TJm
-(,) 2.49065 Tj
--277 TJm
-(b) 4.9813 Tj
-20 TJm
-(ut) 7.7509 Tj
--271 TJm
-(only) 17.7135 Tj
--272 TJm
-(touch) 22.1369 Tj
--271 TJm
-(400k) 19.9252 Tj
--272 TJm
-(+) 5.61891 Tj
--271 TJm
-(20000) 24.9065 Tj
--272 TJm
-(*) 4.9813 Tj
--271 TJm
-(8) 4.9813 Tj
--272 TJm
-(=) 5.61891 Tj
--271 TJm
-(560) 14.9439 Tj
--272 TJm
-(kbytes) 26.0123 Tj
--271 TJm
-(of) 8.29885 Tj
--272 TJm
-(it.) 8.02986 Tj
--748 TJm
-(Similarly) 37.0908 Tj
-65 TJm
-(,) 2.49065 Tj
--277 TJm
-(the) 12.1743 Tj
--272 TJm
-(decompressor) 55.3323 Tj
-72 686.127 Td
-(will) 15.5018 Tj
--250 TJm
-(allocate) 30.9837 Tj
--250 TJm
-(3700k) 24.9065 Tj
--250 TJm
-(b) 4.9813 Tj
-20 TJm
-(ut) 7.7509 Tj
--250 TJm
-(only) 17.7135 Tj
--250 TJm
-(touch) 22.1369 Tj
--250 TJm
-(100k) 19.9252 Tj
--250 TJm
-(+) 5.61891 Tj
--250 TJm
-(20000) 24.9065 Tj
--250 TJm
-(*) 4.9813 Tj
--250 TJm
-(4) 4.9813 Tj
--250 TJm
-(=) 5.61891 Tj
--250 TJm
-(180) 14.9439 Tj
--250 TJm
-(kbytes.) 28.503 Tj
-[1 0 0 1 72 683.97] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -674.008] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 664.209 Td
-/F130_0 9.9626 Tf
-(Here) 19.3573 Tj
--293 TJm
-(is) 6.64505 Tj
--294 TJm
-(a) 4.42339 Tj
--293 TJm
-(table) 19.3673 Tj
--294 TJm
-(which) 24.3486 Tj
--293 TJm
-(summarises) 47.0434 Tj
--294 TJm
-(the) 12.1743 Tj
--293 TJm
-(maximum) 40.4083 Tj
--294 TJm
-(memory) 33.2053 Tj
--293 TJm
-(usage) 22.6848 Tj
--294 TJm
-(for) 11.6164 Tj
--293 TJm
-(dif) 11.0684 Tj
-25 TJm
-(ferent) 23.2328 Tj
--294 TJm
-(block) 22.1369 Tj
--293 TJm
-(sizes.) 21.8579 Tj
--881 TJm
-(Also) 18.8194 Tj
--293 TJm
-(recorded) 34.8492 Tj
--294 TJm
-(is) 6.64505 Tj
--293 TJm
-(the) 12.1743 Tj
--294 TJm
-(total) 17.7135 Tj
-72 652.254 Td
-(compressed) 47.0334 Tj
--289 TJm
-(size) 15.4918 Tj
--289 TJm
-(for) 11.6164 Tj
--289 TJm
-(14) 9.9626 Tj
--289 TJm
-(\002les) 16.6077 Tj
--290 TJm
-(of) 8.29885 Tj
--289 TJm
-(the) 12.1743 Tj
--289 TJm
-(Calg) 18.8194 Tj
-5 TJm
-(ary) 12.7222 Tj
--289 TJm
-(T) 6.08715 Tj
-70 TJm
-(e) 4.42339 Tj
-15 TJm
-(xt) 7.7509 Tj
--289 TJm
-(Compression) 52.5826 Tj
--289 TJm
-(Corpus) 28.782 Tj
--289 TJm
-(totalling) 33.2153 Tj
--289 TJm
-(3,141,622) 39.8504 Tj
--290 TJm
-(bytes.) 23.5217 Tj
--854 TJm
-(This) 17.7135 Tj
--290 TJm
-(column) 29.8878 Tj
--289 TJm
-(gi) 7.7509 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(es) 8.29885 Tj
-72 640.299 Td
-(some) 21.031 Tj
--253 TJm
-(feel) 14.9339 Tj
--253 TJm
-(for) 11.6164 Tj
--253 TJm
-(ho) 9.9626 Tj
-25 TJm
-(w) 7.193 Tj
--253 TJm
-(compression) 50.3609 Tj
--253 TJm
-(v) 4.9813 Tj
-25 TJm
-(aries) 18.8094 Tj
--253 TJm
-(with) 17.7135 Tj
--253 TJm
-(block) 22.1369 Tj
--253 TJm
-(size.) 17.9825 Tj
--638 TJm
-(These) 23.7907 Tj
--253 TJm
-(\002gures) 27.1182 Tj
--253 TJm
-(tend) 17.1556 Tj
--254 TJm
-(to) 7.7509 Tj
--253 TJm
-(understate) 40.9463 Tj
--253 TJm
-(the) 12.1743 Tj
--253 TJm
-(adv) 14.386 Tj
-25 TJm
-(antage) 26.0024 Tj
--253 TJm
-(of) 8.29885 Tj
--253 TJm
-(lar) 10.5105 Tj
-18 TJm
-(ger) 12.7222 Tj
--253 TJm
-(block) 22.1369 Tj
-72 628.344 Td
-(sizes) 19.3673 Tj
--250 TJm
-(for) 11.6164 Tj
--250 TJm
-(lar) 10.5105 Tj
-18 TJm
-(ger) 12.7222 Tj
--250 TJm
-(\002les,) 19.0983 Tj
--250 TJm
-(since) 20.4731 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(Corpus) 28.782 Tj
--250 TJm
-(is) 6.64505 Tj
--250 TJm
-(dominated) 42.0621 Tj
--250 TJm
-(by) 9.9626 Tj
--250 TJm
-(smaller) 29.3299 Tj
--250 TJm
-(\002les.) 19.0983 Tj
-[1 0 0 1 72 626.187] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -156.413] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 155.417 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5865] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 151.831] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -616.822] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-123.952 616.822 Td
-/F134_0 9.9626 Tf
-(Compress) 47.8205 Tj
--1278 TJm
-(Decompress) 59.7756 Tj
--1278 TJm
-(Decompress) 59.7756 Tj
--1278 TJm
-(Corpus) 35.8654 Tj
-90 604.867 Td
-(Flag) 23.9102 Tj
--2130 TJm
-(usage) 29.8878 Tj
--2556 TJm
-(usage) 29.8878 Tj
--2982 TJm
-(-s) 11.9551 Tj
--426 TJm
-(usage) 29.8878 Tj
--2130 TJm
-(Size) 23.9102 Tj
-94.244 580.956 Td
-(-1) 11.9551 Tj
--2556 TJm
-(1200k) 29.8878 Tj
--2982 TJm
-(500k) 23.9102 Tj
--3834 TJm
-(350k) 23.9102 Tj
--2556 TJm
-(914704) 35.8654 Tj
-94.244 569.001 Td
-(-2) 11.9551 Tj
--2556 TJm
-(2000k) 29.8878 Tj
--2982 TJm
-(900k) 23.9102 Tj
--3834 TJm
-(600k) 23.9102 Tj
--2556 TJm
-(877703) 35.8654 Tj
-94.244 557.046 Td
-(-3) 11.9551 Tj
--2556 TJm
-(2800k) 29.8878 Tj
--2556 TJm
-(1300k) 29.8878 Tj
--3834 TJm
-(850k) 23.9102 Tj
--2556 TJm
-(860338) 35.8654 Tj
-94.244 545.091 Td
-(-4) 11.9551 Tj
--2556 TJm
-(3600k) 29.8878 Tj
--2556 TJm
-(1700k) 29.8878 Tj
--3408 TJm
-(1100k) 29.8878 Tj
--2556 TJm
-(846899) 35.8654 Tj
-94.244 533.136 Td
-(-5) 11.9551 Tj
--2556 TJm
-(4400k) 29.8878 Tj
--2556 TJm
-(2100k) 29.8878 Tj
--3408 TJm
-(1350k) 29.8878 Tj
--2556 TJm
-(845160) 35.8654 Tj
-94.244 521.181 Td
-(-6) 11.9551 Tj
--2556 TJm
-(5200k) 29.8878 Tj
--2556 TJm
-(2500k) 29.8878 Tj
--3408 TJm
-(1600k) 29.8878 Tj
--2556 TJm
-(838626) 35.8654 Tj
-94.244 509.225 Td
-(-7) 11.9551 Tj
--2556 TJm
-(6100k) 29.8878 Tj
--2556 TJm
-(2900k) 29.8878 Tj
--3408 TJm
-(1850k) 29.8878 Tj
--2556 TJm
-(834096) 35.8654 Tj
-94.244 497.27 Td
-(-8) 11.9551 Tj
--2556 TJm
-(6800k) 29.8878 Tj
--2556 TJm
-(3300k) 29.8878 Tj
--3408 TJm
-(2100k) 29.8878 Tj
--2556 TJm
-(828642) 35.8654 Tj
-94.244 485.315 Td
-(-9) 11.9551 Tj
--2556 TJm
-(7600k) 29.8878 Tj
--2556 TJm
-(3700k) 29.8878 Tj
--3408 TJm
-(2350k) 29.8878 Tj
--2556 TJm
-(828642) 35.8654 Tj
-[1 0 0 1 72 469.773] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -3.5866] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -459.811] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 435.021 Td
-/F122_0 20.6585 Tf
-(2.6.) 34.4584 Tj
--278 TJm
-(RECO) 59.6824 Tj
-50 TJm
-(VERING) 79.2047 Tj
--278 TJm
-(D) 14.9154 Tj
-40 TJm
-(A) 14.9154 Tj
-90 TJm
-(T) 12.6223 Tj
-90 TJm
-(A) 14.9154 Tj
--278 TJm
-(FR) 27.5378 Tj
-20 TJm
-(OM) 33.2808 Tj
--278 TJm
-(D) 14.9154 Tj
-40 TJm
-(AMA) 47.0394 Tj
-50 TJm
-(GED) 44.767 Tj
-72 410.23 Td
-(FILES) 58.5462 Tj
-[1 0 0 1 72 409.972] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -400.01] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 388.312 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 101.888 388.312] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -101.888 -388.312] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-105.138 388.312 Td
-/F130_0 9.9626 Tf
-(compresses) 45.9276 Tj
--326 TJm
-(\002les) 16.6077 Tj
--326 TJm
-(in) 7.7509 Tj
--326 TJm
-(blocks,) 28.503 Tj
--346 TJm
-(usually) 28.782 Tj
--326 TJm
-(900kbytes) 40.9562 Tj
--326 TJm
-(long.) 20.2042 Tj
--1077 TJm
-(Each) 19.9152 Tj
--326 TJm
-(block) 22.1369 Tj
--327 TJm
-(is) 6.64505 Tj
--326 TJm
-(handled) 31.5416 Tj
--326 TJm
-(independently) 56.4481 Tj
-65 TJm
-(.) 2.49065 Tj
--1077 TJm
-(If) 6.63509 Tj
--326 TJm
-(a) 4.42339 Tj
--326 TJm
-(media) 24.3486 Tj
--326 TJm
-(or) 8.29885 Tj
-72 376.357 Td
-(transmission) 50.3709 Tj
--319 TJm
-(error) 19.3573 Tj
--318 TJm
-(causes) 26.0024 Tj
--319 TJm
-(a) 4.42339 Tj
--318 TJm
-(multi-block) 46.4955 Tj
-[1 0 0 1 234.518 376.357] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -234.518 -376.357] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-234.518 376.357 Td
-/F134_0 9.9626 Tf
-(.bz2) 23.9102 Tj
-[1 0 0 1 258.429 376.357] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -258.429 -376.357] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-261.603 376.357 Td
-/F130_0 9.9626 Tf
-(\002le) 12.7322 Tj
--319 TJm
-(to) 7.7509 Tj
--318 TJm
-(become) 30.9837 Tj
--319 TJm
-(damaged,) 38.4556 Tj
--336 TJm
-(it) 5.53921 Tj
--318 TJm
-(may) 17.1556 Tj
--319 TJm
-(be) 9.40469 Tj
--318 TJm
-(possible) 32.6574 Tj
--319 TJm
-(to) 7.7509 Tj
--318 TJm
-(reco) 17.1456 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(er) 7.74094 Tj
--319 TJm
-(data) 16.5977 Tj
--319 TJm
-(from) 19.3673 Tj
--318 TJm
-(the) 12.1743 Tj
-72 364.402 Td
-(undamaged) 45.9276 Tj
--250 TJm
-(blocks) 26.0123 Tj
--250 TJm
-(in) 7.7509 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(\002le.) 15.2229 Tj
-[1 0 0 1 72 362.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -352.283] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 342.484 Td
-/F130_0 9.9626 Tf
-(The) 15.4918 Tj
--358 TJm
-(compressed) 47.0334 Tj
--357 TJm
-(representation) 56.4381 Tj
--358 TJm
-(of) 8.29885 Tj
--357 TJm
-(each) 18.2515 Tj
--358 TJm
-(block) 22.1369 Tj
--358 TJm
-(is) 6.64505 Tj
--357 TJm
-(delimited) 37.6387 Tj
--358 TJm
-(by) 9.9626 Tj
--357 TJm
-(a) 4.42339 Tj
--358 TJm
-(48-bit) 23.8007 Tj
--358 TJm
-(pattern,) 30.1568 Tj
--384 TJm
-(which) 24.3486 Tj
--358 TJm
-(mak) 17.1556 Tj
-10 TJm
-(es) 8.29885 Tj
--357 TJm
-(it) 5.53921 Tj
--358 TJm
-(possible) 32.6574 Tj
--357 TJm
-(to) 7.7509 Tj
--358 TJm
-(\002nd) 15.5018 Tj
--358 TJm
-(the) 12.1743 Tj
-72 330.529 Td
-(block) 22.1369 Tj
--286 TJm
-(boundaries) 43.7159 Tj
--286 TJm
-(wit) 12.7322 Tj
-1 TJm
-(h) 4.9813 Tj
--286 TJm
-(reasonable) 42.6001 Tj
--286 TJm
-(certainty) 34.8591 Tj
-65 TJm
-(.) 2.49065 Tj
--835 TJm
-(Each) 19.9152 Tj
--285 TJm
-(block) 22.1369 Tj
--286 TJm
-(also) 16.0497 Tj
--286 TJm
-(carries) 26.5503 Tj
--286 TJm
-(its) 9.41466 Tj
--285 TJm
-(o) 4.9813 Tj
-25 TJm
-(wn) 12.1743 Tj
--286 TJm
-(32-bit) 23.8007 Tj
--286 TJm
-(CRC,) 22.4258 Tj
--286 TJm
-(so) 8.85675 Tj
--285 TJm
-(damaged) 35.965 Tj
--286 TJm
-(blocks) 26.0123 Tj
--286 TJm
-(can) 13.8281 Tj
--286 TJm
-(be) 9.40469 Tj
-72 318.574 Td
-(distinguished) 53.1405 Tj
--250 TJm
-(from) 19.3673 Tj
--250 TJm
-(undamaged) 45.9276 Tj
--250 TJm
-(ones.) 20.7521 Tj
-[1 0 0 1 72 316.417] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -306.455] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 296.656 Td
-/F134_0 9.9626 Tf
-(bzip2recover) 71.7307 Tj
-[1 0 0 1 143.731 296.656] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -143.731 -296.656] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-146.448 296.656 Td
-/F130_0 9.9626 Tf
-(is) 6.64505 Tj
--273 TJm
-(a) 4.42339 Tj
--272 TJm
-(simple) 26.5703 Tj
--273 TJm
-(program) 33.7533 Tj
--273 TJm
-(whose) 25.4544 Tj
--272 TJm
-(purpose) 31.5416 Tj
--273 TJm
-(is) 6.64505 Tj
--273 TJm
-(to) 7.7509 Tj
--272 TJm
-(search) 25.4445 Tj
--273 TJm
-(for) 11.6164 Tj
--273 TJm
-(blocks) 26.0123 Tj
--272 TJm
-(in) 7.7509 Tj
-[1 0 0 1 392.655 296.656] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -392.655 -296.656] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-392.655 296.656 Td
-/F134_0 9.9626 Tf
-(.bz2) 23.9102 Tj
-[1 0 0 1 416.566 296.656] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -416.566 -296.656] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-419.282 296.656 Td
-/F130_0 9.9626 Tf
-(\002les,) 19.0983 Tj
--278 TJm
-(and) 14.386 Tj
--273 TJm
-(write) 20.4731 Tj
--273 TJm
-(each) 18.2515 Tj
--272 TJm
-(block) 22.1369 Tj
--273 TJm
-(out) 12.7322 Tj
-72 284.701 Td
-(into) 15.5018 Tj
--254 TJm
-(its) 9.41466 Tj
--255 TJm
-(o) 4.9813 Tj
-25 TJm
-(wn) 12.1743 Tj
-[1 0 0 1 121.43 284.701] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -121.43 -284.701] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-121.43 284.701 Td
-/F134_0 9.9626 Tf
-(.bz2) 23.9102 Tj
-[1 0 0 1 145.34 284.701] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -145.34 -284.701] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-147.875 284.701 Td
-/F130_0 9.9626 Tf
-(\002le.) 15.2229 Tj
--647 TJm
-(Y) 7.193 Tj
-110 TJm
-(ou) 9.9626 Tj
--255 TJm
-(can) 13.8281 Tj
--254 TJm
-(then) 17.1556 Tj
--255 TJm
-(use) 13.2801 Tj
-[1 0 0 1 240.01 284.701] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -240.01 -284.701] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-240.01 284.701 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
--600 TJm
-(-t) 11.9551 Tj
-[1 0 0 1 287.831 284.701] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -287.831 -284.701] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-290.367 284.701 Td
-/F130_0 9.9626 Tf
-(to) 7.7509 Tj
--255 TJm
-(t) 2.7696 Tj
-1 TJm
-(est) 11.0684 Tj
--255 TJm
-(the) 12.1743 Tj
--254 TJm
-(inte) 14.9439 Tj
-15 TJm
-(grity) 18.8194 Tj
--255 TJm
-(of) 8.29885 Tj
--254 TJm
-(the) 12.1743 Tj
--255 TJm
-(resulting) 34.8691 Tj
--254 TJm
-(\002les,) 19.0983 Tj
--256 TJm
-(and) 14.386 Tj
--255 TJm
-(decompress) 47.0334 Tj
--254 TJm
-(those) 21.031 Tj
-72 272.746 Td
-(which) 24.3486 Tj
--250 TJm
-(are) 12.1643 Tj
--250 TJm
-(undamaged.) 48.4182 Tj
-[1 0 0 1 72 270.589] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -260.626] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 250.828 Td
-/F134_0 9.9626 Tf
-(bzip2recover) 71.7307 Tj
-[1 0 0 1 143.731 250.828] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -143.731 -250.828] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-150.099 250.828 Td
-/F130_0 9.9626 Tf
-(tak) 12.1743 Tj
-10 TJm
-(es) 8.29885 Tj
--639 TJm
-(a) 4.42339 Tj
--639 TJm
-(single) 23.8007 Tj
--639 TJm
-(ar) 7.74094 Tj
-18 TJm
-(gument,) 32.3785 Tj
--737 TJm
-(the) 12.1743 Tj
--639 TJm
-(name) 21.579 Tj
--639 TJm
-(of) 8.29885 Tj
--639 TJm
-(the) 12.1743 Tj
--639 TJm
-(damaged) 35.965 Tj
--639 TJm
-(\002le,) 15.2229 Tj
--737 TJm
-(and) 14.386 Tj
--639 TJm
-(writes) 24.3486 Tj
--639 TJm
-(a) 4.42339 Tj
--639 TJm
-(number) 30.4357 Tj
--639 TJm
-(of) 8.29885 Tj
--640 TJm
-(\002les) 16.6077 Tj
-[1 0 0 1 72 238.873] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -238.873] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 238.873 Td
-/F134_0 9.9626 Tf
-(rec0001file.bz2) 89.6634 Tj
-[1 0 0 1 161.664 238.873] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -161.664 -238.873] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-161.664 238.873 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 169.072 238.873] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -169.072 -238.873] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-169.072 238.873 Td
-/F134_0 9.9626 Tf
-(rec0002file.bz2) 89.6634 Tj
-[1 0 0 1 258.736 238.873] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -258.736 -238.873] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-258.736 238.873 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--494 TJm
-(etc,) 14.107 Tj
--493 TJm
-(containing) 42.0621 Tj
--445 TJm
-(the) 12.1743 Tj
--445 TJm
-(e) 4.42339 Tj
-15 TJm
-(xtracted) 32.0895 Tj
--445 TJm
-(blocks.) 28.503 Tj
--1789 TJm
-(The) 15.4918 Tj
--445 TJm
-(output) 25.4644 Tj
--445 TJm
-(\002lenames) 38.1866 Tj
--445 TJm
-(are) 12.1643 Tj
-72 226.918 Td
-(designed) 35.417 Tj
--337 TJm
-(so) 8.85675 Tj
--337 TJm
-(that) 14.9439 Tj
--337 TJm
-(the) 12.1743 Tj
--337 TJm
-(use) 13.2801 Tj
--337 TJm
-(of) 8.29885 Tj
--337 TJm
-(wildc) 22.1369 Tj
-1 TJm
-(ards) 16.5977 Tj
--337 TJm
-(in) 7.7509 Tj
--337 TJm
-(subsequent) 44.2738 Tj
--337 TJm
-(processing) 42.61 Tj
--337 TJm
-(--) 6.63509 Tj
--337 TJm
-(for) 11.6164 Tj
--337 TJm
-(e) 4.42339 Tj
-15 TJm
-(xample,) 31.8205 Tj
-[1 0 0 1 396.538 226.918] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -396.538 -226.918] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-396.538 226.918 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
--600 TJm
-(-dc) 17.9327 Tj
--600 TJm
-(rec) 17.9327 Tj
-474.247 225.174 Td
-(*) 5.97756 Tj
-480.224 226.918 Td
-(file.bz2) 47.8205 Tj
--600 TJm
-(>) 5.97756 Tj
-72 214.963 Td
-(recovered_data) 83.6858 Tj
-[1 0 0 1 155.686 214.963] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -155.686 -214.963] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-158.177 214.963 Td
-/F130_0 9.9626 Tf
-(--) 6.63509 Tj
--250 TJm
-(lists) 16.0597 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(\002les) 16.6077 Tj
--250 TJm
-(in) 7.7509 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(correct) 27.6562 Tj
--250 TJm
-(order) 21.0211 Tj
-55 TJm
-(.) 2.49065 Tj
-[1 0 0 1 72 213.653] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -203.69] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 193.045 Td
-/F134_0 9.9626 Tf
-(bzip2recover) 71.7307 Tj
-[1 0 0 1 143.731 193.045] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -143.731 -193.045] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-145.93 193.045 Td
-/F130_0 9.9626 Tf
-(should) 26.5703 Tj
--221 TJm
-(be) 9.40469 Tj
--220 TJm
-(of) 8.29885 Tj
--221 TJm
-(most) 19.3773 Tj
--221 TJm
-(use) 13.2801 Tj
--220 TJm
-(dealing) 29.3299 Tj
--221 TJm
-(with) 17.7135 Tj
--221 TJm
-(lar) 10.5105 Tj
-18 TJm
-(ge) 9.40469 Tj
-[1 0 0 1 307.229 193.045] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -307.229 -193.045] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-307.229 193.045 Td
-/F134_0 9.9626 Tf
-(.bz2) 23.9102 Tj
-[1 0 0 1 331.14 193.045] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -331.14 -193.045] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-333.338 193.045 Td
-/F130_0 9.9626 Tf
-(\002les,) 19.0983 Tj
--227 TJm
-(as) 8.29885 Tj
--220 TJm
-(these) 20.4731 Tj
--221 TJm
-(will) 15.5018 Tj
--221 TJm
-(contain) 29.3299 Tj
--220 TJm
-(man) 17.1556 Tj
-15 TJm
-(y) 4.9813 Tj
--221 TJm
-(blocks.) 28.503 Tj
--600 TJm
-(It) 6.08715 Tj
--221 TJm
-(is) 6.64505 Tj
--221 TJm
-(clearly) 27.1082 Tj
-72 181.09 Td
-(futile) 21.031 Tj
--289 TJm
-(to) 7.7509 Tj
--289 TJm
-(use) 13.2801 Tj
--289 TJm
-(it) 5.53921 Tj
--289 TJm
-(on) 9.9626 Tj
--289 TJm
-(damaged) 35.965 Tj
--289 TJm
-(single-block) 49.2551 Tj
--290 TJm
-(\002les) 16.6077 Tj
-1 TJm
-(,) 2.49065 Tj
--299 TJm
-(since) 20.4731 Tj
--289 TJm
-(a) 4.42339 Tj
--290 TJm
-(damaged) 35.965 Tj
--289 TJm
-(block) 22.1369 Tj
--289 TJm
-(cannot) 26.5603 Tj
--289 TJm
-(be) 9.40469 Tj
--289 TJm
-(reco) 17.1456 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(ered.) 19.6363 Tj
--854 TJm
-(If) 6.63509 Tj
--289 TJm
-(you) 14.9439 Tj
--290 TJm
-(wish) 18.8194 Tj
--289 TJm
-(to) 7.7509 Tj
--289 TJm
-(minimise) 37.0908 Tj
-72 169.135 Td
-(an) 9.40469 Tj
-15 TJm
-(y) 4.9813 Tj
--320 TJm
-(potential) 34.8691 Tj
--320 TJm
-(data) 16.5977 Tj
--319 TJm
-(loss) 15.5018 Tj
--320 TJm
-(through) 30.9936 Tj
--320 TJm
-(media) 24.3486 Tj
--320 TJm
-(or) 8.29885 Tj
--319 TJm
-(transmission) 50.3709 Tj
--320 TJm
-(errors,) 25.7234 Tj
--337 TJm
-(you) 14.9439 Tj
--320 TJm
-(might) 23.2527 Tj
--320 TJm
-(consider) 33.7533 Tj
--320 TJm
-(compressing) 50.3609 Tj
--319 TJm
-(with) 17.7135 Tj
--320 TJm
-(a) 4.42339 Tj
--320 TJm
-(smaller) 29.3299 Tj
--320 TJm
-(block) 22.1369 Tj
-72 157.179 Td
-(size.) 17.9825 Tj
-[1 0 0 1 72 157.08] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -147.117] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 122.426 Td
-/F122_0 20.6585 Tf
-(2.7.) 34.4584 Tj
--278 TJm
-(PERFORMANCE) 161.818 Tj
--278 TJm
-(NO) 30.9877 Tj
-40 TJm
-(TES) 40.1808 Tj
-[1 0 0 1 72 122.168] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -112.206] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 100.509 Td
-/F130_0 9.9626 Tf
-(The) 15.4918 Tj
--305 TJm
-(sorting) 27.6761 Tj
--304 TJm
-(phase) 22.6848 Tj
--305 TJm
-(of) 8.29885 Tj
--304 TJm
-(compression) 50.3609 Tj
--305 TJm
-(g) 4.9813 Tj
-5 TJm
-(athers) 23.7907 Tj
--304 TJm
-(together) 32.6474 Tj
--305 TJm
-(similar) 27.6761 Tj
--304 TJm
-(strings) 26.5703 Tj
--305 TJm
-(in) 7.7509 Tj
--304 TJm
-(the) 12.1743 Tj
--305 TJm
-(\002le.) 15.2229 Tj
--947 TJm
-(Because) 33.1954 Tj
--305 TJm
-(of) 8.29885 Tj
--304 TJm
-(this,) 16.8866 Tj
--319 TJm
-(\002les) 16.6077 Tj
--304 TJm
-(containing) 42.0621 Tj
--305 TJm
-(v) 4.9813 Tj
-15 TJm
-(ery) 12.7222 Tj
-72 88.5534 Td
-(long) 17.7135 Tj
--286 TJm
-(runs) 17.1556 Tj
--285 TJm
-(of) 8.29885 Tj
--286 TJm
-(repeated) 33.7433 Tj
--285 TJm
-(symbols,) 35.706 Tj
--295 TJm
-(lik) 10.5205 Tj
-10 TJm
-(e) 4.42339 Tj
--286 TJm
-("aabaabaabaab) 59.3771 Tj
--285 TJm
-(...") 11.5367 Tj
--571 TJm
-(\(repeated) 37.0609 Tj
--286 TJm
-(se) 8.29885 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(eral) 14.9339 Tj
--286 TJm
-(hundred) 32.6474 Tj
--285 TJm
-(times\)) 24.9065 Tj
--286 TJm
-(may) 17.1556 Tj
--286 TJm
-(com) 17.1556 Tj
-1 TJm
-(press) 20.4731 Tj
--286 TJm
-(more) 20.4731 Tj
--286 TJm
-(slo) 11.6264 Tj
-25 TJm
-(wly) 14.9439 Tj
-72 76.5983 Td
-(than) 17.1556 Tj
--322 TJm
-(normal.) 30.7147 Tj
--524 TJm
-(V) 7.193 Tj
-111 TJm
-(ersions) 28.224 Tj
--322 TJm
-(0.9.5) 19.9252 Tj
--321 TJm
-(and) 14.386 Tj
--322 TJm
-(abo) 14.386 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--322 TJm
-(f) 3.31755 Tj
-10 TJm
-(are) 12.1643 Tj
--321 TJm
-(much) 22.1369 Tj
--322 TJm
-(better) 22.6848 Tj
--321 TJm
-(than) 17.1556 Tj
--322 TJm
-(pre) 12.7222 Tj
-25 TJm
-(vious) 21.589 Tj
--321 TJm
-(v) 4.9813 Tj
-15 TJm
-(ersions) 28.224 Tj
--322 TJm
-(in) 7.7509 Tj
--322 TJm
-(this) 14.396 Tj
--321 TJm
-(respect.) 30.7047 Tj
--1050 TJm
-(The) 15.4918 Tj
--321 TJm
-(ratio) 18.2614 Tj
--322 TJm
-(between) 33.1954 Tj
-[1 0 0 1 72 50.8518] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 374.394 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.8541] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 43.0633 -6.7545] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -496.332 -50.9514] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-539.395 50.9514 Td
-/F130_0 9.9626 Tf
-(6) 4.9813 Tj
-[1 0 0 1 453.269 50.8518] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 93.5985 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.2765 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-Q
-showpage
-%%PageTrailer
-pdfEndPage
-%%Page: 10 10
-%%BeginPageSetup
-%%PageOrientation: Portrait
-pdfStartPage
-0 0 612 792 re W
-%%EndPageSetup
-[] 0 d
-1 i
-0 j
-0 J
-10 M
-1 w
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-false op
-false OP
-0 0 612 792 re
-W
-q
-[1 0 0 1 72 741.554] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 14.4459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 187.197 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 -8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 105.519 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -371.59 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-477.109 749.245 Td
-/F130_0 9.9626 Tf
-(Ho) 12.1743 Tj
-25 TJm
-(w) 7.193 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(use) 13.2801 Tj
--250 TJm
-(bzip2) 22.1369 Tj
-[1 0 0 1 266.071 747.089] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 280.796 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.974 -5.0363] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -0.4981] cm
-q
-[] 0 d
-0 J
-0.4981 w
-0 0.2491 m
-475.465 0.2491 l
-S
-Q
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 479.251 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -540 -741.554] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 710.037 Td
-/F130_0 9.9626 Tf
-(w) 7.193 Tj
-10 TJm
-(orst-case) 35.4071 Tj
--289 TJm
-(and) 14.386 Tj
--290 TJm
-(a) 4.42339 Tj
-20 TJm
-(v) 4.9813 Tj
-15 TJm
-(erage-case) 42.0322 Tj
--289 TJm
-(compression) 50.3609 Tj
--290 TJm
-(time) 17.7135 Tj
--289 TJm
-(is) 6.64505 Tj
--290 TJm
-(in) 7.7509 Tj
--289 TJm
-(the) 12.1743 Tj
--290 TJm
-(re) 7.74094 Tj
-15 TJm
-(gion) 17.7135 Tj
--289 TJm
-(of) 8.29885 Tj
--289 TJm
-(10:1.) 20.2042 Tj
--857 TJm
-(F) 5.53921 Tj
-15 TJm
-(or) 8.29885 Tj
--290 TJm
-(pre) 12.7222 Tj
-25 TJm
-(vious) 21.589 Tj
--289 TJm
-(v) 4.9813 Tj
-15 TJm
-(ersions,) 30.7147 Tj
--299 TJm
-(this) 14.396 Tj
--290 TJm
-(\002gure) 23.2427 Tj
--289 TJm
-(w) 7.193 Tj
-10 TJm
-(as) 8.29885 Tj
--290 TJm
-(more) 20.4731 Tj
-72 698.082 Td
-(lik) 10.5205 Tj
-10 TJm
-(e) 4.42339 Tj
--250 TJm
-(100:1.) 25.1855 Tj
--620 TJm
-(Y) 7.193 Tj
-110 TJm
-(ou) 9.9626 Tj
--250 TJm
-(can) 13.8281 Tj
--250 TJm
-(use) 13.2801 Tj
--250 TJm
-(the) 12.1743 Tj
-[1 0 0 1 186.002 698.082] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -186.002 -698.082] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-186.002 698.082 Td
-/F134_0 9.9626 Tf
-(-vvvv) 29.8878 Tj
-[1 0 0 1 215.889 698.082] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -215.889 -698.082] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-218.38 698.082 Td
-/F130_0 9.9626 Tf
-(option) 25.4644 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(monitor) 31.5516 Tj
--250 TJm
-(progress) 33.7533 Tj
--250 TJm
-(in) 7.7509 Tj
--250 TJm
-(great) 19.9152 Tj
--250 TJm
-(detail,) 24.6275 Tj
--250 TJm
-(if) 6.08715 Tj
--250 TJm
-(you) 14.9439 Tj
--250 TJm
-(w) 7.193 Tj
-10 TJm
-(ant.) 14.6649 Tj
-[1 0 0 1 72 695.925] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -685.963] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 676.164 Td
-/F130_0 9.9626 Tf
-(Decompression) 61.9773 Tj
--250 TJm
-(speed) 22.6848 Tj
--250 TJm
-(is) 6.64505 Tj
--250 TJm
-(unaf) 17.7035 Tj
-25 TJm
-(fected) 24.3386 Tj
--250 TJm
-(by) 9.9626 Tj
--250 TJm
-(these) 20.4731 Tj
--250 TJm
-(phenomena.) 48.4182 Tj
-[1 0 0 1 72 674.007] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -664.045] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 654.247 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 101.888 654.247] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -101.888 -654.247] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-104.863 654.247 Td
-/F130_0 9.9626 Tf
-(usually) 28.782 Tj
--299 TJm
-(allocates) 34.8591 Tj
--298 TJm
-(se) 8.29885 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(eral) 14.9339 Tj
--299 TJm
-(me) 12.1743 Tj
-15 TJm
-(g) 4.9813 Tj
-5 TJm
-(abytes) 25.4544 Tj
--298 TJm
-(of) 8.29885 Tj
--299 TJm
-(memory) 33.2053 Tj
--299 TJm
-(to) 7.7509 Tj
--298 TJm
-(operate) 29.3199 Tj
--299 TJm
-(in,) 10.2416 Tj
--311 TJm
-(and) 14.386 Tj
--298 TJm
-(then) 17.1556 Tj
--299 TJm
-(char) 17.1456 Tj
-18 TJm
-(ges) 13.2801 Tj
--298 TJm
-(all) 9.9626 Tj
--299 TJm
-(o) 4.9813 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(er) 7.74094 Tj
--299 TJm
-(it) 5.53921 Tj
--298 TJm
-(in) 7.7509 Tj
--299 TJm
-(a) 4.42339 Tj
--298 TJm
-(f) 3.31755 Tj
-10 TJm
-(airly) 18.2614 Tj
--299 TJm
-(random) 30.4357 Tj
-72 642.291 Td
-(f) 3.31755 Tj
-10 TJm
-(ashion.) 28.503 Tj
--743 TJm
-(This) 17.7135 Tj
--270 TJm
-(means) 25.4544 Tj
--271 TJm
-(that) 14.9439 Tj
--270 TJm
-(performance,) 52.8317 Tj
--276 TJm
-(both) 17.7135 Tj
--270 TJm
-(for) 11.6164 Tj
--271 TJm
-(compressing) 50.3609 Tj
--270 TJm
-(and) 14.386 Tj
--271 TJm
-(decompressing,) 62.2563 Tj
--275 TJm
-(is) 6.64505 Tj
--271 TJm
-(lar) 10.5105 Tj
-18 TJm
-(gely) 17.1556 Tj
--270 TJm
-(determined) 44.8217 Tj
--271 TJm
-(by) 9.9626 Tj
--270 TJm
-(the) 12.1743 Tj
--271 TJm
-(speed) 22.6848 Tj
-72 630.336 Td
-(at) 7.193 Tj
--294 TJm
-(which) 24.3486 Tj
--294 TJm
-(your) 18.2614 Tj
--294 TJm
-(machine) 33.7533 Tj
--295 TJm
-(ca) 8.84679 Tj
-1 TJm
-(n) 4.9813 Tj
--295 TJm
-(service) 28.2141 Tj
--294 TJm
-(cache) 22.6749 Tj
--294 TJm
-(misses.) 29.0609 Tj
--442 TJm
-(Because) 33.1954 Tj
--294 TJm
-(of) 8.29885 Tj
--294 TJm
-(this,) 16.8866 Tj
--306 TJm
-(small) 21.589 Tj
--294 TJm
-(changes) 32.0895 Tj
--294 TJm
-(to) 7.7509 Tj
--294 TJm
-(the) 12.1743 Tj
--294 TJm
-(code) 18.8094 Tj
--294 TJm
-(to) 7.7509 Tj
--294 TJm
-(reduce) 26.5503 Tj
--294 TJm
-(the) 12.1743 Tj
--295 TJm
-(miss) 18.2714 Tj
--294 TJm
-(rate) 14.9339 Tj
-72 618.381 Td
-(ha) 9.40469 Tj
-20 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--253 TJm
-(been) 18.8094 Tj
--253 TJm
-(observ) 26.5603 Tj
-15 TJm
-(ed) 9.40469 Tj
--253 TJm
-(to) 7.7509 Tj
--253 TJm
-(gi) 7.7509 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--253 TJm
-(disproportionately) 73.0557 Tj
--253 TJm
-(lar) 10.5105 Tj
-18 TJm
-(ge) 9.40469 Tj
--253 TJm
-(performance) 50.341 Tj
--253 TJm
-(impro) 23.8007 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(ements.) 30.7147 Tj
--639 TJm
-(I) 3.31755 Tj
--253 TJm
-(imagine) 32.0995 Tj
-[1 0 0 1 438.909 618.381] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -438.909 -618.381] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-438.909 618.381 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 468.796 618.381] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468.796 -618.381] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-471.318 618.381 Td
-/F130_0 9.9626 Tf
-(will) 15.5018 Tj
--253 TJm
-(perform) 32.0895 Tj
--253 TJm
-(best) 16.0497 Tj
-72 606.426 Td
-(on) 9.9626 Tj
--250 TJm
-(machines) 37.6287 Tj
--250 TJm
-(with) 17.7135 Tj
--250 TJm
-(v) 4.9813 Tj
-15 TJm
-(ery) 12.7222 Tj
--250 TJm
-(lar) 10.5105 Tj
-18 TJm
-(ge) 9.40469 Tj
--250 TJm
-(caches.) 29.041 Tj
-[1 0 0 1 72 604.269] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -594.306] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 571.673 Td
-/F122_0 20.6585 Tf
-(2.8.) 34.4584 Tj
--278 TJm
-(CA) 29.8309 Tj
-80 TJm
-(VEA) 42.4739 Tj
-90 TJm
-(TS) 26.4016 Tj
-[1 0 0 1 72 571.415] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -561.452] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 549.755 Td
-/F130_0 9.9626 Tf
-(I/O) 13.2801 Tj
--268 TJm
-(error) 19.3573 Tj
--267 TJm
-(messages) 37.6287 Tj
--268 TJm
-(are) 12.1643 Tj
--268 TJm
-(not) 12.7322 Tj
--268 TJm
-(as) 8.29885 Tj
--267 TJm
-(helpful) 28.224 Tj
--268 TJm
-(as) 8.29885 Tj
--268 TJm
-(the) 12.1743 Tj
-15 TJm
-(y) 4.9813 Tj
--267 TJm
-(could) 22.1369 Tj
--268 TJm
-(be.) 11.8953 Tj
-[1 0 0 1 293.313 549.755] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -293.313 -549.755] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-293.313 549.755 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 323.201 549.755] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -323.201 -549.755] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-325.868 549.755 Td
-/F130_0 9.9626 Tf
-(tries) 17.1556 Tj
--268 TJm
-(hard) 17.7035 Tj
--267 TJm
-(to) 7.7509 Tj
--268 TJm
-(detect) 23.7907 Tj
--268 TJm
-(I/O) 13.2801 Tj
--268 TJm
-(errors) 23.2328 Tj
--267 TJm
-(and) 14.386 Tj
--268 TJm
-(e) 4.42339 Tj
-15 TJm
-(xit) 10.5205 Tj
--268 TJm
-(cleanly) 28.772 Tj
-65 TJm
-(,) 2.49065 Tj
--272 TJm
-(b) 4.9813 Tj
-20 TJm
-(ut) 7.7509 Tj
--268 TJm
-(the) 12.1743 Tj
-72 537.8 Td
-(details) 26.0123 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(what) 19.3673 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(problem) 33.2053 Tj
--250 TJm
-(is) 6.64505 Tj
--250 TJm
-(sometimes) 42.62 Tj
--250 TJm
-(seem) 20.4731 Tj
--250 TJm
-(rather) 23.2328 Tj
--250 TJm
-(misleading.) 46.2165 Tj
-[1 0 0 1 72 535.643] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -525.681] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 515.882 Td
-/F130_0 9.9626 Tf
-(This) 17.7135 Tj
--280 TJm
-(manual) 29.3299 Tj
--279 TJm
-(page) 18.8094 Tj
--280 TJm
-(pertains) 31.5416 Tj
--280 TJm
-(to) 7.7509 Tj
--279 TJm
-(v) 4.9813 Tj
-15 TJm
-(ersion) 24.3486 Tj
--280 TJm
-(1.0.5) 19.9252 Tj
--280 TJm
-(of) 8.29885 Tj
-[1 0 0 1 256.84 515.882] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -256.84 -515.882] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-256.84 515.882 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 286.728 515.882] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -286.728 -515.882] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-286.728 515.882 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
--798 TJm
-(Compressed) 49.2551 Tj
--280 TJm
-(data) 16.5977 Tj
--279 TJm
-(created) 28.762 Tj
--280 TJm
-(by) 9.9626 Tj
--280 TJm
-(this) 14.396 Tj
--279 TJm
-(v) 4.9813 Tj
-15 TJm
-(ersion) 24.3486 Tj
--280 TJm
-(is) 6.64505 Tj
--280 TJm
-(entirely) 30.4357 Tj
--279 TJm
-(forw) 18.8094 Tj
-10 TJm
-(ards) 16.5977 Tj
-72 503.927 Td
-(and) 14.386 Tj
--294 TJm
-(backw) 26.0024 Tj
-10 TJm
-(ards) 16.5977 Tj
--293 TJm
-(compatible) 44.2738 Tj
--294 TJm
-(with) 17.7135 Tj
--294 TJm
-(the) 12.1743 Tj
--293 TJm
-(pre) 12.7222 Tj
-25 TJm
-(vious) 21.589 Tj
--294 TJm
-(public) 24.9065 Tj
--294 TJm
-(releases,) 34.0223 Tj
--304 TJm
-(v) 4.9813 Tj
-15 TJm
-(ersions) 28.224 Tj
--294 TJm
-(0.1pl2,) 27.6761 Tj
--305 TJm
-(0.9.0) 19.9252 Tj
--293 TJm
-(and) 14.386 Tj
--294 TJm
-(0.9.5,) 22.4159 Tj
--305 TJm
-(1.0.0,) 22.4159 Tj
--304 TJm
-(1.0.1,) 22.4159 Tj
--305 TJm
-(1.0.2) 19.9252 Tj
--294 TJm
-(and) 14.386 Tj
-72 491.972 Td
-(1.0.3,) 22.4159 Tj
--263 TJm
-(b) 4.9813 Tj
-20 TJm
-(ut) 7.7509 Tj
--260 TJm
-(with) 17.7135 Tj
--260 TJm
-(the) 12.1743 Tj
--260 TJm
-(follo) 18.8194 Tj
-25 TJm
-(wing) 19.9252 Tj
--260 TJm
-(e) 4.42339 Tj
-15 TJm
-(xception:) 37.0808 Tj
--330 TJm
-(0.9.0) 19.9252 Tj
--260 TJm
-(and) 14.386 Tj
--260 TJm
-(abo) 14.386 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--260 TJm
-(can) 13.8281 Tj
--260 TJm
-(correctly) 35.4071 Tj
--260 TJm
-(decompress) 47.0334 Tj
--260 TJm
-(multiple) 33.2153 Tj
--260 TJm
-(concatenated) 52.0048 Tj
--260 TJm
-(compressed) 47.0334 Tj
-72 480.017 Td
-(\002les.) 19.0983 Tj
--310 TJm
-(0.1pl2) 25.1855 Tj
--250 TJm
-(cannot) 26.5603 Tj
--250 TJm
-(do) 9.9626 Tj
--250 TJm
-(this;) 17.1656 Tj
--250 TJm
-(it) 5.53921 Tj
--250 TJm
-(will) 15.5018 Tj
--250 TJm
-(stop) 16.6077 Tj
--250 TJm
-(after) 18.2515 Tj
--250 TJm
-(decompressing) 59.7656 Tj
--250 TJm
-(just) 14.396 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(\002rst) 15.5018 Tj
--250 TJm
-(\002le) 12.7322 Tj
--250 TJm
-(in) 7.7509 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(stream.) 29.0509 Tj
-[1 0 0 1 72 477.86] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -467.897] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 458.099 Td
-/F134_0 9.9626 Tf
-(bzip2recover) 71.7307 Tj
-[1 0 0 1 143.731 458.099] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -143.731 -458.099] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-146.174 458.099 Td
-/F130_0 9.9626 Tf
-(v) 4.9813 Tj
-15 TJm
-(ersions) 28.224 Tj
--245 TJm
-(prior) 19.3673 Tj
--245 TJm
-(to) 7.7509 Tj
--245 TJm
-(1.0.2) 19.9252 Tj
--246 TJm
-(used) 18.2614 Tj
--245 TJm
-(32-bit) 23.8007 Tj
--245 TJm
-(inte) 14.9439 Tj
-15 TJm
-(gers) 16.5977 Tj
--245 TJm
-(to) 7.7509 Tj
--245 TJm
-(represent) 36.5129 Tj
--245 TJm
-(bit) 10.5205 Tj
--246 TJm
-(positions) 35.9849 Tj
--245 TJm
-(in) 7.7509 Tj
--245 TJm
-(compressed) 47.0334 Tj
--245 TJm
-(\002les,) 19.0983 Tj
--246 TJm
-(so) 8.85675 Tj
--245 TJm
-(it) 5.53921 Tj
--245 TJm
-(could) 22.1369 Tj
-72 446.144 Td
-(not) 12.7322 Tj
--384 TJm
-(handle) 26.5603 Tj
--383 TJm
-(compressed) 47.0334 Tj
--384 TJm
-(\002les) 16.6077 Tj
--383 TJm
-(more) 20.4731 Tj
--384 TJm
-(than) 17.1556 Tj
--383 TJm
-(512) 14.9439 Tj
--384 TJm
-(me) 12.1743 Tj
-15 TJm
-(g) 4.9813 Tj
-5 TJm
-(abytes) 25.4544 Tj
--383 TJm
-(long.) 20.2042 Tj
--1421 TJm
-(V) 7.193 Tj
-111 TJm
-(ersions) 28.224 Tj
--384 TJm
-(1.0.2) 19.9252 Tj
--383 TJm
-(and) 14.386 Tj
--384 TJm
-(abo) 14.386 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--384 TJm
-(use) 13.2801 Tj
--383 TJm
-(64-bit) 23.8007 Tj
--384 TJm
-(ints) 14.396 Tj
--383 TJm
-(on) 9.9626 Tj
--384 TJm
-(some) 21.031 Tj
-72 434.189 Td
-(platforms) 38.1866 Tj
--245 TJm
-(which) 24.3486 Tj
--246 TJm
-(support) 29.8878 Tj
--245 TJm
-(them) 19.9252 Tj
--246 TJm
-(\(GNU) 24.8965 Tj
--245 TJm
-(supported) 39.2925 Tj
--245 TJm
-(tar) 10.5105 Tj
-18 TJm
-(gets,) 18.5404 Tj
--247 TJm
-(and) 14.386 Tj
--245 TJm
-(W) 9.40469 Tj
-40 TJm
-(indo) 17.7135 Tj
-25 TJm
-(ws\).) 16.8766 Tj
--309 TJm
-(T) 6.08715 Tj
-80 TJm
-(o) 4.9813 Tj
--245 TJm
-(establish) 34.8691 Tj
--245 TJm
-(whether) 32.0895 Tj
--246 TJm
-(or) 8.29885 Tj
--245 TJm
-(not) 12.7322 Tj
-[1 0 0 1 468.269 434.189] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468.269 -434.189] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-468.269 434.189 Td
-/F134_0 9.9626 Tf
-(bzip2recover) 71.7307 Tj
-[1 0 0 1 540 434.189] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -540 -434.189] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 422.233 Td
-/F130_0 9.9626 Tf
-(w) 7.193 Tj
-10 TJm
-(as) 8.29885 Tj
--255 TJm
-(b) 4.9813 Tj
-20 TJm
-(uilt) 13.2901 Tj
--255 TJm
-(with) 17.7135 Tj
--255 TJm
-(such) 18.2614 Tj
--255 TJm
-(a) 4.42339 Tj
--255 TJm
-(limitation,) 41.2452 Tj
--256 TJm
-(run) 13.2801 Tj
--255 TJm
-(it) 5.53921 Tj
--255 TJm
-(without) 30.4457 Tj
--255 TJm
-(ar) 7.74094 Tj
-18 TJm
-(guments.) 36.2539 Tj
--325 TJm
-(In) 8.29885 Tj
--255 TJm
-(an) 9.40469 Tj
-15 TJm
-(y) 4.9813 Tj
--256 TJm
-(e) 4.42339 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(ent) 12.1743 Tj
--255 TJm
-(you) 14.9439 Tj
--255 TJm
-(can) 13.8281 Tj
--255 TJm
-(b) 4.9813 Tj
-20 TJm
-(uild) 15.5018 Tj
--255 TJm
-(yourself) 32.6474 Tj
--255 TJm
-(an) 9.40469 Tj
--255 TJm
-(unlimited) 38.1966 Tj
--255 TJm
-(v) 4.9813 Tj
-15 TJm
-(ersion) 24.3486 Tj
--255 TJm
-(if) 6.08715 Tj
-72 410.278 Td
-(you) 14.9439 Tj
--250 TJm
-(can) 13.8281 Tj
--250 TJm
-(recompile) 39.8404 Tj
--250 TJm
-(it) 5.53921 Tj
--250 TJm
-(with) 17.7135 Tj
-[1 0 0 1 176.318 410.278] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -176.318 -410.278] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-176.318 410.278 Td
-/F134_0 9.9626 Tf
-(MaybeUInt64) 65.7532 Tj
-[1 0 0 1 242.071 410.278] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -242.071 -410.278] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-244.562 410.278 Td
-/F130_0 9.9626 Tf
-(set) 11.0684 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(be) 9.40469 Tj
--250 TJm
-(an) 9.40469 Tj
--250 TJm
-(unsigned) 35.9749 Tj
--250 TJm
-(64-bit) 23.8007 Tj
--250 TJm
-(inte) 14.9439 Tj
-15 TJm
-(ger) 12.7222 Tj
-55 TJm
-(.) 2.49065 Tj
-[1 0 0 1 72 408.121] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -398.159] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 375.525 Td
-/F122_0 20.6585 Tf
-(2.9.) 34.4584 Tj
--278 TJm
-(A) 14.9154 Tj
-50 TJm
-(UTHOR) 73.441 Tj
-[1 0 0 1 72 375.267] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -365.305] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 353.608 Td
-/F130_0 9.9626 Tf
-(Julian) 23.8007 Tj
--250 TJm
-(Se) 9.9626 Tj
-25 TJm
-(w) 7.193 Tj
-10 TJm
-(ard,) 15.2129 Tj
-[1 0 0 1 132.801 353.608] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -132.801 -353.608] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-132.801 353.608 Td
-/F134_0 9.9626 Tf
-(jseward@bzip.org) 95.641 Tj
-[1 0 0 1 228.443 353.608] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -156.443 -1.5342] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -342.111] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 331.69 Td
-/F130_0 9.9626 Tf
-(The) 15.4918 Tj
--299 TJm
-(ideas) 20.4731 Tj
--300 TJm
-(embodied) 39.2925 Tj
--299 TJm
-(in) 7.7509 Tj
-[1 0 0 1 166.942 331.69] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -166.942 -331.69] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-166.942 331.69 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 196.83 331.69] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -196.83 -331.69] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-199.813 331.69 Td
-/F130_0 9.9626 Tf
-(are) 12.1643 Tj
--299 TJm
-(due) 14.386 Tj
--300 TJm
-(to) 7.7509 Tj
--299 TJm
-(\(at) 10.5105 Tj
--300 TJm
-(least\)) 21.579 Tj
--299 TJm
-(the) 12.1743 Tj
--300 TJm
-(follo) 18.8194 Tj
-25 TJm
-(wing) 19.9252 Tj
--299 TJm
-(people:) 29.3299 Tj
--409 TJm
-(Michael) 32.6474 Tj
--300 TJm
-(Burro) 23.2427 Tj
-25 TJm
-(ws) 11.0684 Tj
--299 TJm
-(and) 14.386 Tj
--299 TJm
-(Da) 11.6164 Tj
-20 TJm
-(vid) 12.7322 Tj
--300 TJm
-(Wheeler) 33.7433 Tj
--299 TJm
-(\(for) 14.9339 Tj
-72 319.735 Td
-(the) 12.1743 Tj
--312 TJm
-(block) 22.1369 Tj
--313 TJm
-(sorting) 27.6761 Tj
--312 TJm
-(transformation\),) 64.468 Tj
--328 TJm
-(Da) 11.6164 Tj
-20 TJm
-(vid) 12.7322 Tj
--312 TJm
-(Wheeler) 33.7433 Tj
--313 TJm
-(\(ag) 12.7222 Tj
-5 TJm
-(ain,) 14.6649 Tj
--327 TJm
-(for) 11.6164 Tj
--313 TJm
-(the) 12.1743 Tj
--312 TJm
-(Huf) 15.4918 Tj
-25 TJm
-(fman) 20.4731 Tj
--312 TJm
-(coder\),) 27.9351 Tj
--328 TJm
-(Peter) 20.4731 Tj
--313 TJm
-(Fenwick) 34.3112 Tj
--312 TJm
-(\(for) 14.9339 Tj
--312 TJm
-(the) 12.1743 Tj
--313 TJm
-(structured) 39.8404 Tj
-72 307.78 Td
-(coding) 27.1182 Tj
--325 TJm
-(model) 24.9065 Tj
--326 TJm
-(in) 7.7509 Tj
--325 TJm
-(the) 12.1743 Tj
--326 TJm
-(original) 30.9936 Tj
-[1 0 0 1 191.156 307.779] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -191.156 -307.779] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-191.156 307.779 Td
-/F134_0 9.9626 Tf
-(bzip) 23.9102 Tj
-[1 0 0 1 215.067 307.779] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -215.067 -307.779] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-215.067 307.779 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--344 TJm
-(and) 14.386 Tj
--326 TJm
-(man) 17.1556 Tj
-15 TJm
-(y) 4.9813 Tj
--325 TJm
-(re\002nements\),) 52.2937 Tj
--345 TJm
-(and) 14.386 Tj
--325 TJm
-(Alistair) 29.8878 Tj
--326 TJm
-(Mof) 17.1556 Tj
-25 TJm
-(f) 3.31755 Tj
-10 TJm
-(at,) 9.68365 Tj
--344 TJm
-(Radford) 32.6474 Tj
--325 TJm
-(Neal) 18.8094 Tj
--326 TJm
-(and) 14.386 Tj
--325 TJm
-(Ian) 12.7222 Tj
--326 TJm
-(W) 9.40469 Tj
-40 TJm
-(itten) 17.7135 Tj
--325 TJm
-(\(for) 14.9339 Tj
-72 295.824 Td
-(the) 12.1743 Tj
--277 TJm
-(arithmetic) 40.3983 Tj
--277 TJm
-(coder) 22.1269 Tj
--277 TJm
-(in) 7.7509 Tj
--277 TJm
-(the) 12.1743 Tj
--277 TJm
-(original) 30.9936 Tj
-[1 0 0 1 214.171 295.824] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -214.171 -295.824] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-214.171 295.824 Td
-/F134_0 9.9626 Tf
-(bzip) 23.9102 Tj
-[1 0 0 1 238.082 295.824] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -238.082 -295.824] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-238.082 295.824 Td
-/F130_0 9.9626 Tf
-(\).) 5.8082 Tj
--782 TJm
-(I) 3.31755 Tj
--277 TJm
-(am) 12.1743 Tj
--276 TJm
-(much) 22.1369 Tj
--277 TJm
-(indebted) 34.3112 Tj
--277 TJm
-(for) 11.6164 Tj
--277 TJm
-(their) 18.2614 Tj
--277 TJm
-(help,) 19.6462 Tj
--284 TJm
-(support) 29.8878 Tj
--277 TJm
-(and) 14.386 Tj
--277 TJm
-(advice.) 28.493 Tj
--781 TJm
-(See) 14.386 Tj
--277 TJm
-(the) 12.1743 Tj
--277 TJm
-(manual) 29.3299 Tj
-72 283.869 Td
-(in) 7.7509 Tj
--330 TJm
-(the) 12.1743 Tj
--330 TJm
-(source) 26.0024 Tj
--330 TJm
-(distrib) 25.4644 Tj
-20 TJm
-(ution) 20.4831 Tj
--330 TJm
-(for) 11.6164 Tj
--329 TJm
-(pointers) 32.0995 Tj
--330 TJm
-(to) 7.7509 Tj
--330 TJm
-(sources) 29.8778 Tj
--330 TJm
-(of) 8.29885 Tj
--330 TJm
-(documentation.) 61.7083 Tj
--1099 TJm
-(Christian) 36.5329 Tj
--330 TJm
-(v) 4.9813 Tj
-20 TJm
-(on) 9.9626 Tj
--330 TJm
-(Roques) 29.8878 Tj
--330 TJm
-(encouraged) 45.9176 Tj
--330 TJm
-(me) 12.1743 Tj
--330 TJm
-(to) 7.7509 Tj
--330 TJm
-(look) 17.7135 Tj
-72 271.914 Td
-(for) 11.6164 Tj
--271 TJm
-(f) 3.31755 Tj
-10 TJm
-(aster) 18.8094 Tj
--271 TJm
-(sorting) 27.6761 Tj
--271 TJm
-(algorithms,) 45.1107 Tj
--276 TJm
-(so) 8.85675 Tj
--272 TJm
-(as) 8.29885 Tj
--271 TJm
-(to) 7.7509 Tj
--271 TJm
-(speed) 22.6848 Tj
--271 TJm
-(up) 9.9626 Tj
--271 TJm
-(compression.) 52.8516 Tj
--746 TJm
-(Bela) 18.2614 Tj
--271 TJm
-(Lubkin) 28.782 Tj
--271 TJm
-(encouraged) 45.9176 Tj
--271 TJm
-(me) 12.1743 Tj
--272 TJm
-(to) 7.7509 Tj
--271 TJm
-(impro) 23.8007 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--271 TJm
-(the) 12.1743 Tj
--271 TJm
-(w) 7.193 Tj
-10 TJm
-(orst-case) 35.4071 Tj
-72 259.959 Td
-(compression) 50.3609 Tj
--340 TJm
-(performance.) 52.8317 Tj
--580 TJm
-(Donna) 26.5603 Tj
--339 TJm
-(Robinson) 38.1966 Tj
--340 TJm
-(XMLised) 38.1866 Tj
--340 TJm
-(the) 12.1743 Tj
--340 TJm
-(documentation.) 61.7083 Tj
--580 TJm
-(Man) 18.2614 Tj
-15 TJm
-(y) 4.9813 Tj
--340 TJm
-(people) 26.5603 Tj
--340 TJm
-(sent) 16.0497 Tj
--339 TJm
-(patches,) 32.3685 Tj
--363 TJm
-(helped) 26.5603 Tj
--340 TJm
-(with) 17.7135 Tj
-72 248.004 Td
-(portability) 41.5142 Tj
--250 TJm
-(problems,) 39.5714 Tj
--250 TJm
-(lent) 14.9439 Tj
--250 TJm
-(machines,) 40.1194 Tj
--250 TJm
-(g) 4.9813 Tj
-5 TJm
-(a) 4.42339 Tj
-20 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--250 TJm
-(advice) 26.0024 Tj
--250 TJm
-(and) 14.386 Tj
--250 TJm
-(were) 19.3573 Tj
--250 TJm
-(generally) 37.0708 Tj
--250 TJm
-(helpful.) 30.7147 Tj
-[1 0 0 1 72 245.847] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 0 -194.995] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 374.394 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.5851] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 43.0633 -6.4855] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -496.332 -50.9514] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-539.395 50.9514 Td
-/F130_0 9.9626 Tf
-(7) 4.9813 Tj
-[1 0 0 1 453.269 50.8518] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 93.5985 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.2765 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-Q
-showpage
-%%PageTrailer
-pdfEndPage
-%%Page: 11 11
-%%BeginPageSetup
-%%PageOrientation: Portrait
-pdfStartPage
-0 0 612 792 re W
-%%EndPageSetup
-[] 0 d
-1 i
-0 j
-0 J
-10 M
-1 w
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-false op
-false OP
-0 0 612 792 re
-W
-q
-[1 0 0 1 72 741.554] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 4.3836 14.4459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 187.197 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 141.643 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -141.643 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 280.796 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.974 -13.9477] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -0.4981] cm
-q
-[] 0 d
-0 J
-0.4981 w
-0 0.2491 m
-475.465 0.2491 l
-S
-Q
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 479.251 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -15.0365 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -21.5542] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -720] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 701.916 Td
-/F122_0 24.7902 Tf
-(3.) 20.675 Tj
--556 TJm
-(Pr) 26.1785 Tj
-20 TJm
-(ogramming) 134.983 Tj
--278 TJm
-(with) 49.5804 Tj
-[1 0 0 1 330.484 701.916] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -330.484 -701.916] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-330.484 701.916 Td
-/F392_0 24.7902 Tf
-(libbzip2) 118.993 Tj
-[1 0 0 1 449.477 701.916] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -377.477 -5.5156] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -14.9439] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -671.493] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 656.35 Td
-/F122_0 17.2154 Tf
-(T) 10.5186 Tj
-80 TJm
-(ab) 20.0904 Tj
-10 TJm
-(le) 14.3576 Tj
--278 TJm
-(of) 16.2513 Tj
--278 TJm
-(Contents) 74.5943 Tj
-[1 0 0 1 72 647.528] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -11.7401] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -635.788] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 635.788 Td
-/F130_0 9.9626 Tf
-(3.1.) 14.9439 Tj
--310 TJm
-(T) 6.08715 Tj
-80 TJm
-(op-le) 20.4731 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(el) 7.193 Tj
--250 TJm
-(structure) 34.8591 Tj
-[1 0 0 1 164.921 635.788] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -169.902 -635.788] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-179.997 635.788 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 511.108 635.788] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -511.108 -635.788] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-511.108 635.788 Td
-/F130_0 9.9626 Tf
-(8) 4.9813 Tj
-[1 0 0 1 516.09 635.788] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7983] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -623.832] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 623.832 Td
-/F130_0 9.9626 Tf
-(3.1.1.) 22.4159 Tj
--310 TJm
-(Lo) 11.0684 Tj
-25 TJm
-(w-le) 17.7035 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(el) 7.193 Tj
--250 TJm
-(summary) 37.0808 Tj
-[1 0 0 1 177.374 623.832] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -182.355 -623.832] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-192.866 623.832 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 511.108 623.832] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -511.108 -623.832] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-511.108 623.832 Td
-/F130_0 9.9626 Tf
-(9) 4.9813 Tj
-[1 0 0 1 516.09 623.832] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1569] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7983] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -611.877] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 611.877 Td
-/F130_0 9.9626 Tf
-(3.1.2.) 22.4159 Tj
--310 TJm
-(High-le) 30.4357 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(el) 7.193 Tj
--250 TJm
-(summary) 37.0808 Tj
-[1 0 0 1 179.287 611.877] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -184.268 -611.877] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-193.822 611.877 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 511.108 611.877] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -511.108 -611.877] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-511.108 611.877 Td
-/F130_0 9.9626 Tf
-(9) 4.9813 Tj
-[1 0 0 1 516.09 611.877] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7984] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -599.922] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 599.922 Td
-/F130_0 9.9626 Tf
-(3.1.3.) 22.4159 Tj
--310 TJm
-(Utility) 26.0223 Tj
--250 TJm
-(functions) 37.0808 Tj
--250 TJm
-(summary) 37.0808 Tj
-[1 0 0 1 202.669 599.922] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -207.65 -599.922] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-216.582 599.922 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 511.108 599.922] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -511.108 -599.922] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-511.108 599.922 Td
-/F130_0 9.9626 Tf
-(9) 4.9813 Tj
-[1 0 0 1 516.09 599.922] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7983] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -587.967] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 587.967 Td
-/F130_0 9.9626 Tf
-(3.2.) 14.9439 Tj
--310 TJm
-(Error) 21.0211 Tj
--250 TJm
-(handling) 34.8691 Tj
-[1 0 0 1 148.413 587.967] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -153.394 -587.967] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-162.611 587.967 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 587.967] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -587.967] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 587.967 Td
-/F130_0 9.9626 Tf
-(10) 9.9626 Tj
-[1 0 0 1 516.09 587.967] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1569] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7983] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -576.012] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 576.012 Td
-/F130_0 9.9626 Tf
-(3.3.) 14.9439 Tj
--310 TJm
-(Lo) 11.0684 Tj
-25 TJm
-(w-le) 17.7035 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(el) 7.193 Tj
--250 TJm
-(interf) 21.579 Tj
-10 TJm
-(ace) 13.2702 Tj
-[1 0 0 1 167.571 576.012] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -172.552 -576.012] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-181.045 576.012 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 576.012] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -576.012] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 576.012 Td
-/F130_0 9.9626 Tf
-(11) 9.9626 Tj
-[1 0 0 1 516.09 576.012] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -0.0995] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -11.8557] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -564.056] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 564.056 Td
-/F130_0 9.9626 Tf
-(3.3.1.) 22.4159 Tj
-[1 0 0 1 97.5043 564.056] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -97.5043 -564.056] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-97.5043 564.056 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompressInit) 107.596 Tj
-[1 0 0 1 205.101 564.056] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -210.082 -564.056] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-219.736 564.056 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 564.056] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -564.056] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 564.056 Td
-/F130_0 9.9626 Tf
-(11) 9.9626 Tj
-[1 0 0 1 516.09 564.056] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -1.5341] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -10.421] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -552.101] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 552.101 Td
-/F130_0 9.9626 Tf
-(3.3.2.) 22.4159 Tj
-[1 0 0 1 97.5043 552.101] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -97.5043 -552.101] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-97.5043 552.101 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompress) 83.6858 Tj
-[1 0 0 1 181.19 552.101] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -186.172 -552.101] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-194.497 552.101 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 552.101] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -552.101] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 552.101 Td
-/F130_0 9.9626 Tf
-(13) 9.9626 Tj
-[1 0 0 1 516.09 552.101] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -1.5342] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -10.421] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -540.146] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 540.146 Td
-/F130_0 9.9626 Tf
-(3.3.3.) 22.4159 Tj
-[1 0 0 1 97.5043 540.146] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -97.5043 -540.146] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-97.5043 540.146 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompressEnd) 101.619 Tj
-[1 0 0 1 199.123 540.146] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -204.105 -540.146] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-214.533 540.146 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 540.146] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -540.146] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 540.146 Td
-/F130_0 9.9626 Tf
-(16) 9.9626 Tj
-[1 0 0 1 516.09 540.146] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -1.5342] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -10.421] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -528.191] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 528.191 Td
-/F130_0 9.9626 Tf
-(3.3.4.) 22.4159 Tj
-[1 0 0 1 97.5043 528.191] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -97.5043 -528.191] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-97.5043 528.191 Td
-/F134_0 9.9626 Tf
-(BZ2_bzDecompressInit) 119.551 Tj
-[1 0 0 1 217.056 528.191] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -222.037 -528.191] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-232.355 528.191 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 528.191] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -528.191] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 528.191 Td
-/F130_0 9.9626 Tf
-(16) 9.9626 Tj
-[1 0 0 1 516.09 528.191] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -1.5341] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -10.421] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -516.236] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 516.236 Td
-/F130_0 9.9626 Tf
-(3.3.5.) 22.4159 Tj
-[1 0 0 1 97.5043 516.236] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -97.5043 -516.236] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-97.5043 516.236 Td
-/F134_0 9.9626 Tf
-(BZ2_bzDecompress) 95.641 Tj
-[1 0 0 1 193.146 516.236] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -198.127 -516.236] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-207.116 516.236 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 516.236] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -516.236] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 516.236 Td
-/F130_0 9.9626 Tf
-(17) 9.9626 Tj
-[1 0 0 1 516.09 516.236] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -1.5342] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -10.421] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -504.281] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 504.281 Td
-/F130_0 9.9626 Tf
-(3.3.6.) 22.4159 Tj
-[1 0 0 1 97.5043 504.281] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -97.5043 -504.281] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-97.5043 504.281 Td
-/F134_0 9.9626 Tf
-(BZ2_bzDecompressEnd) 113.574 Tj
-[1 0 0 1 211.078 504.281] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -216.06 -504.281] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-224.938 504.281 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 504.281] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -504.281] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 504.281 Td
-/F130_0 9.9626 Tf
-(18) 9.9626 Tj
-[1 0 0 1 516.09 504.281] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -1.5342] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -10.421] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -492.325] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 492.325 Td
-/F130_0 9.9626 Tf
-(3.4.) 14.9439 Tj
--310 TJm
-(High-le) 30.4357 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(el) 7.193 Tj
--250 TJm
-(interf) 21.579 Tj
-10 TJm
-(ace) 13.2702 Tj
-[1 0 0 1 169.483 492.325] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -174.465 -492.325] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-184.216 492.325 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 492.325] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -492.325] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 492.325 Td
-/F130_0 9.9626 Tf
-(18) 9.9626 Tj
-[1 0 0 1 516.09 492.325] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7983] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -480.37] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 480.37 Td
-/F130_0 9.9626 Tf
-(3.4.1.) 22.4159 Tj
-[1 0 0 1 97.5043 480.37] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -97.5043 -480.37] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-97.5043 480.37 Td
-/F134_0 9.9626 Tf
-(BZ2_bzReadOpen) 83.6858 Tj
-[1 0 0 1 181.19 480.37] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -186.172 -480.37] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-194.497 480.37 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 480.37] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -480.37] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 480.37 Td
-/F130_0 9.9626 Tf
-(19) 9.9626 Tj
-[1 0 0 1 516.09 480.37] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -1.5342] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -10.421] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -468.415] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 468.415 Td
-/F130_0 9.9626 Tf
-(3.4.2.) 22.4159 Tj
-[1 0 0 1 97.5043 468.415] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -97.5043 -468.415] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-97.5043 468.415 Td
-/F134_0 9.9626 Tf
-(BZ2_bzRead) 59.7756 Tj
-[1 0 0 1 157.28 468.415] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -162.261 -468.415] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-171.472 468.415 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 468.415] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -468.415] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 468.415 Td
-/F130_0 9.9626 Tf
-(20) 9.9626 Tj
-[1 0 0 1 516.09 468.415] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -1.31] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -10.6452] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -456.46] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 456.46 Td
-/F130_0 9.9626 Tf
-(3.4.3.) 22.4159 Tj
-[1 0 0 1 97.5043 456.46] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -97.5043 -456.46] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-97.5043 456.46 Td
-/F134_0 9.9626 Tf
-(BZ2_bzReadGetUnused) 113.574 Tj
-[1 0 0 1 211.078 456.46] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -216.06 -456.46] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-224.938 456.46 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 456.46] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -456.46] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 456.46 Td
-/F130_0 9.9626 Tf
-(21) 9.9626 Tj
-[1 0 0 1 516.09 456.46] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -1.31] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -10.6452] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -444.505] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 444.505 Td
-/F130_0 9.9626 Tf
-(3.4.4.) 22.4159 Tj
-[1 0 0 1 97.5043 444.505] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -97.5043 -444.505] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-97.5043 444.505 Td
-/F134_0 9.9626 Tf
-(BZ2_bzReadClose) 89.6634 Tj
-[1 0 0 1 187.168 444.505] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -192.149 -444.505] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-201.914 444.505 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 444.505] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -444.505] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 444.505 Td
-/F130_0 9.9626 Tf
-(22) 9.9626 Tj
-[1 0 0 1 516.09 444.505] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -1.31] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -10.6451] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -432.55] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 432.55 Td
-/F130_0 9.9626 Tf
-(3.4.5.) 22.4159 Tj
-[1 0 0 1 97.5043 432.55] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -97.5043 -432.55] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-97.5043 432.55 Td
-/F134_0 9.9626 Tf
-(BZ2_bzWriteOpen) 89.6634 Tj
-[1 0 0 1 187.168 432.55] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -192.149 -432.55] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-201.914 432.55 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 432.55] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -432.55] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 432.55 Td
-/F130_0 9.9626 Tf
-(22) 9.9626 Tj
-[1 0 0 1 516.09 432.55] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -1.5342] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -10.421] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -420.594] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 420.594 Td
-/F130_0 9.9626 Tf
-(3.4.6.) 22.4159 Tj
-[1 0 0 1 97.5043 420.594] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -97.5043 -420.594] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-97.5043 420.594 Td
-/F134_0 9.9626 Tf
-(BZ2_bzWrite) 65.7532 Tj
-[1 0 0 1 163.258 420.594] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -168.239 -420.594] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-176.675 420.594 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 420.594] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -420.594] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 420.594 Td
-/F130_0 9.9626 Tf
-(23) 9.9626 Tj
-[1 0 0 1 516.09 420.594] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -1.31] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -10.6452] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -408.639] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 408.639 Td
-/F130_0 9.9626 Tf
-(3.4.7.) 22.4159 Tj
-[1 0 0 1 97.5043 408.639] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -97.5043 -408.639] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-97.5043 408.639 Td
-/F134_0 9.9626 Tf
-(BZ2_bzWriteClose) 95.641 Tj
-[1 0 0 1 193.146 408.639] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -198.127 -408.639] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-207.116 408.639 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 408.639] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -408.639] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 408.639 Td
-/F130_0 9.9626 Tf
-(23) 9.9626 Tj
-[1 0 0 1 516.09 408.639] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -1.31] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -10.6451] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -396.684] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 396.684 Td
-/F130_0 9.9626 Tf
-(3.4.8.) 22.4159 Tj
--310 TJm
-(Handling) 37.0808 Tj
--250 TJm
-(embedded) 40.9463 Tj
--250 TJm
-(compressed) 47.0334 Tj
--250 TJm
-(data) 16.5977 Tj
--250 TJm
-(streams) 30.4357 Tj
-[1 0 0 1 279.56 396.684] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -284.541 -396.684] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-294.601 396.684 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 396.684] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -396.684] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 396.684 Td
-/F130_0 9.9626 Tf
-(24) 9.9626 Tj
-[1 0 0 1 516.09 396.684] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7984] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -384.729] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 384.729 Td
-/F130_0 9.9626 Tf
-(3.4.9.) 22.4159 Tj
--310 TJm
-(Standard) 35.417 Tj
--250 TJm
-(\002le-reading/writing) 77.4791 Tj
--250 TJm
-(code) 18.8094 Tj
-[1 0 0 1 234.19 384.729] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -239.172 -384.729] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-247.564 384.729 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 384.729] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -384.729] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 384.729 Td
-/F130_0 9.9626 Tf
-(25) 9.9626 Tj
-[1 0 0 1 516.09 384.729] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7984] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -372.774] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 372.774 Td
-/F130_0 9.9626 Tf
-(3.5.) 14.9439 Tj
--310 TJm
-(Utility) 26.0223 Tj
--250 TJm
-(functions) 37.0808 Tj
-[1 0 0 1 155.625 372.774] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -160.607 -372.774] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-170.645 372.774 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 372.774] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -372.774] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 372.774 Td
-/F130_0 9.9626 Tf
-(26) 9.9626 Tj
-[1 0 0 1 516.09 372.774] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7983] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -360.819] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 360.819 Td
-/F130_0 9.9626 Tf
-(3.5.1.) 22.4159 Tj
-[1 0 0 1 97.5043 360.819] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -97.5043 -360.819] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-97.5043 360.819 Td
-/F134_0 9.9626 Tf
-(BZ2_bzBuffToBuffCompress) 143.461 Tj
-[1 0 0 1 240.966 360.819] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -245.948 -360.819] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-255.38 360.819 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 360.819] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -360.819] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 360.819 Td
-/F130_0 9.9626 Tf
-(26) 9.9626 Tj
-[1 0 0 1 516.09 360.819] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -1.5342] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -10.421] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -348.863] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 348.863 Td
-/F130_0 9.9626 Tf
-(3.5.2.) 22.4159 Tj
-[1 0 0 1 97.5043 348.863] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -97.5043 -348.863] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-97.5043 348.863 Td
-/F134_0 9.9626 Tf
-(BZ2_bzBuffToBuffDecompress) 155.417 Tj
-[1 0 0 1 252.922 348.863] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -257.903 -348.863] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-267.999 348.863 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 348.863] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -348.863] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 348.863 Td
-/F130_0 9.9626 Tf
-(27) 9.9626 Tj
-[1 0 0 1 516.09 348.863] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -1.5342] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -10.421] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -336.908] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 336.908 Td
-/F130_0 9.9626 Tf
-(3.6.) 14.9439 Tj
-[1 0 0 1 90.0324 336.908] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90.0324 -336.908] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90.0324 336.908 Td
-/F134_0 9.9626 Tf
-(zlib) 23.9102 Tj
-[1 0 0 1 113.943 336.908] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -113.943 -336.908] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-116.433 336.908 Td
-/F130_0 9.9626 Tf
-(compatibility) 53.1405 Tj
--250 TJm
-(functions) 37.0808 Tj
-[1 0 0 1 209.144 336.908] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -214.126 -336.908] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-223.971 336.908 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 336.908] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -336.908] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 336.908 Td
-/F130_0 9.9626 Tf
-(28) 9.9626 Tj
-[1 0 0 1 516.09 336.908] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7983] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -324.953] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 324.953 Td
-/F130_0 9.9626 Tf
-(3.7.) 14.9439 Tj
--310 TJm
-(Using) 23.8007 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(library) 26.5603 Tj
--250 TJm
-(in) 7.7509 Tj
--250 TJm
-(a) 4.42339 Tj
-[1 0 0 1 177.195 324.953] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -177.195 -324.953] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-177.195 324.953 Td
-/F134_0 9.9626 Tf
-(stdio) 29.8878 Tj
-[1 0 0 1 207.083 324.953] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -207.083 -324.953] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-207.083 324.953 Td
-/F130_0 9.9626 Tf
-(-free) 18.7994 Tj
--250 TJm
-(en) 9.40469 Tj
-40 TJm
-(vironment) 40.9562 Tj
-[1 0 0 1 278.335 324.953] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -283.316 -324.953] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-291.775 324.953 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 324.953] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -324.953] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 324.953 Td
-/F130_0 9.9626 Tf
-(28) 9.9626 Tj
-[1 0 0 1 516.09 324.953] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1569] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7983] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -312.998] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 312.998 Td
-/F130_0 9.9626 Tf
-(3.7.1.) 22.4159 Tj
--310 TJm
-(Getting) 29.8878 Tj
--250 TJm
-(rid) 11.0684 Tj
--250 TJm
-(of) 8.29885 Tj
-[1 0 0 1 154.231 312.998] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -154.231 -312.998] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-154.231 312.998 Td
-/F134_0 9.9626 Tf
-(stdio) 29.8878 Tj
-[1 0 0 1 184.119 312.998] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -189.1 -312.998] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-198.175 312.998 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 312.998] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -312.998] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 312.998 Td
-/F130_0 9.9626 Tf
-(29) 9.9626 Tj
-[1 0 0 1 516.09 312.998] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7984] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -301.043] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 301.043 Td
-/F130_0 9.9626 Tf
-(3.7.2.) 22.4159 Tj
--310 TJm
-(Critical) 29.8878 Tj
--250 TJm
-(error) 19.3573 Tj
--250 TJm
-(handling) 34.8691 Tj
-[1 0 0 1 186.599 301.043] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -191.58 -301.043] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-201.629 301.043 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 301.043] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -301.043] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 301.043 Td
-/F130_0 9.9626 Tf
-(29) 9.9626 Tj
-[1 0 0 1 516.09 301.043] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7983] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -289.088] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 289.088 Td
-/F130_0 9.9626 Tf
-(3.8.) 14.9439 Tj
--310 TJm
-(Making) 30.9936 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(W) 9.40469 Tj
-40 TJm
-(indo) 17.7135 Tj
-25 TJm
-(ws) 11.0684 Tj
--250 TJm
-(DLL) 19.3673 Tj
-[1 0 0 1 189.828 289.088] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -194.809 -289.088] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-203.243 289.088 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 289.088] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -289.088] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 289.088 Td
-/F130_0 9.9626 Tf
-(29) 9.9626 Tj
-[1 0 0 1 516.09 289.088] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1569] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -267.006] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 257.207 Td
-/F130_0 9.9626 Tf
-(This) 17.7135 Tj
--250 TJm
-(chapter) 29.3199 Tj
--250 TJm
-(describes) 37.0708 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(programming) 54.2364 Tj
--250 TJm
-(interf) 21.579 Tj
-10 TJm
-(ace) 13.2702 Tj
--250 TJm
-(to) 7.7509 Tj
-[1 0 0 1 282.448 257.207] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -282.448 -257.207] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-282.448 257.207 Td
-/F134_0 9.9626 Tf
-(libbzip2) 47.8205 Tj
-[1 0 0 1 330.269 257.207] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -330.269 -257.207] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-330.269 257.207 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
-[1 0 0 1 72 255.05] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -245.088] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 235.289 Td
-/F130_0 9.9626 Tf
-(F) 5.53921 Tj
-15 TJm
-(or) 8.29885 Tj
--273 TJm
-(general) 29.3199 Tj
--272 TJm
-(background) 47.0334 Tj
--273 TJm
-(information,) 49.534 Tj
--278 TJm
-(particularly) 45.9276 Tj
--273 TJm
-(about) 22.1369 Tj
--273 TJm
-(memory) 33.2053 Tj
--272 TJm
-(use) 13.2801 Tj
--273 TJm
-(and) 14.386 Tj
--273 TJm
-(performance) 50.341 Tj
--272 TJm
-(aspects,) 31.2626 Tj
--279 TJm
-(you') 18.2614 Tj
-50 TJm
-(d) 4.9813 Tj
--272 TJm
-(be) 9.40469 Tj
--273 TJm
-(well) 17.1556 Tj
--273 TJm
-(advised) 30.4357 Tj
-72 223.334 Td
-(to) 7.7509 Tj
--250 TJm
-(read) 17.1456 Tj
-[1 0 0 1 101.878 223.334] cm
-/DeviceRGB {} cs
-[0 0 1] sc
-/DeviceRGB {} CS
-[0 0 1] SC
-[1 0 0 1 -101.878 -223.334] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-101.878 223.334 Td
-/F130_0 9.9626 Tf
-(Ho) 12.1743 Tj
-25 TJm
-(w) 7.193 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(use) 13.2801 Tj
--250 TJm
-(bzip2) 22.1369 Tj
-[1 0 0 1 171.636 223.334] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 1] sc
-/DeviceRGB {} CS
-[0 0 1] SC
-/DeviceRGB {} cs
-[0 0 1] sc
-/DeviceRGB {} CS
-[0 0 1] SC
-[1 0 0 1 -171.636 -223.334] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-174.126 223.334 Td
-/F130_0 9.9626 Tf
-([2]) 11.6164 Tj
-[1 0 0 1 185.743 223.334] cm
-/DeviceRGB {} cs
-[0 0 1] sc
-/DeviceRGB {} CS
-[0 0 1] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -185.743 -223.334] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-188.233 223.334 Td
-/F130_0 9.9626 Tf
-(as) 8.29885 Tj
--250 TJm
-(well.) 19.6462 Tj
-[1 0 0 1 72 221.177] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -211.215] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 188.581 Td
-/F122_0 20.6585 Tf
-(3.1.) 34.4584 Tj
--278 TJm
-(T) 12.6223 Tj
-80 TJm
-(op-le) 49.3532 Tj
-15 TJm
-(vel) 28.7153 Tj
--278 TJm
-(structure) 89.5339 Tj
-[1 0 0 1 72 184.305] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -174.343] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 166.664 Td
-/F134_0 9.9626 Tf
-(libbzip2) 47.8205 Tj
-[1 0 0 1 119.821 166.664] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -119.821 -166.664] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-123.608 166.664 Td
-/F130_0 9.9626 Tf
-(is) 6.64505 Tj
--380 TJm
-(a) 4.42339 Tj
--380 TJm
-(\003e) 9.9626 Tj
-15 TJm
-(xible) 19.9252 Tj
--381 TJm
-(library) 26.5603 Tj
--380 TJm
-(for) 11.6164 Tj
--380 TJm
-(compressing) 50.3609 Tj
--380 TJm
-(and) 14.386 Tj
--380 TJm
-(decompressing) 59.7656 Tj
--380 TJm
-(data) 16.5977 Tj
--381 TJm
-(in) 7.7509 Tj
--380 TJm
-(the) 12.1743 Tj
-[1 0 0 1 405.291 166.664] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -405.291 -166.664] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-405.291 166.664 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 435.178 166.664] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -435.178 -166.664] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-438.966 166.664 Td
-/F130_0 9.9626 Tf
-(data) 16.5977 Tj
--380 TJm
-(format.) 29.0509 Tj
--1401 TJm
-(Although) 37.6387 Tj
-72 154.708 Td
-(packaged) 37.6188 Tj
--285 TJm
-(as) 8.29885 Tj
--284 TJm
-(a) 4.42339 Tj
--285 TJm
-(single) 23.8007 Tj
--285 TJm
-(entity) 22.6948 Tj
-65 TJm
-(,) 2.49065 Tj
--293 TJm
-(it) 5.53921 Tj
--285 TJm
-(helps) 21.031 Tj
--285 TJm
-(to) 7.7509 Tj
--284 TJm
-(re) 7.74094 Tj
-15 TJm
-(g) 4.9813 Tj
-5 TJm
-(ard) 12.7222 Tj
--285 TJm
-(the) 12.1743 Tj
--285 TJm
-(library) 26.5603 Tj
--284 TJm
-(as) 8.29885 Tj
--285 TJm
-(three) 19.9152 Tj
--285 TJm
-(separate) 32.6375 Tj
--284 TJm
-(parts:) 22.1369 Tj
--380 TJm
-(the) 12.1743 Tj
--285 TJm
-(lo) 7.7509 Tj
-25 TJm
-(w) 7.193 Tj
--284 TJm
-(le) 7.193 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(el) 7.193 Tj
--285 TJm
-(interf) 21.579 Tj
-10 TJm
-(ace,) 15.7608 Tj
--293 TJm
-(and) 14.386 Tj
--285 TJm
-(the) 12.1743 Tj
--285 TJm
-(high) 17.7135 Tj
-72 142.753 Td
-(le) 7.193 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(el) 7.193 Tj
--250 TJm
-(interf) 21.579 Tj
-10 TJm
-(ace,) 15.7608 Tj
--250 TJm
-(and) 14.386 Tj
--250 TJm
-(some) 21.031 Tj
--250 TJm
-(utility) 23.8106 Tj
--250 TJm
-(functions.) 39.5714 Tj
-[1 0 0 1 72 140.596] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -130.634] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 120.835 Td
-/F130_0 9.9626 Tf
-(The) 15.4918 Tj
--349 TJm
-(structure) 34.8591 Tj
--349 TJm
-(of) 8.29885 Tj
-[1 0 0 1 141.082 120.835] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -141.082 -120.835] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-141.082 120.835 Td
-/F134_0 9.9626 Tf
-(libbzip2) 47.8205 Tj
-[1 0 0 1 188.903 120.835] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -188.903 -120.835] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-188.903 120.835 Td
-/F130_0 9.9626 Tf
-(') 3.31755 Tj
-55 TJm
-(s) 3.87545 Tj
--349 TJm
-(interf) 21.579 Tj
-10 TJm
-(aces) 17.1456 Tj
--349 TJm
-(is) 6.64505 Tj
--349 TJm
-(similar) 27.6761 Tj
--349 TJm
-(to) 7.7509 Tj
--349 TJm
-(that) 14.9439 Tj
--349 TJm
-(of) 8.29885 Tj
--349 TJm
-(Jean-loup) 38.7346 Tj
--349 TJm
-(Gailly') 28.224 Tj
-55 TJm
-(s) 3.87545 Tj
--349 TJm
-(and) 14.386 Tj
--349 TJm
-(Mark) 21.579 Tj
--349 TJm
-(Adler') 26.0024 Tj
-55 TJm
-(s) 3.87545 Tj
--349 TJm
-(e) 4.42339 Tj
-15 TJm
-(xcellent) 31.5416 Tj
-[1 0 0 1 516.09 120.835] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -516.09 -120.835] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-516.09 120.835 Td
-/F134_0 9.9626 Tf
-(zlib) 23.9102 Tj
-[1 0 0 1 540 120.835] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -540 -120.835] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 108.88 Td
-/F130_0 9.9626 Tf
-(library) 26.5603 Tj
-65 TJm
-(.) 2.49065 Tj
-[1 0 0 1 72 106.723] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -96.7608] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 86.9624 Td
-/F130_0 9.9626 Tf
-(All) 12.7322 Tj
--242 TJm
-(e) 4.42339 Tj
-15 TJm
-(xternally) 35.417 Tj
--242 TJm
-(visible) 26.5703 Tj
--241 TJm
-(symbols) 33.2153 Tj
--242 TJm
-(ha) 9.40469 Tj
-20 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--242 TJm
-(names) 25.4544 Tj
--242 TJm
-(be) 9.40469 Tj
-15 TJm
-(ginning) 30.4457 Tj
-[1 0 0 1 284.687 86.9624] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -284.687 -86.9624] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-284.687 86.9624 Td
-/F134_0 9.9626 Tf
-(BZ2_) 23.9102 Tj
-[1 0 0 1 308.597 86.9624] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -308.597 -86.9624] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-308.597 86.9624 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
--615 TJm
-(This) 17.7135 Tj
--241 TJm
-(is) 6.64505 Tj
--242 TJm
-(ne) 9.40469 Tj
-25 TJm
-(w) 7.193 Tj
--242 TJm
-(in) 7.7509 Tj
--242 TJm
-(v) 4.9813 Tj
-15 TJm
-(ersion) 24.3486 Tj
--242 TJm
-(1.0.) 14.9439 Tj
--614 TJm
-(The) 15.4918 Tj
--242 TJm
-(intention) 35.427 Tj
--242 TJm
-(is) 6.64505 Tj
--241 TJm
-(to) 7.7509 Tj
--242 TJm
-(minimise) 37.0908 Tj
-72 75.0073 Td
-(pollution) 35.9849 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(namespaces) 47.5814 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(library) 26.5603 Tj
--250 TJm
-(clients.) 28.503 Tj
-[1 0 0 1 72 72.8505] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -21.9987] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 4.3836 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 374.394 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.8541] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 43.0633 -6.7545] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -498.225 -50.9514] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-541.288 50.9514 Td
-/F130_0 9.9626 Tf
-(8) 4.9813 Tj
-[1 0 0 1 455.161 50.8518] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 93.5986 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.2765 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -15.0366 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-Q
-showpage
-%%PageTrailer
-pdfEndPage
-%%Page: 12 12
-%%BeginPageSetup
-%%PageOrientation: Portrait
-pdfStartPage
-0 0 612 792 re W
-%%EndPageSetup
-[] 0 d
-1 i
-0 j
-0 J
-10 M
-1 w
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-false op
-false OP
-0 0 612 792 re
-W
-q
-[1 0 0 1 72 741.554] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 4.3836 14.4459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 187.197 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 -8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 76.4979 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -344.462 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-420.96 749.245 Td
-/F130_0 9.9626 Tf
-(Programming) 54.7943 Tj
--250 TJm
-(with) 17.7135 Tj
-[1 0 0 1 498.449 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -498.449 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-498.449 749.245 Td
-/F134_0 9.9626 Tf
-(libbzip2) 47.8205 Tj
-[1 0 0 1 546.269 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -278.305 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 280.796 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.974 -5.0363] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -0.4981] cm
-q
-[] 0 d
-0 J
-0.4981 w
-0 0.2491 m
-475.465 0.2491 l
-S
-Q
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 479.251 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -15.0365 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -21.5542] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -720] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 710.037 Td
-/F130_0 9.9626 Tf
-(T) 6.08715 Tj
-80 TJm
-(o) 4.9813 Tj
--250 TJm
-(use) 13.2801 Tj
--250 TJm
-(an) 9.40469 Tj
-15 TJm
-(y) 4.9813 Tj
--250 TJm
-(part) 15.4918 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(library) 26.5603 Tj
-65 TJm
-(,) 2.49065 Tj
--250 TJm
-(you) 14.9439 Tj
--250 TJm
-(need) 18.8094 Tj
--250 TJm
-(to) 7.7509 Tj
-[1 0 0 1 240.567 710.037] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -240.567 -710.037] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-240.567 710.037 Td
-/F134_0 9.9626 Tf
-(#include) 47.8205 Tj
--600 TJm
-(<bzlib.h>) 53.798 Tj
-[1 0 0 1 348.163 710.037] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -348.163 -710.037] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-350.654 710.037 Td
-/F130_0 9.9626 Tf
-(into) 15.5018 Tj
--250 TJm
-(your) 18.2614 Tj
--250 TJm
-(sources.) 32.3685 Tj
-[1 0 0 1 72 707.88] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -697.918] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 679.416 Td
-/F122_0 17.2154 Tf
-(3.1.1.) 43.0729 Tj
--278 TJm
-(Lo) 21.0372 Tj
-15 TJm
-(w-le) 33.484 Tj
-15 TJm
-(vel) 23.9294 Tj
--278 TJm
-(summar) 66.9679 Tj
--10 TJm
-(y) 9.57176 Tj
-[1 0 0 1 72 675.853] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -665.89] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 657.498 Td
-/F130_0 9.9626 Tf
-(This) 17.7135 Tj
--212 TJm
-(interf) 21.579 Tj
-10 TJm
-(ace) 13.2702 Tj
--212 TJm
-(pro) 13.2801 Tj
-15 TJm
-(vides) 21.031 Tj
--212 TJm
-(services) 32.0895 Tj
--212 TJm
-(for) 11.6164 Tj
--212 TJm
-(compressing) 50.3609 Tj
--212 TJm
-(and) 14.386 Tj
--212 TJm
-(decompress) 47.0334 Tj
-1 TJm
-(ing) 12.7322 Tj
--212 TJm
-(data) 16.5977 Tj
--212 TJm
-(in) 7.7509 Tj
--212 TJm
-(memory) 33.2053 Tj
-65 TJm
-(.) 2.49065 Tj
--595 TJm
-(There') 26.5503 Tj
-55 TJm
-(s) 3.87545 Tj
--212 TJm
-(no) 9.9626 Tj
--212 TJm
-(pro) 13.2801 Tj
-15 TJm
-(vision) 24.3586 Tj
--212 TJm
-(for) 11.6164 Tj
--212 TJm
-(dealing) 29.3299 Tj
-72 645.543 Td
-(with) 17.7135 Tj
--213 TJm
-(\002les,) 19.0983 Tj
--220 TJm
-(streams) 30.4357 Tj
--213 TJm
-(or) 8.29885 Tj
--213 TJm
-(an) 9.40469 Tj
-15 TJm
-(y) 4.9813 Tj
--213 TJm
-(other) 20.4731 Tj
--213 TJm
-(I/O) 13.2801 Tj
--213 TJm
-(mechanisms,) 51.7457 Tj
--221 TJm
-(just) 14.396 Tj
--213 TJm
-(straight) 29.8878 Tj
--213 TJm
-(memory-to-memory) 80.7967 Tj
--213 TJm
-(w) 7.193 Tj
-10 TJm
-(ork.) 15.7708 Tj
--595 TJm
-(In) 8.29885 Tj
--213 TJm
-(f) 3.31755 Tj
-10 TJm
-(act,) 14.107 Tj
--221 TJm
-(this) 14.396 Tj
--213 TJm
-(part) 15.4918 Tj
--213 TJm
-(of) 8.29885 Tj
--213 TJm
-(the) 12.1743 Tj
--213 TJm
-(library) 26.5603 Tj
-72 633.588 Td
-(can) 13.8281 Tj
--250 TJm
-(be) 9.40469 Tj
--250 TJm
-(compiled) 37.0808 Tj
--250 TJm
-(without) 30.4457 Tj
--250 TJm
-(inclusion) 36.5329 Tj
--250 TJm
-(of) 8.29885 Tj
-[1 0 0 1 222.534 633.588] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -222.534 -633.588] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-222.534 633.588 Td
-/F134_0 9.9626 Tf
-(stdio.h) 41.8429 Tj
-[1 0 0 1 264.377 633.588] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -264.377 -633.588] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-264.377 633.588 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--250 TJm
-(which) 24.3486 Tj
--250 TJm
-(may) 17.1556 Tj
--250 TJm
-(be) 9.40469 Tj
--250 TJm
-(helpful) 28.224 Tj
--250 TJm
-(for) 11.6164 Tj
--250 TJm
-(embedded) 40.9463 Tj
--250 TJm
-(applications.) 50.6399 Tj
-[1 0 0 1 72 631.431] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -621.469] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 611.67 Td
-/F130_0 9.9626 Tf
-(The) 15.4918 Tj
--250 TJm
-(lo) 7.7509 Tj
-25 TJm
-(w-le) 17.7035 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(el) 7.193 Tj
--250 TJm
-(part) 15.4918 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(library) 26.5603 Tj
--250 TJm
-(has) 13.2801 Tj
--250 TJm
-(no) 9.9626 Tj
--250 TJm
-(global) 24.9065 Tj
--250 TJm
-(v) 4.9813 Tj
-25 TJm
-(ariables) 30.9837 Tj
--250 TJm
-(and) 14.386 Tj
--250 TJm
-(is) 6.64505 Tj
--250 TJm
-(therefore) 35.955 Tj
--250 TJm
-(thread-safe.) 46.7445 Tj
-[1 0 0 1 72 609.513] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -599.551] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 589.752 Td
-/F130_0 9.9626 Tf
-(Six) 13.2901 Tj
--875 TJm
-(routines) 32.0995 Tj
--876 TJm
-(mak) 17.1556 Tj
-10 TJm
-(e) 4.42339 Tj
--875 TJm
-(up) 9.9626 Tj
--876 TJm
-(the) 12.1743 Tj
--875 TJm
-(lo) 7.7509 Tj
-25 TJm
-(w) 7.193 Tj
--876 TJm
-(le) 7.193 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(el) 7.193 Tj
--875 TJm
-(interf) 21.579 Tj
-10 TJm
-(ace:) 16.0398 Tj
-[1 0 0 1 308.791 589.752] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -308.791 -589.752] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-308.791 589.752 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompressInit) 107.596 Tj
-[1 0 0 1 416.387 589.752] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -416.387 -589.752] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-416.387 589.752 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 429.158 589.752] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -429.158 -589.752] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-429.158 589.752 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompress) 83.6858 Tj
-[1 0 0 1 512.844 589.752] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -512.844 -589.752] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-512.844 589.752 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--1032 TJm
-(and) 14.386 Tj
-[1 0 0 1 72 577.797] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -577.797] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 577.797 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompressEnd) 101.619 Tj
-[1 0 0 1 173.619 577.797] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -173.619 -577.797] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-186.15 577.797 Td
-/F130_0 9.9626 Tf
-(for) 11.6164 Tj
--1258 TJm
-(compression,) 52.8516 Tj
--1510 TJm
-(and) 14.386 Tj
--1257 TJm
-(a) 4.42339 Tj
--1258 TJm
-(corresponding) 56.996 Tj
--1258 TJm
-(trio) 13.8381 Tj
-[1 0 0 1 417.958 577.797] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -417.958 -577.797] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-417.958 577.797 Td
-/F134_0 9.9626 Tf
-(BZ2_bzDecompressInit) 119.551 Tj
-[1 0 0 1 537.509 577.797] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -537.509 -577.797] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-537.509 577.797 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 72 565.842] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -565.842] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 565.842 Td
-/F134_0 9.9626 Tf
-(BZ2_bzDecompress) 95.641 Tj
-[1 0 0 1 167.641 565.842] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -167.641 -565.842] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-172.707 565.842 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 192.158 565.842] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -192.158 -565.842] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-192.158 565.842 Td
-/F134_0 9.9626 Tf
-(BZ2_bzDecompressEnd) 113.574 Tj
-[1 0 0 1 305.732 565.842] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -305.732 -565.842] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-310.798 565.842 Td
-/F130_0 9.9626 Tf
-(for) 11.6164 Tj
--508 TJm
-(decompression.) 62.2563 Tj
--2171 TJm
-(The) 15.4918 Tj
-[1 0 0 1 431.918 565.842] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -431.918 -565.842] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-431.918 564.099 Td
-/F134_0 9.9626 Tf
-(*) 5.97756 Tj
-437.895 565.842 Td
-(Init) 23.9102 Tj
-[1 0 0 1 461.805 565.842] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -461.805 -565.842] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-466.871 565.842 Td
-/F130_0 9.9626 Tf
-(functions) 37.0808 Tj
--508 TJm
-(allocate) 30.9837 Tj
-72 553.887 Td
-(memory) 33.2053 Tj
--574 TJm
-(for) 11.6164 Tj
--573 TJm
-(compression/decompression) 112.896 Tj
--574 TJm
-(and) 14.386 Tj
--574 TJm
-(do) 9.9626 Tj
--573 TJm
-(other) 20.4731 Tj
--574 TJm
-(initialisations,) 56.1891 Tj
--654 TJm
-(whilst) 24.3586 Tj
--574 TJm
-(the) 12.1743 Tj
-[1 0 0 1 419.502 553.887] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -419.502 -553.887] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-419.502 552.144 Td
-/F134_0 9.9626 Tf
-(*) 5.97756 Tj
-425.48 553.887 Td
-(End) 17.9327 Tj
-[1 0 0 1 443.413 553.887] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -443.413 -553.887] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-449.128 553.887 Td
-/F130_0 9.9626 Tf
-(functions) 37.0808 Tj
--574 TJm
-(close) 20.4731 Tj
--573 TJm
-(do) 9.9626 Tj
-25 TJm
-(wn) 12.1743 Tj
-72 541.932 Td
-(operations) 41.5042 Tj
--250 TJm
-(and) 14.386 Tj
--250 TJm
-(release) 27.6562 Tj
--250 TJm
-(memory) 33.2053 Tj
-65 TJm
-(.) 2.49065 Tj
-[1 0 0 1 72 539.775] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -529.812] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 520.014 Td
-/F130_0 9.9626 Tf
-(The) 15.4918 Tj
--303 TJm
-(real) 14.9339 Tj
--303 TJm
-(w) 7.193 Tj
-10 TJm
-(ork) 13.2801 Tj
--303 TJm
-(is) 6.64505 Tj
--303 TJm
-(done) 19.3673 Tj
--303 TJm
-(by) 9.9626 Tj
-[1 0 0 1 176.892 520.014] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -176.892 -520.014] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-176.892 520.014 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompress) 83.6858 Tj
-[1 0 0 1 260.578 520.014] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -260.578 -520.014] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-263.598 520.014 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 281.003 520.014] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -281.003 -520.014] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-281.003 520.014 Td
-/F134_0 9.9626 Tf
-(BZ2_bzDecompress) 95.641 Tj
-[1 0 0 1 376.645 520.014] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -376.645 -520.014] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-376.645 520.014 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
--939 TJm
-(These) 23.7907 Tj
--303 TJm
-(compress) 37.6287 Tj
--303 TJm
-(and) 14.386 Tj
--303 TJm
-(decompress) 47.0334 Tj
--303 TJm
-(data) 16.5977 Tj
-72 508.059 Td
-(from) 19.3673 Tj
--205 TJm
-(a) 4.42339 Tj
--205 TJm
-(user) 16.5977 Tj
-20 TJm
-(-supplied) 37.0808 Tj
--205 TJm
-(input) 20.4831 Tj
--206 TJm
-(b) 4.9813 Tj
-20 TJm
-(uf) 8.29885 Tj
-25 TJm
-(fer) 11.0585 Tj
--205 TJm
-(to) 7.7509 Tj
--205 TJm
-(a) 4.42339 Tj
--205 TJm
-(user) 16.5977 Tj
-20 TJm
-(-supplied) 37.0808 Tj
--205 TJm
-(output) 25.4644 Tj
--205 TJm
-(b) 4.9813 Tj
-20 TJm
-(uf) 8.29885 Tj
-25 TJm
-(fer) 11.0585 Tj
-55 TJm
-(.) 2.49065 Tj
--591 TJm
-(These) 23.7907 Tj
--205 TJm
-(b) 4.9813 Tj
-20 TJm
-(uf) 8.29885 Tj
-25 TJm
-(fers) 14.9339 Tj
--205 TJm
-(can) 13.8281 Tj
--205 TJm
-(be) 9.40469 Tj
--205 TJm
-(an) 9.40469 Tj
-15 TJm
-(y) 4.9813 Tj
--205 TJm
-(size;) 18.2614 Tj
--220 TJm
-(arbitrary) 34.3012 Tj
--206 TJm
-(quantities) 38.7446 Tj
--205 TJm
-(of) 8.29885 Tj
-72 496.104 Td
-(data) 16.5977 Tj
--258 TJm
-(are) 12.1643 Tj
--258 TJm
-(handled) 31.5416 Tj
--258 TJm
-(by) 9.9626 Tj
--257 TJm
-(making) 29.8878 Tj
--258 TJm
-(repeated) 33.7433 Tj
--258 TJm
-(calls) 18.2614 Tj
--258 TJm
-(to) 7.7509 Tj
--258 TJm
-(these) 20.4731 Tj
--258 TJm
-(functions.) 39.5714 Tj
--667 TJm
-(This) 17.7135 Tj
--258 TJm
-(is) 6.64505 Tj
--258 TJm
-(a) 4.42339 Tj
--257 TJm
-(\003e) 9.9626 Tj
-15 TJm
-(xible) 19.9252 Tj
--258 TJm
-(mechanism) 45.3796 Tj
--258 TJm
-(allo) 14.9439 Tj
-25 TJm
-(wing) 19.9252 Tj
--258 TJm
-(a) 4.42339 Tj
--258 TJm
-(consumer) 38.7346 Tj
-20 TJm
-(-pull) 18.8194 Tj
-72 484.148 Td
-(style) 18.8194 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(acti) 14.386 Tj
-25 TJm
-(vity) 15.5018 Tj
-65 TJm
-(,) 2.49065 Tj
--250 TJm
-(or) 8.29885 Tj
--250 TJm
-(producer) 35.4071 Tj
-20 TJm
-(-push,) 24.6275 Tj
--250 TJm
-(or) 8.29885 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(mixture) 30.9936 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(both.) 20.2042 Tj
-[1 0 0 1 72 481.992] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -472.029] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 453.527 Td
-/F122_0 17.2154 Tf
-(3.1.2.) 43.0729 Tj
--278 TJm
-(High-le) 58.343 Tj
-15 TJm
-(vel) 23.9294 Tj
--278 TJm
-(summar) 66.9679 Tj
--10 TJm
-(y) 9.57176 Tj
-[1 0 0 1 72 449.697] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -439.734] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 431.61 Td
-/F130_0 9.9626 Tf
-(This) 17.7135 Tj
--284 TJm
-(interf) 21.579 Tj
-10 TJm
-(ace) 13.2702 Tj
--284 TJm
-(pro) 13.2801 Tj
-15 TJm
-(vides) 21.031 Tj
--285 TJm
-(some) 21.031 Tj
--284 TJm
-(handy) 24.3486 Tj
--284 TJm
-(wrappers) 36.5129 Tj
--284 TJm
-(around) 27.6661 Tj
--284 TJm
-(the) 12.1743 Tj
--284 TJm
-(lo) 7.7509 Tj
-25 TJm
-(w-le) 17.7035 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(el) 7.193 Tj
--285 TJm
-(interf) 21.579 Tj
-10 TJm
-(ace) 13.2702 Tj
--284 TJm
-(to) 7.7509 Tj
--284 TJm
-(f) 3.31755 Tj
-10 TJm
-(acilitate) 31.5416 Tj
--284 TJm
-(reading) 29.8778 Tj
--284 TJm
-(and) 14.386 Tj
--285 TJm
-(writ) 16.0497 Tj
-1 TJm
-(ing) 12.7322 Tj
-[1 0 0 1 510.112 431.61] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -510.112 -431.61] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-510.112 431.61 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 540 431.61] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -540 -431.61] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 419.654 Td
-/F130_0 9.9626 Tf
-(format) 26.5603 Tj
--347 TJm
-(\002les) 16.6077 Tj
--346 TJm
-(\() 3.31755 Tj
-[1 0 0 1 125.391 419.654] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -125.391 -419.654] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-125.391 419.654 Td
-/F134_0 9.9626 Tf
-(.bz2) 23.9102 Tj
-[1 0 0 1 149.301 419.654] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -149.301 -419.654] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-152.754 419.654 Td
-/F130_0 9.9626 Tf
-(\002les\).) 22.4159 Tj
--1200 TJm
-(The) 15.4918 Tj
--346 TJm
-(routines) 32.0995 Tj
--347 TJm
-(pro) 13.2801 Tj
-15 TJm
-(vide) 17.1556 Tj
--346 TJm
-(hooks) 23.8007 Tj
--347 TJm
-(to) 7.7509 Tj
--346 TJm
-(f) 3.31755 Tj
-10 TJm
-(acilitate) 31.5416 Tj
--347 TJm
-(reading) 29.8778 Tj
--347 TJm
-(\002les) 16.6077 Tj
--346 TJm
-(in) 7.7509 Tj
--347 TJm
-(which) 24.3486 Tj
--346 TJm
-(the) 12.1743 Tj
-[1 0 0 1 460.049 419.654] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -460.049 -419.654] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-460.049 419.654 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 489.937 419.654] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -489.937 -419.654] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-493.39 419.654 Td
-/F130_0 9.9626 Tf
-(data) 16.5977 Tj
--347 TJm
-(stream) 26.5603 Tj
-72 407.699 Td
-(is) 6.64505 Tj
--339 TJm
-(embedded) 40.9463 Tj
--339 TJm
-(within) 25.4644 Tj
--339 TJm
-(some) 21.031 Tj
--339 TJm
-(lar) 10.5105 Tj
-18 TJm
-(ger) 12.7222 Tj
-20 TJm
-(-scale) 23.2328 Tj
--339 TJm
-(\002le) 12.7322 Tj
--339 TJm
-(structure,) 37.3498 Tj
--361 TJm
-(or) 8.29885 Tj
--339 TJm
-(wh) 12.1743 Tj
--1 TJm
-(e) 4.42339 Tj
-1 TJm
-(re) 7.74094 Tj
--340 TJm
-(there) 19.9152 Tj
--339 TJm
-(are) 12.1643 Tj
--339 TJm
-(multiple) 33.2153 Tj
-[1 0 0 1 400.941 407.699] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -400.941 -407.699] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-400.941 407.699 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 430.829 407.699] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -430.829 -407.699] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-434.207 407.699 Td
-/F130_0 9.9626 Tf
-(data) 16.5977 Tj
--339 TJm
-(streams) 30.4357 Tj
--339 TJm
-(concatenated) 52.0048 Tj
-72 395.744 Td
-(end-to-end.) 45.6486 Tj
-[1 0 0 1 72 395.644] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -385.682] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 373.826 Td
-/F130_0 9.9626 Tf
-(F) 5.53921 Tj
-15 TJm
-(or) 8.29885 Tj
--332 TJm
-(reading) 29.8778 Tj
--333 TJm
-(\002les,) 19.0983 Tj
-[1 0 0 1 144.803 373.826] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -144.803 -373.826] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-144.803 373.826 Td
-/F134_0 9.9626 Tf
-(BZ2_bzReadOpen) 83.6858 Tj
-[1 0 0 1 228.489 373.826] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -228.489 -373.826] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-228.489 373.826 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 234.496 373.826] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -234.496 -373.826] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-234.496 373.826 Td
-/F134_0 9.9626 Tf
-(BZ2_bzRead) 59.7756 Tj
-[1 0 0 1 294.272 373.826] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -294.272 -373.826] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-294.272 373.826 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 300.279 373.826] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -300.279 -373.826] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-300.279 373.826 Td
-/F134_0 9.9626 Tf
-(BZ2_bzReadClose) 89.6634 Tj
-[1 0 0 1 389.942 373.826] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -389.942 -373.826] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-393.253 373.826 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 410.951 373.826] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -410.951 -373.826] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-410.951 373.826 Td
-/F134_0 9.9626 Tf
-(BZ2_bzReadGetUnused) 113.574 Tj
-[1 0 0 1 524.525 373.826] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -524.525 -373.826] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-527.836 373.826 Td
-/F130_0 9.9626 Tf
-(are) 12.1643 Tj
-72 361.871 Td
-(supplied.) 36.2539 Tj
--620 TJm
-(F) 5.53921 Tj
-15 TJm
-(or) 8.29885 Tj
--250 TJm
-(writing) 28.782 Tj
--250 TJm
-(\002les,) 19.0983 Tj
-[1 0 0 1 183.471 361.871] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -183.471 -361.871] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-183.471 361.871 Td
-/F134_0 9.9626 Tf
-(BZ2_bzWriteOpen) 89.6634 Tj
-[1 0 0 1 273.135 361.871] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -273.135 -361.871] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-273.135 361.871 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 278.116 361.871] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -278.116 -361.871] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-278.116 361.871 Td
-/F134_0 9.9626 Tf
-(BZ2_bzWrite) 65.7532 Tj
-[1 0 0 1 343.869 361.871] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -343.869 -361.871] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-346.36 361.871 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 363.237 361.871] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -363.237 -361.871] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-363.237 361.871 Td
-/F134_0 9.9626 Tf
-(BZ2_bzWriteFinish) 101.619 Tj
-[1 0 0 1 464.856 361.871] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -464.856 -361.871] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-467.346 361.871 Td
-/F130_0 9.9626 Tf
-(are) 12.1643 Tj
--250 TJm
-(a) 4.42339 Tj
-20 TJm
-(v) 4.9813 Tj
-25 TJm
-(ailable.) 29.0509 Tj
-[1 0 0 1 72 359.714] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -349.751] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 339.953 Td
-/F130_0 9.9626 Tf
-(As) 11.0684 Tj
--374 TJm
-(with) 17.7135 Tj
--374 TJm
-(the) 12.1743 Tj
--375 TJm
-(lo) 7.7509 Tj
-25 TJm
-(w-le) 17.7035 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(el) 7.193 Tj
--374 TJm
-(library) 26.5603 Tj
-65 TJm
-(,) 2.49065 Tj
--405 TJm
-(no) 9.9626 Tj
--374 TJm
-(global) 24.9065 Tj
--374 TJm
-(v) 4.9813 Tj
-25 TJm
-(ariables) 30.9837 Tj
--375 TJm
-(are) 12.1643 Tj
--374 TJm
-(used) 18.2614 Tj
--374 TJm
-(so) 8.85675 Tj
--374 TJm
-(the) 12.1743 Tj
--374 TJm
-(library) 26.5603 Tj
--375 TJm
-(is) 6.64505 Tj
--374 TJm
-(per) 12.7222 Tj
--374 TJm
-(se) 8.29885 Tj
--374 TJm
-(thread-safe.) 46.7445 Tj
--1365 TJm
-(Ho) 12.1743 Tj
-25 TJm
-(we) 11.6164 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(er) 7.74094 Tj
-40 TJm
-(,) 2.49065 Tj
--406 TJm
-(if) 6.08715 Tj
--374 TJm
-(I/O) 13.2801 Tj
-72 327.998 Td
-(errors) 23.2328 Tj
--267 TJm
-(occur) 22.1269 Tj
--267 TJm
-(whilst) 24.3586 Tj
--267 TJm
-(reading) 29.8778 Tj
--267 TJm
-(or) 8.29885 Tj
--267 TJm
-(writing) 28.782 Tj
--267 TJm
-(the) 12.1743 Tj
--268 TJm
-(underlying) 43.1679 Tj
--267 TJm
-(compressed) 47.0334 Tj
--267 TJm
-(\002les,) 19.0983 Tj
--271 TJm
-(you) 14.9439 Tj
--267 TJm
-(may) 17.1556 Tj
--267 TJm
-(ha) 9.40469 Tj
-20 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--267 TJm
-(to) 7.7509 Tj
--267 TJm
-(consult) 28.782 Tj
-[1 0 0 1 457.199 327.998] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -457.199 -327.998] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-457.199 327.998 Td
-/F134_0 9.9626 Tf
-(errno) 29.8878 Tj
-[1 0 0 1 487.087 327.998] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -487.087 -327.998] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-489.748 327.998 Td
-/F130_0 9.9626 Tf
-(to) 7.7509 Tj
--267 TJm
-(determine) 39.8404 Tj
-72 316.043 Td
-(the) 12.1743 Tj
--366 TJm
-(cause) 22.1269 Tj
--365 TJm
-(of) 8.29885 Tj
--366 TJm
-(the) 12.1743 Tj
--365 TJm
-(error) 19.3573 Tj
-55 TJm
-(.) 2.49065 Tj
--1314 TJm
-(In) 8.29885 Tj
--366 TJm
-(that) 14.9439 Tj
--365 TJm
-(case,) 19.6363 Tj
--395 TJm
-(you') 18.2614 Tj
-50 TJm
-(d) 4.9813 Tj
--366 TJm
-(need) 18.8094 Tj
--365 TJm
-(a) 4.42339 Tj
--366 TJm
-(C) 6.64505 Tj
--365 TJm
-(library) 26.5603 Tj
--366 TJm
-(which) 24.3486 Tj
--366 TJm
-(correctly) 35.4071 Tj
--365 TJm
-(supports) 33.7633 Tj
-[1 0 0 1 431.668 316.043] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -431.668 -316.043] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-431.668 316.043 Td
-/F134_0 9.9626 Tf
-(errno) 29.8878 Tj
-[1 0 0 1 461.556 316.043] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -461.556 -316.043] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-465.199 316.043 Td
-/F130_0 9.9626 Tf
-(in) 7.7509 Tj
--366 TJm
-(a) 4.42339 Tj
--365 TJm
-(multithreaded) 55.3422 Tj
-72 304.088 Td
-(en) 9.40469 Tj
-40 TJm
-(vironment.) 43.4469 Tj
-[1 0 0 1 72 303.988] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -294.025] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 282.17 Td
-/F130_0 9.9626 Tf
-(T) 6.08715 Tj
-80 TJm
-(o) 4.9813 Tj
--243 TJm
-(mak) 17.1556 Tj
-10 TJm
-(e) 4.42339 Tj
--243 TJm
-(the) 12.1743 Tj
--242 TJm
-(library) 26.5603 Tj
--243 TJm
-(a) 4.42339 Tj
--243 TJm
-(little) 18.2714 Tj
--242 TJm
-(simpler) 29.8878 Tj
--243 TJm
-(and) 14.386 Tj
--243 TJm
-(more) 20.4731 Tj
--243 TJm
-(portable,) 35.1381 Tj
-[1 0 0 1 289.263 282.17] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -289.263 -282.17] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-289.263 282.17 Td
-/F134_0 9.9626 Tf
-(BZ2_bzReadOpen) 83.6858 Tj
-[1 0 0 1 372.949 282.17] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -372.949 -282.17] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-375.368 282.17 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 392.172 282.17] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -392.172 -282.17] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-392.172 282.17 Td
-/F134_0 9.9626 Tf
-(BZ2_bzWriteOpen) 89.6634 Tj
-[1 0 0 1 481.836 282.17] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -481.836 -282.17] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-484.254 282.17 Td
-/F130_0 9.9626 Tf
-(require) 28.2141 Tj
--243 TJm
-(you) 14.9439 Tj
--242 TJm
-(to) 7.7509 Tj
-72 270.215 Td
-(pass) 17.1556 Tj
--247 TJm
-(them) 19.9252 Tj
--248 TJm
-(\002le) 12.7322 Tj
--247 TJm
-(handles) 30.4357 Tj
--247 TJm
-(\() 3.31755 Tj
-[1 0 0 1 165.421 270.215] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -165.421 -270.215] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-165.421 270.215 Td
-/F134_0 9.9626 Tf
-(FILE) 23.9102 Tj
-189.331 268.471 Td
-(*) 5.97756 Tj
-[1 0 0 1 195.309 270.215] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -195.309 -270.215] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-195.309 270.215 Td
-/F130_0 9.9626 Tf
-(s\)) 7.193 Tj
--247 TJm
-(which) 24.3486 Tj
--248 TJm
-(ha) 9.40469 Tj
-20 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--247 TJm
-(pre) 12.7222 Tj
-25 TJm
-(viously) 29.3399 Tj
--247 TJm
-(been) 18.8094 Tj
--248 TJm
-(opened) 28.772 Tj
--247 TJm
-(for) 11.6164 Tj
--247 TJm
-(reading) 29.8778 Tj
--247 TJm
-(or) 8.29885 Tj
--248 TJm
-(writing) 28.782 Tj
--247 TJm
-(respecti) 30.9837 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(ely) 12.1743 Tj
-65 TJm
-(.) 2.49065 Tj
--618 TJm
-(That) 18.2614 Tj
--248 TJm
-(a) 4.42339 Tj
-20 TJm
-(v) 4.9813 Tj
-20 TJm
-(oids) 16.6077 Tj
-72 258.26 Td
-(portability) 41.5142 Tj
--272 TJm
-(problems) 37.0808 Tj
--273 TJm
-(associated) 40.9463 Tj
--272 TJm
-(with) 17.7135 Tj
--272 TJm
-(\002le) 12.7322 Tj
--273 TJm
-(operations) 41.5042 Tj
--272 TJm
-(and) 14.386 Tj
--272 TJm
-(\002le) 12.7322 Tj
--273 TJm
-(attrib) 21.031 Tj
-20 TJm
-(utes,) 18.5404 Tj
--278 TJm
-(whilst) 24.3586 Tj
--272 TJm
-(not) 12.7322 Tj
--272 TJm
-(being) 22.1369 Tj
--273 TJm
-(much) 22.1369 Tj
--272 TJm
-(of) 8.29885 Tj
--273 TJm
-(an) 9.40469 Tj
--272 TJm
-(imposition) 42.63 Tj
--272 TJm
-(on) 9.9626 Tj
--273 TJm
-(the) 12.1743 Tj
-72 246.304 Td
-(programmer) 49.2451 Tj
-55 TJm
-(.) 2.49065 Tj
-[1 0 0 1 72 244.147] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -234.185] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 215.683 Td
-/F122_0 17.2154 Tf
-(3.1.3.) 43.0729 Tj
--278 TJm
-(Utility) 47.8244 Tj
--278 TJm
-(functions) 77.4693 Tj
--278 TJm
-(summar) 66.9679 Tj
--10 TJm
-(y) 9.57176 Tj
-[1 0 0 1 72 212.12] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -202.157] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 193.765 Td
-/F130_0 9.9626 Tf
-(F) 5.53921 Tj
-15 TJm
-(or) 8.29885 Tj
--273 TJm
-(v) 4.9813 Tj
-15 TJm
-(ery) 12.7222 Tj
--273 TJm
-(simple) 26.5703 Tj
--273 TJm
-(needs,) 25.1755 Tj
-[1 0 0 1 165.929 193.765] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -165.929 -193.765] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-165.929 193.765 Td
-/F134_0 9.9626 Tf
-(BZ2_bzBuffToBuffCompress) 143.461 Tj
-[1 0 0 1 309.391 193.765] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -309.391 -193.765] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-312.112 193.765 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 329.219 193.765] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -329.219 -193.765] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-329.219 193.765 Td
-/F134_0 9.9626 Tf
-(BZ2_bzBuffToBuffDecompress) 155.417 Tj
-[1 0 0 1 484.636 193.765] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -484.636 -193.765] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-487.357 193.765 Td
-/F130_0 9.9626 Tf
-(are) 12.1643 Tj
--273 TJm
-(pro) 13.2801 Tj
-15 TJm
-(vided.) 24.6275 Tj
-72 181.81 Td
-(These) 23.7907 Tj
--374 TJm
-(compress) 37.6287 Tj
--373 TJm
-(data) 16.5977 Tj
--374 TJm
-(in) 7.7509 Tj
--373 TJm
-(memory) 33.2053 Tj
--374 TJm
-(from) 19.3673 Tj
--373 TJm
-(one) 14.386 Tj
--374 TJm
-(b) 4.9813 Tj
-20 TJm
-(uf) 8.29885 Tj
-25 TJm
-(fer) 11.0585 Tj
--373 TJm
-(to) 7.7509 Tj
--374 TJm
-(another) 29.8778 Tj
--374 TJm
-(b) 4.9813 Tj
-20 TJm
-(uf) 8.29885 Tj
-25 TJm
-(fer) 11.0585 Tj
--373 TJm
-(in) 7.7509 Tj
--374 TJm
-(a) 4.42339 Tj
--373 TJm
-(single) 23.8007 Tj
--374 TJm
-(function) 33.2053 Tj
--373 TJm
-(call.) 16.8766 Tj
--1362 TJm
-(Y) 7.193 Tj
-110 TJm
-(ou) 9.9626 Tj
--373 TJm
-(should) 26.5703 Tj
--374 TJm
-(assess) 24.3486 Tj
-72 169.855 Td
-(whether) 32.0895 Tj
--344 TJm
-(these) 20.4731 Tj
--343 TJm
-(functions) 37.0808 Tj
--344 TJm
-(ful\002ll) 22.1469 Tj
--344 TJm
-(your) 18.2614 Tj
--343 TJm
-(memory-to-memory) 80.7967 Tj
--344 TJm
-(compression/decompression) 112.896 Tj
--343 TJm
-(requirements) 52.0147 Tj
--344 TJm
-(before) 25.4445 Tj
--344 TJm
-(in) 7.7509 Tj
-40 TJm
-(v) 4.9813 Tj
-15 TJm
-(esting) 23.8007 Tj
-72 157.9 Td
-(ef) 7.74094 Tj
-25 TJm
-(fort) 14.386 Tj
--250 TJm
-(in) 7.7509 Tj
--250 TJm
-(understanding) 56.4481 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(more) 20.4731 Tj
--250 TJm
-(general) 29.3199 Tj
--250 TJm
-(b) 4.9813 Tj
-20 TJm
-(ut) 7.7509 Tj
--250 TJm
-(more) 20.4731 Tj
--250 TJm
-(comple) 29.3299 Tj
-15 TJm
-(x) 4.9813 Tj
--250 TJm
-(lo) 7.7509 Tj
-25 TJm
-(w-le) 17.7035 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(el) 7.193 Tj
--250 TJm
-(interf) 21.579 Tj
-10 TJm
-(ace.) 15.7608 Tj
-[1 0 0 1 72 155.743] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -145.78] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 135.982 Td
-/F130_0 9.9626 Tf
-(Y) 7.193 Tj
-110 TJm
-(oshioka) 30.9936 Tj
--423 TJm
-(Tsuneo) 29.3299 Tj
--422 TJm
-(\() 3.31755 Tj
-[1 0 0 1 150.16 135.982] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -150.16 -135.982] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-150.16 135.982 Td
-/F134_0 9.9626 Tf
-(tsuneo@rr.iij4u.or.jp) 125.529 Tj
-[1 0 0 1 275.69 135.982] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -275.69 -135.982] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-275.69 135.982 Td
-/F130_0 9.9626 Tf
-(\)) 3.31755 Tj
--423 TJm
-(has) 13.2801 Tj
--422 TJm
-(contrib) 28.224 Tj
-20 TJm
-(uted) 17.1556 Tj
--423 TJm
-(some) 21.031 Tj
--423 TJm
-(functions) 37.0808 Tj
--422 TJm
-(to) 7.7509 Tj
--423 TJm
-(gi) 7.7509 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--423 TJm
-(better) 22.6848 Tj
-[1 0 0 1 476.462 135.982] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -476.462 -135.982] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-476.462 135.982 Td
-/F134_0 9.9626 Tf
-(zlib) 23.9102 Tj
-[1 0 0 1 500.372 135.982] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -500.372 -135.982] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-504.583 135.982 Td
-/F130_0 9.9626 Tf
-(compati-) 35.417 Tj
-72 124.027 Td
-(bility) 21.041 Tj
-65 TJm
-(.) 2.49065 Tj
--1446 TJm
-(These) 23.7907 Tj
--388 TJm
-(functions) 37.0808 Tj
--387 TJm
-(are) 12.1643 Tj
-[1 0 0 1 193.913 124.027] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -193.913 -124.027] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-193.913 124.027 Td
-/F134_0 9.9626 Tf
-(BZ2_bzopen) 59.7756 Tj
-[1 0 0 1 253.689 124.027] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -253.689 -124.027] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-253.689 124.027 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 260.385 124.027] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -260.385 -124.027] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-260.385 124.027 Td
-/F134_0 9.9626 Tf
-(BZ2_bzread) 59.7756 Tj
-[1 0 0 1 320.161 124.027] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -320.161 -124.027] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-320.161 124.027 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 326.857 124.027] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -326.857 -124.027] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-326.857 124.027 Td
-/F134_0 9.9626 Tf
-(BZ2_bzwrite) 65.7532 Tj
-[1 0 0 1 392.611 124.027] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -392.611 -124.027] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-392.611 124.027 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 399.306 124.027] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -399.306 -124.027] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-399.306 124.027 Td
-/F134_0 9.9626 Tf
-(BZ2_bzflush) 65.7532 Tj
-[1 0 0 1 465.06 124.027] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -465.06 -124.027] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-465.06 124.027 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 471.756 124.027] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -471.756 -124.027] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-471.756 124.027 Td
-/F134_0 9.9626 Tf
-(BZ2_bzclose) 65.7532 Tj
-[1 0 0 1 537.509 124.027] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -537.509 -124.027] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-537.509 124.027 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 72 112.072] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -112.072] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 112.072 Td
-/F134_0 9.9626 Tf
-(BZ2_bzerror) 65.7532 Tj
-[1 0 0 1 137.753 112.072] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -137.753 -112.072] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-140.408 112.072 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 157.449 112.072] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -157.449 -112.072] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-157.449 112.072 Td
-/F134_0 9.9626 Tf
-(BZ2_bzlibVersion) 95.641 Tj
-[1 0 0 1 253.091 112.072] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -253.091 -112.072] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-253.091 112.072 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
--719 TJm
-(Y) 7.193 Tj
-110 TJm
-(ou) 9.9626 Tj
--266 TJm
-(may) 17.1556 Tj
--267 TJm
-(\002nd) 15.5018 Tj
--266 TJm
-(these) 20.4731 Tj
--267 TJm
-(functions) 37.0808 Tj
--266 TJm
-(more) 20.4731 Tj
--267 TJm
-(con) 14.386 Tj
-40 TJm
-(v) 4.9813 Tj
-15 TJm
-(enient) 24.3486 Tj
--266 TJm
-(for) 11.6164 Tj
--267 TJm
-(simple) 26.5703 Tj
--266 TJm
-(\002le) 12.7322 Tj
--267 TJm
-(reading) 29.8778 Tj
-72 100.117 Td
-(and) 14.386 Tj
--270 TJm
-(wri) 13.2801 Tj
-1 TJm
-(ting,) 17.9925 Tj
--275 TJm
-(than) 17.1556 Tj
--269 TJm
-(those) 21.031 Tj
--270 TJm
-(in) 7.7509 Tj
--269 TJm
-(the) 12.1743 Tj
--270 TJm
-(high-le) 28.224 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(el) 7.193 Tj
--269 TJm
-(interf) 21.579 Tj
-10 TJm
-(ace.) 15.7608 Tj
--737 TJm
-(These) 23.7907 Tj
--270 TJm
-(functions) 37.0808 Tj
--269 TJm
-(are) 12.1643 Tj
--270 TJm
-(not) 12.7322 Tj
--269 TJm
-(\(yet\)) 18.8094 Tj
--270 TJm
-(of) 8.29885 Tj
-25 TJm
-(\002cially) 27.6761 Tj
--269 TJm
-(part) 15.4918 Tj
--270 TJm
-(of) 8.29885 Tj
--269 TJm
-(the) 12.1743 Tj
--270 TJm
-(library) 26.5603 Tj
-65 TJm
-(,) 2.49065 Tj
--274 TJm
-(and) 14.386 Tj
--270 TJm
-(are) 12.1643 Tj
-72 88.1614 Td
-(minimally) 40.9662 Tj
--291 TJm
-(documented) 48.6972 Tj
--291 TJm
-(here.) 19.6363 Tj
--867 TJm
-(If) 6.63509 Tj
--291 TJm
-(the) 12.1743 Tj
-15 TJm
-(y) 4.9813 Tj
--291 TJm
-(break,) 24.6176 Tj
--301 TJm
-(you) 14.9439 Tj
--291 TJm
-(get) 12.1743 Tj
--292 TJm
-(to) 7.7509 Tj
--291 TJm
-(k) 4.9813 Tj
-10 TJm
-(eep) 13.8281 Tj
--291 TJm
-(all) 9.9626 Tj
--291 TJm
-(the) 12.1743 Tj
--291 TJm
-(pieces.) 27.3872 Tj
--433 TJm
-(I) 3.31755 Tj
--291 TJm
-(hope) 19.3673 Tj
--291 TJm
-(to) 7.7509 Tj
--291 TJm
-(document) 39.2925 Tj
--292 TJm
-(them) 19.9252 Tj
--291 TJm
-(properly) 33.7533 Tj
--291 TJm
-(when) 21.579 Tj
-72 76.2062 Td
-(time) 17.7135 Tj
--250 TJm
-(permits.) 32.3785 Tj
-[1 0 0 1 72 74.0494] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -23.1976] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 4.3836 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 374.394 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.9737] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 43.0633 -6.7545] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -498.225 -51.071] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-541.288 51.071 Td
-/F130_0 9.9626 Tf
-(9) 4.9813 Tj
-[1 0 0 1 455.161 50.8518] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 93.5986 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.2765 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -15.0366 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-Q
-showpage
-%%PageTrailer
-pdfEndPage
-%%Page: 13 13
-%%BeginPageSetup
-%%PageOrientation: Portrait
-pdfStartPage
-0 0 612 792 re W
-%%EndPageSetup
-[] 0 d
-1 i
-0 j
-0 J
-10 M
-1 w
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-false op
-false OP
-0 0 612 792 re
-W
-q
-[1 0 0 1 72 741.554] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 14.4459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 187.197 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 -8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 76.4979 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -342.569 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-419.067 749.245 Td
-/F130_0 9.9626 Tf
-(Programming) 54.7943 Tj
--250 TJm
-(with) 17.7135 Tj
-[1 0 0 1 496.556 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -496.556 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-496.556 749.245 Td
-/F134_0 9.9626 Tf
-(libbzip2) 47.8205 Tj
-[1 0 0 1 544.376 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -278.305 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 280.796 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.974 -5.0363] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -0.4981] cm
-q
-[] 0 d
-0 J
-0.4981 w
-0 0.2491 m
-475.465 0.2491 l
-S
-Q
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 479.251 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -21.5542] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -720] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 710.037 Td
-/F130_0 9.9626 Tf
-(Y) 7.193 Tj
-110 TJm
-(oshioka) 30.9936 Tj
--250 TJm
-(also) 16.0497 Tj
--250 TJm
-(contrib) 28.224 Tj
-20 TJm
-(uted) 17.1556 Tj
--250 TJm
-(modi\002cations) 54.2464 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(allo) 14.9439 Tj
-25 TJm
-(w) 7.193 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(library) 26.5603 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(be) 9.40469 Tj
--250 TJm
-(b) 4.9813 Tj
-20 TJm
-(uilt) 13.2901 Tj
--250 TJm
-(as) 8.29885 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(W) 9.40469 Tj
-40 TJm
-(indo) 17.7135 Tj
-25 TJm
-(ws) 11.0684 Tj
--250 TJm
-(DLL.) 21.8579 Tj
-[1 0 0 1 72 707.88] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7436] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -698.137] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 675.504 Td
-/F122_0 20.6585 Tf
-(3.2.) 34.4584 Tj
--278 TJm
-(Err) 29.8515 Tj
-20 TJm
-(or) 20.6585 Tj
--278 TJm
-(handling) 86.084 Tj
-[1 0 0 1 72 670.907] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7436] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -661.164] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 653.805 Td
-/F130_0 9.9626 Tf
-(The) 15.4918 Tj
--214 TJm
-(library) 26.5603 Tj
--215 TJm
-(is) 6.64505 Tj
--214 TJm
-(designed) 35.417 Tj
--215 TJm
-(to) 7.7509 Tj
--214 TJm
-(reco) 17.1456 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(er) 7.74094 Tj
--215 TJm
-(cleanly) 28.772 Tj
--214 TJm
-(in) 7.7509 Tj
--215 TJm
-(all) 9.9626 Tj
--214 TJm
-(situations,) 40.6873 Tj
--222 TJm
-(including) 37.6387 Tj
--214 TJm
-(the) 12.1743 Tj
--215 TJm
-(w) 7.193 Tj
-10 TJm
-(orst-case) 35.4071 Tj
--214 TJm
-(situation) 34.3212 Tj
--215 TJm
-(of) 8.29885 Tj
--214 TJm
-(decompressing) 59.7656 Tj
--215 TJm
-(random) 30.4357 Tj
-72 641.85 Td
-(data.) 19.0883 Tj
--764 TJm
-(I'm) 14.386 Tj
--274 TJm
-(not) 12.7322 Tj
--275 TJm
-(100%) 23.2427 Tj
--274 TJm
-(sure) 16.5977 Tj
--274 TJm
-(that) 14.9439 Tj
--274 TJm
-(it) 5.53921 Tj
--274 TJm
-(can) 13.8281 Tj
--274 TJm
-(al) 7.193 Tj
-10 TJm
-(w) 7.193 Tj
-10 TJm
-(ays) 13.2801 Tj
--274 TJm
-(do) 9.9626 Tj
--274 TJm
-(this,) 16.8866 Tj
--280 TJm
-(so) 8.85675 Tj
--274 TJm
-(you) 14.9439 Tj
--274 TJm
-(might) 23.2527 Tj
--274 TJm
-(w) 7.193 Tj
-10 TJm
-(ant) 12.1743 Tj
--274 TJm
-(to) 7.7509 Tj
--274 TJm
-(add) 14.386 Tj
--274 TJm
-(a) 4.42339 Tj
--275 TJm
-(s) 3.87545 Tj
-1 TJm
-(ignal) 19.9252 Tj
--275 TJm
-(handler) 29.8778 Tj
--274 TJm
-(to) 7.7509 Tj
--274 TJm
-(catch) 21.0211 Tj
--274 TJm
-(se) 8.29885 Tj
-15 TJm
-(gmentation) 44.8317 Tj
-72 629.894 Td
-(violations) 39.3025 Tj
--273 TJm
-(during) 26.0123 Tj
--273 TJm
-(decompression) 59.7656 Tj
--273 TJm
-(if) 6.08715 Tj
--273 TJm
-(you) 14.9439 Tj
--273 TJm
-(are) 12.1643 Tj
--273 TJm
-(feeling) 27.6661 Tj
--274 TJm
-(especiall) 34.8591 Tj
-1 TJm
-(y) 4.9813 Tj
--274 TJm
-(paranoid.) 37.3498 Tj
--758 TJm
-(I) 3.31755 Tj
--273 TJm
-(w) 7.193 Tj
-10 TJm
-(ould) 17.7135 Tj
--273 TJm
-(be) 9.40469 Tj
--273 TJm
-(interested) 38.7346 Tj
--273 TJm
-(in) 7.7509 Tj
--274 TJm
-(hearing) 29.8778 Tj
--273 TJm
-(more) 20.4731 Tj
--273 TJm
-(about) 22.1369 Tj
-72 617.939 Td
-(the) 12.1743 Tj
--250 TJm
-(rob) 13.2801 Tj
-20 TJm
-(ustness) 28.782 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(library) 26.5603 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(corrupted) 38.1767 Tj
--250 TJm
-(compressed) 47.0334 Tj
--250 TJm
-(data.) 19.0883 Tj
-[1 0 0 1 72 615.783] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7436] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -606.039] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 596.241 Td
-/F130_0 9.9626 Tf
-(V) 7.193 Tj
-111 TJm
-(ersion) 24.3486 Tj
--251 TJm
-(1.0.3) 19.9252 Tj
--251 TJm
-(more) 20.4731 Tj
--251 TJm
-(rob) 13.2801 Tj
-20 TJm
-(ust) 11.6264 Tj
--251 TJm
-(in) 7.7509 Tj
--251 TJm
-(this) 14.396 Tj
--251 TJm
-(respect) 28.2141 Tj
--252 TJm
-(than) 17.1556 Tj
--251 TJm
-(an) 9.40469 Tj
-15 TJm
-(y) 4.9813 Tj
--251 TJm
-(pre) 12.7222 Tj
-25 TJm
-(vious) 21.589 Tj
--251 TJm
-(v) 4.9813 Tj
-15 TJm
-(ersion.) 26.8392 Tj
--626 TJm
-(In) 8.29885 Tj
-40 TJm
-(v) 4.9813 Tj
-15 TJm
-(estig) 18.8194 Tj
-5 TJm
-(ations) 23.8007 Tj
--251 TJm
-(with) 17.7135 Tj
--251 TJm
-(V) 7.193 Tj
-111 TJm
-(algrind) 28.224 Tj
--251 TJm
-(\(a) 7.74094 Tj
--252 TJm
-(tool) 15.5018 Tj
--251 TJm
-(for) 11.6164 Tj
--251 TJm
-(detecting) 36.5229 Tj
-72 584.285 Td
-(problems) 37.0808 Tj
--422 TJm
-(with) 17.7135 Tj
--421 TJm
-(memory) 33.2053 Tj
--422 TJm
-(management\)) 54.2264 Tj
--421 TJm
-(indicate) 31.5416 Tj
--422 TJm
-(that,) 17.4346 Tj
--464 TJm
-(at) 7.193 Tj
--422 TJm
-(least) 18.2614 Tj
--421 TJm
-(for) 11.6164 Tj
--422 TJm
-(the) 12.1743 Tj
--422 TJm
-(f) 3.31755 Tj
-1 TJm
-(e) 4.42339 Tj
-25 TJm
-(w) 7.193 Tj
--422 TJm
-(\002les) 16.6077 Tj
--422 TJm
-(I) 3.31755 Tj
--421 TJm
-(tested,) 25.7334 Tj
--464 TJm
-(all) 9.9626 Tj
--422 TJm
-(single-bit) 37.6387 Tj
--422 TJm
-(errors) 23.2328 Tj
--421 TJm
-(in) 7.7509 Tj
--422 TJm
-(the) 12.1743 Tj
-72 572.33 Td
-(decompressed) 56.4381 Tj
--342 TJm
-(data) 16.5977 Tj
--341 TJm
-(are) 12.1643 Tj
--342 TJm
-(caught) 26.5603 Tj
--342 TJm
-(properly) 33.7533 Tj
-65 TJm
-(,) 2.49065 Tj
--365 TJm
-(with) 17.7135 Tj
--341 TJm
-(no) 9.9626 Tj
--342 TJm
-(se) 8.29885 Tj
-15 TJm
-(gmentation) 44.8317 Tj
--342 TJm
-(f) 3.31755 Tj
-10 TJm
-(aults,) 21.31 Tj
--365 TJm
-(no) 9.9626 Tj
--341 TJm
-(uses) 17.1556 Tj
--342 TJm
-(of) 8.29885 Tj
--342 TJm
-(uninitialised) 49.2651 Tj
--342 TJm
-(data,) 19.0883 Tj
--364 TJm
-(no) 9.9626 Tj
--342 TJm
-(out) 12.7322 Tj
--342 TJm
-(of) 8.29885 Tj
--342 TJm
-(range) 22.1269 Tj
-72 560.375 Td
-(reads) 21.0211 Tj
--261 TJm
-(or) 8.29885 Tj
--260 TJm
-(writes,) 26.8392 Tj
--263 TJm
-(and) 14.386 Tj
--261 TJm
-(no) 9.9626 Tj
--261 TJm
-(in\002nit) 23.8106 Tj
-1 TJm
-(e) 4.42339 Tj
--261 TJm
-(looping) 30.4457 Tj
--261 TJm
-(in) 7.7509 Tj
--260 TJm
-(the) 12.1743 Tj
--261 TJm
-(decompressor) 55.3323 Tj
-55 TJm
-(.) 2.49065 Tj
--342 TJm
-(So) 10.5205 Tj
--260 TJm
-(it') 8.85675 Tj
-55 TJm
-(s) 3.87545 Tj
--261 TJm
-(certainly) 34.8591 Tj
--260 TJm
-(pretty) 23.2427 Tj
--261 TJm
-(rob) 13.2801 Tj
-20 TJm
-(ust,) 14.117 Tj
--263 TJm
-(although) 34.8691 Tj
--261 TJm
-(I) 3.31755 Tj
--260 TJm
-(w) 7.193 Tj
-10 TJm
-(ouldn') 26.0123 Tj
-18 TJm
-(t) 2.7696 Tj
--261 TJm
-(claim) 22.1369 Tj
-72 548.42 Td
-(it) 5.53921 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(be) 9.40469 Tj
--250 TJm
-(totally) 25.4644 Tj
--250 TJm
-(bombproof.) 46.7644 Tj
-[1 0 0 1 72 546.263] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7436] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -536.519] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 526.721 Td
-/F130_0 9.9626 Tf
-(The) 15.4918 Tj
--282 TJm
-(\002le) 12.7322 Tj
-[1 0 0 1 105.84 526.721] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -105.84 -526.721] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-105.84 526.721 Td
-/F134_0 9.9626 Tf
-(bzlib.h) 41.8429 Tj
-[1 0 0 1 147.683 526.721] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -147.683 -526.721] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-150.491 526.721 Td
-/F130_0 9.9626 Tf
-(contains) 33.2053 Tj
--282 TJm
-(all) 9.9626 Tj
--282 TJm
-(de\002nitions) 42.0721 Tj
--282 TJm
-(nee) 13.8281 Tj
-1 TJm
-(ded) 14.386 Tj
--282 TJm
-(to) 7.7509 Tj
--282 TJm
-(use) 13.2801 Tj
--282 TJm
-(the) 12.1743 Tj
--282 TJm
-(library) 26.5603 Tj
-65 TJm
-(.) 2.49065 Tj
--811 TJm
-(In) 8.29885 Tj
--282 TJm
-(particular) 38.1767 Tj
-40 TJm
-(,) 2.49065 Tj
--290 TJm
-(you) 14.9439 Tj
--282 TJm
-(should) 26.5703 Tj
--281 TJm
-(de\002nitely) 37.6387 Tj
--282 TJm
-(not) 12.7322 Tj
--282 TJm
-(include) 29.3299 Tj
-[1 0 0 1 72 514.766] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -514.766] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 514.766 Td
-/F134_0 9.9626 Tf
-(bzlib_private.h) 89.6634 Tj
-[1 0 0 1 161.664 514.766] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -161.664 -514.766] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-161.664 514.766 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
-[1 0 0 1 72 513.232] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7436] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -503.488] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 493.067 Td
-/F130_0 9.9626 Tf
-(In) 8.29885 Tj
-[1 0 0 1 82.8075 493.067] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -82.8075 -493.067] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-82.8075 493.067 Td
-/F134_0 9.9626 Tf
-(bzlib.h) 41.8429 Tj
-[1 0 0 1 124.651 493.067] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -124.651 -493.067] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-124.651 493.067 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--252 TJm
-(the) 12.1743 Tj
--252 TJm
-(v) 4.9813 Tj
-25 TJm
-(arious) 24.3486 Tj
--252 TJm
-(return) 23.7907 Tj
--252 TJm
-(v) 4.9813 Tj
-25 TJm
-(alues) 20.4731 Tj
--251 TJm
-(are) 12.1643 Tj
--252 TJm
-(de\002ned.) 31.8205 Tj
--631 TJm
-(The) 15.4918 Tj
--252 TJm
-(follo) 18.8194 Tj
-25 TJm
-(wing) 19.9252 Tj
--252 TJm
-(list) 12.1843 Tj
--251 TJm
-(is) 6.64505 Tj
--252 TJm
-(not) 12.7322 Tj
--252 TJm
-(intended) 34.3112 Tj
--252 TJm
-(as) 8.29885 Tj
--252 TJm
-(an) 9.40469 Tj
--251 TJm
-(e) 4.42339 Tj
-15 TJm
-(xhausti) 28.782 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--252 TJm
-(description) 44.2738 Tj
--252 TJm
-(of) 8.29885 Tj
-72 481.112 Td
-(the) 12.1743 Tj
--236 TJm
-(circumstances) 56.4381 Tj
--236 TJm
-(in) 7.7509 Tj
--237 TJm
-(which) 24.3486 Tj
--236 TJm
-(a) 4.42339 Tj
--236 TJm
-(gi) 7.7509 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(en) 9.40469 Tj
--236 TJm
-(v) 4.9813 Tj
-25 TJm
-(alue) 16.5977 Tj
--236 TJm
-(may) 17.1556 Tj
--237 TJm
-(be) 9.40469 Tj
--236 TJm
-(returned) 33.1954 Tj
--236 TJm
-(--) 6.63509 Tj
--236 TJm
-(those) 21.031 Tj
--236 TJm
-(descriptions) 48.1492 Tj
--236 TJm
-(are) 12.1643 Tj
--237 TJm
-(gi) 7.7509 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(en) 9.40469 Tj
--236 TJm
-(later) 17.7035 Tj
-55 TJm
-(.) 2.49065 Tj
--305 TJm
-(Rather) 26.5603 Tj
-40 TJm
-(,) 2.49065 Tj
--239 TJm
-(it) 5.53921 Tj
--236 TJm
-(is) 6.64505 Tj
--237 TJm
-(intended) 34.3112 Tj
--236 TJm
-(to) 7.7509 Tj
-72 469.157 Td
-(con) 14.386 Tj
-40 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
-15 TJm
-(y) 4.9813 Tj
--266 TJm
-(the) 12.1743 Tj
--265 TJm
-(rough) 23.2427 Tj
--266 TJm
-(meaning) 34.3112 Tj
--265 TJm
-(of) 8.29885 Tj
--266 TJm
-(each) 18.2515 Tj
--266 TJm
-(return) 23.7907 Tj
--265 TJm
-(v) 4.9813 Tj
-25 TJm
-(alue.) 19.0883 Tj
--714 TJm
-(The) 15.4918 Tj
--265 TJm
-(\002rst) 15.5018 Tj
--266 TJm
-(\002) 5.53921 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--265 TJm
-(actions) 28.224 Tj
--266 TJm
-(are) 12.1643 Tj
--266 TJm
-(normal) 28.224 Tj
--265 TJm
-(and) 14.386 Tj
--266 TJm
-(not) 12.7322 Tj
--265 TJm
-(intended) 34.3112 Tj
--266 TJm
-(to) 7.7509 Tj
--266 TJm
-(denote) 26.5603 Tj
--265 TJm
-(an) 9.40469 Tj
--266 TJm
-(error) 19.3573 Tj
-72 457.202 Td
-(situation.) 36.8118 Tj
-[1 0 0 1 72 457.102] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7436] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7435] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -437.615] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 425.76 Td
-/F134_0 9.9626 Tf
-(BZ_OK) 29.8878 Tj
-[1 0 0 1 101.888 425.76] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -32.3786 -1.3101] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -424.449] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-108 413.804 Td
-/F130_0 9.9626 Tf
-(The) 15.4918 Tj
--250 TJm
-(requested) 38.1767 Tj
--250 TJm
-(action) 24.3486 Tj
--250 TJm
-(w) 7.193 Tj
-10 TJm
-(as) 8.29885 Tj
--250 TJm
-(completed) 41.5042 Tj
--250 TJm
-(successfully) 48.6972 Tj
-65 TJm
-(.) 2.49065 Tj
-[1 0 0 1 72 411.648] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -3.766] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7436] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -398.138] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 388.34 Td
-/F134_0 9.9626 Tf
-(BZ_RUN_OK,) 59.7756 Tj
--600 TJm
-(BZ_FLUSH_OK,) 71.7307 Tj
--600 TJm
-(BZ_FINISH_OK) 71.7307 Tj
-[1 0 0 1 287.193 388.34] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -217.684 -1.31] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -387.03] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-108 376.384 Td
-/F130_0 9.9626 Tf
-(In) 8.29885 Tj
-[1 0 0 1 118.79 376.384] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -118.79 -376.384] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-118.79 376.384 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompress) 83.6858 Tj
-[1 0 0 1 202.476 376.384] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -202.476 -376.384] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-202.476 376.384 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(requested) 38.1767 Tj
--250 TJm
-(\003ush/\002nish/nothing-special) 108.493 Tj
--250 TJm
-(action) 24.3486 Tj
--250 TJm
-(w) 7.193 Tj
-10 TJm
-(as) 8.29885 Tj
--250 TJm
-(completed) 41.5042 Tj
--250 TJm
-(successfully) 48.6972 Tj
-65 TJm
-(.) 2.49065 Tj
-[1 0 0 1 72 374.228] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -3.7659] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7436] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -360.718] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 350.92 Td
-/F134_0 9.9626 Tf
-(BZ_STREAM_END) 77.7083 Tj
-[1 0 0 1 149.709 350.92] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -80.1993 -1.31] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -349.61] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-108 338.965 Td
-/F130_0 9.9626 Tf
-(Compression) 52.5826 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(data) 16.5977 Tj
--250 TJm
-(w) 7.193 Tj
-10 TJm
-(as) 8.29885 Tj
--250 TJm
-(completed,) 43.9948 Tj
--250 TJm
-(or) 8.29885 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(logical) 27.1182 Tj
--250 TJm
-(stream) 26.5603 Tj
--250 TJm
-(end) 14.386 Tj
--250 TJm
-(w) 7.193 Tj
-10 TJm
-(as) 8.29885 Tj
--250 TJm
-(detected) 33.1954 Tj
--250 TJm
-(during) 26.0123 Tj
--250 TJm
-(decompression.) 62.2563 Tj
-[1 0 0 1 72 336.808] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -3.7659] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7436] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7436] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -313.555] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 303.756 Td
-/F130_0 9.9626 Tf
-(The) 15.4918 Tj
--250 TJm
-(follo) 18.8194 Tj
-25 TJm
-(wing) 19.9252 Tj
--250 TJm
-(return) 23.7907 Tj
--250 TJm
-(v) 4.9813 Tj
-25 TJm
-(alues) 20.4731 Tj
--250 TJm
-(indicate) 31.5416 Tj
--250 TJm
-(an) 9.40469 Tj
--250 TJm
-(error) 19.3573 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(some) 21.031 Tj
--250 TJm
-(kind.) 20.2042 Tj
-[1 0 0 1 72 301.6] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7436] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7436] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -282.112] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 272.314 Td
-/F134_0 9.9626 Tf
-(BZ_CONFIG_ERROR) 89.6634 Tj
-[1 0 0 1 161.664 272.314] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -92.1544 -1.31] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -271.004] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-108 260.359 Td
-/F130_0 9.9626 Tf
-(Indicates) 35.965 Tj
--386 TJm
-(that) 14.9439 Tj
--385 TJm
-(the) 12.1743 Tj
--386 TJm
-(library) 26.5603 Tj
--386 TJm
-(has) 13.2801 Tj
--386 TJm
-(been) 18.8094 Tj
--385 TJm
-(improperly) 44.2738 Tj
--386 TJm
-(compiled) 37.0808 Tj
--386 TJm
-(on) 9.9626 Tj
--386 TJm
-(your) 18.2614 Tj
--385 TJm
-(platform) 34.3112 Tj
--386 TJm
-(--) 6.63509 Tj
--386 TJm
-(a) 4.42339 Tj
--386 TJm
-(major) 23.2427 Tj
--385 TJm
-(con\002guration) 53.1305 Tj
--386 TJm
-(error) 19.3573 Tj
-55 TJm
-(.) 2.49065 Tj
-108 248.404 Td
-(Speci\002cally) 47.0434 Tj
-65 TJm
-(,) 2.49065 Tj
--481 TJm
-(it) 5.53921 Tj
--435 TJm
-(means) 25.4544 Tj
--435 TJm
-(that) 14.9439 Tj
-[1 0 0 1 220.614 248.404] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -220.614 -248.404] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-220.614 248.404 Td
-/F134_0 9.9626 Tf
-(sizeof\(char\)) 71.7307 Tj
-[1 0 0 1 292.345 248.404] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -292.345 -248.404] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-292.345 248.404 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 299.628 248.404] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -299.628 -248.404] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-299.628 248.404 Td
-/F134_0 9.9626 Tf
-(sizeof\(short\)) 77.7083 Tj
-[1 0 0 1 377.337 248.404] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -377.337 -248.404] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-381.669 248.404 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 400.388 248.404] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -400.388 -248.404] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-400.388 248.404 Td
-/F134_0 9.9626 Tf
-(sizeof\(int\)) 65.7532 Tj
-[1 0 0 1 466.141 248.404] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -466.141 -248.404] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-470.474 248.404 Td
-/F130_0 9.9626 Tf
-(are) 12.1643 Tj
--435 TJm
-(not) 12.7322 Tj
--435 TJm
-(1,) 7.47195 Tj
--481 TJm
-(2) 4.9813 Tj
--435 TJm
-(and) 14.386 Tj
-108 236.449 Td
-(4) 4.9813 Tj
--389 TJm
-(respecti) 30.9837 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(ely) 12.1743 Tj
-65 TJm
-(,) 2.49065 Tj
--424 TJm
-(as) 8.29885 Tj
--390 TJm
-(the) 12.1743 Tj
-15 TJm
-(y) 4.9813 Tj
--389 TJm
-(should) 26.5703 Tj
--389 TJm
-(be.) 11.8953 Tj
--1456 TJm
-(Note) 19.3673 Tj
--389 TJm
-(that) 14.9439 Tj
--389 TJm
-(the) 12.1743 Tj
--389 TJm
-(library) 26.5603 Tj
--390 TJm
-(should) 26.5703 Tj
--389 TJm
-(still) 14.9539 Tj
--389 TJm
-(w) 7.193 Tj
-10 TJm
-(ork) 13.2801 Tj
--389 TJm
-(properly) 33.7533 Tj
--390 TJm
-(on) 9.9626 Tj
--389 TJm
-(64-bit) 23.8007 Tj
--389 TJm
-(platforms) 38.1866 Tj
-108 224.493 Td
-(which) 24.3486 Tj
--292 TJm
-(follo) 18.8194 Tj
-25 TJm
-(w) 7.193 Tj
--292 TJm
-(the) 12.1743 Tj
--292 TJm
-(LP64) 21.589 Tj
--292 TJm
-(programming) 54.2364 Tj
--293 TJm
-(model) 24.9065 Tj
--292 TJm
-(--) 6.63509 Tj
--292 TJm
-(that) 14.9439 Tj
--292 TJm
-(is,) 9.1357 Tj
--303 TJm
-(where) 24.3386 Tj
-[1 0 0 1 355.279 224.493] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -355.279 -224.493] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-355.279 224.493 Td
-/F134_0 9.9626 Tf
-(sizeof\(long\)) 71.7307 Tj
-[1 0 0 1 427.01 224.493] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -427.01 -224.493] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-429.92 224.493 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 447.217 224.493] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -447.217 -224.493] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-447.217 224.493 Td
-/F134_0 9.9626 Tf
-(sizeof\(void) 65.7532 Tj
-512.97 222.75 Td
-(*) 5.97756 Tj
-518.948 224.493 Td
-(\)) 5.97756 Tj
-[1 0 0 1 524.925 224.493] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -524.925 -224.493] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-527.836 224.493 Td
-/F130_0 9.9626 Tf
-(are) 12.1643 Tj
-108 212.538 Td
-(8.) 7.47195 Tj
--620 TJm
-(Under) 24.8965 Tj
--250 TJm
-(LP64,) 24.0796 Tj
-[1 0 0 1 175.606 212.538] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -175.606 -212.538] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-175.606 212.538 Td
-/F134_0 9.9626 Tf
-(sizeof\(int\)) 65.7532 Tj
-[1 0 0 1 241.36 212.538] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -241.36 -212.538] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-243.85 212.538 Td
-/F130_0 9.9626 Tf
-(is) 6.64505 Tj
--250 TJm
-(still) 14.9539 Tj
--250 TJm
-(4,) 7.47195 Tj
--250 TJm
-(so) 8.85675 Tj
-[1 0 0 1 291.74 212.538] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -291.74 -212.538] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-291.74 212.538 Td
-/F134_0 9.9626 Tf
-(libbzip2) 47.8205 Tj
-[1 0 0 1 339.56 212.538] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -339.56 -212.538] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-339.56 212.538 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--250 TJm
-(which) 24.3486 Tj
--250 TJm
-(doesn') 26.5603 Tj
-18 TJm
-(t) 2.7696 Tj
--250 TJm
-(use) 13.2801 Tj
--250 TJm
-(the) 12.1743 Tj
-[1 0 0 1 433.458 212.538] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -433.458 -212.538] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-433.458 212.538 Td
-/F134_0 9.9626 Tf
-(long) 23.9102 Tj
-[1 0 0 1 457.368 212.538] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -457.368 -212.538] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-459.859 212.538 Td
-/F130_0 9.9626 Tf
-(type,) 19.6462 Tj
--250 TJm
-(is) 6.64505 Tj
--250 TJm
-(OK.) 16.8766 Tj
-[1 0 0 1 72 210.381] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -3.7659] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7436] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -196.872] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 187.074 Td
-/F134_0 9.9626 Tf
-(BZ_SEQUENCE_ERROR) 101.619 Tj
-[1 0 0 1 173.619 187.074] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -104.11 -1.31] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -185.764] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-108 175.118 Td
-/F130_0 9.9626 Tf
-(When) 23.7907 Tj
--291 TJm
-(using) 21.589 Tj
--290 TJm
-(the) 12.1743 Tj
--291 TJm
-(library) 26.5603 Tj
-65 TJm
-(,) 2.49065 Tj
--300 TJm
-(it) 5.53921 Tj
--291 TJm
-(is) 6.64505 Tj
--290 TJm
-(important) 38.7446 Tj
--291 TJm
-(to) 7.7509 Tj
--290 TJm
-(call) 14.386 Tj
--291 TJm
-(the) 12.1743 Tj
--290 TJm
-(functions) 37.0808 Tj
--291 TJm
-(in) 7.7509 Tj
--290 TJm
-(the) 12.1743 Tj
--291 TJm
-(correct) 27.6562 Tj
--290 TJm
-(sequence) 36.5129 Tj
--291 TJm
-(and) 14.386 Tj
--290 TJm
-(with) 17.7135 Tj
--291 TJm
-(data) 16.5977 Tj
--290 TJm
-(structures) 38.7346 Tj
-108 163.163 Td
-(\(b) 8.29885 Tj
-20 TJm
-(uf) 8.29885 Tj
-25 TJm
-(fers) 14.9339 Tj
--206 TJm
-(etc\)) 14.9339 Tj
--205 TJm
-(in) 7.7509 Tj
--206 TJm
-(the) 12.1743 Tj
--205 TJm
-(correct) 27.6562 Tj
--206 TJm
-(states.) 24.6275 Tj
-[1 0 0 1 239.409 163.163] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -239.409 -163.163] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-239.409 163.163 Td
-/F134_0 9.9626 Tf
-(libbzip2) 47.8205 Tj
-[1 0 0 1 287.23 163.163] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -287.23 -163.163] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-289.278 163.163 Td
-/F130_0 9.9626 Tf
-(checks) 27.1082 Tj
--206 TJm
-(as) 8.29885 Tj
--205 TJm
-(much) 22.1369 Tj
--206 TJm
-(as) 8.29885 Tj
--205 TJm
-(it) 5.53921 Tj
--206 TJm
-(can) 13.8281 Tj
--206 TJm
-(to) 7.7509 Tj
--205 TJm
-(ensure) 26.0024 Tj
--206 TJm
-(this) 14.396 Tj
--206 TJm
-(is) 6.64505 Tj
--205 TJm
-(happening,) 43.9948 Tj
--215 TJm
-(and) 14.386 Tj
--205 TJm
-(returns) 27.6661 Tj
-[1 0 0 1 108 151.208] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -108 -151.208] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-108 151.208 Td
-/F134_0 9.9626 Tf
-(BZ_SEQUENCE_ERROR) 101.619 Tj
-[1 0 0 1 209.619 151.208] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -209.619 -151.208] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-213.27 151.208 Td
-/F130_0 9.9626 Tf
-(if) 6.08715 Tj
--367 TJm
-(not.) 15.2229 Tj
--659 TJm
-(Code) 21.031 Tj
--367 TJm
-(which) 24.3486 Tj
--367 TJm
-(complies) 35.9749 Tj
--366 TJm
-(precisely) 35.965 Tj
--367 TJm
-(with) 17.7135 Tj
--366 TJm
-(the) 12.1743 Tj
--367 TJm
-(function) 33.2053 Tj
--366 TJm
-(semantics,) 41.7831 Tj
--396 TJm
-(as) 8.29885 Tj
--367 TJm
-(detailed) 31.5416 Tj
-108 139.253 Td
-(belo) 17.1556 Tj
-25 TJm
-(w) 7.193 Tj
-65 TJm
-(,) 2.49065 Tj
--250 TJm
-(should) 26.5703 Tj
--250 TJm
-(ne) 9.40469 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(er) 7.74094 Tj
--250 TJm
-(recei) 19.3573 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--250 TJm
-(this) 14.396 Tj
--250 TJm
-(v) 4.9813 Tj
-25 TJm
-(alue;) 19.3673 Tj
--250 TJm
-(such) 18.2614 Tj
--250 TJm
-(an) 9.40469 Tj
--250 TJm
-(e) 4.42339 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(ent) 12.1743 Tj
--250 TJm
-(denotes) 30.4357 Tj
--250 TJm
-(b) 4.9813 Tj
-20 TJm
-(uggy) 19.9252 Tj
--250 TJm
-(code) 18.8094 Tj
--250 TJm
-(which) 24.3486 Tj
--250 TJm
-(you) 14.9439 Tj
--250 TJm
-(should) 26.5703 Tj
--250 TJm
-(in) 7.7509 Tj
-40 TJm
-(v) 4.9813 Tj
-15 TJm
-(estig) 18.8194 Tj
-5 TJm
-(ate.) 14.107 Tj
-[1 0 0 1 72 137.096] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -3.7659] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7436] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -123.587] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 113.788 Td
-/F134_0 9.9626 Tf
-(BZ_PARAM_ERROR) 83.6858 Tj
-[1 0 0 1 155.686 113.788] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -86.1768 -1.31] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -112.478] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-108 101.833 Td
-/F130_0 9.9626 Tf
-(Returned) 36.5229 Tj
--434 TJm
-(when) 21.579 Tj
--434 TJm
-(a) 4.42339 Tj
--434 TJm
-(parameter) 39.8305 Tj
--434 TJm
-(to) 7.7509 Tj
--434 TJm
-(a) 4.42339 Tj
--433 TJm
-(function) 33.2053 Tj
--434 TJm
-(call) 14.386 Tj
--434 TJm
-(is) 6.64505 Tj
--434 TJm
-(out) 12.7322 Tj
--434 TJm
-(of) 8.29885 Tj
--434 TJm
-(range) 22.1269 Tj
--434 TJm
-(or) 8.29885 Tj
--434 TJm
-(otherwise) 38.7346 Tj
--434 TJm
-(manifestly) 42.0621 Tj
--434 TJm
-(incorrect.) 37.8977 Tj
--1723 TJm
-(As) 11.0684 Tj
-108 89.8778 Td
-(with) 17.7135 Tj
-[1 0 0 1 131.644 89.8778] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -131.644 -89.8778] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-131.644 89.8778 Td
-/F134_0 9.9626 Tf
-(BZ_SEQUENCE_ERROR) 101.619 Tj
-[1 0 0 1 233.263 89.8778] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -233.263 -89.8778] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-233.263 89.8778 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--595 TJm
-(this) 14.396 Tj
--596 TJm
-(denotes) 30.4357 Tj
--595 TJm
-(a) 4.42339 Tj
--595 TJm
-(b) 4.9813 Tj
-20 TJm
-(ug) 9.9626 Tj
--596 TJm
-(in) 7.7509 Tj
--595 TJm
-(the) 12.1743 Tj
--595 TJm
-(client) 22.1369 Tj
--595 TJm
-(code.) 21.3 Tj
--2692 TJm
-(The) 15.4918 Tj
--596 TJm
-(distinction) 42.0721 Tj
--595 TJm
-(between) 33.1954 Tj
-[1 0 0 1 108 77.9227] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -108 -77.9227] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-108 77.9227 Td
-/F134_0 9.9626 Tf
-(BZ_PARAM_ERROR) 83.6858 Tj
-[1 0 0 1 191.686 77.9227] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -191.686 -77.9227] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-194.177 77.9227 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 211.053 77.9227] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -211.053 -77.9227] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-211.053 77.9227 Td
-/F134_0 9.9626 Tf
-(BZ_SEQUENCE_ERROR) 101.619 Tj
-[1 0 0 1 312.672 77.9227] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -312.672 -77.9227] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-315.163 77.9227 Td
-/F130_0 9.9626 Tf
-(is) 6.64505 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(bit) 10.5205 Tj
--250 TJm
-(hazy) 18.8094 Tj
-65 TJm
-(,) 2.49065 Tj
--250 TJm
-(b) 4.9813 Tj
-20 TJm
-(ut) 7.7509 Tj
--250 TJm
-(still) 14.9539 Tj
--250 TJm
-(w) 7.193 Tj
-10 TJm
-(orth) 16.0497 Tj
--250 TJm
-(making.) 32.3785 Tj
-[1 0 0 1 72 75.7659] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -3.7659] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -21.1482] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 374.394 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.8541] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 40.5726 -6.7545] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -493.841 -50.9514] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-534.414 50.9514 Td
-/F130_0 9.9626 Tf
-(10) 9.9626 Tj
-[1 0 0 1 453.269 50.8518] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 93.5985 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.2765 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-Q
-showpage
-%%PageTrailer
-pdfEndPage
-%%Page: 14 14
-%%BeginPageSetup
-%%PageOrientation: Portrait
-pdfStartPage
-0 0 612 792 re W
-%%EndPageSetup
-[] 0 d
-1 i
-0 j
-0 J
-10 M
-1 w
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-false op
-false OP
-0 0 612 792 re
-W
-q
-[1 0 0 1 72 741.554] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 14.4459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 187.197 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 -8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 76.4979 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -342.569 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-419.067 749.245 Td
-/F130_0 9.9626 Tf
-(Programming) 54.7943 Tj
--250 TJm
-(with) 17.7135 Tj
-[1 0 0 1 496.556 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -496.556 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-496.556 749.245 Td
-/F134_0 9.9626 Tf
-(libbzip2) 47.8205 Tj
-[1 0 0 1 544.376 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -278.305 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 280.796 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.974 -5.0363] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -0.4981] cm
-q
-[] 0 d
-0 J
-0.4981 w
-0 0.2491 m
-475.465 0.2491 l
-S
-Q
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 479.251 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -21.5542] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -720] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 710.037 Td
-/F134_0 9.9626 Tf
-(BZ_MEM_ERROR) 71.7307 Tj
-[1 0 0 1 143.731 710.037] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -74.2217 -1.31] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -708.727] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-108 698.082 Td
-/F130_0 9.9626 Tf
-(Returned) 36.5229 Tj
--228 TJm
-(when) 21.579 Tj
--227 TJm
-(a) 4.42339 Tj
--228 TJm
-(request) 28.772 Tj
--227 TJm
-(to) 7.7509 Tj
--228 TJm
-(allocate) 30.9837 Tj
--228 TJm
-(memory) 33.2053 Tj
--227 TJm
-(f) 3.31755 Tj
-10 TJm
-(ailed.) 21.8579 Tj
--605 TJm
-(Note) 19.3673 Tj
--228 TJm
-(that) 14.9439 Tj
--228 TJm
-(the) 12.1743 Tj
--227 TJm
-(quantity) 32.6574 Tj
--228 TJm
-(of) 8.29885 Tj
--227 TJm
-(memory) 33.2053 Tj
--228 TJm
-(needed) 28.2141 Tj
--228 TJm
-(to) 7.7509 Tj
--227 TJm
-(decompress) 47.0334 Tj
-108 686.127 Td
-(a) 4.42339 Tj
--351 TJm
-(stream) 26.5603 Tj
--352 TJm
-(cannot) 26.5603 Tj
--351 TJm
-(be) 9.40469 Tj
--352 TJm
-(determined) 44.8217 Tj
--351 TJm
-(until) 18.2714 Tj
--352 TJm
-(the) 12.1743 Tj
--351 TJm
-(stream') 29.8778 Tj
-55 TJm
-(s) 3.87545 Tj
--351 TJm
-(header) 26.5503 Tj
--352 TJm
-(has) 13.2801 Tj
--351 TJm
-(been) 18.8094 Tj
--352 TJm
-(read.) 19.6363 Tj
--1228 TJm
-(So) 10.5205 Tj
-[1 0 0 1 426.471 686.127] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -426.471 -686.127] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-426.471 686.127 Td
-/F134_0 9.9626 Tf
-(BZ2_bzDecompress) 95.641 Tj
-[1 0 0 1 522.113 686.127] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -522.113 -686.127] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-525.614 686.127 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 108 674.172] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -108 -674.172] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-108 674.172 Td
-/F134_0 9.9626 Tf
-(BZ2_bzRead) 59.7756 Tj
-[1 0 0 1 167.776 674.172] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -167.776 -674.172] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-172.13 674.172 Td
-/F130_0 9.9626 Tf
-(may) 17.1556 Tj
--437 TJm
-(return) 23.7907 Tj
-[1 0 0 1 221.784 674.172] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -221.784 -674.172] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-221.784 674.172 Td
-/F134_0 9.9626 Tf
-(BZ_MEM_ERROR) 71.7307 Tj
-[1 0 0 1 293.515 674.172] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -293.515 -674.172] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-297.867 674.172 Td
-/F130_0 9.9626 Tf
-(e) 4.42339 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(en) 9.40469 Tj
--437 TJm
-(though) 27.6761 Tj
--437 TJm
-(some) 21.031 Tj
--437 TJm
-(of) 8.29885 Tj
--437 TJm
-(the) 12.1743 Tj
--437 TJm
-(compressed) 47.0334 Tj
--437 TJm
-(data) 16.5977 Tj
--437 TJm
-(has) 13.2801 Tj
--437 TJm
-(been) 18.8094 Tj
--437 TJm
-(read.) 19.6363 Tj
-108 662.217 Td
-(The) 15.4918 Tj
--479 TJm
-(same) 20.4731 Tj
--478 TJm
-(is) 6.64505 Tj
--479 TJm
-(not) 12.7322 Tj
--478 TJm
-(true) 15.4918 Tj
--479 TJm
-(for) 11.6164 Tj
--479 TJm
-(compression;) 53.1305 Tj
--593 TJm
-(once) 18.8094 Tj
-[1 0 0 1 301.675 662.217] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -301.675 -662.217] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-301.675 662.217 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompressInit) 107.596 Tj
-[1 0 0 1 409.271 662.217] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -409.271 -662.217] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-414.04 662.217 Td
-/F130_0 9.9626 Tf
-(or) 8.29885 Tj
-[1 0 0 1 427.107 662.217] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -427.107 -662.217] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-427.107 662.217 Td
-/F134_0 9.9626 Tf
-(BZ2_bzWriteOpen) 89.6634 Tj
-[1 0 0 1 516.771 662.217] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -516.771 -662.217] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-521.539 662.217 Td
-/F130_0 9.9626 Tf
-(ha) 9.40469 Tj
-20 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
-108 650.262 Td
-(successfully) 48.6972 Tj
--250 TJm
-(completed,) 43.9948 Tj
-[1 0 0 1 205.672 650.261] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -205.672 -650.261] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-205.672 650.261 Td
-/F134_0 9.9626 Tf
-(BZ_MEM_ERROR) 71.7307 Tj
-[1 0 0 1 277.403 650.261] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -277.403 -650.261] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-279.894 650.261 Td
-/F130_0 9.9626 Tf
-(cannot) 26.5603 Tj
--250 TJm
-(occur) 22.1269 Tj
-55 TJm
-(.) 2.49065 Tj
-[1 0 0 1 72 648.105] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -3.985] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -634.157] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 624.359 Td
-/F134_0 9.9626 Tf
-(BZ_DATA_ERROR) 77.7083 Tj
-[1 0 0 1 149.709 624.359] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -80.1993 -1.31] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -623.049] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-108 612.404 Td
-/F130_0 9.9626 Tf
-(Returned) 36.5229 Tj
--266 TJm
-(when) 21.579 Tj
--265 TJm
-(a) 4.42339 Tj
--266 TJm
-(data) 16.5977 Tj
--265 TJm
-(inte) 14.9439 Tj
-15 TJm
-(grity) 18.8194 Tj
--266 TJm
-(error) 19.3573 Tj
--266 TJm
-(is) 6.64505 Tj
--265 TJm
-(detected) 33.1954 Tj
--266 TJm
-(during) 26.0123 Tj
--265 TJm
-(decompression.) 62.2563 Tj
--714 TJm
-(Most) 20.4831 Tj
--266 TJm
-(importantl) 41.5142 Tj
-1 TJm
-(y) 4.9813 Tj
-64 TJm
-(,) 2.49065 Tj
--269 TJm
-(this) 14.396 Tj
--266 TJm
-(means) 25.4544 Tj
--265 TJm
-(when) 21.579 Tj
-108 600.448 Td
-(stored) 24.3486 Tj
--222 TJm
-(and) 14.386 Tj
--223 TJm
-(computed) 39.2925 Tj
--222 TJm
-(CRCs) 23.8106 Tj
--222 TJm
-(for) 11.6164 Tj
--222 TJm
-(the) 12.1743 Tj
--223 TJm
-(data) 16.5977 Tj
--222 TJm
-(do) 9.9626 Tj
--222 TJm
-(not) 12.7322 Tj
--222 TJm
-(match.) 26.8392 Tj
--602 TJm
-(This) 17.7135 Tj
--222 TJm
-(v) 4.9813 Tj
-25 TJm
-(alue) 16.5977 Tj
--222 TJm
-(is) 6.64505 Tj
--223 TJm
-(also) 16.0497 Tj
--222 TJm
-(returned) 33.1954 Tj
--222 TJm
-(upon) 19.9252 Tj
--222 TJm
-(detection) 36.5229 Tj
--223 TJm
-(of) 8.29885 Tj
--222 TJm
-(an) 9.40469 Tj
-15 TJm
-(y) 4.9813 Tj
--222 TJm
-(other) 20.4731 Tj
-108 588.493 Td
-(anomaly) 34.3112 Tj
--250 TJm
-(in) 7.7509 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(compressed) 47.0334 Tj
--250 TJm
-(data.) 19.0883 Tj
-[1 0 0 1 72 586.336] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -3.985] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -572.389] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 562.59 Td
-/F134_0 9.9626 Tf
-(BZ_DATA_ERROR_MAGIC) 113.574 Tj
-[1 0 0 1 185.574 562.59] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -116.065 -1.31] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -561.28] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-108 550.635 Td
-/F130_0 9.9626 Tf
-(As) 11.0684 Tj
--306 TJm
-(a) 4.42339 Tj
--306 TJm
-(special) 27.6661 Tj
--306 TJm
-(case) 17.1456 Tj
--307 TJm
-(of) 8.29885 Tj
-[1 0 0 1 191.852 550.635] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -191.852 -550.635] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-191.852 550.635 Td
-/F134_0 9.9626 Tf
-(BZ_DATA_ERROR) 77.7083 Tj
-[1 0 0 1 269.561 550.635] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -269.561 -550.635] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-269.561 550.635 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--306 TJm
-(it) 5.53921 Tj
--306 TJm
-(is) 6.64505 Tj
--306 TJm
-(sometimes) 42.62 Tj
--307 TJm
-(usef) 16.5977 Tj
-1 TJm
-(ul) 7.7509 Tj
--307 TJm
-(to) 7.7509 Tj
--306 TJm
-(kno) 14.9439 Tj
-25 TJm
-(w) 7.193 Tj
--306 TJm
-(when) 21.579 Tj
--306 TJm
-(the) 12.1743 Tj
--306 TJm
-(compressed) 47.0334 Tj
--306 TJm
-(stream) 26.5603 Tj
--306 TJm
-(does) 18.2614 Tj
-108 538.68 Td
-(not) 12.7322 Tj
--250 TJm
-(start) 17.1556 Tj
--250 TJm
-(with) 17.7135 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(correct) 27.6562 Tj
--250 TJm
-(magic) 24.3486 Tj
--250 TJm
-(bytes) 21.031 Tj
--250 TJm
-(\() 3.31755 Tj
-[1 0 0 1 261.562 538.68] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -261.562 -538.68] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-261.562 538.68 Td
-/F134_0 9.9626 Tf
-('B') 17.9327 Tj
--600 TJm
-('Z') 17.9327 Tj
--600 TJm
-('h') 17.9327 Tj
-[1 0 0 1 327.316 538.68] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -327.316 -538.68] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-327.316 538.68 Td
-/F130_0 9.9626 Tf
-(\).) 5.8082 Tj
-[1 0 0 1 72 536.523] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -3.985] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -522.576] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 512.777 Td
-/F134_0 9.9626 Tf
-(BZ_IO_ERROR) 65.7532 Tj
-[1 0 0 1 137.753 512.777] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -68.2441 -1.3101] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -511.467] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-108 500.822 Td
-/F130_0 9.9626 Tf
-(Returned) 36.5229 Tj
--233 TJm
-(by) 9.9626 Tj
-[1 0 0 1 159.123 500.822] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -159.123 -500.822] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-159.123 500.822 Td
-/F134_0 9.9626 Tf
-(BZ2_bzRead) 59.7756 Tj
-[1 0 0 1 218.899 500.822] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -218.899 -500.822] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-221.218 500.822 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 237.923 500.822] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -237.923 -500.822] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-237.923 500.822 Td
-/F134_0 9.9626 Tf
-(BZ2_bzWrite) 65.7532 Tj
-[1 0 0 1 303.676 500.822] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -303.676 -500.822] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-305.995 500.822 Td
-/F130_0 9.9626 Tf
-(when) 21.579 Tj
--233 TJm
-(there) 19.9152 Tj
--232 TJm
-(is) 6.64505 Tj
--233 TJm
-(an) 9.40469 Tj
--233 TJm
-(error) 19.3573 Tj
--233 TJm
-(reading) 29.8778 Tj
--232 TJm
-(or) 8.29885 Tj
--233 TJm
-(writing) 28.782 Tj
--233 TJm
-(in) 7.7509 Tj
--233 TJm
-(the) 12.1743 Tj
--232 TJm
-(compressed) 47.0334 Tj
-108 488.867 Td
-(\002le,) 15.2229 Tj
--384 TJm
-(and) 14.386 Tj
--357 TJm
-(by) 9.9626 Tj
-[1 0 0 1 158.511 488.867] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -158.511 -488.867] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-158.511 488.867 Td
-/F134_0 9.9626 Tf
-(BZ2_bzReadOpen) 83.6858 Tj
-[1 0 0 1 242.197 488.867] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -242.197 -488.867] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-245.755 488.867 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 263.698 488.867] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -263.698 -488.867] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-263.698 488.867 Td
-/F134_0 9.9626 Tf
-(BZ2_bzWriteOpen) 89.6634 Tj
-[1 0 0 1 353.362 488.867] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -353.362 -488.867] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-356.92 488.867 Td
-/F130_0 9.9626 Tf
-(for) 11.6164 Tj
--357 TJm
-(attempts) 33.7633 Tj
--357 TJm
-(to) 7.7509 Tj
--357 TJm
-(use) 13.2801 Tj
--357 TJm
-(a) 4.42339 Tj
--357 TJm
-(\002le) 12.7322 Tj
--357 TJm
-(for) 11.6164 Tj
--358 TJm
-(which) 24.3486 Tj
--357 TJm
-(the) 12.1743 Tj
--357 TJm
-(error) 19.3573 Tj
-108 476.912 Td
-(indicator) 35.417 Tj
--260 TJm
-(\(viz,) 17.9825 Tj
-[1 0 0 1 166.603 476.912] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -166.603 -476.912] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-166.603 476.912 Td
-/F134_0 9.9626 Tf
-(ferror\(f\)) 53.798 Tj
-[1 0 0 1 220.401 476.912] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -220.401 -476.912] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-220.401 476.912 Td
-/F130_0 9.9626 Tf
-(\)) 3.31755 Tj
--260 TJm
-(is) 6.64505 Tj
--260 TJm
-(set.) 13.5591 Tj
--679 TJm
-(On) 12.1743 Tj
--260 TJm
-(receipt) 27.1082 Tj
--260 TJm
-(of) 8.29885 Tj
-[1 0 0 1 311.223 476.912] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -311.223 -476.912] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-311.223 476.912 Td
-/F134_0 9.9626 Tf
-(BZ_IO_ERROR) 65.7532 Tj
-[1 0 0 1 376.976 476.912] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -376.976 -476.912] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-376.976 476.912 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--260 TJm
-(the) 12.1743 Tj
--260 TJm
-(caller) 22.1269 Tj
--260 TJm
-(should) 26.5703 Tj
--260 TJm
-(consult) 28.782 Tj
-[1 0 0 1 482.068 476.912] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -482.068 -476.912] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-482.068 476.912 Td
-/F134_0 9.9626 Tf
-(errno) 29.8878 Tj
-[1 0 0 1 511.956 476.912] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -511.956 -476.912] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-514.546 476.912 Td
-/F130_0 9.9626 Tf
-(and/or) 25.4544 Tj
-[1 0 0 1 108 464.957] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -108 -464.957] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-108 464.957 Td
-/F134_0 9.9626 Tf
-(perror) 35.8654 Tj
-[1 0 0 1 143.865 464.957] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -143.865 -464.957] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-146.356 464.957 Td
-/F130_0 9.9626 Tf
-(to) 7.7509 Tj
--250 TJm
-(acquire) 29.3199 Tj
--250 TJm
-(operating-system) 68.6224 Tj
--250 TJm
-(speci\002c) 30.4357 Tj
--250 TJm
-(information) 47.0434 Tj
--250 TJm
-(about) 22.1369 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(problem.) 35.696 Tj
-[1 0 0 1 72 462.8] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -3.9849] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -448.852] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 439.054 Td
-/F134_0 9.9626 Tf
-(BZ_UNEXPECTED_EOF) 101.619 Tj
-[1 0 0 1 173.619 439.054] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -104.11 -1.31] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -437.744] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-108 427.099 Td
-/F130_0 9.9626 Tf
-(Returned) 36.5229 Tj
--250 TJm
-(by) 9.9626 Tj
-[1 0 0 1 159.467 427.099] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -159.467 -427.099] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-159.467 427.099 Td
-/F134_0 9.9626 Tf
-(BZ2_bzRead) 59.7756 Tj
-[1 0 0 1 219.242 427.099] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -219.242 -427.099] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-221.733 427.099 Td
-/F130_0 9.9626 Tf
-(when) 21.579 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(compressed) 47.0334 Tj
--250 TJm
-(\002le) 12.7322 Tj
--250 TJm
-(\002nishes) 30.4457 Tj
--250 TJm
-(before) 25.4445 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(logical) 27.1182 Tj
--250 TJm
-(end) 14.386 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(stream) 26.5603 Tj
--250 TJm
-(is) 6.64505 Tj
--250 TJm
-(detected.) 35.686 Tj
-[1 0 0 1 72 424.942] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -3.985] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -410.994] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 401.196 Td
-/F134_0 9.9626 Tf
-(BZ_OUTBUFF_FULL) 89.6634 Tj
-[1 0 0 1 161.664 401.196] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -92.1544 -1.31] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -399.886] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-108 389.241 Td
-/F130_0 9.9626 Tf
-(Returned) 36.5229 Tj
--258 TJm
-(by) 9.9626 Tj
-[1 0 0 1 159.632 389.241] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -159.632 -389.241] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-159.632 389.241 Td
-/F134_0 9.9626 Tf
-(BZ2_bzBuffToBuffCompress) 143.461 Tj
-[1 0 0 1 303.094 389.241] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -303.094 -389.241] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-305.668 389.241 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 322.627 389.241] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -322.627 -389.241] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-322.627 389.241 Td
-/F134_0 9.9626 Tf
-(BZ2_bzBuffToBuffDecompress) 155.417 Tj
-[1 0 0 1 478.044 389.241] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -478.044 -389.241] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-480.618 389.241 Td
-/F130_0 9.9626 Tf
-(to) 7.7509 Tj
--258 TJm
-(indicate) 31.5416 Tj
--259 TJm
-(that) 14.9439 Tj
-108 377.286 Td
-(the) 12.1743 Tj
--250 TJm
-(output) 25.4644 Tj
--250 TJm
-(data) 16.5977 Tj
--250 TJm
-(will) 15.5018 Tj
--250 TJm
-(not) 12.7322 Tj
--250 TJm
-(\002t) 8.30881 Tj
--250 TJm
-(into) 15.5018 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(output) 25.4644 Tj
--250 TJm
-(b) 4.9813 Tj
-20 TJm
-(uf) 8.29885 Tj
-25 TJm
-(fer) 11.0585 Tj
--250 TJm
-(pro) 13.2801 Tj
-15 TJm
-(vided.) 24.6275 Tj
-[1 0 0 1 72 375.129] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -3.985] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -351.218] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 328.585 Td
-/F122_0 20.6585 Tf
-(3.3.) 34.4584 Tj
--278 TJm
-(Lo) 25.2447 Tj
-15 TJm
-(w-le) 40.1808 Tj
-15 TJm
-(vel) 28.7153 Tj
--278 TJm
-(interface) 86.1046 Tj
-[1 0 0 1 72 328.327] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -318.364] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 297.964 Td
-/F122_0 17.2154 Tf
-(3.3.1.) 43.0729 Tj
-[1 0 0 1 119.858 297.964] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -119.858 -297.964] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-119.858 297.964 Td
-/F392_0 17.2154 Tf
-(BZ2_bzCompressInit) 185.926 Tj
-[1 0 0 1 305.785 297.964] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -233.785 -2.3327] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -244.779] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 374.394 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 40.5726 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -493.841 -50.8518] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-534.414 50.8518 Td
-/F130_0 9.9626 Tf
-(11) 9.9626 Tj
-[1 0 0 1 453.269 50.8518] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 93.5985 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.2765 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-Q
-showpage
-%%PageTrailer
-pdfEndPage
-%%Page: 15 15
-%%BeginPageSetup
-%%PageOrientation: Portrait
-pdfStartPage
-0 0 612 792 re W
-%%EndPageSetup
-[] 0 d
-1 i
-0 j
-0 J
-10 M
-1 w
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-false op
-false OP
-0 0 612 792 re
-W
-q
-[1 0 0 1 72 741.554] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 14.4459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 187.197 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 -8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 76.4979 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -342.569 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-419.067 749.245 Td
-/F130_0 9.9626 Tf
-(Programming) 54.7943 Tj
--250 TJm
-(with) 17.7135 Tj
-[1 0 0 1 496.556 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -496.556 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-496.556 749.245 Td
-/F134_0 9.9626 Tf
-(libbzip2) 47.8205 Tj
-[1 0 0 1 544.376 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -278.305 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 280.796 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.974 -5.0363] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -0.4981] cm
-q
-[] 0 d
-0 J
-0.4981 w
-0 0.2491 m
-475.465 0.2491 l
-S
-Q
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 479.251 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -296.523] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 274.969 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 271.382] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -711.631] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 711.631 Td
-/F134_0 9.9626 Tf
-(typedef) 41.8429 Tj
--426 TJm
-(struct) 35.8654 Tj
--426 TJm
-({) 5.97756 Tj
-98.4879 699.676 Td
-(char) 23.9102 Tj
-126.642 697.933 Td
-(*) 5.97756 Tj
-132.62 699.676 Td
-(next_in;) 47.8205 Tj
-98.4879 687.721 Td
-(unsigned) 47.8205 Tj
--426 TJm
-(int) 17.9327 Tj
--426 TJm
-(avail_in;) 53.798 Tj
-98.4879 675.766 Td
-(unsigned) 47.8205 Tj
--426 TJm
-(int) 17.9327 Tj
--426 TJm
-(total_in_lo32;) 83.6858 Tj
-98.4879 663.811 Td
-(unsigned) 47.8205 Tj
--426 TJm
-(int) 17.9327 Tj
--426 TJm
-(total_in_hi32;) 83.6858 Tj
-98.4879 639.9 Td
-(char) 23.9102 Tj
-126.642 638.157 Td
-(*) 5.97756 Tj
-132.62 639.9 Td
-(next_out;) 53.798 Tj
-98.4879 627.945 Td
-(unsigned) 47.8205 Tj
--426 TJm
-(int) 17.9327 Tj
--426 TJm
-(avail_out;) 59.7756 Tj
-98.4879 615.99 Td
-(unsigned) 47.8205 Tj
--426 TJm
-(int) 17.9327 Tj
--426 TJm
-(total_out_lo32;) 89.6634 Tj
-98.4879 604.035 Td
-(unsigned) 47.8205 Tj
--426 TJm
-(int) 17.9327 Tj
--426 TJm
-(total_out_hi32;) 89.6634 Tj
-98.4879 580.125 Td
-(void) 23.9102 Tj
-126.642 578.381 Td
-(*) 5.97756 Tj
-132.62 580.125 Td
-(state;) 35.8654 Tj
-98.4879 556.214 Td
-(void) 23.9102 Tj
-126.642 554.471 Td
-(*) 5.97756 Tj
-132.62 556.214 Td
-(\() 5.97756 Tj
-138.597 554.471 Td
-(*) 5.97756 Tj
-144.575 556.214 Td
-(bzalloc\)\(void) 77.7083 Tj
-226.527 554.471 Td
-(*) 5.97756 Tj
-232.505 556.214 Td
-(,int,int\);) 59.7756 Tj
-98.4879 544.259 Td
-(void) 23.9102 Tj
--426 TJm
-(\() 5.97756 Tj
-132.62 542.516 Td
-(*) 5.97756 Tj
-138.597 544.259 Td
-(bzfree\)\(void) 71.7307 Tj
-214.572 542.516 Td
-(*) 5.97756 Tj
-220.55 544.259 Td
-(,void) 29.8878 Tj
-254.682 542.516 Td
-(*) 5.97756 Tj
-260.659 544.259 Td
-(\);) 11.9551 Tj
-98.4879 532.304 Td
-(void) 23.9102 Tj
-126.642 530.56 Td
-(*) 5.97756 Tj
-132.62 532.304 Td
-(opaque;) 41.8429 Tj
-89.9999 520.349 Td
-(}) 5.97756 Tj
--426 TJm
-(bz_stream;) 59.7756 Tj
-89.9999 496.438 Td
-(int) 17.9327 Tj
--426 TJm
-(BZ2_bzCompressInit) 107.596 Tj
--426 TJm
-(\() 5.97756 Tj
--426 TJm
-(bz_stream) 53.798 Tj
-292.281 494.695 Td
-(*) 5.97756 Tj
-298.258 496.438 Td
-(strm,) 29.8878 Tj
-196.099 484.483 Td
-(int) 17.9327 Tj
--426 TJm
-(blockSize100k,) 83.6858 Tj
-196.099 472.528 Td
-(int) 17.9327 Tj
--426 TJm
-(verbosity,) 59.7756 Tj
-196.099 460.573 Td
-(int) 17.9327 Tj
--426 TJm
-(workFactor) 59.7756 Tj
--426 TJm
-(\);) 11.9551 Tj
-[1 0 0 1 72 445.031] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -435.068] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 423.113 Td
-/F130_0 9.9626 Tf
-(Prepares) 34.3012 Tj
--356 TJm
-(for) 11.6164 Tj
--356 TJm
-(compression.) 52.8516 Tj
--1256 TJm
-(The) 15.4918 Tj
-[1 0 0 1 209.409 423.113] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -209.409 -423.113] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-209.409 423.113 Td
-/F134_0 9.9626 Tf
-(bz_stream) 53.798 Tj
-[1 0 0 1 263.208 423.113] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -263.208 -423.113] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-266.754 423.113 Td
-/F130_0 9.9626 Tf
-(structure) 34.8591 Tj
--356 TJm
-(holds) 21.589 Tj
--356 TJm
-(all) 9.9626 Tj
--356 TJm
-(data) 16.5977 Tj
--356 TJm
-(pertaining) 40.3983 Tj
--356 TJm
-(to) 7.7509 Tj
--356 TJm
-(the) 12.1743 Tj
--356 TJm
-(compression) 50.3609 Tj
--355 TJm
-(acti) 14.386 Tj
-25 TJm
-(vity) 15.5018 Tj
-65 TJm
-(.) 2.49065 Tj
--1256 TJm
-(A) 7.193 Tj
-[1 0 0 1 72 411.158] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -411.158] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 411.158 Td
-/F134_0 9.9626 Tf
-(bz_stream) 53.798 Tj
-[1 0 0 1 125.798 411.158] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -125.798 -411.158] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-128.581 411.158 Td
-/F130_0 9.9626 Tf
-(structure) 34.8591 Tj
--279 TJm
-(should) 26.5703 Tj
--280 TJm
-(be) 9.40469 Tj
--279 TJm
-(allocated) 35.965 Tj
--279 TJm
-(and) 14.386 Tj
--280 TJm
-(initialised) 39.3025 Tj
--279 TJm
-(prior) 19.3673 Tj
--279 TJm
-(to) 7.7509 Tj
--279 TJm
-(the) 12.1743 Tj
--280 TJm
-(call.) 16.8766 Tj
--796 TJm
-(The) 15.4918 Tj
--279 TJm
-(\002elds) 21.589 Tj
--279 TJm
-(of) 8.29885 Tj
-[1 0 0 1 431.939 411.158] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -431.939 -411.158] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-431.939 411.158 Td
-/F134_0 9.9626 Tf
-(bz_stream) 53.798 Tj
-[1 0 0 1 485.738 411.158] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -485.738 -411.158] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-488.52 411.158 Td
-/F130_0 9.9626 Tf
-(comprise) 36.5229 Tj
--279 TJm
-(the) 12.1743 Tj
-72 399.203 Td
-(entirety) 30.4357 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(user) 16.5977 Tj
-20 TJm
-(-visible) 29.8878 Tj
--250 TJm
-(data.) 19.0883 Tj
-[1 0 0 1 204.422 399.203] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -204.422 -399.203] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-204.422 399.203 Td
-/F134_0 9.9626 Tf
-(state) 29.8878 Tj
-[1 0 0 1 234.31 399.203] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -234.31 -399.203] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-236.8 399.203 Td
-/F130_0 9.9626 Tf
-(is) 6.64505 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(pointer) 28.224 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(pri) 11.0684 Tj
-25 TJm
-(v) 4.9813 Tj
-25 TJm
-(ate) 11.6164 Tj
--250 TJm
-(data) 16.5977 Tj
--250 TJm
-(structures) 38.7346 Tj
--250 TJm
-(required) 33.1954 Tj
--250 TJm
-(for) 11.6164 Tj
--250 TJm
-(compression.) 52.8516 Tj
-[1 0 0 1 72 397.046] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -387.083] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 377.285 Td
-/F130_0 9.9626 Tf
-(Custom) 31.0036 Tj
--372 TJm
-(memory) 33.2053 Tj
--372 TJm
-(allocators) 38.7346 Tj
--372 TJm
-(are) 12.1643 Tj
--372 TJm
-(supported,) 41.7831 Tj
--403 TJm
-(via) 12.1743 Tj
--372 TJm
-(\002elds) 21.589 Tj
-[1 0 0 1 288.908 377.285] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -288.908 -377.285] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-288.908 377.285 Td
-/F134_0 9.9626 Tf
-(bzalloc) 41.8429 Tj
-[1 0 0 1 330.751 377.285] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -330.751 -377.285] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-330.751 377.285 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 337.253 377.285] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -337.253 -377.285] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-337.253 377.285 Td
-/F134_0 9.9626 Tf
-(bzfree) 35.8654 Tj
-[1 0 0 1 373.118 377.285] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -373.118 -377.285] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-373.118 377.285 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--403 TJm
-(and) 14.386 Tj
-[1 0 0 1 397.714 377.285] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -397.714 -377.285] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-397.714 377.285 Td
-/F134_0 9.9626 Tf
-(opaque) 35.8654 Tj
-[1 0 0 1 433.579 377.285] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -433.579 -377.285] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-433.579 377.285 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
--1353 TJm
-(The) 15.4918 Tj
--372 TJm
-(v) 4.9813 Tj
-25 TJm
-(alue) 16.5977 Tj
-[1 0 0 1 493.782 377.285] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -493.782 -377.285] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-493.782 377.285 Td
-/F134_0 9.9626 Tf
-(opaque) 35.8654 Tj
-[1 0 0 1 529.648 377.285] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -529.648 -377.285] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-533.355 377.285 Td
-/F130_0 9.9626 Tf
-(is) 6.64505 Tj
-72 365.33 Td
-(passed) 26.5603 Tj
--306 TJm
-(to) 7.7509 Tj
--306 TJm
-(as) 8.29885 Tj
--306 TJm
-(the) 12.1743 Tj
--306 TJm
-(\002rst) 15.5018 Tj
--306 TJm
-(ar) 7.74094 Tj
-18 TJm
-(gument) 29.8878 Tj
--306 TJm
-(to) 7.7509 Tj
--306 TJm
-(all) 9.9626 Tj
--306 TJm
-(calls) 18.2614 Tj
--305 TJm
-(to) 7.7509 Tj
-[1 0 0 1 253.941 365.33] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -253.941 -365.33] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-253.941 365.33 Td
-/F134_0 9.9626 Tf
-(bzalloc) 41.8429 Tj
-[1 0 0 1 295.784 365.33] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -295.784 -365.33] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-298.832 365.33 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 316.266 365.33] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -316.266 -365.33] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-316.266 365.33 Td
-/F134_0 9.9626 Tf
-(bzfree) 35.8654 Tj
-[1 0 0 1 352.132 365.33] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -352.132 -365.33] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-352.132 365.33 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--320 TJm
-(b) 4.9813 Tj
-20 TJm
-(ut) 7.7509 Tj
--306 TJm
-(is) 6.64505 Tj
--306 TJm
-(otherwise) 38.7346 Tj
--306 TJm
-(ignored) 30.4357 Tj
--306 TJm
-(by) 9.9626 Tj
--306 TJm
-(the) 12.1743 Tj
--306 TJm
-(library) 26.5603 Tj
-65 TJm
-(.) 2.49065 Tj
--955 TJm
-(The) 15.4918 Tj
-72 353.375 Td
-(call) 14.386 Tj
-[1 0 0 1 89.4309 353.375] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -89.4309 -353.375] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-89.4309 353.375 Td
-/F134_0 9.9626 Tf
-(bzalloc) 41.8429 Tj
--600 TJm
-(\() 5.97756 Tj
--600 TJm
-(opaque,) 41.8429 Tj
--600 TJm
-(n,) 11.9551 Tj
--600 TJm
-(m) 5.97756 Tj
--600 TJm
-(\)) 5.97756 Tj
-[1 0 0 1 232.893 353.375] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -232.893 -353.375] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-235.938 353.375 Td
-/F130_0 9.9626 Tf
-(is) 6.64505 Tj
--306 TJm
-(e) 4.42339 Tj
-15 TJm
-(xpected) 30.9837 Tj
--305 TJm
-(to) 7.7509 Tj
--306 TJm
-(return) 23.7907 Tj
--306 TJm
-(a) 4.42339 Tj
--305 TJm
-(pointer) 28.224 Tj
-[1 0 0 1 360.3 353.375] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -360.3 -353.375] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-360.3 353.375 Td
-/F134_0 9.9626 Tf
-(p) 5.97756 Tj
-[1 0 0 1 366.277 353.375] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -366.277 -353.375] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-369.322 353.375 Td
-/F130_0 9.9626 Tf
-(to) 7.7509 Tj
-[1 0 0 1 380.118 353.375] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -380.118 -353.375] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-380.118 353.375 Td
-/F134_0 9.9626 Tf
-(n) 5.97756 Tj
-392.073 351.631 Td
-(*) 5.97756 Tj
-404.029 353.375 Td
-(m) 5.97756 Tj
-[1 0 0 1 410.006 353.375] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -410.006 -353.375] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-413.051 353.375 Td
-/F130_0 9.9626 Tf
-(bytes) 21.031 Tj
--306 TJm
-(of) 8.29885 Tj
--305 TJm
-(memory) 33.2053 Tj
-65 TJm
-(,) 2.49065 Tj
--320 TJm
-(and) 14.386 Tj
-[1 0 0 1 504.135 353.375] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -504.135 -353.375] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-504.135 353.375 Td
-/F134_0 9.9626 Tf
-(bzfree) 35.8654 Tj
-72 341.42 Td
-(\() 5.97756 Tj
--600 TJm
-(opaque,) 41.8429 Tj
--600 TJm
-(p) 5.97756 Tj
--600 TJm
-(\)) 5.97756 Tj
-[1 0 0 1 149.709 341.42] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -149.709 -341.42] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-152.199 341.42 Td
-/F130_0 9.9626 Tf
-(should) 26.5703 Tj
--250 TJm
-(free) 15.4819 Tj
--250 TJm
-(that) 14.9439 Tj
--250 TJm
-(memory) 33.2053 Tj
-65 TJm
-(.) 2.49065 Tj
-[1 0 0 1 72 339.263] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -329.3] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 319.502 Td
-/F130_0 9.9626 Tf
-(If) 6.63509 Tj
--280 TJm
-(you) 14.9439 Tj
--280 TJm
-(don') 18.2614 Tj
-18 TJm
-(t) 2.7696 Tj
--280 TJm
-(w) 7.193 Tj
-10 TJm
-(ant) 12.1743 Tj
--279 TJm
-(to) 7.7509 Tj
--280 TJm
-(use) 13.2801 Tj
--280 TJm
-(a) 4.42339 Tj
--280 TJm
-(custom) 28.782 Tj
--280 TJm
-(memory) 33.2053 Tj
--279 TJm
-(allocator) 34.8591 Tj
-40 TJm
-(,) 2.49065 Tj
--288 TJm
-(set) 11.0684 Tj
-[1 0 0 1 299.9 319.502] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -299.9 -319.502] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-299.9 319.502 Td
-/F134_0 9.9626 Tf
-(bzalloc) 41.8429 Tj
-[1 0 0 1 341.743 319.502] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -341.743 -319.502] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-341.743 319.502 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 347.096 319.502] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -347.096 -319.502] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-347.096 319.502 Td
-/F134_0 9.9626 Tf
-(bzfree) 35.8654 Tj
-[1 0 0 1 382.961 319.502] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -382.961 -319.502] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-385.749 319.502 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 402.923 319.502] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -402.923 -319.502] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-402.923 319.502 Td
-/F134_0 9.9626 Tf
-(opaque) 35.8654 Tj
-[1 0 0 1 438.788 319.502] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -438.788 -319.502] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-441.576 319.502 Td
-/F130_0 9.9626 Tf
-(to) 7.7509 Tj
-[1 0 0 1 452.115 319.502] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -452.115 -319.502] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-452.115 319.502 Td
-/F134_0 9.9626 Tf
-(NULL) 23.9102 Tj
-[1 0 0 1 476.025 319.502] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -476.025 -319.502] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-476.025 319.502 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--280 TJm
-(and) 14.386 Tj
--280 TJm
-(the) 12.1743 Tj
--279 TJm
-(library) 26.5603 Tj
-72 307.547 Td
-(will) 15.5018 Tj
--250 TJm
-(then) 17.1556 Tj
--250 TJm
-(use) 13.2801 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(standard) 33.7533 Tj
-[1 0 0 1 176.318 307.547] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -176.318 -307.547] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-176.318 307.547 Td
-/F134_0 9.9626 Tf
-(malloc) 35.8654 Tj
-[1 0 0 1 212.183 307.547] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -212.183 -307.547] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-214.674 307.547 Td
-/F130_0 9.9626 Tf
-(/) 2.7696 Tj
-[1 0 0 1 219.934 307.547] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -219.934 -307.547] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-219.934 307.547 Td
-/F134_0 9.9626 Tf
-(free) 23.9102 Tj
-[1 0 0 1 243.844 307.547] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -243.844 -307.547] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-246.335 307.547 Td
-/F130_0 9.9626 Tf
-(routines.) 34.5901 Tj
-[1 0 0 1 72 307.392] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -297.43] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 285.629 Td
-/F130_0 9.9626 Tf
-(Before) 27.1082 Tj
--362 TJm
-(calling) 27.1182 Tj
-[1 0 0 1 133.438 285.629] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -133.438 -285.629] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-133.438 285.629 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompressInit) 107.596 Tj
-[1 0 0 1 241.035 285.629] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -241.035 -285.629] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-241.035 285.629 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--390 TJm
-(\002elds) 21.589 Tj
-[1 0 0 1 272.606 285.629] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -272.606 -285.629] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-272.606 285.629 Td
-/F134_0 9.9626 Tf
-(bzalloc) 41.8429 Tj
-[1 0 0 1 314.449 285.629] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -314.449 -285.629] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-314.449 285.629 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 320.825 285.629] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -320.825 -285.629] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-320.825 285.629 Td
-/F134_0 9.9626 Tf
-(bzfree) 35.8654 Tj
-[1 0 0 1 356.69 285.629] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -356.69 -285.629] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-360.296 285.629 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 378.288 285.629] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -378.288 -285.629] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-378.288 285.629 Td
-/F134_0 9.9626 Tf
-(opaque) 35.8654 Tj
-[1 0 0 1 414.154 285.629] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -414.154 -285.629] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-417.76 285.629 Td
-/F130_0 9.9626 Tf
-(should) 26.5703 Tj
--362 TJm
-(be) 9.40469 Tj
--362 TJm
-(\002lled) 20.4831 Tj
--362 TJm
-(appropriately) 53.1206 Tj
-65 TJm
-(,) 2.49065 Tj
-72 273.674 Td
-(as) 8.29885 Tj
--322 TJm
-(just) 14.396 Tj
--323 TJm
-(described.) 40.6673 Tj
--1055 TJm
-(Upon) 22.1369 Tj
--322 TJm
-(return,) 26.2813 Tj
--341 TJm
-(the) 12.1743 Tj
--322 TJm
-(internal) 30.4357 Tj
--323 TJm
-(state) 18.2614 Tj
--322 TJm
-(will) 15.5018 Tj
--323 TJm
-(ha) 9.40469 Tj
-20 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--322 TJm
-(been) 18.8094 Tj
--323 TJm
-(allocated) 35.965 Tj
--322 TJm
-(and) 14.386 Tj
--323 TJm
-(initialised,) 41.7931 Tj
--340 TJm
-(and) 14.386 Tj
-[1 0 0 1 459.801 273.674] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -459.801 -273.674] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-459.801 273.674 Td
-/F134_0 9.9626 Tf
-(total_in_lo32) 77.7083 Tj
-[1 0 0 1 537.509 273.674] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -537.509 -273.674] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-537.509 273.674 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 72 261.718] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -261.718] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 261.718 Td
-/F134_0 9.9626 Tf
-(total_in_hi32) 77.7083 Tj
-[1 0 0 1 149.709 261.718] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -149.709 -261.718] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-149.709 261.718 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 155.006 261.718] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -155.006 -261.718] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-155.006 261.718 Td
-/F134_0 9.9626 Tf
-(total_out_lo32) 83.6858 Tj
-[1 0 0 1 238.692 261.718] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -238.692 -261.718] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-241.435 261.718 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 258.564 261.718] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -258.564 -261.718] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-258.564 261.718 Td
-/F134_0 9.9626 Tf
-(total_out_hi32) 83.6858 Tj
-[1 0 0 1 342.25 261.718] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -342.25 -261.718] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-344.994 261.718 Td
-/F130_0 9.9626 Tf
-(will) 15.5018 Tj
--275 TJm
-(ha) 9.40469 Tj
-20 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--276 TJm
-(been) 18.8094 Tj
--275 TJm
-(set) 11.0684 Tj
--275 TJm
-(to) 7.7509 Tj
--276 TJm
-(zero.) 19.6363 Tj
--772 TJm
-(These) 23.7907 Tj
--275 TJm
-(four) 16.5977 Tj
--276 TJm
-(\002elds) 21.589 Tj
--275 TJm
-(are) 12.1643 Tj
-72 249.763 Td
-(used) 18.2614 Tj
--340 TJm
-(by) 9.9626 Tj
--339 TJm
-(the) 12.1743 Tj
--340 TJm
-(library) 26.5603 Tj
--339 TJm
-(to) 7.7509 Tj
--340 TJm
-(inform) 27.1182 Tj
--339 TJm
-(the) 12.1743 Tj
--340 TJm
-(caller) 22.1269 Tj
--339 TJm
-(of) 8.29885 Tj
--340 TJm
-(the) 12.1743 Tj
--339 TJm
-(total) 17.7135 Tj
--340 TJm
-(amount) 29.8878 Tj
--339 TJm
-(of) 8.29885 Tj
--340 TJm
-(data) 16.5977 Tj
--340 TJm
-(passed) 26.5603 Tj
--339 TJm
-(into) 15.5018 Tj
--340 TJm
-(and) 14.386 Tj
--339 TJm
-(out) 12.7322 Tj
--340 TJm
-(of) 8.29885 Tj
--339 TJm
-(the) 12.1743 Tj
--340 TJm
-(library) 26.5603 Tj
-65 TJm
-(,) 2.49065 Tj
--362 TJm
-(respecti) 30.9837 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(ely) 12.1743 Tj
-65 TJm
-(.) 2.49065 Tj
-72 237.808 Td
-(Y) 7.193 Tj
-110 TJm
-(ou) 9.9626 Tj
--376 TJm
-(should) 26.5703 Tj
--377 TJm
-(not) 12.7322 Tj
--376 TJm
-(try) 11.0684 Tj
--376 TJm
-(to) 7.7509 Tj
--377 TJm
-(change) 28.2141 Tj
--376 TJm
-(them.) 22.4159 Tj
--1378 TJm
-(As) 11.0684 Tj
--377 TJm
-(of) 8.29885 Tj
--376 TJm
-(v) 4.9813 Tj
-15 TJm
-(ersion) 24.3486 Tj
--377 TJm
-(1.0,) 14.9439 Tj
--408 TJm
-(64-bit) 23.8007 Tj
--376 TJm
-(counts) 26.0123 Tj
--376 TJm
-(are) 12.1643 Tj
--377 TJm
-(maintained,) 46.7644 Tj
--408 TJm
-(e) 4.42339 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(en) 9.40469 Tj
--376 TJm
-(on) 9.9626 Tj
--376 TJm
-(32-bit) 23.8007 Tj
--377 TJm
-(platforms,) 40.6773 Tj
-72 225.853 Td
-(using) 21.589 Tj
--371 TJm
-(the) 12.1743 Tj
-[1 0 0 1 113.148 225.853] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -113.148 -225.853] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-113.148 225.853 Td
-/F134_0 9.9626 Tf
-(_hi32) 29.8878 Tj
-[1 0 0 1 143.036 225.853] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -143.036 -225.853] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-146.729 225.853 Td
-/F130_0 9.9626 Tf
-(\002elds) 21.589 Tj
--371 TJm
-(to) 7.7509 Tj
--370 TJm
-(store) 19.3673 Tj
--371 TJm
-(the) 12.1743 Tj
--371 TJm
-(upper) 22.6848 Tj
--370 TJm
-(32) 9.9626 Tj
--371 TJm
-(bits) 14.396 Tj
--370 TJm
-(of) 8.29885 Tj
--371 TJm
-(the) 12.1743 Tj
--371 TJm
-(count.) 24.6275 Tj
--1344 TJm
-(So,) 13.0112 Tj
--400 TJm
-(for) 11.6164 Tj
--371 TJm
-(e) 4.42339 Tj
-15 TJm
-(xample,) 31.8205 Tj
--401 TJm
-(the) 12.1743 Tj
--371 TJm
-(total) 17.7135 Tj
--370 TJm
-(amount) 29.8878 Tj
--371 TJm
-(of) 8.29885 Tj
--370 TJm
-(data) 16.5977 Tj
--371 TJm
-(in) 7.7509 Tj
--371 TJm
-(is) 6.64505 Tj
-[1 0 0 1 72 213.898] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -213.898] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 213.898 Td
-/F134_0 9.9626 Tf
-(\(total_in_hi32) 83.6858 Tj
--600 TJm
-(<<) 11.9551 Tj
--600 TJm
-(32\)) 17.9327 Tj
--600 TJm
-(+) 5.97756 Tj
--600 TJm
-(total_in_lo32) 77.7083 Tj
-[1 0 0 1 293.171 213.898] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -293.171 -213.898] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-293.171 213.898 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
-[1 0 0 1 72 212.588] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -202.625] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 191.98 Td
-/F130_0 9.9626 Tf
-(P) 5.53921 Tj
-15 TJm
-(arameter) 34.8492 Tj
-[1 0 0 1 115.367 191.98] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -115.367 -191.98] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-115.367 191.98 Td
-/F134_0 9.9626 Tf
-(blockSize100k) 77.7083 Tj
-[1 0 0 1 193.076 191.98] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -193.076 -191.98] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-196.204 191.98 Td
-/F130_0 9.9626 Tf
-(speci\002es) 34.3112 Tj
--314 TJm
-(the) 12.1743 Tj
--314 TJm
-(block) 22.1369 Tj
--314 TJm
-(size) 15.4918 Tj
--314 TJm
-(to) 7.7509 Tj
--314 TJm
-(be) 9.40469 Tj
--314 TJm
-(used) 18.2614 Tj
--314 TJm
-(for) 11.6164 Tj
--314 TJm
-(compression.) 52.8516 Tj
--1004 TJm
-(It) 6.08715 Tj
--314 TJm
-(should) 26.5703 Tj
--314 TJm
-(be) 9.40469 Tj
--315 TJm
-(a) 4.42339 Tj
--314 TJm
-(v) 4.9813 Tj
-25 TJm
-(alue) 16.5977 Tj
--314 TJm
-(between) 33.1954 Tj
--314 TJm
-(1) 4.9813 Tj
-72 180.025 Td
-(and) 14.386 Tj
--289 TJm
-(9) 4.9813 Tj
--289 TJm
-(inclusi) 26.5703 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(e,) 6.91404 Tj
--299 TJm
-(and) 14.386 Tj
--289 TJm
-(the) 12.1743 Tj
--289 TJm
-(actual) 23.7907 Tj
--289 TJm
-(block) 22.1369 Tj
--289 TJm
-(size) 15.4918 Tj
--289 TJm
-(used) 18.2614 Tj
--289 TJm
-(is) 6.64505 Tj
--289 TJm
-(100000) 29.8878 Tj
--289 TJm
-(x) 4.9813 Tj
--289 TJm
-(this) 14.396 Tj
--289 TJm
-(\002gure.) 25.7334 Tj
--854 TJm
-(9) 4.9813 Tj
--290 TJm
-(gi) 7.7509 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(es) 8.29885 Tj
--289 TJm
-(the) 12.1743 Tj
--289 TJm
-(best) 16.0497 Tj
--289 TJm
-(compression) 50.3609 Tj
--289 TJm
-(b) 4.9813 Tj
-20 TJm
-(ut) 7.7509 Tj
--289 TJm
-(tak) 12.1743 Tj
-10 TJm
-(es) 8.29885 Tj
--289 TJm
-(most) 19.3773 Tj
-72 168.07 Td
-(memory) 33.2053 Tj
-65 TJm
-(.) 2.49065 Tj
-[1 0 0 1 72 165.913] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -155.95] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 146.152 Td
-/F130_0 9.9626 Tf
-(P) 5.53921 Tj
-15 TJm
-(arameter) 34.8492 Tj
-[1 0 0 1 115.095 146.152] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -115.095 -146.152] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-115.095 146.152 Td
-/F134_0 9.9626 Tf
-(verbosity) 53.798 Tj
-[1 0 0 1 168.893 146.152] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -168.893 -146.152] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-171.75 146.152 Td
-/F130_0 9.9626 Tf
-(should) 26.5703 Tj
--287 TJm
-(be) 9.40469 Tj
--286 TJm
-(set) 11.0684 Tj
--287 TJm
-(to) 7.7509 Tj
--287 TJm
-(a) 4.42339 Tj
--287 TJm
-(number) 30.4357 Tj
--286 TJm
-(between) 33.1954 Tj
--287 TJm
-(0) 4.9813 Tj
--287 TJm
-(and) 14.386 Tj
--287 TJm
-(4) 4.9813 Tj
--286 TJm
-(inclusi) 26.5703 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(e.) 6.91404 Tj
--841 TJm
-(0) 4.9813 Tj
--286 TJm
-(is) 6.64505 Tj
--287 TJm
-(silent,) 24.0796 Tj
--296 TJm
-(and) 14.386 Tj
--287 TJm
-(greater) 27.6562 Tj
--287 TJm
-(numbers) 34.3112 Tj
--286 TJm
-(gi) 7.7509 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
-72 134.197 Td
-(increasingly) 48.6972 Tj
--342 TJm
-(v) 4.9813 Tj
-15 TJm
-(erbose) 26.0024 Tj
--342 TJm
-(monitoring/deb) 61.4394 Tj
-20 TJm
-(ugging) 27.6761 Tj
--342 TJm
-(output.) 27.9551 Tj
--1173 TJm
-(If) 6.63509 Tj
--343 TJm
-(the) 12.1743 Tj
--342 TJm
-(library) 26.5603 Tj
--342 TJm
-(has) 13.2801 Tj
--342 TJm
-(been) 18.8094 Tj
--342 TJm
-(compiled) 37.0808 Tj
--342 TJm
-(with) 17.7135 Tj
-[1 0 0 1 446.429 134.197] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -446.429 -134.197] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-446.429 134.197 Td
-/F134_0 9.9626 Tf
-(-DBZ_NO_STDIO) 77.7083 Tj
-[1 0 0 1 524.138 134.197] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -524.138 -134.197] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-524.138 134.197 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--342 TJm
-(no) 9.9626 Tj
-72 122.242 Td
-(such) 18.2614 Tj
--250 TJm
-(output) 25.4644 Tj
--250 TJm
-(will) 15.5018 Tj
--250 TJm
-(appear) 26.5503 Tj
--250 TJm
-(for) 11.6164 Tj
--250 TJm
-(an) 9.40469 Tj
-15 TJm
-(y) 4.9813 Tj
--250 TJm
-(v) 4.9813 Tj
-15 TJm
-(erbosity) 32.0995 Tj
--250 TJm
-(setting.) 29.0609 Tj
-[1 0 0 1 72 120.085] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -110.122] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 100.324 Td
-/F130_0 9.9626 Tf
-(P) 5.53921 Tj
-15 TJm
-(arameter) 34.8492 Tj
-[1 0 0 1 116.619 100.324] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -116.619 -100.324] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-116.619 100.324 Td
-/F134_0 9.9626 Tf
-(workFactor) 59.7756 Tj
-[1 0 0 1 176.394 100.324] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -176.394 -100.324] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-180.775 100.324 Td
-/F130_0 9.9626 Tf
-(controls) 32.0995 Tj
--440 TJm
-(ho) 9.9626 Tj
-25 TJm
-(w) 7.193 Tj
--439 TJm
-(the) 12.1743 Tj
--440 TJm
-(compression) 50.3609 Tj
--440 TJm
-(phase) 22.6848 Tj
--439 TJm
-(beha) 18.8094 Tj
-20 TJm
-(v) 4.9813 Tj
-15 TJm
-(es) 8.29885 Tj
--440 TJm
-(when) 21.579 Tj
--439 TJm
-(presented) 38.1767 Tj
--440 TJm
-(with) 17.7135 Tj
--440 TJm
-(w) 7.193 Tj
-10 TJm
-(orst) 14.9439 Tj
--439 TJm
-(case,) 19.6363 Tj
--487 TJm
-(highly) 25.4644 Tj
-72 88.3686 Td
-(repetiti) 28.224 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(e,) 6.91404 Tj
--433 TJm
-(input) 20.4831 Tj
--396 TJm
-(data.) 19.0883 Tj
--1496 TJm
-(If) 6.63509 Tj
--396 TJm
-(compression) 50.3609 Tj
--396 TJm
-(runs) 17.1556 Tj
--397 TJm
-(i) 2.7696 Tj
-1 TJm
-(nto) 12.7322 Tj
--397 TJm
-(dif) 11.0684 Tj
-25 TJm
-(\002culties) 31.5516 Tj
--396 TJm
-(caused) 27.1082 Tj
--396 TJm
-(by) 9.9626 Tj
--396 TJm
-(repetiti) 28.224 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--396 TJm
-(data,) 19.0883 Tj
--432 TJm
-(the) 12.1743 Tj
--397 TJm
-(library) 26.5603 Tj
--396 TJm
-(switches) 34.3112 Tj
--396 TJm
-(from) 19.3673 Tj
-[1 0 0 1 72 50.8518] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 374.394 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 40.5726 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -493.841 -50.8518] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-534.414 50.8518 Td
-/F130_0 9.9626 Tf
-(12) 9.9626 Tj
-[1 0 0 1 453.269 50.8518] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 93.5985 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.2765 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-Q
-showpage
-%%PageTrailer
-pdfEndPage
-%%Page: 16 16
-%%BeginPageSetup
-%%PageOrientation: Portrait
-pdfStartPage
-0 0 612 792 re W
-%%EndPageSetup
-[] 0 d
-1 i
-0 j
-0 J
-10 M
-1 w
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-false op
-false OP
-0 0 612 792 re
-W
-q
-[1 0 0 1 72 741.554] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 14.4459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 187.197 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 -8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 76.4979 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -342.569 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-419.067 749.245 Td
-/F130_0 9.9626 Tf
-(Programming) 54.7943 Tj
--250 TJm
-(with) 17.7135 Tj
-[1 0 0 1 496.556 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -496.556 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-496.556 749.245 Td
-/F134_0 9.9626 Tf
-(libbzip2) 47.8205 Tj
-[1 0 0 1 544.376 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -278.305 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 280.796 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.974 -5.0363] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -0.4981] cm
-q
-[] 0 d
-0 J
-0.4981 w
-0 0.2491 m
-475.465 0.2491 l
-S
-Q
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 479.251 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -540 -741.554] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 710.037 Td
-/F130_0 9.9626 Tf
-(the) 12.1743 Tj
--255 TJm
-(standard) 33.7533 Tj
--254 TJm
-(sorting) 27.6761 Tj
--255 TJm
-(algorithm) 38.7446 Tj
--254 TJm
-(to) 7.7509 Tj
--255 TJm
-(a) 4.42339 Tj
--255 TJm
-(f) 3.31755 Tj
-10 TJm
-(allback) 28.772 Tj
--254 TJm
-(algorithm.) 41.2352 Tj
--648 TJm
-(The) 15.4918 Tj
--255 TJm
-(f) 3.31755 Tj
-10 TJm
-(allback) 28.772 Tj
--254 TJm
-(is) 6.64505 Tj
--255 TJm
-(slo) 11.6264 Tj
-25 TJm
-(wer) 14.9339 Tj
--255 TJm
-(than) 17.1556 Tj
--254 TJm
-(the) 12.1743 Tj
--255 TJm
-(standard) 33.7533 Tj
--254 TJm
-(algorithm) 38.7446 Tj
--255 TJm
-(by) 9.9626 Tj
--255 TJm
-(perhaps) 30.9837 Tj
-72 698.082 Td
-(a) 4.42339 Tj
--250 TJm
-(f) 3.31755 Tj
-10 TJm
-(actor) 19.9152 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(three,) 22.4059 Tj
--250 TJm
-(b) 4.9813 Tj
-20 TJm
-(ut) 7.7509 Tj
--250 TJm
-(al) 7.193 Tj
-10 TJm
-(w) 7.193 Tj
-10 TJm
-(ays) 13.2801 Tj
--250 TJm
-(beha) 18.8094 Tj
-20 TJm
-(v) 4.9813 Tj
-15 TJm
-(es) 8.29885 Tj
--250 TJm
-(reasonably) 43.158 Tj
-65 TJm
-(,) 2.49065 Tj
--250 TJm
-(no) 9.9626 Tj
--250 TJm
-(matter) 25.4544 Tj
--250 TJm
-(ho) 9.9626 Tj
-25 TJm
-(w) 7.193 Tj
--250 TJm
-(bad) 14.386 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(input.) 22.9738 Tj
-[1 0 0 1 72 695.925] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9617] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -685.964] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 676.165 Td
-/F130_0 9.9626 Tf
-(Lo) 11.0684 Tj
-25 TJm
-(wer) 14.9339 Tj
--240 TJm
-(v) 4.9813 Tj
-25 TJm
-(alues) 20.4731 Tj
--239 TJm
-(of) 8.29885 Tj
-[1 0 0 1 138.421 676.165] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -138.421 -676.165] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-138.421 676.165 Td
-/F134_0 9.9626 Tf
-(workFactor) 59.7756 Tj
-[1 0 0 1 198.197 676.165] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -198.197 -676.165] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-200.585 676.165 Td
-/F130_0 9.9626 Tf
-(reduce) 26.5503 Tj
--240 TJm
-(the) 12.1743 Tj
--239 TJm
-(amount) 29.8878 Tj
--240 TJm
-(of) 8.29885 Tj
--240 TJm
-(ef) 7.74094 Tj
-25 TJm
-(fort) 14.386 Tj
--239 TJm
-(the) 12.1743 Tj
--240 TJm
-(standard) 33.7533 Tj
--240 TJm
-(algorithm) 38.7446 Tj
--239 TJm
-(will) 15.5018 Tj
--240 TJm
-(e) 4.42339 Tj
-15 TJm
-(xpend) 24.3486 Tj
--240 TJm
-(before) 25.4445 Tj
--240 TJm
-(resorting) 35.417 Tj
--239 TJm
-(to) 7.7509 Tj
--240 TJm
-(the) 12.1743 Tj
-72 664.21 Td
-(f) 3.31755 Tj
-10 TJm
-(allback.) 31.2626 Tj
--618 TJm
-(Y) 7.193 Tj
-110 TJm
-(ou) 9.9626 Tj
--248 TJm
-(should) 26.5703 Tj
--247 TJm
-(set) 11.0684 Tj
--248 TJm
-(this) 14.396 Tj
--247 TJm
-(parameter) 39.8305 Tj
--248 TJm
-(carefully;) 38.1767 Tj
--248 TJm
-(too) 12.7322 Tj
--248 TJm
-(lo) 7.7509 Tj
-25 TJm
-(w) 7.193 Tj
-65 TJm
-(,) 2.49065 Tj
--248 TJm
-(and) 14.386 Tj
--247 TJm
-(man) 17.1556 Tj
-15 TJm
-(y) 4.9813 Tj
--248 TJm
-(inputs) 24.3586 Tj
--248 TJm
-(will) 15.5018 Tj
--247 TJm
-(be) 9.40469 Tj
--248 TJm
-(handled) 31.5416 Tj
--247 TJm
-(by) 9.9626 Tj
--248 TJm
-(the) 12.1743 Tj
--247 TJm
-(f) 3.31755 Tj
-10 TJm
-(allback) 28.772 Tj
--248 TJm
-(algorithm) 38.7446 Tj
-72 652.255 Td
-(and) 14.386 Tj
--308 TJm
-(so) 8.85675 Tj
--308 TJm
-(compress) 37.6287 Tj
--308 TJm
-(rather) 23.2328 Tj
--309 TJm
-(slo) 11.6264 Tj
-25 TJm
-(wly) 14.9439 Tj
-65 TJm
-(,) 2.49065 Tj
--322 TJm
-(too) 12.7322 Tj
--309 TJm
-(high,) 20.2042 Tj
--322 TJm
-(and) 14.386 Tj
--308 TJm
-(your) 18.2614 Tj
--309 TJm
-(a) 4.42339 Tj
-20 TJm
-(v) 4.9813 Tj
-15 TJm
-(erage-to-w) 43.148 Tj
-10 TJm
-(orst) 14.9439 Tj
--308 TJm
-(case) 17.1456 Tj
--308 TJm
-(compression) 50.3609 Tj
--308 TJm
-(times) 21.589 Tj
--308 TJm
-(can) 13.8281 Tj
--308 TJm
-(become) 30.9837 Tj
--309 TJm
-(v) 4.9813 Tj
-15 TJm
-(ery) 12.7222 Tj
--308 TJm
-(lar) 10.5105 Tj
-18 TJm
-(ge.) 11.8953 Tj
-72 640.3 Td
-(The) 15.4918 Tj
--250 TJm
-(def) 12.7222 Tj
-10 TJm
-(ault) 14.9439 Tj
--250 TJm
-(v) 4.9813 Tj
-25 TJm
-(alue) 16.5977 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(30) 9.9626 Tj
--250 TJm
-(gi) 7.7509 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(es) 8.29885 Tj
--250 TJm
-(reasonable) 42.6001 Tj
--250 TJm
-(beha) 18.8094 Tj
-20 TJm
-(viour) 21.031 Tj
--250 TJm
-(o) 4.9813 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(er) 7.74094 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(wide) 19.3673 Tj
--250 TJm
-(range) 22.1269 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(circumstances.) 58.9288 Tj
-[1 0 0 1 72 638.143] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9617] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -628.181] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 618.383 Td
-/F130_0 9.9626 Tf
-(Allo) 17.7135 Tj
-25 TJm
-(w) 7.193 Tj
-10 TJm
-(able) 16.5977 Tj
--250 TJm
-(v) 4.9813 Tj
-25 TJm
-(alues) 20.4731 Tj
--250 TJm
-(range) 22.1269 Tj
--250 TJm
-(from) 19.3673 Tj
--250 TJm
-(0) 4.9813 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(250) 14.9439 Tj
--250 TJm
-(inclusi) 26.5703 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(e.) 6.91404 Tj
--620 TJm
-(0) 4.9813 Tj
--250 TJm
-(is) 6.64505 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(special) 27.6661 Tj
--250 TJm
-(case,) 19.6363 Tj
--250 TJm
-(equi) 17.1556 Tj
-25 TJm
-(v) 4.9813 Tj
-25 TJm
-(alent) 19.3673 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(using) 21.589 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(def) 12.7222 Tj
-10 TJm
-(ault) 14.9439 Tj
--250 TJm
-(v) 4.9813 Tj
-25 TJm
-(alue) 16.5977 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(30.) 12.4533 Tj
-[1 0 0 1 72 616.226] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9617] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -606.265] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 596.466 Td
-/F130_0 9.9626 Tf
-(Note) 19.3673 Tj
--250 TJm
-(that) 14.9439 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(compressed) 47.0334 Tj
--250 TJm
-(output) 25.4644 Tj
--250 TJm
-(generated) 38.7246 Tj
--250 TJm
-(is) 6.64505 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(same) 20.4731 Tj
--250 TJm
-(re) 7.74094 Tj
-15 TJm
-(g) 4.9813 Tj
-5 TJm
-(ardless) 27.6661 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(whether) 32.0895 Tj
--250 TJm
-(or) 8.29885 Tj
--250 TJm
-(not) 12.7322 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(f) 3.31755 Tj
-10 TJm
-(allback) 28.772 Tj
--250 TJm
-(algorithm) 38.7446 Tj
--250 TJm
-(is) 6.64505 Tj
--250 TJm
-(used.) 20.7521 Tj
-[1 0 0 1 72 594.309] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9617] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -584.348] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 574.549 Td
-/F130_0 9.9626 Tf
-(Be) 11.0684 Tj
--303 TJm
-(a) 4.42339 Tj
-15 TJm
-(w) 7.193 Tj
-10 TJm
-(are) 12.1643 Tj
--303 TJm
-(also) 16.0497 Tj
--303 TJm
-(that) 14.9439 Tj
--303 TJm
-(this) 14.396 Tj
--304 TJm
-(parameter) 39.8305 Tj
--303 TJm
-(may) 17.1556 Tj
--303 TJm
-(disappear) 38.1767 Tj
--303 TJm
-(entirely) 30.4357 Tj
--303 TJm
-(in) 7.7509 Tj
--303 TJm
-(future) 23.7907 Tj
--303 TJm
-(v) 4.9813 Tj
-15 TJm
-(ersions) 28.224 Tj
--303 TJm
-(of) 8.29885 Tj
--303 TJm
-(the) 12.1743 Tj
--304 TJm
-(library) 26.5603 Tj
-65 TJm
-(.) 2.49065 Tj
--938 TJm
-(In) 8.29885 Tj
--303 TJm
-(principle) 35.417 Tj
--303 TJm
-(it) 5.53921 Tj
--304 TJm
-(should) 26.5703 Tj
--303 TJm
-(be) 9.40469 Tj
-72 562.594 Td
-(possible) 32.6574 Tj
--270 TJm
-(to) 7.7509 Tj
--270 TJm
-(de) 9.40469 Tj
-25 TJm
-(vise) 16.0497 Tj
--270 TJm
-(a) 4.42339 Tj
--270 TJm
-(good) 19.9252 Tj
--270 TJm
-(w) 7.193 Tj
-10 TJm
-(ay) 9.40469 Tj
--270 TJm
-(to) 7.7509 Tj
--271 TJm
-(automat) 32.0995 Tj
-1 TJm
-(ically) 22.1369 Tj
--271 TJm
-(choose) 27.6661 Tj
--270 TJm
-(which) 24.3486 Tj
--270 TJm
-(algorithm) 38.7446 Tj
--270 TJm
-(to) 7.7509 Tj
--270 TJm
-(use.) 15.7708 Tj
--740 TJm
-(Such) 19.9252 Tj
--270 TJm
-(a) 4.42339 Tj
--271 TJm
-(m) 7.7509 Tj
-1 TJm
-(echanism) 37.6287 Tj
--271 TJm
-(w) 7.193 Tj
-10 TJm
-(ould) 17.7135 Tj
--270 TJm
-(render) 25.4445 Tj
--270 TJm
-(the) 12.1743 Tj
-72 550.639 Td
-(parameter) 39.8305 Tj
--250 TJm
-(obsolete.) 35.696 Tj
-[1 0 0 1 72 548.482] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9616] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -538.521] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 528.722 Td
-/F130_0 9.9626 Tf
-(Possible) 33.2153 Tj
--250 TJm
-(return) 23.7907 Tj
--250 TJm
-(v) 4.9813 Tj
-25 TJm
-(alues:) 23.2427 Tj
-[1 0 0 1 72 528.623] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -144.458] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 143.462 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 139.875] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -519.258] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 519.258 Td
-/F134_0 9.9626 Tf
-(BZ_CONFIG_ERROR) 89.6634 Tj
-98.4879 507.303 Td
-(if) 11.9551 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(library) 41.8429 Tj
--426 TJm
-(has) 17.9327 Tj
--426 TJm
-(been) 23.9102 Tj
--426 TJm
-(mis-compiled) 71.7307 Tj
-90 495.348 Td
-(BZ_PARAM_ERROR) 83.6858 Tj
-98.4879 483.392 Td
-(if) 11.9551 Tj
--426 TJm
-(strm) 23.9102 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(NULL) 23.9102 Tj
-98.4879 471.437 Td
-(or) 11.9551 Tj
--426 TJm
-(blockSize) 53.798 Tj
--426 TJm
-(<) 5.97756 Tj
--426 TJm
-(1) 5.97756 Tj
--426 TJm
-(or) 11.9551 Tj
--426 TJm
-(blockSize) 53.798 Tj
--426 TJm
-(>) 5.97756 Tj
--426 TJm
-(9) 5.97756 Tj
-98.4879 459.482 Td
-(or) 11.9551 Tj
--426 TJm
-(verbosity) 53.798 Tj
--426 TJm
-(<) 5.97756 Tj
--426 TJm
-(0) 5.97756 Tj
--426 TJm
-(or) 11.9551 Tj
--426 TJm
-(verbosity) 53.798 Tj
--426 TJm
-(>) 5.97756 Tj
--426 TJm
-(4) 5.97756 Tj
-98.4879 447.527 Td
-(or) 11.9551 Tj
--426 TJm
-(workFactor) 59.7756 Tj
--426 TJm
-(<) 5.97756 Tj
--426 TJm
-(0) 5.97756 Tj
--426 TJm
-(or) 11.9551 Tj
--426 TJm
-(workFactor) 59.7756 Tj
--426 TJm
-(>) 5.97756 Tj
--426 TJm
-(250) 17.9327 Tj
-90 435.572 Td
-(BZ_MEM_ERROR) 71.7307 Tj
-98.4879 423.617 Td
-(if) 11.9551 Tj
--426 TJm
-(not) 17.9327 Tj
--426 TJm
-(enough) 35.8654 Tj
--426 TJm
-(memory) 35.8654 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(available) 53.798 Tj
-90 411.661 Td
-(BZ_OK) 29.8878 Tj
-98.4879 399.706 Td
-(otherwise) 53.798 Tj
-[1 0 0 1 72 384.165] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5482] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -374.203] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 362.248 Td
-/F130_0 9.9626 Tf
-(Allo) 17.7135 Tj
-25 TJm
-(w) 7.193 Tj
-10 TJm
-(able) 16.5977 Tj
--250 TJm
-(ne) 9.40469 Tj
-15 TJm
-(xt) 7.7509 Tj
--250 TJm
-(actions:) 30.9936 Tj
-[1 0 0 1 72 362.148] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -48.8169] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 47.8207 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 44.2341] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -352.783] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 352.783 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompress) 83.6858 Tj
-98.4879 340.828 Td
-(if) 11.9551 Tj
--426 TJm
-(BZ_OK) 29.8878 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(returned) 47.8205 Tj
-98.4879 328.873 Td
-(no) 11.9551 Tj
--426 TJm
-(specific) 47.8205 Tj
--426 TJm
-(action) 35.8654 Tj
--426 TJm
-(needed) 35.8654 Tj
--426 TJm
-(in) 11.9551 Tj
--426 TJm
-(case) 23.9102 Tj
--426 TJm
-(of) 11.9551 Tj
--426 TJm
-(error) 29.8878 Tj
-[1 0 0 1 72 313.331] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9616] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -303.37] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 282.711 Td
-/F122_0 17.2154 Tf
-(3.3.2.) 43.0729 Tj
-[1 0 0 1 119.858 282.711] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -119.858 -282.711] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-119.858 282.711 Td
-/F392_0 17.2154 Tf
-(BZ2_bzCompress) 144.609 Tj
-[1 0 0 1 264.468 282.711] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -192.468 -2.3327] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -24.9066] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 23.9103 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 20.3237] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3685] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -271.014] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 271.014 Td
-/F134_0 9.9626 Tf
-(int) 17.9327 Tj
--426 TJm
-(BZ2_bzCompress) 83.6858 Tj
--426 TJm
-(\() 5.97756 Tj
--426 TJm
-(bz_stream) 53.798 Tj
-268.371 269.27 Td
-(*) 5.97756 Tj
-274.348 271.014 Td
-(strm,) 29.8878 Tj
--426 TJm
-(int) 17.9327 Tj
--426 TJm
-(action) 35.8654 Tj
--426 TJm
-(\);) 11.9551 Tj
-[1 0 0 1 72 255.472] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5482] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -245.51] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 233.555 Td
-/F130_0 9.9626 Tf
-(Pro) 13.8381 Tj
-15 TJm
-(vides) 21.031 Tj
--222 TJm
-(more) 20.4731 Tj
--221 TJm
-(input) 20.4831 Tj
--222 TJm
-(and/or) 25.4544 Tj
--222 TJm
-(output) 25.4644 Tj
--222 TJm
-(b) 4.9813 Tj
-20 TJm
-(uf) 8.29885 Tj
-25 TJm
-(fer) 11.0585 Tj
--221 TJm
-(space) 22.1269 Tj
--222 TJm
-(for) 11.6164 Tj
--222 TJm
-(the) 12.1743 Tj
--221 TJm
-(library) 26.5603 Tj
-65 TJm
-(.) 2.49065 Tj
--601 TJm
-(The) 15.4918 Tj
--222 TJm
-(caller) 22.1269 Tj
--222 TJm
-(maintains) 38.7446 Tj
--222 TJm
-(input) 20.4831 Tj
--221 TJm
-(and) 14.386 Tj
--222 TJm
-(output) 25.4644 Tj
--222 TJm
-(b) 4.9813 Tj
-20 TJm
-(uf) 8.29885 Tj
-25 TJm
-(fers,) 17.4246 Tj
--227 TJm
-(and) 14.386 Tj
--222 TJm
-(calls) 18.2614 Tj
-[1 0 0 1 72 221.6] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -221.6] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 221.6 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompress) 83.6858 Tj
-[1 0 0 1 155.686 221.6] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -155.686 -221.6] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-158.177 221.6 Td
-/F130_0 9.9626 Tf
-(to) 7.7509 Tj
--250 TJm
-(transfer) 30.4258 Tj
--250 TJm
-(data) 16.5977 Tj
--250 TJm
-(between) 33.1954 Tj
--250 TJm
-(them.) 22.4159 Tj
-[1 0 0 1 72 220.066] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9617] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -210.104] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 199.683 Td
-/F130_0 9.9626 Tf
-(Before) 27.1082 Tj
--212 TJm
-(each) 18.2515 Tj
--213 TJm
-(call) 14.386 Tj
--212 TJm
-(to) 7.7509 Tj
-[1 0 0 1 147.961 199.683] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -147.961 -199.683] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-147.961 199.683 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompress) 83.6858 Tj
-[1 0 0 1 231.647 199.683] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -231.647 -199.683] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-231.647 199.683 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 236.329 199.683] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -236.329 -199.683] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-236.329 199.683 Td
-/F134_0 9.9626 Tf
-(next_in) 41.8429 Tj
-[1 0 0 1 278.172 199.683] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -278.172 -199.683] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-280.288 199.683 Td
-/F130_0 9.9626 Tf
-(should) 26.5703 Tj
--212 TJm
-(point) 20.4831 Tj
--213 TJm
-(at) 7.193 Tj
--212 TJm
-(the) 12.1743 Tj
--213 TJm
-(data) 16.5977 Tj
--212 TJm
-(to) 7.7509 Tj
--212 TJm
-(be) 9.40469 Tj
--213 TJm
-(compressed,) 49.5241 Tj
--220 TJm
-(and) 14.386 Tj
-[1 0 0 1 463.493 199.683] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -463.493 -199.683] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-463.493 199.683 Td
-/F134_0 9.9626 Tf
-(avail_in) 47.8205 Tj
-[1 0 0 1 511.314 199.683] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -511.314 -199.683] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-513.43 199.683 Td
-/F130_0 9.9626 Tf
-(should) 26.5703 Tj
-72 187.728 Td
-(indicate) 31.5416 Tj
--246 TJm
-(ho) 9.9626 Tj
-25 TJm
-(w) 7.193 Tj
--247 TJm
-(m) 7.7509 Tj
-1 TJm
-(an) 9.40469 Tj
-14 TJm
-(y) 4.9813 Tj
--246 TJm
-(bytes) 21.031 Tj
--246 TJm
-(the) 12.1743 Tj
--246 TJm
-(library) 26.5603 Tj
--247 TJm
-(may) 17.1556 Tj
--246 TJm
-(read.) 19.6363 Tj
-[1 0 0 1 259.242 187.728] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -259.242 -187.728] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-259.242 187.728 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompress) 83.6858 Tj
-[1 0 0 1 342.929 187.728] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -342.929 -187.728] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-345.382 187.728 Td
-/F130_0 9.9626 Tf
-(updates) 30.4357 Tj
-[1 0 0 1 378.271 187.728] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -378.271 -187.728] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-378.271 187.728 Td
-/F134_0 9.9626 Tf
-(next_in) 41.8429 Tj
-[1 0 0 1 420.114 187.728] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -420.114 -187.728] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-420.114 187.728 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 425.066 187.728] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -425.066 -187.728] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-425.066 187.728 Td
-/F134_0 9.9626 Tf
-(avail_in) 47.8205 Tj
-[1 0 0 1 472.886 187.728] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.886 -187.728] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-475.34 187.728 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 492.179 187.728] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -492.179 -187.728] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-492.179 187.728 Td
-/F134_0 9.9626 Tf
-(total_in) 47.8205 Tj
-[1 0 0 1 540 187.728] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -540 -187.728] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 175.773 Td
-/F130_0 9.9626 Tf
-(to) 7.7509 Tj
--250 TJm
-(re\003ect) 24.8965 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(number) 30.4357 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(bytes) 21.031 Tj
--250 TJm
-(it) 5.53921 Tj
--250 TJm
-(has) 13.2801 Tj
--250 TJm
-(read.) 19.6363 Tj
-[1 0 0 1 72 173.616] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9616] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -163.654] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 153.856 Td
-/F130_0 9.9626 Tf
-(Similarly) 37.0908 Tj
-65 TJm
-(,) 2.49065 Tj
-[1 0 0 1 113.611 153.856] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -113.611 -153.856] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-113.611 153.856 Td
-/F134_0 9.9626 Tf
-(next_out) 47.8205 Tj
-[1 0 0 1 161.432 153.856] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -161.432 -153.856] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-164.072 153.856 Td
-/F130_0 9.9626 Tf
-(should) 26.5703 Tj
--265 TJm
-(point) 20.4831 Tj
--265 TJm
-(to) 7.7509 Tj
--265 TJm
-(a) 4.42339 Tj
--265 TJm
-(b) 4.9813 Tj
-20 TJm
-(uf) 8.29885 Tj
-25 TJm
-(fer) 11.0585 Tj
--265 TJm
-(in) 7.7509 Tj
--265 TJm
-(which) 24.3486 Tj
--265 TJm
-(the) 12.1743 Tj
--265 TJm
-(compressed) 47.0334 Tj
--265 TJm
-(data) 16.5977 Tj
--265 TJm
-(is) 6.64505 Tj
--265 TJm
-(to) 7.7509 Tj
--265 TJm
-(be) 9.40469 Tj
--265 TJm
-(placed,) 28.493 Tj
--269 TJm
-(with) 17.7135 Tj
-[1 0 0 1 464.742 153.856] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -464.742 -153.856] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-464.742 153.856 Td
-/F134_0 9.9626 Tf
-(avail_out) 53.798 Tj
-[1 0 0 1 518.54 153.856] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -518.54 -153.856] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-521.181 153.856 Td
-/F130_0 9.9626 Tf
-(indi-) 18.8194 Tj
-72 141.901 Td
-(cating) 24.3486 Tj
--209 TJm
-(ho) 9.9626 Tj
-25 TJm
-(w) 7.193 Tj
--209 TJm
-(much) 22.1369 Tj
--209 TJm
-(output) 25.4644 Tj
--209 TJm
-(space) 22.1269 Tj
--209 TJm
-(is) 6.64505 Tj
--210 TJm
-(a) 4.42339 Tj
-20 TJm
-(v) 4.9813 Tj
-25 TJm
-(ailable.) 29.0509 Tj
-[1 0 0 1 243.087 141.901] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -243.087 -141.901] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-243.087 141.901 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompress) 83.6858 Tj
-[1 0 0 1 326.773 141.901] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -326.773 -141.901] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-328.856 141.901 Td
-/F130_0 9.9626 Tf
-(updates) 30.4357 Tj
-[1 0 0 1 361.375 141.901] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -361.375 -141.901] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-361.375 141.901 Td
-/F134_0 9.9626 Tf
-(next_out) 47.8205 Tj
-[1 0 0 1 409.196 141.901] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -409.196 -141.901] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-409.196 141.901 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 413.851 141.901] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -413.851 -141.901] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-413.851 141.901 Td
-/F134_0 9.9626 Tf
-(avail_out) 53.798 Tj
-[1 0 0 1 467.649 141.901] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -467.649 -141.901] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-469.732 141.901 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 486.202 141.901] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -486.202 -141.901] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-486.202 141.901 Td
-/F134_0 9.9626 Tf
-(total_out) 53.798 Tj
-[1 0 0 1 540 141.901] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -540 -141.901] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 129.946 Td
-/F130_0 9.9626 Tf
-(to) 7.7509 Tj
--250 TJm
-(re\003ect) 24.8965 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(number) 30.4357 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(bytes) 21.031 Tj
--250 TJm
-(output.) 27.9551 Tj
-[1 0 0 1 72 127.789] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9617] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -117.827] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 108.029 Td
-/F130_0 9.9626 Tf
-(Y) 7.193 Tj
-110 TJm
-(ou) 9.9626 Tj
--272 TJm
-(may) 17.1556 Tj
--272 TJm
-(pro) 13.2801 Tj
-15 TJm
-(vide) 17.1556 Tj
--272 TJm
-(and) 14.386 Tj
--272 TJm
-(remo) 20.4731 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--272 TJm
-(as) 8.29885 Tj
--272 TJm
-(little) 18.2714 Tj
--272 TJm
-(or) 8.29885 Tj
--272 TJm
-(as) 8.29885 Tj
--272 TJm
-(much) 22.1369 Tj
--271 TJm
-(data) 16.5977 Tj
--272 TJm
-(as) 8.29885 Tj
--272 TJm
-(you) 14.9439 Tj
--272 TJm
-(lik) 10.5205 Tj
-10 TJm
-(e) 4.42339 Tj
--272 TJm
-(on) 9.9626 Tj
--272 TJm
-(each) 18.2515 Tj
--272 TJm
-(call) 14.386 Tj
--272 TJm
-(of) 8.29885 Tj
-[1 0 0 1 399.123 108.029] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -399.123 -108.029] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-399.123 108.029 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompress) 83.6858 Tj
-[1 0 0 1 482.809 108.029] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -482.809 -108.029] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-482.809 108.029 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
--752 TJm
-(In) 8.29885 Tj
--272 TJm
-(the) 12.1743 Tj
--272 TJm
-(limit,) 21.32 Tj
-72 96.0736 Td
-(it) 5.53921 Tj
--266 TJm
-(is) 6.64505 Tj
--265 TJm
-(acceptable) 42.0422 Tj
--266 TJm
-(to) 7.7509 Tj
--266 TJm
-(supply) 26.5703 Tj
--266 TJm
-(and) 14.386 Tj
--265 TJm
-(remo) 20.4731 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--266 TJm
-(data) 16.5977 Tj
--266 TJm
-(one) 14.386 Tj
--265 TJm
-(byte) 17.1556 Tj
--266 TJm
-(at) 7.193 Tj
--266 TJm
-(a) 4.42339 Tj
--266 TJm
-(time,) 20.2042 Tj
--269 TJm
-(although) 34.8691 Tj
--266 TJm
-(this) 14.396 Tj
--266 TJm
-(w) 7.193 Tj
-10 TJm
-(ould) 17.7135 Tj
--265 TJm
-(be) 9.40469 Tj
--266 TJm
-(terribly) 29.3299 Tj
--266 TJm
-(inef) 15.4918 Tj
-25 TJm
-(\002cient.) 27.3972 Tj
--714 TJm
-(Y) 7.193 Tj
-110 TJm
-(ou) 9.9626 Tj
--266 TJm
-(should) 26.5703 Tj
-72 84.1184 Td
-(al) 7.193 Tj
-10 TJm
-(w) 7.193 Tj
-10 TJm
-(ays) 13.2801 Tj
--250 TJm
-(ensure) 26.0024 Tj
--250 TJm
-(that) 14.9439 Tj
--250 TJm
-(at) 7.193 Tj
--250 TJm
-(least) 18.2614 Tj
--250 TJm
-(one) 14.386 Tj
--250 TJm
-(byte) 17.1556 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(output) 25.4644 Tj
--250 TJm
-(space) 22.1269 Tj
--250 TJm
-(is) 6.64505 Tj
--250 TJm
-(a) 4.42339 Tj
-20 TJm
-(v) 4.9813 Tj
-25 TJm
-(ailable) 26.5603 Tj
--250 TJm
-(at) 7.193 Tj
--250 TJm
-(each) 18.2515 Tj
--250 TJm
-(call.) 16.8766 Tj
-[1 0 0 1 72 81.9616] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9616] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -21.1482] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 374.394 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.8541] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 40.5726 -6.7545] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -493.841 -50.9514] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-534.414 50.9514 Td
-/F130_0 9.9626 Tf
-(13) 9.9626 Tj
-[1 0 0 1 453.269 50.8518] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 93.5985 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.2765 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-Q
-showpage
-%%PageTrailer
-pdfEndPage
-%%Page: 17 17
-%%BeginPageSetup
-%%PageOrientation: Portrait
-pdfStartPage
-0 0 612 792 re W
-%%EndPageSetup
-[] 0 d
-1 i
-0 j
-0 J
-10 M
-1 w
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-false op
-false OP
-0 0 612 792 re
-W
-q
-[1 0 0 1 72 741.554] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 14.4459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 187.197 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 -8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 76.4979 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -342.569 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-419.067 749.245 Td
-/F130_0 9.9626 Tf
-(Programming) 54.7943 Tj
--250 TJm
-(with) 17.7135 Tj
-[1 0 0 1 496.556 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -496.556 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-496.556 749.245 Td
-/F134_0 9.9626 Tf
-(libbzip2) 47.8205 Tj
-[1 0 0 1 544.376 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -278.305 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 280.796 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.974 -5.0363] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -0.4981] cm
-q
-[] 0 d
-0 J
-0.4981 w
-0 0.2491 m
-475.465 0.2491 l
-S
-Q
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 479.251 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -540 -741.554] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 710.037 Td
-/F130_0 9.9626 Tf
-(A) 7.193 Tj
--250 TJm
-(second) 27.6661 Tj
--250 TJm
-(purpose) 31.5416 Tj
--250 TJm
-(of) 8.29885 Tj
-[1 0 0 1 156.662 710.037] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -156.662 -710.037] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-156.662 710.037 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompress) 83.6858 Tj
-[1 0 0 1 240.348 710.037] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -240.348 -710.037] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-242.839 710.037 Td
-/F130_0 9.9626 Tf
-(is) 6.64505 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(request) 28.772 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(change) 28.2141 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(mode) 22.1369 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(compressed) 47.0334 Tj
--250 TJm
-(stream.) 29.0509 Tj
-[1 0 0 1 72 707.88] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -697.918] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 688.12 Td
-/F130_0 9.9626 Tf
-(Conceptually) 53.1305 Tj
-65 TJm
-(,) 2.49065 Tj
--217 TJm
-(a) 4.42339 Tj
--210 TJm
-(compressed) 47.0334 Tj
--209 TJm
-(stream) 26.5603 Tj
--209 TJm
-(can) 13.8281 Tj
--209 TJm
-(be) 9.40469 Tj
--210 TJm
-(in) 7.7509 Tj
--209 TJm
-(one) 14.386 Tj
--209 TJm
-(of) 8.29885 Tj
--209 TJm
-(four) 16.5977 Tj
--210 TJm
-(states:) 24.9065 Tj
--289 TJm
-(IDLE,) 25.1755 Tj
--209 TJm
-(R) 6.64505 Tj
-40 TJm
-(UNNING,) 41.7732 Tj
--210 TJm
-(FLUSHING) 49.2551 Tj
--209 TJm
-(and) 14.386 Tj
--209 TJm
-(FINISHING.) 52.2937 Tj
--419 TJm
-(Be-) 14.386 Tj
-72 676.164 Td
-(fore) 16.0398 Tj
--264 TJm
-(initialisation) 49.823 Tj
--263 TJm
-(\() 3.31755 Tj
-[1 0 0 1 146.434 676.164] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -146.434 -676.164] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-146.434 676.164 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompressInit) 107.596 Tj
-[1 0 0 1 254.031 676.164] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -254.031 -676.164] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-254.031 676.164 Td
-/F130_0 9.9626 Tf
-(\)) 3.31755 Tj
--264 TJm
-(and) 14.386 Tj
--263 TJm
-(after) 18.2515 Tj
--264 TJm
-(termination) 45.9375 Tj
--264 TJm
-(\() 3.31755 Tj
-[1 0 0 1 349.75 676.164] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -349.75 -676.164] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-349.75 676.164 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompressEnd) 101.619 Tj
-[1 0 0 1 451.369 676.164] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -451.369 -676.164] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-451.369 676.164 Td
-/F130_0 9.9626 Tf
-(\),) 5.8082 Tj
--267 TJm
-(a) 4.42339 Tj
--264 TJm
-(stream) 26.5603 Tj
--264 TJm
-(is) 6.64505 Tj
--263 TJm
-(re) 7.74094 Tj
-15 TJm
-(g) 4.9813 Tj
-5 TJm
-(arded) 22.1269 Tj
-72 664.209 Td
-(as) 8.29885 Tj
--250 TJm
-(IDLE.) 25.1755 Tj
-[1 0 0 1 72 664.11] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -654.147] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 642.291 Td
-/F130_0 9.9626 Tf
-(Upon) 22.1369 Tj
--389 TJm
-(initialisation) 49.823 Tj
--390 TJm
-(\() 3.31755 Tj
-[1 0 0 1 155.036 642.291] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -155.036 -642.291] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-155.036 642.291 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompressInit) 107.596 Tj
-[1 0 0 1 262.632 642.291] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -262.632 -642.291] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-262.632 642.291 Td
-/F130_0 9.9626 Tf
-(\),) 5.8082 Tj
--424 TJm
-(the) 12.1743 Tj
--390 TJm
-(stream) 26.5603 Tj
--389 TJm
-(is) 6.64505 Tj
--389 TJm
-(placed) 26.0024 Tj
--390 TJm
-(in) 7.7509 Tj
--389 TJm
-(the) 12.1743 Tj
--390 TJm
-(R) 6.64505 Tj
-40 TJm
-(UNNING) 39.2825 Tj
--389 TJm
-(state.) 20.7521 Tj
--1457 TJm
-(Subsequent) 45.9375 Tj
--389 TJm
-(calls) 18.2614 Tj
-72 630.336 Td
-(to) 7.7509 Tj
-[1 0 0 1 83.818 630.336] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -83.818 -630.336] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-83.818 630.336 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompress) 83.6858 Tj
-[1 0 0 1 167.504 630.336] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -167.504 -630.336] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-171.571 630.336 Td
-/F130_0 9.9626 Tf
-(should) 26.5703 Tj
--408 TJm
-(pass) 17.1556 Tj
-[1 0 0 1 223.431 630.336] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -223.431 -630.336] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-223.431 630.336 Td
-/F134_0 9.9626 Tf
-(BZ_RUN) 35.8654 Tj
-[1 0 0 1 259.297 630.336] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -259.297 -630.336] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-263.363 630.336 Td
-/F130_0 9.9626 Tf
-(as) 8.29885 Tj
--408 TJm
-(the) 12.1743 Tj
--408 TJm
-(requested) 38.1767 Tj
--409 TJm
-(action;) 27.1182 Tj
--487 TJm
-(other) 20.4731 Tj
--408 TJm
-(actions) 28.224 Tj
--408 TJm
-(are) 12.1643 Tj
--409 TJm
-(ille) 12.7322 Tj
-15 TJm
-(g) 4.9813 Tj
-5 TJm
-(al) 7.193 Tj
--408 TJm
-(and) 14.386 Tj
--408 TJm
-(will) 15.5018 Tj
--408 TJm
-(result) 22.1369 Tj
--409 TJm
-(in) 7.7509 Tj
-[1 0 0 1 72 618.381] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -618.381] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 618.381 Td
-/F134_0 9.9626 Tf
-(BZ_SEQUENCE_ERROR) 101.619 Tj
-[1 0 0 1 173.619 618.381] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -173.619 -618.381] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-173.619 618.381 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
-[1 0 0 1 72 617.071] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -607.108] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 596.463 Td
-/F130_0 9.9626 Tf
-(At) 9.9626 Tj
--279 TJm
-(some) 21.031 Tj
--279 TJm
-(point,) 22.9738 Tj
--286 TJm
-(the) 12.1743 Tj
--279 TJm
-(calling) 27.1182 Tj
--279 TJm
-(program) 33.7533 Tj
--279 TJm
-(will) 15.5018 Tj
--279 TJm
-(ha) 9.40469 Tj
-20 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--278 TJm
-(pro) 13.2801 Tj
-14 TJm
-(vi) 7.7509 Tj
-1 TJm
-(ded) 14.386 Tj
--279 TJm
-(all) 9.9626 Tj
--279 TJm
-(the) 12.1743 Tj
--279 TJm
-(input) 20.4831 Tj
--279 TJm
-(data) 16.5977 Tj
--279 TJm
-(it) 5.53921 Tj
--279 TJm
-(w) 7.193 Tj
-10 TJm
-(ants) 16.0497 Tj
--279 TJm
-(to.) 10.2416 Tj
--793 TJm
-(It) 6.08715 Tj
--279 TJm
-(will) 15.5018 Tj
--279 TJm
-(then) 17.1556 Tj
--279 TJm
-(w) 7.193 Tj
-10 TJm
-(ant) 12.1743 Tj
--279 TJm
-(to) 7.7509 Tj
--279 TJm
-(\002nish) 22.1469 Tj
--279 TJm
-(up) 9.9626 Tj
--279 TJm
-(--) 6.63509 Tj
-72 584.508 Td
-(in) 7.7509 Tj
--287 TJm
-(ef) 7.74094 Tj
-25 TJm
-(fect,) 17.4246 Tj
--297 TJm
-(asking) 26.0123 Tj
--288 TJm
-(the) 12.1743 Tj
--287 TJm
-(library) 26.5603 Tj
--287 TJm
-(to) 7.7509 Tj
--288 TJm
-(process) 29.8778 Tj
--287 TJm
-(an) 9.40469 Tj
-15 TJm
-(y) 4.9813 Tj
--288 TJm
-(data) 16.5977 Tj
--287 TJm
-(it) 5.53921 Tj
--287 TJm
-(might) 23.2527 Tj
--288 TJm
-(ha) 9.40469 Tj
-20 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--287 TJm
-(b) 4.9813 Tj
-20 TJm
-(uf) 8.29885 Tj
-25 TJm
-(fered) 20.4632 Tj
--288 TJm
-(internally) 38.1866 Tj
-65 TJm
-(.) 2.49065 Tj
--844 TJm
-(In) 8.29885 Tj
--288 TJm
-(this) 14.396 Tj
--287 TJm
-(state,) 20.7521 Tj
-[1 0 0 1 456.314 584.508] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -456.314 -584.508] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-456.314 584.508 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompress) 83.6858 Tj
-[1 0 0 1 540 584.508] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -540 -584.508] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 572.553 Td
-/F130_0 9.9626 Tf
-(will) 15.5018 Tj
--258 TJm
-(no) 9.9626 Tj
--257 TJm
-(longer) 25.4544 Tj
--258 TJm
-(attempt) 29.8878 Tj
--258 TJm
-(to) 7.7509 Tj
--258 TJm
-(read) 17.1456 Tj
--257 TJm
-(data) 16.5977 Tj
--258 TJm
-(from) 19.3673 Tj
-[1 0 0 1 234.207 572.553] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -234.207 -572.553] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-234.207 572.553 Td
-/F134_0 9.9626 Tf
-(next_in) 41.8429 Tj
-[1 0 0 1 276.051 572.553] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -276.051 -572.553] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-276.051 572.553 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--260 TJm
-(b) 4.9813 Tj
-20 TJm
-(ut) 7.7509 Tj
--257 TJm
-(it) 5.53921 Tj
--258 TJm
-(will) 15.5018 Tj
--258 TJm
-(w) 7.193 Tj
-10 TJm
-(ant) 12.1743 Tj
--257 TJm
-(to) 7.7509 Tj
--258 TJm
-(write) 20.4731 Tj
--258 TJm
-(data) 16.5977 Tj
--258 TJm
-(to) 7.7509 Tj
-[1 0 0 1 407.082 572.553] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -407.082 -572.553] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-407.082 572.553 Td
-/F134_0 9.9626 Tf
-(next_out) 47.8205 Tj
-[1 0 0 1 454.902 572.553] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -454.902 -572.553] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-454.902 572.553 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
--666 TJm
-(Because) 33.1954 Tj
--258 TJm
-(the) 12.1743 Tj
--258 TJm
-(output) 25.4644 Tj
-72 560.598 Td
-(b) 4.9813 Tj
-20 TJm
-(uf) 8.29885 Tj
-25 TJm
-(fer) 11.0585 Tj
--228 TJm
-(supplied) 33.7633 Tj
--228 TJm
-(by) 9.9626 Tj
--229 TJm
-(the) 12.1743 Tj
--228 TJm
-(user) 16.5977 Tj
--228 TJm
-(can) 13.8281 Tj
--228 TJm
-(be) 9.40469 Tj
--228 TJm
-(arbitrarily) 39.8404 Tj
--229 TJm
-(sma) 16.0497 Tj
-1 TJm
-(ll,) 8.02986 Tj
--233 TJm
-(the) 12.1743 Tj
--228 TJm
-(\002nishing-up) 48.1592 Tj
--228 TJm
-(operation) 37.6287 Tj
--229 TJm
-(cannot) 26.5603 Tj
--228 TJm
-(necessarily) 44.2638 Tj
--228 TJm
-(be) 9.40469 Tj
--228 TJm
-(done) 19.3673 Tj
--228 TJm
-(with) 17.7135 Tj
--229 TJm
-(a) 4.42339 Tj
--228 TJm
-(single) 23.8007 Tj
-72 548.643 Td
-(call) 14.386 Tj
--250 TJm
-(of) 8.29885 Tj
-[1 0 0 1 99.6659 548.643] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -99.6659 -548.643] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-99.6659 548.643 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompress) 83.6858 Tj
-[1 0 0 1 183.352 548.643] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -183.352 -548.643] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-183.352 548.643 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
-[1 0 0 1 72 547.108] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -537.146] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 526.725 Td
-/F130_0 9.9626 Tf
-(Instead,) 31.2626 Tj
--346 TJm
-(the) 12.1743 Tj
--327 TJm
-(calling) 27.1182 Tj
--326 TJm
-(program) 33.7533 Tj
--327 TJm
-(passes) 25.4544 Tj
-[1 0 0 1 218.231 526.725] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -218.231 -526.725] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-218.231 526.725 Td
-/F134_0 9.9626 Tf
-(BZ_FINISH) 53.798 Tj
-[1 0 0 1 272.029 526.725] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -272.029 -526.725] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-275.284 526.725 Td
-/F130_0 9.9626 Tf
-(as) 8.29885 Tj
--327 TJm
-(an) 9.40469 Tj
--327 TJm
-(action) 24.3486 Tj
--326 TJm
-(to) 7.7509 Tj
-[1 0 0 1 338.108 526.725] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -338.108 -526.725] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-338.108 526.725 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompress) 83.6858 Tj
-[1 0 0 1 421.795 526.725] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -421.795 -526.725] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-421.795 526.725 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
--1081 TJm
-(This) 17.7135 Tj
--326 TJm
-(changes) 32.0895 Tj
--327 TJm
-(the) 12.1743 Tj
--327 TJm
-(stream') 29.8778 Tj
-55 TJm
-(s) 3.87545 Tj
-72 514.77 Td
-(state) 18.2614 Tj
--291 TJm
-(to) 7.7509 Tj
--290 TJm
-(FINISHING.) 52.2937 Tj
--581 TJm
-(An) 12.1743 Tj
-15 TJm
-(y) 4.9813 Tj
--291 TJm
-(remaining) 40.3983 Tj
--290 TJm
-(input) 20.4831 Tj
--291 TJm
-(\(ie,) 13.0012 Tj
-[1 0 0 1 264.452 514.77] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -264.452 -514.77] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-264.452 514.77 Td
-/F134_0 9.9626 Tf
-(next_in[0) 53.798 Tj
--600 TJm
-(..) 11.9551 Tj
--1200 TJm
-(avail_in-1]) 65.7532 Tj
-[1 0 0 1 413.892 514.77] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -413.892 -514.77] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-413.892 514.77 Td
-/F130_0 9.9626 Tf
-(\)) 3.31755 Tj
--291 TJm
-(is) 6.64505 Tj
--290 TJm
-(compressed) 47.0334 Tj
--291 TJm
-(and) 14.386 Tj
--290 TJm
-(transferred) 43.148 Tj
-72 502.814 Td
-(to) 7.7509 Tj
--421 TJm
-(the) 12.1743 Tj
--421 TJm
-(output) 25.4644 Tj
--421 TJm
-(b) 4.9813 Tj
-20 TJm
-(uf) 8.29885 Tj
-25 TJm
-(fer) 11.0585 Tj
-55 TJm
-(.) 2.49065 Tj
--1646 TJm
-(T) 6.08715 Tj
-80 TJm
-(o) 4.9813 Tj
--421 TJm
-(do) 9.9626 Tj
--422 TJm
-(this) 14.396 Tj
-1 TJm
-(,) 2.49065 Tj
-[1 0 0 1 222.339 502.814] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -222.339 -502.814] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-222.339 502.814 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompress) 83.6858 Tj
-[1 0 0 1 306.025 502.814] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -306.025 -502.814] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-310.22 502.814 Td
-/F130_0 9.9626 Tf
-(must) 19.3773 Tj
--421 TJm
-(be) 9.40469 Tj
--421 TJm
-(called) 23.7907 Tj
--421 TJm
-(repeatedly) 41.4942 Tj
--421 TJm
-(until) 18.2714 Tj
--421 TJm
-(all) 9.9626 Tj
--421 TJm
-(the) 12.1743 Tj
--421 TJm
-(output) 25.4644 Tj
--421 TJm
-(has) 13.2801 Tj
--421 TJm
-(been) 18.8094 Tj
-72 490.859 Td
-(consumed.) 42.889 Tj
--1397 TJm
-(At) 9.9626 Tj
--379 TJm
-(that) 14.9439 Tj
--380 TJm
-(point,) 22.9738 Tj
-[1 0 0 1 188.346 490.859] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -188.346 -490.859] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-188.346 490.859 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompress) 83.6858 Tj
-[1 0 0 1 272.033 490.859] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -272.033 -490.859] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-275.813 490.859 Td
-/F130_0 9.9626 Tf
-(returns) 27.6661 Tj
-[1 0 0 1 307.259 490.859] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -307.259 -490.859] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-307.259 490.859 Td
-/F134_0 9.9626 Tf
-(BZ_STREAM_END) 77.7083 Tj
-[1 0 0 1 384.968 490.859] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -384.968 -490.859] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-384.968 490.859 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--379 TJm
-(and) 14.386 Tj
--380 TJm
-(the) 12.1743 Tj
--379 TJm
-(stream') 29.8778 Tj
-55 TJm
-(s) 3.87545 Tj
--380 TJm
-(state) 18.2614 Tj
--379 TJm
-(is) 6.64505 Tj
--380 TJm
-(set) 11.0684 Tj
--379 TJm
-(back) 18.8094 Tj
--379 TJm
-(to) 7.7509 Tj
-72 478.904 Td
-(IDLE.) 25.1755 Tj
-[1 0 0 1 99.6662 478.904] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -99.6662 -478.904] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-99.6662 478.904 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompressEnd) 101.619 Tj
-[1 0 0 1 201.285 478.904] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -201.285 -478.904] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-203.776 478.904 Td
-/F130_0 9.9626 Tf
-(should) 26.5703 Tj
--250 TJm
-(then) 17.1556 Tj
--250 TJm
-(be) 9.40469 Tj
--250 TJm
-(called.) 26.2813 Tj
-[1 0 0 1 72 477.37] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -467.407] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 456.986 Td
-/F130_0 9.9626 Tf
-(Just) 15.5018 Tj
--380 TJm
-(to) 7.7509 Tj
--380 TJm
-(mak) 17.1556 Tj
-10 TJm
-(e) 4.42339 Tj
--379 TJm
-(sure) 16.5977 Tj
--380 TJm
-(the) 12.1743 Tj
--380 TJm
-(calling) 27.1182 Tj
--380 TJm
-(program) 33.7533 Tj
--379 TJm
-(does) 18.2614 Tj
--380 TJm
-(not) 12.7322 Tj
--380 TJm
-(cheat,) 23.5117 Tj
--412 TJm
-(the) 12.1743 Tj
--380 TJm
-(library) 26.5603 Tj
--380 TJm
-(mak) 17.1556 Tj
-10 TJm
-(es) 8.29885 Tj
--379 TJm
-(a) 4.42339 Tj
--380 TJm
-(note) 17.1556 Tj
--380 TJm
-(of) 8.29885 Tj
-[1 0 0 1 415.708 456.986] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -415.708 -456.986] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-415.708 456.986 Td
-/F134_0 9.9626 Tf
-(avail_in) 47.8205 Tj
-[1 0 0 1 463.528 456.986] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -463.528 -456.986] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-467.312 456.986 Td
-/F130_0 9.9626 Tf
-(at) 7.193 Tj
--380 TJm
-(the) 12.1743 Tj
--380 TJm
-(time) 17.7135 Tj
--379 TJm
-(of) 8.29885 Tj
--380 TJm
-(the) 12.1743 Tj
-72 445.031 Td
-(\002rst) 15.5018 Tj
--286 TJm
-(call) 14.386 Tj
--286 TJm
-(t) 2.7696 Tj
-1 TJm
-(o) 4.9813 Tj
-[1 0 0 1 118.179 445.031] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -118.179 -445.031] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-118.179 445.031 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompress) 83.6858 Tj
-[1 0 0 1 201.865 445.031] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -201.865 -445.031] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-204.713 445.031 Td
-/F130_0 9.9626 Tf
-(which) 24.3486 Tj
--286 TJm
-(has) 13.2801 Tj
-[1 0 0 1 248.035 445.031] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -248.035 -445.031] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-248.035 445.031 Td
-/F134_0 9.9626 Tf
-(BZ_FINISH) 53.798 Tj
-[1 0 0 1 301.833 445.031] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -301.833 -445.031] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-304.68 445.031 Td
-/F130_0 9.9626 Tf
-(as) 8.29885 Tj
--286 TJm
-(an) 9.40469 Tj
--286 TJm
-(action) 24.3486 Tj
--285 TJm
-(\(ie,) 13.0012 Tj
--295 TJm
-(at) 7.193 Tj
--286 TJm
-(the) 12.1743 Tj
--286 TJm
-(time) 17.7135 Tj
--285 TJm
-(the) 12.1743 Tj
--286 TJm
-(program) 33.7533 Tj
--286 TJm
-(has) 13.2801 Tj
--286 TJm
-(announced) 43.158 Tj
--285 TJm
-(its) 9.41466 Tj
-72 433.076 Td
-(intention) 35.427 Tj
--292 TJm
-(to) 7.7509 Tj
--292 TJm
-(not) 12.7322 Tj
--291 TJm
-(supply) 26.5703 Tj
--292 TJm
-(an) 9.40469 Tj
-15 TJm
-(y) 4.9813 Tj
--292 TJm
-(more) 20.4731 Tj
--292 TJm
-(input\).) 26.2913 Tj
--870 TJm
-(By) 11.6264 Tj
--292 TJm
-(comparing) 42.61 Tj
--292 TJm
-(this) 14.396 Tj
--292 TJm
-(v) 4.9813 Tj
-25 TJm
-(alue) 16.5977 Tj
--291 TJm
-(with) 17.7135 Tj
--292 TJm
-(that) 14.9439 Tj
--292 TJm
-(of) 8.29885 Tj
-[1 0 0 1 392.862 433.076] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -392.862 -433.076] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-392.862 433.076 Td
-/F134_0 9.9626 Tf
-(avail_in) 47.8205 Tj
-[1 0 0 1 440.682 433.076] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -440.682 -433.076] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-443.589 433.076 Td
-/F130_0 9.9626 Tf
-(o) 4.9813 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(er) 7.74094 Tj
--292 TJm
-(subsequent) 44.2738 Tj
--292 TJm
-(calls) 18.2614 Tj
--291 TJm
-(to) 7.7509 Tj
-[1 0 0 1 72 421.121] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -421.121] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 421.121 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompress) 83.6858 Tj
-[1 0 0 1 155.686 421.121] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -155.686 -421.121] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-155.686 421.121 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--247 TJm
-(the) 12.1743 Tj
--247 TJm
-(library) 26.5603 Tj
--246 TJm
-(can) 13.8281 Tj
--247 TJm
-(detect) 23.7907 Tj
--246 TJm
-(an) 9.40469 Tj
-15 TJm
-(y) 4.9813 Tj
--247 TJm
-(att) 9.9626 Tj
-1 TJm
-(empts) 23.8007 Tj
--247 TJm
-(to) 7.7509 Tj
--246 TJm
-(slip) 14.396 Tj
--247 TJm
-(in) 7.7509 Tj
--246 TJm
-(more) 20.4731 Tj
--247 TJm
-(data) 16.5977 Tj
--246 TJm
-(to) 7.7509 Tj
--247 TJm
-(compress.) 40.1194 Tj
--617 TJm
-(An) 12.1743 Tj
-15 TJm
-(y) 4.9813 Tj
--247 TJm
-(calls) 18.2614 Tj
--246 TJm
-(for) 11.6164 Tj
--247 TJm
-(which) 24.3486 Tj
--246 TJm
-(this) 14.396 Tj
--247 TJm
-(is) 6.64505 Tj
-72 409.166 Td
-(detected) 33.1954 Tj
--250 TJm
-(will) 15.5018 Tj
--250 TJm
-(return) 23.7907 Tj
-[1 0 0 1 151.959 409.166] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -151.959 -409.166] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-151.959 409.166 Td
-/F134_0 9.9626 Tf
-(BZ_SEQUENCE_ERROR) 101.619 Tj
-[1 0 0 1 253.578 409.166] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -253.578 -409.166] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-253.578 409.166 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
--500 TJm
-(This) 17.7135 Tj
--250 TJm
-(indicates) 35.417 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(programming) 54.2364 Tj
--250 TJm
-(mistak) 26.5703 Tj
-10 TJm
-(e) 4.42339 Tj
--250 TJm
-(which) 24.3486 Tj
--250 TJm
-(should) 26.5703 Tj
--250 TJm
-(be) 9.40469 Tj
--250 TJm
-(corrected.) 39.5515 Tj
-[1 0 0 1 72 407.009] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -397.046] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 387.248 Td
-/F130_0 9.9626 Tf
-(Instead) 28.772 Tj
--224 TJm
-(of) 8.29885 Tj
--223 TJm
-(asking) 26.0123 Tj
--224 TJm
-(to) 7.7509 Tj
--223 TJm
-(\002nish,) 24.6375 Tj
--229 TJm
-(the) 12.1743 Tj
--224 TJm
-(calling) 27.1182 Tj
--223 TJm
-(program) 33.7533 Tj
--224 TJm
-(may) 17.1556 Tj
--224 TJm
-(ask) 13.2801 Tj
-[1 0 0 1 293.282 387.248] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -293.282 -387.248] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-293.282 387.248 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompress) 83.6858 Tj
-[1 0 0 1 376.968 387.248] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -376.968 -387.248] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-379.196 387.248 Td
-/F130_0 9.9626 Tf
-(to) 7.7509 Tj
--224 TJm
-(tak) 12.1743 Tj
-10 TJm
-(e) 4.42339 Tj
--223 TJm
-(all) 9.9626 Tj
--224 TJm
-(the) 12.1743 Tj
--223 TJm
-(remaining) 40.3983 Tj
--224 TJm
-(input,) 22.9738 Tj
--229 TJm
-(compress) 37.6287 Tj
-72 375.293 Td
-(it) 5.53921 Tj
--278 TJm
-(and) 14.386 Tj
--278 TJm
-(terminate) 37.6287 Tj
--278 TJm
-(the) 12.1743 Tj
--278 TJm
-(current) 28.2141 Tj
--277 TJm
-(\(Burro) 26.5603 Tj
-25 TJm
-(ws-Wheeler\)) 51.4469 Tj
--278 TJm
-(compression) 50.3609 Tj
--278 TJm
-(block.) 24.6275 Tj
--787 TJm
-(Th) 11.0684 Tj
--1 TJm
-(i) 2.7696 Tj
-1 TJm
-(s) 3.87545 Tj
--278 TJm
-(could) 22.1369 Tj
--278 TJm
-(be) 9.40469 Tj
--278 TJm
-(useful) 24.3486 Tj
--278 TJm
-(for) 11.6164 Tj
--278 TJm
-(error) 19.3573 Tj
--278 TJm
-(control) 28.224 Tj
--278 TJm
-(purposes.) 37.9077 Tj
-72 363.338 Td
-(The) 15.4918 Tj
--328 TJm
-(mechanism) 45.3796 Tj
--328 TJm
-(is) 6.64505 Tj
--328 TJm
-(analogous) 40.3983 Tj
--328 TJm
-(to) 7.7509 Tj
--328 TJm
-(that) 14.9439 Tj
--328 TJm
-(for) 11.6164 Tj
--328 TJm
-(\002nishing:) 37.6487 Tj
--466 TJm
-(call) 14.386 Tj
-[1 0 0 1 297.049 363.337] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -297.049 -363.337] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-297.049 363.337 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompress) 83.6858 Tj
-[1 0 0 1 380.735 363.337] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -380.735 -363.337] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-384.003 363.337 Td
-/F130_0 9.9626 Tf
-(with) 17.7135 Tj
--328 TJm
-(an) 9.40469 Tj
--328 TJm
-(action) 24.3486 Tj
--328 TJm
-(of) 8.29885 Tj
-[1 0 0 1 456.841 363.337] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -456.841 -363.337] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-456.841 363.337 Td
-/F134_0 9.9626 Tf
-(BZ_FLUSH) 47.8205 Tj
-[1 0 0 1 504.662 363.337] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -504.662 -363.337] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-504.662 363.337 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--328 TJm
-(remo) 20.4731 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
-72 351.382 Td
-(output) 25.4644 Tj
--445 TJm
-(data,) 19.0883 Tj
--494 TJm
-(and) 14.386 Tj
--446 TJm
-(persist) 26.0123 Tj
--445 TJm
-(with) 17.7135 Tj
--445 TJm
-(the) 12.1743 Tj
-[1 0 0 1 213.94 351.382] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -213.94 -351.382] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-213.94 351.382 Td
-/F134_0 9.9626 Tf
-(BZ_FLUSH) 47.8205 Tj
-[1 0 0 1 261.761 351.382] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -261.761 -351.382] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-266.195 351.382 Td
-/F130_0 9.9626 Tf
-(action) 24.3486 Tj
--445 TJm
-(until) 18.2714 Tj
--445 TJm
-(the) 12.1743 Tj
--446 TJm
-(v) 4.9813 Tj
-25 TJm
-(alue) 16.5977 Tj
-[1 0 0 1 360.062 351.382] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -360.062 -351.382] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-360.062 351.382 Td
-/F134_0 9.9626 Tf
-(BZ_RUN) 35.8654 Tj
-[1 0 0 1 395.928 351.382] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -395.928 -351.382] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-400.362 351.382 Td
-/F130_0 9.9626 Tf
-(is) 6.64505 Tj
--445 TJm
-(returned.) 35.686 Tj
--1792 TJm
-(As) 11.0684 Tj
--445 TJm
-(with) 17.7135 Tj
--445 TJm
-(\002nishing,) 37.3697 Tj
-[1 0 0 1 72 339.427] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -339.427] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 339.427 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompress) 83.6858 Tj
-[1 0 0 1 155.686 339.427] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -155.686 -339.427] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-158.177 339.427 Td
-/F130_0 9.9626 Tf
-(detects) 27.6661 Tj
--250 TJm
-(an) 9.40469 Tj
-15 TJm
-(y) 4.9813 Tj
--250 TJm
-(attempt) 29.8878 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(pro) 13.2801 Tj
-15 TJm
-(vide) 17.1556 Tj
--250 TJm
-(more) 20.4731 Tj
--250 TJm
-(input) 20.4831 Tj
--250 TJm
-(data) 16.5977 Tj
--250 TJm
-(once) 18.8094 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(\003ush) 19.3773 Tj
--250 TJm
-(has) 13.2801 Tj
--250 TJm
-(be) 9.40469 Tj
-15 TJm
-(gun.) 17.4346 Tj
-[1 0 0 1 72 337.27] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -327.308] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 317.509 Td
-/F130_0 9.9626 Tf
-(Once) 21.0211 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(\003ush) 19.3773 Tj
--250 TJm
-(is) 6.64505 Tj
--250 TJm
-(complete,) 39.0135 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(stream) 26.5603 Tj
--250 TJm
-(returns) 27.6661 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(normal) 28.224 Tj
--250 TJm
-(R) 6.64505 Tj
-40 TJm
-(UNNING) 39.2825 Tj
--250 TJm
-(state.) 20.7521 Tj
-[1 0 0 1 72 315.353] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -305.39] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 295.591 Td
-/F130_0 9.9626 Tf
-(This) 17.7135 Tj
--344 TJm
-(all) 9.9626 Tj
--343 TJm
-(sounds) 27.6761 Tj
--344 TJm
-(pretty) 23.2427 Tj
--344 TJm
-(comple) 29.3299 Tj
-15 TJm
-(x,) 7.47195 Tj
--367 TJm
-(b) 4.9813 Tj
-20 TJm
-(ut) 7.7509 Tj
--344 TJm
-(isn') 14.9439 Tj
-18 TJm
-(t) 2.7696 Tj
--344 TJm
-(really) 22.6848 Tj
-65 TJm
-(.) 2.49065 Tj
--1182 TJm
-(Here') 22.6749 Tj
-55 TJm
-(s) 3.87545 Tj
--344 TJm
-(a) 4.42339 Tj
--344 TJm
-(table) 19.3673 Tj
--343 TJm
-(which) 24.3486 Tj
--344 TJm
-(sho) 13.8381 Tj
-25 TJm
-(ws) 11.0684 Tj
--344 TJm
-(which) 24.3486 Tj
--344 TJm
-(actions) 28.224 Tj
--343 TJm
-(are) 12.1643 Tj
--344 TJm
-(allo) 14.9439 Tj
-25 TJm
-(w) 7.193 Tj
-10 TJm
-(able) 16.5977 Tj
--344 TJm
-(in) 7.7509 Tj
--344 TJm
-(each) 18.2515 Tj
-72 283.636 Td
-(state,) 20.7521 Tj
--281 TJm
-(what) 19.3673 Tj
--274 TJm
-(action) 24.3486 Tj
--275 TJm
-(will) 15.5018 Tj
--274 TJm
-(be) 9.40469 Tj
--275 TJm
-(tak) 12.1743 Tj
-10 TJm
-(en,) 11.8953 Tj
--280 TJm
-(what) 19.3673 Tj
--275 TJm
-(the) 12.1743 Tj
--274 TJm
-(ne) 9.40469 Tj
-15 TJm
-(xt) 7.7509 Tj
--275 TJm
-(state) 18.2614 Tj
--274 TJm
-(is,) 9.1357 Tj
--281 TJm
-(and) 14.386 Tj
--274 TJm
-(what) 19.3673 Tj
--275 TJm
-(the) 12.1743 Tj
--275 TJm
-(non-error) 37.6188 Tj
--274 TJm
-(return) 23.7907 Tj
--275 TJm
-(v) 4.9813 Tj
-25 TJm
-(alues) 20.4731 Tj
--274 TJm
-(are.) 14.655 Tj
--767 TJm
-(Note) 19.3673 Tj
--275 TJm
-(that) 14.9439 Tj
--274 TJm
-(you) 14.9439 Tj
--275 TJm
-(can') 17.1456 Tj
-18 TJm
-(t) 2.7696 Tj
-72 271.681 Td
-(e) 4.42339 Tj
-15 TJm
-(xplicitly) 33.2153 Tj
--347 TJm
-(ask) 13.2801 Tj
--348 TJm
-(what) 19.3673 Tj
--347 TJm
-(state) 18.2614 Tj
--348 TJm
-(the) 12.1743 Tj
--347 TJm
-(stream) 26.5603 Tj
--348 TJm
-(is) 6.64505 Tj
--347 TJm
-(in,) 10.2416 Tj
--372 TJm
-(b) 4.9813 Tj
-20 TJm
-(ut) 7.7509 Tj
--347 TJm
-(nor) 13.2801 Tj
--348 TJm
-(do) 9.9626 Tj
--347 TJm
-(you) 14.9439 Tj
--348 TJm
-(need) 18.8094 Tj
--347 TJm
-(to) 7.7509 Tj
--348 TJm
-(--) 6.63509 Tj
--347 TJm
-(it) 5.53921 Tj
--348 TJm
-(can) 13.8281 Tj
--347 TJm
-(be) 9.40469 Tj
--347 TJm
-(inferred) 31.5316 Tj
--348 TJm
-(from) 19.3673 Tj
--347 TJm
-(the) 12.1743 Tj
--348 TJm
-(v) 4.9813 Tj
-25 TJm
-(alues) 20.4731 Tj
--347 TJm
-(returned) 33.1954 Tj
--348 TJm
-(by) 9.9626 Tj
-[1 0 0 1 72 259.726] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -259.726] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 259.726 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompress) 83.6858 Tj
-[1 0 0 1 155.686 259.726] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -155.686 -259.726] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-155.686 259.726 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
-[1 0 0 1 72 258.192] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -207.34] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 374.394 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 40.5726 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -493.841 -50.8518] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-534.414 50.8518 Td
-/F130_0 9.9626 Tf
-(14) 9.9626 Tj
-[1 0 0 1 453.269 50.8518] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 93.5985 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.2765 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-Q
-showpage
-%%PageTrailer
-pdfEndPage
-%%Page: 18 18
-%%BeginPageSetup
-%%PageOrientation: Portrait
-pdfStartPage
-0 0 612 792 re W
-%%EndPageSetup
-[] 0 d
-1 i
-0 j
-0 J
-10 M
-1 w
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-false op
-false OP
-0 0 612 792 re
-W
-q
-[1 0 0 1 72 741.554] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 14.4459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 187.197 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 -8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 76.4979 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -342.569 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-419.067 749.245 Td
-/F130_0 9.9626 Tf
-(Programming) 54.7943 Tj
--250 TJm
-(with) 17.7135 Tj
-[1 0 0 1 496.556 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -496.556 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-496.556 749.245 Td
-/F134_0 9.9626 Tf
-(libbzip2) 47.8205 Tj
-[1 0 0 1 544.376 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -278.305 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 280.796 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.974 -5.0363] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -0.4981] cm
-q
-[] 0 d
-0 J
-0.4981 w
-0 0.2491 m
-475.465 0.2491 l
-S
-Q
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 479.251 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -595.402] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 573.848 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 570.261] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -711.631] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 711.631 Td
-/F134_0 9.9626 Tf
-(IDLE/any) 47.8205 Tj
-98.4879 699.676 Td
-(Illegal.) 47.8205 Tj
--852 TJm
-(IDLE) 23.9102 Tj
--426 TJm
-(state) 29.8878 Tj
--426 TJm
-(only) 23.9102 Tj
--426 TJm
-(exists) 35.8654 Tj
--426 TJm
-(after) 29.8878 Tj
--426 TJm
-(BZ2_bzCompressEnd) 101.619 Tj
--426 TJm
-(or) 11.9551 Tj
-98.4879 687.721 Td
-(before) 35.8654 Tj
--426 TJm
-(BZ2_bzCompressInit.) 113.574 Tj
-98.4879 675.766 Td
-(Return) 35.8654 Tj
--426 TJm
-(value) 29.8878 Tj
--426 TJm
-(=) 5.97756 Tj
--426 TJm
-(BZ_SEQUENCE_ERROR) 101.619 Tj
-90 651.856 Td
-(RUNNING/BZ_RUN) 83.6858 Tj
-98.4879 639.9 Td
-(Compress) 47.8205 Tj
--426 TJm
-(from) 23.9102 Tj
--426 TJm
-(next_in) 41.8429 Tj
--426 TJm
-(to) 11.9551 Tj
--426 TJm
-(next_out) 47.8205 Tj
--426 TJm
-(as) 11.9551 Tj
--426 TJm
-(much) 23.9102 Tj
--426 TJm
-(as) 11.9551 Tj
--426 TJm
-(possible.) 53.798 Tj
-98.4879 627.945 Td
-(Next) 23.9102 Tj
--426 TJm
-(state) 29.8878 Tj
--426 TJm
-(=) 5.97756 Tj
--426 TJm
-(RUNNING) 41.8429 Tj
-98.4879 615.99 Td
-(Return) 35.8654 Tj
--426 TJm
-(value) 29.8878 Tj
--426 TJm
-(=) 5.97756 Tj
--426 TJm
-(BZ_RUN_OK) 53.798 Tj
-90 592.08 Td
-(RUNNING/BZ_FLUSH) 95.641 Tj
-98.4879 580.125 Td
-(Remember) 47.8205 Tj
--426 TJm
-(current) 41.8429 Tj
--426 TJm
-(value) 29.8878 Tj
--426 TJm
-(of) 11.9551 Tj
--426 TJm
-(next_in.) 47.8205 Tj
--426 TJm
-(Compress) 47.8205 Tj
--426 TJm
-(from) 23.9102 Tj
--426 TJm
-(next_in) 41.8429 Tj
-98.4879 568.169 Td
-(to) 11.9551 Tj
--426 TJm
-(next_out) 47.8205 Tj
--426 TJm
-(as) 11.9551 Tj
--426 TJm
-(much) 23.9102 Tj
--426 TJm
-(as) 11.9551 Tj
--426 TJm
-(possible,) 53.798 Tj
--426 TJm
-(but) 17.9327 Tj
--426 TJm
-(do) 11.9551 Tj
--426 TJm
-(not) 17.9327 Tj
--426 TJm
-(accept) 35.8654 Tj
--426 TJm
-(any) 17.9327 Tj
--426 TJm
-(more) 23.9102 Tj
--426 TJm
-(input.) 35.8654 Tj
-98.4879 556.214 Td
-(Next) 23.9102 Tj
--426 TJm
-(state) 29.8878 Tj
--426 TJm
-(=) 5.97756 Tj
--426 TJm
-(FLUSHING) 47.8205 Tj
-98.4879 544.259 Td
-(Return) 35.8654 Tj
--426 TJm
-(value) 29.8878 Tj
--426 TJm
-(=) 5.97756 Tj
--426 TJm
-(BZ_FLUSH_OK) 65.7532 Tj
-90 520.349 Td
-(RUNNING/BZ_FINISH) 101.619 Tj
-98.4879 508.394 Td
-(Remember) 47.8205 Tj
--426 TJm
-(current) 41.8429 Tj
--426 TJm
-(value) 29.8878 Tj
--426 TJm
-(of) 11.9551 Tj
--426 TJm
-(next_in.) 47.8205 Tj
--426 TJm
-(Compress) 47.8205 Tj
--426 TJm
-(from) 23.9102 Tj
--426 TJm
-(next_in) 41.8429 Tj
-98.4879 496.438 Td
-(to) 11.9551 Tj
--426 TJm
-(next_out) 47.8205 Tj
--426 TJm
-(as) 11.9551 Tj
--426 TJm
-(much) 23.9102 Tj
--426 TJm
-(as) 11.9551 Tj
--426 TJm
-(possible,) 53.798 Tj
--426 TJm
-(but) 17.9327 Tj
--426 TJm
-(do) 11.9551 Tj
--426 TJm
-(not) 17.9327 Tj
--426 TJm
-(accept) 35.8654 Tj
--426 TJm
-(any) 17.9327 Tj
--426 TJm
-(more) 23.9102 Tj
--426 TJm
-(input.) 35.8654 Tj
-98.4879 484.483 Td
-(Next) 23.9102 Tj
--426 TJm
-(state) 29.8878 Tj
--426 TJm
-(=) 5.97756 Tj
--426 TJm
-(FINISHING) 53.798 Tj
-98.4879 472.528 Td
-(Return) 35.8654 Tj
--426 TJm
-(value) 29.8878 Tj
--426 TJm
-(=) 5.97756 Tj
--426 TJm
-(BZ_FINISH_OK) 71.7307 Tj
-90 448.618 Td
-(FLUSHING/BZ_FLUSH) 101.619 Tj
-98.4879 436.663 Td
-(Compress) 47.8205 Tj
--426 TJm
-(from) 23.9102 Tj
--426 TJm
-(next_in) 41.8429 Tj
--426 TJm
-(to) 11.9551 Tj
--426 TJm
-(next_out) 47.8205 Tj
--426 TJm
-(as) 11.9551 Tj
--426 TJm
-(much) 23.9102 Tj
--426 TJm
-(as) 11.9551 Tj
--426 TJm
-(possible,) 53.798 Tj
-98.4879 424.707 Td
-(but) 17.9327 Tj
--426 TJm
-(do) 11.9551 Tj
--426 TJm
-(not) 17.9327 Tj
--426 TJm
-(accept) 35.8654 Tj
--426 TJm
-(any) 17.9327 Tj
--426 TJm
-(more) 23.9102 Tj
--426 TJm
-(input.) 35.8654 Tj
-98.4879 412.752 Td
-(If) 11.9551 Tj
--426 TJm
-(all) 17.9327 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(existing) 47.8205 Tj
--426 TJm
-(input) 29.8878 Tj
--426 TJm
-(has) 17.9327 Tj
--426 TJm
-(been) 23.9102 Tj
--426 TJm
-(used) 23.9102 Tj
--426 TJm
-(up) 11.9551 Tj
--426 TJm
-(and) 17.9327 Tj
--426 TJm
-(all) 17.9327 Tj
--426 TJm
-(compressed) 59.7756 Tj
-98.4879 400.797 Td
-(output) 35.8654 Tj
--426 TJm
-(has) 17.9327 Tj
--426 TJm
-(been) 23.9102 Tj
--426 TJm
-(removed) 41.8429 Tj
-106.976 388.842 Td
-(Next) 23.9102 Tj
--426 TJm
-(state) 29.8878 Tj
--426 TJm
-(=) 5.97756 Tj
--426 TJm
-(RUNNING;) 47.8205 Tj
--426 TJm
-(Return) 35.8654 Tj
--426 TJm
-(value) 29.8878 Tj
--426 TJm
-(=) 5.97756 Tj
--426 TJm
-(BZ_RUN_OK) 53.798 Tj
-98.4879 376.887 Td
-(else) 23.9102 Tj
-106.976 364.932 Td
-(Next) 23.9102 Tj
--426 TJm
-(state) 29.8878 Tj
--426 TJm
-(=) 5.97756 Tj
--426 TJm
-(FLUSHING;) 53.798 Tj
--426 TJm
-(Return) 35.8654 Tj
--426 TJm
-(value) 29.8878 Tj
--426 TJm
-(=) 5.97756 Tj
--426 TJm
-(BZ_FLUSH_OK) 65.7532 Tj
-90 341.021 Td
-(FLUSHING/other) 83.6858 Tj
-98.4879 329.066 Td
-(Illegal.) 47.8205 Tj
-98.4879 317.111 Td
-(Return) 35.8654 Tj
--426 TJm
-(value) 29.8878 Tj
--426 TJm
-(=) 5.97756 Tj
--426 TJm
-(BZ_SEQUENCE_ERROR) 101.619 Tj
-90 293.201 Td
-(FINISHING/BZ_FINISH) 113.574 Tj
-98.4879 281.245 Td
-(Compress) 47.8205 Tj
--426 TJm
-(from) 23.9102 Tj
--426 TJm
-(next_in) 41.8429 Tj
--426 TJm
-(to) 11.9551 Tj
--426 TJm
-(next_out) 47.8205 Tj
--426 TJm
-(as) 11.9551 Tj
--426 TJm
-(much) 23.9102 Tj
--426 TJm
-(as) 11.9551 Tj
--426 TJm
-(possible,) 53.798 Tj
-98.4879 269.29 Td
-(but) 17.9327 Tj
--426 TJm
-(to) 11.9551 Tj
--426 TJm
-(not) 17.9327 Tj
--426 TJm
-(accept) 35.8654 Tj
--426 TJm
-(any) 17.9327 Tj
--426 TJm
-(more) 23.9102 Tj
--426 TJm
-(input.) 35.8654 Tj
-98.4879 257.335 Td
-(If) 11.9551 Tj
--426 TJm
-(all) 17.9327 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(existing) 47.8205 Tj
--426 TJm
-(input) 29.8878 Tj
--426 TJm
-(has) 17.9327 Tj
--426 TJm
-(been) 23.9102 Tj
--426 TJm
-(used) 23.9102 Tj
--426 TJm
-(up) 11.9551 Tj
--426 TJm
-(and) 17.9327 Tj
--426 TJm
-(all) 17.9327 Tj
--426 TJm
-(compressed) 59.7756 Tj
-98.4879 245.38 Td
-(output) 35.8654 Tj
--426 TJm
-(has) 17.9327 Tj
--426 TJm
-(been) 23.9102 Tj
--426 TJm
-(removed) 41.8429 Tj
-106.976 233.425 Td
-(Next) 23.9102 Tj
--426 TJm
-(state) 29.8878 Tj
--426 TJm
-(=) 5.97756 Tj
--426 TJm
-(IDLE;) 29.8878 Tj
--426 TJm
-(Return) 35.8654 Tj
--426 TJm
-(value) 29.8878 Tj
--426 TJm
-(=) 5.97756 Tj
--426 TJm
-(BZ_STREAM_END) 77.7083 Tj
-98.4879 221.47 Td
-(else) 23.9102 Tj
-106.976 209.514 Td
-(Next) 23.9102 Tj
--426 TJm
-(state) 29.8878 Tj
--426 TJm
-(=) 5.97756 Tj
--426 TJm
-(FINISHING;) 59.7756 Tj
--426 TJm
-(Return) 35.8654 Tj
--426 TJm
-(value) 29.8878 Tj
--426 TJm
-(=) 5.97756 Tj
--426 TJm
-(BZ_FINISH_OK) 71.7307 Tj
-90 185.604 Td
-(FINISHING/other) 89.6634 Tj
-98.4879 173.649 Td
-(Illegal.) 47.8205 Tj
-98.4879 161.694 Td
-(Return) 35.8654 Tj
--426 TJm
-(value) 29.8878 Tj
--426 TJm
-(=) 5.97756 Tj
--426 TJm
-(BZ_SEQUENCE_ERROR) 101.619 Tj
-[1 0 0 1 72 146.152] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -136.189] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 124.234 Td
-/F130_0 9.9626 Tf
-(That) 18.2614 Tj
--250 TJm
-(still) 14.9539 Tj
--250 TJm
-(looks) 21.589 Tj
--250 TJm
-(complicated?) 53.1206 Tj
--620 TJm
-(W) 9.40469 Tj
-80 TJm
-(ell,) 12.4533 Tj
--250 TJm
-(f) 3.31755 Tj
-10 TJm
-(air) 10.5105 Tj
--250 TJm
-(enough.) 31.8205 Tj
--620 TJm
-(The) 15.4918 Tj
--250 TJm
-(usual) 21.031 Tj
--250 TJm
-(sequence) 36.5129 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(calls) 18.2614 Tj
--250 TJm
-(for) 11.6164 Tj
--250 TJm
-(compressing) 50.3609 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(load) 17.1556 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(data) 16.5977 Tj
--250 TJm
-(is:) 9.41466 Tj
-[1 0 0 1 72 122.077] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -29.7236] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 7.3724 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -79.3724 -92.3537] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-79.3724 92.3537 Td
-/F130_0 9.9626 Tf
-(1.) 7.47195 Tj
-[1 0 0 1 86.8444 92.3537] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 3.0884 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.9925 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -91.9253 -92.3537] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-91.9253 92.3537 Td
-/F130_0 9.9626 Tf
-(Get) 14.386 Tj
--250 TJm
-(started) 26.5603 Tj
--250 TJm
-(with) 17.7135 Tj
-[1 0 0 1 158.056 92.3537] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -158.056 -92.3537] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-158.056 92.3537 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompressInit) 107.596 Tj
-[1 0 0 1 265.653 92.3537] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -265.653 -92.3537] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-265.653 92.3537 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
-[1 0 0 1 268.144 92.3537] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -196.144 -41.5019] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.893 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 374.394 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.8542] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 40.5726 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -493.841 -50.9514] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-534.414 50.9514 Td
-/F130_0 9.9626 Tf
-(15) 9.9626 Tj
-[1 0 0 1 453.269 50.8518] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 93.5985 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.2765 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-Q
-showpage
-%%PageTrailer
-pdfEndPage
-%%Page: 19 19
-%%BeginPageSetup
-%%PageOrientation: Portrait
-pdfStartPage
-0 0 612 792 re W
-%%EndPageSetup
-[] 0 d
-1 i
-0 j
-0 J
-10 M
-1 w
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-false op
-false OP
-0 0 612 792 re
-W
-q
-[1 0 0 1 72 741.554] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 14.4459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 187.197 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 -8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 76.4979 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -342.569 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-419.067 749.245 Td
-/F130_0 9.9626 Tf
-(Programming) 54.7943 Tj
--250 TJm
-(with) 17.7135 Tj
-[1 0 0 1 496.556 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -496.556 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-496.556 749.245 Td
-/F134_0 9.9626 Tf
-(libbzip2) 47.8205 Tj
-[1 0 0 1 544.376 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -278.305 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 280.796 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.974 -5.0363] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -0.4981] cm
-q
-[] 0 d
-0 J
-0.4981 w
-0 0.2491 m
-475.465 0.2491 l
-S
-Q
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 479.251 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -31.5168] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 7.3724 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -79.3724 -710.037] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-79.3724 710.037 Td
-/F130_0 9.9626 Tf
-(2.) 7.47195 Tj
-[1 0 0 1 86.8444 710.037] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 3.0884 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.9925 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -91.9253 -710.037] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-91.9253 710.037 Td
-/F130_0 9.9626 Tf
-(Sho) 15.5018 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(el) 7.193 Tj
--240 TJm
-(data) 16.5977 Tj
--240 TJm
-(in) 7.7509 Tj
--241 TJm
-(and) 14.386 Tj
--240 TJm
-(shlurp) 24.9065 Tj
--240 TJm
-(out) 12.7322 Tj
--240 TJm
-(its) 9.41466 Tj
--240 TJm
-(compressed) 47.0334 Tj
--241 TJm
-(form) 19.3673 Tj
--240 TJm
-(using) 21.589 Tj
--240 TJm
-(zero) 17.1456 Tj
--240 TJm
-(or) 8.29885 Tj
--240 TJm
-(more) 20.4731 Tj
--241 TJm
-(calls) 18.2614 Tj
--240 TJm
-(of) 8.29885 Tj
-[1 0 0 1 401.454 710.037] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -401.454 -710.037] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-401.454 710.037 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompress) 83.6858 Tj
-[1 0 0 1 485.14 710.037] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -485.14 -710.037] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-487.533 710.037 Td
-/F130_0 9.9626 Tf
-(with) 17.7135 Tj
--240 TJm
-(action) 24.3486 Tj
--240 TJm
-(=) 5.61891 Tj
-[1 0 0 1 91.9253 698.082] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -91.9253 -698.082] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-91.9253 698.082 Td
-/F134_0 9.9626 Tf
-(BZ_RUN) 35.8654 Tj
-[1 0 0 1 127.791 698.082] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -127.791 -698.082] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-127.791 698.082 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
-[1 0 0 1 130.281 698.082] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -58.2814 -21.9178] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 7.3724 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -79.3724 -676.164] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-79.3724 676.164 Td
-/F130_0 9.9626 Tf
-(3.) 7.47195 Tj
-[1 0 0 1 86.8444 676.164] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 3.0884 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.9925 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -91.9253 -676.164] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-91.9253 676.164 Td
-/F130_0 9.9626 Tf
-(Finish) 24.9165 Tj
--242 TJm
-(up.) 12.4533 Tj
--307 TJm
-(Repeatedly) 44.8217 Tj
--241 TJm
-(call) 14.386 Tj
-[1 0 0 1 198.784 676.164] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -198.784 -676.164] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-198.784 676.164 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompress) 83.6858 Tj
-[1 0 0 1 282.471 676.164] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -282.471 -676.164] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-284.878 676.164 Td
-/F130_0 9.9626 Tf
-(with) 17.7135 Tj
--242 TJm
-(action) 24.3486 Tj
--241 TJm
-(=) 5.61891 Tj
-[1 0 0 1 339.78 676.164] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -339.78 -676.164] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-339.78 676.164 Td
-/F134_0 9.9626 Tf
-(BZ_FINISH) 53.798 Tj
-[1 0 0 1 393.579 676.164] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -393.579 -676.164] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-393.579 676.164 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--242 TJm
-(cop) 14.386 Tj
-10 TJm
-(ying) 17.7135 Tj
--241 TJm
-(out) 12.7322 Tj
--242 TJm
-(the) 12.1743 Tj
--242 TJm
-(compres) 33.7533 Tj
-1 TJm
-(sed) 13.2801 Tj
--242 TJm
-(output,) 27.9551 Tj
-91.9253 664.209 Td
-(until) 18.2714 Tj
-[1 0 0 1 112.687 664.209] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -112.687 -664.209] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-112.687 664.209 Td
-/F134_0 9.9626 Tf
-(BZ_STREAM_END) 77.7083 Tj
-[1 0 0 1 190.396 664.209] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -190.396 -664.209] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-192.886 664.209 Td
-/F130_0 9.9626 Tf
-(is) 6.64505 Tj
--250 TJm
-(returned.) 35.686 Tj
-[1 0 0 1 237.708 664.209] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -165.708 -21.9178] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 7.3724 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -79.3724 -642.291] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-79.3724 642.291 Td
-/F130_0 9.9626 Tf
-(4.) 7.47195 Tj
-[1 0 0 1 86.8444 642.291] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 3.0884 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.9925 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -91.9253 -642.291] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-91.9253 642.291 Td
-/F130_0 9.9626 Tf
-(Close) 22.6948 Tj
--250 TJm
-(up) 9.9626 Tj
--250 TJm
-(and) 14.386 Tj
--250 TJm
-(go) 9.9626 Tj
--250 TJm
-(home.) 24.6275 Tj
--620 TJm
-(Call) 16.6077 Tj
-[1 0 0 1 208.796 642.291] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -208.796 -642.291] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-208.796 642.291 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompressEnd) 101.619 Tj
-[1 0 0 1 310.415 642.291] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -310.415 -642.291] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-310.415 642.291 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
-[1 0 0 1 312.906 642.291] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -240.906 -12.1195] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -630.172] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 620.374 Td
-/F130_0 9.9626 Tf
-(If) 6.63509 Tj
--269 TJm
-(the) 12.1743 Tj
--270 TJm
-(data) 16.5977 Tj
--269 TJm
-(you) 14.9439 Tj
--270 TJm
-(w) 7.193 Tj
-10 TJm
-(ant) 12.1743 Tj
--269 TJm
-(to) 7.7509 Tj
--270 TJm
-(compress) 37.6287 Tj
--269 TJm
-(\002ts) 12.1843 Tj
--270 TJm
-(into) 15.5018 Tj
--269 TJm
-(your) 18.2614 Tj
--270 TJm
-(input) 20.4831 Tj
--269 TJm
-(b) 4.9813 Tj
-20 TJm
-(uf) 8.29885 Tj
-25 TJm
-(fer) 11.0585 Tj
--270 TJm
-(all) 9.9626 Tj
--269 TJm
-(at) 7.193 Tj
--270 TJm
-(once,) 21.3 Tj
--274 TJm
-(you) 14.9439 Tj
--269 TJm
-(can) 13.8281 Tj
--270 TJm
-(skip) 16.6077 Tj
--269 TJm
-(the) 12.1743 Tj
--270 TJm
-(calls) 18.2614 Tj
--269 TJm
-(of) 8.29885 Tj
-[1 0 0 1 456.314 620.374] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -456.314 -620.374] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-456.314 620.374 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompress) 83.6858 Tj
-72 608.418 Td
-(\() 5.97756 Tj
--600 TJm
-(...,) 23.9102 Tj
--600 TJm
-(BZ_RUN) 35.8654 Tj
--600 TJm
-(\)) 5.97756 Tj
-[1 0 0 1 161.664 608.418] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -161.664 -608.418] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-164.154 608.418 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
--250 TJm
-(just) 14.396 Tj
--250 TJm
-(do) 9.9626 Tj
--250 TJm
-(the) 12.1743 Tj
-[1 0 0 1 225.036 608.418] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -225.036 -608.418] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-225.036 608.418 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompress) 83.6858 Tj
--600 TJm
-(\() 5.97756 Tj
--600 TJm
-(...,) 23.9102 Tj
--600 TJm
-(BZ_FINISH) 53.798 Tj
--600 TJm
-(\)) 5.97756 Tj
-[1 0 0 1 422.296 608.418] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -422.296 -608.418] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-424.786 608.418 Td
-/F130_0 9.9626 Tf
-(calls.) 20.7521 Tj
-[1 0 0 1 72 606.262] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -596.299] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 586.501 Td
-/F130_0 9.9626 Tf
-(All) 12.7322 Tj
--278 TJm
-(required) 33.1954 Tj
--277 TJm
-(memory) 33.2053 Tj
--278 TJm
-(is) 6.64505 Tj
--277 TJm
-(allocated) 35.965 Tj
--278 TJm
-(by) 9.9626 Tj
-[1 0 0 1 220.295 586.501] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -220.295 -586.501] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-220.295 586.501 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompressInit) 107.596 Tj
-[1 0 0 1 327.891 586.501] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -327.891 -586.501] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-327.891 586.501 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
--785 TJm
-(The) 15.4918 Tj
--278 TJm
-(compression) 50.3609 Tj
--277 TJm
-(library) 26.5603 Tj
--278 TJm
-(can) 13.8281 Tj
--277 TJm
-(accept) 25.4445 Tj
--278 TJm
-(an) 9.40469 Tj
-15 TJm
-(y) 4.9813 Tj
--277 TJm
-(data) 16.5977 Tj
--278 TJm
-(at) 7.193 Tj
--278 TJm
-(all) 9.9626 Tj
-72 574.545 Td
-(\(ob) 13.2801 Tj
-15 TJm
-(viously\).) 35.1481 Tj
--612 TJm
-(So) 10.5205 Tj
--238 TJm
-(you) 14.9439 Tj
--237 TJm
-(shouldn') 34.8691 Tj
-18 TJm
-(t) 2.7696 Tj
--238 TJm
-(get) 12.1743 Tj
--238 TJm
-(an) 9.40469 Tj
-15 TJm
-(y) 4.9813 Tj
--237 TJm
-(error) 19.3573 Tj
--238 TJm
-(return) 23.7907 Tj
--238 TJm
-(v) 4.9813 Tj
-25 TJm
-(alues) 20.4731 Tj
--238 TJm
-(from) 19.3673 Tj
--237 TJm
-(the) 12.1743 Tj
-[1 0 0 1 339.287 574.545] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -339.287 -574.545] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-339.287 574.545 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompress) 83.6858 Tj
-[1 0 0 1 422.973 574.545] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -422.973 -574.545] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-425.342 574.545 Td
-/F130_0 9.9626 Tf
-(calls.) 20.7521 Tj
--612 TJm
-(If) 6.63509 Tj
--238 TJm
-(you) 14.9439 Tj
--237 TJm
-(do,) 12.4533 Tj
--240 TJm
-(the) 12.1743 Tj
-15 TJm
-(y) 4.9813 Tj
--238 TJm
-(will) 15.5018 Tj
--238 TJm
-(be) 9.40469 Tj
-[1 0 0 1 72 562.59] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -562.59] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 562.59 Td
-/F134_0 9.9626 Tf
-(BZ_SEQUENCE_ERROR) 101.619 Tj
-[1 0 0 1 173.619 562.59] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -173.619 -562.59] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-173.619 562.59 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--250 TJm
-(and) 14.386 Tj
--250 TJm
-(indicate) 31.5416 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(b) 4.9813 Tj
-20 TJm
-(ug) 9.9626 Tj
--250 TJm
-(in) 7.7509 Tj
--250 TJm
-(your) 18.2614 Tj
--250 TJm
-(programming.) 56.727 Tj
-[1 0 0 1 72 560.433] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -550.471] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 540.673 Td
-/F130_0 9.9626 Tf
-(T) 6.08715 Tj
-35 TJm
-(ri) 6.08715 Tj
-25 TJm
-(vial) 14.9439 Tj
--250 TJm
-(other) 20.4731 Tj
--250 TJm
-(possible) 32.6574 Tj
--250 TJm
-(return) 23.7907 Tj
--250 TJm
-(v) 4.9813 Tj
-25 TJm
-(alues:) 23.2427 Tj
-[1 0 0 1 72 538.516] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -36.8617] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 35.8655 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 32.2789] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -529.151] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 529.151 Td
-/F134_0 9.9626 Tf
-(BZ_PARAM_ERROR) 83.6858 Tj
-98.4879 517.196 Td
-(if) 11.9551 Tj
--426 TJm
-(strm) 23.9102 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(NULL,) 29.8878 Tj
--426 TJm
-(or) 11.9551 Tj
--426 TJm
-(strm->s) 41.8429 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(NULL) 23.9102 Tj
-[1 0 0 1 72 501.654] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -491.691] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 471.033 Td
-/F122_0 17.2154 Tf
-(3.3.3.) 43.0729 Tj
-[1 0 0 1 119.858 471.033] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -119.858 -471.033] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-119.858 471.033 Td
-/F392_0 17.2154 Tf
-(BZ2_bzCompressEnd) 175.597 Tj
-[1 0 0 1 295.455 471.033] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -223.455 -2.3326] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -24.9066] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 23.9103 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 20.3237] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -459.335] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 459.335 Td
-/F134_0 9.9626 Tf
-(int) 17.9327 Tj
--426 TJm
-(BZ2_bzCompressEnd) 101.619 Tj
--426 TJm
-(\() 5.97756 Tj
--426 TJm
-(bz_stream) 53.798 Tj
-286.303 457.592 Td
-(*) 5.97756 Tj
-292.281 459.335 Td
-(strm) 23.9102 Tj
--426 TJm
-(\);) 11.9551 Tj
-[1 0 0 1 72 443.793] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5493] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -433.831] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 421.876 Td
-/F130_0 9.9626 Tf
-(Releases) 34.8591 Tj
--250 TJm
-(all) 9.9626 Tj
--250 TJm
-(memory) 33.2053 Tj
--250 TJm
-(associated) 40.9463 Tj
--250 TJm
-(with) 17.7135 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(compression) 50.3609 Tj
--250 TJm
-(stream.) 29.0509 Tj
-[1 0 0 1 72 419.719] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -409.756] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 399.958 Td
-/F130_0 9.9626 Tf
-(Possible) 33.2153 Tj
--250 TJm
-(return) 23.7907 Tj
--250 TJm
-(v) 4.9813 Tj
-25 TJm
-(alues:) 23.2427 Tj
-[1 0 0 1 72 399.858] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -36.8618] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 35.8655 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 32.2789] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -390.493] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 390.493 Td
-/F134_0 9.9626 Tf
-(BZ_PARAM_ERROR) 83.6858 Tj
--852 TJm
-(if) 11.9551 Tj
--426 TJm
-(strm) 23.9102 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(NULL) 23.9102 Tj
--426 TJm
-(or) 11.9551 Tj
--426 TJm
-(strm->s) 41.8429 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(NULL) 23.9102 Tj
-90 378.538 Td
-(BZ_OK) 29.8878 Tj
--4686 TJm
-(otherwise) 53.798 Tj
-[1 0 0 1 72 362.996] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -353.034] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 332.375 Td
-/F122_0 17.2154 Tf
-(3.3.4.) 43.0729 Tj
-[1 0 0 1 119.858 332.375] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -119.858 -332.375] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-119.858 332.375 Td
-/F392_0 17.2154 Tf
-(BZ2_bzDecompressInit) 206.585 Tj
-[1 0 0 1 326.443 332.375] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -254.443 -2.3327] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -24.9066] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 23.9103 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 20.3237] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3685] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -320.678] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 320.678 Td
-/F134_0 9.9626 Tf
-(int) 17.9327 Tj
--426 TJm
-(BZ2_bzDecompressInit) 119.551 Tj
--426 TJm
-(\() 5.97756 Tj
--426 TJm
-(bz_stream) 53.798 Tj
-304.236 318.934 Td
-(*) 5.97756 Tj
-310.214 320.678 Td
-(strm,) 29.8878 Tj
--426 TJm
-(int) 17.9327 Tj
--426 TJm
-(verbosity,) 59.7756 Tj
--426 TJm
-(int) 17.9327 Tj
--426 TJm
-(small) 29.8878 Tj
--426 TJm
-(\);) 11.9551 Tj
-[1 0 0 1 72 305.136] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -295.173] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 283.218 Td
-/F130_0 9.9626 Tf
-(Prepares) 34.3012 Tj
--351 TJm
-(for) 11.6164 Tj
--351 TJm
-(decompression.) 62.2563 Tj
--1228 TJm
-(As) 11.0684 Tj
--351 TJm
-(with) 17.7135 Tj
-[1 0 0 1 235.177 283.218] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -235.177 -283.218] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-235.177 283.218 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompressInit) 107.596 Tj
-[1 0 0 1 342.773 283.218] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -342.773 -283.218] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-342.773 283.218 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--377 TJm
-(a) 4.42339 Tj
-[1 0 0 1 356.937 283.218] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -356.937 -283.218] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-356.937 283.218 Td
-/F134_0 9.9626 Tf
-(bz_stream) 53.798 Tj
-[1 0 0 1 410.736 283.218] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -410.736 -283.218] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-414.235 283.218 Td
-/F130_0 9.9626 Tf
-(record) 25.4445 Tj
--351 TJm
-(should) 26.5703 Tj
--351 TJm
-(be) 9.40469 Tj
--352 TJm
-(allocated) 35.965 Tj
--351 TJm
-(and) 14.386 Tj
-72 271.263 Td
-(initialised) 39.3025 Tj
--306 TJm
-(before) 25.4445 Tj
--305 TJm
-(the) 12.1743 Tj
--306 TJm
-(call.) 16.8766 Tj
--953 TJm
-(Fields) 24.3586 Tj
-[1 0 0 1 211.833 271.263] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -211.833 -271.263] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-211.833 271.263 Td
-/F134_0 9.9626 Tf
-(bzalloc) 41.8429 Tj
-[1 0 0 1 253.676 271.263] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -253.676 -271.263] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-253.676 271.263 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 259.35 271.263] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -259.35 -271.263] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-259.35 271.263 Td
-/F134_0 9.9626 Tf
-(bzfree) 35.8654 Tj
-[1 0 0 1 295.215 271.263] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -295.215 -271.263] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-298.26 271.263 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 315.69 271.263] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -315.69 -271.263] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-315.69 271.263 Td
-/F134_0 9.9626 Tf
-(opaque) 35.8654 Tj
-[1 0 0 1 351.556 271.263] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -351.556 -271.263] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-354.6 271.263 Td
-/F130_0 9.9626 Tf
-(should) 26.5703 Tj
--306 TJm
-(be) 9.40469 Tj
--305 TJm
-(set) 11.0684 Tj
--306 TJm
-(if) 6.08715 Tj
--305 TJm
-(a) 4.42339 Tj
--306 TJm
-(custom) 28.782 Tj
--305 TJm
-(memory) 33.2053 Tj
--306 TJm
-(allocator) 34.8591 Tj
--306 TJm
-(is) 6.64505 Tj
-72 259.308 Td
-(required,) 35.686 Tj
--350 TJm
-(or) 8.29885 Tj
--331 TJm
-(made) 21.579 Tj
-[1 0 0 1 147.635 259.308] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -147.635 -259.308] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-147.635 259.308 Td
-/F134_0 9.9626 Tf
-(NULL) 23.9102 Tj
-[1 0 0 1 171.546 259.308] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -171.546 -259.308] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-174.835 259.308 Td
-/F130_0 9.9626 Tf
-(for) 11.6164 Tj
--330 TJm
-(the) 12.1743 Tj
--331 TJm
-(normal) 28.224 Tj
-[1 0 0 1 236.722 259.308] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -236.722 -259.308] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-236.722 259.308 Td
-/F134_0 9.9626 Tf
-(malloc) 35.8654 Tj
-[1 0 0 1 272.587 259.308] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -272.587 -259.308] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-275.878 259.308 Td
-/F130_0 9.9626 Tf
-(/) 2.7696 Tj
-[1 0 0 1 281.938 259.308] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -281.938 -259.308] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-281.938 259.308 Td
-/F134_0 9.9626 Tf
-(free) 23.9102 Tj
-[1 0 0 1 305.848 259.308] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -305.848 -259.308] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-309.139 259.308 Td
-/F130_0 9.9626 Tf
-(routines.) 34.5901 Tj
--1102 TJm
-(Upon) 22.1369 Tj
--330 TJm
-(return,) 26.2813 Tj
--350 TJm
-(the) 12.1743 Tj
--331 TJm
-(internal) 30.4357 Tj
--330 TJm
-(state) 18.2614 Tj
--330 TJm
-(will) 15.5018 Tj
--330 TJm
-(ha) 9.40469 Tj
-20 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--331 TJm
-(been) 18.8094 Tj
-72 247.353 Td
-(initialised,) 41.7931 Tj
--250 TJm
-(and) 14.386 Tj
-[1 0 0 1 133.16 247.353] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -133.16 -247.353] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-133.16 247.353 Td
-/F134_0 9.9626 Tf
-(total_in) 47.8205 Tj
-[1 0 0 1 180.98 247.353] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -180.98 -247.353] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-183.471 247.353 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 200.348 247.353] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -200.348 -247.353] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-200.348 247.353 Td
-/F134_0 9.9626 Tf
-(total_out) 53.798 Tj
-[1 0 0 1 254.146 247.353] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -254.146 -247.353] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-256.637 247.353 Td
-/F130_0 9.9626 Tf
-(will) 15.5018 Tj
--250 TJm
-(be) 9.40469 Tj
--250 TJm
-(zero.) 19.6363 Tj
-[1 0 0 1 72 245.913] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -235.951] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 225.435 Td
-/F130_0 9.9626 Tf
-(F) 5.53921 Tj
-15 TJm
-(or) 8.29885 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(meaning) 34.3112 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(parameter) 39.8305 Tj
-[1 0 0 1 192.756 225.435] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -192.756 -225.435] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-192.756 225.435 Td
-/F134_0 9.9626 Tf
-(verbosity) 53.798 Tj
-[1 0 0 1 246.554 225.435] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -246.554 -225.435] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-246.554 225.435 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--250 TJm
-(see) 12.7222 Tj
-[1 0 0 1 266.748 225.435] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -266.748 -225.435] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-266.748 225.435 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompressInit) 107.596 Tj
-[1 0 0 1 374.345 225.435] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -374.345 -225.435] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-374.345 225.435 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
-[1 0 0 1 72 223.278] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -213.315] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 203.517 Td
-/F130_0 9.9626 Tf
-(If) 6.63509 Tj
-[1 0 0 1 81.4975 203.517] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -81.4975 -203.517] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-81.4975 203.517 Td
-/F134_0 9.9626 Tf
-(small) 29.8878 Tj
-[1 0 0 1 111.385 203.517] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -111.385 -203.517] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-114.248 203.517 Td
-/F130_0 9.9626 Tf
-(is) 6.64505 Tj
--287 TJm
-(nonzero,) 34.5802 Tj
--297 TJm
-(the) 12.1743 Tj
--287 TJm
-(library) 26.5603 Tj
--288 TJm
-(will) 15.5018 Tj
--287 TJm
-(use) 13.2801 Tj
--287 TJm
-(an) 9.40469 Tj
--287 TJm
-(alternati) 32.6474 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--288 TJm
-(decompression) 59.7656 Tj
--287 TJm
-(algorithm) 38.7446 Tj
--287 TJm
-(which) 24.3486 Tj
--288 TJm
-(uses) 17.1556 Tj
--287 TJm
-(less) 14.9439 Tj
--287 TJm
-(memory) 33.2053 Tj
--287 TJm
-(b) 4.9813 Tj
-20 TJm
-(ut) 7.7509 Tj
--288 TJm
-(at) 7.193 Tj
--287 TJm
-(the) 12.1743 Tj
-72 191.562 Td
-(cost) 16.0497 Tj
--289 TJm
-(of) 8.29885 Tj
--290 TJm
-(decompressing) 59.7656 Tj
--289 TJm
-(more) 20.4731 Tj
--289 TJm
-(slo) 11.6264 Tj
-25 TJm
-(wly) 14.9439 Tj
--290 TJm
-(\(roughly) 34.3112 Tj
--289 TJm
-(speaking,) 37.9077 Tj
--299 TJm
-(half) 15.4918 Tj
--290 TJm
-(the) 12.1743 Tj
--289 TJm
-(speed,) 25.1755 Tj
--299 TJm
-(b) 4.9813 Tj
-20 TJm
-(ut) 7.7509 Tj
--289 TJm
-(the) 12.1743 Tj
--290 TJm
-(maximum) 40.4083 Tj
--289 TJm
-(memory) 33.2053 Tj
--289 TJm
-(requirement) 48.1393 Tj
--290 TJm
-(drops) 22.1369 Tj
-72 179.607 Td
-(to) 7.7509 Tj
--250 TJm
-(around) 27.6661 Tj
--250 TJm
-(2300k\).) 30.7147 Tj
--620 TJm
-(See) 14.386 Tj
-[1 0 0 1 166.166 179.607] cm
-/DeviceRGB {} cs
-[0 0 1] sc
-/DeviceRGB {} CS
-[0 0 1] SC
-[1 0 0 1 -166.166 -179.607] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-166.166 179.607 Td
-/F130_0 9.9626 Tf
-(Ho) 12.1743 Tj
-25 TJm
-(w) 7.193 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(use) 13.2801 Tj
--250 TJm
-(bzip2) 22.1369 Tj
-[1 0 0 1 235.924 179.607] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 1] sc
-/DeviceRGB {} CS
-[0 0 1] SC
-/DeviceRGB {} cs
-[0 0 1] sc
-/DeviceRGB {} CS
-[0 0 1] SC
-[1 0 0 1 -235.924 -179.607] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-238.415 179.607 Td
-/F130_0 9.9626 Tf
-([2]) 11.6164 Tj
-[1 0 0 1 250.031 179.607] cm
-/DeviceRGB {} cs
-[0 0 1] sc
-/DeviceRGB {} CS
-[0 0 1] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -250.031 -179.607] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-252.522 179.607 Td
-/F130_0 9.9626 Tf
-(for) 11.6164 Tj
--250 TJm
-(more) 20.4731 Tj
--250 TJm
-(information) 47.0434 Tj
--250 TJm
-(on) 9.9626 Tj
--250 TJm
-(memory) 33.2053 Tj
--250 TJm
-(management.) 53.3995 Tj
-[1 0 0 1 72 177.45] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -167.487] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 157.689 Td
-/F130_0 9.9626 Tf
-(Note) 19.3673 Tj
--289 TJm
-(that) 14.9439 Tj
--290 TJm
-(the) 12.1743 Tj
--289 TJm
-(amount) 29.8878 Tj
--289 TJm
-(of) 8.29885 Tj
--289 TJm
-(memory) 33.2053 Tj
--290 TJm
-(needed) 28.2141 Tj
--289 TJm
-(to) 7.7509 Tj
--289 TJm
-(decompress) 47.0334 Tj
--289 TJm
-(a) 4.42339 Tj
--290 TJm
-(stream) 26.5603 Tj
--289 TJm
-(cannot) 26.5603 Tj
--289 TJm
-(be) 9.40469 Tj
--289 TJm
-(determined) 44.8217 Tj
--290 TJm
-(until) 18.2714 Tj
--289 TJm
-(the) 12.1743 Tj
--289 TJm
-(stream') 29.8778 Tj
-55 TJm
-(s) 3.87545 Tj
--289 TJm
-(header) 26.5503 Tj
--290 TJm
-(has) 13.2801 Tj
-72 145.734 Td
-(been) 18.8094 Tj
--342 TJm
-(read,) 19.6363 Tj
--366 TJm
-(so) 8.85675 Tj
--342 TJm
-(e) 4.42339 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(en) 9.40469 Tj
--342 TJm
-(if) 6.08715 Tj
-[1 0 0 1 161.081 145.734] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -161.081 -145.734] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-161.081 145.734 Td
-/F134_0 9.9626 Tf
-(BZ2_bzDecompressInit) 119.551 Tj
-[1 0 0 1 280.633 145.734] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -280.633 -145.734] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-284.043 145.734 Td
-/F130_0 9.9626 Tf
-(succeeds,) 37.8977 Tj
--365 TJm
-(a) 4.42339 Tj
--343 TJm
-(subsequent) 44.2738 Tj
-[1 0 0 1 381.098 145.734] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -381.098 -145.734] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-381.098 145.734 Td
-/F134_0 9.9626 Tf
-(BZ2_bzDecompress) 95.641 Tj
-[1 0 0 1 476.739 145.734] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -476.739 -145.734] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-480.149 145.734 Td
-/F130_0 9.9626 Tf
-(could) 22.1369 Tj
--342 TJm
-(f) 3.31755 Tj
-10 TJm
-(ail) 9.9626 Tj
--343 TJm
-(with) 17.7135 Tj
-[1 0 0 1 72 133.779] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -133.779] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 133.779 Td
-/F134_0 9.9626 Tf
-(BZ_MEM_ERROR) 71.7307 Tj
-[1 0 0 1 143.731 133.779] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -143.731 -133.779] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-143.731 133.779 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
-[1 0 0 1 72 132.469] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -122.506] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 111.861 Td
-/F130_0 9.9626 Tf
-(Possible) 33.2153 Tj
--250 TJm
-(return) 23.7907 Tj
--250 TJm
-(v) 4.9813 Tj
-25 TJm
-(alues:) 23.2427 Tj
-[1 0 0 1 72 111.761] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -60.9095] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 374.394 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.8541] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 40.5726 -6.7545] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -493.841 -50.9514] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-534.414 50.9514 Td
-/F130_0 9.9626 Tf
-(16) 9.9626 Tj
-[1 0 0 1 453.269 50.8518] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 93.5985 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.2765 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-Q
-showpage
-%%PageTrailer
-pdfEndPage
-%%Page: 20 20
-%%BeginPageSetup
-%%PageOrientation: Portrait
-pdfStartPage
-0 0 612 792 re W
-%%EndPageSetup
-[] 0 d
-1 i
-0 j
-0 J
-10 M
-1 w
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-false op
-false OP
-0 0 612 792 re
-W
-q
-[1 0 0 1 72 741.554] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 14.4459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 187.197 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 -8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 76.4979 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -342.569 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-419.067 749.245 Td
-/F130_0 9.9626 Tf
-(Programming) 54.7943 Tj
--250 TJm
-(with) 17.7135 Tj
-[1 0 0 1 496.556 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -496.556 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-496.556 749.245 Td
-/F134_0 9.9626 Tf
-(libbzip2) 47.8205 Tj
-[1 0 0 1 544.376 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -278.305 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 280.796 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.974 -5.0363] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -0.4981] cm
-q
-[] 0 d
-0 J
-0.4981 w
-0 0.2491 m
-475.465 0.2491 l
-S
-Q
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 479.251 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -117.195] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 95.6413 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 92.0547] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -711.631] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 711.631 Td
-/F134_0 9.9626 Tf
-(BZ_CONFIG_ERROR) 89.6634 Tj
-98.4879 699.676 Td
-(if) 11.9551 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(library) 41.8429 Tj
--426 TJm
-(has) 17.9327 Tj
--426 TJm
-(been) 23.9102 Tj
--426 TJm
-(mis-compiled) 71.7307 Tj
-90 687.721 Td
-(BZ_PARAM_ERROR) 83.6858 Tj
-98.4879 675.766 Td
-(if) 11.9551 Tj
--426 TJm
-(\() 5.97756 Tj
--426 TJm
-(small) 29.8878 Tj
--426 TJm
-(!=) 11.9551 Tj
--426 TJm
-(0) 5.97756 Tj
--426 TJm
-(&&) 11.9551 Tj
--426 TJm
-(small) 29.8878 Tj
--426 TJm
-(!=) 11.9551 Tj
--426 TJm
-(1) 5.97756 Tj
--426 TJm
-(\)) 5.97756 Tj
-98.4879 663.811 Td
-(or) 11.9551 Tj
--426 TJm
-(\(verbosity) 59.7756 Tj
--426 TJm
-(<;) 11.9551 Tj
--426 TJm
-(0) 5.97756 Tj
--426 TJm
-(||) 11.9551 Tj
--426 TJm
-(verbosity) 53.798 Tj
--426 TJm
-(>) 5.97756 Tj
--426 TJm
-(4\)) 11.9551 Tj
-90 651.856 Td
-(BZ_MEM_ERROR) 71.7307 Tj
-98.4879 639.9 Td
-(if) 11.9551 Tj
--426 TJm
-(insufficient) 71.7307 Tj
--426 TJm
-(memory) 35.8654 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(available) 53.798 Tj
-[1 0 0 1 72 624.359] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5865] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -614.396] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 602.441 Td
-/F130_0 9.9626 Tf
-(Allo) 17.7135 Tj
-25 TJm
-(w) 7.193 Tj
-10 TJm
-(able) 16.5977 Tj
--250 TJm
-(ne) 9.40469 Tj
-15 TJm
-(xt) 7.7509 Tj
--250 TJm
-(actions:) 30.9936 Tj
-[1 0 0 1 72 602.341] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -48.8169] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 47.8207 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 44.2341] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -592.976] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 592.976 Td
-/F134_0 9.9626 Tf
-(BZ2_bzDecompress) 95.641 Tj
-98.4879 581.021 Td
-(if) 11.9551 Tj
--426 TJm
-(BZ_OK) 29.8878 Tj
--426 TJm
-(was) 17.9327 Tj
--426 TJm
-(returned) 47.8205 Tj
-98.4879 569.066 Td
-(no) 11.9551 Tj
--426 TJm
-(specific) 47.8205 Tj
--426 TJm
-(action) 35.8654 Tj
--426 TJm
-(required) 47.8205 Tj
--426 TJm
-(in) 11.9551 Tj
--426 TJm
-(case) 23.9102 Tj
--426 TJm
-(of) 11.9551 Tj
--426 TJm
-(error) 29.8878 Tj
-[1 0 0 1 72 553.524] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -543.562] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 522.903 Td
-/F122_0 17.2154 Tf
-(3.3.5.) 43.0729 Tj
-[1 0 0 1 119.858 522.903] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -119.858 -522.903] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-119.858 522.903 Td
-/F392_0 17.2154 Tf
-(BZ2_bzDecompress) 165.268 Tj
-[1 0 0 1 285.126 522.903] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -213.126 -2.3327] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -24.9066] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 23.9103 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 20.3237] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3685] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -511.206] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 511.206 Td
-/F134_0 9.9626 Tf
-(int) 17.9327 Tj
--426 TJm
-(BZ2_bzDecompress) 95.641 Tj
--426 TJm
-(\() 5.97756 Tj
--426 TJm
-(bz_stream) 53.798 Tj
-280.326 509.462 Td
-(*) 5.97756 Tj
-286.303 511.206 Td
-(strm) 23.9102 Tj
--426 TJm
-(\);) 11.9551 Tj
-[1 0 0 1 72 495.664] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -485.701] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 473.746 Td
-/F130_0 9.9626 Tf
-(Pro) 13.8381 Tj
-15 TJm
-(vides) 21.031 Tj
--301 TJm
-(more) 20.4731 Tj
--302 TJm
-(input) 20.4831 Tj
--301 TJm
-(and/out) 29.8878 Tj
--302 TJm
-(output) 25.4644 Tj
--301 TJm
-(b) 4.9813 Tj
-20 TJm
-(uf) 8.29885 Tj
-25 TJm
-(fer) 11.0585 Tj
--301 TJm
-(space) 22.1269 Tj
--302 TJm
-(for) 11.6164 Tj
--301 TJm
-(the) 12.1743 Tj
--302 TJm
-(library) 26.5603 Tj
-65 TJm
-(.) 2.49065 Tj
--928 TJm
-(The) 15.4918 Tj
--301 TJm
-(caller) 22.1269 Tj
--302 TJm
-(maintains) 38.7446 Tj
--301 TJm
-(input) 20.4831 Tj
--302 TJm
-(and) 14.386 Tj
--301 TJm
-(output) 25.4644 Tj
--301 TJm
-(b) 4.9813 Tj
-20 TJm
-(uf) 8.29885 Tj
-25 TJm
-(fers,) 17.4246 Tj
--315 TJm
-(and) 14.386 Tj
-72 461.791 Td
-(uses) 17.1556 Tj
-[1 0 0 1 91.6461 461.791] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -91.6461 -461.791] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-91.6461 461.791 Td
-/F134_0 9.9626 Tf
-(BZ2_bzDecompress) 95.641 Tj
-[1 0 0 1 187.287 461.791] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -187.287 -461.791] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-189.778 461.791 Td
-/F130_0 9.9626 Tf
-(to) 7.7509 Tj
--250 TJm
-(transfer) 30.4258 Tj
--250 TJm
-(data) 16.5977 Tj
--250 TJm
-(between) 33.1954 Tj
--250 TJm
-(them.) 22.4159 Tj
-[1 0 0 1 72 460.257] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -450.294] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 439.873 Td
-/F130_0 9.9626 Tf
-(Before) 27.1082 Tj
--498 TJm
-(each) 18.2515 Tj
--499 TJm
-(call) 14.386 Tj
--498 TJm
-(to) 7.7509 Tj
-[1 0 0 1 159.356 439.873] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -159.356 -439.873] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-159.356 439.873 Td
-/F134_0 9.9626 Tf
-(BZ2_bzDecompress) 95.641 Tj
-[1 0 0 1 254.997 439.873] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -254.997 -439.873] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-254.997 439.873 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 263.071 439.873] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -263.071 -439.873] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-263.071 439.873 Td
-/F134_0 9.9626 Tf
-(next_in) 41.8429 Tj
-[1 0 0 1 304.914 439.873] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -304.914 -439.873] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-309.879 439.873 Td
-/F130_0 9.9626 Tf
-(should) 26.5703 Tj
--498 TJm
-(point) 20.4831 Tj
--499 TJm
-(at) 7.193 Tj
--498 TJm
-(the) 12.1743 Tj
--498 TJm
-(compressed) 47.0334 Tj
--499 TJm
-(data,) 19.0883 Tj
--560 TJm
-(and) 14.386 Tj
-[1 0 0 1 492.179 439.873] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -492.179 -439.873] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-492.179 439.873 Td
-/F134_0 9.9626 Tf
-(avail_in) 47.8205 Tj
-[1 0 0 1 540 439.873] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -540 -439.873] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 427.918 Td
-/F130_0 9.9626 Tf
-(should) 26.5703 Tj
--308 TJm
-(indicate) 31.5416 Tj
--308 TJm
-(ho) 9.9626 Tj
-25 TJm
-(w) 7.193 Tj
--309 TJm
-(man) 17.1556 Tj
-15 TJm
-(y) 4.9813 Tj
--308 TJm
-(bytes) 21.031 Tj
--308 TJm
-(the) 12.1743 Tj
--308 TJm
-(library) 26.5603 Tj
--308 TJm
-(may) 17.1556 Tj
--309 TJm
-(read.) 19.6363 Tj
-[1 0 0 1 294.955 427.918] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -294.955 -427.918] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-294.955 427.918 Td
-/F134_0 9.9626 Tf
-(BZ2_bzDecompress) 95.641 Tj
-[1 0 0 1 390.597 427.918] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -390.597 -427.918] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-393.667 427.918 Td
-/F130_0 9.9626 Tf
-(updates) 30.4357 Tj
-[1 0 0 1 427.173 427.918] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -427.173 -427.918] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-427.173 427.918 Td
-/F134_0 9.9626 Tf
-(next_in) 41.8429 Tj
-[1 0 0 1 469.016 427.918] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -469.016 -427.918] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-469.016 427.918 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 474.723 427.918] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -474.723 -427.918] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-474.723 427.918 Td
-/F134_0 9.9626 Tf
-(avail_in) 47.8205 Tj
-[1 0 0 1 522.543 427.918] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -522.543 -427.918] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-525.614 427.918 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 72 415.963] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -415.963] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 415.963 Td
-/F134_0 9.9626 Tf
-(total_in) 47.8205 Tj
-[1 0 0 1 119.821 415.963] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -119.821 -415.963] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-122.311 415.963 Td
-/F130_0 9.9626 Tf
-(to) 7.7509 Tj
--250 TJm
-(re\003ect) 24.8965 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(number) 30.4357 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(bytes) 21.031 Tj
--250 TJm
-(it) 5.53921 Tj
--250 TJm
-(has) 13.2801 Tj
--250 TJm
-(read.) 19.6363 Tj
-[1 0 0 1 72 413.806] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -403.843] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 394.045 Td
-/F130_0 9.9626 Tf
-(Similarly) 37.0908 Tj
-65 TJm
-(,) 2.49065 Tj
-[1 0 0 1 113.799 394.045] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -113.799 -394.045] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-113.799 394.045 Td
-/F134_0 9.9626 Tf
-(next_out) 47.8205 Tj
-[1 0 0 1 161.62 394.045] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -161.62 -394.045] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-164.41 394.045 Td
-/F130_0 9.9626 Tf
-(should) 26.5703 Tj
--280 TJm
-(point) 20.4831 Tj
--280 TJm
-(to) 7.7509 Tj
--280 TJm
-(a) 4.42339 Tj
--280 TJm
-(b) 4.9813 Tj
-20 TJm
-(uf) 8.29885 Tj
-25 TJm
-(fer) 11.0585 Tj
--280 TJm
-(in) 7.7509 Tj
--281 TJm
-(which) 24.3486 Tj
--280 TJm
-(the) 12.1743 Tj
--280 TJm
-(uncompressed) 56.996 Tj
--280 TJm
-(output) 25.4644 Tj
--280 TJm
-(is) 6.64505 Tj
--280 TJm
-(to) 7.7509 Tj
--280 TJm
-(be) 9.40469 Tj
--280 TJm
-(placed,) 28.493 Tj
--288 TJm
-(with) 17.7135 Tj
-[1 0 0 1 486.202 394.045] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -486.202 -394.045] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-486.202 394.045 Td
-/F134_0 9.9626 Tf
-(avail_out) 53.798 Tj
-[1 0 0 1 540 394.045] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -540 -394.045] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 382.09 Td
-/F130_0 9.9626 Tf
-(indicating) 39.8504 Tj
--525 TJm
-(ho) 9.9626 Tj
-25 TJm
-(w) 7.193 Tj
--524 TJm
-(much) 22.1369 Tj
--525 TJm
-(output) 25.4644 Tj
--524 TJm
-(space) 22.1269 Tj
--525 TJm
-(is) 6.64505 Tj
--525 TJm
-(a) 4.42339 Tj
-20 TJm
-(v) 4.9813 Tj
-25 TJm
-(ailable.) 29.0509 Tj
-[1 0 0 1 285.792 382.09] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -285.792 -382.09] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-285.792 382.09 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompress) 83.6858 Tj
-[1 0 0 1 369.478 382.09] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -369.478 -382.09] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-374.705 382.09 Td
-/F130_0 9.9626 Tf
-(updates) 30.4357 Tj
-[1 0 0 1 410.367 382.09] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -410.367 -382.09] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-410.367 382.09 Td
-/F134_0 9.9626 Tf
-(next_out) 47.8205 Tj
-[1 0 0 1 458.188 382.09] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -458.188 -382.09] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-458.188 382.09 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 466.589 382.09] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -466.589 -382.09] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-466.589 382.09 Td
-/F134_0 9.9626 Tf
-(avail_out) 53.798 Tj
-[1 0 0 1 520.387 382.09] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -520.387 -382.09] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-525.614 382.09 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 72 370.135] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -370.135] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 370.135 Td
-/F134_0 9.9626 Tf
-(total_out) 53.798 Tj
-[1 0 0 1 125.798 370.135] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -125.798 -370.135] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-128.289 370.135 Td
-/F130_0 9.9626 Tf
-(to) 7.7509 Tj
--250 TJm
-(re\003ect) 24.8965 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(number) 30.4357 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(bytes) 21.031 Tj
--250 TJm
-(output.) 27.9551 Tj
-[1 0 0 1 72 367.978] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -358.015] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 348.217 Td
-/F130_0 9.9626 Tf
-(Y) 7.193 Tj
-110 TJm
-(ou) 9.9626 Tj
--320 TJm
-(may) 17.1556 Tj
--321 TJm
-(pro) 13.2801 Tj
-15 TJm
-(vide) 17.1556 Tj
--320 TJm
-(and) 14.386 Tj
--321 TJm
-(remo) 20.4731 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--320 TJm
-(as) 8.29885 Tj
--321 TJm
-(little) 18.2714 Tj
--320 TJm
-(or) 8.29885 Tj
--320 TJm
-(as) 8.29885 Tj
--321 TJm
-(much) 22.1369 Tj
--320 TJm
-(data) 16.5977 Tj
--321 TJm
-(as) 8.29885 Tj
--320 TJm
-(you) 14.9439 Tj
--321 TJm
-(lik) 10.5205 Tj
-10 TJm
-(e) 4.42339 Tj
--320 TJm
-(on) 9.9626 Tj
--320 TJm
-(each) 18.2515 Tj
--321 TJm
-(call) 14.386 Tj
--320 TJm
-(of) 8.29885 Tj
-[1 0 0 1 407.816 348.217] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -407.816 -348.217] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-407.816 348.217 Td
-/F134_0 9.9626 Tf
-(BZ2_bzDecompress) 95.641 Tj
-[1 0 0 1 503.457 348.217] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -503.457 -348.217] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-503.457 348.217 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
--1043 TJm
-(In) 8.29885 Tj
--320 TJm
-(the) 12.1743 Tj
-72 336.262 Td
-(limit,) 21.32 Tj
--295 TJm
-(it) 5.53921 Tj
--286 TJm
-(is) 6.64505 Tj
--287 TJm
-(acceptable) 42.0422 Tj
--286 TJm
-(to) 7.7509 Tj
--286 TJm
-(supply) 26.5703 Tj
--286 TJm
-(and) 14.386 Tj
--287 TJm
-(remo) 20.4731 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--286 TJm
-(data) 16.5977 Tj
--286 TJm
-(one) 14.386 Tj
--286 TJm
-(byte) 17.1556 Tj
--287 TJm
-(at) 7.193 Tj
--286 TJm
-(a) 4.42339 Tj
--286 TJm
-(time,) 20.2042 Tj
--295 TJm
-(although) 34.8691 Tj
--286 TJm
-(this) 14.396 Tj
--287 TJm
-(w) 7.193 Tj
-10 TJm
-(ould) 17.7135 Tj
--286 TJm
-(be) 9.40469 Tj
--286 TJm
-(terribly) 29.3299 Tj
--286 TJm
-(inef) 15.4918 Tj
-25 TJm
-(\002cient.) 27.3972 Tj
--838 TJm
-(Y) 7.193 Tj
-110 TJm
-(ou) 9.9626 Tj
-72 324.306 Td
-(should) 26.5703 Tj
--250 TJm
-(al) 7.193 Tj
-10 TJm
-(w) 7.193 Tj
-10 TJm
-(ays) 13.2801 Tj
--250 TJm
-(ensure) 26.0024 Tj
--250 TJm
-(that) 14.9439 Tj
--250 TJm
-(at) 7.193 Tj
--250 TJm
-(least) 18.2614 Tj
--250 TJm
-(one) 14.386 Tj
--250 TJm
-(byte) 17.1556 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(output) 25.4644 Tj
--250 TJm
-(space) 22.1269 Tj
--250 TJm
-(is) 6.64505 Tj
--250 TJm
-(a) 4.42339 Tj
-20 TJm
-(v) 4.9813 Tj
-25 TJm
-(ailable) 26.5603 Tj
--250 TJm
-(at) 7.193 Tj
--250 TJm
-(each) 18.2515 Tj
--250 TJm
-(call.) 16.8766 Tj
-[1 0 0 1 72 322.15] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -312.187] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 302.389 Td
-/F130_0 9.9626 Tf
-(Use) 15.4918 Tj
--250 TJm
-(of) 8.29885 Tj
-[1 0 0 1 100.772 302.389] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -100.772 -302.389] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-100.772 302.389 Td
-/F134_0 9.9626 Tf
-(BZ2_bzDecompress) 95.641 Tj
-[1 0 0 1 196.413 302.389] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -196.413 -302.389] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-198.904 302.389 Td
-/F130_0 9.9626 Tf
-(is) 6.64505 Tj
--250 TJm
-(simpler) 29.8878 Tj
--250 TJm
-(than) 17.1556 Tj
-[1 0 0 1 260.064 302.389] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -260.064 -302.389] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-260.064 302.389 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompress) 83.6858 Tj
-[1 0 0 1 343.75 302.389] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -343.75 -302.389] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-343.75 302.389 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
-[1 0 0 1 72 300.232] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -290.269] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 280.471 Td
-/F130_0 9.9626 Tf
-(Y) 7.193 Tj
-110 TJm
-(ou) 9.9626 Tj
--346 TJm
-(should) 26.5703 Tj
--347 TJm
-(pro) 13.2801 Tj
-15 TJm
-(vide) 17.1556 Tj
--346 TJm
-(input) 20.4831 Tj
--346 TJm
-(and) 14.386 Tj
--346 TJm
-(remo) 20.4731 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--347 TJm
-(output) 25.4644 Tj
--346 TJm
-(as) 8.29885 Tj
--346 TJm
-(described) 38.1767 Tj
--346 TJm
-(abo) 14.386 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(e,) 6.91404 Tj
--371 TJm
-(and) 14.386 Tj
--346 TJm
-(repeatedly) 41.4942 Tj
--346 TJm
-(call) 14.386 Tj
-[1 0 0 1 422.638 280.471] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -422.638 -280.471] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-422.638 280.471 Td
-/F134_0 9.9626 Tf
-(BZ2_bzDecompress) 95.641 Tj
-[1 0 0 1 518.279 280.471] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -518.279 -280.471] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-521.729 280.471 Td
-/F130_0 9.9626 Tf
-(until) 18.2714 Tj
-[1 0 0 1 72 268.516] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -268.516] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 268.516 Td
-/F134_0 9.9626 Tf
-(BZ_STREAM_END) 77.7083 Tj
-[1 0 0 1 149.709 268.516] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -149.709 -268.516] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-152.314 268.516 Td
-/F130_0 9.9626 Tf
-(is) 6.64505 Tj
--262 TJm
-(returned.) 35.686 Tj
--344 TJm
-(Appearance) 47.5714 Tj
--262 TJm
-(of) 8.29885 Tj
-[1 0 0 1 261.767 268.516] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -261.767 -268.516] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-261.767 268.516 Td
-/F134_0 9.9626 Tf
-(BZ_STREAM_END) 77.7083 Tj
-[1 0 0 1 339.475 268.516] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -339.475 -268.516] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-342.081 268.516 Td
-/F130_0 9.9626 Tf
-(denotes) 30.4357 Tj
--262 TJm
-(that) 14.9439 Tj
-[1 0 0 1 392.672 268.516] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -392.672 -268.516] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-392.672 268.516 Td
-/F134_0 9.9626 Tf
-(BZ2_bzDecompress) 95.641 Tj
-[1 0 0 1 488.313 268.516] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -488.313 -268.516] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-490.919 268.516 Td
-/F130_0 9.9626 Tf
-(has) 13.2801 Tj
--262 TJm
-(detected) 33.1954 Tj
-72 256.561 Td
-(the) 12.1743 Tj
--212 TJm
-(logical) 27.1182 Tj
--212 TJm
-(end) 14.386 Tj
--211 TJm
-(of) 8.29885 Tj
--212 TJm
-(the) 12.1743 Tj
--212 TJm
-(compressed) 47.0334 Tj
--212 TJm
-(stream.) 29.0509 Tj
-[1 0 0 1 237.858 256.561] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -237.858 -256.561] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-237.858 256.561 Td
-/F134_0 9.9626 Tf
-(BZ2_bzDecompress) 95.641 Tj
-[1 0 0 1 333.499 256.561] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -333.499 -256.561] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-335.609 256.561 Td
-/F130_0 9.9626 Tf
-(will) 15.5018 Tj
--212 TJm
-(not) 12.7322 Tj
--212 TJm
-(produce) 32.0895 Tj
-[1 0 0 1 402.263 256.561] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -402.263 -256.561] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-402.263 256.561 Td
-/F134_0 9.9626 Tf
-(BZ_STREAM_END) 77.7083 Tj
-[1 0 0 1 479.972 256.561] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -479.972 -256.561] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-482.082 256.561 Td
-/F130_0 9.9626 Tf
-(until) 18.2714 Tj
--212 TJm
-(all) 9.9626 Tj
--212 TJm
-(output) 25.4644 Tj
-72 244.605 Td
-(data) 16.5977 Tj
--256 TJm
-(has) 13.2801 Tj
--256 TJm
-(been) 18.8094 Tj
--255 TJm
-(placed) 26.0024 Tj
--256 TJm
-(into) 15.5018 Tj
--256 TJm
-(the) 12.1743 Tj
--256 TJm
-(output) 25.4644 Tj
--256 TJm
-(b) 4.9813 Tj
-20 TJm
-(uf) 8.29885 Tj
-25 TJm
-(fer) 11.0585 Tj
-40 TJm
-(,) 2.49065 Tj
--257 TJm
-(so) 8.85675 Tj
--256 TJm
-(once) 18.8094 Tj
-[1 0 0 1 278.978 244.605] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -278.978 -244.605] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-278.978 244.605 Td
-/F134_0 9.9626 Tf
-(BZ_STREAM_END) 77.7083 Tj
-[1 0 0 1 356.687 244.605] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -356.687 -244.605] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-359.236 244.605 Td
-/F130_0 9.9626 Tf
-(appears,) 32.9164 Tj
--257 TJm
-(you) 14.9439 Tj
--256 TJm
-(are) 12.1643 Tj
--256 TJm
-(guaranteed) 43.7059 Tj
--256 TJm
-(to) 7.7509 Tj
--256 TJm
-(ha) 9.40469 Tj
-20 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--255 TJm
-(a) 4.42339 Tj
-20 TJm
-(v) 4.9813 Tj
-25 TJm
-(ailable) 26.5603 Tj
-72 232.65 Td
-(all) 9.9626 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(decompressed) 56.4381 Tj
--250 TJm
-(output,) 27.9551 Tj
--250 TJm
-(and) 14.386 Tj
-[1 0 0 1 205.369 232.65] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -205.369 -232.65] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-205.369 232.65 Td
-/F134_0 9.9626 Tf
-(BZ2_bzDecompressEnd) 113.574 Tj
-[1 0 0 1 318.943 232.65] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -318.943 -232.65] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-321.433 232.65 Td
-/F130_0 9.9626 Tf
-(can) 13.8281 Tj
--250 TJm
-(safely) 23.7907 Tj
--250 TJm
-(be) 9.40469 Tj
--250 TJm
-(called.) 26.2813 Tj
-[1 0 0 1 72 230.493] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -220.531] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 210.732 Td
-/F130_0 9.9626 Tf
-(If) 6.63509 Tj
--250 TJm
-(case) 17.1456 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(an) 9.40469 Tj
--250 TJm
-(error) 19.3573 Tj
--250 TJm
-(return) 23.7907 Tj
--250 TJm
-(v) 4.9813 Tj
-25 TJm
-(alue,) 19.0883 Tj
--250 TJm
-(you) 14.9439 Tj
--250 TJm
-(should) 26.5703 Tj
--250 TJm
-(call) 14.386 Tj
-[1 0 0 1 261.259 210.732] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -261.259 -210.732] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-261.259 210.732 Td
-/F134_0 9.9626 Tf
-(BZ2_bzDecompressEnd) 113.574 Tj
-[1 0 0 1 374.833 210.732] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -374.833 -210.732] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-377.323 210.732 Td
-/F130_0 9.9626 Tf
-(to) 7.7509 Tj
--250 TJm
-(clean) 21.0211 Tj
--250 TJm
-(up) 9.9626 Tj
--250 TJm
-(and) 14.386 Tj
--250 TJm
-(release) 27.6562 Tj
--250 TJm
-(memory) 33.2053 Tj
-65 TJm
-(.) 2.49065 Tj
-[1 0 0 1 72 208.576] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -198.613] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 188.815 Td
-/F130_0 9.9626 Tf
-(Possible) 33.2153 Tj
--250 TJm
-(return) 23.7907 Tj
--250 TJm
-(v) 4.9813 Tj
-25 TJm
-(alues:) 23.2427 Tj
-[1 0 0 1 72 188.715] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -137.863] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 374.394 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.8541] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 40.5726 -6.7545] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -493.841 -50.9514] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-534.414 50.9514 Td
-/F130_0 9.9626 Tf
-(17) 9.9626 Tj
-[1 0 0 1 453.269 50.8518] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 93.5985 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.2765 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-Q
-showpage
-%%PageTrailer
-pdfEndPage
-%%Page: 21 21
-%%BeginPageSetup
-%%PageOrientation: Portrait
-pdfStartPage
-0 0 612 792 re W
-%%EndPageSetup
-[] 0 d
-1 i
-0 j
-0 J
-10 M
-1 w
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-false op
-false OP
-0 0 612 792 re
-W
-q
-[1 0 0 1 72 741.554] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 14.4459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 187.197 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 -8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 76.4979 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -342.569 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-419.067 749.245 Td
-/F130_0 9.9626 Tf
-(Programming) 54.7943 Tj
--250 TJm
-(with) 17.7135 Tj
-[1 0 0 1 496.556 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -496.556 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-496.556 749.245 Td
-/F134_0 9.9626 Tf
-(libbzip2) 47.8205 Tj
-[1 0 0 1 544.376 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -278.305 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 280.796 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.974 -5.0363] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -0.4981] cm
-q
-[] 0 d
-0 J
-0.4981 w
-0 0.2491 m
-475.465 0.2491 l
-S
-Q
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 479.251 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -200.882] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 179.328 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 175.741] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -711.631] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 711.631 Td
-/F134_0 9.9626 Tf
-(BZ_PARAM_ERROR) 83.6858 Tj
-98.4879 699.676 Td
-(if) 11.9551 Tj
--426 TJm
-(strm) 23.9102 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(NULL) 23.9102 Tj
--426 TJm
-(or) 11.9551 Tj
--426 TJm
-(strm->s) 41.8429 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(NULL) 23.9102 Tj
-98.4879 687.721 Td
-(or) 11.9551 Tj
--426 TJm
-(strm->avail_out) 89.6634 Tj
--426 TJm
-(<) 5.97756 Tj
--426 TJm
-(1) 5.97756 Tj
-90 675.766 Td
-(BZ_DATA_ERROR) 77.7083 Tj
-98.4879 663.811 Td
-(if) 11.9551 Tj
--426 TJm
-(a) 5.97756 Tj
--426 TJm
-(data) 23.9102 Tj
--426 TJm
-(integrity) 53.798 Tj
--426 TJm
-(error) 29.8878 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(detected) 47.8205 Tj
--426 TJm
-(in) 11.9551 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(compressed) 59.7756 Tj
--426 TJm
-(stream) 35.8654 Tj
-90 651.856 Td
-(BZ_DATA_ERROR_MAGIC) 113.574 Tj
-98.4879 639.9 Td
-(if) 11.9551 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(compressed) 59.7756 Tj
--426 TJm
-(stream) 35.8654 Tj
--426 TJm
-(doesn't) 41.8429 Tj
--426 TJm
-(begin) 29.8878 Tj
--426 TJm
-(with) 23.9102 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(right) 29.8878 Tj
--426 TJm
-(magic) 29.8878 Tj
--426 TJm
-(bytes) 29.8878 Tj
-90 627.945 Td
-(BZ_MEM_ERROR) 71.7307 Tj
-98.4879 615.99 Td
-(if) 11.9551 Tj
--426 TJm
-(there) 29.8878 Tj
--426 TJm
-(wasn't) 35.8654 Tj
--426 TJm
-(enough) 35.8654 Tj
--426 TJm
-(memory) 35.8654 Tj
--426 TJm
-(available) 53.798 Tj
-90 604.035 Td
-(BZ_STREAM_END) 77.7083 Tj
-98.4879 592.08 Td
-(if) 11.9551 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(logical) 41.8429 Tj
--426 TJm
-(end) 17.9327 Tj
--426 TJm
-(of) 11.9551 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(data) 23.9102 Tj
--426 TJm
-(stream) 35.8654 Tj
--426 TJm
-(was) 17.9327 Tj
--426 TJm
-(detected) 47.8205 Tj
--426 TJm
-(and) 17.9327 Tj
--426 TJm
-(all) 17.9327 Tj
-98.4879 580.125 Td
-(output) 35.8654 Tj
--426 TJm
-(in) 11.9551 Tj
--426 TJm
-(has) 17.9327 Tj
--426 TJm
-(been) 23.9102 Tj
--426 TJm
-(consumed,) 53.798 Tj
--426 TJm
-(eg) 11.9551 Tj
--426 TJm
-(s-->avail_out) 77.7083 Tj
--426 TJm
-(>) 5.97756 Tj
--426 TJm
-(0) 5.97756 Tj
-90 568.169 Td
-(BZ_OK) 29.8878 Tj
-98.4879 556.214 Td
-(otherwise) 53.798 Tj
-[1 0 0 1 72 540.673] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -530.71] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 518.755 Td
-/F130_0 9.9626 Tf
-(Allo) 17.7135 Tj
-25 TJm
-(w) 7.193 Tj
-10 TJm
-(able) 16.5977 Tj
--250 TJm
-(ne) 9.40469 Tj
-15 TJm
-(xt) 7.7509 Tj
--250 TJm
-(actions:) 30.9936 Tj
-[1 0 0 1 72 518.655] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -60.7721] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 59.7758 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 56.1892] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -509.29] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 509.29 Td
-/F134_0 9.9626 Tf
-(BZ2_bzDecompress) 95.641 Tj
-98.4879 497.335 Td
-(if) 11.9551 Tj
--426 TJm
-(BZ_OK) 29.8878 Tj
--426 TJm
-(was) 17.9327 Tj
--426 TJm
-(returned) 47.8205 Tj
-90 485.38 Td
-(BZ2_bzDecompressEnd) 113.574 Tj
-98.4879 473.425 Td
-(otherwise) 53.798 Tj
-[1 0 0 1 72 457.883] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -447.92] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 427.262 Td
-/F122_0 17.2154 Tf
-(3.3.6.) 43.0729 Tj
-[1 0 0 1 119.858 427.262] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -119.858 -427.262] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-119.858 427.262 Td
-/F392_0 17.2154 Tf
-(BZ2_bzDecompressEnd) 196.256 Tj
-[1 0 0 1 316.114 427.262] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -244.114 -2.3326] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -24.9066] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 23.9103 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 20.3237] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -415.564] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 415.564 Td
-/F134_0 9.9626 Tf
-(int) 17.9327 Tj
--426 TJm
-(BZ2_bzDecompressEnd) 113.574 Tj
--426 TJm
-(\() 5.97756 Tj
--426 TJm
-(bz_stream) 53.798 Tj
-298.259 413.821 Td
-(*) 5.97756 Tj
-304.236 415.564 Td
-(strm) 23.9102 Tj
--426 TJm
-(\);) 11.9551 Tj
-[1 0 0 1 72 400.023] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -390.06] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 378.105 Td
-/F130_0 9.9626 Tf
-(Releases) 34.8591 Tj
--250 TJm
-(all) 9.9626 Tj
--250 TJm
-(memory) 33.2053 Tj
--250 TJm
-(associated) 40.9463 Tj
--250 TJm
-(with) 17.7135 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(decompression) 59.7656 Tj
--250 TJm
-(stream.) 29.0509 Tj
-[1 0 0 1 72 375.948] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -365.985] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 356.187 Td
-/F130_0 9.9626 Tf
-(Possible) 33.2153 Tj
--250 TJm
-(return) 23.7907 Tj
--250 TJm
-(v) 4.9813 Tj
-25 TJm
-(alues:) 23.2427 Tj
-[1 0 0 1 72 356.087] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -60.7721] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 59.7758 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 56.1893] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -346.723] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 346.723 Td
-/F134_0 9.9626 Tf
-(BZ_PARAM_ERROR) 83.6858 Tj
-98.4879 334.767 Td
-(if) 11.9551 Tj
--426 TJm
-(strm) 23.9102 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(NULL) 23.9102 Tj
--426 TJm
-(or) 11.9551 Tj
--426 TJm
-(strm->s) 41.8429 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(NULL) 23.9102 Tj
-90 322.812 Td
-(BZ_OK) 29.8878 Tj
-98.4879 310.857 Td
-(otherwise) 53.798 Tj
-[1 0 0 1 72 295.315] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -285.353] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 273.397 Td
-/F130_0 9.9626 Tf
-(Allo) 17.7135 Tj
-25 TJm
-(w) 7.193 Tj
-10 TJm
-(able) 16.5977 Tj
--250 TJm
-(ne) 9.40469 Tj
-15 TJm
-(xt) 7.7509 Tj
--250 TJm
-(actions:) 30.9936 Tj
-[1 0 0 1 72 273.298] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -24.9066] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 23.9103 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 20.3237] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -263.933] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-98.4879 263.933 Td
-/F134_0 9.9626 Tf
-(None.) 29.8878 Tj
-[1 0 0 1 72 248.391] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -238.429] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 213.639 Td
-/F122_0 20.6585 Tf
-(3.4.) 34.4584 Tj
--278 TJm
-(High-le) 70.0117 Tj
-15 TJm
-(vel) 28.7153 Tj
--278 TJm
-(interface) 86.1046 Tj
-[1 0 0 1 72 209.042] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -199.08] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 191.721 Td
-/F130_0 9.9626 Tf
-(This) 17.7135 Tj
--250 TJm
-(interf) 21.579 Tj
-10 TJm
-(ace) 13.2702 Tj
--250 TJm
-(pro) 13.2801 Tj
-15 TJm
-(vides) 21.031 Tj
--250 TJm
-(functions) 37.0808 Tj
--250 TJm
-(for) 11.6164 Tj
--250 TJm
-(reading) 29.8778 Tj
--250 TJm
-(and) 14.386 Tj
--250 TJm
-(writing) 28.782 Tj
-[1 0 0 1 300.292 191.721] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -300.292 -191.721] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-300.292 191.721 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 330.18 191.721] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -330.18 -191.721] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-332.67 191.721 Td
-/F130_0 9.9626 Tf
-(format) 26.5603 Tj
--250 TJm
-(\002les.) 19.0983 Tj
--620 TJm
-(First,) 20.7621 Tj
--250 TJm
-(some) 21.031 Tj
--250 TJm
-(general) 29.3199 Tj
--250 TJm
-(points.) 26.8492 Tj
-[1 0 0 1 72 189.564] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -29.7236] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.9739 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -78.9739 -159.84] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-78.9739 159.84 Td
-/F130_0 9.9626 Tf
-(\225) 3.48691 Tj
-[1 0 0 1 82.4608 159.84] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.9925 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -86.944 -159.84] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 159.84 Td
-/F130_0 9.9626 Tf
-(All) 12.7322 Tj
--332 TJm
-(of) 8.29885 Tj
--331 TJm
-(the) 12.1743 Tj
--332 TJm
-(functions) 37.0808 Tj
--332 TJm
-(tak) 12.1743 Tj
-10 TJm
-(e) 4.42339 Tj
--331 TJm
-(an) 9.40469 Tj
-[1 0 0 1 202.958 159.84] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -202.958 -159.84] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-202.958 159.84 Td
-/F134_0 9.9626 Tf
-(int) 17.9327 Tj
-220.891 158.097 Td
-(*) 5.97756 Tj
-[1 0 0 1 226.868 159.84] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -226.868 -159.84] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-230.172 159.84 Td
-/F130_0 9.9626 Tf
-(\002rst) 15.5018 Tj
--332 TJm
-(ar) 7.74094 Tj
-18 TJm
-(gument,) 32.3785 Tj
-[1 0 0 1 292.426 159.84] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -292.426 -159.84] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-292.426 159.84 Td
-/F134_0 9.9626 Tf
-(bzerror) 41.8429 Tj
-[1 0 0 1 334.269 159.84] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -334.269 -159.84] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-334.269 159.84 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
--1110 TJm
-(After) 21.0211 Tj
--332 TJm
-(each) 18.2515 Tj
--331 TJm
-(call,) 16.8766 Tj
-[1 0 0 1 414.083 159.84] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -414.083 -159.84] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-414.083 159.84 Td
-/F134_0 9.9626 Tf
-(bzerror) 41.8429 Tj
-[1 0 0 1 455.926 159.84] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -455.926 -159.84] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-459.23 159.84 Td
-/F130_0 9.9626 Tf
-(should) 26.5703 Tj
--332 TJm
-(be) 9.40469 Tj
--331 TJm
-(consulted) 38.1866 Tj
-86.944 147.885 Td
-(\002rst) 15.5018 Tj
--349 TJm
-(to) 7.7509 Tj
--349 TJm
-(determine) 39.8404 Tj
--348 TJm
-(the) 12.1743 Tj
--349 TJm
-(outcome) 34.3112 Tj
--349 TJm
-(of) 8.29885 Tj
--349 TJm
-(the) 12.1743 Tj
--348 TJm
-(call.) 16.8766 Tj
--1213 TJm
-(If) 6.63509 Tj
-[1 0 0 1 280.386 147.885] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -280.386 -147.885] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-280.386 147.885 Td
-/F134_0 9.9626 Tf
-(bzerror) 41.8429 Tj
-[1 0 0 1 322.229 147.885] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -322.229 -147.885] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-325.704 147.885 Td
-/F130_0 9.9626 Tf
-(is) 6.64505 Tj
-[1 0 0 1 335.824 147.885] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -335.824 -147.885] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-335.824 147.885 Td
-/F134_0 9.9626 Tf
-(BZ_OK) 29.8878 Tj
-[1 0 0 1 365.711 147.885] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -365.711 -147.885] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-365.711 147.885 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--349 TJm
-(the) 12.1743 Tj
--349 TJm
-(call) 14.386 Tj
--348 TJm
-(completed) 41.5042 Tj
--349 TJm
-(successfully) 48.6972 Tj
-65 TJm
-(,) 2.49065 Tj
--374 TJm
-(and) 14.386 Tj
--348 TJm
-(only) 17.7135 Tj
-86.944 135.93 Td
-(then) 17.1556 Tj
--271 TJm
-(should) 26.5703 Tj
--270 TJm
-(the) 12.1743 Tj
--271 TJm
-(return) 23.7907 Tj
--270 TJm
-(v) 4.9813 Tj
-25 TJm
-(alue) 16.5977 Tj
--271 TJm
-(of) 8.29885 Tj
--271 TJm
-(the) 12.1743 Tj
--270 TJm
-(function) 33.2053 Tj
--271 TJm
-(\(if) 9.40469 Tj
--270 TJm
-(an) 9.40469 Tj
-15 TJm
-(y\)) 8.29885 Tj
--271 TJm
-(be) 9.40469 Tj
--271 TJm
-(cons) 18.2614 Tj
-1 TJm
-(u) 4.9813 Tj
--1 TJm
-(l) 2.7696 Tj
-1 TJm
-(ted.) 14.6649 Tj
--744 TJm
-(If) 6.63509 Tj
-[1 0 0 1 365.077 135.93] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -365.077 -135.93] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-365.077 135.93 Td
-/F134_0 9.9626 Tf
-(bzerror) 41.8429 Tj
-[1 0 0 1 406.92 135.93] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -406.92 -135.93] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-409.616 135.93 Td
-/F130_0 9.9626 Tf
-(is) 6.64505 Tj
-[1 0 0 1 418.956 135.93] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -418.956 -135.93] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-418.956 135.93 Td
-/F134_0 9.9626 Tf
-(BZ_IO_ERROR) 65.7532 Tj
-[1 0 0 1 484.71 135.93] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -484.71 -135.93] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-484.71 135.93 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--271 TJm
-(there) 19.9152 Tj
--270 TJm
-(w) 7.193 Tj
-10 TJm
-(as) 8.29885 Tj
--271 TJm
-(an) 9.40469 Tj
-86.944 123.975 Td
-(error) 19.3573 Tj
--246 TJm
-(reading/writing) 61.4294 Tj
--245 TJm
-(the) 12.1743 Tj
--246 TJm
-(underlying) 43.1679 Tj
--246 TJm
-(compressed) 47.0334 Tj
--245 TJm
-(\002le,) 15.2229 Tj
--247 TJm
-(and) 14.386 Tj
--245 TJm
-(you) 14.9439 Tj
--246 TJm
-(should) 26.5703 Tj
--246 TJm
-(then) 17.1556 Tj
--245 TJm
-(consult) 28.782 Tj
-[1 0 0 1 414.096 123.975] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -414.096 -123.975] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-414.096 123.975 Td
-/F134_0 9.9626 Tf
-(errno) 29.8878 Tj
-[1 0 0 1 443.984 123.975] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -443.984 -123.975] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-446.432 123.975 Td
-/F130_0 9.9626 Tf
-(/) 2.7696 Tj
-[1 0 0 1 451.649 123.975] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -451.649 -123.975] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-451.649 123.975 Td
-/F134_0 9.9626 Tf
-(perror) 35.8654 Tj
-[1 0 0 1 487.514 123.975] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -487.514 -123.975] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-489.962 123.975 Td
-/F130_0 9.9626 Tf
-(to) 7.7509 Tj
--246 TJm
-(determine) 39.8404 Tj
-86.944 112.02 Td
-(the) 12.1743 Tj
--356 TJm
-(cause) 22.1269 Tj
--356 TJm
-(of) 8.29885 Tj
--355 TJm
-(the) 12.1743 Tj
--356 TJm
-(dif) 11.0684 Tj
-25 TJm
-(\002culty) 25.4644 Tj
-65 TJm
-(.) 2.49065 Tj
-[1 0 0 1 206.528 112.02] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -206.528 -112.02] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-206.528 112.02 Td
-/F134_0 9.9626 Tf
-(bzerror) 41.8429 Tj
-[1 0 0 1 248.371 112.02] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -248.371 -112.02] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-251.916 112.02 Td
-/F130_0 9.9626 Tf
-(may) 17.1556 Tj
--356 TJm
-(also) 16.0497 Tj
--356 TJm
-(be) 9.40469 Tj
--355 TJm
-(set) 11.0684 Tj
--356 TJm
-(to) 7.7509 Tj
--356 TJm
-(v) 4.9813 Tj
-25 TJm
-(arious) 24.3486 Tj
--356 TJm
-(other) 20.4731 Tj
--356 TJm
-(v) 4.9813 Tj
-25 TJm
-(alues;) 23.2427 Tj
--408 TJm
-(precise) 28.2141 Tj
--356 TJm
-(details) 26.0123 Tj
--356 TJm
-(are) 12.1643 Tj
--356 TJm
-(gi) 7.7509 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(en) 9.40469 Tj
--356 TJm
-(on) 9.9626 Tj
--356 TJm
-(a) 4.42339 Tj
-86.944 100.064 Td
-(per) 12.7222 Tj
-20 TJm
-(-function) 36.5229 Tj
--250 TJm
-(basis) 19.9252 Tj
--250 TJm
-(belo) 17.1556 Tj
-25 TJm
-(w) 7.193 Tj
-65 TJm
-(.) 2.49065 Tj
-[1 0 0 1 186.839 100.064] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -114.838 -49.2126] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 374.394 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.8541] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 40.5726 -6.7545] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -493.841 -50.9514] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-534.414 50.9514 Td
-/F130_0 9.9626 Tf
-(18) 9.9626 Tj
-[1 0 0 1 453.269 50.8518] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 93.5985 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.2765 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-Q
-showpage
-%%PageTrailer
-pdfEndPage
-%%Page: 22 22
-%%BeginPageSetup
-%%PageOrientation: Portrait
-pdfStartPage
-0 0 612 792 re W
-%%EndPageSetup
-[] 0 d
-1 i
-0 j
-0 J
-10 M
-1 w
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-false op
-false OP
-0 0 612 792 re
-W
-q
-[1 0 0 1 72 741.554] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 14.4459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 187.197 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 -8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 76.4979 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -342.569 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-419.067 749.245 Td
-/F130_0 9.9626 Tf
-(Programming) 54.7943 Tj
--250 TJm
-(with) 17.7135 Tj
-[1 0 0 1 496.556 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -496.556 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-496.556 749.245 Td
-/F134_0 9.9626 Tf
-(libbzip2) 47.8205 Tj
-[1 0 0 1 544.376 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -278.305 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 280.796 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.974 -5.0363] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -0.4981] cm
-q
-[] 0 d
-0 J
-0.4981 w
-0 0.2491 m
-475.465 0.2491 l
-S
-Q
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 479.251 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -31.5168] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.9739 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -78.9739 -710.037] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-78.9739 710.037 Td
-/F130_0 9.9626 Tf
-(\225) 3.48691 Tj
-[1 0 0 1 82.4608 710.037] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.9925 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -86.944 -710.037] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 710.037 Td
-/F130_0 9.9626 Tf
-(If) 6.63509 Tj
-[1 0 0 1 95.9576 710.037] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -95.9576 -710.037] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-95.9576 710.037 Td
-/F134_0 9.9626 Tf
-(bzerror) 41.8429 Tj
-[1 0 0 1 137.801 710.037] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -137.801 -710.037] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-140.179 710.037 Td
-/F130_0 9.9626 Tf
-(indicates) 35.417 Tj
--239 TJm
-(an) 9.40469 Tj
--238 TJm
-(error) 19.3573 Tj
--239 TJm
-(\(ie,) 13.0012 Tj
--241 TJm
-(an) 9.40469 Tj
-15 TJm
-(ything) 25.4644 Tj
--239 TJm
-(e) 4.42339 Tj
-15 TJm
-(xcept) 21.579 Tj
-[1 0 0 1 292.225 710.037] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -292.225 -710.037] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-292.225 710.037 Td
-/F134_0 9.9626 Tf
-(BZ_OK) 29.8878 Tj
-[1 0 0 1 322.113 710.037] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -322.113 -710.037] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-324.492 710.037 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 341.256 710.037] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -341.256 -710.037] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-341.256 710.037 Td
-/F134_0 9.9626 Tf
-(BZ_STREAM_END) 77.7083 Tj
-[1 0 0 1 418.965 710.037] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -418.965 -710.037] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-418.965 710.037 Td
-/F130_0 9.9626 Tf
-(\),) 5.8082 Tj
--239 TJm
-(you) 14.9439 Tj
--239 TJm
-(should) 26.5703 Tj
--238 TJm
-(immediately) 49.813 Tj
--239 TJm
-(call) 14.386 Tj
-[1 0 0 1 86.944 698.082] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -86.944 -698.082] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 698.082 Td
-/F134_0 9.9626 Tf
-(BZ2_bzReadClose) 89.6634 Tj
-[1 0 0 1 176.608 698.082] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -176.608 -698.082] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-179.343 698.082 Td
-/F130_0 9.9626 Tf
-(\(or) 11.6164 Tj
-[1 0 0 1 193.695 698.082] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -193.695 -698.082] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-193.695 698.082 Td
-/F134_0 9.9626 Tf
-(BZ2_bzWriteClose) 95.641 Tj
-[1 0 0 1 289.337 698.082] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -289.337 -698.082] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-289.337 698.082 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--281 TJm
-(depending) 41.5042 Tj
--274 TJm
-(on) 9.9626 Tj
--275 TJm
-(whether) 32.0895 Tj
--274 TJm
-(you) 14.9439 Tj
--275 TJm
-(are) 12.1643 Tj
--275 TJm
-(attempting) 42.62 Tj
--274 TJm
-(to) 7.7509 Tj
--275 TJm
-(read) 17.1456 Tj
--274 TJm
-(or) 8.29885 Tj
--275 TJm
-(to) 7.7509 Tj
--274 TJm
-(write\)) 23.7907 Tj
-86.944 686.127 Td
-(to) 7.7509 Tj
--242 TJm
-(free) 15.4819 Tj
--242 TJm
-(up) 9.9626 Tj
--241 TJm
-(all) 9.9626 Tj
--242 TJm
-(resources) 37.6188 Tj
--242 TJm
-(associated) 40.9463 Tj
--242 TJm
-(wi) 9.9626 Tj
-1 TJm
-(th) 7.7509 Tj
--242 TJm
-(the) 12.1743 Tj
--242 TJm
-(stream.) 29.0509 Tj
--614 TJm
-(Once) 21.0211 Tj
--242 TJm
-(an) 9.40469 Tj
--242 TJm
-(error) 19.3573 Tj
--242 TJm
-(has) 13.2801 Tj
--242 TJm
-(been) 18.8094 Tj
--241 TJm
-(indicated,) 39.0135 Tj
--244 TJm
-(beha) 18.8094 Tj
-20 TJm
-(viour) 21.031 Tj
--241 TJm
-(of) 8.29885 Tj
--242 TJm
-(all) 9.9626 Tj
--242 TJm
-(calls) 18.2614 Tj
--242 TJm
-(e) 4.42339 Tj
-15 TJm
-(xcept) 21.579 Tj
-[1 0 0 1 86.944 674.172] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -86.944 -674.172] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 674.172 Td
-/F134_0 9.9626 Tf
-(BZ2_bzReadClose) 89.6634 Tj
-[1 0 0 1 176.608 674.172] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -176.608 -674.172] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-179.705 674.172 Td
-/F130_0 9.9626 Tf
-(\() 3.31755 Tj
-[1 0 0 1 183.022 674.172] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -183.022 -674.172] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-183.022 674.172 Td
-/F134_0 9.9626 Tf
-(BZ2_bzWriteClose) 95.641 Tj
-[1 0 0 1 278.664 674.172] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -278.664 -674.172] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-278.664 674.172 Td
-/F130_0 9.9626 Tf
-(\)) 3.31755 Tj
--311 TJm
-(is) 6.64505 Tj
--311 TJm
-(unde\002ned.) 41.7831 Tj
--985 TJm
-(The) 15.4918 Tj
--311 TJm
-(implication) 45.3896 Tj
--310 TJm
-(is) 6.64505 Tj
--311 TJm
-(that) 14.9439 Tj
--311 TJm
-(\(1\)) 11.6164 Tj
-[1 0 0 1 455.988 674.172] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -455.988 -674.172] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-455.988 674.172 Td
-/F134_0 9.9626 Tf
-(bzerror) 41.8429 Tj
-[1 0 0 1 497.831 674.172] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -497.831 -674.172] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-500.928 674.172 Td
-/F130_0 9.9626 Tf
-(should) 26.5703 Tj
--311 TJm
-(be) 9.40469 Tj
-86.944 662.217 Td
-(check) 23.2328 Tj
-10 TJm
-(ed) 9.40469 Tj
--291 TJm
-(after) 18.2515 Tj
--291 TJm
-(each) 18.2515 Tj
--291 TJm
-(call,) 16.8766 Tj
--301 TJm
-(and) 14.386 Tj
--291 TJm
-(\(2\)) 11.6164 Tj
--291 TJm
-(if) 6.08715 Tj
-[1 0 0 1 225.347 662.217] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -225.347 -662.217] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-225.347 662.217 Td
-/F134_0 9.9626 Tf
-(bzerror) 41.8429 Tj
-[1 0 0 1 267.19 662.217] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -267.19 -662.217] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-270.09 662.217 Td
-/F130_0 9.9626 Tf
-(indicates) 35.417 Tj
--291 TJm
-(an) 9.40469 Tj
--291 TJm
-(error) 19.3573 Tj
-40 TJm
-(,) 2.49065 Tj
-[1 0 0 1 345.161 662.217] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -345.161 -662.217] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-345.161 662.217 Td
-/F134_0 9.9626 Tf
-(BZ2_bzReadClose) 89.6634 Tj
-[1 0 0 1 434.824 662.217] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -434.824 -662.217] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-437.724 662.217 Td
-/F130_0 9.9626 Tf
-(\() 3.31755 Tj
-[1 0 0 1 441.041 662.217] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -441.041 -662.217] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-441.041 662.217 Td
-/F134_0 9.9626 Tf
-(BZ2_bzWriteClose) 95.641 Tj
-[1 0 0 1 536.683 662.217] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -536.683 -662.217] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-536.683 662.217 Td
-/F130_0 9.9626 Tf
-(\)) 3.31755 Tj
-86.944 650.262 Td
-(should) 26.5703 Tj
--250 TJm
-(then) 17.1556 Tj
--250 TJm
-(be) 9.40469 Tj
--250 TJm
-(called) 23.7907 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(clean) 21.0211 Tj
--250 TJm
-(up.) 12.4533 Tj
-[1 0 0 1 220.034 650.261] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -148.034 -21.9178] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.9739 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -78.9739 -628.344] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-78.9739 628.344 Td
-/F130_0 9.9626 Tf
-(\225) 3.48691 Tj
-[1 0 0 1 82.4608 628.344] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.9925 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -86.944 -628.344] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 628.344 Td
-/F130_0 9.9626 Tf
-(The) 15.4918 Tj
-[1 0 0 1 106.362 628.344] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -106.362 -628.344] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-106.362 628.344 Td
-/F134_0 9.9626 Tf
-(FILE) 23.9102 Tj
-130.273 626.6 Td
-(*) 5.97756 Tj
-[1 0 0 1 136.25 628.344] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -136.25 -628.344] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-140.177 628.344 Td
-/F130_0 9.9626 Tf
-(ar) 7.74094 Tj
-18 TJm
-(guments) 33.7633 Tj
--394 TJm
-(passed) 26.5603 Tj
--394 TJm
-(to) 7.7509 Tj
-[1 0 0 1 227.592 628.344] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -227.592 -628.344] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-227.592 628.344 Td
-/F134_0 9.9626 Tf
-(BZ2_bzReadOpen) 83.6858 Tj
-[1 0 0 1 311.278 628.344] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -311.278 -628.344] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-315.205 628.344 Td
-/F130_0 9.9626 Tf
-(/) 2.7696 Tj
-[1 0 0 1 321.901 628.344] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -321.901 -628.344] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-321.901 628.344 Td
-/F134_0 9.9626 Tf
-(BZ2_bzWriteOpen) 89.6634 Tj
-[1 0 0 1 411.565 628.344] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -411.565 -628.344] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-415.491 628.344 Td
-/F130_0 9.9626 Tf
-(should) 26.5703 Tj
--394 TJm
-(be) 9.40469 Tj
--394 TJm
-(set) 11.0684 Tj
--394 TJm
-(to) 7.7509 Tj
--394 TJm
-(binary) 25.4544 Tj
--395 TJm
-(mode.) 24.6275 Tj
-86.944 616.389 Td
-(Most) 20.4831 Tj
--229 TJm
-(Unix) 19.9252 Tj
--229 TJm
-(systems) 31.5516 Tj
--228 TJm
-(will) 15.5018 Tj
--229 TJm
-(do) 9.9626 Tj
--229 TJm
-(this) 14.396 Tj
--229 TJm
-(by) 9.9626 Tj
--229 TJm
-(def) 12.7222 Tj
-10 TJm
-(ault,) 17.4346 Tj
--233 TJm
-(b) 4.9813 Tj
-20 TJm
-(ut) 7.7509 Tj
--229 TJm
-(other) 20.4731 Tj
--229 TJm
-(platforms,) 40.6773 Tj
--233 TJm
-(including) 37.6387 Tj
--229 TJm
-(W) 9.40469 Tj
-40 TJm
-(indo) 17.7135 Tj
-25 TJm
-(ws) 11.0684 Tj
--228 TJm
-(and) 14.386 Tj
--229 TJm
-(Mac,) 20.1942 Tj
--233 TJm
-(will) 15.5018 Tj
--229 TJm
-(not.) 15.2229 Tj
--606 TJm
-(If) 6.63509 Tj
--229 TJm
-(you) 14.9439 Tj
--229 TJm
-(omit) 18.2714 Tj
-86.944 604.433 Td
-(this,) 16.8866 Tj
--250 TJm
-(you) 14.9439 Tj
--250 TJm
-(may) 17.1556 Tj
--250 TJm
-(encounter) 39.2825 Tj
--250 TJm
-(problems) 37.0808 Tj
--250 TJm
-(when) 21.579 Tj
--250 TJm
-(mo) 12.7322 Tj
-15 TJm
-(ving) 17.7135 Tj
--250 TJm
-(code) 18.8094 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(ne) 9.40469 Tj
-25 TJm
-(w) 7.193 Tj
--250 TJm
-(platforms.) 40.6773 Tj
-[1 0 0 1 372.66 604.433] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -300.66 -21.9178] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.9739 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -78.9739 -582.516] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-78.9739 582.516 Td
-/F130_0 9.9626 Tf
-(\225) 3.48691 Tj
-[1 0 0 1 82.4608 582.516] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.9925 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -86.944 -582.516] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 582.516 Td
-/F130_0 9.9626 Tf
-(Memory) 34.3112 Tj
--348 TJm
-(allocation) 39.2925 Tj
--348 TJm
-(requests) 32.6474 Tj
--348 TJm
-(are) 12.1643 Tj
--348 TJm
-(handled) 31.5416 Tj
--348 TJm
-(by) 9.9626 Tj
-[1 0 0 1 267.67 582.516] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -267.67 -582.516] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-267.67 582.516 Td
-/F134_0 9.9626 Tf
-(malloc) 35.8654 Tj
-[1 0 0 1 303.535 582.516] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -303.535 -582.516] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-307.003 582.516 Td
-/F130_0 9.9626 Tf
-(/) 2.7696 Tj
-[1 0 0 1 313.241 582.516] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -313.241 -582.516] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-313.241 582.516 Td
-/F134_0 9.9626 Tf
-(free) 23.9102 Tj
-[1 0 0 1 337.151 582.516] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -337.151 -582.516] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-337.151 582.516 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
--1209 TJm
-(At) 9.9626 Tj
--348 TJm
-(present) 28.772 Tj
--348 TJm
-(there) 19.9152 Tj
--348 TJm
-(is) 6.64505 Tj
--348 TJm
-(no) 9.9626 Tj
--348 TJm
-(f) 3.31755 Tj
-10 TJm
-(acility) 24.9065 Tj
--348 TJm
-(for) 11.6164 Tj
--348 TJm
-(user) 16.5977 Tj
-20 TJm
-(-de\002ned) 32.6474 Tj
-86.944 570.56 Td
-(memory) 33.2053 Tj
--250 TJm
-(allocators) 38.7346 Tj
--250 TJm
-(in) 7.7509 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(\002le) 12.7322 Tj
--250 TJm
-(I/O) 13.2801 Tj
--250 TJm
-(functions) 37.0808 Tj
--250 TJm
-(\(could) 25.4544 Tj
--250 TJm
-(easily) 23.2427 Tj
--250 TJm
-(be) 9.40469 Tj
--250 TJm
-(added,) 26.2813 Tj
--250 TJm
-(though\).) 33.4843 Tj
-[1 0 0 1 387.165 570.56] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -315.165 -12.1195] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -548.478] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 529.977 Td
-/F122_0 17.2154 Tf
-(3.4.1.) 43.0729 Tj
-[1 0 0 1 119.858 529.977] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -119.858 -529.977] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-119.858 529.977 Td
-/F392_0 17.2154 Tf
-(BZ2_bzReadOpen) 144.609 Tj
-[1 0 0 1 264.468 529.977] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -192.468 -2.3327] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -72.7272] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 71.731 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 68.1444] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -518.279] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 518.279 Td
-/F134_0 9.9626 Tf
-(typedef) 41.8429 Tj
--426 TJm
-(void) 23.9102 Tj
--426 TJm
-(BZFILE;) 41.8429 Tj
-90 494.369 Td
-(BZFILE) 35.8654 Tj
-130.109 492.625 Td
-(*) 5.97756 Tj
-136.087 494.369 Td
-(BZ2_bzReadOpen\() 89.6634 Tj
--426 TJm
-(int) 17.9327 Tj
-252.171 492.625 Td
-(*) 5.97756 Tj
-258.149 494.369 Td
-(bzerror,) 47.8205 Tj
--426 TJm
-(FILE) 23.9102 Tj
-338.368 492.625 Td
-(*) 5.97756 Tj
-344.346 494.369 Td
-(f,) 11.9551 Tj
-191.855 482.414 Td
-(int) 17.9327 Tj
--426 TJm
-(verbosity,) 59.7756 Tj
--426 TJm
-(int) 17.9327 Tj
--426 TJm
-(small,) 35.8654 Tj
-191.855 470.458 Td
-(void) 23.9102 Tj
-220.01 468.715 Td
-(*) 5.97756 Tj
-225.987 470.458 Td
-(unused,) 41.8429 Tj
--426 TJm
-(int) 17.9327 Tj
--426 TJm
-(nUnused) 41.8429 Tj
--426 TJm
-(\);) 11.9551 Tj
-[1 0 0 1 72 454.917] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -444.954] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 432.999 Td
-/F130_0 9.9626 Tf
-(Prepare) 30.4258 Tj
--290 TJm
-(to) 7.7509 Tj
--289 TJm
-(read) 17.1456 Tj
--290 TJm
-(compressed) 47.0334 Tj
--290 TJm
-(data) 16.5977 Tj
--289 TJm
-(from) 19.3673 Tj
--290 TJm
-(\002le) 12.7322 Tj
--289 TJm
-(handle) 26.5603 Tj
-[1 0 0 1 272.697 432.999] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -272.697 -432.999] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-272.697 432.999 Td
-/F134_0 9.9626 Tf
-(f) 5.97756 Tj
-[1 0 0 1 278.675 432.999] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -278.675 -432.999] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-278.675 432.999 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
-[1 0 0 1 285.439 432.999] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -285.439 -432.999] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-285.439 432.999 Td
-/F134_0 9.9626 Tf
-(f) 5.97756 Tj
-[1 0 0 1 291.417 432.999] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -291.417 -432.999] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-294.303 432.999 Td
-/F130_0 9.9626 Tf
-(should) 26.5703 Tj
--290 TJm
-(refer) 18.7994 Tj
--289 TJm
-(to) 7.7509 Tj
--290 TJm
-(a) 4.42339 Tj
--290 TJm
-(\002le) 12.7322 Tj
--289 TJm
-(which) 24.3486 Tj
--290 TJm
-(has) 13.2801 Tj
--289 TJm
-(been) 18.8094 Tj
--290 TJm
-(opened) 28.772 Tj
--290 TJm
-(for) 11.6164 Tj
--289 TJm
-(reading,) 32.3685 Tj
--300 TJm
-(and) 14.386 Tj
-72 421.044 Td
-(for) 11.6164 Tj
--306 TJm
-(which) 24.3486 Tj
--305 TJm
-(the) 12.1743 Tj
--306 TJm
-(error) 19.3573 Tj
--306 TJm
-(indicator) 35.417 Tj
--305 TJm
-(\() 3.31755 Tj
-[1 0 0 1 193.457 421.044] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -193.457 -421.044] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-193.457 421.044 Td
-/F134_0 9.9626 Tf
-(ferror\(f\)) 53.798 Tj
-[1 0 0 1 247.255 421.044] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -247.255 -421.044] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-247.255 421.044 Td
-/F130_0 9.9626 Tf
-(\)is) 9.9626 Tj
--306 TJm
-(not) 12.7322 Tj
--305 TJm
-(set.) 13.5591 Tj
--954 TJm
-(If) 6.63509 Tj
-[1 0 0 1 308.784 421.044] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -308.784 -421.044] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-308.784 421.044 Td
-/F134_0 9.9626 Tf
-(small) 29.8878 Tj
-[1 0 0 1 338.671 421.044] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -338.671 -421.044] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-341.717 421.044 Td
-/F130_0 9.9626 Tf
-(is) 6.64505 Tj
--306 TJm
-(1,) 7.47195 Tj
--319 TJm
-(the) 12.1743 Tj
--306 TJm
-(library) 26.5603 Tj
--306 TJm
-(will) 15.5018 Tj
--305 TJm
-(try) 11.0684 Tj
--306 TJm
-(to) 7.7509 Tj
--306 TJm
-(dec) 13.8281 Tj
-1 TJm
-(ompress) 33.2053 Tj
--306 TJm
-(using) 21.589 Tj
--306 TJm
-(less) 14.9439 Tj
-72 409.089 Td
-(memory) 33.2053 Tj
-65 TJm
-(,) 2.49065 Tj
--250 TJm
-(at) 7.193 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(e) 4.42339 Tj
-15 TJm
-(xpense) 27.6661 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(speed.) 25.1755 Tj
-[1 0 0 1 72 406.932] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -396.969] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 387.171 Td
-/F130_0 9.9626 Tf
-(F) 5.53921 Tj
-15 TJm
-(or) 8.29885 Tj
--227 TJm
-(reasons) 29.8778 Tj
--227 TJm
-(e) 4.42339 Tj
-15 TJm
-(xplained) 34.3112 Tj
--228 TJm
-(belo) 17.1556 Tj
-25 TJm
-(w) 7.193 Tj
-65 TJm
-(,) 2.49065 Tj
-[1 0 0 1 189.193 387.171] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -189.193 -387.171] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-189.193 387.171 Td
-/F134_0 9.9626 Tf
-(BZ2_bzRead) 59.7756 Tj
-[1 0 0 1 248.969 387.171] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -248.969 -387.171] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-251.232 387.171 Td
-/F130_0 9.9626 Tf
-(will) 15.5018 Tj
--227 TJm
-(decompress) 47.0334 Tj
--227 TJm
-(the) 12.1743 Tj
-[1 0 0 1 332.732 387.171] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -332.732 -387.171] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-332.732 387.171 Td
-/F134_0 9.9626 Tf
-(nUnused) 41.8429 Tj
-[1 0 0 1 374.575 387.171] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -374.575 -387.171] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-376.838 387.171 Td
-/F130_0 9.9626 Tf
-(bytes) 21.031 Tj
--227 TJm
-(starting) 29.8878 Tj
--227 TJm
-(at) 7.193 Tj
-[1 0 0 1 441.74 387.171] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -441.74 -387.171] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-441.74 387.171 Td
-/F134_0 9.9626 Tf
-(unused) 35.8654 Tj
-[1 0 0 1 477.605 387.171] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -477.605 -387.171] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-477.605 387.171 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--232 TJm
-(before) 25.4445 Tj
--227 TJm
-(starting) 29.8878 Tj
-72 375.216 Td
-(to) 7.7509 Tj
--280 TJm
-(read) 17.1456 Tj
--279 TJm
-(from) 19.3673 Tj
--280 TJm
-(the) 12.1743 Tj
--279 TJm
-(\002le) 12.7322 Tj
-[1 0 0 1 155.094 375.215] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -155.094 -375.215] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-155.094 375.215 Td
-/F134_0 9.9626 Tf
-(f) 5.97756 Tj
-[1 0 0 1 161.072 375.215] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -161.072 -375.215] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-161.072 375.215 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
--797 TJm
-(At) 9.9626 Tj
--280 TJm
-(most) 19.3773 Tj
-[1 0 0 1 206.414 375.215] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -206.414 -375.215] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-206.414 375.215 Td
-/F134_0 9.9626 Tf
-(BZ_MAX_UNUSED) 77.7083 Tj
-[1 0 0 1 284.122 375.215] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -284.122 -375.215] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-286.907 375.215 Td
-/F130_0 9.9626 Tf
-(bytes) 21.031 Tj
--280 TJm
-(may) 17.1556 Tj
--279 TJm
-(be) 9.40469 Tj
--280 TJm
-(supplied) 33.7633 Tj
--279 TJm
-(lik) 10.5205 Tj
-10 TJm
-(e) 4.42339 Tj
--280 TJm
-(this.) 16.8866 Tj
--797 TJm
-(If) 6.63509 Tj
--279 TJm
-(this) 14.396 Tj
--280 TJm
-(f) 3.31755 Tj
-10 TJm
-(acility) 24.9065 Tj
--279 TJm
-(is) 6.64505 Tj
--280 TJm
-(not) 12.7322 Tj
--279 TJm
-(required,) 35.686 Tj
-72 363.26 Td
-(you) 14.9439 Tj
--250 TJm
-(should) 26.5703 Tj
--250 TJm
-(pass) 17.1556 Tj
-[1 0 0 1 138.141 363.26] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -138.141 -363.26] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-138.141 363.26 Td
-/F134_0 9.9626 Tf
-(NULL) 23.9102 Tj
-[1 0 0 1 162.052 363.26] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -162.052 -363.26] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-164.542 363.26 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 181.419 363.26] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -181.419 -363.26] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-181.419 363.26 Td
-/F134_0 9.9626 Tf
-(0) 5.97756 Tj
-[1 0 0 1 187.397 363.26] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -187.397 -363.26] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-189.887 363.26 Td
-/F130_0 9.9626 Tf
-(for) 11.6164 Tj
-[1 0 0 1 203.994 363.26] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -203.994 -363.26] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-203.994 363.26 Td
-/F134_0 9.9626 Tf
-(unused) 35.8654 Tj
-[1 0 0 1 239.86 363.26] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -239.86 -363.26] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-242.351 363.26 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
--250 TJm
-(n) 4.9813 Tj
-[1 0 0 1 264.208 363.26] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -264.208 -363.26] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-264.208 363.26 Td
-/F134_0 9.9626 Tf
-(Unused) 35.8654 Tj
-[1 0 0 1 300.074 363.26] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -300.074 -363.26] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-302.565 363.26 Td
-/F130_0 9.9626 Tf
-(respecti) 30.9837 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(ely) 12.1743 Tj
-65 TJm
-(.) 2.49065 Tj
-[1 0 0 1 72 361.103] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -351.141] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 341.343 Td
-/F130_0 9.9626 Tf
-(F) 5.53921 Tj
-15 TJm
-(or) 8.29885 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(meaning) 34.3112 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(parameters) 43.7059 Tj
-[1 0 0 1 196.631 341.343] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -196.631 -341.343] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-196.631 341.343 Td
-/F134_0 9.9626 Tf
-(small) 29.8878 Tj
-[1 0 0 1 226.519 341.343] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -226.519 -341.343] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-229.01 341.343 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 245.887 341.343] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -245.887 -341.343] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-245.887 341.343 Td
-/F134_0 9.9626 Tf
-(verbosity) 53.798 Tj
-[1 0 0 1 299.685 341.343] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -299.685 -341.343] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-299.685 341.343 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--250 TJm
-(see) 12.7222 Tj
-[1 0 0 1 319.879 341.343] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -319.879 -341.343] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-319.879 341.343 Td
-/F134_0 9.9626 Tf
-(BZ2_bzDecompressInit) 119.551 Tj
-[1 0 0 1 439.431 341.343] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -439.431 -341.343] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-439.431 341.343 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
-[1 0 0 1 72 339.186] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -329.223] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 319.425 Td
-/F130_0 9.9626 Tf
-(The) 15.4918 Tj
--402 TJm
-(amount) 29.8878 Tj
--402 TJm
-(of) 8.29885 Tj
--402 TJm
-(memory) 33.2053 Tj
--402 TJm
-(needed) 28.2141 Tj
--402 TJm
-(to) 7.7509 Tj
--402 TJm
-(decompress) 47.0334 Tj
--402 TJm
-(a) 4.42339 Tj
--401 TJm
-(\002le) 12.7322 Tj
--402 TJm
-(cannot) 26.5603 Tj
--402 TJm
-(be) 9.40469 Tj
--402 TJm
-(determined) 44.8217 Tj
--402 TJm
-(until) 18.2714 Tj
--402 TJm
-(the) 12.1743 Tj
--402 TJm
-(\002le') 16.0497 Tj
-55 TJm
-(s) 3.87545 Tj
--402 TJm
-(header) 26.5503 Tj
--402 TJm
-(has) 13.2801 Tj
--402 TJm
-(been) 18.8094 Tj
--402 TJm
-(read.) 19.6363 Tj
-72 307.47 Td
-(So) 10.5205 Tj
--492 TJm
-(it) 5.53921 Tj
--491 TJm
-(is) 6.64505 Tj
--492 TJm
-(possible) 32.6574 Tj
--492 TJm
-(that) 14.9439 Tj
-[1 0 0 1 166.797 307.47] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -166.797 -307.47] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-166.797 307.47 Td
-/F134_0 9.9626 Tf
-(BZ2_bzReadOpen) 83.6858 Tj
-[1 0 0 1 250.483 307.47] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -250.483 -307.47] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-255.381 307.47 Td
-/F130_0 9.9626 Tf
-(returns) 27.6661 Tj
-[1 0 0 1 287.945 307.47] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -287.945 -307.47] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-287.945 307.47 Td
-/F134_0 9.9626 Tf
-(BZ_OK) 29.8878 Tj
-[1 0 0 1 317.833 307.47] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -317.833 -307.47] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-322.729 307.47 Td
-/F130_0 9.9626 Tf
-(b) 4.9813 Tj
-20 TJm
-(ut) 7.7509 Tj
--492 TJm
-(a) 4.42339 Tj
--491 TJm
-(subsequent) 44.2738 Tj
--492 TJm
-(call) 14.386 Tj
--492 TJm
-(of) 8.29885 Tj
-[1 0 0 1 431.135 307.47] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -431.135 -307.47] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-431.135 307.47 Td
-/F134_0 9.9626 Tf
-(BZ2_bzRead) 59.7756 Tj
-[1 0 0 1 490.911 307.47] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -490.911 -307.47] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-495.81 307.47 Td
-/F130_0 9.9626 Tf
-(will) 15.5018 Tj
--492 TJm
-(return) 23.7907 Tj
-[1 0 0 1 72 295.514] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -295.514] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 295.514 Td
-/F134_0 9.9626 Tf
-(BZ_MEM_ERROR) 71.7307 Tj
-[1 0 0 1 143.731 295.514] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -143.731 -295.514] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-143.731 295.514 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
-[1 0 0 1 72 294.204] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -284.242] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 273.597 Td
-/F130_0 9.9626 Tf
-(Possible) 33.2153 Tj
--250 TJm
-(assignments) 48.7072 Tj
--250 TJm
-(to) 7.7509 Tj
-[1 0 0 1 169.144 273.597] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -169.144 -273.597] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-169.144 273.597 Td
-/F134_0 9.9626 Tf
-(bzerror) 41.8429 Tj
-[1 0 0 1 210.987 273.597] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -210.987 -273.597] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-210.987 273.597 Td
-/F130_0 9.9626 Tf
-(:) 2.7696 Tj
-[1 0 0 1 72 271.44] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -168.369] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 167.372 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 163.786] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -262.075] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 262.075 Td
-/F134_0 9.9626 Tf
-(BZ_CONFIG_ERROR) 89.6634 Tj
-98.4879 250.12 Td
-(if) 11.9551 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(library) 41.8429 Tj
--426 TJm
-(has) 17.9327 Tj
--426 TJm
-(been) 23.9102 Tj
--426 TJm
-(mis-compiled) 71.7307 Tj
-90 238.165 Td
-(BZ_PARAM_ERROR) 83.6858 Tj
-98.4879 226.209 Td
-(if) 11.9551 Tj
--426 TJm
-(f) 5.97756 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(NULL) 23.9102 Tj
-98.4879 214.254 Td
-(or) 11.9551 Tj
--426 TJm
-(small) 29.8878 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(neither) 41.8429 Tj
--426 TJm
-(0) 5.97756 Tj
--426 TJm
-(nor) 17.9327 Tj
--426 TJm
-(1) 5.97756 Tj
-98.4879 202.299 Td
-(or) 11.9551 Tj
--426 TJm
-(\() 5.97756 Tj
--426 TJm
-(unused) 35.8654 Tj
--426 TJm
-(==) 11.9551 Tj
--426 TJm
-(NULL) 23.9102 Tj
--426 TJm
-(&&) 11.9551 Tj
--426 TJm
-(nUnused) 41.8429 Tj
--426 TJm
-(!=) 11.9551 Tj
--426 TJm
-(0) 5.97756 Tj
--426 TJm
-(\)) 5.97756 Tj
-98.4879 190.344 Td
-(or) 11.9551 Tj
--426 TJm
-(\() 5.97756 Tj
--426 TJm
-(unused) 35.8654 Tj
--426 TJm
-(!=) 11.9551 Tj
--426 TJm
-(NULL) 23.9102 Tj
--426 TJm
-(&&) 11.9551 Tj
--426 TJm
-(!\(0) 17.9327 Tj
--426 TJm
-(<=) 11.9551 Tj
--426 TJm
-(nUnused) 41.8429 Tj
--426 TJm
-(<=) 11.9551 Tj
--426 TJm
-(BZ_MAX_UNUSED\)) 83.6858 Tj
--426 TJm
-(\)) 5.97756 Tj
-90 178.389 Td
-(BZ_IO_ERROR) 65.7532 Tj
-98.4879 166.434 Td
-(if) 11.9551 Tj
--426 TJm
-(ferror\(f\)) 53.798 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(nonzero) 41.8429 Tj
-90 154.478 Td
-(BZ_MEM_ERROR) 71.7307 Tj
-98.4879 142.523 Td
-(if) 11.9551 Tj
--426 TJm
-(insufficient) 71.7307 Tj
--426 TJm
-(memory) 35.8654 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(available) 53.798 Tj
-90 130.568 Td
-(BZ_OK) 29.8878 Tj
-98.4879 118.613 Td
-(otherwise.) 59.7756 Tj
-[1 0 0 1 72 103.071] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -93.1085] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 81.1533 Td
-/F130_0 9.9626 Tf
-(Possible) 33.2153 Tj
--250 TJm
-(return) 23.7907 Tj
--250 TJm
-(v) 4.9813 Tj
-25 TJm
-(alues:) 23.2427 Tj
-[1 0 0 1 72 81.0538] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -30.202] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 374.394 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.9737] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 40.5726 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -493.841 -51.071] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-534.414 51.071 Td
-/F130_0 9.9626 Tf
-(19) 9.9626 Tj
-[1 0 0 1 453.269 50.8519] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 93.5985 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.2765 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-Q
-showpage
-%%PageTrailer
-pdfEndPage
-%%Page: 23 23
-%%BeginPageSetup
-%%PageOrientation: Portrait
-pdfStartPage
-0 0 612 792 re W
-%%EndPageSetup
-[] 0 d
-1 i
-0 j
-0 J
-10 M
-1 w
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-false op
-false OP
-0 0 612 792 re
-W
-q
-[1 0 0 1 72 741.554] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 14.4459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 187.197 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 -8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 76.4979 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -342.569 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-419.067 749.245 Td
-/F130_0 9.9626 Tf
-(Programming) 54.7943 Tj
--250 TJm
-(with) 17.7135 Tj
-[1 0 0 1 496.556 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -496.556 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-496.556 749.245 Td
-/F134_0 9.9626 Tf
-(libbzip2) 47.8205 Tj
-[1 0 0 1 544.376 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -278.305 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 280.796 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.974 -5.0363] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -0.4981] cm
-q
-[] 0 d
-0 J
-0.4981 w
-0 0.2491 m
-475.465 0.2491 l
-S
-Q
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 479.251 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -81.33] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 59.7758 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 56.1892] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -711.631] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 711.631 Td
-/F134_0 9.9626 Tf
-(Pointer) 41.8429 Tj
--426 TJm
-(to) 11.9551 Tj
--426 TJm
-(an) 11.9551 Tj
--426 TJm
-(abstract) 47.8205 Tj
--426 TJm
-(BZFILE) 35.8654 Tj
-98.4879 699.676 Td
-(if) 11.9551 Tj
--426 TJm
-(bzerror) 41.8429 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(BZ_OK) 29.8878 Tj
-90 687.721 Td
-(NULL) 23.9102 Tj
-98.4879 675.766 Td
-(otherwise) 53.798 Tj
-[1 0 0 1 72 660.224] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5493] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -650.261] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 638.306 Td
-/F130_0 9.9626 Tf
-(Allo) 17.7135 Tj
-25 TJm
-(w) 7.193 Tj
-10 TJm
-(able) 16.5977 Tj
--250 TJm
-(ne) 9.40469 Tj
-15 TJm
-(xt) 7.7509 Tj
--250 TJm
-(actions:) 30.9936 Tj
-[1 0 0 1 72 638.207] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -60.7721] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 59.7758 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 56.1893] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -628.842] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 628.842 Td
-/F134_0 9.9626 Tf
-(BZ2_bzRead) 59.7756 Tj
-98.4879 616.887 Td
-(if) 11.9551 Tj
--426 TJm
-(bzerror) 41.8429 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(BZ_OK) 29.8878 Tj
-90 604.932 Td
-(BZ2_bzClose) 65.7532 Tj
-98.4879 592.976 Td
-(otherwise) 53.798 Tj
-[1 0 0 1 72 577.435] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -567.472] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 546.813 Td
-/F122_0 17.2154 Tf
-(3.4.2.) 43.0729 Tj
-[1 0 0 1 119.858 546.813] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -119.858 -546.813] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-119.858 546.813 Td
-/F392_0 17.2154 Tf
-(BZ2_bzRead) 103.292 Tj
-[1 0 0 1 223.15 546.813] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -151.15 -2.3326] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -24.9066] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 23.9103 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 20.3237] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -535.116] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 535.116 Td
-/F134_0 9.9626 Tf
-(int) 17.9327 Tj
--426 TJm
-(BZ2_bzRead) 59.7756 Tj
--426 TJm
-(\() 5.97756 Tj
--426 TJm
-(int) 17.9327 Tj
-208.595 533.373 Td
-(*) 5.97756 Tj
-214.572 535.116 Td
-(bzerror,) 47.8205 Tj
--426 TJm
-(BZFILE) 35.8654 Tj
-306.747 533.373 Td
-(*) 5.97756 Tj
-312.724 535.116 Td
-(b,) 11.9551 Tj
--426 TJm
-(void) 23.9102 Tj
-357.077 533.373 Td
-(*) 5.97756 Tj
-363.055 535.116 Td
-(buf,) 23.9102 Tj
--426 TJm
-(int) 17.9327 Tj
--426 TJm
-(len) 17.9327 Tj
--426 TJm
-(\);) 11.9551 Tj
-[1 0 0 1 72 519.574] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -509.612] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 497.656 Td
-/F130_0 9.9626 Tf
-(Reads) 24.3486 Tj
--285 TJm
-(up) 9.9626 Tj
--284 TJm
-(to) 7.7509 Tj
-[1 0 0 1 122.569 497.656] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -122.569 -497.656] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-122.569 497.656 Td
-/F134_0 9.9626 Tf
-(len) 17.9327 Tj
-[1 0 0 1 140.501 497.656] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -140.501 -497.656] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-143.337 497.656 Td
-/F130_0 9.9626 Tf
-(\(uncompressed\)) 63.6311 Tj
--285 TJm
-(bytes) 21.031 Tj
--284 TJm
-(from) 19.3673 Tj
--285 TJm
-(the) 12.1743 Tj
--284 TJm
-(compressed) 47.0334 Tj
--285 TJm
-(\002le) 12.7322 Tj
-[1 0 0 1 336.319 497.656] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -336.319 -497.656] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-336.319 497.656 Td
-/F134_0 9.9626 Tf
-(b) 5.97756 Tj
-[1 0 0 1 342.296 497.656] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -342.296 -497.656] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-345.132 497.656 Td
-/F130_0 9.9626 Tf
-(into) 15.5018 Tj
--285 TJm
-(the) 12.1743 Tj
--284 TJm
-(b) 4.9813 Tj
-20 TJm
-(uf) 8.29885 Tj
-25 TJm
-(fer) 11.0585 Tj
-[1 0 0 1 405.205 497.656] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -405.205 -497.656] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-405.205 497.656 Td
-/F134_0 9.9626 Tf
-(buf) 17.9327 Tj
-[1 0 0 1 423.137 497.656] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -423.137 -497.656] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-423.137 497.656 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
--828 TJm
-(If) 6.63509 Tj
--284 TJm
-(the) 12.1743 Tj
--285 TJm
-(read) 17.1456 Tj
--285 TJm
-(w) 7.193 Tj
-10 TJm
-(as) 8.29885 Tj
--284 TJm
-(successful,) 43.4369 Tj
-[1 0 0 1 72 485.701] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -485.701] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 485.701 Td
-/F134_0 9.9626 Tf
-(bzerror) 41.8429 Tj
-[1 0 0 1 113.843 485.701] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -113.843 -485.701] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-117.36 485.701 Td
-/F130_0 9.9626 Tf
-(is) 6.64505 Tj
--353 TJm
-(set) 11.0684 Tj
--353 TJm
-(to) 7.7509 Tj
-[1 0 0 1 153.374 485.701] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -153.374 -485.701] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-153.374 485.701 Td
-/F134_0 9.9626 Tf
-(BZ_OK) 29.8878 Tj
-[1 0 0 1 183.262 485.701] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -183.262 -485.701] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-186.778 485.701 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
--353 TJm
-(the) 12.1743 Tj
--353 TJm
-(number) 30.4357 Tj
--353 TJm
-(of) 8.29885 Tj
--353 TJm
-(bytes) 21.031 Tj
--353 TJm
-(read) 17.1456 Tj
--353 TJm
-(is) 6.64505 Tj
--353 TJm
-(returned.) 35.686 Tj
--1238 TJm
-(If) 6.63509 Tj
--353 TJm
-(the) 12.1743 Tj
--353 TJm
-(logical) 27.1182 Tj
--353 TJm
-(end-of-stream) 55.8802 Tj
--353 TJm
-(w) 7.193 Tj
-10 TJm
-(as) 8.29885 Tj
--353 TJm
-(detected,) 35.686 Tj
-[1 0 0 1 72 473.746] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -473.746] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 473.746 Td
-/F134_0 9.9626 Tf
-(bzerror) 41.8429 Tj
-[1 0 0 1 113.843 473.746] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -113.843 -473.746] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-116.795 473.746 Td
-/F130_0 9.9626 Tf
-(will) 15.5018 Tj
--296 TJm
-(be) 9.40469 Tj
--297 TJm
-(set) 11.0684 Tj
--296 TJm
-(to) 7.7509 Tj
-[1 0 0 1 172.329 473.746] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -172.329 -473.746] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-172.329 473.746 Td
-/F134_0 9.9626 Tf
-(BZ_STREAM_END) 77.7083 Tj
-[1 0 0 1 250.037 473.746] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -250.037 -473.746] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-250.037 473.746 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--296 TJm
-(and) 14.386 Tj
--297 TJm
-(the) 12.1743 Tj
--296 TJm
-(number) 30.4357 Tj
--296 TJm
-(of) 8.29885 Tj
--297 TJm
-(bytes) 21.031 Tj
--296 TJm
-(read) 17.1456 Tj
--296 TJm
-(is) 6.64505 Tj
--296 TJm
-(returned.) 35.686 Tj
--898 TJm
-(All) 12.7322 Tj
--297 TJm
-(other) 20.4731 Tj
-[1 0 0 1 470 473.746] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -470 -473.746] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-470 473.746 Td
-/F134_0 9.9626 Tf
-(bzerror) 41.8429 Tj
-[1 0 0 1 511.843 473.746] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -511.843 -473.746] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-514.795 473.746 Td
-/F130_0 9.9626 Tf
-(v) 4.9813 Tj
-25 TJm
-(alues) 20.4731 Tj
-72 461.791 Td
-(denote) 26.5603 Tj
--250 TJm
-(an) 9.40469 Tj
--250 TJm
-(error) 19.3573 Tj
-55 TJm
-(.) 2.49065 Tj
-[1 0 0 1 72 461.691] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -451.729] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 439.873 Td
-/F134_0 9.9626 Tf
-(BZ2_bzRead) 59.7756 Tj
-[1 0 0 1 131.776 439.873] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -131.776 -439.873] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-134.224 439.873 Td
-/F130_0 9.9626 Tf
-(will) 15.5018 Tj
--246 TJm
-(supply) 26.5703 Tj
-[1 0 0 1 181.193 439.873] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -181.193 -439.873] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-181.193 439.873 Td
-/F134_0 9.9626 Tf
-(len) 17.9327 Tj
-[1 0 0 1 199.126 439.873] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -199.126 -439.873] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-201.575 439.873 Td
-/F130_0 9.9626 Tf
-(bytes,) 23.5217 Tj
--247 TJm
-(unless) 24.9065 Tj
--245 TJm
-(the) 12.1743 Tj
--246 TJm
-(logical) 27.1182 Tj
--246 TJm
-(stream) 26.5603 Tj
--246 TJm
-(end) 14.386 Tj
--245 TJm
-(is) 6.64505 Tj
--246 TJm
-(detected) 33.1954 Tj
--246 TJm
-(or) 8.29885 Tj
--246 TJm
-(an) 9.40469 Tj
--246 TJm
-(error) 19.3573 Tj
--245 TJm
-(occurs.) 28.493 Tj
--617 TJm
-(Because) 33.1954 Tj
--246 TJm
-(of) 8.29885 Tj
--246 TJm
-(this,) 16.8866 Tj
--247 TJm
-(it) 5.53921 Tj
-72 427.918 Td
-(is) 6.64505 Tj
--231 TJm
-(possible) 32.6574 Tj
--231 TJm
-(to) 7.7509 Tj
--231 TJm
-(detect) 23.7907 Tj
--231 TJm
-(the) 12.1743 Tj
--231 TJm
-(stream) 26.5603 Tj
--231 TJm
-(end) 14.386 Tj
--232 TJm
-(by) 9.9626 Tj
--231 TJm
-(observing) 39.2925 Tj
--231 TJm
-(when) 21.579 Tj
--231 TJm
-(the) 12.1743 Tj
--231 TJm
-(number) 30.4357 Tj
--231 TJm
-(of) 8.29885 Tj
--231 TJm
-(bytes) 21.031 Tj
--231 TJm
-(returned) 33.1954 Tj
--231 TJm
-(is) 6.64505 Tj
--231 TJm
-(less) 14.9439 Tj
--231 TJm
-(than) 17.1556 Tj
--232 TJm
-(the) 12.1743 Tj
--231 TJm
-(number) 30.4357 Tj
--231 TJm
-(requested.) 40.6673 Tj
-72 415.963 Td
-(Ne) 11.6164 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(ertheless,) 37.3498 Tj
--309 TJm
-(this) 14.396 Tj
--297 TJm
-(is) 6.64505 Tj
--298 TJm
-(re) 7.74094 Tj
-15 TJm
-(g) 4.9813 Tj
-5 TJm
-(arded) 22.1269 Tj
--297 TJm
-(as) 8.29885 Tj
--297 TJm
-(inadvisable;) 48.1492 Tj
--321 TJm
-(you) 14.9439 Tj
--298 TJm
-(should) 26.5703 Tj
--297 TJm
-(instead) 28.224 Tj
--297 TJm
-(check) 23.2328 Tj
-[1 0 0 1 360.631 415.963] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -360.631 -415.963] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-360.631 415.963 Td
-/F134_0 9.9626 Tf
-(bzerror) 41.8429 Tj
-[1 0 0 1 402.475 415.963] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -402.475 -415.963] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-405.437 415.963 Td
-/F130_0 9.9626 Tf
-(after) 18.2515 Tj
--297 TJm
-(e) 4.42339 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(ery) 12.7222 Tj
--298 TJm
-(call) 14.386 Tj
--297 TJm
-(and) 14.386 Tj
--297 TJm
-(w) 7.193 Tj
-10 TJm
-(atch) 16.5977 Tj
--298 TJm
-(out) 12.7322 Tj
--297 TJm
-(for) 11.6164 Tj
-[1 0 0 1 72 404.008] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -404.008] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 404.008 Td
-/F134_0 9.9626 Tf
-(BZ_STREAM_END) 77.7083 Tj
-[1 0 0 1 149.709 404.008] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -149.709 -404.008] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-149.709 404.008 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
-[1 0 0 1 72 402.698] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -392.735] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 382.09 Td
-/F130_0 9.9626 Tf
-(Internally) 38.7346 Tj
-65 TJm
-(,) 2.49065 Tj
-[1 0 0 1 117.541 382.09] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -117.541 -382.09] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-117.541 382.09 Td
-/F134_0 9.9626 Tf
-(BZ2_bzRead) 59.7756 Tj
-[1 0 0 1 177.317 382.09] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -177.317 -382.09] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-181.786 382.09 Td
-/F130_0 9.9626 Tf
-(copies) 25.4544 Tj
--449 TJm
-(data) 16.5977 Tj
--448 TJm
-(from) 19.3673 Tj
--449 TJm
-(the) 12.1743 Tj
--448 TJm
-(compressed) 47.0334 Tj
--449 TJm
-(\002le) 12.7322 Tj
--448 TJm
-(in) 7.7509 Tj
--449 TJm
-(chunks) 28.224 Tj
--449 TJm
-(of) 8.29885 Tj
--448 TJm
-(size) 15.4918 Tj
-[1 0 0 1 419.602 382.09] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -419.602 -382.09] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-419.602 382.09 Td
-/F134_0 9.9626 Tf
-(BZ_MAX_UNUSED) 77.7083 Tj
-[1 0 0 1 497.31 382.09] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -497.31 -382.09] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-501.778 382.09 Td
-/F130_0 9.9626 Tf
-(bytes) 21.031 Tj
--449 TJm
-(be-) 12.7222 Tj
-72 370.135 Td
-(fore) 16.0398 Tj
--414 TJm
-(decompressing) 59.7656 Tj
--414 TJm
-(it.) 8.02986 Tj
--1605 TJm
-(If) 6.63509 Tj
--415 TJm
-(the) 12.1743 Tj
--414 TJm
-(\002le) 12.7322 Tj
--414 TJm
-(contains) 33.2053 Tj
--414 TJm
-(more) 20.4731 Tj
--414 TJm
-(bytes) 21.031 Tj
--415 TJm
-(than) 17.1556 Tj
--414 TJm
-(strictly) 27.6761 Tj
--414 TJm
-(needed) 28.2141 Tj
--414 TJm
-(to) 7.7509 Tj
--414 TJm
-(reach) 21.569 Tj
--414 TJm
-(the) 12.1743 Tj
--415 TJm
-(logical) 27.1182 Tj
--414 TJm
-(end-of-stream,) 58.3709 Tj
-[1 0 0 1 72 358.18] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -358.18] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 358.18 Td
-/F134_0 9.9626 Tf
-(BZ2_bzRead) 59.7756 Tj
-[1 0 0 1 131.776 358.18] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -131.776 -358.18] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-134.749 358.18 Td
-/F130_0 9.9626 Tf
-(will) 15.5018 Tj
--298 TJm
-(almost) 26.5703 Tj
--299 TJm
-(certainly) 34.8591 Tj
--298 TJm
-(read) 17.1456 Tj
--299 TJm
-(some) 21.031 Tj
--298 TJm
-(of) 8.29885 Tj
--299 TJm
-(the) 12.1743 Tj
--298 TJm
-(trailing) 28.782 Tj
--298 TJm
-(data) 16.5977 Tj
--299 TJm
-(before) 25.4445 Tj
--298 TJm
-(signalling) 39.3025 Tj
-[1 0 0 1 413.162 358.18] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -413.162 -358.18] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-413.162 358.18 Td
-/F134_0 9.9626 Tf
-(BZ_SEQUENCE_END) 89.6634 Tj
-[1 0 0 1 502.826 358.18] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -502.826 -358.18] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-502.826 358.18 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
--597 TJm
-(T) 6.08715 Tj
-80 TJm
-(o) 4.9813 Tj
--298 TJm
-(col-) 15.4918 Tj
-72 346.224 Td
-(lect) 14.386 Tj
--242 TJm
-(the) 12.1743 Tj
--242 TJm
-(read) 17.1456 Tj
--243 TJm
-(b) 4.9813 Tj
-20 TJm
-(ut) 7.7509 Tj
--242 TJm
-(unused) 28.224 Tj
--242 TJm
-(data) 16.5977 Tj
--242 TJm
-(once) 18.8094 Tj
-[1 0 0 1 208.759 346.224] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -208.759 -346.224] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-208.759 346.224 Td
-/F134_0 9.9626 Tf
-(BZ_SEQUENCE_END) 89.6634 Tj
-[1 0 0 1 298.423 346.224] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -298.423 -346.224] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-300.835 346.224 Td
-/F130_0 9.9626 Tf
-(has) 13.2801 Tj
--242 TJm
-(appeared,) 38.4457 Tj
--244 TJm
-(call) 14.386 Tj
-[1 0 0 1 374.201 346.224] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -374.201 -346.224] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-374.201 346.224 Td
-/F134_0 9.9626 Tf
-(BZ2_bzReadGetUnused) 113.574 Tj
-[1 0 0 1 487.775 346.224] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -487.775 -346.224] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-490.188 346.224 Td
-/F130_0 9.9626 Tf
-(immediately) 49.813 Tj
-72 334.269 Td
-(before) 25.4445 Tj
-[1 0 0 1 99.935 334.269] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -99.935 -334.269] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-99.935 334.269 Td
-/F134_0 9.9626 Tf
-(BZ2_bzReadClose) 89.6634 Tj
-[1 0 0 1 189.599 334.269] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -189.599 -334.269] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-189.599 334.269 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
-[1 0 0 1 72 332.959] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -322.996] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 312.351 Td
-/F130_0 9.9626 Tf
-(Possible) 33.2153 Tj
--250 TJm
-(assignments) 48.7072 Tj
--250 TJm
-(to) 7.7509 Tj
-[1 0 0 1 169.144 312.351] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -169.144 -312.351] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-169.144 312.351 Td
-/F134_0 9.9626 Tf
-(bzerror) 41.8429 Tj
-[1 0 0 1 210.987 312.351] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -210.987 -312.351] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-210.987 312.351 Td
-/F130_0 9.9626 Tf
-(:) 2.7696 Tj
-[1 0 0 1 72 310.195] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -259.343] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 374.394 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.8541] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 40.5726 -6.7545] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -493.841 -50.9514] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-534.414 50.9514 Td
-/F130_0 9.9626 Tf
-(20) 9.9626 Tj
-[1 0 0 1 453.269 50.8518] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 93.5985 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.2765 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-Q
-showpage
-%%PageTrailer
-pdfEndPage
-%%Page: 24 24
-%%BeginPageSetup
-%%PageOrientation: Portrait
-pdfStartPage
-0 0 612 792 re W
-%%EndPageSetup
-[] 0 d
-1 i
-0 j
-0 J
-10 M
-1 w
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-false op
-false OP
-0 0 612 792 re
-W
-q
-[1 0 0 1 72 741.554] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 14.4459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 187.197 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 -8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 76.4979 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -342.569 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-419.067 749.245 Td
-/F130_0 9.9626 Tf
-(Programming) 54.7943 Tj
--250 TJm
-(with) 17.7135 Tj
-[1 0 0 1 496.556 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -496.556 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-496.556 749.245 Td
-/F134_0 9.9626 Tf
-(libbzip2) 47.8205 Tj
-[1 0 0 1 544.376 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -278.305 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 280.796 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.974 -5.0363] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -0.4981] cm
-q
-[] 0 d
-0 J
-0.4981 w
-0 0.2491 m
-475.465 0.2491 l
-S
-Q
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 479.251 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -284.568] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 263.014 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 259.427] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -711.631] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 711.631 Td
-/F134_0 9.9626 Tf
-(BZ_PARAM_ERROR) 83.6858 Tj
-98.4879 699.676 Td
-(if) 11.9551 Tj
--426 TJm
-(b) 5.97756 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(NULL) 23.9102 Tj
--426 TJm
-(or) 11.9551 Tj
--426 TJm
-(buf) 17.9327 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(NULL) 23.9102 Tj
--426 TJm
-(or) 11.9551 Tj
--426 TJm
-(len) 17.9327 Tj
--426 TJm
-(<) 5.97756 Tj
--426 TJm
-(0) 5.97756 Tj
-90 687.721 Td
-(BZ_SEQUENCE_ERROR) 101.619 Tj
-98.4879 675.766 Td
-(if) 11.9551 Tj
--426 TJm
-(b) 5.97756 Tj
--426 TJm
-(was) 17.9327 Tj
--426 TJm
-(opened) 35.8654 Tj
--426 TJm
-(with) 23.9102 Tj
--426 TJm
-(BZ2_bzWriteOpen) 89.6634 Tj
-90 663.811 Td
-(BZ_IO_ERROR) 65.7532 Tj
-98.4879 651.856 Td
-(if) 11.9551 Tj
--426 TJm
-(there) 29.8878 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(an) 11.9551 Tj
--426 TJm
-(error) 29.8878 Tj
--426 TJm
-(reading) 41.8429 Tj
--426 TJm
-(from) 23.9102 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(compressed) 59.7756 Tj
--426 TJm
-(file) 23.9102 Tj
-90 639.9 Td
-(BZ_UNEXPECTED_EOF) 101.619 Tj
-98.4879 627.945 Td
-(if) 11.9551 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(compressed) 59.7756 Tj
--426 TJm
-(file) 23.9102 Tj
--426 TJm
-(ended) 29.8878 Tj
--426 TJm
-(before) 35.8654 Tj
-98.4879 615.99 Td
-(the) 17.9327 Tj
--426 TJm
-(logical) 41.8429 Tj
--426 TJm
-(end-of-stream) 77.7083 Tj
--426 TJm
-(was) 17.9327 Tj
--426 TJm
-(detected) 47.8205 Tj
-90 604.035 Td
-(BZ_DATA_ERROR) 77.7083 Tj
-98.4879 592.08 Td
-(if) 11.9551 Tj
--426 TJm
-(a) 5.97756 Tj
--426 TJm
-(data) 23.9102 Tj
--426 TJm
-(integrity) 53.798 Tj
--426 TJm
-(error) 29.8878 Tj
--426 TJm
-(was) 17.9327 Tj
--426 TJm
-(detected) 47.8205 Tj
--426 TJm
-(in) 11.9551 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(compressed) 59.7756 Tj
--426 TJm
-(stream) 35.8654 Tj
-90 580.125 Td
-(BZ_DATA_ERROR_MAGIC) 113.574 Tj
-98.4879 568.169 Td
-(if) 11.9551 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(stream) 35.8654 Tj
--426 TJm
-(does) 23.9102 Tj
--426 TJm
-(not) 17.9327 Tj
--426 TJm
-(begin) 29.8878 Tj
--426 TJm
-(with) 23.9102 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(requisite) 53.798 Tj
--426 TJm
-(header) 35.8654 Tj
--426 TJm
-(bytes) 29.8878 Tj
-98.4879 556.214 Td
-(\(ie,) 23.9102 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(not) 17.9327 Tj
--426 TJm
-(a) 5.97756 Tj
--426 TJm
-(bzip2) 29.8878 Tj
--426 TJm
-(data) 23.9102 Tj
--426 TJm
-(file\).) 35.8654 Tj
--852 TJm
-(This) 23.9102 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(really) 35.8654 Tj
-98.4879 544.259 Td
-(a) 5.97756 Tj
--426 TJm
-(special) 41.8429 Tj
--426 TJm
-(case) 23.9102 Tj
--426 TJm
-(of) 11.9551 Tj
--426 TJm
-(BZ_DATA_ERROR.) 83.6858 Tj
-90 532.304 Td
-(BZ_MEM_ERROR) 71.7307 Tj
-98.4879 520.349 Td
-(if) 11.9551 Tj
--426 TJm
-(insufficient) 71.7307 Tj
--426 TJm
-(memory) 35.8654 Tj
--426 TJm
-(was) 17.9327 Tj
--426 TJm
-(available) 53.798 Tj
-90 508.394 Td
-(BZ_STREAM_END) 77.7083 Tj
-98.4879 496.438 Td
-(if) 11.9551 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(logical) 41.8429 Tj
--426 TJm
-(end) 17.9327 Tj
--426 TJm
-(of) 11.9551 Tj
--426 TJm
-(stream) 35.8654 Tj
--426 TJm
-(was) 17.9327 Tj
--426 TJm
-(detected.) 53.798 Tj
-90 484.483 Td
-(BZ_OK) 29.8878 Tj
-98.4879 472.528 Td
-(otherwise.) 59.7756 Tj
-[1 0 0 1 72 456.986] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -447.024] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 435.068 Td
-/F130_0 9.9626 Tf
-(Possible) 33.2153 Tj
--250 TJm
-(return) 23.7907 Tj
--250 TJm
-(v) 4.9813 Tj
-25 TJm
-(alues:) 23.2427 Tj
-[1 0 0 1 72 434.969] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -60.7721] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 59.7758 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 56.1893] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -425.604] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 425.604 Td
-/F134_0 9.9626 Tf
-(number) 35.8654 Tj
--426 TJm
-(of) 11.9551 Tj
--426 TJm
-(bytes) 29.8878 Tj
--426 TJm
-(read) 23.9102 Tj
-98.4879 413.649 Td
-(if) 11.9551 Tj
--426 TJm
-(bzerror) 41.8429 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(BZ_OK) 29.8878 Tj
--426 TJm
-(or) 11.9551 Tj
--426 TJm
-(BZ_STREAM_END) 77.7083 Tj
-90 401.694 Td
-(undefined) 53.798 Tj
-98.4879 389.739 Td
-(otherwise) 53.798 Tj
-[1 0 0 1 72 374.197] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -364.234] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 352.279 Td
-/F130_0 9.9626 Tf
-(Allo) 17.7135 Tj
-25 TJm
-(w) 7.193 Tj
-10 TJm
-(able) 16.5977 Tj
--250 TJm
-(ne) 9.40469 Tj
-15 TJm
-(xt) 7.7509 Tj
--250 TJm
-(actions:) 30.9936 Tj
-[1 0 0 1 72 352.18] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -84.6825] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 83.6862 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 80.0996] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -342.815] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 342.815 Td
-/F134_0 9.9626 Tf
-(collect) 41.8429 Tj
--426 TJm
-(data) 23.9102 Tj
--426 TJm
-(from) 23.9102 Tj
--426 TJm
-(buf,) 23.9102 Tj
--426 TJm
-(then) 23.9102 Tj
--426 TJm
-(BZ2_bzRead) 59.7756 Tj
--426 TJm
-(or) 11.9551 Tj
--426 TJm
-(BZ2_bzReadClose) 89.6634 Tj
-98.4879 330.859 Td
-(if) 11.9551 Tj
--426 TJm
-(bzerror) 41.8429 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(BZ_OK) 29.8878 Tj
-90 318.904 Td
-(collect) 41.8429 Tj
--426 TJm
-(data) 23.9102 Tj
--426 TJm
-(from) 23.9102 Tj
--426 TJm
-(buf,) 23.9102 Tj
--426 TJm
-(then) 23.9102 Tj
--426 TJm
-(BZ2_bzReadClose) 89.6634 Tj
--426 TJm
-(or) 11.9551 Tj
--426 TJm
-(BZ2_bzReadGetUnused) 113.574 Tj
-98.4879 306.949 Td
-(if) 11.9551 Tj
--426 TJm
-(bzerror) 41.8429 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(BZ_SEQUENCE_END) 89.6634 Tj
-90 294.994 Td
-(BZ2_bzReadClose) 89.6634 Tj
-98.4879 283.039 Td
-(otherwise) 53.798 Tj
-[1 0 0 1 72 267.497] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -257.534] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 236.876 Td
-/F122_0 17.2154 Tf
-(3.4.3.) 43.0729 Tj
-[1 0 0 1 119.858 236.876] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -119.858 -236.876] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-119.858 236.876 Td
-/F392_0 17.2154 Tf
-(BZ2_bzReadGetUnused) 196.256 Tj
-[1 0 0 1 316.114 236.876] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -244.114 -2.3327] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -36.8617] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 35.8655 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 32.2789] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -225.178] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 225.178 Td
-/F134_0 9.9626 Tf
-(void) 23.9102 Tj
--426 TJm
-(BZ2_bzReadGetUnused\() 119.551 Tj
--426 TJm
-(int) 17.9327 Tj
-259.883 223.435 Td
-(*) 5.97756 Tj
-270.104 225.178 Td
-(bzerror,) 47.8205 Tj
--426 TJm
-(BZFILE) 35.8654 Tj
-362.278 223.435 Td
-(*) 5.97756 Tj
-368.256 225.178 Td
-(b,) 11.9551 Tj
-200.343 213.223 Td
-(void) 23.9102 Tj
-224.254 211.48 Td
-(**) 11.9551 Tj
-240.453 213.223 Td
-(unused,) 41.8429 Tj
--426 TJm
-(int) 17.9327 Tj
-304.473 211.48 Td
-(*) 5.97756 Tj
-314.694 213.223 Td
-(nUnused) 41.8429 Tj
--426 TJm
-(\);) 11.9551 Tj
-[1 0 0 1 72 197.681] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -187.719] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 175.764 Td
-/F130_0 9.9626 Tf
-(Returns) 30.9936 Tj
--435 TJm
-(data) 16.5977 Tj
--435 TJm
-(which) 24.3486 Tj
--435 TJm
-(w) 7.193 Tj
-10 TJm
-(as) 8.29885 Tj
--435 TJm
-(read) 17.1456 Tj
--435 TJm
-(from) 19.3673 Tj
--435 TJm
-(the) 12.1743 Tj
--435 TJm
-(compressed) 47.0334 Tj
--435 TJm
-(\002le) 12.7322 Tj
--435 TJm
-(b) 4.9813 Tj
-20 TJm
-(ut) 7.7509 Tj
--435 TJm
-(w) 7.193 Tj
-10 TJm
-(as) 8.29885 Tj
--435 TJm
-(not) 12.7322 Tj
--435 TJm
-(needed) 28.2141 Tj
--435 TJm
-(to) 7.7509 Tj
--435 TJm
-(get) 12.1743 Tj
--435 TJm
-(to) 7.7509 Tj
--435 TJm
-(the) 12.1743 Tj
--435 TJm
-(logical) 27.1182 Tj
--435 TJm
-(end-of-stream.) 58.3709 Tj
-[1 0 0 1 72 163.809] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -163.809] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 162.065 Td
-/F134_0 9.9626 Tf
-(*) 5.97756 Tj
-77.9776 163.809 Td
-(unused) 35.8654 Tj
-[1 0 0 1 113.843 163.809] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -113.843 -163.809] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-117.2 163.809 Td
-/F130_0 9.9626 Tf
-(is) 6.64505 Tj
--337 TJm
-(set) 11.0684 Tj
--337 TJm
-(to) 7.7509 Tj
--337 TJm
-(the) 12.1743 Tj
--337 TJm
-(address) 29.8778 Tj
--337 TJm
-(of) 8.29885 Tj
--336 TJm
-(the) 12.1743 Tj
--337 TJm
-(data,) 19.0883 Tj
--359 TJm
-(and) 14.386 Tj
-[1 0 0 1 269.089 163.809] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -269.089 -163.809] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-269.089 162.065 Td
-/F134_0 9.9626 Tf
-(*) 5.97756 Tj
-275.067 163.809 Td
-(nUnused) 41.8429 Tj
-[1 0 0 1 316.91 163.809] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -316.91 -163.809] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-320.267 163.809 Td
-/F130_0 9.9626 Tf
-(to) 7.7509 Tj
--337 TJm
-(the) 12.1743 Tj
--337 TJm
-(number) 30.4357 Tj
--337 TJm
-(of) 8.29885 Tj
--337 TJm
-(bytes.) 23.5217 Tj
-[1 0 0 1 427.247 163.809] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -427.247 -163.809] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-427.247 162.065 Td
-/F134_0 9.9626 Tf
-(*) 5.97756 Tj
-433.225 163.809 Td
-(nUnused) 41.8429 Tj
-[1 0 0 1 475.068 163.809] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -475.068 -163.809] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-478.425 163.809 Td
-/F130_0 9.9626 Tf
-(will) 15.5018 Tj
--337 TJm
-(be) 9.40469 Tj
--337 TJm
-(set) 11.0684 Tj
--337 TJm
-(to) 7.7509 Tj
--337 TJm
-(a) 4.42339 Tj
-72 151.853 Td
-(v) 4.9813 Tj
-25 TJm
-(alue) 16.5977 Tj
--250 TJm
-(between) 33.1954 Tj
-[1 0 0 1 131.506 151.853] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -131.506 -151.853] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-131.506 151.853 Td
-/F134_0 9.9626 Tf
-(0) 5.97756 Tj
-[1 0 0 1 137.484 151.853] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -137.484 -151.853] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-139.975 151.853 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 156.851 151.853] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -156.851 -151.853] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-156.851 151.853 Td
-/F134_0 9.9626 Tf
-(BZ_MAX_UNUSED) 77.7083 Tj
-[1 0 0 1 234.56 151.853] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -234.56 -151.853] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-237.05 151.853 Td
-/F130_0 9.9626 Tf
-(inclusi) 26.5703 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(e.) 6.91404 Tj
-[1 0 0 1 72 150.543] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -140.581] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 129.935 Td
-/F130_0 9.9626 Tf
-(This) 17.7135 Tj
--882 TJm
-(function) 33.2053 Tj
--883 TJm
-(may) 17.1556 Tj
--882 TJm
-(only) 17.7135 Tj
--883 TJm
-(be) 9.40469 Tj
--882 TJm
-(called) 23.7907 Tj
--883 TJm
-(once) 18.8094 Tj
-[1 0 0 1 271.332 129.935] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -271.332 -129.935] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-271.332 129.935 Td
-/F134_0 9.9626 Tf
-(BZ2_bzRead) 59.7756 Tj
-[1 0 0 1 331.108 129.935] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -331.108 -129.935] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-339.9 129.935 Td
-/F130_0 9.9626 Tf
-(has) 13.2801 Tj
--882 TJm
-(signalled) 35.9749 Tj
-[1 0 0 1 406.737 129.935] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -406.737 -129.935] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-406.737 129.935 Td
-/F134_0 9.9626 Tf
-(BZ_STREAM_END) 77.7083 Tj
-[1 0 0 1 484.446 129.935] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -484.446 -129.935] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-493.231 129.935 Td
-/F130_0 9.9626 Tf
-(b) 4.9813 Tj
-20 TJm
-(ut) 7.7509 Tj
--882 TJm
-(before) 25.4445 Tj
-[1 0 0 1 72 117.98] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -117.98] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 117.98 Td
-/F134_0 9.9626 Tf
-(BZ2_bzReadClose) 89.6634 Tj
-[1 0 0 1 161.664 117.98] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -161.664 -117.98] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-161.664 117.98 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
-[1 0 0 1 72 116.67] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -106.708] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 96.0625 Td
-/F130_0 9.9626 Tf
-(Possible) 33.2153 Tj
--250 TJm
-(assignments) 48.7072 Tj
--250 TJm
-(to) 7.7509 Tj
-[1 0 0 1 169.144 96.0625] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -169.144 -96.0625] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-169.144 96.0625 Td
-/F134_0 9.9626 Tf
-(bzerror) 41.8429 Tj
-[1 0 0 1 210.987 96.0625] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -210.987 -96.0625] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-210.987 96.0625 Td
-/F130_0 9.9626 Tf
-(:) 2.7696 Tj
-[1 0 0 1 72 93.9057] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -43.0539] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 374.394 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 40.5726 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -493.841 -50.8518] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-534.414 50.8518 Td
-/F130_0 9.9626 Tf
-(21) 9.9626 Tj
-[1 0 0 1 453.269 50.8518] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 93.5985 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.2765 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-Q
-showpage
-%%PageTrailer
-pdfEndPage
-%%Page: 25 25
-%%BeginPageSetup
-%%PageOrientation: Portrait
-pdfStartPage
-0 0 612 792 re W
-%%EndPageSetup
-[] 0 d
-1 i
-0 j
-0 J
-10 M
-1 w
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-false op
-false OP
-0 0 612 792 re
-W
-q
-[1 0 0 1 72 741.554] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 14.4459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 187.197 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 -8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 76.4979 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -342.569 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-419.067 749.245 Td
-/F130_0 9.9626 Tf
-(Programming) 54.7943 Tj
--250 TJm
-(with) 17.7135 Tj
-[1 0 0 1 496.556 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -496.556 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-496.556 749.245 Td
-/F134_0 9.9626 Tf
-(libbzip2) 47.8205 Tj
-[1 0 0 1 544.376 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -278.305 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 280.796 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.974 -5.0363] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -0.4981] cm
-q
-[] 0 d
-0 J
-0.4981 w
-0 0.2491 m
-475.465 0.2491 l
-S
-Q
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 479.251 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -129.151] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 107.597 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 104.01] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -711.631] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 711.631 Td
-/F134_0 9.9626 Tf
-(BZ_PARAM_ERROR) 83.6858 Tj
-98.4879 699.676 Td
-(if) 11.9551 Tj
--426 TJm
-(b) 5.97756 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(NULL) 23.9102 Tj
-98.4879 687.721 Td
-(or) 11.9551 Tj
--426 TJm
-(unused) 35.8654 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(NULL) 23.9102 Tj
--426 TJm
-(or) 11.9551 Tj
--426 TJm
-(nUnused) 41.8429 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(NULL) 23.9102 Tj
-90 675.766 Td
-(BZ_SEQUENCE_ERROR) 101.619 Tj
-98.4879 663.811 Td
-(if) 11.9551 Tj
--426 TJm
-(BZ_STREAM_END) 77.7083 Tj
--426 TJm
-(has) 17.9327 Tj
--426 TJm
-(not) 17.9327 Tj
--426 TJm
-(been) 23.9102 Tj
--426 TJm
-(signalled) 53.798 Tj
-98.4879 651.856 Td
-(or) 11.9551 Tj
--426 TJm
-(if) 11.9551 Tj
--426 TJm
-(b) 5.97756 Tj
--426 TJm
-(was) 17.9327 Tj
--426 TJm
-(opened) 35.8654 Tj
--426 TJm
-(with) 23.9102 Tj
--426 TJm
-(BZ2_bzWriteOpen) 89.6634 Tj
-90 639.9 Td
-(BZ_OK) 29.8878 Tj
-98.4879 627.945 Td
-(otherwise) 53.798 Tj
-[1 0 0 1 72 612.404] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -602.441] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 590.486 Td
-/F130_0 9.9626 Tf
-(Allo) 17.7135 Tj
-25 TJm
-(w) 7.193 Tj
-10 TJm
-(able) 16.5977 Tj
--250 TJm
-(ne) 9.40469 Tj
-15 TJm
-(xt) 7.7509 Tj
--250 TJm
-(actions:) 30.9936 Tj
-[1 0 0 1 72 590.386] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -24.9066] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 23.9103 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 20.3238] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -581.021] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 581.021 Td
-/F134_0 9.9626 Tf
-(BZ2_bzReadClose) 89.6634 Tj
-[1 0 0 1 72 565.48] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -555.517] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 534.858 Td
-/F122_0 17.2154 Tf
-(3.4.4.) 43.0729 Tj
-[1 0 0 1 119.858 534.858] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -119.858 -534.858] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-119.858 534.858 Td
-/F392_0 17.2154 Tf
-(BZ2_bzReadClose) 154.939 Tj
-[1 0 0 1 274.797 534.858] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -202.797 -2.3327] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -24.9066] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 23.9103 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 20.3237] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3685] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -523.161] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 523.161 Td
-/F134_0 9.9626 Tf
-(void) 23.9102 Tj
--426 TJm
-(BZ2_bzReadClose) 89.6634 Tj
--426 TJm
-(\() 5.97756 Tj
--426 TJm
-(int) 17.9327 Tj
-244.46 521.417 Td
-(*) 5.97756 Tj
-250.438 523.161 Td
-(bzerror,) 47.8205 Tj
--426 TJm
-(BZFILE) 35.8654 Tj
-342.612 521.417 Td
-(*) 5.97756 Tj
-348.59 523.161 Td
-(b) 5.97756 Tj
--426 TJm
-(\);) 11.9551 Tj
-[1 0 0 1 72 507.619] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -497.656] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 485.701 Td
-/F130_0 9.9626 Tf
-(Releases) 34.8591 Tj
--430 TJm
-(all) 9.9626 Tj
--429 TJm
-(memory) 33.2053 Tj
--430 TJm
-(pertaining) 40.3983 Tj
--429 TJm
-(to) 7.7509 Tj
--430 TJm
-(the) 12.1743 Tj
--429 TJm
-(compressed) 47.0334 Tj
--430 TJm
-(\002le) 12.7322 Tj
-[1 0 0 1 304.352 485.701] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -304.352 -485.701] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-304.352 485.701 Td
-/F134_0 9.9626 Tf
-(b) 5.97756 Tj
-[1 0 0 1 310.33 485.701] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -310.33 -485.701] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-310.33 485.701 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
-[1 0 0 1 321.276 485.701] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -321.276 -485.701] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-321.276 485.701 Td
-/F134_0 9.9626 Tf
-(BZ2_bzReadClose) 89.6634 Tj
-[1 0 0 1 410.94 485.701] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -410.94 -485.701] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-415.22 485.701 Td
-/F130_0 9.9626 Tf
-(does) 18.2614 Tj
--430 TJm
-(not) 12.7322 Tj
--429 TJm
-(call) 14.386 Tj
-[1 0 0 1 473.438 485.701] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -473.438 -485.701] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-473.438 485.701 Td
-/F134_0 9.9626 Tf
-(fclose) 35.8654 Tj
-[1 0 0 1 509.304 485.701] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -509.304 -485.701] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-513.584 485.701 Td
-/F130_0 9.9626 Tf
-(on) 9.9626 Tj
--430 TJm
-(the) 12.1743 Tj
-72 473.746 Td
-(underlying) 43.1679 Tj
--264 TJm
-(\002le) 12.7322 Tj
--264 TJm
-(handle,) 29.0509 Tj
--267 TJm
-(so) 8.85675 Tj
--264 TJm
-(you) 14.9439 Tj
--264 TJm
-(should) 26.5703 Tj
--264 TJm
-(do) 9.9626 Tj
--264 TJm
-(that) 14.9439 Tj
--264 TJm
-(yourself) 32.6474 Tj
--264 TJm
-(if) 6.08715 Tj
--263 TJm
-(appropriate.) 47.8603 Tj
-[1 0 0 1 348.653 473.746] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -348.653 -473.746] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-348.653 473.746 Td
-/F134_0 9.9626 Tf
-(BZ2_bzReadClose) 89.6634 Tj
-[1 0 0 1 438.317 473.746] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -438.317 -473.746] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-440.946 473.746 Td
-/F130_0 9.9626 Tf
-(should) 26.5703 Tj
--264 TJm
-(be) 9.40469 Tj
--264 TJm
-(called) 23.7907 Tj
--264 TJm
-(to) 7.7509 Tj
--264 TJm
-(clean) 21.0211 Tj
-72 461.791 Td
-(up) 9.9626 Tj
--250 TJm
-(after) 18.2515 Tj
--250 TJm
-(all) 9.9626 Tj
--250 TJm
-(error) 19.3573 Tj
--250 TJm
-(situations.) 40.6873 Tj
-[1 0 0 1 72 459.634] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -449.671] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 439.873 Td
-/F130_0 9.9626 Tf
-(Possible) 33.2153 Tj
--250 TJm
-(assignments) 48.7072 Tj
--250 TJm
-(to) 7.7509 Tj
-[1 0 0 1 169.144 439.873] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -169.144 -439.873] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-169.144 439.873 Td
-/F134_0 9.9626 Tf
-(bzerror) 41.8429 Tj
-[1 0 0 1 210.987 439.873] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -210.987 -439.873] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-210.987 439.873 Td
-/F130_0 9.9626 Tf
-(:) 2.7696 Tj
-[1 0 0 1 72 437.716] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -60.7721] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 59.7758 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 56.1893] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -428.351] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 428.351 Td
-/F134_0 9.9626 Tf
-(BZ_SEQUENCE_ERROR) 101.619 Tj
-98.4879 416.396 Td
-(if) 11.9551 Tj
--426 TJm
-(b) 5.97756 Tj
--426 TJm
-(was) 17.9327 Tj
--426 TJm
-(opened) 35.8654 Tj
--426 TJm
-(with) 23.9102 Tj
--426 TJm
-(BZ2_bzOpenWrite) 89.6634 Tj
-90 404.441 Td
-(BZ_OK) 29.8878 Tj
-98.4879 392.486 Td
-(otherwise) 53.798 Tj
-[1 0 0 1 72 376.944] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -366.982] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 355.026 Td
-/F130_0 9.9626 Tf
-(Allo) 17.7135 Tj
-25 TJm
-(w) 7.193 Tj
-10 TJm
-(able) 16.5977 Tj
--250 TJm
-(ne) 9.40469 Tj
-15 TJm
-(xt) 7.7509 Tj
--250 TJm
-(actions:) 30.9936 Tj
-[1 0 0 1 72 354.927] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -24.9066] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 23.9103 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 20.3237] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -345.562] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 345.562 Td
-/F134_0 9.9626 Tf
-(none) 23.9102 Tj
-[1 0 0 1 72 330.02] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -320.058] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 299.399 Td
-/F122_0 17.2154 Tf
-(3.4.5.) 43.0729 Tj
-[1 0 0 1 119.858 299.399] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -119.858 -299.399] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-119.858 299.399 Td
-/F392_0 17.2154 Tf
-(BZ2_bzWriteOpen) 154.939 Tj
-[1 0 0 1 274.797 299.399] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -202.797 -2.3327] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -48.8169] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 47.8207 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 44.2341] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -287.702] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 287.702 Td
-/F134_0 9.9626 Tf
-(BZFILE) 35.8654 Tj
-130.109 285.958 Td
-(*) 5.97756 Tj
-136.087 287.702 Td
-(BZ2_bzWriteOpen\() 95.641 Tj
--426 TJm
-(int) 17.9327 Tj
-258.149 285.958 Td
-(*) 5.97756 Tj
-264.127 287.702 Td
-(bzerror,) 47.8205 Tj
--426 TJm
-(FILE) 23.9102 Tj
-344.346 285.958 Td
-(*) 5.97756 Tj
-350.323 287.702 Td
-(f,) 11.9551 Tj
-196.099 275.746 Td
-(int) 17.9327 Tj
--426 TJm
-(blockSize100k,) 83.6858 Tj
--426 TJm
-(int) 17.9327 Tj
--426 TJm
-(verbosity,) 59.7756 Tj
-196.099 263.791 Td
-(int) 17.9327 Tj
--426 TJm
-(workFactor) 59.7756 Tj
--426 TJm
-(\);) 11.9551 Tj
-[1 0 0 1 72 248.249] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -238.287] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 226.332 Td
-/F130_0 9.9626 Tf
-(Prepare) 30.4258 Tj
--268 TJm
-(to) 7.7509 Tj
--269 TJm
-(write) 20.4731 Tj
--268 TJm
-(compressed) 47.0334 Tj
--269 TJm
-(data) 16.5977 Tj
--268 TJm
-(to) 7.7509 Tj
--269 TJm
-(\002le) 12.7322 Tj
--268 TJm
-(handle) 26.5603 Tj
-[1 0 0 1 262.72 226.332] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -262.72 -226.332] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-262.72 226.332 Td
-/F134_0 9.9626 Tf
-(f) 5.97756 Tj
-[1 0 0 1 268.698 226.332] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -268.698 -226.332] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-268.698 226.332 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
-[1 0 0 1 274.829 226.332] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -274.829 -226.332] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-274.829 226.332 Td
-/F134_0 9.9626 Tf
-(f) 5.97756 Tj
-[1 0 0 1 280.807 226.332] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -280.807 -226.332] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-283.481 226.332 Td
-/F130_0 9.9626 Tf
-(should) 26.5703 Tj
--268 TJm
-(refer) 18.7994 Tj
--269 TJm
-(to) 7.7509 Tj
--268 TJm
-(a) 4.42339 Tj
--269 TJm
-(\002le) 12.7322 Tj
--268 TJm
-(which) 24.3486 Tj
--269 TJm
-(has) 13.2801 Tj
--268 TJm
-(been) 18.8094 Tj
--269 TJm
-(opened) 28.772 Tj
--268 TJm
-(for) 11.6164 Tj
--269 TJm
-(writing,) 31.2726 Tj
--273 TJm
-(and) 14.386 Tj
--268 TJm
-(for) 11.6164 Tj
-72 214.377 Td
-(which) 24.3486 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(error) 19.3573 Tj
--250 TJm
-(indicator) 35.417 Tj
--250 TJm
-(\() 3.31755 Tj
-[1 0 0 1 176.577 214.376] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -176.577 -214.376] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-176.577 214.376 Td
-/F134_0 9.9626 Tf
-(ferror\(f\)) 53.798 Tj
-[1 0 0 1 230.375 214.376] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -230.375 -214.376] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-230.375 214.376 Td
-/F130_0 9.9626 Tf
-(\)is) 9.9626 Tj
--250 TJm
-(not) 12.7322 Tj
--250 TJm
-(set.) 13.5591 Tj
-[1 0 0 1 72 212.593] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -202.631] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 192.459 Td
-/F130_0 9.9626 Tf
-(F) 5.53921 Tj
-15 TJm
-(or) 8.29885 Tj
--223 TJm
-(the) 12.1743 Tj
--224 TJm
-(meaning) 34.3112 Tj
--223 TJm
-(of) 8.29885 Tj
--224 TJm
-(parameters) 43.7059 Tj
-[1 0 0 1 195.306 192.459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -195.306 -192.459] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-195.306 192.459 Td
-/F134_0 9.9626 Tf
-(blockSize100k) 77.7083 Tj
-[1 0 0 1 273.015 192.459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -273.015 -192.459] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-273.015 192.459 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 277.784 192.459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -277.784 -192.459] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-277.784 192.459 Td
-/F134_0 9.9626 Tf
-(verbosity) 53.798 Tj
-[1 0 0 1 331.583 192.459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -331.583 -192.459] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-333.808 192.459 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 350.42 192.459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -350.42 -192.459] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-350.42 192.459 Td
-/F134_0 9.9626 Tf
-(workFactor) 59.7756 Tj
-[1 0 0 1 410.196 192.459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -410.196 -192.459] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-410.196 192.459 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--229 TJm
-(see) 12.7222 Tj
-[1 0 0 1 429.913 192.459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -429.913 -192.459] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-429.913 192.459 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompressInit) 107.596 Tj
-[1 0 0 1 537.509 192.459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -537.509 -192.459] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-537.509 192.459 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
-[1 0 0 1 72 190.302] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -180.339] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 170.541 Td
-/F130_0 9.9626 Tf
-(All) 12.7322 Tj
--382 TJm
-(required) 33.1954 Tj
--382 TJm
-(memory) 33.2053 Tj
--382 TJm
-(is) 6.64505 Tj
--382 TJm
-(allocated) 35.965 Tj
--383 TJm
-(at) 7.193 Tj
--382 TJm
-(this) 14.396 Tj
--382 TJm
-(stage,) 22.9638 Tj
--415 TJm
-(so) 8.85675 Tj
--382 TJm
-(if) 6.08715 Tj
--382 TJm
-(the) 12.1743 Tj
--382 TJm
-(call) 14.386 Tj
--382 TJm
-(completes) 40.3983 Tj
--382 TJm
-(successfully) 48.6972 Tj
-65 TJm
-(,) 2.49065 Tj
-[1 0 0 1 424.691 170.541] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -424.691 -170.541] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-424.691 170.541 Td
-/F134_0 9.9626 Tf
-(BZ_MEM_ERROR) 71.7307 Tj
-[1 0 0 1 496.422 170.541] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -496.422 -170.541] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-500.228 170.541 Td
-/F130_0 9.9626 Tf
-(cannot) 26.5603 Tj
--382 TJm
-(be) 9.40469 Tj
-72 158.586 Td
-(signalled) 35.9749 Tj
--250 TJm
-(by) 9.9626 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(subsequent) 44.2738 Tj
--250 TJm
-(call) 14.386 Tj
--250 TJm
-(to) 7.7509 Tj
-[1 0 0 1 203.715 158.586] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -203.715 -158.586] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-203.715 158.586 Td
-/F134_0 9.9626 Tf
-(BZ2_bzWrite) 65.7532 Tj
-[1 0 0 1 269.468 158.586] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -269.468 -158.586] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-269.468 158.586 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
-[1 0 0 1 72 156.429] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -146.466] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 136.668 Td
-/F130_0 9.9626 Tf
-(Possible) 33.2153 Tj
--250 TJm
-(assignments) 48.7072 Tj
--250 TJm
-(to) 7.7509 Tj
-[1 0 0 1 169.144 136.668] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -169.144 -136.668] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-169.144 136.668 Td
-/F134_0 9.9626 Tf
-(bzerror) 41.8429 Tj
-[1 0 0 1 210.987 136.668] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -210.987 -136.668] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-210.987 136.668 Td
-/F130_0 9.9626 Tf
-(:) 2.7696 Tj
-[1 0 0 1 72 134.511] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -83.6593] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 374.394 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 40.5726 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -493.841 -50.8518] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-534.414 50.8518 Td
-/F130_0 9.9626 Tf
-(22) 9.9626 Tj
-[1 0 0 1 453.269 50.8518] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 93.5985 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.2765 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-Q
-showpage
-%%PageTrailer
-pdfEndPage
-%%Page: 26 26
-%%BeginPageSetup
-%%PageOrientation: Portrait
-pdfStartPage
-0 0 612 792 re W
-%%EndPageSetup
-[] 0 d
-1 i
-0 j
-0 J
-10 M
-1 w
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-false op
-false OP
-0 0 612 792 re
-W
-q
-[1 0 0 1 72 741.554] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 14.4459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 187.197 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 -8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 76.4979 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -342.569 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-419.067 749.245 Td
-/F130_0 9.9626 Tf
-(Programming) 54.7943 Tj
--250 TJm
-(with) 17.7135 Tj
-[1 0 0 1 496.556 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -496.556 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-496.556 749.245 Td
-/F134_0 9.9626 Tf
-(libbzip2) 47.8205 Tj
-[1 0 0 1 544.376 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -278.305 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 280.796 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.974 -5.0363] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -0.4981] cm
-q
-[] 0 d
-0 J
-0.4981 w
-0 0.2491 m
-475.465 0.2491 l
-S
-Q
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 479.251 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -165.016] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 143.462 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 139.875] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -711.631] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 711.631 Td
-/F134_0 9.9626 Tf
-(BZ_CONFIG_ERROR) 89.6634 Tj
-98.4879 699.676 Td
-(if) 11.9551 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(library) 41.8429 Tj
--426 TJm
-(has) 17.9327 Tj
--426 TJm
-(been) 23.9102 Tj
--426 TJm
-(mis-compiled) 71.7307 Tj
-90 687.721 Td
-(BZ_PARAM_ERROR) 83.6858 Tj
-98.4879 675.766 Td
-(if) 11.9551 Tj
--426 TJm
-(f) 5.97756 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(NULL) 23.9102 Tj
-98.4879 663.811 Td
-(or) 11.9551 Tj
--426 TJm
-(blockSize100k) 77.7083 Tj
--426 TJm
-(<) 5.97756 Tj
--426 TJm
-(1) 5.97756 Tj
--426 TJm
-(or) 11.9551 Tj
--426 TJm
-(blockSize100k) 77.7083 Tj
--426 TJm
-(>) 5.97756 Tj
--426 TJm
-(9) 5.97756 Tj
-90 651.856 Td
-(BZ_IO_ERROR) 65.7532 Tj
-98.4879 639.9 Td
-(if) 11.9551 Tj
--426 TJm
-(ferror\(f\)) 53.798 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(nonzero) 41.8429 Tj
-90 627.945 Td
-(BZ_MEM_ERROR) 71.7307 Tj
-98.4879 615.99 Td
-(if) 11.9551 Tj
--426 TJm
-(insufficient) 71.7307 Tj
--426 TJm
-(memory) 35.8654 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(available) 53.798 Tj
-90 604.035 Td
-(BZ_OK) 29.8878 Tj
-98.4879 592.08 Td
-(otherwise) 53.798 Tj
-[1 0 0 1 72 576.538] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -566.575] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 554.62 Td
-/F130_0 9.9626 Tf
-(Possible) 33.2153 Tj
--250 TJm
-(return) 23.7907 Tj
--250 TJm
-(v) 4.9813 Tj
-25 TJm
-(alues:) 23.2427 Tj
-[1 0 0 1 72 554.521] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -60.7721] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 59.7758 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 56.1892] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -545.156] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 545.156 Td
-/F134_0 9.9626 Tf
-(Pointer) 41.8429 Tj
--426 TJm
-(to) 11.9551 Tj
--426 TJm
-(an) 11.9551 Tj
--426 TJm
-(abstract) 47.8205 Tj
--426 TJm
-(BZFILE) 35.8654 Tj
-98.4879 533.201 Td
-(if) 11.9551 Tj
--426 TJm
-(bzerror) 41.8429 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(BZ_OK) 29.8878 Tj
-90 521.245 Td
-(NULL) 23.9102 Tj
-98.4879 509.29 Td
-(otherwise) 53.798 Tj
-[1 0 0 1 72 493.748] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -483.786] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 471.831 Td
-/F130_0 9.9626 Tf
-(Allo) 17.7135 Tj
-25 TJm
-(w) 7.193 Tj
-10 TJm
-(able) 16.5977 Tj
--250 TJm
-(ne) 9.40469 Tj
-15 TJm
-(xt) 7.7509 Tj
--250 TJm
-(actions:) 30.9936 Tj
-[1 0 0 1 72 471.731] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -84.6825] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 83.6862 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 80.0996] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -462.366] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 462.366 Td
-/F134_0 9.9626 Tf
-(BZ2_bzWrite) 65.7532 Tj
-98.4879 450.411 Td
-(if) 11.9551 Tj
--426 TJm
-(bzerror) 41.8429 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(BZ_OK) 29.8878 Tj
-98.4879 438.456 Td
-(\(you) 23.9102 Tj
--426 TJm
-(could) 29.8878 Tj
--426 TJm
-(go) 11.9551 Tj
--426 TJm
-(directly) 47.8205 Tj
--426 TJm
-(to) 11.9551 Tj
--426 TJm
-(BZ2_bzWriteClose,) 101.619 Tj
--426 TJm
-(but) 17.9327 Tj
--426 TJm
-(this) 23.9102 Tj
--426 TJm
-(would) 29.8878 Tj
--426 TJm
-(be) 11.9551 Tj
--426 TJm
-(pretty) 35.8654 Tj
-485.505 434.212 Td
-/F564_0 9.9626 Tf
-( ) 9.9626 Tj
-493.808 434.212 Td
-/F147_0 9.9626 Tf
-(-) 2.7696 Tj
-90 426.501 Td
-/F134_0 9.9626 Tf
-(pointless\)) 59.7756 Tj
-90 414.546 Td
-(BZ2_bzWriteClose) 95.641 Tj
-98.4879 402.59 Td
-(otherwise) 53.798 Tj
-[1 0 0 1 72 387.049] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -377.086] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 356.428 Td
-/F122_0 17.2154 Tf
-(3.4.6.) 43.0729 Tj
-[1 0 0 1 119.858 356.428] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -119.858 -356.428] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-119.858 356.428 Td
-/F392_0 17.2154 Tf
-(BZ2_bzWrite) 113.622 Tj
-[1 0 0 1 233.48 356.428] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -161.48 -2.3327] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -24.9066] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 23.9103 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 20.3237] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3685] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -344.73] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 344.73 Td
-/F134_0 9.9626 Tf
-(void) 23.9102 Tj
--426 TJm
-(BZ2_bzWrite) 65.7532 Tj
--426 TJm
-(\() 5.97756 Tj
--426 TJm
-(int) 17.9327 Tj
-220.55 342.987 Td
-(*) 5.97756 Tj
-226.528 344.73 Td
-(bzerror,) 47.8205 Tj
--426 TJm
-(BZFILE) 35.8654 Tj
-318.702 342.987 Td
-(*) 5.97756 Tj
-324.679 344.73 Td
-(b,) 11.9551 Tj
--426 TJm
-(void) 23.9102 Tj
-369.033 342.987 Td
-(*) 5.97756 Tj
-375.01 344.73 Td
-(buf,) 23.9102 Tj
--426 TJm
-(int) 17.9327 Tj
--426 TJm
-(len) 17.9327 Tj
--426 TJm
-(\);) 11.9551 Tj
-[1 0 0 1 72 329.188] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -319.226] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 307.27 Td
-/F130_0 9.9626 Tf
-(Absorbs) 33.2053 Tj
-[1 0 0 1 107.696 307.27] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -107.696 -307.27] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-107.696 307.27 Td
-/F134_0 9.9626 Tf
-(len) 17.9327 Tj
-[1 0 0 1 125.629 307.27] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -125.629 -307.27] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-128.119 307.27 Td
-/F130_0 9.9626 Tf
-(bytes) 21.031 Tj
--250 TJm
-(from) 19.3673 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(b) 4.9813 Tj
-20 TJm
-(uf) 8.29885 Tj
-25 TJm
-(fer) 11.0585 Tj
-[1 0 0 1 214.544 307.27] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -214.544 -307.27] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-214.544 307.27 Td
-/F134_0 9.9626 Tf
-(buf) 17.9327 Tj
-[1 0 0 1 232.477 307.27] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -232.477 -307.27] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-232.477 307.27 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--250 TJm
-(e) 4.42339 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(entually) 32.0995 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(be) 9.40469 Tj
--250 TJm
-(compressed) 47.0334 Tj
--250 TJm
-(and) 14.386 Tj
--250 TJm
-(written) 28.224 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(\002le.) 15.2229 Tj
-[1 0 0 1 72 305.114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -295.151] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 285.353 Td
-/F130_0 9.9626 Tf
-(Possible) 33.2153 Tj
--250 TJm
-(assignments) 48.7072 Tj
--250 TJm
-(to) 7.7509 Tj
-[1 0 0 1 169.144 285.353] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -169.144 -285.353] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-169.144 285.353 Td
-/F134_0 9.9626 Tf
-(bzerror) 41.8429 Tj
-[1 0 0 1 210.987 285.353] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -210.987 -285.353] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-210.987 285.353 Td
-/F130_0 9.9626 Tf
-(:) 2.7696 Tj
-[1 0 0 1 72 283.196] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -108.593] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 107.597 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 104.01] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -273.831] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 273.831 Td
-/F134_0 9.9626 Tf
-(BZ_PARAM_ERROR) 83.6858 Tj
-98.4879 261.876 Td
-(if) 11.9551 Tj
--426 TJm
-(b) 5.97756 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(NULL) 23.9102 Tj
--426 TJm
-(or) 11.9551 Tj
--426 TJm
-(buf) 17.9327 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(NULL) 23.9102 Tj
--426 TJm
-(or) 11.9551 Tj
--426 TJm
-(len) 17.9327 Tj
--426 TJm
-(<) 5.97756 Tj
--426 TJm
-(0) 5.97756 Tj
-90 249.921 Td
-(BZ_SEQUENCE_ERROR) 101.619 Tj
-98.4879 237.965 Td
-(if) 11.9551 Tj
--426 TJm
-(b) 5.97756 Tj
--426 TJm
-(was) 17.9327 Tj
--426 TJm
-(opened) 35.8654 Tj
--426 TJm
-(with) 23.9102 Tj
--426 TJm
-(BZ2_bzReadOpen) 83.6858 Tj
-90 226.01 Td
-(BZ_IO_ERROR) 65.7532 Tj
-98.4879 214.055 Td
-(if) 11.9551 Tj
--426 TJm
-(there) 29.8878 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(an) 11.9551 Tj
--426 TJm
-(error) 29.8878 Tj
--426 TJm
-(writing) 41.8429 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(compressed) 59.7756 Tj
--426 TJm
-(file.) 29.8878 Tj
-90 202.1 Td
-(BZ_OK) 29.8878 Tj
-98.4879 190.145 Td
-(otherwise) 53.798 Tj
-[1 0 0 1 72 174.603] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -164.64] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 143.982 Td
-/F122_0 17.2154 Tf
-(3.4.7.) 43.0729 Tj
-[1 0 0 1 119.858 143.982] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -119.858 -143.982] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-119.858 143.982 Td
-/F392_0 17.2154 Tf
-(BZ2_bzWriteClose) 165.268 Tj
-[1 0 0 1 285.126 143.982] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -213.126 -2.3326] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -90.7975] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 374.394 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.8541] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 40.5726 -6.7545] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -493.841 -50.9514] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-534.414 50.9514 Td
-/F130_0 9.9626 Tf
-(23) 9.9626 Tj
-[1 0 0 1 453.269 50.8518] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 93.5985 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.2765 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-Q
-showpage
-%%PageTrailer
-pdfEndPage
-%%Page: 27 27
-%%BeginPageSetup
-%%PageOrientation: Portrait
-pdfStartPage
-0 0 612 792 re W
-%%EndPageSetup
-[] 0 d
-1 i
-0 j
-0 J
-10 M
-1 w
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-false op
-false OP
-0 0 612 792 re
-W
-q
-[1 0 0 1 72 741.554] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 14.4459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 187.197 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 -8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 76.4979 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -342.569 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-419.067 749.245 Td
-/F130_0 9.9626 Tf
-(Programming) 54.7943 Tj
--250 TJm
-(with) 17.7135 Tj
-[1 0 0 1 496.556 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -496.556 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-496.556 749.245 Td
-/F134_0 9.9626 Tf
-(libbzip2) 47.8205 Tj
-[1 0 0 1 544.376 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -278.305 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 280.796 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.974 -5.0363] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -0.4981] cm
-q
-[] 0 d
-0 J
-0.4981 w
-0 0.2491 m
-475.465 0.2491 l
-S
-Q
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 479.251 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -165.016] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 143.462 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 139.875] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -711.631] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 711.631 Td
-/F134_0 9.9626 Tf
-(void) 23.9102 Tj
--426 TJm
-(BZ2_bzWriteClose\() 101.619 Tj
--426 TJm
-(int) 17.9327 Tj
-246.194 709.888 Td
-(*) 5.97756 Tj
-252.171 711.631 Td
-(bzerror,) 47.8205 Tj
--426 TJm
-(BZFILE) 35.8654 Tj
-340.102 709.888 Td
-(*) 5.97756 Tj
-350.323 711.631 Td
-(f,) 11.9551 Tj
-187.611 699.676 Td
-(int) 17.9327 Tj
--426 TJm
-(abandon,) 47.8205 Tj
-187.611 687.721 Td
-(unsigned) 47.8205 Tj
--426 TJm
-(int) 17.9327 Tj
-257.609 685.978 Td
-(*) 5.97756 Tj
-267.83 687.721 Td
-(nbytes_in,) 59.7756 Tj
-187.611 675.766 Td
-(unsigned) 47.8205 Tj
--426 TJm
-(int) 17.9327 Tj
-257.609 674.023 Td
-(*) 5.97756 Tj
-267.83 675.766 Td
-(nbytes_out) 59.7756 Tj
--426 TJm
-(\);) 11.9551 Tj
-90 651.856 Td
-(void) 23.9102 Tj
--426 TJm
-(BZ2_bzWriteClose64\() 113.574 Tj
--426 TJm
-(int) 17.9327 Tj
-258.149 650.112 Td
-(*) 5.97756 Tj
-264.127 651.856 Td
-(bzerror,) 47.8205 Tj
--426 TJm
-(BZFILE) 35.8654 Tj
-352.057 650.112 Td
-(*) 5.97756 Tj
-362.278 651.856 Td
-(f,) 11.9551 Tj
-196.099 639.9 Td
-(int) 17.9327 Tj
--426 TJm
-(abandon,) 47.8205 Tj
-196.099 627.945 Td
-(unsigned) 47.8205 Tj
--426 TJm
-(int) 17.9327 Tj
-266.097 626.202 Td
-(*) 5.97756 Tj
-276.318 627.945 Td
-(nbytes_in_lo32,) 89.6634 Tj
-196.099 615.99 Td
-(unsigned) 47.8205 Tj
--426 TJm
-(int) 17.9327 Tj
-266.097 614.247 Td
-(*) 5.97756 Tj
-276.318 615.99 Td
-(nbytes_in_hi32,) 89.6634 Tj
-196.099 604.035 Td
-(unsigned) 47.8205 Tj
--426 TJm
-(int) 17.9327 Tj
-266.097 602.292 Td
-(*) 5.97756 Tj
-276.318 604.035 Td
-(nbytes_out_lo32,) 95.641 Tj
-196.099 592.08 Td
-(unsigned) 47.8205 Tj
--426 TJm
-(int) 17.9327 Tj
-266.097 590.336 Td
-(*) 5.97756 Tj
-276.318 592.08 Td
-(nbytes_out_hi32) 89.6634 Tj
--426 TJm
-(\);) 11.9551 Tj
-[1 0 0 1 72 576.538] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -566.575] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 554.62 Td
-/F130_0 9.9626 Tf
-(Compresses) 48.1492 Tj
--403 TJm
-(and) 14.386 Tj
--402 TJm
-(\003ushes) 27.6761 Tj
--403 TJm
-(to) 7.7509 Tj
--403 TJm
-(the) 12.1743 Tj
--402 TJm
-(compressed) 47.0334 Tj
--403 TJm
-(\002le) 12.7322 Tj
--403 TJm
-(a) 4.42339 Tj
-1 TJm
-(ll) 5.53921 Tj
--403 TJm
-(data) 16.5977 Tj
--403 TJm
-(so) 8.85675 Tj
--402 TJm
-(f) 3.31755 Tj
-10 TJm
-(ar) 7.74094 Tj
--403 TJm
-(supplied) 33.7633 Tj
--403 TJm
-(by) 9.9626 Tj
-[1 0 0 1 384.152 554.62] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -384.152 -554.62] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-384.152 554.62 Td
-/F134_0 9.9626 Tf
-(BZ2_bzWrite) 65.7532 Tj
-[1 0 0 1 449.906 554.62] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -449.906 -554.62] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-449.906 554.62 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
--768 TJm
-(The) 15.4918 Tj
--403 TJm
-(logical) 27.1182 Tj
--402 TJm
-(end-of-) 29.3199 Tj
-72 542.665 Td
-(stream) 26.5603 Tj
--352 TJm
-(mark) 20.4731 Tj
-10 TJm
-(ers) 11.6164 Tj
--352 TJm
-(are) 12.1643 Tj
--353 TJm
-(also) 16.0497 Tj
--352 TJm
-(written,) 30.7147 Tj
--378 TJm
-(so) 8.85675 Tj
--352 TJm
-(subsequent) 44.2738 Tj
--352 TJm
-(calls) 18.2614 Tj
--352 TJm
-(to) 7.7509 Tj
-[1 0 0 1 300.456 542.665] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -300.456 -542.665] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-300.456 542.665 Td
-/F134_0 9.9626 Tf
-(BZ2_bzWrite) 65.7532 Tj
-[1 0 0 1 366.209 542.665] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -366.209 -542.665] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-369.718 542.665 Td
-/F130_0 9.9626 Tf
-(are) 12.1643 Tj
--352 TJm
-(ille) 12.7322 Tj
-15 TJm
-(g) 4.9813 Tj
-5 TJm
-(al.) 9.68365 Tj
--1234 TJm
-(All) 12.7322 Tj
--352 TJm
-(memory) 33.2053 Tj
--352 TJm
-(associated) 40.9463 Tj
--352 TJm
-(with) 17.7135 Tj
-72 530.71 Td
-(the) 12.1743 Tj
--250 TJm
-(compressed) 47.0334 Tj
--250 TJm
-(\002le) 12.7322 Tj
-[1 0 0 1 151.411 530.71] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -151.411 -530.71] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-151.411 530.71 Td
-/F134_0 9.9626 Tf
-(b) 5.97756 Tj
-[1 0 0 1 157.389 530.71] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -157.389 -530.71] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-159.879 530.71 Td
-/F130_0 9.9626 Tf
-(is) 6.64505 Tj
--250 TJm
-(released.) 35.1281 Tj
-[1 0 0 1 207.231 530.71] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -207.231 -530.71] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-207.231 530.71 Td
-/F134_0 9.9626 Tf
-(fflush) 35.8654 Tj
-[1 0 0 1 243.097 530.71] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -243.097 -530.71] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-245.587 530.71 Td
-/F130_0 9.9626 Tf
-(is) 6.64505 Tj
--250 TJm
-(called) 23.7907 Tj
--250 TJm
-(on) 9.9626 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(compressed) 47.0334 Tj
--250 TJm
-(\002le,) 15.2229 Tj
--250 TJm
-(b) 4.9813 Tj
-20 TJm
-(ut) 7.7509 Tj
--250 TJm
-(it) 5.53921 Tj
--250 TJm
-(is) 6.64505 Tj
--250 TJm
-(not) 12.7322 Tj
-[1 0 0 1 422.771 530.71] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -422.771 -530.71] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-422.771 530.71 Td
-/F134_0 9.9626 Tf
-(fclose) 35.8654 Tj
-[1 0 0 1 458.636 530.71] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -458.636 -530.71] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-458.636 530.71 Td
-/F130_0 9.9626 Tf
-(') 3.31755 Tj
-50 TJm
-(d.) 7.47195 Tj
-[1 0 0 1 72 528.553] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -518.59] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 508.792 Td
-/F130_0 9.9626 Tf
-(If) 6.63509 Tj
-[1 0 0 1 81.5743 508.792] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -81.5743 -508.792] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-81.5743 508.792 Td
-/F134_0 9.9626 Tf
-(BZ2_bzWriteClose) 95.641 Tj
-[1 0 0 1 177.216 508.792] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -177.216 -508.792] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-180.155 508.792 Td
-/F130_0 9.9626 Tf
-(is) 6.64505 Tj
--295 TJm
-(called) 23.7907 Tj
--295 TJm
-(to) 7.7509 Tj
--295 TJm
-(clean) 21.0211 Tj
--295 TJm
-(up) 9.9626 Tj
--295 TJm
-(after) 18.2515 Tj
--295 TJm
-(an) 9.40469 Tj
--295 TJm
-(error) 19.3573 Tj
-40 TJm
-(,) 2.49065 Tj
--306 TJm
-(the) 12.1743 Tj
--295 TJm
-(only) 17.7135 Tj
--295 TJm
-(action) 24.3486 Tj
--295 TJm
-(is) 6.64505 Tj
--295 TJm
-(to) 7.7509 Tj
--295 TJm
-(release) 27.6562 Tj
--295 TJm
-(the) 12.1743 Tj
--295 TJm
-(memory) 33.2053 Tj
-65 TJm
-(.) 2.49065 Tj
--891 TJm
-(The) 15.4918 Tj
--295 TJm
-(library) 26.5603 Tj
-72 496.837 Td
-(records) 29.3199 Tj
--289 TJm
-(the) 12.1743 Tj
--289 TJm
-(error) 19.3573 Tj
--289 TJm
-(codes) 22.6848 Tj
--289 TJm
-(issued) 24.9065 Tj
--289 TJm
-(by) 9.9626 Tj
--289 TJm
-(pre) 12.7222 Tj
-25 TJm
-(vious) 21.589 Tj
--289 TJm
-(calls,) 20.7521 Tj
--299 TJm
-(so) 8.85675 Tj
--289 TJm
-(this) 14.396 Tj
--289 TJm
-(situation) 34.3212 Tj
--289 TJm
-(will) 15.5018 Tj
--289 TJm
-(be) 9.40469 Tj
--289 TJm
-(detected) 33.1954 Tj
--289 TJm
-(automatically) 54.2364 Tj
-65 TJm
-(.) 2.49065 Tj
--427 TJm
-(There) 23.2328 Tj
--289 TJm
-(is) 6.64505 Tj
--289 TJm
-(no) 9.9626 Tj
--289 TJm
-(attempt) 29.8878 Tj
-72 484.882 Td
-(to) 7.7509 Tj
--263 TJm
-(complete) 36.5229 Tj
--262 TJm
-(the) 12.1743 Tj
--263 TJm
-(compression) 50.3609 Tj
--263 TJm
-(operation,) 40.1194 Tj
--265 TJm
-(nor) 13.2801 Tj
--263 TJm
-(to) 7.7509 Tj
-[1 0 0 1 258.308 484.882] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -258.308 -484.882] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-258.308 484.882 Td
-/F134_0 9.9626 Tf
-(fflush) 35.8654 Tj
-[1 0 0 1 294.173 484.882] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -294.173 -484.882] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-296.79 484.882 Td
-/F130_0 9.9626 Tf
-(the) 12.1743 Tj
--263 TJm
-(compressed) 47.0334 Tj
--262 TJm
-(\002le.) 15.2229 Tj
--696 TJm
-(Y) 7.193 Tj
-110 TJm
-(ou) 9.9626 Tj
--263 TJm
-(can) 13.8281 Tj
--263 TJm
-(force) 20.4632 Tj
--262 TJm
-(this) 14.396 Tj
--263 TJm
-(beha) 18.8094 Tj
-20 TJm
-(viour) 21.031 Tj
--263 TJm
-(to) 7.7509 Tj
--262 TJm
-(happen) 28.772 Tj
-72 472.926 Td
-(e) 4.42339 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(en) 9.40469 Tj
--250 TJm
-(in) 7.7509 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(case) 17.1456 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(no) 9.9626 Tj
--250 TJm
-(error) 19.3573 Tj
-40 TJm
-(,) 2.49065 Tj
--250 TJm
-(by) 9.9626 Tj
--250 TJm
-(passing) 29.8878 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(nonzero) 32.0895 Tj
--250 TJm
-(v) 4.9813 Tj
-25 TJm
-(alue) 16.5977 Tj
--250 TJm
-(to) 7.7509 Tj
-[1 0 0 1 305.014 472.926] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -305.014 -472.926] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-305.014 472.926 Td
-/F134_0 9.9626 Tf
-(abandon) 41.8429 Tj
-[1 0 0 1 346.858 472.926] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -346.858 -472.926] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-346.858 472.926 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
-[1 0 0 1 72 470.77] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -460.807] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 451.009 Td
-/F130_0 9.9626 Tf
-(If) 6.63509 Tj
-[1 0 0 1 80.5974 451.009] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -80.5974 -451.009] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-80.5974 451.009 Td
-/F134_0 9.9626 Tf
-(nbytes_in) 53.798 Tj
-[1 0 0 1 134.396 451.009] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -134.396 -451.009] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-136.358 451.009 Td
-/F130_0 9.9626 Tf
-(is) 6.64505 Tj
--197 TJm
-(non-null,) 36.2539 Tj
-[1 0 0 1 183.287 451.009] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -183.287 -451.009] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-183.287 449.265 Td
-/F134_0 9.9626 Tf
-(*) 5.97756 Tj
-189.265 451.009 Td
-(nbytes_in) 53.798 Tj
-[1 0 0 1 243.063 451.009] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -243.063 -451.009] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-245.025 451.009 Td
-/F130_0 9.9626 Tf
-(will) 15.5018 Tj
--197 TJm
-(be) 9.40469 Tj
--197 TJm
-(set) 11.0684 Tj
--197 TJm
-(to) 7.7509 Tj
--197 TJm
-(be) 9.40469 Tj
--197 TJm
-(the) 12.1743 Tj
--197 TJm
-(total) 17.7135 Tj
--197 TJm
-(v) 4.9813 Tj
-20 TJm
-(olume) 24.9065 Tj
--197 TJm
-(of) 8.29885 Tj
--197 TJm
-(uncompressed) 56.996 Tj
--197 TJm
-(data) 16.5977 Tj
--197 TJm
-(handled.) 34.0322 Tj
--584 TJm
-(Similarly) 37.0908 Tj
-65 TJm
-(,) 2.49065 Tj
-[1 0 0 1 72 439.053] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -439.053] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 439.053 Td
-/F134_0 9.9626 Tf
-(nbytes_out) 59.7756 Tj
-[1 0 0 1 131.776 439.053] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -131.776 -439.053] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-134.716 439.053 Td
-/F130_0 9.9626 Tf
-(will) 15.5018 Tj
--295 TJm
-(be) 9.40469 Tj
--295 TJm
-(set) 11.0684 Tj
--295 TJm
-(to) 7.7509 Tj
--295 TJm
-(the) 12.1743 Tj
--295 TJm
-(total) 17.7135 Tj
--295 TJm
-(v) 4.9813 Tj
-20 TJm
-(olume) 24.9065 Tj
--296 TJm
-(of) 8.29885 Tj
--295 TJm
-(compressed) 47.0334 Tj
--295 TJm
-(data) 16.5977 Tj
--295 TJm
-(written.) 30.7147 Tj
--890 TJm
-(F) 5.53921 Tj
-15 TJm
-(or) 8.29885 Tj
--295 TJm
-(compatibility) 53.1405 Tj
--295 TJm
-(with) 17.7135 Tj
--295 TJm
-(older) 20.4731 Tj
--296 TJm
-(v) 4.9813 Tj
-15 TJm
-(ersions) 28.224 Tj
--295 TJm
-(of) 8.29885 Tj
-72 427.098 Td
-(the) 12.1743 Tj
--283 TJm
-(library) 26.5603 Tj
-65 TJm
-(,) 2.49065 Tj
-[1 0 0 1 118.294 427.098] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -118.294 -427.098] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-118.294 427.098 Td
-/F134_0 9.9626 Tf
-(BZ2_bzWriteClose) 95.641 Tj
-[1 0 0 1 213.936 427.098] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -213.936 -427.098] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-216.753 427.098 Td
-/F130_0 9.9626 Tf
-(only) 17.7135 Tj
--283 TJm
-(yields) 23.8007 Tj
--283 TJm
-(the) 12.1743 Tj
--282 TJm
-(lo) 7.7509 Tj
-25 TJm
-(wer) 14.9339 Tj
--283 TJm
-(32) 9.9626 Tj
--283 TJm
-(bits) 14.396 Tj
--283 TJm
-(of) 8.29885 Tj
--283 TJm
-(these) 20.4731 Tj
--282 TJm
-(counts.) 28.503 Tj
--817 TJm
-(Use) 15.4918 Tj
-[1 0 0 1 423.499 427.098] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -423.499 -427.098] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-423.499 427.098 Td
-/F134_0 9.9626 Tf
-(BZ2_bzWriteClose64) 107.596 Tj
-[1 0 0 1 531.095 427.098] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -531.095 -427.098] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-533.913 427.098 Td
-/F130_0 9.9626 Tf
-(if) 6.08715 Tj
-72 415.143 Td
-(you) 14.9439 Tj
--250 TJm
-(w) 7.193 Tj
-10 TJm
-(ant) 12.1743 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(full) 13.8381 Tj
--250 TJm
-(64) 9.9626 Tj
--250 TJm
-(bit) 10.5205 Tj
--250 TJm
-(counts.) 28.503 Tj
--620 TJm
-(These) 23.7907 Tj
--250 TJm
-(tw) 9.9626 Tj
-10 TJm
-(o) 4.9813 Tj
--250 TJm
-(functions) 37.0808 Tj
--250 TJm
-(are) 12.1643 Tj
--250 TJm
-(otherwise) 38.7346 Tj
--250 TJm
-(absolutely) 40.9562 Tj
--250 TJm
-(identical.) 36.8018 Tj
-[1 0 0 1 72 412.986] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -403.024] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 393.225 Td
-/F130_0 9.9626 Tf
-(Possible) 33.2153 Tj
--250 TJm
-(assignments) 48.7072 Tj
--250 TJm
-(to) 7.7509 Tj
-[1 0 0 1 169.144 393.225] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -169.144 -393.225] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-169.144 393.225 Td
-/F134_0 9.9626 Tf
-(bzerror) 41.8429 Tj
-[1 0 0 1 210.987 393.225] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -210.987 -393.225] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-210.987 393.225 Td
-/F130_0 9.9626 Tf
-(:) 2.7696 Tj
-[1 0 0 1 72 391.069] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -84.6825] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 83.6862 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 80.0996] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -381.704] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 381.704 Td
-/F134_0 9.9626 Tf
-(BZ_SEQUENCE_ERROR) 101.619 Tj
-98.4879 369.748 Td
-(if) 11.9551 Tj
--426 TJm
-(b) 5.97756 Tj
--426 TJm
-(was) 17.9327 Tj
--426 TJm
-(opened) 35.8654 Tj
--426 TJm
-(with) 23.9102 Tj
--426 TJm
-(BZ2_bzReadOpen) 83.6858 Tj
-90 357.793 Td
-(BZ_IO_ERROR) 65.7532 Tj
-98.4879 345.838 Td
-(if) 11.9551 Tj
--426 TJm
-(there) 29.8878 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(an) 11.9551 Tj
--426 TJm
-(error) 29.8878 Tj
--426 TJm
-(writing) 41.8429 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(compressed) 59.7756 Tj
--426 TJm
-(file) 23.9102 Tj
-90 333.883 Td
-(BZ_OK) 29.8878 Tj
-98.4879 321.928 Td
-(otherwise) 53.798 Tj
-[1 0 0 1 72 306.386] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -296.423] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 275.765 Td
-/F122_0 17.2154 Tf
-(3.4.8.) 43.0729 Tj
--278 TJm
-(Handling) 73.6475 Tj
--278 TJm
-(embed) 55.4852 Tj
-10 TJm
-(ded) 30.609 Tj
--278 TJm
-(compressed) 101.416 Tj
--278 TJm
-(data) 35.3949 Tj
--278 TJm
-(streams) 66.0211 Tj
-[1 0 0 1 72 271.935] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -261.972] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 253.847 Td
-/F130_0 9.9626 Tf
-(The) 15.4918 Tj
--203 TJm
-(high-le) 28.224 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(el) 7.193 Tj
--203 TJm
-(library) 26.5603 Tj
--203 TJm
-(f) 3.31755 Tj
-10 TJm
-(acilitates) 35.417 Tj
--203 TJm
-(use) 13.2801 Tj
--203 TJm
-(of) 8.29885 Tj
-[1 0 0 1 226.404 253.847] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -226.404 -253.847] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-226.404 253.847 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 256.292 253.847] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -256.292 -253.847] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-258.316 253.847 Td
-/F130_0 9.9626 Tf
-(data) 16.5977 Tj
--203 TJm
-(streams) 30.4357 Tj
--203 TJm
-(which) 24.3486 Tj
--203 TJm
-(form) 19.3673 Tj
--203 TJm
-(some) 21.031 Tj
--203 TJm
-(part) 15.4918 Tj
--203 TJm
-(of) 8.29885 Tj
--204 TJm
-(a) 4.42339 Tj
--203 TJm
-(surrounding,) 50.6399 Tj
--212 TJm
-(lar) 10.5105 Tj
-18 TJm
-(ger) 12.7222 Tj
--203 TJm
-(data) 16.5977 Tj
--203 TJm
-(stream.) 29.0509 Tj
-[1 0 0 1 72 251.69] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -29.7236] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.9739 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -78.9739 -221.967] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-78.9739 221.967 Td
-/F130_0 9.9626 Tf
-(\225) 3.48691 Tj
-[1 0 0 1 82.4608 221.967] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.9925 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -86.944 -221.967] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 221.967 Td
-/F130_0 9.9626 Tf
-(F) 5.53921 Tj
-15 TJm
-(or) 8.29885 Tj
--240 TJm
-(writing,) 31.2726 Tj
--243 TJm
-(the) 12.1743 Tj
--240 TJm
-(library) 26.5603 Tj
--241 TJm
-(tak) 12.1743 Tj
-10 TJm
-(es) 8.29885 Tj
--240 TJm
-(an) 9.40469 Tj
--241 TJm
-(open) 19.3673 Tj
--240 TJm
-(\002le) 12.7322 Tj
--241 TJm
-(handle,) 29.0509 Tj
--242 TJm
-(writes) 24.3486 Tj
--241 TJm
-(compres) 33.7533 Tj
-1 TJm
-(sed) 13.2801 Tj
--241 TJm
-(data) 16.5977 Tj
--240 TJm
-(to) 7.7509 Tj
--241 TJm
-(it,) 8.02986 Tj
-[1 0 0 1 398.926 221.967] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -398.926 -221.967] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-398.926 221.967 Td
-/F134_0 9.9626 Tf
-(fflush) 35.8654 Tj
-[1 0 0 1 434.791 221.967] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -434.791 -221.967] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-434.791 221.967 Td
-/F130_0 9.9626 Tf
-(es) 8.29885 Tj
--240 TJm
-(it) 5.53921 Tj
--241 TJm
-(b) 4.9813 Tj
-20 TJm
-(ut) 7.7509 Tj
--240 TJm
-(does) 18.2614 Tj
--241 TJm
-(not) 12.7322 Tj
-[1 0 0 1 504.135 221.967] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -504.135 -221.967] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-504.135 221.967 Td
-/F134_0 9.9626 Tf
-(fclose) 35.8654 Tj
-[1 0 0 1 540 221.967] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -540 -221.967] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 210.011 Td
-/F130_0 9.9626 Tf
-(it.) 8.02986 Tj
--610 TJm
-(The) 15.4918 Tj
--235 TJm
-(calling) 27.1182 Tj
--235 TJm
-(application) 44.2738 Tj
--235 TJm
-(can) 13.8281 Tj
--235 TJm
-(write) 20.4731 Tj
--235 TJm
-(its) 9.41466 Tj
--235 TJm
-(o) 4.9813 Tj
-25 TJm
-(wn) 12.1743 Tj
--235 TJm
-(data) 16.5977 Tj
--235 TJm
-(before) 25.4445 Tj
--235 TJm
-(and) 14.386 Tj
--235 TJm
-(after) 18.2515 Tj
--235 TJm
-(the) 12.1743 Tj
--235 TJm
-(compressed) 47.0334 Tj
--235 TJm
-(data) 16.5977 Tj
--235 TJm
-(stream,) 29.0509 Tj
--238 TJm
-(using) 21.589 Tj
--235 TJm
-(that) 14.9439 Tj
--235 TJm
-(same) 20.4731 Tj
--235 TJm
-(\002le) 12.7322 Tj
-86.944 198.056 Td
-(handle.) 29.0509 Tj
-[1 0 0 1 115.995 198.056] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -43.9948 -21.9178] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.9739 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -78.9739 -176.139] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-78.9739 176.139 Td
-/F130_0 9.9626 Tf
-(\225) 3.48691 Tj
-[1 0 0 1 82.4608 176.139] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.9925 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -86.944 -176.139] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 176.139 Td
-/F130_0 9.9626 Tf
-(Reading) 33.2053 Tj
--236 TJm
-(is) 6.64505 Tj
--236 TJm
-(more) 20.4731 Tj
--236 TJm
-(comple) 29.3299 Tj
-15 TJm
-(x,) 7.47195 Tj
--238 TJm
-(and) 14.386 Tj
--236 TJm
-(the) 12.1743 Tj
--236 TJm
-(f) 3.31755 Tj
-10 TJm
-(acilities) 30.9936 Tj
--236 TJm
-(are) 12.1643 Tj
--236 TJm
-(not) 12.7322 Tj
--235 TJm
-(as) 8.29885 Tj
--236 TJm
-(general) 29.3199 Tj
--236 TJm
-(as) 8.29885 Tj
--236 TJm
-(the) 12.1743 Tj
-15 TJm
-(y) 4.9813 Tj
--236 TJm
-(could) 22.1369 Tj
--236 TJm
-(be) 9.40469 Tj
--236 TJm
-(since) 20.4731 Tj
--235 TJm
-(generality) 39.8404 Tj
--236 TJm
-(is) 6.64505 Tj
--236 TJm
-(hard) 17.7035 Tj
--236 TJm
-(to) 7.7509 Tj
--236 TJm
-(reconcile) 36.5129 Tj
-86.944 164.183 Td
-(with) 17.7135 Tj
--404 TJm
-(ef) 7.74094 Tj
-25 TJm
-(\002cienc) 26.5603 Tj
-15 TJm
-(y) 4.9813 Tj
-65 TJm
-(.) 2.49065 Tj
-[1 0 0 1 164.811 164.183] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -164.811 -164.183] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-164.811 164.183 Td
-/F134_0 9.9626 Tf
-(BZ2_bzRead) 59.7756 Tj
-[1 0 0 1 224.587 164.183] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -224.587 -164.183] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-228.614 164.183 Td
-/F130_0 9.9626 Tf
-(reads) 21.0211 Tj
--404 TJm
-(from) 19.3673 Tj
--405 TJm
-(the) 12.1743 Tj
--404 TJm
-(compressed) 47.0334 Tj
--404 TJm
-(\002le) 12.7322 Tj
--404 TJm
-(in) 7.7509 Tj
--405 TJm
-(blocks) 26.0123 Tj
--404 TJm
-(of) 8.29885 Tj
--404 TJm
-(size) 15.4918 Tj
-[1 0 0 1 434.744 164.183] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -434.744 -164.183] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-434.744 164.183 Td
-/F134_0 9.9626 Tf
-(BZ_MAX_UNUSED) 77.7083 Tj
-[1 0 0 1 512.452 164.183] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -512.452 -164.183] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-516.479 164.183 Td
-/F130_0 9.9626 Tf
-(bytes,) 23.5217 Tj
-86.944 152.228 Td
-(and) 14.386 Tj
--413 TJm
-(in) 7.7509 Tj
--413 TJm
-(doing) 22.6948 Tj
--413 TJm
-(so) 8.85675 Tj
--413 TJm
-(probably) 35.417 Tj
--413 TJm
-(will) 15.5018 Tj
--413 TJm
-(o) 4.9813 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(ershoot) 29.3299 Tj
--413 TJm
-(the) 12.1743 Tj
--413 TJm
-(logical) 27.1182 Tj
--413 TJm
-(end) 14.386 Tj
--413 TJm
-(of) 8.29885 Tj
--413 TJm
-(compressed) 47.0334 Tj
--413 TJm
-(stream.) 29.0509 Tj
--1598 TJm
-(T) 6.08715 Tj
-80 TJm
-(o) 4.9813 Tj
--413 TJm
-(reco) 17.1456 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(er) 7.74094 Tj
--413 TJm
-(this) 14.396 Tj
--413 TJm
-(data) 16.5977 Tj
--413 TJm
-(once) 18.8094 Tj
-86.944 140.273 Td
-(decompression) 59.7656 Tj
--252 TJm
-(has) 13.2801 Tj
--252 TJm
-(ended,) 26.2813 Tj
--253 TJm
-(call) 14.386 Tj
-[1 0 0 1 210.705 140.273] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -210.705 -140.273] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-210.705 140.273 Td
-/F134_0 9.9626 Tf
-(BZ2_bzReadGetUnused) 113.574 Tj
-[1 0 0 1 324.279 140.273] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -324.279 -140.273] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-326.789 140.273 Td
-/F130_0 9.9626 Tf
-(after) 18.2515 Tj
--252 TJm
-(the) 12.1743 Tj
--252 TJm
-(last) 13.8381 Tj
--252 TJm
-(call) 14.386 Tj
--252 TJm
-(of) 8.29885 Tj
-[1 0 0 1 406.291 140.273] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -406.291 -140.273] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-406.291 140.273 Td
-/F134_0 9.9626 Tf
-(BZ2_bzRead) 59.7756 Tj
-[1 0 0 1 466.067 140.273] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -466.067 -140.273] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-468.578 140.273 Td
-/F130_0 9.9626 Tf
-(\(the) 15.4918 Tj
--252 TJm
-(one) 14.386 Tj
--252 TJm
-(returning) 36.5229 Tj
-[1 0 0 1 86.944 128.318] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -86.944 -128.318] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 128.318 Td
-/F134_0 9.9626 Tf
-(BZ_STREAM_END) 77.7083 Tj
-[1 0 0 1 164.653 128.318] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -164.653 -128.318] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-164.653 128.318 Td
-/F130_0 9.9626 Tf
-(\)) 3.31755 Tj
--250 TJm
-(b) 4.9813 Tj
-20 TJm
-(ut) 7.7509 Tj
--250 TJm
-(before) 25.4445 Tj
--250 TJm
-(calling) 27.1182 Tj
-[1 0 0 1 243.028 128.318] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -243.028 -128.318] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-243.028 128.318 Td
-/F134_0 9.9626 Tf
-(BZ2_bzReadClose) 89.6634 Tj
-[1 0 0 1 332.692 128.318] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -332.692 -128.318] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-332.692 128.318 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
-[1 0 0 1 335.182 128.318] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -263.182 -77.466] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 374.394 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.7545] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 40.5726 -6.7545] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -493.841 -50.8519] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-534.414 50.8518 Td
-/F130_0 9.9626 Tf
-(24) 9.9626 Tj
-[1 0 0 1 453.269 50.8518] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 93.5985 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.2765 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-Q
-showpage
-%%PageTrailer
-pdfEndPage
-%%Page: 28 28
-%%BeginPageSetup
-%%PageOrientation: Portrait
-pdfStartPage
-0 0 612 792 re W
-%%EndPageSetup
-[] 0 d
-1 i
-0 j
-0 J
-10 M
-1 w
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-false op
-false OP
-0 0 612 792 re
-W
-q
-[1 0 0 1 72 741.554] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 14.4459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 187.197 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 -8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 76.4979 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -342.569 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-419.067 749.245 Td
-/F130_0 9.9626 Tf
-(Programming) 54.7943 Tj
--250 TJm
-(with) 17.7135 Tj
-[1 0 0 1 496.556 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -496.556 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-496.556 749.245 Td
-/F134_0 9.9626 Tf
-(libbzip2) 47.8205 Tj
-[1 0 0 1 544.376 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -278.305 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 280.796 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.974 -5.0363] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -0.4981] cm
-q
-[] 0 d
-0 J
-0.4981 w
-0 0.2491 m
-475.465 0.2491 l
-S
-Q
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 479.251 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -21.5542] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -720] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 710.037 Td
-/F130_0 9.9626 Tf
-(This) 17.7135 Tj
--271 TJm
-(mechanism) 45.3796 Tj
--272 TJm
-(mak) 17.1556 Tj
-10 TJm
-(es) 8.29885 Tj
--271 TJm
-(it) 5.53921 Tj
--271 TJm
-(easy) 17.7035 Tj
--271 TJm
-(to) 7.7509 Tj
--272 TJm
-(decompress) 47.0334 Tj
--271 TJm
-(multiple) 33.2153 Tj
-[1 0 0 1 293.312 710.037] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -293.312 -710.037] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-293.312 710.037 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 323.2 710.037] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -323.2 -710.037] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-325.903 710.037 Td
-/F130_0 9.9626 Tf
-(streams) 30.4357 Tj
--271 TJm
-(placed) 26.0024 Tj
--272 TJm
-(end-to-end.) 45.6486 Tj
--374 TJm
-(As) 11.0684 Tj
--271 TJm
-(the) 12.1743 Tj
--271 TJm
-(end) 14.386 Tj
--271 TJm
-(of) 8.29885 Tj
--272 TJm
-(one) 14.386 Tj
--271 TJm
-(stream,) 29.0509 Tj
-72 698.082 Td
-(when) 21.579 Tj
-[1 0 0 1 96.1948 698.082] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -96.1948 -698.082] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-96.1948 698.082 Td
-/F134_0 9.9626 Tf
-(BZ2_bzRead) 59.7756 Tj
-[1 0 0 1 155.971 698.082] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -155.971 -698.082] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-158.586 698.082 Td
-/F130_0 9.9626 Tf
-(returns) 27.6661 Tj
-[1 0 0 1 188.868 698.082] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -188.868 -698.082] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-188.868 698.082 Td
-/F134_0 9.9626 Tf
-(BZ_STREAM_END) 77.7083 Tj
-[1 0 0 1 266.577 698.082] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -266.577 -698.082] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-266.577 698.082 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--263 TJm
-(call) 14.386 Tj
-[1 0 0 1 288.685 698.082] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -288.685 -698.082] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-288.685 698.082 Td
-/F134_0 9.9626 Tf
-(BZ2_bzReadGetUnused) 113.574 Tj
-[1 0 0 1 402.259 698.082] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -402.259 -698.082] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-404.875 698.082 Td
-/F130_0 9.9626 Tf
-(to) 7.7509 Tj
--263 TJm
-(collect) 26.5603 Tj
--262 TJm
-(the) 12.1743 Tj
--263 TJm
-(unused) 28.224 Tj
--262 TJm
-(data) 16.5977 Tj
--263 TJm
-(\(cop) 17.7035 Tj
-10 TJm
-(y) 4.9813 Tj
--262 TJm
-(it) 5.53921 Tj
-72 686.127 Td
-(into) 15.5018 Tj
--265 TJm
-(your) 18.2614 Tj
--265 TJm
-(o) 4.9813 Tj
-25 TJm
-(wn) 12.1743 Tj
--265 TJm
-(b) 4.9813 Tj
-20 TJm
-(uf) 8.29885 Tj
-25 TJm
-(fer) 11.0585 Tj
--265 TJm
-(some) 21.031 Tj
-25 TJm
-(where\).) 30.1468 Tj
--711 TJm
-(That) 18.2614 Tj
--265 TJm
-(data) 16.5977 Tj
--265 TJm
-(forms) 23.2427 Tj
--265 TJm
-(the) 12.1743 Tj
--265 TJm
-(start) 17.1556 Tj
--265 TJm
-(of) 8.29885 Tj
--265 TJm
-(the) 12.1743 Tj
--265 TJm
-(ne) 9.40469 Tj
-15 TJm
-(xt) 7.7509 Tj
--265 TJm
-(compressed) 47.0334 Tj
--265 TJm
-(stream.) 29.0509 Tj
--711 TJm
-(T) 6.08715 Tj
-80 TJm
-(o) 4.9813 Tj
--265 TJm
-(start) 17.1556 Tj
--265 TJm
-(uncompressing) 60.3235 Tj
-72 674.172 Td
-(that) 14.9439 Tj
--246 TJm
-(ne) 9.40469 Tj
-15 TJm
-(xt) 7.7509 Tj
--246 TJm
-(stream,) 29.0509 Tj
--247 TJm
-(call) 14.386 Tj
-[1 0 0 1 157.205 674.172] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -157.205 -674.172] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-157.205 674.172 Td
-/F134_0 9.9626 Tf
-(BZ2_bzReadOpen) 83.6858 Tj
-[1 0 0 1 240.891 674.172] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -240.891 -674.172] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-243.344 674.172 Td
-/F130_0 9.9626 Tf
-(ag) 9.40469 Tj
-5 TJm
-(ain,) 14.6649 Tj
--247 TJm
-(feeding) 29.8778 Tj
--246 TJm
-(in) 7.7509 Tj
--246 TJm
-(the) 12.1743 Tj
--247 TJm
-(unused) 28.224 Tj
--246 TJm
-(data) 16.5977 Tj
--246 TJm
-(via) 12.1743 Tj
--246 TJm
-(the) 12.1743 Tj
-[1 0 0 1 405.967 674.172] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -405.967 -674.172] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-405.967 674.172 Td
-/F134_0 9.9626 Tf
-(unused) 35.8654 Tj
-[1 0 0 1 441.833 674.172] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -441.833 -674.172] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-444.286 674.172 Td
-/F130_0 9.9626 Tf
-(/) 2.7696 Tj
-[1 0 0 1 449.508 674.172] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -449.508 -674.172] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-449.508 674.172 Td
-/F134_0 9.9626 Tf
-(nUnused) 41.8429 Tj
-[1 0 0 1 491.351 674.172] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -491.351 -674.172] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-493.804 674.172 Td
-/F130_0 9.9626 Tf
-(parameters.) 46.1966 Tj
-72 662.217 Td
-(K) 7.193 Tj
-25 TJm
-(eep) 13.8281 Tj
--263 TJm
-(doing) 22.6948 Tj
--263 TJm
-(this) 14.396 Tj
--264 TJm
-(until) 18.2714 Tj
-[1 0 0 1 158.622 662.217] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -158.622 -662.217] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-158.622 662.217 Td
-/F134_0 9.9626 Tf
-(BZ_STREAM_END) 77.7083 Tj
-[1 0 0 1 236.33 662.217] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -236.33 -662.217] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-238.952 662.217 Td
-/F130_0 9.9626 Tf
-(return) 23.7907 Tj
--263 TJm
-(coincides) 37.6287 Tj
--263 TJm
-(with) 17.7135 Tj
--263 TJm
-(the) 12.1743 Tj
--264 TJm
-(ph) 9.9626 Tj
-5 TJm
-(ysical) 23.2427 Tj
--263 TJm
-(end) 14.386 Tj
--263 TJm
-(of) 8.29885 Tj
--263 TJm
-(\002le) 12.7322 Tj
--263 TJm
-(\() 3.31755 Tj
-[1 0 0 1 423.125 662.217] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -423.125 -662.217] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-423.125 662.217 Td
-/F134_0 9.9626 Tf
-(feof\(f\)) 41.8429 Tj
-[1 0 0 1 464.968 662.217] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -464.968 -662.217] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-464.968 662.217 Td
-/F130_0 9.9626 Tf
-(\).) 5.8082 Tj
--699 TJm
-(In) 8.29885 Tj
--263 TJm
-(this) 14.396 Tj
--263 TJm
-(situation) 34.3212 Tj
-[1 0 0 1 72 650.261] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -650.261] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 650.261 Td
-/F134_0 9.9626 Tf
-(BZ2_bzReadGetUnused) 113.574 Tj
-[1 0 0 1 185.574 650.261] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -185.574 -650.261] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-188.065 650.261 Td
-/F130_0 9.9626 Tf
-(will) 15.5018 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(course) 26.0024 Tj
--250 TJm
-(return) 23.7907 Tj
--250 TJm
-(no) 9.9626 Tj
--250 TJm
-(data.) 19.0883 Tj
-[1 0 0 1 72 648.951] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -638.989] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 628.344 Td
-/F130_0 9.9626 Tf
-(This) 17.7135 Tj
--240 TJm
-(should) 26.5703 Tj
--241 TJm
-(gi) 7.7509 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--240 TJm
-(some) 21.031 Tj
--241 TJm
-(feel) 14.9339 Tj
--240 TJm
-(for) 11.6164 Tj
--241 TJm
-(ho) 9.9626 Tj
-25 TJm
-(w) 7.193 Tj
--240 TJm
-(the) 12.1743 Tj
--240 TJm
-(high-le) 28.224 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(el) 7.193 Tj
--241 TJm
-(interf) 21.579 Tj
-10 TJm
-(ace) 13.2702 Tj
--240 TJm
-(can) 13.8281 Tj
--241 TJm
-(be) 9.40469 Tj
--240 TJm
-(used.) 20.7521 Tj
--614 TJm
-(If) 6.63509 Tj
--240 TJm
-(you) 14.9439 Tj
--241 TJm
-(require) 28.2141 Tj
--240 TJm
-(e) 4.42339 Tj
-15 TJm
-(xtra) 15.4918 Tj
--241 TJm
-(\003e) 9.9626 Tj
-15 TJm
-(xibi) 15.5018 Tj
-1 TJm
-(lity) 13.2901 Tj
-65 TJm
-(,) 2.49065 Tj
--243 TJm
-(you') 18.2614 Tj
-10 TJm
-(ll) 5.53921 Tj
--240 TJm
-(ha) 9.40469 Tj
-20 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--241 TJm
-(to) 7.7509 Tj
-72 616.389 Td
-(bite) 14.9439 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(b) 4.9813 Tj
-20 TJm
-(ullet) 17.7135 Tj
--250 TJm
-(and) 14.386 Tj
--250 TJm
-(get) 12.1743 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(grips) 19.9252 Tj
--250 TJm
-(with) 17.7135 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(lo) 7.7509 Tj
-25 TJm
-(w-le) 17.7035 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(el) 7.193 Tj
--250 TJm
-(interf) 21.579 Tj
-10 TJm
-(ace.) 15.7608 Tj
-[1 0 0 1 72 614.232] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -604.269] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 585.767 Td
-/F122_0 17.2154 Tf
-(3.4.9.) 43.0729 Tj
--278 TJm
-(Standar) 64.0929 Tj
-20 TJm
-(d) 10.5186 Tj
--278 TJm
-(\002le-reading/writing) 154.009 Tj
--278 TJm
-(code) 40.1807 Tj
-[1 0 0 1 72 581.937] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -571.975] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 563.85 Td
-/F130_0 9.9626 Tf
-(Here') 22.6749 Tj
-55 TJm
-(s) 3.87545 Tj
--250 TJm
-(ho) 9.9626 Tj
-25 TJm
-(w) 7.193 Tj
--250 TJm
-(you') 18.2614 Tj
-50 TJm
-(d) 4.9813 Tj
--250 TJm
-(write) 20.4731 Tj
--250 TJm
-(data) 16.5977 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(compressed) 47.0334 Tj
--250 TJm
-(\002le:) 15.5018 Tj
-[1 0 0 1 72 561.693] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -371.606] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 370.61 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 367.024] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -552.328] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 552.328 Td
-/F134_0 9.9626 Tf
-(FILE) 23.9102 Tj
-113.91 550.584 Td
-(*) 5.97756 Tj
-132.62 552.328 Td
-(f;) 11.9551 Tj
-90 540.373 Td
-(BZFILE) 35.8654 Tj
-125.865 538.629 Td
-(*) 5.97756 Tj
-136.087 540.373 Td
-(b;) 11.9551 Tj
-90 528.418 Td
-(int) 17.9327 Tj
--2130 TJm
-(nBuf;) 29.8878 Tj
-90 516.462 Td
-(char) 23.9102 Tj
--1704 TJm
-(buf[) 23.9102 Tj
--426 TJm
-(/) 5.97756 Tj
-165.018 514.719 Td
-(*) 5.97756 Tj
-175.24 516.462 Td
-(whatever) 47.8205 Tj
--426 TJm
-(size) 23.9102 Tj
--426 TJm
-(you) 17.9327 Tj
--426 TJm
-(like) 23.9102 Tj
-305.79 514.719 Td
-(*) 5.97756 Tj
-311.767 516.462 Td
-(/) 5.97756 Tj
--426 TJm
-(];) 11.9551 Tj
-90 504.507 Td
-(int) 17.9327 Tj
--2130 TJm
-(bzerror;) 47.8205 Tj
-90 492.552 Td
-(int) 17.9327 Tj
--2130 TJm
-(nWritten;) 53.798 Tj
-90 468.642 Td
-(f) 5.97756 Tj
--426 TJm
-(=) 5.97756 Tj
--426 TJm
-(fopen) 29.8878 Tj
--426 TJm
-(\() 5.97756 Tj
--426 TJm
-("myfile.bz2",) 77.7083 Tj
--426 TJm
-("w") 17.9327 Tj
--426 TJm
-(\);) 11.9551 Tj
-90 456.687 Td
-(if) 11.9551 Tj
--426 TJm
-(\() 5.97756 Tj
--426 TJm
-(!f) 11.9551 Tj
--426 TJm
-(\)) 5.97756 Tj
--426 TJm
-({) 5.97756 Tj
-94.244 444.731 Td
-(/) 5.97756 Tj
-100.222 442.988 Td
-(*) 5.97756 Tj
-110.443 444.731 Td
-(handle) 35.8654 Tj
--426 TJm
-(error) 29.8878 Tj
-184.685 442.988 Td
-(*) 5.97756 Tj
-190.662 444.731 Td
-(/) 5.97756 Tj
-90 432.776 Td
-(}) 5.97756 Tj
-90 420.821 Td
-(b) 5.97756 Tj
--426 TJm
-(=) 5.97756 Tj
--426 TJm
-(BZ2_bzWriteOpen\() 95.641 Tj
--426 TJm
-(&bzerror,) 53.798 Tj
--426 TJm
-(f,) 11.9551 Tj
--426 TJm
-(9) 5.97756 Tj
--426 TJm
-(\);) 11.9551 Tj
-90 408.866 Td
-(if) 11.9551 Tj
--426 TJm
-(\(bzerror) 47.8205 Tj
--426 TJm
-(!=) 11.9551 Tj
--426 TJm
-(BZ_OK\)) 35.8654 Tj
--426 TJm
-({) 5.97756 Tj
-94.244 396.911 Td
-(BZ2_bzWriteClose) 95.641 Tj
--426 TJm
-(\() 5.97756 Tj
--426 TJm
-(b) 5.97756 Tj
--426 TJm
-(\);) 11.9551 Tj
-94.244 384.956 Td
-(/) 5.97756 Tj
-100.222 383.212 Td
-(*) 5.97756 Tj
-110.443 384.956 Td
-(handle) 35.8654 Tj
--426 TJm
-(error) 29.8878 Tj
-184.685 383.212 Td
-(*) 5.97756 Tj
-190.662 384.956 Td
-(/) 5.97756 Tj
-90 373 Td
-(}) 5.97756 Tj
-90 349.09 Td
-(while) 29.8878 Tj
--426 TJm
-(\() 5.97756 Tj
--426 TJm
-(/) 5.97756 Tj
-140.331 347.347 Td
-(*) 5.97756 Tj
-150.553 349.09 Td
-(condition) 53.798 Tj
-208.595 347.347 Td
-(*) 5.97756 Tj
-214.572 349.09 Td
-(/) 5.97756 Tj
--426 TJm
-(\)) 5.97756 Tj
--426 TJm
-({) 5.97756 Tj
-94.244 337.135 Td
-(/) 5.97756 Tj
-100.222 335.391 Td
-(*) 5.97756 Tj
-110.443 337.135 Td
-(get) 17.9327 Tj
--426 TJm
-(data) 23.9102 Tj
--426 TJm
-(to) 11.9551 Tj
--426 TJm
-(write) 29.8878 Tj
--426 TJm
-(into) 23.9102 Tj
--426 TJm
-(buf,) 23.9102 Tj
--426 TJm
-(and) 17.9327 Tj
--426 TJm
-(set) 17.9327 Tj
--426 TJm
-(nBuf) 23.9102 Tj
--426 TJm
-(appropriately) 77.7083 Tj
-421.874 335.391 Td
-(*) 5.97756 Tj
-427.852 337.135 Td
-(/) 5.97756 Tj
-94.2439 325.18 Td
-(nWritten) 47.8205 Tj
--426 TJm
-(=) 5.97756 Tj
--426 TJm
-(BZ2_bzWrite) 65.7532 Tj
--426 TJm
-(\() 5.97756 Tj
--426 TJm
-(&bzerror,) 53.798 Tj
--426 TJm
-(b,) 11.9551 Tj
--426 TJm
-(buf,) 23.9102 Tj
--426 TJm
-(nBuf) 23.9102 Tj
--426 TJm
-(\);) 11.9551 Tj
-94.2439 313.225 Td
-(if) 11.9551 Tj
--426 TJm
-(\(bzerror) 47.8205 Tj
--426 TJm
-(==) 11.9551 Tj
--426 TJm
-(BZ_IO_ERROR\)) 71.7307 Tj
--426 TJm
-({) 5.97756 Tj
-102.732 301.269 Td
-(BZ2_bzWriteClose) 95.641 Tj
--426 TJm
-(\() 5.97756 Tj
--426 TJm
-(&bzerror,) 53.798 Tj
--426 TJm
-(b) 5.97756 Tj
--426 TJm
-(\);) 11.9551 Tj
-102.732 289.314 Td
-(/) 5.97756 Tj
-108.709 287.571 Td
-(*) 5.97756 Tj
-118.931 289.314 Td
-(handle) 35.8654 Tj
--426 TJm
-(error) 29.8878 Tj
-193.172 287.571 Td
-(*) 5.97756 Tj
-199.15 289.314 Td
-(/) 5.97756 Tj
-94.2439 277.359 Td
-(}) 5.97756 Tj
-90 265.404 Td
-(}) 5.97756 Tj
-90 241.494 Td
-(BZ2_bzWriteClose\() 101.619 Tj
--426 TJm
-(&bzerror,) 53.798 Tj
--426 TJm
-(b) 5.97756 Tj
--426 TJm
-(\);) 11.9551 Tj
-90 229.538 Td
-(if) 11.9551 Tj
--426 TJm
-(\(bzerror) 47.8205 Tj
--426 TJm
-(==) 11.9551 Tj
--426 TJm
-(BZ_IO_ERROR\)) 71.7307 Tj
--426 TJm
-({) 5.97756 Tj
-94.2439 217.583 Td
-(/) 5.97756 Tj
-100.221 215.84 Td
-(*) 5.97756 Tj
-110.443 217.583 Td
-(handle) 35.8654 Tj
--426 TJm
-(error) 29.8878 Tj
-184.684 215.84 Td
-(*) 5.97756 Tj
-190.662 217.583 Td
-(/) 5.97756 Tj
-89.9999 205.628 Td
-(}) 5.97756 Tj
-[1 0 0 1 72 190.086] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -180.124] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 168.168 Td
-/F130_0 9.9626 Tf
-(And) 17.1556 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(read) 17.1456 Tj
--250 TJm
-(from) 19.3673 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(compressed) 47.0334 Tj
--250 TJm
-(\002le:) 15.5018 Tj
-[1 0 0 1 72 166.012] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -115.16] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 374.394 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.8541] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 40.5726 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -493.841 -50.9513] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-534.414 50.9513 Td
-/F130_0 9.9626 Tf
-(25) 9.9626 Tj
-[1 0 0 1 453.269 50.8518] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 93.5985 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.2765 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-Q
-showpage
-%%PageTrailer
-pdfEndPage
-%%Page: 29 29
-%%BeginPageSetup
-%%PageOrientation: Portrait
-pdfStartPage
-0 0 612 792 re W
-%%EndPageSetup
-[] 0 d
-1 i
-0 j
-0 J
-10 M
-1 w
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-false op
-false OP
-0 0 612 792 re
-W
-q
-[1 0 0 1 72 741.554] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 14.4459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 187.197 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 -8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 76.4979 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -342.569 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-419.067 749.245 Td
-/F130_0 9.9626 Tf
-(Programming) 54.7943 Tj
--250 TJm
-(with) 17.7135 Tj
-[1 0 0 1 496.556 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -496.556 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-496.556 749.245 Td
-/F134_0 9.9626 Tf
-(libbzip2) 47.8205 Tj
-[1 0 0 1 544.376 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -278.305 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 280.796 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.974 -5.0363] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -0.4981] cm
-q
-[] 0 d
-0 J
-0.4981 w
-0 0.2491 m
-475.465 0.2491 l
-S
-Q
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 479.251 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -392.164] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 370.61 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 367.024] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -711.631] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 711.631 Td
-/F134_0 9.9626 Tf
-(FILE) 23.9102 Tj
-113.91 709.888 Td
-(*) 5.97756 Tj
-132.62 711.631 Td
-(f;) 11.9551 Tj
-90 699.676 Td
-(BZFILE) 35.8654 Tj
-125.865 697.933 Td
-(*) 5.97756 Tj
-136.087 699.676 Td
-(b;) 11.9551 Tj
-90 687.721 Td
-(int) 17.9327 Tj
--2130 TJm
-(nBuf;) 29.8878 Tj
-90 675.766 Td
-(char) 23.9102 Tj
--1704 TJm
-(buf[) 23.9102 Tj
--426 TJm
-(/) 5.97756 Tj
-165.018 674.023 Td
-(*) 5.97756 Tj
-175.24 675.766 Td
-(whatever) 47.8205 Tj
--426 TJm
-(size) 23.9102 Tj
--426 TJm
-(you) 17.9327 Tj
--426 TJm
-(like) 23.9102 Tj
-305.79 674.023 Td
-(*) 5.97756 Tj
-311.767 675.766 Td
-(/) 5.97756 Tj
--426 TJm
-(];) 11.9551 Tj
-90 663.811 Td
-(int) 17.9327 Tj
--2130 TJm
-(bzerror;) 47.8205 Tj
-90 651.856 Td
-(int) 17.9327 Tj
--2130 TJm
-(nWritten;) 53.798 Tj
-90 627.945 Td
-(f) 5.97756 Tj
--426 TJm
-(=) 5.97756 Tj
--426 TJm
-(fopen) 29.8878 Tj
--426 TJm
-(\() 5.97756 Tj
--426 TJm
-("myfile.bz2",) 77.7083 Tj
--426 TJm
-("r") 17.9327 Tj
--426 TJm
-(\);) 11.9551 Tj
-90 615.99 Td
-(if) 11.9551 Tj
--426 TJm
-(\() 5.97756 Tj
--426 TJm
-(!f) 11.9551 Tj
--426 TJm
-(\)) 5.97756 Tj
--426 TJm
-({) 5.97756 Tj
-98.488 604.035 Td
-(/) 5.97756 Tj
-104.466 602.292 Td
-(*) 5.97756 Tj
-114.687 604.035 Td
-(handle) 35.8654 Tj
--426 TJm
-(error) 29.8878 Tj
-188.929 602.292 Td
-(*) 5.97756 Tj
-194.906 604.035 Td
-(/) 5.97756 Tj
-90 592.08 Td
-(}) 5.97756 Tj
-90 580.125 Td
-(b) 5.97756 Tj
--426 TJm
-(=) 5.97756 Tj
--426 TJm
-(BZ2_bzReadOpen) 83.6858 Tj
--426 TJm
-(\() 5.97756 Tj
--426 TJm
-(&bzerror,) 53.798 Tj
--426 TJm
-(f,) 11.9551 Tj
--426 TJm
-(0,) 11.9551 Tj
--426 TJm
-(NULL,) 29.8878 Tj
--426 TJm
-(0) 5.97756 Tj
--426 TJm
-(\);) 11.9551 Tj
-90 568.169 Td
-(if) 11.9551 Tj
--426 TJm
-(\() 5.97756 Tj
--426 TJm
-(bzerror) 41.8429 Tj
--426 TJm
-(!=) 11.9551 Tj
--426 TJm
-(BZ_OK) 29.8878 Tj
--426 TJm
-(\)) 5.97756 Tj
--426 TJm
-({) 5.97756 Tj
-98.488 556.214 Td
-(BZ2_bzReadClose) 89.6634 Tj
--426 TJm
-(\() 5.97756 Tj
--426 TJm
-(&bzerror,) 53.798 Tj
--426 TJm
-(b) 5.97756 Tj
--426 TJm
-(\);) 11.9551 Tj
-98.488 544.259 Td
-(/) 5.97756 Tj
-104.466 542.516 Td
-(*) 5.97756 Tj
-114.687 544.259 Td
-(handle) 35.8654 Tj
--426 TJm
-(error) 29.8878 Tj
-188.929 542.516 Td
-(*) 5.97756 Tj
-194.906 544.259 Td
-(/) 5.97756 Tj
-90 532.304 Td
-(}) 5.97756 Tj
-90 508.394 Td
-(bzerror) 41.8429 Tj
--426 TJm
-(=) 5.97756 Tj
--426 TJm
-(BZ_OK;) 35.8654 Tj
-90 496.438 Td
-(while) 29.8878 Tj
--426 TJm
-(\() 5.97756 Tj
--426 TJm
-(bzerror) 41.8429 Tj
--426 TJm
-(==) 11.9551 Tj
--426 TJm
-(BZ_OK) 29.8878 Tj
--426 TJm
-(&&) 11.9551 Tj
--426 TJm
-(/) 5.97756 Tj
-252.948 494.695 Td
-(*) 5.97756 Tj
-263.17 496.438 Td
-(arbitrary) 53.798 Tj
--426 TJm
-(other) 29.8878 Tj
--426 TJm
-(conditions) 59.7756 Tj
-419.364 494.695 Td
-(*) 5.97756 Tj
-425.341 496.438 Td
-(/\)) 11.9551 Tj
--426 TJm
-({) 5.97756 Tj
-98.488 484.483 Td
-(nBuf) 23.9102 Tj
--426 TJm
-(=) 5.97756 Tj
--426 TJm
-(BZ2_bzRead) 59.7756 Tj
--426 TJm
-(\() 5.97756 Tj
--426 TJm
-(&bzerror,) 53.798 Tj
--426 TJm
-(b,) 11.9551 Tj
--426 TJm
-(buf,) 23.9102 Tj
--426 TJm
-(/) 5.97756 Tj
-319.478 482.74 Td
-(*) 5.97756 Tj
-329.7 484.483 Td
-(size) 23.9102 Tj
--426 TJm
-(of) 11.9551 Tj
--426 TJm
-(buf) 17.9327 Tj
-396.23 482.74 Td
-(*) 5.97756 Tj
-402.208 484.483 Td
-(/) 5.97756 Tj
--426 TJm
-(\);) 11.9551 Tj
-98.488 472.528 Td
-(if) 11.9551 Tj
--426 TJm
-(\() 5.97756 Tj
--426 TJm
-(bzerror) 41.8429 Tj
--426 TJm
-(==) 11.9551 Tj
--426 TJm
-(BZ_OK) 29.8878 Tj
--426 TJm
-(\)) 5.97756 Tj
--426 TJm
-({) 5.97756 Tj
-106.976 460.573 Td
-(/) 5.97756 Tj
-112.953 458.829 Td
-(*) 5.97756 Tj
-123.175 460.573 Td
-(do) 11.9551 Tj
--426 TJm
-(something) 53.798 Tj
--426 TJm
-(with) 23.9102 Tj
--426 TJm
-(buf[0) 29.8878 Tj
--426 TJm
-(..) 11.9551 Tj
--426 TJm
-(nBuf-1]) 41.8429 Tj
-321.989 458.829 Td
-(*) 5.97756 Tj
-327.966 460.573 Td
-(/) 5.97756 Tj
-98.4879 448.618 Td
-(}) 5.97756 Tj
-90 436.663 Td
-(}) 5.97756 Tj
-90 424.707 Td
-(if) 11.9551 Tj
--426 TJm
-(\() 5.97756 Tj
--426 TJm
-(bzerror) 41.8429 Tj
--426 TJm
-(!=) 11.9551 Tj
--426 TJm
-(BZ_STREAM_END) 77.7083 Tj
--426 TJm
-(\)) 5.97756 Tj
--426 TJm
-({) 5.97756 Tj
-102.732 412.752 Td
-(BZ2_bzReadClose) 89.6634 Tj
--426 TJm
-(\() 5.97756 Tj
--426 TJm
-(&bzerror,) 53.798 Tj
--426 TJm
-(b) 5.97756 Tj
--426 TJm
-(\);) 11.9551 Tj
-102.732 400.797 Td
-(/) 5.97756 Tj
-108.709 399.054 Td
-(*) 5.97756 Tj
-118.931 400.797 Td
-(handle) 35.8654 Tj
--426 TJm
-(error) 29.8878 Tj
-193.172 399.054 Td
-(*) 5.97756 Tj
-199.15 400.797 Td
-(/) 5.97756 Tj
-90 388.842 Td
-(}) 5.97756 Tj
--426 TJm
-(else) 23.9102 Tj
--426 TJm
-({) 5.97756 Tj
-102.732 376.887 Td
-(BZ2_bzReadClose) 89.6634 Tj
--426 TJm
-(\() 5.97756 Tj
--426 TJm
-(&bzerror,) 53.798 Tj
--426 TJm
-(b) 5.97756 Tj
--426 TJm
-(\);) 11.9551 Tj
-90 364.932 Td
-(}) 5.97756 Tj
-[1 0 0 1 72 349.39] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -339.427] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 314.637 Td
-/F122_0 20.6585 Tf
-(3.5.) 34.4584 Tj
--278 TJm
-(Utility) 57.3893 Tj
--278 TJm
-(functions) 92.9633 Tj
-[1 0 0 1 72 310.361] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -300.398] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 284.016 Td
-/F122_0 17.2154 Tf
-(3.5.1.) 43.0729 Tj
-[1 0 0 1 119.858 284.016] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -119.858 -284.016] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-119.858 284.016 Td
-/F392_0 17.2154 Tf
-(BZ2_bzBuffToBuffCompress) 247.902 Tj
-[1 0 0 1 367.76 284.016] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -295.76 -2.3327] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -96.6376] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 95.6413 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 92.0548] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -272.318] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 272.318 Td
-/F134_0 9.9626 Tf
-(int) 17.9327 Tj
--426 TJm
-(BZ2_bzBuffToBuffCompress\() 149.439 Tj
--426 TJm
-(char) 23.9102 Tj
-289.771 270.575 Td
-(*) 5.97756 Tj
-333.944 272.318 Td
-(dest,) 29.8878 Tj
-217.319 260.363 Td
-(unsigned) 47.8205 Tj
--426 TJm
-(int) 17.9327 Tj
-287.317 258.62 Td
-(*) 5.97756 Tj
-297.538 260.363 Td
-(destLen,) 47.8205 Tj
-217.319 248.408 Td
-(char) 23.9102 Tj
-241.23 246.664 Td
-(*) 5.97756 Tj
-285.403 248.408 Td
-(source,) 41.8429 Tj
-217.319 236.453 Td
-(unsigned) 47.8205 Tj
--426 TJm
-(int) 17.9327 Tj
--852 TJm
-(sourceLen,) 59.7756 Tj
-217.319 224.498 Td
-(int) 17.9327 Tj
--4686 TJm
-(blockSize100k,) 83.6858 Tj
-217.319 212.542 Td
-(int) 17.9327 Tj
--4686 TJm
-(verbosity,) 59.7756 Tj
-217.319 200.587 Td
-(int) 17.9327 Tj
--4686 TJm
-(workFactor) 59.7756 Tj
--426 TJm
-(\);) 11.9551 Tj
-[1 0 0 1 72 185.045] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -175.083] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 163.128 Td
-/F130_0 9.9626 Tf
-(Attempts) 36.5329 Tj
--442 TJm
-(to) 7.7509 Tj
--442 TJm
-(compress) 37.6287 Tj
--443 TJm
-(the) 12.1743 Tj
--442 TJm
-(data) 16.5977 Tj
--442 TJm
-(in) 7.7509 Tj
-[1 0 0 1 216.87 163.128] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -216.87 -163.128] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-216.87 163.128 Td
-/F134_0 9.9626 Tf
-(source[0) 47.8205 Tj
--600 TJm
-(..) 11.9551 Tj
--1200 TJm
-(sourceLen-1]) 71.7307 Tj
-[1 0 0 1 366.31 163.128] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -366.31 -163.128] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-370.715 163.128 Td
-/F130_0 9.9626 Tf
-(into) 15.5018 Tj
--442 TJm
-(the) 12.1743 Tj
--442 TJm
-(destination) 43.7259 Tj
--443 TJm
-(b) 4.9813 Tj
-20 TJm
-(uf) 8.29885 Tj
-25 TJm
-(fer) 11.0585 Tj
-40 TJm
-(,) 2.49065 Tj
-[1 0 0 1 486.202 163.128] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -486.202 -163.128] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-486.202 163.128 Td
-/F134_0 9.9626 Tf
-(dest[0) 35.8654 Tj
--600 TJm
-(..) 11.9551 Tj
-72 149.429 Td
-(*) 5.97756 Tj
-77.9776 151.173 Td
-(destLen-1]) 59.7756 Tj
-[1 0 0 1 137.753 151.172] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -137.753 -151.172] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-137.753 151.172 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
--1393 TJm
-(If) 6.63509 Tj
--379 TJm
-(the) 12.1743 Tj
--379 TJm
-(destination) 43.7259 Tj
--379 TJm
-(b) 4.9813 Tj
-20 TJm
-(uf) 8.29885 Tj
-25 TJm
-(fer) 11.0585 Tj
--378 TJm
-(is) 6.64505 Tj
--379 TJm
-(big) 12.7322 Tj
--379 TJm
-(enough,) 31.8205 Tj
-[1 0 0 1 318.486 151.172] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -318.486 -151.172] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-318.486 149.429 Td
-/F134_0 9.9626 Tf
-(*) 5.97756 Tj
-324.464 151.173 Td
-(destLen) 41.8429 Tj
-[1 0 0 1 366.307 151.172] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -366.307 -151.172] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-370.081 151.172 Td
-/F130_0 9.9626 Tf
-(is) 6.64505 Tj
--379 TJm
-(set) 11.0684 Tj
--379 TJm
-(to) 7.7509 Tj
--378 TJm
-(the) 12.1743 Tj
--379 TJm
-(size) 15.4918 Tj
--379 TJm
-(of) 8.29885 Tj
--379 TJm
-(the) 12.1743 Tj
--379 TJm
-(compressed) 47.0334 Tj
--379 TJm
-(data,) 19.0883 Tj
-72 139.217 Td
-(and) 14.386 Tj
-[1 0 0 1 89.5273 139.217] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -89.5273 -139.217] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-89.5273 139.217 Td
-/F134_0 9.9626 Tf
-(BZ_OK) 29.8878 Tj
-[1 0 0 1 119.415 139.217] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -119.415 -139.217] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-122.556 139.217 Td
-/F130_0 9.9626 Tf
-(is) 6.64505 Tj
--315 TJm
-(returned.) 35.686 Tj
--1012 TJm
-(If) 6.63509 Tj
--315 TJm
-(the) 12.1743 Tj
--316 TJm
-(compressed) 47.0334 Tj
--315 TJm
-(data) 16.5977 Tj
--315 TJm
-(w) 7.193 Tj
-10 TJm
-(on') 13.2801 Tj
-18 TJm
-(t) 2.7696 Tj
--316 TJm
-(\002t,) 10.7995 Tj
-[1 0 0 1 313.322 139.217] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -313.322 -139.217] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-313.322 137.474 Td
-/F134_0 9.9626 Tf
-(*) 5.97756 Tj
-319.3 139.217 Td
-(destLen) 41.8429 Tj
-[1 0 0 1 361.143 139.217] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -361.143 -139.217] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-364.284 139.217 Td
-/F130_0 9.9626 Tf
-(is) 6.64505 Tj
--315 TJm
-(unchanged,) 45.6486 Tj
--332 TJm
-(and) 14.386 Tj
-[1 0 0 1 440.551 139.217] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -440.551 -139.217] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-440.551 139.217 Td
-/F134_0 9.9626 Tf
-(BZ_OUTBUFF_FULL) 89.6634 Tj
-[1 0 0 1 530.215 139.217] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -530.215 -139.217] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-533.355 139.217 Td
-/F130_0 9.9626 Tf
-(is) 6.64505 Tj
-72 127.262 Td
-(returned.) 35.686 Tj
-[1 0 0 1 72 127.163] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -117.2] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 105.344 Td
-/F130_0 9.9626 Tf
-(Compression) 52.5826 Tj
--297 TJm
-(in) 7.7509 Tj
--297 TJm
-(this) 14.396 Tj
--297 TJm
-(manner) 29.8778 Tj
--297 TJm
-(is) 6.64505 Tj
--297 TJm
-(a) 4.42339 Tj
--297 TJm
-(one-shot) 34.3112 Tj
--297 TJm
-(e) 4.42339 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(ent,) 14.6649 Tj
--309 TJm
-(done) 19.3673 Tj
--297 TJm
-(with) 17.7135 Tj
--297 TJm
-(a) 4.42339 Tj
--297 TJm
-(single) 23.8007 Tj
--297 TJm
-(call) 14.386 Tj
--297 TJm
-(to) 7.7509 Tj
--297 TJm
-(this) 14.396 Tj
--297 TJm
-(function.) 35.696 Tj
--903 TJm
-(The) 15.4918 Tj
--297 TJm
-(resulting) 34.8691 Tj
--297 TJm
-(compressed) 47.0334 Tj
-72 93.3892 Td
-(data) 16.5977 Tj
--296 TJm
-(is) 6.64505 Tj
--296 TJm
-(a) 4.42339 Tj
--296 TJm
-(complete) 36.5229 Tj
-[1 0 0 1 147.988 93.3892] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -147.988 -93.3892] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-147.988 93.3892 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 177.875 93.3892] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -177.875 -93.3892] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-180.825 93.3892 Td
-/F130_0 9.9626 Tf
-(format) 26.5603 Tj
--296 TJm
-(data) 16.5977 Tj
--296 TJm
-(stream.) 29.0509 Tj
--897 TJm
-(There) 23.2328 Tj
--296 TJm
-(is) 6.64505 Tj
--296 TJm
-(no) 9.9626 Tj
--296 TJm
-(mechanism) 45.3796 Tj
--296 TJm
-(for) 11.6164 Tj
--296 TJm
-(making) 29.8878 Tj
--296 TJm
-(additional) 39.8504 Tj
--296 TJm
-(calls) 18.2614 Tj
--296 TJm
-(to) 7.7509 Tj
--296 TJm
-(pro) 13.2801 Tj
-15 TJm
-(vide) 17.1556 Tj
--296 TJm
-(e) 4.42339 Tj
-15 TJm
-(xtra) 15.4918 Tj
-72 81.434 Td
-(input) 20.4831 Tj
--250 TJm
-(data.) 19.0883 Tj
--620 TJm
-(If) 6.63509 Tj
--250 TJm
-(you) 14.9439 Tj
--250 TJm
-(w) 7.193 Tj
-10 TJm
-(ant) 12.1743 Tj
--250 TJm
-(that) 14.9439 Tj
--250 TJm
-(kind) 17.7135 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(mechanism,) 47.8703 Tj
--250 TJm
-(use) 13.2801 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(lo) 7.7509 Tj
-25 TJm
-(w-le) 17.7035 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(el) 7.193 Tj
--250 TJm
-(interf) 21.579 Tj
-10 TJm
-(ace.) 15.7608 Tj
-[1 0 0 1 72 79.2772] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -28.4254] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 374.394 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.8541] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 40.5726 -6.7545] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -493.841 -50.9514] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-534.414 50.9514 Td
-/F130_0 9.9626 Tf
-(26) 9.9626 Tj
-[1 0 0 1 453.269 50.8518] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 93.5985 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.2765 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-Q
-showpage
-%%PageTrailer
-pdfEndPage
-%%Page: 30 30
-%%BeginPageSetup
-%%PageOrientation: Portrait
-pdfStartPage
-0 0 612 792 re W
-%%EndPageSetup
-[] 0 d
-1 i
-0 j
-0 J
-10 M
-1 w
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-false op
-false OP
-0 0 612 792 re
-W
-q
-[1 0 0 1 72 741.554] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 14.4459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 187.197 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 -8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 76.4979 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -342.569 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-419.067 749.245 Td
-/F130_0 9.9626 Tf
-(Programming) 54.7943 Tj
--250 TJm
-(with) 17.7135 Tj
-[1 0 0 1 496.556 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -496.556 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-496.556 749.245 Td
-/F134_0 9.9626 Tf
-(libbzip2) 47.8205 Tj
-[1 0 0 1 544.376 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -278.305 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 280.796 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.974 -5.0363] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -0.4981] cm
-q
-[] 0 d
-0 J
-0.4981 w
-0 0.2491 m
-475.465 0.2491 l
-S
-Q
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 479.251 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -21.5542] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -720] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 710.037 Td
-/F130_0 9.9626 Tf
-(F) 5.53921 Tj
-15 TJm
-(or) 8.29885 Tj
--223 TJm
-(the) 12.1743 Tj
--224 TJm
-(meaning) 34.3112 Tj
--223 TJm
-(of) 8.29885 Tj
--224 TJm
-(parameters) 43.7059 Tj
-[1 0 0 1 195.306 710.037] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -195.306 -710.037] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-195.306 710.037 Td
-/F134_0 9.9626 Tf
-(blockSize100k) 77.7083 Tj
-[1 0 0 1 273.015 710.037] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -273.015 -710.037] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-273.015 710.037 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 277.784 710.037] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -277.784 -710.037] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-277.784 710.037 Td
-/F134_0 9.9626 Tf
-(verbosity) 53.798 Tj
-[1 0 0 1 331.583 710.037] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -331.583 -710.037] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-333.808 710.037 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 350.42 710.037] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -350.42 -710.037] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-350.42 710.037 Td
-/F134_0 9.9626 Tf
-(workFactor) 59.7756 Tj
-[1 0 0 1 410.196 710.037] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -410.196 -710.037] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-410.196 710.037 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--229 TJm
-(see) 12.7222 Tj
-[1 0 0 1 429.913 710.037] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -429.913 -710.037] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-429.913 710.037 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompressInit) 107.596 Tj
-[1 0 0 1 537.509 710.037] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -537.509 -710.037] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-537.509 710.037 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
-[1 0 0 1 72 707.88] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -697.918] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 688.12 Td
-/F130_0 9.9626 Tf
-(T) 6.08715 Tj
-80 TJm
-(o) 4.9813 Tj
--410 TJm
-(guarantee) 38.7246 Tj
--410 TJm
-(that) 14.9439 Tj
--410 TJm
-(the) 12.1743 Tj
--410 TJm
-(compressed) 47.0334 Tj
--410 TJm
-(data) 16.5977 Tj
--410 TJm
-(will) 15.5018 Tj
--410 TJm
-(\002t) 8.30881 Tj
--410 TJm
-(in) 7.7509 Tj
--410 TJm
-(its) 9.41466 Tj
--410 TJm
-(b) 4.9813 Tj
-20 TJm
-(uf) 8.29885 Tj
-25 TJm
-(fer) 11.0585 Tj
-40 TJm
-(,) 2.49065 Tj
--450 TJm
-(allocate) 30.9837 Tj
--410 TJm
-(an) 9.40469 Tj
--410 TJm
-(output) 25.4644 Tj
--410 TJm
-(b) 4.9813 Tj
-20 TJm
-(uf) 8.29885 Tj
-25 TJm
-(fer) 11.0585 Tj
--411 TJm
-(of) 8.29885 Tj
--410 TJm
-(size) 15.4918 Tj
--410 TJm
-(1%) 13.2801 Tj
--410 TJm
-(lar) 10.5105 Tj
-18 TJm
-(ger) 12.7222 Tj
--410 TJm
-(than) 17.1556 Tj
--410 TJm
-(the) 12.1743 Tj
-72 676.164 Td
-(uncompressed) 56.996 Tj
--250 TJm
-(data,) 19.0883 Tj
--250 TJm
-(plus) 16.6077 Tj
--250 TJm
-(six) 11.6264 Tj
--250 TJm
-(hundred) 32.6474 Tj
--250 TJm
-(e) 4.42339 Tj
-15 TJm
-(xtra) 15.4918 Tj
--250 TJm
-(bytes.) 23.5217 Tj
-[1 0 0 1 72 674.007] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -664.045] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 654.247 Td
-/F134_0 9.9626 Tf
-(BZ2_bzBuffToBuffDecompress) 155.417 Tj
-[1 0 0 1 227.417 654.247] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -227.417 -654.247] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-230.553 654.247 Td
-/F130_0 9.9626 Tf
-(will) 15.5018 Tj
--315 TJm
-(not) 12.7322 Tj
--315 TJm
-(write) 20.4731 Tj
--314 TJm
-(data) 16.5977 Tj
--315 TJm
-(at) 7.193 Tj
--315 TJm
-(or) 8.29885 Tj
--315 TJm
-(be) 9.40469 Tj
-15 TJm
-(yond) 19.9252 Tj
-[1 0 0 1 362.484 654.247] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -362.484 -654.247] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-362.484 654.247 Td
-/F134_0 9.9626 Tf
-(dest[) 29.8878 Tj
-392.372 652.503 Td
-(*) 5.97756 Tj
-398.349 654.247 Td
-(destLen]) 47.8205 Tj
-[1 0 0 1 446.17 654.247] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -446.17 -654.247] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-446.17 654.247 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--331 TJm
-(e) 4.42339 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(en) 9.40469 Tj
--315 TJm
-(in) 7.7509 Tj
--315 TJm
-(case) 17.1456 Tj
--314 TJm
-(of) 8.29885 Tj
--315 TJm
-(b) 4.9813 Tj
-20 TJm
-(uf) 8.29885 Tj
-25 TJm
-(fer) 11.0585 Tj
-72 642.291 Td
-(o) 4.9813 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(er\003o) 18.2614 Tj
-25 TJm
-(w) 7.193 Tj
-65 TJm
-(.) 2.49065 Tj
-[1 0 0 1 72 642.192] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -632.229] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 620.374 Td
-/F130_0 9.9626 Tf
-(Possible) 33.2153 Tj
--250 TJm
-(return) 23.7907 Tj
--250 TJm
-(v) 4.9813 Tj
-25 TJm
-(alues:) 23.2427 Tj
-[1 0 0 1 72 620.274] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -168.369] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 167.372 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 163.786] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -610.909] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 610.909 Td
-/F134_0 9.9626 Tf
-(BZ_CONFIG_ERROR) 89.6634 Tj
-98.4879 598.954 Td
-(if) 11.9551 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(library) 41.8429 Tj
--426 TJm
-(has) 17.9327 Tj
--426 TJm
-(been) 23.9102 Tj
--426 TJm
-(mis-compiled) 71.7307 Tj
-90 586.999 Td
-(BZ_PARAM_ERROR) 83.6858 Tj
-98.4879 575.044 Td
-(if) 11.9551 Tj
--426 TJm
-(dest) 23.9102 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(NULL) 23.9102 Tj
--426 TJm
-(or) 11.9551 Tj
--426 TJm
-(destLen) 41.8429 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(NULL) 23.9102 Tj
-98.4879 563.088 Td
-(or) 11.9551 Tj
--426 TJm
-(blockSize100k) 77.7083 Tj
--426 TJm
-(<) 5.97756 Tj
--426 TJm
-(1) 5.97756 Tj
--426 TJm
-(or) 11.9551 Tj
--426 TJm
-(blockSize100k) 77.7083 Tj
--426 TJm
-(>) 5.97756 Tj
--426 TJm
-(9) 5.97756 Tj
-98.4879 551.133 Td
-(or) 11.9551 Tj
--426 TJm
-(verbosity) 53.798 Tj
--426 TJm
-(<) 5.97756 Tj
--426 TJm
-(0) 5.97756 Tj
--426 TJm
-(or) 11.9551 Tj
--426 TJm
-(verbosity) 53.798 Tj
--426 TJm
-(>) 5.97756 Tj
--426 TJm
-(4) 5.97756 Tj
-98.4879 539.178 Td
-(or) 11.9551 Tj
--426 TJm
-(workFactor) 59.7756 Tj
--426 TJm
-(<) 5.97756 Tj
--426 TJm
-(0) 5.97756 Tj
--426 TJm
-(or) 11.9551 Tj
--426 TJm
-(workFactor) 59.7756 Tj
--426 TJm
-(>) 5.97756 Tj
--426 TJm
-(250) 17.9327 Tj
-90 527.223 Td
-(BZ_MEM_ERROR) 71.7307 Tj
-98.4879 515.268 Td
-(if) 11.9551 Tj
--426 TJm
-(insufficient) 71.7307 Tj
--426 TJm
-(memory) 35.8654 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(available) 53.798 Tj
-90 503.313 Td
-(BZ_OUTBUFF_FULL) 89.6634 Tj
-98.4879 491.357 Td
-(if) 11.9551 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(size) 23.9102 Tj
--426 TJm
-(of) 11.9551 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(compressed) 59.7756 Tj
--426 TJm
-(data) 23.9102 Tj
--426 TJm
-(exceeds) 41.8429 Tj
-341.655 489.614 Td
-(*) 5.97756 Tj
-347.633 491.357 Td
-(destLen) 41.8429 Tj
-90 479.402 Td
-(BZ_OK) 29.8878 Tj
-98.4879 467.447 Td
-(otherwise) 53.798 Tj
-[1 0 0 1 72 451.905] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -441.943] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 421.284 Td
-/F122_0 17.2154 Tf
-(3.5.2.) 43.0729 Tj
-[1 0 0 1 119.858 421.284] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -119.858 -421.284] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-119.858 421.284 Td
-/F392_0 17.2154 Tf
-(BZ2_bzBuffToBuffDecompress) 268.56 Tj
-[1 0 0 1 388.419 421.284] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -316.419 -2.3327] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -84.6824] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 83.6862 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 80.0996] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -409.587] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 409.587 Td
-/F134_0 9.9626 Tf
-(int) 17.9327 Tj
--426 TJm
-(BZ2_bzBuffToBuffDecompress\() 161.394 Tj
--426 TJm
-(char) 23.9102 Tj
-301.726 407.843 Td
-(*) 5.97756 Tj
-345.899 409.587 Td
-(dest,) 29.8878 Tj
-225.807 397.632 Td
-(unsigned) 47.8205 Tj
--426 TJm
-(int) 17.9327 Tj
-295.805 395.888 Td
-(*) 5.97756 Tj
-306.026 397.632 Td
-(destLen,) 47.8205 Tj
-225.807 385.676 Td
-(char) 23.9102 Tj
-249.718 383.933 Td
-(*) 5.97756 Tj
-293.891 385.676 Td
-(source,) 41.8429 Tj
-225.807 373.721 Td
-(unsigned) 47.8205 Tj
--426 TJm
-(int) 17.9327 Tj
--852 TJm
-(sourceLen,) 59.7756 Tj
-225.807 361.766 Td
-(int) 17.9327 Tj
--4686 TJm
-(small,) 35.8654 Tj
-225.807 349.811 Td
-(int) 17.9327 Tj
--4686 TJm
-(verbosity) 53.798 Tj
--426 TJm
-(\);) 11.9551 Tj
-[1 0 0 1 72 334.269] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -324.306] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 312.351 Td
-/F130_0 9.9626 Tf
-(Attempts) 36.5329 Tj
--358 TJm
-(to) 7.7509 Tj
--359 TJm
-(decompress) 47.0334 Tj
--358 TJm
-(the) 12.1743 Tj
--358 TJm
-(data) 16.5977 Tj
--359 TJm
-(in) 7.7509 Tj
-[1 0 0 1 221.259 312.351] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -221.259 -312.351] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-221.259 312.351 Td
-/F134_0 9.9626 Tf
-(source[0) 47.8205 Tj
--600 TJm
-(..) 11.9551 Tj
--1200 TJm
-(sourceLen-1]) 71.7307 Tj
-[1 0 0 1 370.698 312.351] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -370.698 -312.351] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-374.268 312.351 Td
-/F130_0 9.9626 Tf
-(into) 15.5018 Tj
--358 TJm
-(the) 12.1743 Tj
--359 TJm
-(destination) 43.7259 Tj
--358 TJm
-(b) 4.9813 Tj
-20 TJm
-(uf) 8.29885 Tj
-25 TJm
-(fer) 11.0585 Tj
-40 TJm
-(,) 2.49065 Tj
-[1 0 0 1 486.202 312.351] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -486.202 -312.351] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-486.202 312.351 Td
-/F134_0 9.9626 Tf
-(dest[0) 35.8654 Tj
--600 TJm
-(..) 11.9551 Tj
-72 298.653 Td
-(*) 5.97756 Tj
-77.9776 300.396 Td
-(destLen-1]) 59.7756 Tj
-[1 0 0 1 137.753 300.396] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -137.753 -300.396] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-137.753 300.396 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
--1123 TJm
-(If) 6.63509 Tj
--334 TJm
-(the) 12.1743 Tj
--334 TJm
-(destination) 43.7259 Tj
--334 TJm
-(b) 4.9813 Tj
-20 TJm
-(uf) 8.29885 Tj
-25 TJm
-(fer) 11.0585 Tj
--334 TJm
-(is) 6.64505 Tj
--334 TJm
-(big) 12.7322 Tj
--334 TJm
-(enough,) 31.8205 Tj
-[1 0 0 1 312.554 300.396] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -312.554 -300.396] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-312.554 298.653 Td
-/F134_0 9.9626 Tf
-(*) 5.97756 Tj
-318.531 300.396 Td
-(destLen) 41.8429 Tj
-[1 0 0 1 360.374 300.396] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -360.374 -300.396] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-363.701 300.396 Td
-/F130_0 9.9626 Tf
-(is) 6.64505 Tj
--334 TJm
-(set) 11.0684 Tj
--334 TJm
-(to) 7.7509 Tj
--334 TJm
-(the) 12.1743 Tj
--334 TJm
-(size) 15.4918 Tj
--333 TJm
-(of) 8.29885 Tj
--334 TJm
-(the) 12.1743 Tj
--334 TJm
-(uncompressed) 56.996 Tj
--334 TJm
-(data,) 19.0883 Tj
-72 288.441 Td
-(and) 14.386 Tj
-[1 0 0 1 89.5273 288.441] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -89.5273 -288.441] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-89.5273 288.441 Td
-/F134_0 9.9626 Tf
-(BZ_OK) 29.8878 Tj
-[1 0 0 1 119.415 288.441] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -119.415 -288.441] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-122.556 288.441 Td
-/F130_0 9.9626 Tf
-(is) 6.64505 Tj
--315 TJm
-(returned.) 35.686 Tj
--1012 TJm
-(If) 6.63509 Tj
--315 TJm
-(the) 12.1743 Tj
--316 TJm
-(compressed) 47.0334 Tj
--315 TJm
-(data) 16.5977 Tj
--315 TJm
-(w) 7.193 Tj
-10 TJm
-(on') 13.2801 Tj
-18 TJm
-(t) 2.7696 Tj
--316 TJm
-(\002t,) 10.7995 Tj
-[1 0 0 1 313.322 288.441] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -313.322 -288.441] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-313.322 286.698 Td
-/F134_0 9.9626 Tf
-(*) 5.97756 Tj
-319.3 288.441 Td
-(destLen) 41.8429 Tj
-[1 0 0 1 361.143 288.441] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -361.143 -288.441] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-364.284 288.441 Td
-/F130_0 9.9626 Tf
-(is) 6.64505 Tj
--315 TJm
-(unchanged,) 45.6486 Tj
--332 TJm
-(and) 14.386 Tj
-[1 0 0 1 440.551 288.441] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -440.551 -288.441] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-440.551 288.441 Td
-/F134_0 9.9626 Tf
-(BZ_OUTBUFF_FULL) 89.6634 Tj
-[1 0 0 1 530.215 288.441] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -530.215 -288.441] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-533.355 288.441 Td
-/F130_0 9.9626 Tf
-(is) 6.64505 Tj
-72 276.486 Td
-(returned.) 35.686 Tj
-[1 0 0 1 72 276.386] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -266.424] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 254.568 Td
-/F134_0 9.9626 Tf
-(source) 35.8654 Tj
-[1 0 0 1 107.865 254.568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -107.865 -254.568] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-110.981 254.568 Td
-/F130_0 9.9626 Tf
-(is) 6.64505 Tj
--313 TJm
-(assumed) 34.3112 Tj
--312 TJm
-(to) 7.7509 Tj
--313 TJm
-(hold) 17.7135 Tj
--313 TJm
-(a) 4.42339 Tj
--313 TJm
-(complete) 36.5229 Tj
-[1 0 0 1 237.04 254.568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -237.04 -254.568] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-237.04 254.568 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 266.928 254.568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -266.928 -254.568] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-270.044 254.568 Td
-/F130_0 9.9626 Tf
-(format) 26.5603 Tj
--313 TJm
-(data) 16.5977 Tj
--312 TJm
-(stream.) 29.0509 Tj
-[1 0 0 1 353.446 254.568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -353.446 -254.568] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-353.446 254.568 Td
-/F134_0 9.9626 Tf
-(BZ2_bzBuffToBuffDecompress) 155.417 Tj
-[1 0 0 1 508.863 254.568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -508.863 -254.568] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-511.978 254.568 Td
-/F130_0 9.9626 Tf
-(tries) 17.1556 Tj
--313 TJm
-(to) 7.7509 Tj
-72 242.613 Td
-(decompress) 47.0334 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(entirety) 30.4357 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(stream) 26.5603 Tj
--250 TJm
-(into) 15.5018 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(output) 25.4644 Tj
--250 TJm
-(b) 4.9813 Tj
-20 TJm
-(uf) 8.29885 Tj
-25 TJm
-(fer) 11.0585 Tj
-55 TJm
-(.) 2.49065 Tj
-[1 0 0 1 72 240.456] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -230.493] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 220.695 Td
-/F130_0 9.9626 Tf
-(F) 5.53921 Tj
-15 TJm
-(or) 8.29885 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(meaning) 34.3112 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(parameters) 43.7059 Tj
-[1 0 0 1 196.631 220.695] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -196.631 -220.695] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-196.631 220.695 Td
-/F134_0 9.9626 Tf
-(small) 29.8878 Tj
-[1 0 0 1 226.519 220.695] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -226.519 -220.695] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-229.01 220.695 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 245.887 220.695] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -245.887 -220.695] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-245.887 220.695 Td
-/F134_0 9.9626 Tf
-(verbosity) 53.798 Tj
-[1 0 0 1 299.685 220.695] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -299.685 -220.695] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-299.685 220.695 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--250 TJm
-(see) 12.7222 Tj
-[1 0 0 1 319.879 220.695] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -319.879 -220.695] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-319.879 220.695 Td
-/F134_0 9.9626 Tf
-(BZ2_bzDecompressInit) 119.551 Tj
-[1 0 0 1 439.431 220.695] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -439.431 -220.695] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-439.431 220.695 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
-[1 0 0 1 72 218.538] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -208.576] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 198.777 Td
-/F130_0 9.9626 Tf
-(Because) 33.1954 Tj
--250 TJm
-(the) 12.1743 Tj
--249 TJm
-(compression) 50.3609 Tj
--250 TJm
-(ratio) 18.2614 Tj
--249 TJm
-(of) 8.29885 Tj
--250 TJm
-(the) 12.1743 Tj
--249 TJm
-(compressed) 47.0334 Tj
--250 TJm
-(data) 16.5977 Tj
--249 TJm
-(cannot) 26.5603 Tj
--250 TJm
-(be) 9.40469 Tj
--250 TJm
-(kno) 14.9439 Tj
-25 TJm
-(wn) 12.1743 Tj
--249 TJm
-(in) 7.7509 Tj
--250 TJm
-(adv) 14.386 Tj
-25 TJm
-(ance,) 20.7421 Tj
--249 TJm
-(there) 19.9152 Tj
--250 TJm
-(is) 6.64505 Tj
--249 TJm
-(no) 9.9626 Tj
--250 TJm
-(easy) 17.7035 Tj
--250 TJm
-(w) 7.193 Tj
-10 TJm
-(ay) 9.40469 Tj
--249 TJm
-(to) 7.7509 Tj
--250 TJm
-(guarantee) 38.7246 Tj
-72 186.822 Td
-(that) 14.9439 Tj
--286 TJm
-(the) 12.1743 Tj
--287 TJm
-(output) 25.4644 Tj
--286 TJm
-(b) 4.9813 Tj
-20 TJm
-(uf) 8.29885 Tj
-25 TJm
-(fer) 11.0585 Tj
--287 TJm
-(will) 15.5018 Tj
--286 TJm
-(be) 9.40469 Tj
--286 TJm
-(big) 12.7322 Tj
--287 TJm
-(enough.) 31.8205 Tj
--838 TJm
-(Y) 7.193 Tj
-110 TJm
-(ou) 9.9626 Tj
--287 TJm
-(may) 17.1556 Tj
--286 TJm
-(of) 8.29885 Tj
--287 TJm
-(course) 26.0024 Tj
--286 TJm
-(mak) 17.1556 Tj
-10 TJm
-(e) 4.42339 Tj
--286 TJm
-(arrangements) 53.6685 Tj
--287 TJm
-(in) 7.7509 Tj
--286 TJm
-(your) 18.2614 Tj
--287 TJm
-(code) 18.8094 Tj
--286 TJm
-(to) 7.7509 Tj
--286 TJm
-(record) 25.4445 Tj
--287 TJm
-(the) 12.1743 Tj
--286 TJm
-(size) 15.4918 Tj
--287 TJm
-(of) 8.29885 Tj
-72 174.867 Td
-(the) 12.1743 Tj
--250 TJm
-(uncompressed) 56.996 Tj
--250 TJm
-(data,) 19.0883 Tj
--250 TJm
-(b) 4.9813 Tj
-20 TJm
-(ut) 7.7509 Tj
--250 TJm
-(such) 18.2614 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(mechanism) 45.3796 Tj
--250 TJm
-(is) 6.64505 Tj
--250 TJm
-(be) 9.40469 Tj
-15 TJm
-(yond) 19.9252 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(scope) 22.6848 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(this) 14.396 Tj
--250 TJm
-(library) 26.5603 Tj
-65 TJm
-(.) 2.49065 Tj
-[1 0 0 1 72 172.71] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -162.747] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 152.949 Td
-/F134_0 9.9626 Tf
-(BZ2_bzBuffToBuffDecompress) 155.417 Tj
-[1 0 0 1 227.417 152.949] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -227.417 -152.949] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-230.553 152.949 Td
-/F130_0 9.9626 Tf
-(will) 15.5018 Tj
--315 TJm
-(not) 12.7322 Tj
--315 TJm
-(write) 20.4731 Tj
--314 TJm
-(data) 16.5977 Tj
--315 TJm
-(at) 7.193 Tj
--315 TJm
-(or) 8.29885 Tj
--315 TJm
-(be) 9.40469 Tj
-15 TJm
-(yond) 19.9252 Tj
-[1 0 0 1 362.484 152.949] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -362.484 -152.949] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-362.484 152.949 Td
-/F134_0 9.9626 Tf
-(dest[) 29.8878 Tj
-392.372 151.206 Td
-(*) 5.97756 Tj
-398.349 152.949 Td
-(destLen]) 47.8205 Tj
-[1 0 0 1 446.17 152.949] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -446.17 -152.949] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-446.17 152.949 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--331 TJm
-(e) 4.42339 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(en) 9.40469 Tj
--315 TJm
-(in) 7.7509 Tj
--315 TJm
-(case) 17.1456 Tj
--314 TJm
-(of) 8.29885 Tj
--315 TJm
-(b) 4.9813 Tj
-20 TJm
-(uf) 8.29885 Tj
-25 TJm
-(fer) 11.0585 Tj
-72 140.994 Td
-(o) 4.9813 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(er\003o) 18.2614 Tj
-25 TJm
-(w) 7.193 Tj
-65 TJm
-(.) 2.49065 Tj
-[1 0 0 1 72 140.894] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -130.932] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 119.076 Td
-/F130_0 9.9626 Tf
-(Possible) 33.2153 Tj
--250 TJm
-(return) 23.7907 Tj
--250 TJm
-(v) 4.9813 Tj
-25 TJm
-(alues:) 23.2427 Tj
-[1 0 0 1 72 118.977] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -68.1248] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 374.394 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.8541] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 40.5726 -6.7545] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -493.841 -50.9514] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-534.414 50.9514 Td
-/F130_0 9.9626 Tf
-(27) 9.9626 Tj
-[1 0 0 1 453.269 50.8518] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 93.5985 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.2765 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-Q
-showpage
-%%PageTrailer
-pdfEndPage
-%%Page: 31 31
-%%BeginPageSetup
-%%PageOrientation: Portrait
-pdfStartPage
-0 0 612 792 re W
-%%EndPageSetup
-[] 0 d
-1 i
-0 j
-0 J
-10 M
-1 w
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-false op
-false OP
-0 0 612 792 re
-W
-q
-[1 0 0 1 72 741.554] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 4.3836 14.4459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 187.197 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 -8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 76.4979 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -344.462 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-420.96 749.245 Td
-/F130_0 9.9626 Tf
-(Programming) 54.7943 Tj
--250 TJm
-(with) 17.7135 Tj
-[1 0 0 1 498.449 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -498.449 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-498.449 749.245 Td
-/F134_0 9.9626 Tf
-(libbzip2) 47.8205 Tj
-[1 0 0 1 546.269 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -278.305 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 280.796 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.974 -5.0363] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -0.4981] cm
-q
-[] 0 d
-0 J
-0.4981 w
-0 0.2491 m
-475.465 0.2491 l
-S
-Q
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 479.251 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -15.0365 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -248.702] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 227.148 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 223.562] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -711.631] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 711.631 Td
-/F134_0 9.9626 Tf
-(BZ_CONFIG_ERROR) 89.6634 Tj
-98.4879 699.676 Td
-(if) 11.9551 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(library) 41.8429 Tj
--426 TJm
-(has) 17.9327 Tj
--426 TJm
-(been) 23.9102 Tj
--426 TJm
-(mis-compiled) 71.7307 Tj
-90 687.721 Td
-(BZ_PARAM_ERROR) 83.6858 Tj
-98.4879 675.766 Td
-(if) 11.9551 Tj
--426 TJm
-(dest) 23.9102 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(NULL) 23.9102 Tj
--426 TJm
-(or) 11.9551 Tj
--426 TJm
-(destLen) 41.8429 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(NULL) 23.9102 Tj
-98.4879 663.811 Td
-(or) 11.9551 Tj
--426 TJm
-(small) 29.8878 Tj
--426 TJm
-(!=) 11.9551 Tj
--426 TJm
-(0) 5.97756 Tj
--426 TJm
-(&&) 11.9551 Tj
--426 TJm
-(small) 29.8878 Tj
--426 TJm
-(!=) 11.9551 Tj
--426 TJm
-(1) 5.97756 Tj
-98.4879 651.856 Td
-(or) 11.9551 Tj
--426 TJm
-(verbosity) 53.798 Tj
--426 TJm
-(<) 5.97756 Tj
--426 TJm
-(0) 5.97756 Tj
--426 TJm
-(or) 11.9551 Tj
--426 TJm
-(verbosity) 53.798 Tj
--426 TJm
-(>) 5.97756 Tj
--426 TJm
-(4) 5.97756 Tj
-90 639.9 Td
-(BZ_MEM_ERROR) 71.7307 Tj
-98.4879 627.945 Td
-(if) 11.9551 Tj
--426 TJm
-(insufficient) 71.7307 Tj
--426 TJm
-(memory) 35.8654 Tj
--426 TJm
-(is) 11.9551 Tj
--426 TJm
-(available) 53.798 Tj
-90 615.99 Td
-(BZ_OUTBUFF_FULL) 89.6634 Tj
-98.4879 604.035 Td
-(if) 11.9551 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(size) 23.9102 Tj
--426 TJm
-(of) 11.9551 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(compressed) 59.7756 Tj
--426 TJm
-(data) 23.9102 Tj
--426 TJm
-(exceeds) 41.8429 Tj
-341.655 602.291 Td
-(*) 5.97756 Tj
-347.633 604.035 Td
-(destLen) 41.8429 Tj
-90 592.08 Td
-(BZ_DATA_ERROR) 77.7083 Tj
-98.4879 580.125 Td
-(if) 11.9551 Tj
--426 TJm
-(a) 5.97756 Tj
--426 TJm
-(data) 23.9102 Tj
--426 TJm
-(integrity) 53.798 Tj
--426 TJm
-(error) 29.8878 Tj
--426 TJm
-(was) 17.9327 Tj
--426 TJm
-(detected) 47.8205 Tj
--426 TJm
-(in) 11.9551 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(compressed) 59.7756 Tj
--426 TJm
-(data) 23.9102 Tj
-90 568.169 Td
-(BZ_DATA_ERROR_MAGIC) 113.574 Tj
-98.4879 556.214 Td
-(if) 11.9551 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(compressed) 59.7756 Tj
--426 TJm
-(data) 23.9102 Tj
--426 TJm
-(doesn't) 41.8429 Tj
--426 TJm
-(begin) 29.8878 Tj
--426 TJm
-(with) 23.9102 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(right) 29.8878 Tj
--426 TJm
-(magic) 29.8878 Tj
--426 TJm
-(bytes) 29.8878 Tj
-90 544.259 Td
-(BZ_UNEXPECTED_EOF) 101.619 Tj
-98.4879 532.304 Td
-(if) 11.9551 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(compressed) 59.7756 Tj
--426 TJm
-(data) 23.9102 Tj
--426 TJm
-(ends) 23.9102 Tj
--426 TJm
-(unexpectedly) 71.7307 Tj
-90 520.349 Td
-(BZ_OK) 29.8878 Tj
-98.4879 508.394 Td
-(otherwise) 53.798 Tj
-[1 0 0 1 72 492.852] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -482.889] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 458.099 Td
-/F122_0 20.6585 Tf
-(3.6.) 34.4584 Tj
-[1 0 0 1 112.201 458.099] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -112.201 -458.099] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-112.201 458.099 Td
-/F392_0 20.6585 Tf
-(zlib) 49.5804 Tj
-[1 0 0 1 161.781 458.099] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -161.781 -458.099] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-167.524 458.099 Td
-/F122_0 20.6585 Tf
-(compatibility) 127.422 Tj
--278 TJm
-(functions) 92.9633 Tj
-[1 0 0 1 72 453.823] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -443.86] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 436.181 Td
-/F130_0 9.9626 Tf
-(Y) 7.193 Tj
-110 TJm
-(oshioka) 30.9936 Tj
--604 TJm
-(Tsuneo) 29.3299 Tj
--604 TJm
-(has) 13.2801 Tj
--604 TJm
-(contrib) 28.224 Tj
-20 TJm
-(uted) 17.1556 Tj
--604 TJm
-(some) 21.031 Tj
--604 TJm
-(functions) 37.0808 Tj
--604 TJm
-(to) 7.7509 Tj
--604 TJm
-(gi) 7.7509 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--604 TJm
-(better) 22.6848 Tj
-[1 0 0 1 356.347 436.181] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -356.347 -436.181] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-356.347 436.181 Td
-/F134_0 9.9626 Tf
-(zlib) 23.9102 Tj
-[1 0 0 1 380.257 436.181] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -380.257 -436.181] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-386.275 436.181 Td
-/F130_0 9.9626 Tf
-(compatibility) 53.1405 Tj
-65 TJm
-(.) 2.49065 Tj
--1372 TJm
-(These) 23.7907 Tj
--604 TJm
-(functions) 37.0808 Tj
--604 TJm
-(are) 12.1643 Tj
-[1 0 0 1 72 424.226] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -424.226] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 424.226 Td
-/F134_0 9.9626 Tf
-(BZ2_bzopen) 59.7756 Tj
-[1 0 0 1 131.776 424.226] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -131.776 -424.226] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-131.776 424.226 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 144.283 424.226] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -144.283 -424.226] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-144.283 424.226 Td
-/F134_0 9.9626 Tf
-(BZ2_bzread) 59.7756 Tj
-[1 0 0 1 204.059 424.226] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -204.059 -424.226] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-204.059 424.226 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 216.566 424.226] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -216.566 -424.226] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-216.566 424.226 Td
-/F134_0 9.9626 Tf
-(BZ2_bzwrite) 65.7532 Tj
-[1 0 0 1 282.32 424.226] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -282.32 -424.226] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-282.32 424.226 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 294.827 424.226] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -294.827 -424.226] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-294.827 424.226 Td
-/F134_0 9.9626 Tf
-(BZ2_bzflush) 65.7532 Tj
-[1 0 0 1 360.581 424.226] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -360.581 -424.226] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-360.581 424.226 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 373.088 424.226] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -373.088 -424.226] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-373.088 424.226 Td
-/F134_0 9.9626 Tf
-(BZ2_bzclose) 65.7532 Tj
-[1 0 0 1 438.842 424.226] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -438.842 -424.226] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-438.842 424.226 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 451.349 424.226] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -451.349 -424.226] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-451.349 424.226 Td
-/F134_0 9.9626 Tf
-(BZ2_bzerror) 65.7532 Tj
-[1 0 0 1 517.102 424.226] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -517.102 -424.226] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-525.614 424.226 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 72 412.271] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -412.271] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 412.271 Td
-/F134_0 9.9626 Tf
-(BZ2_bzlibVersion) 95.641 Tj
-[1 0 0 1 167.641 412.271] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -167.641 -412.271] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-167.641 412.271 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
--1420 TJm
-(Thes) 19.3673 Tj
-1 TJm
-(e) 4.42339 Tj
--384 TJm
-(functions) 37.0808 Tj
--383 TJm
-(are) 12.1643 Tj
--383 TJm
-(not) 12.7322 Tj
--383 TJm
-(\(yet\)) 18.8094 Tj
--384 TJm
-(of) 8.29885 Tj
-25 TJm
-(\002cially) 27.6761 Tj
--383 TJm
-(part) 15.4918 Tj
--383 TJm
-(of) 8.29885 Tj
--383 TJm
-(the) 12.1743 Tj
--384 TJm
-(library) 26.5603 Tj
-65 TJm
-(.) 2.49065 Tj
--1419 TJm
-(If) 6.63509 Tj
--383 TJm
-(the) 12.1743 Tj
-15 TJm
-(y) 4.9813 Tj
--384 TJm
-(break,) 24.6176 Tj
--416 TJm
-(you) 14.9439 Tj
--383 TJm
-(get) 12.1743 Tj
--384 TJm
-(to) 7.7509 Tj
-72 400.316 Td
-(k) 4.9813 Tj
-10 TJm
-(eep) 13.8281 Tj
--250 TJm
-(all) 9.9626 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(pieces.) 27.3872 Tj
--620 TJm
-(Ne) 11.6164 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(ertheless,) 37.3498 Tj
--250 TJm
-(I) 3.31755 Tj
--250 TJm
-(think) 20.4831 Tj
--250 TJm
-(the) 12.1743 Tj
-15 TJm
-(y) 4.9813 Tj
--250 TJm
-(w) 7.193 Tj
-10 TJm
-(ork) 13.2801 Tj
--250 TJm
-(ok.) 12.4533 Tj
-[1 0 0 1 72 398.159] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -48.8169] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 47.8207 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 44.2341] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -388.794] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 388.794 Td
-/F134_0 9.9626 Tf
-(typedef) 41.8429 Tj
--426 TJm
-(void) 23.9102 Tj
--426 TJm
-(BZFILE;) 41.8429 Tj
-90 364.884 Td
-(const) 29.8878 Tj
--426 TJm
-(char) 23.9102 Tj
-152.286 363.14 Td
-(*) 5.97756 Tj
-162.508 364.884 Td
-(BZ2_bzlibVersion) 95.641 Tj
--426 TJm
-(\() 5.97756 Tj
--426 TJm
-(void) 23.9102 Tj
--426 TJm
-(\);) 11.9551 Tj
-[1 0 0 1 72 349.342] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -339.379] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 327.424 Td
-/F130_0 9.9626 Tf
-(Returns) 30.9936 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(string) 22.6948 Tj
--250 TJm
-(indicating) 39.8504 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(library) 26.5603 Tj
--250 TJm
-(v) 4.9813 Tj
-15 TJm
-(ersion.) 26.8392 Tj
-[1 0 0 1 72 325.267] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -36.8618] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 35.8655 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 32.2789] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -315.902] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 315.902 Td
-/F134_0 9.9626 Tf
-(BZFILE) 35.8654 Tj
-130.109 314.159 Td
-(*) 5.97756 Tj
-140.331 315.902 Td
-(BZ2_bzopen) 59.7756 Tj
--852 TJm
-(\() 5.97756 Tj
--426 TJm
-(const) 29.8878 Tj
--426 TJm
-(char) 23.9102 Tj
-281.103 314.159 Td
-(*) 5.97756 Tj
-287.08 315.902 Td
-(path,) 29.8878 Tj
--426 TJm
-(const) 29.8878 Tj
--426 TJm
-(char) 23.9102 Tj
-383.498 314.159 Td
-(*) 5.97756 Tj
-389.476 315.902 Td
-(mode) 23.9102 Tj
--426 TJm
-(\);) 11.9551 Tj
-90 303.947 Td
-(BZFILE) 35.8654 Tj
-130.109 302.204 Td
-(*) 5.97756 Tj
-140.331 303.947 Td
-(BZ2_bzdopen) 65.7532 Tj
--426 TJm
-(\() 5.97756 Tj
--426 TJm
-(int) 17.9327 Tj
--3408 TJm
-(fd,) 17.9327 Tj
--1704 TJm
-(const) 29.8878 Tj
--426 TJm
-(char) 23.9102 Tj
-369.629 302.204 Td
-(*) 5.97756 Tj
-375.607 303.947 Td
-(mode) 23.9102 Tj
--426 TJm
-(\);) 11.9551 Tj
-[1 0 0 1 72 288.405] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -278.443] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 266.488 Td
-/F130_0 9.9626 Tf
-(Opens) 25.4544 Tj
--243 TJm
-(a) 4.42339 Tj
-[1 0 0 1 106.713 266.488] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -106.713 -266.488] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-106.713 266.488 Td
-/F134_0 9.9626 Tf
-(.bz2) 23.9102 Tj
-[1 0 0 1 130.624 266.488] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -130.624 -266.488] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-133.041 266.488 Td
-/F130_0 9.9626 Tf
-(\002le) 12.7322 Tj
--243 TJm
-(for) 11.6164 Tj
--242 TJm
-(reading) 29.8778 Tj
--243 TJm
-(or) 8.29885 Tj
--243 TJm
-(writing,) 31.2726 Tj
--244 TJm
-(using) 21.589 Tj
--243 TJm
-(ei) 7.193 Tj
-1 TJm
-(ther) 15.4918 Tj
--243 TJm
-(its) 9.41466 Tj
--243 TJm
-(name) 21.579 Tj
--242 TJm
-(o) 4.9813 Tj
--1 TJm
-(r) 3.31755 Tj
--242 TJm
-(a) 4.42339 Tj
--243 TJm
-(pre-e) 20.4632 Tj
-15 TJm
-(xisting) 27.1282 Tj
--243 TJm
-(\002le) 12.7322 Tj
--242 TJm
-(descriptor) 39.8404 Tj
-55 TJm
-(.) 2.49065 Tj
--615 TJm
-(Analogous) 43.1679 Tj
--243 TJm
-(to) 7.7509 Tj
-[1 0 0 1 510.112 266.488] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -510.112 -266.488] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-510.112 266.488 Td
-/F134_0 9.9626 Tf
-(fopen) 29.8878 Tj
-[1 0 0 1 540 266.488] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -540 -266.488] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 254.532 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 88.8767 254.532] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -88.8767 -254.532] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-88.8767 254.532 Td
-/F134_0 9.9626 Tf
-(fdopen) 35.8654 Tj
-[1 0 0 1 124.742 254.532] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -124.742 -254.532] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-124.742 254.532 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
-[1 0 0 1 72 252.998] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -36.8618] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 35.8655 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 32.2789] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -243.633] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 243.633 Td
-/F134_0 9.9626 Tf
-(int) 17.9327 Tj
--426 TJm
-(BZ2_bzread) 59.7756 Tj
--852 TJm
-(\() 5.97756 Tj
--426 TJm
-(BZFILE) 35.8654 Tj
-226.528 241.89 Td
-(*) 5.97756 Tj
-236.749 243.633 Td
-(b,) 11.9551 Tj
--426 TJm
-(void) 23.9102 Tj
-276.859 241.89 Td
-(*) 5.97756 Tj
-287.08 243.633 Td
-(buf,) 23.9102 Tj
--426 TJm
-(int) 17.9327 Tj
--426 TJm
-(len) 17.9327 Tj
--426 TJm
-(\);) 11.9551 Tj
-90 231.678 Td
-(int) 17.9327 Tj
--426 TJm
-(BZ2_bzwrite) 65.7532 Tj
--426 TJm
-(\() 5.97756 Tj
--426 TJm
-(BZFILE) 35.8654 Tj
-228.261 229.935 Td
-(*) 5.97756 Tj
-238.483 231.678 Td
-(b,) 11.9551 Tj
--426 TJm
-(void) 23.9102 Tj
-278.592 229.935 Td
-(*) 5.97756 Tj
-288.814 231.678 Td
-(buf,) 23.9102 Tj
--426 TJm
-(int) 17.9327 Tj
--426 TJm
-(len) 17.9327 Tj
--426 TJm
-(\);) 11.9551 Tj
-[1 0 0 1 72 216.136] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -206.174] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 194.219 Td
-/F130_0 9.9626 Tf
-(Reads/writes) 51.4668 Tj
--250 TJm
-(data) 16.5977 Tj
--250 TJm
-(from/to) 29.8878 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(pre) 12.7222 Tj
-25 TJm
-(viously) 29.3399 Tj
--250 TJm
-(opened) 28.772 Tj
-[1 0 0 1 259.903 194.219] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -259.903 -194.219] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-259.903 194.219 Td
-/F134_0 9.9626 Tf
-(BZFILE) 35.8654 Tj
-[1 0 0 1 295.769 194.219] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -295.769 -194.219] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-295.769 194.219 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
--500 TJm
-(Analogous) 43.1679 Tj
--250 TJm
-(to) 7.7509 Tj
-[1 0 0 1 359.141 194.219] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -359.141 -194.219] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-359.141 194.219 Td
-/F134_0 9.9626 Tf
-(fread) 29.8878 Tj
-[1 0 0 1 389.029 194.219] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -389.029 -194.219] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-391.519 194.219 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 408.396 194.219] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -408.396 -194.219] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-408.396 194.219 Td
-/F134_0 9.9626 Tf
-(fwrite) 35.8654 Tj
-[1 0 0 1 444.261 194.219] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.261 -194.219] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-444.261 194.219 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
-[1 0 0 1 72 192.062] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -36.8618] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 35.8655 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 32.2789] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -182.697] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 182.697 Td
-/F134_0 9.9626 Tf
-(int) 17.9327 Tj
--852 TJm
-(BZ2_bzflush) 65.7532 Tj
--426 TJm
-(\() 5.97756 Tj
--426 TJm
-(BZFILE) 35.8654 Tj
-232.505 180.954 Td
-(*) 5.97756 Tj
-242.727 182.697 Td
-(b) 5.97756 Tj
--426 TJm
-(\);) 11.9551 Tj
-90 170.742 Td
-(void) 23.9102 Tj
--426 TJm
-(BZ2_bzclose) 65.7532 Tj
--426 TJm
-(\() 5.97756 Tj
--426 TJm
-(BZFILE) 35.8654 Tj
-234.239 168.998 Td
-(*) 5.97756 Tj
-244.46 170.742 Td
-(b) 5.97756 Tj
--426 TJm
-(\);) 11.9551 Tj
-[1 0 0 1 72 155.2] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -145.237] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 133.282 Td
-/F130_0 9.9626 Tf
-(Flushes/closes) 57.5639 Tj
--250 TJm
-(a) 4.42339 Tj
-[1 0 0 1 138.968 133.282] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -138.968 -133.282] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-138.968 133.282 Td
-/F134_0 9.9626 Tf
-(BZFILE) 35.8654 Tj
-[1 0 0 1 174.833 133.282] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -174.833 -133.282] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-174.833 133.282 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
-[1 0 0 1 179.815 133.282] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -179.815 -133.282] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-179.815 133.282 Td
-/F134_0 9.9626 Tf
-(BZ2_bzflush) 65.7532 Tj
-[1 0 0 1 245.568 133.282] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -245.568 -133.282] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-248.059 133.282 Td
-/F130_0 9.9626 Tf
-(doesn') 26.5603 Tj
-18 TJm
-(t) 2.7696 Tj
--250 TJm
-(actually) 31.5416 Tj
--250 TJm
-(do) 9.9626 Tj
--250 TJm
-(an) 9.40469 Tj
-15 TJm
-(ything.) 27.9551 Tj
--620 TJm
-(Analogous) 43.1679 Tj
--250 TJm
-(to) 7.7509 Tj
-[1 0 0 1 425.472 133.282] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -425.472 -133.282] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-425.472 133.282 Td
-/F134_0 9.9626 Tf
-(fflush) 35.8654 Tj
-[1 0 0 1 461.338 133.282] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -461.338 -133.282] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-463.828 133.282 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 480.705 133.282] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -480.705 -133.282] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-480.705 133.282 Td
-/F134_0 9.9626 Tf
-(fclose) 35.8654 Tj
-[1 0 0 1 516.57 133.282] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -516.57 -133.282] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-516.57 133.282 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
-[1 0 0 1 72 131.125] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -24.9066] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 23.9103 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 20.3237] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3685] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -121.761] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 121.761 Td
-/F134_0 9.9626 Tf
-(const) 29.8878 Tj
--426 TJm
-(char) 23.9102 Tj
-152.286 120.017 Td
-(*) 5.97756 Tj
-162.508 121.761 Td
-(BZ2_bzerror) 65.7532 Tj
--426 TJm
-(\() 5.97756 Tj
--426 TJm
-(BZFILE) 35.8654 Tj
-282.836 120.017 Td
-(*) 5.97756 Tj
-288.814 121.761 Td
-(b,) 11.9551 Tj
--426 TJm
-(int) 17.9327 Tj
-327.19 120.017 Td
-(*) 5.97756 Tj
-333.167 121.761 Td
-(errnum) 35.8654 Tj
--426 TJm
-(\)) 5.97756 Tj
-[1 0 0 1 72 106.219] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -96.2563] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 84.3011 Td
-/F130_0 9.9626 Tf
-(Returns) 30.9936 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(string) 22.6948 Tj
--250 TJm
-(describing) 41.5042 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(more) 20.4731 Tj
--250 TJm
-(recent) 24.3386 Tj
--250 TJm
-(error) 19.3573 Tj
--250 TJm
-(status) 22.6948 Tj
--250 TJm
-(of) 8.29885 Tj
-[1 0 0 1 303.858 84.3011] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -303.858 -84.3011] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-303.858 84.3011 Td
-/F134_0 9.9626 Tf
-(b) 5.97756 Tj
-[1 0 0 1 309.835 84.3011] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -309.835 -84.3011] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-309.835 84.3011 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--250 TJm
-(and) 14.386 Tj
--250 TJm
-(also) 16.0497 Tj
--250 TJm
-(sets) 14.9439 Tj
-[1 0 0 1 367.668 84.3011] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -367.668 -84.3011] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-367.668 82.5576 Td
-/F134_0 9.9626 Tf
-(*) 5.97756 Tj
-373.645 84.3011 Td
-(errnum) 35.8654 Tj
-[1 0 0 1 409.511 84.3011] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -409.511 -84.3011] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-412.001 84.3011 Td
-/F130_0 9.9626 Tf
-(to) 7.7509 Tj
--250 TJm
-(its) 9.41466 Tj
--250 TJm
-(numerical) 39.8404 Tj
--250 TJm
-(v) 4.9813 Tj
-25 TJm
-(alue.) 19.0883 Tj
-[1 0 0 1 72 82.1443] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -21.3298] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 4.3836 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 374.394 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.8541] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 40.5726 -6.7545] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -495.734 -50.9514] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-536.307 50.9514 Td
-/F130_0 9.9626 Tf
-(28) 9.9626 Tj
-[1 0 0 1 455.161 50.8518] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 93.5985 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.2765 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -15.0365 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-Q
-showpage
-%%PageTrailer
-pdfEndPage
-%%Page: 32 32
-%%BeginPageSetup
-%%PageOrientation: Portrait
-pdfStartPage
-0 0 612 792 re W
-%%EndPageSetup
-[] 0 d
-1 i
-0 j
-0 J
-10 M
-1 w
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-false op
-false OP
-0 0 612 792 re
-W
-q
-[1 0 0 1 72 741.554] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 14.4459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 187.197 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 -8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 76.4979 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -342.569 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-419.067 749.245 Td
-/F130_0 9.9626 Tf
-(Programming) 54.7943 Tj
--250 TJm
-(with) 17.7135 Tj
-[1 0 0 1 496.556 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -496.556 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-496.556 749.245 Td
-/F134_0 9.9626 Tf
-(libbzip2) 47.8205 Tj
-[1 0 0 1 544.376 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -278.305 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 280.796 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.974 -5.0363] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -0.4981] cm
-q
-[] 0 d
-0 J
-0.4981 w
-0 0.2491 m
-475.465 0.2491 l
-S
-Q
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 479.251 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -540 -741.554] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 704.93 Td
-/F122_0 20.6585 Tf
-(3.7.) 34.4584 Tj
--278 TJm
-(Using) 57.3893 Tj
--278 TJm
-(the) 30.9877 Tj
--278 TJm
-(librar) 51.6669 Tj
--10 TJm
-(y) 11.4861 Tj
--278 TJm
-(in) 18.3654 Tj
--278 TJm
-(a) 11.4861 Tj
-[1 0 0 1 322.501 704.93] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -322.501 -704.93] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-322.501 704.93 Td
-/F392_0 20.6585 Tf
-(stdio) 61.9755 Tj
-[1 0 0 1 384.477 704.93] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -384.477 -704.93] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-384.477 704.93 Td
-/F122_0 20.6585 Tf
-(-free) 44.767 Tj
-72 680.139 Td
-(en) 24.1085 Tj
-40 TJm
-(vir) 25.2653 Tj
-20 TJm
-(onment) 74.5978 Tj
-[1 0 0 1 72 679.881] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.898] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -669.983] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 649.583 Td
-/F122_0 17.2154 Tf
-(3.7.1.) 43.0729 Tj
--278 TJm
-(Getting) 60.2539 Tj
--278 TJm
-(rid) 22.0013 Tj
--278 TJm
-(of) 16.2513 Tj
-[1 0 0 1 232.721 649.583] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -232.721 -649.583] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-232.721 649.583 Td
-/F392_0 17.2154 Tf
-(stdio) 51.6462 Tj
-[1 0 0 1 284.367 649.583] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -212.367 -3.8303] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.898] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -635.855] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 627.73 Td
-/F130_0 9.9626 Tf
-(In) 8.29885 Tj
--319 TJm
-(a) 4.42339 Tj
--319 TJm
-(deeply) 26.5603 Tj
--319 TJm
-(embedded) 40.9463 Tj
--319 TJm
-(application,) 46.7644 Tj
--336 TJm
-(you) 14.9439 Tj
--319 TJm
-(might) 23.2527 Tj
--319 TJm
-(w) 7.193 Tj
-10 TJm
-(ant) 12.1743 Tj
--319 TJm
-(to) 7.7509 Tj
--319 TJm
-(use) 13.2801 Tj
--319 TJm
-(just) 14.396 Tj
--319 TJm
-(the) 12.1743 Tj
--319 TJm
-(memory-to-memory) 80.7967 Tj
--319 TJm
-(functions.) 39.5714 Tj
--1035 TJm
-(Y) 7.193 Tj
-110 TJm
-(ou) 9.9626 Tj
--319 TJm
-(can) 13.8281 Tj
--319 TJm
-(do) 9.9626 Tj
--319 TJm
-(this) 14.396 Tj
-72 615.775 Td
-(con) 14.386 Tj
-40 TJm
-(v) 4.9813 Tj
-15 TJm
-(eniently) 32.0995 Tj
--327 TJm
-(by) 9.9626 Tj
--327 TJm
-(compiling) 40.4083 Tj
--327 TJm
-(the) 12.1743 Tj
--327 TJm
-(library) 26.5603 Tj
--327 TJm
-(with) 17.7135 Tj
--328 TJm
-(preproces) 38.7246 Tj
-1 TJm
-(sor) 12.1743 Tj
--328 TJm
-(symbol) 29.3399 Tj
-[1 0 0 1 336.046 615.775] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -336.046 -615.775] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-336.046 615.775 Td
-/F134_0 9.9626 Tf
-(BZ_NO_STDIO) 65.7532 Tj
-[1 0 0 1 401.799 615.775] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -401.799 -615.775] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-405.057 615.775 Td
-/F130_0 9.9626 Tf
-(de\002ned.) 31.8205 Tj
--1083 TJm
-(Doing) 24.9065 Tj
--327 TJm
-(this) 14.396 Tj
--327 TJm
-(gi) 7.7509 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(es) 8.29885 Tj
--327 TJm
-(you) 14.9439 Tj
--327 TJm
-(a) 4.42339 Tj
-72 603.819 Td
-(library) 26.5603 Tj
--250 TJm
-(containing) 42.0621 Tj
--250 TJm
-(only) 17.7135 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(follo) 18.8194 Tj
-25 TJm
-(wing) 19.9252 Tj
--250 TJm
-(eight) 19.9252 Tj
--250 TJm
-(functions:) 39.8504 Tj
-[1 0 0 1 72 601.662] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.898] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -591.764] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 581.966 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompressInit) 107.596 Tj
-[1 0 0 1 179.596 581.966] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -179.596 -581.966] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-179.596 581.966 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 199.079 581.966] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -199.079 -581.966] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-199.079 581.966 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompress) 83.6858 Tj
-[1 0 0 1 282.765 581.966] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -282.765 -581.966] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-282.765 581.966 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 302.247 581.966] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -302.247 -581.966] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-302.247 581.966 Td
-/F134_0 9.9626 Tf
-(BZ2_bzCompressEnd) 101.619 Tj
-[1 0 0 1 403.866 581.966] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 14.0915 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -417.958 -581.966] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-417.958 581.966 Td
-/F134_0 9.9626 Tf
-(BZ2_bzDecompressInit) 119.551 Tj
-[1 0 0 1 537.509 581.966] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -537.509 -581.966] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-537.509 581.966 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 72 570.011] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -570.011] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 570.011 Td
-/F134_0 9.9626 Tf
-(BZ2_bzDecompress) 95.641 Tj
-[1 0 0 1 167.641 570.011] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -167.641 -570.011] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-167.641 570.011 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 172.144 570.011] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -172.144 -570.011] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-172.144 570.011 Td
-/F134_0 9.9626 Tf
-(BZ2_bzDecompressEnd) 113.574 Tj
-[1 0 0 1 285.719 570.011] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -287.611 -570.011] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-287.611 570.011 Td
-/F134_0 9.9626 Tf
-(BZ2_bzBuffToBuffCompress) 143.461 Tj
-[1 0 0 1 431.073 570.011] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -431.073 -570.011] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-431.073 570.011 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 435.577 570.011] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -435.577 -570.011] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-435.577 570.011 Td
-/F134_0 9.9626 Tf
-(BZ2_bzBuffToBuffDecompress) 155.417 Tj
-[1 0 0 1 590.994 570.011] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -518.994 -1.5341] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.8981] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -558.579] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 548.158 Td
-/F130_0 9.9626 Tf
-(When) 23.7907 Tj
--250 TJm
-(compiled) 37.0808 Tj
--250 TJm
-(lik) 10.5205 Tj
-10 TJm
-(e) 4.42339 Tj
--250 TJm
-(this,) 16.8866 Tj
--250 TJm
-(all) 9.9626 Tj
--250 TJm
-(functions) 37.0808 Tj
--250 TJm
-(will) 15.5018 Tj
--250 TJm
-(ignore) 25.4544 Tj
-[1 0 0 1 272.526 548.158] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -272.526 -548.158] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-272.526 548.158 Td
-/F134_0 9.9626 Tf
-(verbosity) 53.798 Tj
-[1 0 0 1 326.324 548.158] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -326.324 -548.158] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-328.815 548.158 Td
-/F130_0 9.9626 Tf
-(settings.) 32.9364 Tj
-[1 0 0 1 72 546.001] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.898] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -536.103] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 517.601 Td
-/F122_0 17.2154 Tf
-(3.7.2.) 43.0729 Tj
--278 TJm
-(Critical) 58.3602 Tj
--278 TJm
-(err) 22.9653 Tj
-20 TJm
-(or) 17.2154 Tj
--278 TJm
-(handling) 71.7366 Tj
-[1 0 0 1 72 513.771] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.898] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -503.873] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 495.748 Td
-/F134_0 9.9626 Tf
-(libbzip2) 47.8205 Tj
-[1 0 0 1 119.821 495.748] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -119.821 -495.748] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-124.529 495.748 Td
-/F130_0 9.9626 Tf
-(contains) 33.2053 Tj
--473 TJm
-(a) 4.42339 Tj
--472 TJm
-(number) 30.4357 Tj
--473 TJm
-(of) 8.29885 Tj
--472 TJm
-(internal) 30.4357 Tj
--473 TJm
-(assertion) 35.417 Tj
--472 TJm
-(checks) 27.1082 Tj
--473 TJm
-(which) 24.3486 Tj
--472 TJm
-(should,) 29.0609 Tj
--529 TJm
-(needless) 33.7533 Tj
--472 TJm
-(to) 7.7509 Tj
--473 TJm
-(say) 13.2801 Tj
-65 TJm
-(,) 2.49065 Tj
--528 TJm
-(ne) 9.40469 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(er) 7.74094 Tj
--473 TJm
-(be) 9.40469 Tj
--472 TJm
-(acti) 14.386 Tj
-25 TJm
-(v) 4.9813 Tj
-25 TJm
-(ated.) 19.0883 Tj
-72 483.793 Td
-(Ne) 11.6164 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(ertheless,) 37.3498 Tj
--533 TJm
-(if) 6.08715 Tj
--476 TJm
-(an) 9.40469 Tj
--476 TJm
-(assertion) 35.417 Tj
--476 TJm
-(should) 26.5703 Tj
--476 TJm
-(f) 3.31755 Tj
-10 TJm
-(ail,) 12.4533 Tj
--532 TJm
-(beha) 18.8094 Tj
-20 TJm
-(viour) 21.031 Tj
--476 TJm
-(depends) 32.6474 Tj
--476 TJm
-(on) 9.9626 Tj
--476 TJm
-(whether) 32.0895 Tj
--476 TJm
-(or) 8.29885 Tj
--477 TJm
-(not) 12.7322 Tj
--476 TJm
-(the) 12.1743 Tj
--476 TJm
-(library) 26.5603 Tj
--476 TJm
-(w) 7.193 Tj
-10 TJm
-(as) 8.29885 Tj
--476 TJm
-(compiled) 37.0808 Tj
--476 TJm
-(with) 17.7135 Tj
-[1 0 0 1 72 471.838] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -471.838] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 471.838 Td
-/F134_0 9.9626 Tf
-(BZ_NO_STDIO) 65.7532 Tj
-[1 0 0 1 137.753 471.838] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -137.753 -471.838] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-140.244 471.838 Td
-/F130_0 9.9626 Tf
-(set.) 13.5591 Tj
-[1 0 0 1 72 470.528] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.898] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -460.63] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 449.985 Td
-/F130_0 9.9626 Tf
-(F) 5.53921 Tj
-15 TJm
-(or) 8.29885 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(normal) 28.224 Tj
--250 TJm
-(compile,) 34.5901 Tj
--250 TJm
-(an) 9.40469 Tj
--250 TJm
-(assertion) 35.417 Tj
--250 TJm
-(f) 3.31755 Tj
-10 TJm
-(ailure) 22.6848 Tj
--250 TJm
-(yields) 23.8007 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(message:) 36.5229 Tj
-[1 0 0 1 72 447.828] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.898] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -437.93] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 428.131 Td
-/F130_0 9.9626 Tf
-(bzip2/libbzip2:) 60.3335 Tj
--310 TJm
-(internal) 30.4357 Tj
--250 TJm
-(error) 19.3573 Tj
--250 TJm
-(number) 30.4357 Tj
--250 TJm
-(N.) 9.68365 Tj
-[1 0 0 1 72 425.975] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.898] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -416.077] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 406.278 Td
-/F130_0 9.9626 Tf
-(This) 17.7135 Tj
--332 TJm
-(is) 6.64505 Tj
--331 TJm
-(a) 4.42339 Tj
--332 TJm
-(b) 4.9813 Tj
-20 TJm
-(ug) 9.9626 Tj
--332 TJm
-(in) 7.7509 Tj
--331 TJm
-(bzip2/libbzip2,) 60.0546 Tj
--352 TJm
-(1.0.5) 19.9252 Tj
--332 TJm
-(of) 8.29885 Tj
--332 TJm
-(10) 9.9626 Tj
--332 TJm
-(December) 40.9363 Tj
--331 TJm
-(2007.) 22.4159 Tj
--555 TJm
-(Please) 25.4544 Tj
--332 TJm
-(report) 23.7907 Tj
--332 TJm
-(it) 5.53921 Tj
--331 TJm
-(to) 7.7509 Tj
--332 TJm
-(me) 12.1743 Tj
--332 TJm
-(at:) 9.9626 Tj
--473 TJm
-(jse) 11.0684 Tj
-25 TJm
-(w) 7.193 Tj
-10 TJm
-(ard@bzip.or) 49.8429 Tj
-18 TJm
-(g.) 7.47195 Tj
--1110 TJm
-(If) 6.63509 Tj
--332 TJm
-(this) 14.396 Tj
-72 394.323 Td
-(happened) 38.1767 Tj
--297 TJm
-(when) 21.579 Tj
--298 TJm
-(you) 14.9439 Tj
--297 TJm
-(were) 19.3573 Tj
--297 TJm
-(using) 21.589 Tj
--297 TJm
-(some) 21.031 Tj
--298 TJm
-(program) 33.7533 Tj
--297 TJm
-(which) 24.3486 Tj
--297 TJm
-(uses) 17.1556 Tj
--297 TJm
-(libbzip2) 32.6574 Tj
--298 TJm
-(as) 8.29885 Tj
--297 TJm
-(a) 4.42339 Tj
--297 TJm
-(component,) 46.7644 Tj
--309 TJm
-(you) 14.9439 Tj
--298 TJm
-(should) 26.5703 Tj
--297 TJm
-(also) 16.0497 Tj
--297 TJm
-(report) 23.7907 Tj
--297 TJm
-(this) 14.396 Tj
--298 TJm
-(b) 4.9813 Tj
-20 TJm
-(ug) 9.9626 Tj
-72 382.368 Td
-(to) 7.7509 Tj
--264 TJm
-(the) 12.1743 Tj
--264 TJm
-(author\(s\)) 35.965 Tj
--264 TJm
-(of) 8.29885 Tj
--264 TJm
-(that) 14.9439 Tj
--264 TJm
-(program.) 36.2439 Tj
--703 TJm
-(Please) 25.4544 Tj
--264 TJm
-(mak) 17.1556 Tj
-10 TJm
-(e) 4.42339 Tj
--264 TJm
-(an) 9.40469 Tj
--264 TJm
-(ef) 7.74094 Tj
-25 TJm
-(fort) 14.386 Tj
--264 TJm
-(to) 7.7509 Tj
--264 TJm
-(report) 23.7907 Tj
--263 TJm
-(this) 14.396 Tj
--264 TJm
-(b) 4.9813 Tj
-20 TJm
-(ug;) 12.7322 Tj
--271 TJm
-(timely) 25.4644 Tj
--264 TJm
-(and) 14.386 Tj
--264 TJm
-(accurate) 33.1854 Tj
--264 TJm
-(b) 4.9813 Tj
-20 TJm
-(ug) 9.9626 Tj
--264 TJm
-(reports) 27.6661 Tj
--264 TJm
-(e) 4.42339 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(entually) 32.0995 Tj
-72 370.413 Td
-(lead) 16.5977 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(higher) 25.4544 Tj
--250 TJm
-(quality) 27.6761 Tj
--250 TJm
-(softw) 22.1369 Tj
-10 TJm
-(are.) 14.655 Tj
--620 TJm
-(Thanks.) 31.8205 Tj
--620 TJm
-(Julian) 23.8007 Tj
--250 TJm
-(Se) 9.9626 Tj
-25 TJm
-(w) 7.193 Tj
-10 TJm
-(ard,) 15.2129 Tj
--250 TJm
-(10) 9.9626 Tj
--250 TJm
-(December) 40.9363 Tj
--250 TJm
-(2007.) 22.4159 Tj
-[1 0 0 1 72 368.256] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.801] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.898] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -348.557] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 338.758 Td
-/F130_0 9.9626 Tf
-(where) 24.3386 Tj
-[1 0 0 1 98.8312 338.758] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -98.8312 -338.758] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-98.8312 338.758 Td
-/F134_0 9.9626 Tf
-(N) 5.97756 Tj
-[1 0 0 1 104.809 338.758] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -104.809 -338.758] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-107.302 338.758 Td
-/F130_0 9.9626 Tf
-(is) 6.64505 Tj
--250 TJm
-(some) 21.031 Tj
--250 TJm
-(error) 19.3573 Tj
--251 TJm
-(code) 18.8094 Tj
--250 TJm
-(number) 30.4357 Tj
-55 TJm
-(.) 2.49065 Tj
--621 TJm
-(If) 6.63509 Tj
-[1 0 0 1 230.81 338.758] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -230.81 -338.758] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-230.81 338.758 Td
-/F134_0 9.9626 Tf
-(N) 5.97756 Tj
--600 TJm
-(==) 11.9551 Tj
--600 TJm
-(1007) 23.9102 Tj
-[1 0 0 1 284.608 338.758] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -284.608 -338.758] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-284.608 338.758 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--250 TJm
-(it) 5.53921 Tj
--250 TJm
-(also) 16.0497 Tj
--251 TJm
-(prints) 22.6948 Tj
--250 TJm
-(some) 21.031 Tj
--250 TJm
-(e) 4.42339 Tj
-15 TJm
-(xtra) 15.4918 Tj
--250 TJm
-(te) 7.193 Tj
-15 TJm
-(xt) 7.7509 Tj
--250 TJm
-(advising) 33.7633 Tj
--251 TJm
-(the) 12.1743 Tj
--250 TJm
-(reader) 24.8866 Tj
--250 TJm
-(that) 14.9439 Tj
--250 TJm
-(unreliable) 39.8404 Tj
-72 326.803 Td
-(memory) 33.2053 Tj
--425 TJm
-(is) 6.64505 Tj
--424 TJm
-(often) 20.4731 Tj
--425 TJm
-(associated) 40.9463 Tj
--425 TJm
-(with) 17.7135 Tj
--424 TJm
-(internal) 30.4357 Tj
--425 TJm
-(error) 19.3573 Tj
--424 TJm
-(1007.) 22.4159 Tj
--834 TJm
-(\(This) 21.031 Tj
--425 TJm
-(is) 6.64505 Tj
--425 TJm
-(a) 4.42339 Tj
--424 TJm
-(frequently-observ) 70.8241 Tj
-15 TJm
-(ed-phenomenon) 64.189 Tj
--425 TJm
-(with) 17.7135 Tj
--425 TJm
-(v) 4.9813 Tj
-15 TJm
-(ersions) 28.224 Tj
-72 314.848 Td
-(1.0.0/1.0.1\).) 48.4282 Tj
-[1 0 0 1 72 313.065] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.898] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -303.167] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 292.995 Td
-/F134_0 9.9626 Tf
-(exit\(3\)) 41.8429 Tj
-[1 0 0 1 113.843 292.995] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -113.843 -292.995] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-116.334 292.995 Td
-/F130_0 9.9626 Tf
-(is) 6.64505 Tj
--250 TJm
-(then) 17.1556 Tj
--250 TJm
-(called.) 26.2813 Tj
-[1 0 0 1 72 291.899] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.8981] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -282.001] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 271.142 Td
-/F130_0 9.9626 Tf
-(F) 5.53921 Tj
-15 TJm
-(or) 8.29885 Tj
--250 TJm
-(a) 4.42339 Tj
-[1 0 0 1 95.0933 271.142] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -95.0933 -271.142] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-95.0933 271.142 Td
-/F134_0 9.9626 Tf
-(stdio) 29.8878 Tj
-[1 0 0 1 124.981 271.142] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -124.981 -271.142] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-124.981 271.142 Td
-/F130_0 9.9626 Tf
-(-free) 18.7994 Tj
--250 TJm
-(library) 26.5603 Tj
-65 TJm
-(,) 2.49065 Tj
--250 TJm
-(assertion) 35.417 Tj
--250 TJm
-(f) 3.31755 Tj
-10 TJm
-(ailures) 26.5603 Tj
--250 TJm
-(result) 22.1369 Tj
--250 TJm
-(in) 7.7509 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(call) 14.386 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(function) 33.2053 Tj
--250 TJm
-(declared) 33.7433 Tj
--250 TJm
-(as:) 11.0684 Tj
-[1 0 0 1 72 268.985] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -24.9066] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 23.9103 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 20.3237] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3685] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -259.62] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 259.62 Td
-/F134_0 9.9626 Tf
-(extern) 35.8654 Tj
--426 TJm
-(void) 23.9102 Tj
--426 TJm
-(bz_internal_error) 101.619 Tj
--426 TJm
-(\() 5.97756 Tj
--426 TJm
-(int) 17.9327 Tj
--426 TJm
-(errcode) 41.8429 Tj
--426 TJm
-(\);) 11.9551 Tj
-[1 0 0 1 72 244.078] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.4846] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -234.18] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 222.225 Td
-/F130_0 9.9626 Tf
-(The) 15.4918 Tj
--250 TJm
-(rele) 14.9339 Tj
-25 TJm
-(v) 4.9813 Tj
-25 TJm
-(ant) 12.1743 Tj
--250 TJm
-(code) 18.8094 Tj
--250 TJm
-(is) 6.64505 Tj
--250 TJm
-(passed) 26.5603 Tj
--250 TJm
-(as) 8.29885 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(parameter) 39.8305 Tj
-55 TJm
-(.) 2.49065 Tj
--620 TJm
-(Y) 7.193 Tj
-110 TJm
-(ou) 9.9626 Tj
--250 TJm
-(should) 26.5703 Tj
--250 TJm
-(supply) 26.5703 Tj
--250 TJm
-(such) 18.2614 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(function.) 35.696 Tj
-[1 0 0 1 72 220.068] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.898] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -210.17] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 200.372 Td
-/F130_0 9.9626 Tf
-(In) 8.29885 Tj
--294 TJm
-(either) 22.6848 Tj
--294 TJm
-(case,) 19.6363 Tj
--306 TJm
-(once) 18.8094 Tj
--294 TJm
-(an) 9.40469 Tj
--294 TJm
-(assertion) 35.417 Tj
--294 TJm
-(f) 3.31755 Tj
-10 TJm
-(ailure) 22.6848 Tj
--294 TJm
-(has) 13.2801 Tj
--295 TJm
-(occurred,) 37.3398 Tj
--305 TJm
-(an) 9.40469 Tj
-15 TJm
-(y) 4.9813 Tj
-[1 0 0 1 306.541 200.372] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -306.541 -200.372] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-306.541 200.372 Td
-/F134_0 9.9626 Tf
-(bz_stream) 53.798 Tj
-[1 0 0 1 360.339 200.372] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -360.339 -200.372] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-363.271 200.372 Td
-/F130_0 9.9626 Tf
-(records) 29.3199 Tj
--294 TJm
-(in) 7.7509 Tj
-40 TJm
-(v) 4.9813 Tj
-20 TJm
-(olv) 12.7322 Tj
-15 TJm
-(ed) 9.40469 Tj
--294 TJm
-(can) 13.8281 Tj
--295 TJm
-(be) 9.40469 Tj
--294 TJm
-(re) 7.74094 Tj
-15 TJm
-(g) 4.9813 Tj
-5 TJm
-(arded) 22.1269 Tj
--294 TJm
-(as) 8.29885 Tj
--294 TJm
-(in) 7.7509 Tj
-40 TJm
-(v) 4.9813 Tj
-25 TJm
-(alid.) 17.4346 Tj
-72 188.417 Td
-(Y) 7.193 Tj
-110 TJm
-(ou) 9.9626 Tj
--250 TJm
-(should) 26.5703 Tj
--250 TJm
-(not) 12.7322 Tj
--250 TJm
-(attempt) 29.8878 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(resume) 28.772 Tj
--250 TJm
-(normal) 28.224 Tj
--250 TJm
-(operation) 37.6287 Tj
--250 TJm
-(with) 17.7135 Tj
--250 TJm
-(them.) 22.4159 Tj
-[1 0 0 1 72 186.26] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.898] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -176.362] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 166.564 Td
-/F130_0 9.9626 Tf
-(Y) 7.193 Tj
-110 TJm
-(ou) 9.9626 Tj
--299 TJm
-(may) 17.1556 Tj
-65 TJm
-(,) 2.49065 Tj
--310 TJm
-(of) 8.29885 Tj
--299 TJm
-(course,) 28.493 Tj
--311 TJm
-(change) 28.2141 Tj
--298 TJm
-(critical) 27.6661 Tj
--299 TJm
-(error) 19.3573 Tj
--298 TJm
-(handling) 34.8691 Tj
--299 TJm
-(to) 7.7509 Tj
--298 TJm
-(suit) 14.396 Tj
--299 TJm
-(your) 18.2614 Tj
--298 TJm
-(needs.) 25.1755 Tj
--912 TJm
-(As) 11.0684 Tj
--298 TJm
-(I) 3.31755 Tj
--299 TJm
-(said) 16.0497 Tj
--298 TJm
-(abo) 14.386 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(e,) 6.91404 Tj
--311 TJm
-(critical) 27.6661 Tj
--299 TJm
-(errors) 23.2328 Tj
--298 TJm
-(indicate) 31.5416 Tj
--299 TJm
-(b) 4.9813 Tj
-20 TJm
-(ugs) 13.8381 Tj
-72 154.608 Td
-(in) 7.7509 Tj
--263 TJm
-(the) 12.1743 Tj
--263 TJm
-(library) 26.5603 Tj
--263 TJm
-(and) 14.386 Tj
--263 TJm
-(should) 26.5703 Tj
--263 TJm
-(not) 12.7322 Tj
--263 TJm
-(occur) 22.1269 Tj
-55 TJm
-(.) 2.49065 Tj
--697 TJm
-(All) 12.7322 Tj
--263 TJm
-("normal") 36.3535 Tj
--263 TJm
-(error) 19.3573 Tj
--263 TJm
-(situations) 38.1966 Tj
--263 TJm
-(are) 12.1643 Tj
--263 TJm
-(indicated) 36.5229 Tj
--263 TJm
-(via) 12.1743 Tj
--263 TJm
-(error) 19.3573 Tj
--263 TJm
-(return) 23.7907 Tj
--263 TJm
-(codes) 22.6848 Tj
--263 TJm
-(from) 19.3673 Tj
--263 TJm
-(functions,) 39.5714 Tj
-72 142.653 Td
-(and) 14.386 Tj
--250 TJm
-(can) 13.8281 Tj
--250 TJm
-(be) 9.40469 Tj
--250 TJm
-(reco) 17.1456 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(ered) 17.1456 Tj
--250 TJm
-(from.) 21.8579 Tj
-[1 0 0 1 72 142.554] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.898] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -132.656] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 107.965 Td
-/F122_0 20.6585 Tf
-(3.8.) 34.4584 Tj
--278 TJm
-(Making) 71.1685 Tj
--278 TJm
-(a) 11.4861 Tj
--278 TJm
-(Windo) 63.1117 Tj
-15 TJm
-(ws) 27.5584 Tj
--278 TJm
-(DLL) 40.1601 Tj
-[1 0 0 1 72 103.369] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.898] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -93.4708] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 86.112 Td
-/F130_0 9.9626 Tf
-(Ev) 11.0684 Tj
-15 TJm
-(erything) 33.2053 Tj
--328 TJm
-(related) 27.1082 Tj
--327 TJm
-(to) 7.7509 Tj
--328 TJm
-(W) 9.40469 Tj
-40 TJm
-(indo) 17.7135 Tj
-25 TJm
-(ws) 11.0684 Tj
--328 TJm
-(has) 13.2801 Tj
--327 TJm
-(been) 18.8094 Tj
--328 TJm
-(contrib) 28.224 Tj
-20 TJm
-(uted) 17.1556 Tj
--328 TJm
-(by) 9.9626 Tj
--327 TJm
-(Y) 7.193 Tj
-110 TJm
-(oshioka) 30.9936 Tj
--328 TJm
-(Tsuneo) 29.3299 Tj
--328 TJm
-(\() 3.31755 Tj
-[1 0 0 1 378.139 86.112] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -378.139 -86.112] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-378.139 86.112 Td
-/F134_0 9.9626 Tf
-(tsuneo@rr.iij4u.or.jp) 125.529 Tj
-[1 0 0 1 503.668 86.112] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -503.668 -86.112] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-503.668 86.112 Td
-/F130_0 9.9626 Tf
-(\),) 5.8082 Tj
--347 TJm
-(so) 8.85675 Tj
--328 TJm
-(you) 14.9439 Tj
-72 74.1568 Td
-(should) 26.5703 Tj
--250 TJm
-(send) 18.2614 Tj
--250 TJm
-(your) 18.2614 Tj
--250 TJm
-(queries) 28.772 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(him) 15.5018 Tj
--250 TJm
-(\(b) 8.29885 Tj
-20 TJm
-(ut) 7.7509 Tj
--250 TJm
-(perhaps) 30.9837 Tj
--250 TJm
-(Cc:) 13.8381 Tj
--310 TJm
-(me,) 14.6649 Tj
-[1 0 0 1 287.958 74.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -287.958 -74.1568] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-287.958 74.1568 Td
-/F134_0 9.9626 Tf
-(jseward@bzip.org) 95.641 Tj
-[1 0 0 1 383.6 74.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -383.6 -74.1568] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-383.6 74.1568 Td
-/F130_0 9.9626 Tf
-(\).) 5.8082 Tj
-[1 0 0 1 72 72] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -21.1482] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 374.394 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.9738] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 40.5726 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -493.841 -51.071] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-534.414 51.071 Td
-/F130_0 9.9626 Tf
-(29) 9.9626 Tj
-[1 0 0 1 453.269 50.8518] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 93.5985 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.2765 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-Q
-showpage
-%%PageTrailer
-pdfEndPage
-%%Page: 33 33
-%%BeginPageSetup
-%%PageOrientation: Portrait
-pdfStartPage
-0 0 612 792 re W
-%%EndPageSetup
-[] 0 d
-1 i
-0 j
-0 J
-10 M
-1 w
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-false op
-false OP
-0 0 612 792 re
-W
-q
-[1 0 0 1 72 741.554] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 14.4459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 187.197 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 -8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 8.9114] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 76.4979 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -342.569 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-419.067 749.245 Td
-/F130_0 9.9626 Tf
-(Programming) 54.7943 Tj
--250 TJm
-(with) 17.7135 Tj
-[1 0 0 1 496.556 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -496.556 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-496.556 749.245 Td
-/F134_0 9.9626 Tf
-(libbzip2) 47.8205 Tj
-[1 0 0 1 544.376 749.245] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -278.305 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 280.796 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.974 -5.0363] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -0.4981] cm
-q
-[] 0 d
-0 J
-0.4981 w
-0 0.2491 m
-475.465 0.2491 l
-S
-Q
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 479.251 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -468 -21.5542] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -720] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 710.037 Td
-/F130_0 9.9626 Tf
-(My) 13.8381 Tj
--367 TJm
-(v) 4.9813 Tj
-25 TJm
-(ague) 18.8094 Tj
--367 TJm
-(understanding) 56.4481 Tj
--367 TJm
-(of) 8.29885 Tj
--367 TJm
-(what) 19.3673 Tj
--368 TJm
-(to) 7.7509 Tj
--367 TJm
-(do) 9.9626 Tj
--367 TJm
-(is:) 9.41466 Tj
--544 TJm
-(using) 21.589 Tj
--367 TJm
-(V) 7.193 Tj
-60 TJm
-(isual) 18.8194 Tj
--367 TJm
-(C++) 17.8829 Tj
--367 TJm
-(5.0,) 14.9439 Tj
--397 TJm
-(open) 19.3673 Tj
--367 TJm
-(the) 12.1743 Tj
--367 TJm
-(project) 27.6661 Tj
--367 TJm
-(\002le) 12.7322 Tj
-[1 0 0 1 432.966 710.037] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -432.966 -710.037] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-432.966 710.037 Td
-/F134_0 9.9626 Tf
-(libbz2.dsp) 59.7756 Tj
-[1 0 0 1 492.742 710.037] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -492.742 -710.037] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-492.742 710.037 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--396 TJm
-(and) 14.386 Tj
--368 TJm
-(b) 4.9813 Tj
-20 TJm
-(uild.) 17.9925 Tj
-72 698.082 Td
-(That') 21.579 Tj
-55 TJm
-(s) 3.87545 Tj
--250 TJm
-(all.) 12.4533 Tj
-[1 0 0 1 72 697.983] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -688.02] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 676.164 Td
-/F130_0 9.9626 Tf
-(If) 6.63509 Tj
--284 TJm
-(you) 14.9439 Tj
--284 TJm
-(can') 17.1456 Tj
-18 TJm
-(t) 2.7696 Tj
--285 TJm
-(open) 19.3673 Tj
--284 TJm
-(the) 12.1743 Tj
--284 TJm
-(project) 27.6661 Tj
--284 TJm
-(\002le) 12.7322 Tj
--284 TJm
-(for) 11.6164 Tj
--285 TJm
-(some) 21.031 Tj
--284 TJm
-(reason,) 28.493 Tj
--293 TJm
-(mak) 17.1556 Tj
-10 TJm
-(e) 4.42339 Tj
--284 TJm
-(a) 4.42339 Tj
--284 TJm
-(ne) 9.40469 Tj
-25 TJm
-(w) 7.193 Tj
--284 TJm
-(one,) 16.8766 Tj
--293 TJm
-(naming) 29.8878 Tj
--284 TJm
-(these) 20.4731 Tj
--284 TJm
-(\002les:) 19.3773 Tj
-[1 0 0 1 424.505 676.164] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -424.505 -676.164] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-424.505 676.164 Td
-/F134_0 9.9626 Tf
-(blocksort.c) 65.7532 Tj
-[1 0 0 1 490.259 676.164] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -490.259 -676.164] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-490.259 676.164 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 495.666 676.164] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -495.666 -676.164] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-495.666 676.164 Td
-/F134_0 9.9626 Tf
-(bzlib.c) 41.8429 Tj
-[1 0 0 1 537.509 676.164] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -537.509 -676.164] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-537.509 676.164 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 72 664.209] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -664.209] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 664.209 Td
-/F134_0 9.9626 Tf
-(compress.c) 59.7756 Tj
-[1 0 0 1 131.776 664.209] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -131.776 -664.209] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-131.776 664.209 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 136.436 664.209] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -136.436 -664.209] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-136.436 664.209 Td
-/F134_0 9.9626 Tf
-(crctable.c) 59.7756 Tj
-[1 0 0 1 196.211 664.209] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -196.211 -664.209] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-196.211 664.209 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 200.871 664.209] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -200.871 -664.209] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-200.871 664.209 Td
-/F134_0 9.9626 Tf
-(decompress.c) 71.7307 Tj
-[1 0 0 1 272.602 664.209] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -272.602 -664.209] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-272.602 664.209 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 277.262 664.209] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -277.262 -664.209] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-277.262 664.209 Td
-/F134_0 9.9626 Tf
-(huffman.c) 53.798 Tj
-[1 0 0 1 331.06 664.209] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -331.06 -664.209] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-331.06 664.209 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 335.72 664.209] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -335.72 -664.209] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-335.72 664.209 Td
-/F134_0 9.9626 Tf
-(randtable.c) 65.7532 Tj
-[1 0 0 1 401.473 664.209] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -401.473 -664.209] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-403.562 664.209 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 420.037 664.209] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -420.037 -664.209] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-420.037 664.209 Td
-/F134_0 9.9626 Tf
-(libbz2.def) 59.7756 Tj
-[1 0 0 1 479.812 664.209] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -479.812 -664.209] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-479.812 664.209 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
--593 TJm
-(Y) 7.193 Tj
-110 TJm
-(ou) 9.9626 Tj
--210 TJm
-(will) 15.5018 Tj
--209 TJm
-(also) 16.0497 Tj
-72 652.254 Td
-(need) 18.8094 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(name) 21.579 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(header) 26.5503 Tj
--250 TJm
-(\002les) 16.6077 Tj
-[1 0 0 1 190.415 652.254] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -190.415 -652.254] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-190.415 652.254 Td
-/F134_0 9.9626 Tf
-(bzlib.h) 41.8429 Tj
-[1 0 0 1 232.258 652.254] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -232.258 -652.254] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-234.748 652.254 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 251.625 652.254] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -251.625 -652.254] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-251.625 652.254 Td
-/F134_0 9.9626 Tf
-(bzlib_private.h) 89.6634 Tj
-[1 0 0 1 341.289 652.254] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -341.289 -652.254] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-341.289 652.254 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
-[1 0 0 1 72 650.72] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -640.757] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 630.336 Td
-/F130_0 9.9626 Tf
-(If) 6.63509 Tj
--250 TJm
-(you) 14.9439 Tj
--250 TJm
-(don') 18.2614 Tj
-18 TJm
-(t) 2.7696 Tj
--250 TJm
-(use) 13.2801 Tj
--250 TJm
-(VC++,) 27.5665 Tj
--250 TJm
-(you) 14.9439 Tj
--250 TJm
-(may) 17.1556 Tj
--250 TJm
-(need) 18.8094 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(de\002ne) 24.3486 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(proprocessor) 51.4568 Tj
--250 TJm
-(symbol) 29.3399 Tj
-[1 0 0 1 363.634 630.336] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -363.634 -630.336] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-363.634 630.336 Td
-/F134_0 9.9626 Tf
-(_WIN32) 35.8654 Tj
-[1 0 0 1 399.5 630.336] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -399.5 -630.336] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-399.5 630.336 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
-[1 0 0 1 72 628.179] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -618.217] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 608.418 Td
-/F130_0 9.9626 Tf
-(Finally) 28.234 Tj
-65 TJm
-(,) 2.49065 Tj
-[1 0 0 1 104.568 608.418] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -104.568 -608.418] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-104.568 608.418 Td
-/F134_0 9.9626 Tf
-(dlltest.c) 53.798 Tj
-[1 0 0 1 158.366 608.418] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -158.366 -608.418] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-160.856 608.418 Td
-/F130_0 9.9626 Tf
-(is) 6.64505 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(sample) 28.224 Tj
--250 TJm
-(program) 33.7533 Tj
--250 TJm
-(using) 21.589 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(DLL.) 21.8579 Tj
--500 TJm
-(It) 6.08715 Tj
--250 TJm
-(has) 13.2801 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(project) 27.6661 Tj
--250 TJm
-(\002le,) 15.2229 Tj
-[1 0 0 1 388.58 608.418] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -388.58 -608.418] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-388.58 608.418 Td
-/F134_0 9.9626 Tf
-(dlltest.dsp) 65.7532 Tj
-[1 0 0 1 454.333 608.418] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -454.333 -608.418] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-454.333 608.418 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
-[1 0 0 1 72 606.262] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -596.299] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 586.501 Td
-/F130_0 9.9626 Tf
-(If) 6.63509 Tj
--250 TJm
-(you) 14.9439 Tj
--250 TJm
-(just) 14.396 Tj
--250 TJm
-(w) 7.193 Tj
-10 TJm
-(ant) 12.1743 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(mak) 17.1556 Tj
-10 TJm
-(e\002le) 17.1556 Tj
--250 TJm
-(for) 11.6164 Tj
--250 TJm
-(V) 7.193 Tj
-60 TJm
-(isual) 18.8194 Tj
--250 TJm
-(C,) 9.1357 Tj
--250 TJm
-(ha) 9.40469 Tj
-20 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(look) 17.7135 Tj
--250 TJm
-(at) 7.193 Tj
-[1 0 0 1 292.212 586.501] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -292.212 -586.501] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-292.212 586.501 Td
-/F134_0 9.9626 Tf
-(makefile.msc) 71.7307 Tj
-[1 0 0 1 363.943 586.501] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -363.943 -586.501] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-363.943 586.501 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
-[1 0 0 1 72 584.344] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -574.381] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 564.583 Td
-/F130_0 9.9626 Tf
-(Be) 11.0684 Tj
--291 TJm
-(a) 4.42339 Tj
-15 TJm
-(w) 7.193 Tj
-10 TJm
-(are) 12.1643 Tj
--291 TJm
-(that) 14.9439 Tj
--291 TJm
-(if) 6.08715 Tj
--291 TJm
-(you) 14.9439 Tj
--291 TJm
-(compile) 32.0995 Tj
-[1 0 0 1 192.069 564.583] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -192.069 -564.583] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-192.069 564.583 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 221.958 564.583] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -221.958 -564.583] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-224.857 564.583 Td
-/F130_0 9.9626 Tf
-(itself) 19.9252 Tj
--291 TJm
-(on) 9.9626 Tj
--291 TJm
-(W) 9.40469 Tj
-40 TJm
-(in32,) 20.2042 Tj
--301 TJm
-(you) 14.9439 Tj
--291 TJm
-(must) 19.3773 Tj
--291 TJm
-(set) 11.0684 Tj
-[1 0 0 1 346.841 564.583] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -346.841 -564.583] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-346.841 564.583 Td
-/F134_0 9.9626 Tf
-(BZ_UNIX) 41.8429 Tj
-[1 0 0 1 388.685 564.583] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -388.685 -564.583] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-391.583 564.583 Td
-/F130_0 9.9626 Tf
-(to) 7.7509 Tj
--291 TJm
-(0) 4.9813 Tj
--291 TJm
-(and) 14.386 Tj
-[1 0 0 1 427.399 564.583] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -427.399 -564.583] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-427.399 564.583 Td
-/F134_0 9.9626 Tf
-(BZ_LCCWIN32) 65.7532 Tj
-[1 0 0 1 493.153 564.583] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -493.153 -564.583] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-496.052 564.583 Td
-/F130_0 9.9626 Tf
-(to) 7.7509 Tj
--291 TJm
-(1,) 7.47195 Tj
--301 TJm
-(in) 7.7509 Tj
--291 TJm
-(the) 12.1743 Tj
-72 552.628 Td
-(\002le) 12.7322 Tj
-[1 0 0 1 87.2227 552.628] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -87.2227 -552.628] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-87.2227 552.628 Td
-/F134_0 9.9626 Tf
-(bzip2.c) 41.8429 Tj
-[1 0 0 1 129.066 552.628] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -129.066 -552.628] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-129.066 552.628 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--250 TJm
-(before) 25.4445 Tj
--250 TJm
-(compiling.) 42.899 Tj
--310 TJm
-(Otherwise) 40.9463 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(resulting) 34.8691 Tj
--250 TJm
-(binary) 25.4544 Tj
--250 TJm
-(w) 7.193 Tj
-10 TJm
-(on') 13.2801 Tj
-18 TJm
-(t) 2.7696 Tj
--250 TJm
-(w) 7.193 Tj
-10 TJm
-(ork) 13.2801 Tj
--250 TJm
-(correctly) 35.4071 Tj
-65 TJm
-(.) 2.49065 Tj
-[1 0 0 1 72 550.471] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -540.508] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 530.71 Td
-/F130_0 9.9626 Tf
-(I) 3.31755 Tj
--250 TJm
-(ha) 9.40469 Tj
-20 TJm
-(v) 4.9813 Tj
-15 TJm
-(en') 12.7222 Tj
-18 TJm
-(t) 2.7696 Tj
--250 TJm
-(tried) 18.2614 Tj
--250 TJm
-(an) 9.40469 Tj
-15 TJm
-(y) 4.9813 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(this) 14.396 Tj
--250 TJm
-(stuf) 14.9439 Tj
-25 TJm
-(f) 3.31755 Tj
--250 TJm
-(myself,) 29.6088 Tj
--250 TJm
-(b) 4.9813 Tj
-20 TJm
-(ut) 7.7509 Tj
--250 TJm
-(it) 5.53921 Tj
--250 TJm
-(all) 9.9626 Tj
--250 TJm
-(looks) 21.589 Tj
--250 TJm
-(plausible.) 38.4656 Tj
-[1 0 0 1 72 528.553] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 0 -477.701] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 374.394 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.8541] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 40.5726 -6.7545] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -493.841 -50.9514] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-534.414 50.9514 Td
-/F130_0 9.9626 Tf
-(30) 9.9626 Tj
-[1 0 0 1 453.269 50.8518] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 93.5985 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.2765 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-Q
-showpage
-%%PageTrailer
-pdfEndPage
-%%Page: 34 34
-%%BeginPageSetup
-%%PageOrientation: Portrait
-pdfStartPage
-0 0 612 792 re W
-%%EndPageSetup
-[] 0 d
-1 i
-0 j
-0 J
-10 M
-1 w
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-false op
-false OP
-0 0 612 792 re
-W
-q
-[1 0 0 1 72 741.554] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 14.4459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 187.197 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 140.398 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -140.398 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 280.796 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.974 -13.9477] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -0.4981] cm
-q
-[] 0 d
-0 J
-0.4981 w
-0 0.2491 m
-475.465 0.2491 l
-S
-Q
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 479.251 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -21.5542] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -720] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 701.916 Td
-/F122_0 24.7902 Tf
-(4.) 20.675 Tj
--278 TJm
-(Miscellanea) 139.172 Tj
-[1 0 0 1 72 701.606] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 0 -9.1347] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -14.1161] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -678.355] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 658.006 Td
-/F122_0 17.2154 Tf
-(T) 10.5186 Tj
-80 TJm
-(ab) 20.0904 Tj
-10 TJm
-(le) 14.3576 Tj
--278 TJm
-(of) 16.2513 Tj
--278 TJm
-(Contents) 74.5943 Tj
-[1 0 0 1 72 649.183] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -11.7401] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -637.443] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 637.443 Td
-/F130_0 9.9626 Tf
-(4.1.) 14.9439 Tj
--310 TJm
-(Limitations) 45.9475 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(compressed) 47.0334 Tj
--250 TJm
-(\002le) 12.7322 Tj
--250 TJm
-(format) 26.5603 Tj
-[1 0 0 1 255.231 637.443] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -260.212 -637.443] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-269.154 637.443 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 637.443] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -637.443] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 637.443 Td
-/F130_0 9.9626 Tf
-(31) 9.9626 Tj
-[1 0 0 1 516.09 637.443] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7984] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -625.488] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 625.488 Td
-/F130_0 9.9626 Tf
-(4.2.) 14.9439 Tj
--310 TJm
-(Portability) 42.0721 Tj
--250 TJm
-(issues) 23.8007 Tj
-[1 0 0 1 158.395 625.488] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -163.376 -625.488] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-172.03 625.488 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 625.488] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -625.488] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 625.488 Td
-/F130_0 9.9626 Tf
-(32) 9.9626 Tj
-[1 0 0 1 516.09 625.488] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7984] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -613.533] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 613.533 Td
-/F130_0 9.9626 Tf
-(4.3.) 14.9439 Tj
--310 TJm
-(Reporting) 39.8504 Tj
--250 TJm
-(b) 4.9813 Tj
-20 TJm
-(ugs) 13.8381 Tj
-[1 0 0 1 150.993 613.533] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -155.975 -613.533] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-166.115 613.533 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 613.533] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -613.533] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 613.533 Td
-/F130_0 9.9626 Tf
-(32) 9.9626 Tj
-[1 0 0 1 516.09 613.533] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7983] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -601.578] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 601.578 Td
-/F130_0 9.9626 Tf
-(4.4.) 14.9439 Tj
--310 TJm
-(Did) 14.9439 Tj
--250 TJm
-(you) 14.9439 Tj
--250 TJm
-(get) 12.1743 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(right) 18.8194 Tj
--250 TJm
-(package?) 37.0609 Tj
-[1 0 0 1 212.602 601.578] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 3.0884 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 3.0884 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -218.778 -601.578] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-229.109 601.578 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 601.578] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -601.578] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 601.578 Td
-/F130_0 9.9626 Tf
-(33) 9.9626 Tj
-[1 0 0 1 516.09 601.578] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.7984] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -589.623] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 589.623 Td
-/F130_0 9.9626 Tf
-(4.5.) 14.9439 Tj
--310 TJm
-(Further) 29.3299 Tj
--250 TJm
-(Reading) 33.2053 Tj
-[1 0 0 1 155.058 589.623] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4906 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -160.039 -589.623] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-170.361 589.623 Td
-/F147_0 9.9626 Tf
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
--166 TJm
-(:) 2.7696 Tj
--167 TJm
-(:) 2.7696 Tj
-[1 0 0 1 506.127 589.623] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -506.127 -589.623] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-506.127 589.623 Td
-/F130_0 9.9626 Tf
-(34) 9.9626 Tj
-[1 0 0 1 516.09 589.623] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -444.09 -2.1568] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.1348] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 0 -9.6315] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -568.7] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 558.901 Td
-/F130_0 9.9626 Tf
-(These) 23.7907 Tj
--250 TJm
-(are) 12.1643 Tj
--250 TJm
-(just) 14.396 Tj
--250 TJm
-(some) 21.031 Tj
--250 TJm
-(random) 30.4357 Tj
--250 TJm
-(thoughts) 34.3212 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(mine.) 22.4159 Tj
--620 TJm
-(Y) 7.193 Tj
-110 TJm
-(our) 13.2801 Tj
--250 TJm
-(mileage) 31.5416 Tj
--250 TJm
-(may) 17.1556 Tj
--250 TJm
-(v) 4.9813 Tj
-25 TJm
-(ary) 12.7222 Tj
-65 TJm
-(.) 2.49065 Tj
-[1 0 0 1 72 556.744] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.6315] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -547.113] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 524.48 Td
-/F122_0 20.6585 Tf
-(4.1.) 34.4584 Tj
--278 TJm
-(Limitations) 110.192 Tj
--278 TJm
-(of) 19.5016 Tj
--278 TJm
-(the) 30.9877 Tj
--278 TJm
-(compressed) 121.699 Tj
--278 TJm
-(\002le) 29.8515 Tj
--278 TJm
-(f) 6.87928 Tj
-20 TJm
-(ormat) 57.3893 Tj
-[1 0 0 1 72 520.203] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.6315] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -510.572] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 502.893 Td
-/F134_0 9.9626 Tf
-(bzip2-1.0.X) 65.7532 Tj
-[1 0 0 1 137.753 502.893] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -137.753 -502.893] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-137.753 502.893 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
-[1 0 0 1 143.405 502.893] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -143.405 -502.893] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-143.405 502.893 Td
-/F134_0 9.9626 Tf
-(0.9.5) 29.8878 Tj
-[1 0 0 1 173.293 502.893] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -173.293 -502.893] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-176.453 502.893 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 194 502.893] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -194 -502.893] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-194 502.893 Td
-/F134_0 9.9626 Tf
-(0.9.0) 29.8878 Tj
-[1 0 0 1 223.888 502.893] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -223.888 -502.893] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-227.048 502.893 Td
-/F130_0 9.9626 Tf
-(use) 13.2801 Tj
--317 TJm
-(e) 4.42339 Tj
-15 TJm
-(xactly) 24.3486 Tj
--317 TJm
-(the) 12.1743 Tj
--318 TJm
-(same) 20.4731 Tj
--317 TJm
-(\002le) 12.7322 Tj
--317 TJm
-(format) 26.5603 Tj
--317 TJm
-(as) 8.29885 Tj
--318 TJm
-(the) 12.1743 Tj
--317 TJm
-(original) 30.9936 Tj
--317 TJm
-(v) 4.9813 Tj
-15 TJm
-(ersion,) 26.8392 Tj
-[1 0 0 1 455.801 502.893] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -455.801 -502.893] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-455.801 502.893 Td
-/F134_0 9.9626 Tf
-(bzip2-0.1) 53.798 Tj
-[1 0 0 1 509.599 502.893] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -509.599 -502.893] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-509.599 502.893 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
--1023 TJm
-(This) 17.7135 Tj
-72 490.938 Td
-(decision) 33.2053 Tj
--222 TJm
-(w) 7.193 Tj
-10 TJm
-(as) 8.29885 Tj
--222 TJm
-(made) 21.579 Tj
--222 TJm
-(in) 7.7509 Tj
--221 TJm
-(the) 12.1743 Tj
--222 TJm
-(interests) 33.2053 Tj
--222 TJm
-(of) 8.29885 Tj
--222 TJm
-(stability) 32.1095 Tj
-65 TJm
-(.) 2.49065 Tj
--601 TJm
-(Creating) 34.3112 Tj
--222 TJm
-(yet) 12.1743 Tj
--222 TJm
-(another) 29.8778 Tj
--222 TJm
-(incompatible) 52.0247 Tj
--221 TJm
-(compressed) 47.0334 Tj
--222 TJm
-(\002le) 12.7322 Tj
--222 TJm
-(format) 26.5603 Tj
--222 TJm
-(w) 7.193 Tj
-10 TJm
-(ould) 17.7135 Tj
--222 TJm
-(create) 23.7807 Tj
-72 478.983 Td
-(further) 27.1082 Tj
--250 TJm
-(confusion) 39.2925 Tj
--250 TJm
-(and) 14.386 Tj
--250 TJm
-(disruption) 40.4083 Tj
--250 TJm
-(for) 11.6164 Tj
--250 TJm
-(users.) 22.9638 Tj
-[1 0 0 1 72 476.826] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.6315] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -467.194] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 457.396 Td
-/F130_0 9.9626 Tf
-(Ne) 11.6164 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(ertheless,) 37.3498 Tj
--234 TJm
-(this) 14.396 Tj
--229 TJm
-(is) 6.64505 Tj
--230 TJm
-(not) 12.7322 Tj
--229 TJm
-(a) 4.42339 Tj
--230 TJm
-(painless) 32.0995 Tj
--229 TJm
-(decision.) 35.696 Tj
--606 TJm
-(De) 11.6164 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(elopment) 37.0808 Tj
--230 TJm
-(w) 7.193 Tj
-10 TJm
-(ork) 13.2801 Tj
--230 TJm
-(since) 20.4731 Tj
--229 TJm
-(the) 12.1743 Tj
--230 TJm
-(release) 27.6562 Tj
--229 TJm
-(of) 8.29885 Tj
-[1 0 0 1 407.317 457.396] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -407.317 -457.396] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-407.317 457.396 Td
-/F134_0 9.9626 Tf
-(bzip2-0.1) 53.798 Tj
-[1 0 0 1 461.115 457.396] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -461.115 -457.396] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-463.402 457.396 Td
-/F130_0 9.9626 Tf
-(in) 7.7509 Tj
--230 TJm
-(August) 28.782 Tj
--229 TJm
-(1997) 19.9252 Tj
--230 TJm
-(has) 13.2801 Tj
-72 445.441 Td
-(sho) 13.8381 Tj
-25 TJm
-(wn) 12.1743 Tj
--226 TJm
-(comple) 29.3299 Tj
-15 TJm
-(xities) 21.589 Tj
--226 TJm
-(in) 7.7509 Tj
--225 TJm
-(the) 12.1743 Tj
--226 TJm
-(\002le) 12.7322 Tj
--226 TJm
-(format) 26.5603 Tj
--226 TJm
-(which) 24.3486 Tj
--226 TJm
-(slo) 11.6264 Tj
-25 TJm
-(w) 7.193 Tj
--225 TJm
-(do) 9.9626 Tj
-25 TJm
-(wn) 12.1743 Tj
--226 TJm
-(decompression) 59.7656 Tj
--226 TJm
-(and,) 16.8766 Tj
--231 TJm
-(in) 7.7509 Tj
--226 TJm
-(retrospect,) 41.7732 Tj
--230 TJm
-(are) 12.1643 Tj
--226 TJm
-(unnecessary) 48.6872 Tj
-65 TJm
-(.) 2.49065 Tj
--604 TJm
-(These) 23.7907 Tj
--226 TJm
-(are:) 14.9339 Tj
-[1 0 0 1 72 443.284] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -29.0613] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.9739 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -78.9739 -414.222] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-78.9739 414.222 Td
-/F130_0 9.9626 Tf
-(\225) 3.48691 Tj
-[1 0 0 1 82.4608 414.222] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.9925 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -86.944 -414.222] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 414.222 Td
-/F130_0 9.9626 Tf
-(The) 15.4918 Tj
--265 TJm
-(run-length) 41.5042 Tj
--266 TJm
-(encoder) 31.5316 Tj
-40 TJm
-(,) 2.49065 Tj
--269 TJm
-(which) 24.3486 Tj
--265 TJm
-(is) 6.64505 Tj
--265 TJm
-(the) 12.1743 Tj
--266 TJm
-(\002rst) 15.5018 Tj
--265 TJm
-(of) 8.29885 Tj
--265 TJm
-(the) 12.1743 Tj
--266 TJm
-(compression) 50.3609 Tj
--265 TJm
-(transformations,) 65.0259 Tj
--269 TJm
-(is) 6.64505 Tj
--265 TJm
-(entirely) 30.4357 Tj
--266 TJm
-(irrele) 21.0211 Tj
-25 TJm
-(v) 4.9813 Tj
-25 TJm
-(ant.) 14.6649 Tj
--711 TJm
-(The) 15.4918 Tj
--266 TJm
-(original) 30.9936 Tj
-86.944 402.267 Td
-(purpose) 31.5416 Tj
--301 TJm
-(w) 7.193 Tj
-10 TJm
-(as) 8.29885 Tj
--301 TJm
-(to) 7.7509 Tj
--301 TJm
-(protect) 27.6661 Tj
--301 TJm
-(the) 12.1743 Tj
--301 TJm
-(sorting) 27.6761 Tj
--301 TJm
-(algorithm) 38.7446 Tj
--301 TJm
-(from) 19.3673 Tj
--301 TJm
-(the) 12.1743 Tj
--301 TJm
-(v) 4.9813 Tj
-15 TJm
-(ery) 12.7222 Tj
--301 TJm
-(w) 7.193 Tj
-10 TJm
-(orst) 14.9439 Tj
--301 TJm
-(case) 17.1456 Tj
--301 TJm
-(input:) 23.2527 Tj
--412 TJm
-(a) 4.42339 Tj
--301 TJm
-(string) 22.6948 Tj
--301 TJm
-(of) 8.29885 Tj
--301 TJm
-(repeated) 33.7433 Tj
--301 TJm
-(symbols.) 35.706 Tj
--927 TJm
-(But) 14.396 Tj
-86.944 390.312 Td
-(algorithm) 38.7446 Tj
--274 TJm
-(steps) 19.9252 Tj
--275 TJm
-(Q6a) 16.5977 Tj
--274 TJm
-(and) 14.386 Tj
--274 TJm
-(Q6b) 17.1556 Tj
--275 TJm
-(in) 7.7509 Tj
--274 TJm
-(the) 12.1743 Tj
--274 TJm
-(original) 30.9936 Tj
--275 TJm
-(Burro) 23.2427 Tj
-25 TJm
-(ws-Wheel) 40.3884 Tj
-1 TJm
-(er) 7.74094 Tj
--275 TJm
-(technical) 35.965 Tj
--274 TJm
-(report) 23.7907 Tj
--274 TJm
-(\(SRC-124\)) 43.7259 Tj
--275 TJm
-(sho) 13.8381 Tj
-25 TJm
-(w) 7.193 Tj
--274 TJm
-(ho) 9.9626 Tj
-25 TJm
-(w) 7.193 Tj
--274 TJm
-(repeats) 28.2141 Tj
--275 TJm
-(can) 13.8281 Tj
-86.944 378.357 Td
-(be) 9.40469 Tj
--250 TJm
-(handled) 31.5416 Tj
--250 TJm
-(without) 30.4457 Tj
--250 TJm
-(dif) 11.0684 Tj
-25 TJm
-(\002culty) 25.4644 Tj
--250 TJm
-(in) 7.7509 Tj
--250 TJm
-(block) 22.1369 Tj
--250 TJm
-(sorting.) 30.1668 Tj
-[1 0 0 1 269.617 378.357] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -197.617 -21.5867] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.9739 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -78.9739 -356.77] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-78.9739 356.77 Td
-/F130_0 9.9626 Tf
-(\225) 3.48691 Tj
-[1 0 0 1 82.4608 356.77] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.9925 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -86.944 -356.77] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 356.77 Td
-/F130_0 9.9626 Tf
-(The) 15.4918 Tj
--293 TJm
-(randomisation) 57.006 Tj
--293 TJm
-(mechanism) 45.3796 Tj
--293 TJm
-(doesn') 26.5603 Tj
-18 TJm
-(t) 2.7696 Tj
--294 TJm
-(really) 22.6848 Tj
--293 TJm
-(need) 18.8094 Tj
--293 TJm
-(to) 7.7509 Tj
--293 TJm
-(be) 9.40469 Tj
--293 TJm
-(there.) 22.4059 Tj
--879 TJm
-(Udi) 14.9439 Tj
--294 TJm
-(Manber) 30.9837 Tj
--293 TJm
-(and) 14.386 Tj
--293 TJm
-(Gene) 21.0211 Tj
--293 TJm
-(Myers) 25.4544 Tj
--293 TJm
-(published) 38.7446 Tj
--294 TJm
-(a) 4.42339 Tj
--293 TJm
-(suf) 12.1743 Tj
-25 TJm
-(\002x) 10.5205 Tj
-86.944 344.815 Td
-(array) 20.4632 Tj
--238 TJm
-(construction) 49.2551 Tj
--239 TJm
-(algorithm) 38.7446 Tj
--238 TJm
-(a) 4.42339 Tj
--238 TJm
-(fe) 7.74094 Tj
-25 TJm
-(w) 7.193 Tj
--239 TJm
-(years) 21.0211 Tj
--238 TJm
-(back,) 21.3 Tj
--241 TJm
-(which) 24.3486 Tj
--238 TJm
-(can) 13.8281 Tj
--238 TJm
-(be) 9.40469 Tj
--239 TJm
-(emplo) 24.9065 Tj
-10 TJm
-(yed) 14.386 Tj
--238 TJm
-(to) 7.7509 Tj
--238 TJm
-(sort) 14.9439 Tj
--239 TJm
-(an) 9.40469 Tj
-15 TJm
-(y) 4.9813 Tj
--238 TJm
-(block,) 24.6275 Tj
--241 TJm
-(no) 9.9626 Tj
--238 TJm
-(matter) 25.4544 Tj
--238 TJm
-(ho) 9.9626 Tj
-25 TJm
-(w) 7.193 Tj
--239 TJm
-(repetiti) 28.224 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(e,) 6.91404 Tj
-86.944 332.86 Td
-(in) 7.7509 Tj
--229 TJm
-(O\(N) 17.7035 Tj
--230 TJm
-(log) 12.7322 Tj
--229 TJm
-(N\)) 10.5105 Tj
--230 TJm
-(time.) 20.2042 Tj
--606 TJm
-(Subsequent) 45.9375 Tj
--230 TJm
-(w) 7.193 Tj
-10 TJm
-(ork) 13.2801 Tj
--229 TJm
-(by) 9.9626 Tj
--230 TJm
-(K) 7.193 Tj
-15 TJm
-(unihik) 25.4644 Tj
-10 TJm
-(o) 4.9813 Tj
--229 TJm
-(Sadakane) 38.1767 Tj
--229 TJm
-(has) 13.2801 Tj
--230 TJm
-(produced) 37.0708 Tj
--229 TJm
-(a) 4.42339 Tj
--230 TJm
-(deri) 15.4918 Tj
-25 TJm
-(v) 4.9813 Tj
-25 TJm
-(ati) 9.9626 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--229 TJm
-(O\(N) 17.7035 Tj
--230 TJm
-(\(log) 16.0497 Tj
--229 TJm
-(N\)^2\)) 23.4818 Tj
--230 TJm
-(algorithm) 38.7446 Tj
-86.944 320.905 Td
-(which) 24.3486 Tj
--250 TJm
-(usually) 28.782 Tj
--250 TJm
-(outperforms) 48.6972 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(Manber) 30.9837 Tj
-20 TJm
-(-Myers) 28.772 Tj
--250 TJm
-(algorithm.) 41.2352 Tj
-[1 0 0 1 314.189 320.905] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -242.189 -11.7883] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -309.116] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 299.318 Td
-/F130_0 9.9626 Tf
-(I) 3.31755 Tj
--248 TJm
-(could) 22.1369 Tj
--248 TJm
-(ha) 9.40469 Tj
-20 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--248 TJm
-(changed) 33.1954 Tj
--248 TJm
-(to) 7.7509 Tj
--248 TJm
-(Sadakane') 41.4942 Tj
-55 TJm
-(s) 3.87545 Tj
--248 TJm
-(algorithm,) 41.2352 Tj
--249 TJm
-(b) 4.9813 Tj
-20 TJm
-(ut) 7.7509 Tj
--248 TJm
-(I) 3.31755 Tj
--248 TJm
-(\002nd) 15.5018 Tj
--248 TJm
-(it) 5.53921 Tj
--248 TJm
-(to) 7.7509 Tj
--248 TJm
-(be) 9.40469 Tj
--248 TJm
-(slo) 11.6264 Tj
-25 TJm
-(wer) 14.9339 Tj
--248 TJm
-(than) 17.1556 Tj
-[1 0 0 1 392.444 299.318] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -392.444 -299.318] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-392.444 299.318 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 422.332 299.318] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -422.332 -299.318] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-422.332 299.318 Td
-/F130_0 9.9626 Tf
-(') 3.31755 Tj
-55 TJm
-(s) 3.87545 Tj
--248 TJm
-(e) 4.42339 Tj
-15 TJm
-(xisting) 27.1282 Tj
--248 TJm
-(algorithm) 38.7446 Tj
--248 TJm
-(for) 11.6164 Tj
--248 TJm
-(most) 19.3773 Tj
-86.944 287.363 Td
-(inputs,) 26.8492 Tj
--370 TJm
-(and) 14.386 Tj
--345 TJm
-(the) 12.1743 Tj
--346 TJm
-(randomisation) 57.006 Tj
--346 TJm
-(mechanism) 45.3796 Tj
--345 TJm
-(protects) 31.5416 Tj
--346 TJm
-(adequately) 43.158 Tj
--345 TJm
-(ag) 9.40469 Tj
-5 TJm
-(ainst) 18.8194 Tj
--346 TJm
-(bad) 14.386 Tj
--346 TJm
-(cases.) 23.5117 Tj
--1194 TJm
-(I) 3.31755 Tj
--345 TJm
-(didn') 21.031 Tj
-18 TJm
-(t) 2.7696 Tj
--346 TJm
-(think) 20.4831 Tj
--346 TJm
-(it) 5.53921 Tj
--345 TJm
-(w) 7.193 Tj
-10 TJm
-(as) 8.29885 Tj
--346 TJm
-(a) 4.42339 Tj
--346 TJm
-(good) 19.9252 Tj
-86.944 275.408 Td
-(tradeof) 28.2141 Tj
-25 TJm
-(f) 3.31755 Tj
--262 TJm
-(to) 7.7509 Tj
--261 TJm
-(mak) 17.1556 Tj
-10 TJm
-(e.) 6.91404 Tj
--690 TJm
-(P) 5.53921 Tj
-15 TJm
-(artly) 18.2614 Tj
--262 TJm
-(this) 14.396 Tj
--261 TJm
-(is) 6.64505 Tj
--262 TJm
-(due) 14.386 Tj
--261 TJm
-(to) 7.7509 Tj
--262 TJm
-(the) 12.1743 Tj
--262 TJm
-(f) 3.31755 Tj
-10 TJm
-(act) 11.6164 Tj
--261 TJm
-(that) 14.9439 Tj
--262 TJm
-(I) 3.31755 Tj
--261 TJm
-(w) 7.193 Tj
-10 TJm
-(as) 8.29885 Tj
--262 TJm
-(not) 12.7322 Tj
--262 TJm
-(\003ooded) 29.8878 Tj
--261 TJm
-(with) 17.7135 Tj
--262 TJm
-(email) 22.1369 Tj
--261 TJm
-(complaints) 43.7259 Tj
--262 TJm
-(about) 22.1369 Tj
-[1 0 0 1 479.557 275.408] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -479.557 -275.408] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-479.557 275.408 Td
-/F134_0 9.9626 Tf
-(bzip2-0.1) 53.798 Tj
-[1 0 0 1 533.355 275.408] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -533.355 -275.408] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-533.355 275.408 Td
-/F130_0 9.9626 Tf
-(') 3.31755 Tj
-55 TJm
-(s) 3.87545 Tj
-86.944 263.453 Td
-(performance) 50.341 Tj
--250 TJm
-(on) 9.9626 Tj
--250 TJm
-(repetiti) 28.224 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--250 TJm
-(data,) 19.0883 Tj
--250 TJm
-(so) 8.85675 Tj
--250 TJm
-(perhaps) 30.9837 Tj
--250 TJm
-(it) 5.53921 Tj
--250 TJm
-(isn') 14.9439 Tj
-18 TJm
-(t) 2.7696 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(problem) 33.2053 Tj
--250 TJm
-(for) 11.6164 Tj
--250 TJm
-(real) 14.9339 Tj
--250 TJm
-(inputs.) 26.8492 Tj
-[1 0 0 1 72 261.296] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.6315] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -251.664] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 241.866 Td
-/F130_0 9.9626 Tf
-(Probably) 35.9749 Tj
--289 TJm
-(the) 12.1743 Tj
--288 TJm
-(best) 16.0497 Tj
--289 TJm
-(long-term) 39.2925 Tj
--289 TJm
-(solution,) 34.6001 Tj
--298 TJm
-(and) 14.386 Tj
--289 TJm
-(the) 12.1743 Tj
--289 TJm
-(one) 14.386 Tj
--288 TJm
-(I) 3.31755 Tj
--289 TJm
-(ha) 9.40469 Tj
-20 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--289 TJm
-(incorporated) 50.351 Tj
--288 TJm
-(into) 15.5018 Tj
--289 TJm
-(0.9.5) 19.9252 Tj
--289 TJm
-(and) 14.386 Tj
--288 TJm
-(abo) 14.386 Tj
-15 TJm
-(v) 4.9813 Tj
-14 TJm
-(e,) 6.91404 Tj
--298 TJm
-(is) 6.64505 Tj
--289 TJm
-(to) 7.7509 Tj
--288 TJm
-(use) 13.2801 Tj
--289 TJm
-(the) 12.1743 Tj
--289 TJm
-(e) 4.42339 Tj
-15 TJm
-(xisting) 27.1282 Tj
-86.944 229.911 Td
-(sorting) 27.6761 Tj
--451 TJm
-(algorithm) 38.7446 Tj
--452 TJm
-(initially) 31.0036 Tj
-65 TJm
-(,) 2.49065 Tj
--501 TJm
-(and) 14.386 Tj
--452 TJm
-(f) 3.31755 Tj
-10 TJm
-(all) 9.9626 Tj
--451 TJm
-(back) 18.8094 Tj
--452 TJm
-(to) 7.7509 Tj
--451 TJm
-(a) 4.42339 Tj
--451 TJm
-(O\(N) 17.7035 Tj
--452 TJm
-(\(log) 16.0497 Tj
--451 TJm
-(N\)^2\)) 23.4818 Tj
--451 TJm
-(algorithm) 38.7446 Tj
--452 TJm
-(if) 6.08715 Tj
--451 TJm
-(the) 12.1743 Tj
--452 TJm
-(standard) 33.7533 Tj
--451 TJm
-(algorithm) 38.7446 Tj
--451 TJm
-(gets) 16.0497 Tj
--452 TJm
-(into) 15.5018 Tj
-86.944 217.956 Td
-(dif) 11.0684 Tj
-25 TJm
-(\002culties.) 34.0422 Tj
-[1 0 0 1 72 217.856] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -21.4871] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.9739 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -78.9739 -196.369] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-78.9739 196.369 Td
-/F130_0 9.9626 Tf
-(\225) 3.48691 Tj
-[1 0 0 1 82.4608 196.369] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.9925 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -86.944 -196.369] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 196.369 Td
-/F130_0 9.9626 Tf
-(The) 15.4918 Tj
--299 TJm
-(compressed) 47.0334 Tj
--299 TJm
-(\002le) 12.7322 Tj
--299 TJm
-(format) 26.5603 Tj
--299 TJm
-(w) 7.193 Tj
-10 TJm
-(as) 8.29885 Tj
--300 TJm
-(ne) 9.40469 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(er) 7.74094 Tj
--299 TJm
-(designed) 35.417 Tj
--299 TJm
-(to) 7.7509 Tj
--299 TJm
-(be) 9.40469 Tj
--299 TJm
-(handled) 31.5416 Tj
--299 TJm
-(by) 9.9626 Tj
--299 TJm
-(a) 4.42339 Tj
--299 TJm
-(library) 26.5603 Tj
-65 TJm
-(,) 2.49065 Tj
--312 TJm
-(and) 14.386 Tj
--299 TJm
-(I) 3.31755 Tj
--299 TJm
-(ha) 9.40469 Tj
-20 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--299 TJm
-(had) 14.386 Tj
--299 TJm
-(to) 7.7509 Tj
--299 TJm
-(jump) 20.4831 Tj
--300 TJm
-(though) 27.6761 Tj
--299 TJm
-(some) 21.031 Tj
-86.944 184.414 Td
-(hoops) 23.8007 Tj
--278 TJm
-(to) 7.7509 Tj
--277 TJm
-(produce) 32.0895 Tj
--278 TJm
-(an) 9.40469 Tj
--278 TJm
-(ef) 7.74094 Tj
-25 TJm
-(\002cient) 24.9065 Tj
--277 TJm
-(implementation) 62.5452 Tj
--278 TJm
-(of) 8.29885 Tj
--278 TJm
-(decompression.) 62.2563 Tj
--786 TJm
-(It') 9.40469 Tj
-55 TJm
-(s) 3.87545 Tj
--278 TJm
-(a) 4.42339 Tj
--277 TJm
-(bit) 10.5205 Tj
--278 TJm
-(hairy) 20.4731 Tj
-65 TJm
-(.) 2.49065 Tj
--786 TJm
-(T) 6.08715 Tj
-35 TJm
-(ry) 8.29885 Tj
--278 TJm
-(passing) 29.8878 Tj
-[1 0 0 1 468.269 184.414] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468.269 -184.414] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-468.269 184.414 Td
-/F134_0 9.9626 Tf
-(decompress.c) 71.7307 Tj
-[1 0 0 1 540 184.414] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -540 -184.414] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 172.459 Td
-/F130_0 9.9626 Tf
-(through) 30.9936 Tj
--268 TJm
-(the) 12.1743 Tj
--268 TJm
-(C) 6.64505 Tj
--268 TJm
-(preprocessor) 50.8989 Tj
--269 TJm
-(and) 14.386 Tj
--268 TJm
-(you') 18.2614 Tj
-10 TJm
-(ll) 5.53921 Tj
--268 TJm
-(see) 12.7222 Tj
--268 TJm
-(what) 19.3673 Tj
--268 TJm
-(I) 3.31755 Tj
--268 TJm
-(mean.) 24.0696 Tj
--729 TJm
-(Much) 23.2427 Tj
--268 TJm
-(of) 8.29885 Tj
--269 TJm
-(this) 14.396 Tj
--268 TJm
-(comple) 29.3299 Tj
-15 TJm
-(xity) 15.5018 Tj
--268 TJm
-(could) 22.1369 Tj
--268 TJm
-(ha) 9.40469 Tj
-20 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--268 TJm
-(been) 18.8094 Tj
--268 TJm
-(a) 4.42339 Tj
-20 TJm
-(v) 4.9813 Tj
-20 TJm
-(oided) 22.1369 Tj
--269 TJm
-(if) 6.08715 Tj
--268 TJm
-(the) 12.1743 Tj
-86.944 160.503 Td
-(compressed) 47.0334 Tj
--250 TJm
-(size) 15.4918 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(each) 18.2515 Tj
--250 TJm
-(block) 22.1369 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(data) 16.5977 Tj
--250 TJm
-(w) 7.193 Tj
-10 TJm
-(as) 8.29885 Tj
--250 TJm
-(recorded) 34.8492 Tj
--250 TJm
-(in) 7.7509 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(data) 16.5977 Tj
--250 TJm
-(stream.) 29.0509 Tj
-[1 0 0 1 368.754 160.503] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -296.754 -21.5867] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.9739 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -78.9739 -138.917] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-78.9739 138.917 Td
-/F130_0 9.9626 Tf
-(\225) 3.48691 Tj
-[1 0 0 1 82.4608 138.917] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.9925 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -86.944 -138.917] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 138.917 Td
-/F130_0 9.9626 Tf
-(An) 12.1743 Tj
--250 TJm
-(Adler) 22.6848 Tj
-20 TJm
-(-32) 13.2801 Tj
--250 TJm
-(checksum,) 42.3311 Tj
--250 TJm
-(rather) 23.2328 Tj
--250 TJm
-(than) 17.1556 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(CRC32) 29.8978 Tj
--250 TJm
-(checksum,) 42.3311 Tj
--250 TJm
-(w) 7.193 Tj
-10 TJm
-(ould) 17.7135 Tj
--250 TJm
-(be) 9.40469 Tj
--250 TJm
-(f) 3.31755 Tj
-10 TJm
-(aster) 18.8094 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(compute.) 36.8018 Tj
-[1 0 0 1 424.934 138.917] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -352.934 -11.7883] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -127.128] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 117.33 Td
-/F130_0 9.9626 Tf
-(It) 6.08715 Tj
--349 TJm
-(w) 7.193 Tj
-10 TJm
-(ould) 17.7135 Tj
--349 TJm
-(be) 9.40469 Tj
--349 TJm
-(f) 3.31755 Tj
-10 TJm
-(air) 10.5105 Tj
--348 TJm
-(to) 7.7509 Tj
--349 TJm
-(say) 13.2801 Tj
--349 TJm
-(that) 14.9439 Tj
--349 TJm
-(the) 12.1743 Tj
-[1 0 0 1 201.979 117.33] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -201.979 -117.33] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-201.979 117.33 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 231.867 117.33] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -231.867 -117.33] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-235.342 117.33 Td
-/F130_0 9.9626 Tf
-(format) 26.5603 Tj
--349 TJm
-(w) 7.193 Tj
-10 TJm
-(as) 8.29885 Tj
--349 TJm
-(frozen) 25.4445 Tj
--348 TJm
-(before) 25.4445 Tj
--349 TJm
-(I) 3.31755 Tj
--349 TJm
-(properly) 33.7533 Tj
--349 TJm
-(and) 14.386 Tj
--349 TJm
-(fully) 18.8194 Tj
--349 TJm
-(understood) 44.2738 Tj
--348 TJm
-(the) 12.1743 Tj
--349 TJm
-(performance) 50.341 Tj
-72 105.375 Td
-(consequences) 54.7744 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(doing) 22.6948 Tj
--250 TJm
-(so.) 11.3474 Tj
-[1 0 0 1 72 103.218] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.6315] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -93.5867] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 83.7883 Td
-/F130_0 9.9626 Tf
-(Impro) 24.3486 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(ements) 28.224 Tj
--250 TJm
-(which) 24.3486 Tj
--250 TJm
-(I) 3.31755 Tj
--250 TJm
-(w) 7.193 Tj
-10 TJm
-(as) 8.29885 Tj
--250 TJm
-(able) 16.5977 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(incorporate) 45.3697 Tj
--250 TJm
-(into) 15.5018 Tj
--250 TJm
-(0.9.0,) 22.4159 Tj
--250 TJm
-(despite) 28.224 Tj
--250 TJm
-(using) 21.589 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(same) 20.4731 Tj
--250 TJm
-(\002le) 12.7322 Tj
--250 TJm
-(format,) 29.0509 Tj
--250 TJm
-(are:) 14.9339 Tj
-[1 0 0 1 72 81.6315] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -30.7796] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 374.394 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.8541] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 40.5726 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -493.841 -50.9514] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-534.414 50.9514 Td
-/F130_0 9.9626 Tf
-(31) 9.9626 Tj
-[1 0 0 1 453.269 50.8519] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 93.5985 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.2765 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-Q
-showpage
-%%PageTrailer
-pdfEndPage
-%%Page: 35 35
-%%BeginPageSetup
-%%PageOrientation: Portrait
-pdfStartPage
-0 0 612 792 re W
-%%EndPageSetup
-[] 0 d
-1 i
-0 j
-0 J
-10 M
-1 w
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-false op
-false OP
-0 0 612 792 re
-W
-q
-[1 0 0 1 72 741.554] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 14.4459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 187.197 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 -6.8541] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.8541] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 116.328 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -382.4 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-498.728 749.245 Td
-/F130_0 9.9626 Tf
-(Miscellanea) 48.1393 Tj
-[1 0 0 1 266.071 749.146] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 280.796 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.974 -7.0936] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -0.4981] cm
-q
-[] 0 d
-0 J
-0.4981 w
-0 0.2491 m
-475.465 0.2491 l
-S
-Q
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 479.251 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -31.5168] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.9739 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -78.9739 -710.037] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-78.9739 710.037 Td
-/F130_0 9.9626 Tf
-(\225) 3.48691 Tj
-[1 0 0 1 82.4608 710.037] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.9925 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -86.944 -710.037] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 710.037 Td
-/F130_0 9.9626 Tf
-(Single) 25.4644 Tj
--202 TJm
-(array) 20.4632 Tj
--201 TJm
-(implementation) 62.5452 Tj
--202 TJm
-(of) 8.29885 Tj
--202 TJm
-(the) 12.1743 Tj
--201 TJm
-(in) 7.7509 Tj
-40 TJm
-(v) 4.9813 Tj
-15 TJm
-(erse) 16.0398 Tj
--202 TJm
-(BWT) 22.1369 Tj
-74 TJm
-(.) 2.49065 Tj
--403 TJm
-(This) 17.7135 Tj
--202 TJm
-(signi\002cantly) 49.2651 Tj
--201 TJm
-(speeds) 26.5603 Tj
--202 TJm
-(up) 9.9626 Tj
--202 TJm
-(decompression,) 62.2563 Tj
--211 TJm
-(presumably) 46.4855 Tj
--202 TJm
-(because) 31.5316 Tj
-86.944 698.082 Td
-(it) 5.53921 Tj
--250 TJm
-(reduces) 30.4258 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(number) 30.4357 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(cache) 22.6749 Tj
--250 TJm
-(misses.) 29.0609 Tj
-[1 0 0 1 240.496 698.082] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -168.496 -21.9178] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.9739 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -78.9739 -676.164] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-78.9739 676.164 Td
-/F130_0 9.9626 Tf
-(\225) 3.48691 Tj
-[1 0 0 1 82.4608 676.164] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.9925 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -86.944 -676.164] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 676.164 Td
-/F130_0 9.9626 Tf
-(F) 5.53921 Tj
-15 TJm
-(aster) 18.8094 Tj
--314 TJm
-(in) 7.7509 Tj
-40 TJm
-(v) 4.9813 Tj
-15 TJm
-(erse) 16.0398 Tj
--315 TJm
-(MTF) 20.4831 Tj
--314 TJm
-(transform) 38.7346 Tj
--315 TJm
-(for) 11.6164 Tj
--314 TJm
-(lar) 10.5105 Tj
-18 TJm
-(ge) 9.40469 Tj
--315 TJm
-(MTF) 20.4831 Tj
--314 TJm
-(v) 4.9813 Tj
-25 TJm
-(alues.) 22.9638 Tj
--504 TJm
-(The) 15.4918 Tj
--314 TJm
-(ne) 9.40469 Tj
-25 TJm
-(w) 7.193 Tj
--314 TJm
-(implementation) 62.5452 Tj
--315 TJm
-(is) 6.64505 Tj
--314 TJm
-(based) 22.6848 Tj
--315 TJm
-(on) 9.9626 Tj
--314 TJm
-(the) 12.1743 Tj
--315 TJm
-(notion) 25.4644 Tj
--314 TJm
-(of) 8.29885 Tj
--315 TJm
-(sliding) 27.1282 Tj
-86.944 664.209 Td
-(blocks) 26.0123 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(v) 4.9813 Tj
-25 TJm
-(alues.) 22.9638 Tj
-[1 0 0 1 153.932 664.209] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -81.9321 -21.9178] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.9739 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -78.9739 -642.291] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-78.9739 642.291 Td
-/F130_0 9.9626 Tf
-(\225) 3.48691 Tj
-[1 0 0 1 82.4608 642.291] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.9925 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -86.944 -642.291] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 642.291 Td
-/F134_0 9.9626 Tf
-(bzip2-0.9.0) 65.7532 Tj
-[1 0 0 1 152.697 642.291] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -152.697 -642.291] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-155.412 642.291 Td
-/F130_0 9.9626 Tf
-(no) 9.9626 Tj
-25 TJm
-(w) 7.193 Tj
--272 TJm
-(reads) 21.0211 Tj
--273 TJm
-(and) 14.386 Tj
--272 TJm
-(writes) 24.3486 Tj
--273 TJm
-(\002les) 16.6077 Tj
--272 TJm
-(with) 17.7135 Tj
-[1 0 0 1 282.68 642.291] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -282.68 -642.291] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-282.68 642.291 Td
-/F134_0 9.9626 Tf
-(fread) 29.8878 Tj
-[1 0 0 1 312.568 642.291] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -312.568 -642.291] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-315.282 642.291 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 332.383 642.291] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -332.383 -642.291] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-332.383 642.291 Td
-/F134_0 9.9626 Tf
-(fwrite) 35.8654 Tj
-[1 0 0 1 368.248 642.291] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -368.248 -642.291] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-368.248 642.291 Td
-/F130_0 9.9626 Tf
-(;) 2.7696 Tj
--284 TJm
-(v) 4.9813 Tj
-15 TJm
-(ersion) 24.3486 Tj
--272 TJm
-(0.1) 12.4533 Tj
--273 TJm
-(used) 18.2614 Tj
-[1 0 0 1 441.882 642.291] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -441.882 -642.291] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-441.882 642.291 Td
-/F134_0 9.9626 Tf
-(putc) 23.9102 Tj
-[1 0 0 1 465.792 642.291] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -465.792 -642.291] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-468.507 642.291 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 485.607 642.291] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -485.607 -642.291] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-485.607 642.291 Td
-/F134_0 9.9626 Tf
-(getc) 23.9102 Tj
-[1 0 0 1 509.517 642.291] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -509.517 -642.291] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-509.517 642.291 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
--755 TJm
-(Duh!) 20.4731 Tj
-86.944 630.336 Td
-(W) 9.40469 Tj
-80 TJm
-(ell,) 12.4533 Tj
--250 TJm
-(you) 14.9439 Tj
--250 TJm
-(li) 5.53921 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--250 TJm
-(and) 14.386 Tj
--250 TJm
-(learn.) 22.4059 Tj
-[1 0 0 1 184.248 630.336] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -112.248 -12.1195] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -618.217] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 608.418 Td
-/F130_0 9.9626 Tf
-(Further) 29.3299 Tj
--304 TJm
-(ahead,) 25.7234 Tj
--318 TJm
-(it) 5.53921 Tj
--305 TJm
-(w) 7.193 Tj
-10 TJm
-(ould) 17.7135 Tj
--304 TJm
-(be) 9.40469 Tj
--305 TJm
-(nice) 16.5977 Tj
--304 TJm
-(to) 7.7509 Tj
--305 TJm
-(be) 9.40469 Tj
--304 TJm
-(able) 16.5977 Tj
--304 TJm
-(to) 7.7509 Tj
--305 TJm
-(do) 9.9626 Tj
--304 TJm
-(random) 30.4357 Tj
--305 TJm
-(access) 25.4445 Tj
--304 TJm
-(into) 15.5018 Tj
--305 TJm
-(\002les.) 19.0983 Tj
--946 TJm
-(This) 17.7135 Tj
--305 TJm
-(will) 15.5018 Tj
--304 TJm
-(require) 28.2141 Tj
--304 TJm
-(some) 21.031 Tj
--305 TJm
-(careful) 27.6562 Tj
--304 TJm
-(design) 26.0123 Tj
--305 TJm
-(of) 8.29885 Tj
-72 596.463 Td
-(compressed) 47.0334 Tj
--250 TJm
-(\002le) 12.7322 Tj
--250 TJm
-(formats.) 32.9264 Tj
-[1 0 0 1 72 594.306] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -584.344] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 561.71 Td
-/F122_0 20.6585 Tf
-(4.2.) 34.4584 Tj
--278 TJm
-(P) 13.7792 Tj
-40 TJm
-(or) 20.6585 Tj
--20 TJm
-(tability) 66.5823 Tj
--278 TJm
-(issues) 64.3099 Tj
-[1 0 0 1 72 557.434] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -547.472] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 539.793 Td
-/F130_0 9.9626 Tf
-(After) 21.0211 Tj
--250 TJm
-(some) 21.031 Tj
--250 TJm
-(consideration,) 56.1691 Tj
--250 TJm
-(I) 3.31755 Tj
--250 TJm
-(ha) 9.40469 Tj
-20 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--250 TJm
-(decided) 30.9837 Tj
--250 TJm
-(not) 12.7322 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(use) 13.2801 Tj
--250 TJm
-(GNU) 21.579 Tj
-[1 0 0 1 303.231 539.793] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -303.231 -539.793] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-303.231 539.793 Td
-/F134_0 9.9626 Tf
-(autoconf) 47.8205 Tj
-[1 0 0 1 351.052 539.793] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -351.052 -539.793] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-353.542 539.793 Td
-/F130_0 9.9626 Tf
-(to) 7.7509 Tj
--250 TJm
-(con\002gure) 37.6287 Tj
--250 TJm
-(0.9.5) 19.9252 Tj
--250 TJm
-(or) 8.29885 Tj
--250 TJm
-(1.0.) 14.9439 Tj
-[1 0 0 1 72 537.636] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -527.673] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 517.875 Td
-/F134_0 9.9626 Tf
-(autoconf) 47.8205 Tj
-[1 0 0 1 119.821 517.875] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -119.821 -517.875] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-119.821 517.875 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--502 TJm
-(admirable) 39.8404 Tj
--452 TJm
-(and) 14.386 Tj
--452 TJm
-(w) 7.193 Tj
-10 TJm
-(onderful) 33.7533 Tj
--452 TJm
-(though) 27.6761 Tj
--452 TJm
-(it) 5.53921 Tj
--452 TJm
-(is,) 9.1357 Tj
--502 TJm
-(mainly) 27.6761 Tj
--452 TJm
-(assists) 25.4644 Tj
--452 TJm
-(with) 17.7135 Tj
--452 TJm
-(portability) 41.5142 Tj
--452 TJm
-(problems) 37.0808 Tj
--452 TJm
-(between) 33.1954 Tj
--452 TJm
-(Unix-lik) 33.7633 Tj
-10 TJm
-(e) 4.42339 Tj
-72 505.92 Td
-(platforms.) 40.6773 Tj
--1398 TJm
-(But) 14.396 Tj
-[1 0 0 1 144.784 505.92] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -144.784 -505.92] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-144.784 505.92 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 174.672 505.92] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -174.672 -505.92] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-178.455 505.92 Td
-/F130_0 9.9626 Tf
-(doesn') 26.5603 Tj
-18 TJm
-(t) 2.7696 Tj
--380 TJm
-(ha) 9.40469 Tj
-20 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--379 TJm
-(much) 22.1369 Tj
--380 TJm
-(in) 7.7509 Tj
--380 TJm
-(the) 12.1743 Tj
--379 TJm
-(w) 7.193 Tj
-10 TJm
-(ay) 9.40469 Tj
--380 TJm
-(of) 8.29885 Tj
--380 TJm
-(portability) 41.5142 Tj
--379 TJm
-(problems) 37.0808 Tj
--380 TJm
-(on) 9.9626 Tj
--380 TJm
-(Unix;) 22.6948 Tj
--444 TJm
-(most) 19.3773 Tj
--380 TJm
-(of) 8.29885 Tj
--380 TJm
-(the) 12.1743 Tj
--379 TJm
-(dif) 11.0684 Tj
-25 TJm
-(\002culties) 31.5516 Tj
-72 493.964 Td
-(appear) 26.5503 Tj
--297 TJm
-(when) 21.579 Tj
--296 TJm
-(po) 9.9626 Tj
--1 TJm
-(r) 3.31755 Tj
-1 TJm
-(ting) 15.5018 Tj
--297 TJm
-(to) 7.7509 Tj
--297 TJm
-(the) 12.1743 Tj
--297 TJm
-(Mac,) 20.1942 Tj
--308 TJm
-(or) 8.29885 Tj
--297 TJm
-(to) 7.7509 Tj
--297 TJm
-(Microsoft') 42.61 Tj
-55 TJm
-(s) 3.87545 Tj
--296 TJm
-(operating) 37.6287 Tj
--297 TJm
-(systems.) 34.0422 Tj
-[1 0 0 1 361.339 493.964] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -361.339 -493.964] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-361.339 493.964 Td
-/F134_0 9.9626 Tf
-(autoconf) 47.8205 Tj
-[1 0 0 1 409.16 493.964] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -409.16 -493.964] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-412.116 493.964 Td
-/F130_0 9.9626 Tf
-(doesn') 26.5603 Tj
-18 TJm
-(t) 2.7696 Tj
--297 TJm
-(help) 17.1556 Tj
--296 TJm
-(in) 7.7509 Tj
--297 TJm
-(those) 21.031 Tj
--297 TJm
-(cases,) 23.5117 Tj
--308 TJm
-(and) 14.386 Tj
-72 482.009 Td
-(brings) 24.9065 Tj
--250 TJm
-(in) 7.7509 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(whole) 24.3486 Tj
--250 TJm
-(load) 17.1556 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(ne) 9.40469 Tj
-25 TJm
-(w) 7.193 Tj
--250 TJm
-(comple) 29.3299 Tj
-15 TJm
-(xity) 15.5018 Tj
-65 TJm
-(.) 2.49065 Tj
-[1 0 0 1 72 479.852] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -469.89] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 460.091 Td
-/F130_0 9.9626 Tf
-(Most) 20.4831 Tj
--392 TJm
-(people) 26.5603 Tj
--392 TJm
-(should) 26.5703 Tj
--393 TJm
-(be) 9.40469 Tj
--392 TJm
-(able) 16.5977 Tj
--392 TJm
-(to) 7.7509 Tj
--392 TJm
-(compile) 32.0995 Tj
--393 TJm
-(the) 12.1743 Tj
--392 TJm
-(library) 26.5603 Tj
--392 TJm
-(and) 14.386 Tj
--392 TJm
-(program) 33.7533 Tj
--393 TJm
-(under) 22.6848 Tj
--392 TJm
-(Unix) 19.9252 Tj
--392 TJm
-(straight) 29.8878 Tj
--392 TJm
-(out-of-the-box,) 60.5925 Tj
--428 TJm
-(so) 8.85675 Tj
--392 TJm
-(to) 7.7509 Tj
--393 TJm
-(speak,) 25.1755 Tj
-72 448.136 Td
-(especially) 39.8404 Tj
--250 TJm
-(if) 6.08715 Tj
--250 TJm
-(you) 14.9439 Tj
--250 TJm
-(ha) 9.40469 Tj
-20 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(v) 4.9813 Tj
-15 TJm
-(ersion) 24.3486 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(GNU) 21.579 Tj
--250 TJm
-(C) 6.64505 Tj
--250 TJm
-(a) 4.42339 Tj
-20 TJm
-(v) 4.9813 Tj
-25 TJm
-(ailable.) 29.0509 Tj
-[1 0 0 1 72 445.979] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -436.017] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 426.218 Td
-/F130_0 9.9626 Tf
-(There) 23.2328 Tj
--259 TJm
-(are) 12.1643 Tj
--258 TJm
-(a) 4.42339 Tj
--259 TJm
-(couple) 26.5603 Tj
--258 TJm
-(of) 8.29885 Tj
-[1 0 0 1 159.561 426.218] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -159.561 -426.218] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-159.561 426.218 Td
-/F134_0 9.9626 Tf
-(__inline__) 59.7756 Tj
-[1 0 0 1 219.337 426.218] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -219.337 -426.218] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-221.913 426.218 Td
-/F130_0 9.9626 Tf
-(directi) 25.4544 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(es) 8.29885 Tj
--259 TJm
-(in) 7.7509 Tj
--258 TJm
-(the) 12.1743 Tj
--259 TJm
-(code.) 21.3 Tj
--671 TJm
-(GNU) 21.579 Tj
--259 TJm
-(C) 6.64505 Tj
--258 TJm
-(\() 3.31755 Tj
-[1 0 0 1 352.587 426.218] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -352.587 -426.218] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-352.587 426.218 Td
-/F134_0 9.9626 Tf
-(gcc) 17.9327 Tj
-[1 0 0 1 370.52 426.218] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -370.52 -426.218] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-370.52 426.218 Td
-/F130_0 9.9626 Tf
-(\)) 3.31755 Tj
--259 TJm
-(should) 26.5703 Tj
--258 TJm
-(be) 9.40469 Tj
--259 TJm
-(able) 16.5977 Tj
--258 TJm
-(to) 7.7509 Tj
--259 TJm
-(handle) 26.5603 Tj
--259 TJm
-(them.) 22.4159 Tj
--671 TJm
-(If) 6.63509 Tj
--259 TJm
-(you') 18.2614 Tj
-50 TJm
-(re) 7.74094 Tj
-72 414.263 Td
-(not) 12.7322 Tj
--279 TJm
-(using) 21.589 Tj
--279 TJm
-(GNU) 21.579 Tj
--279 TJm
-(C,) 9.1357 Tj
--279 TJm
-(your) 18.2614 Tj
--279 TJm
-(C) 6.64505 Tj
--279 TJm
-(compiler) 35.417 Tj
--279 TJm
-(shouldn') 34.8691 Tj
-18 TJm
-(t) 2.7696 Tj
--279 TJm
-(see) 12.7222 Tj
--279 TJm
-(them) 19.9252 Tj
--279 TJm
-(at) 7.193 Tj
--279 TJm
-(all.) 12.4533 Tj
--794 TJm
-(If) 6.63509 Tj
--279 TJm
-(your) 18.2614 Tj
--279 TJm
-(compiler) 35.417 Tj
--279 TJm
-(does,) 20.7521 Tj
--286 TJm
-(for) 11.6164 Tj
--279 TJm
-(some) 21.031 Tj
--279 TJm
-(reason,) 28.493 Tj
--287 TJm
-(see) 12.7222 Tj
--279 TJm
-(them) 19.9252 Tj
--279 TJm
-(and) 14.386 Tj
-72 402.308 Td
-(doesn') 26.5603 Tj
-18 TJm
-(t) 2.7696 Tj
--283 TJm
-(lik) 10.5205 Tj
-10 TJm
-(e) 4.42339 Tj
--283 TJm
-(them,) 22.4159 Tj
--291 TJm
-(just) 14.396 Tj
-[1 0 0 1 164.167 402.308] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -164.167 -402.308] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-164.167 402.308 Td
-/F134_0 9.9626 Tf
-(#define) 41.8429 Tj
-[1 0 0 1 206.01 402.308] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.8196 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -208.829 -402.308] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-208.829 402.308 Td
-/F134_0 9.9626 Tf
-(__inline__) 59.7756 Tj
-[1 0 0 1 268.605 402.308] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -268.605 -402.308] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-271.425 402.308 Td
-/F130_0 9.9626 Tf
-(to) 7.7509 Tj
--283 TJm
-(be) 9.40469 Tj
-[1 0 0 1 294.22 402.308] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -294.22 -402.308] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-294.22 402.308 Td
-/F134_0 9.9626 Tf
-(/) 5.97756 Tj
-300.197 400.565 Td
-(*) 5.97756 Tj
--600 TJm
-(*) 5.97756 Tj
-318.13 402.308 Td
-(/) 5.97756 Tj
-[1 0 0 1 324.108 402.308] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -324.108 -402.308] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-324.108 402.308 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
--818 TJm
-(One) 16.5977 Tj
--283 TJm
-(easy) 17.7035 Tj
--283 TJm
-(w) 7.193 Tj
-10 TJm
-(ay) 9.40469 Tj
--283 TJm
-(to) 7.7509 Tj
--283 TJm
-(do) 9.9626 Tj
--283 TJm
-(this) 14.396 Tj
--283 TJm
-(is) 6.64505 Tj
--283 TJm
-(to) 7.7509 Tj
--283 TJm
-(compile) 32.0995 Tj
--283 TJm
-(with) 17.7135 Tj
--283 TJm
-(the) 12.1743 Tj
--283 TJm
-(\003ag) 14.9439 Tj
-[1 0 0 1 72 390.353] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -390.353] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 390.353 Td
-/F134_0 9.9626 Tf
-(-D__inline__=) 77.7083 Tj
-[1 0 0 1 149.709 390.353] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -149.709 -390.353] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-149.709 390.353 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--250 TJm
-(which) 24.3486 Tj
--250 TJm
-(should) 26.5703 Tj
--250 TJm
-(be) 9.40469 Tj
--250 TJm
-(understood) 44.2738 Tj
--250 TJm
-(by) 9.9626 Tj
--250 TJm
-(most) 19.3773 Tj
--250 TJm
-(Unix) 19.9252 Tj
--250 TJm
-(compilers.) 41.7831 Tj
-[1 0 0 1 72 388.196] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -378.233] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 368.435 Td
-/F130_0 9.9626 Tf
-(If) 6.63509 Tj
--321 TJm
-(you) 14.9439 Tj
--321 TJm
-(still) 14.9539 Tj
--322 TJm
-(ha) 9.40469 Tj
-20 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--321 TJm
-(dif) 11.0684 Tj
-25 TJm
-(\002culties,) 34.0422 Tj
--339 TJm
-(try) 11.0684 Tj
--321 TJm
-(compiling) 40.4083 Tj
--321 TJm
-(with) 17.7135 Tj
--322 TJm
-(t) 2.7696 Tj
-1 TJm
-(he) 9.40469 Tj
--322 TJm
-(macro) 24.8965 Tj
-[1 0 0 1 310.295 368.435] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -310.295 -368.435] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-310.295 368.435 Td
-/F134_0 9.9626 Tf
-(BZ_STRICT_ANSI) 83.6858 Tj
-[1 0 0 1 393.981 368.435] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -393.981 -368.435] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-397.18 368.435 Td
-/F130_0 9.9626 Tf
-(de\002ned.) 31.8205 Tj
--524 TJm
-(This) 17.7135 Tj
--321 TJm
-(should) 26.5703 Tj
--321 TJm
-(enable) 26.0024 Tj
--321 TJm
-(you) 14.9439 Tj
--322 TJm
-(to) 7.7509 Tj
-72 356.48 Td
-(b) 4.9813 Tj
-20 TJm
-(uild) 15.5018 Tj
--321 TJm
-(the) 12.1743 Tj
--321 TJm
-(library) 26.5603 Tj
--322 TJm
-(in) 7.7509 Tj
--321 TJm
-(a) 4.42339 Tj
--321 TJm
-(strictly) 27.6761 Tj
--321 TJm
-(ANSI) 23.2427 Tj
--321 TJm
-(compliant) 39.8504 Tj
--322 TJm
-(en) 9.40469 Tj
-40 TJm
-(vironment.) 43.4469 Tj
--1047 TJm
-(Building) 34.8791 Tj
--321 TJm
-(the) 12.1743 Tj
--321 TJm
-(program) 33.7533 Tj
--322 TJm
-(itself) 19.9252 Tj
--321 TJm
-(lik) 10.5205 Tj
-10 TJm
-(e) 4.42339 Tj
--321 TJm
-(this) 14.396 Tj
--321 TJm
-(is) 6.64505 Tj
--321 TJm
-(dangerous) 40.9463 Tj
--322 TJm
-(and) 14.386 Tj
-72 344.525 Td
-(not) 12.7322 Tj
--260 TJm
-(supported,) 41.7831 Tj
--263 TJm
-(since) 20.4731 Tj
--260 TJm
-(you) 14.9439 Tj
--260 TJm
-(remo) 20.4731 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
-[1 0 0 1 204.498 344.525] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -204.498 -344.525] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-204.498 344.525 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 234.386 344.525] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -234.386 -344.525] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-234.386 344.525 Td
-/F130_0 9.9626 Tf
-(') 3.31755 Tj
-55 TJm
-(s) 3.87545 Tj
--260 TJm
-(checks) 27.1082 Tj
--260 TJm
-(ag) 9.40469 Tj
-5 TJm
-(ainst) 18.8194 Tj
--261 TJm
-(compressi) 40.3983 Tj
-1 TJm
-(ng) 9.9626 Tj
--261 TJm
-(directories,) 44.5428 Tj
--262 TJm
-(symbolic) 36.5329 Tj
--261 TJm
-(links,) 21.8679 Tj
--262 TJm
-(de) 9.40469 Tj
-25 TJm
-(vices,) 22.9638 Tj
--263 TJm
-(and) 14.386 Tj
--260 TJm
-(other) 20.4731 Tj
-72 332.57 Td
-(not-really-a-\002le) 62.5253 Tj
--250 TJm
-(entities.) 31.2726 Tj
--620 TJm
-(This) 17.7135 Tj
--250 TJm
-(could) 22.1369 Tj
--250 TJm
-(cause) 22.1269 Tj
--250 TJm
-(\002lesystem) 40.4083 Tj
--250 TJm
-(corruption!) 44.8217 Tj
-[1 0 0 1 72 330.413] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -320.45] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 310.652 Td
-/F130_0 9.9626 Tf
-(One) 16.5977 Tj
--392 TJm
-(other) 20.4731 Tj
--391 TJm
-(thing:) 23.2527 Tj
--594 TJm
-(if) 6.08715 Tj
--391 TJm
-(you) 14.9439 Tj
--392 TJm
-(create) 23.7807 Tj
--391 TJm
-(a) 4.42339 Tj
-[1 0 0 1 210.879 310.652] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -210.879 -310.652] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-210.879 310.652 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 240.767 310.652] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -240.767 -310.652] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-244.669 310.652 Td
-/F130_0 9.9626 Tf
-(binary) 25.4544 Tj
--392 TJm
-(for) 11.6164 Tj
--391 TJm
-(public) 24.9065 Tj
--392 TJm
-(distrib) 25.4644 Tj
-20 TJm
-(ution,) 22.9738 Tj
--427 TJm
-(please) 24.8965 Tj
--392 TJm
-(consider) 33.7533 Tj
--391 TJm
-(linking) 28.234 Tj
--392 TJm
-(it) 5.53921 Tj
--391 TJm
-(statically) 35.9749 Tj
--392 TJm
-(\() 3.31755 Tj
-[1 0 0 1 522.067 310.652] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -522.067 -310.652] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-522.067 310.652 Td
-/F134_0 9.9626 Tf
-(gcc) 17.9327 Tj
-72 298.697 Td
-(-static) 41.8429 Tj
-[1 0 0 1 113.843 298.697] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -113.843 -298.697] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-113.843 298.697 Td
-/F130_0 9.9626 Tf
-(\).) 5.8082 Tj
--620 TJm
-(This) 17.7135 Tj
--250 TJm
-(a) 4.42339 Tj
-20 TJm
-(v) 4.9813 Tj
-20 TJm
-(oids) 16.6077 Tj
--250 TJm
-(all) 9.9626 Tj
--250 TJm
-(sorts) 18.8194 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(library-v) 34.8591 Tj
-15 TJm
-(ersion) 24.3486 Tj
--250 TJm
-(issues) 23.8007 Tj
--250 TJm
-(that) 14.9439 Tj
--250 TJm
-(others) 24.3486 Tj
--250 TJm
-(may) 17.1556 Tj
--250 TJm
-(encounter) 39.2825 Tj
--250 TJm
-(later) 17.7035 Tj
--250 TJm
-(on.) 12.4533 Tj
-[1 0 0 1 72 296.54] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -286.577] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 276.779 Td
-/F130_0 9.9626 Tf
-(If) 6.63509 Tj
--296 TJm
-(you) 14.9439 Tj
--296 TJm
-(b) 4.9813 Tj
-20 TJm
-(uild) 15.5018 Tj
-[1 0 0 1 122.709 276.779] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -122.709 -276.779] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-122.709 276.779 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 152.596 276.779] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -152.596 -276.779] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-155.545 276.779 Td
-/F130_0 9.9626 Tf
-(on) 9.9626 Tj
--296 TJm
-(W) 9.40469 Tj
-40 TJm
-(in32,) 20.2042 Tj
--307 TJm
-(you) 14.9439 Tj
--296 TJm
-(must) 19.3773 Tj
--296 TJm
-(set) 11.0684 Tj
-[1 0 0 1 254.965 276.779] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -254.965 -276.779] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-254.965 276.779 Td
-/F134_0 9.9626 Tf
-(BZ_UNIX) 41.8429 Tj
-[1 0 0 1 296.808 276.779] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -296.808 -276.779] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-299.756 276.779 Td
-/F130_0 9.9626 Tf
-(to) 7.7509 Tj
--296 TJm
-(0) 4.9813 Tj
--296 TJm
-(and) 14.386 Tj
-[1 0 0 1 335.72 276.779] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -335.72 -276.779] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-335.72 276.779 Td
-/F134_0 9.9626 Tf
-(BZ_LCCWIN32) 65.7532 Tj
-[1 0 0 1 401.473 276.779] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -401.473 -276.779] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-404.422 276.779 Td
-/F130_0 9.9626 Tf
-(to) 7.7509 Tj
--296 TJm
-(1,) 7.47195 Tj
--307 TJm
-(in) 7.7509 Tj
--296 TJm
-(the) 12.1743 Tj
--296 TJm
-(\002le) 12.7322 Tj
-[1 0 0 1 467.159 276.779] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -467.159 -276.779] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-467.159 276.779 Td
-/F134_0 9.9626 Tf
-(bzip2.c) 41.8429 Tj
-[1 0 0 1 509.002 276.779] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -509.002 -276.779] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-509.002 276.779 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--307 TJm
-(before) 25.4445 Tj
-72 264.824 Td
-(compiling.) 42.899 Tj
--310 TJm
-(Otherwise) 40.9463 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(resulting) 34.8691 Tj
--250 TJm
-(binary) 25.4544 Tj
--250 TJm
-(w) 7.193 Tj
-10 TJm
-(on') 13.2801 Tj
-18 TJm
-(t) 2.7696 Tj
--250 TJm
-(w) 7.193 Tj
-10 TJm
-(ork) 13.2801 Tj
--250 TJm
-(correctly) 35.4071 Tj
-65 TJm
-(.) 2.49065 Tj
-[1 0 0 1 72 262.667] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -252.704] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 230.071 Td
-/F122_0 20.6585 Tf
-(4.3.) 34.4584 Tj
--278 TJm
-(Repor) 59.6824 Tj
--20 TJm
-(ting) 37.867 Tj
--278 TJm
-(b) 12.6223 Tj
-20 TJm
-(ugs) 36.7308 Tj
-[1 0 0 1 72 225.474] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -215.512] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 208.153 Td
-/F130_0 9.9626 Tf
-(I) 3.31755 Tj
--228 TJm
-(tried) 18.2614 Tj
--228 TJm
-(pretty) 23.2427 Tj
--228 TJm
-(hard) 17.7035 Tj
--228 TJm
-(to) 7.7509 Tj
--228 TJm
-(mak) 17.1556 Tj
-10 TJm
-(e) 4.42339 Tj
--228 TJm
-(sure) 16.5977 Tj
-[1 0 0 1 196.25 208.153] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -196.25 -208.153] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-196.25 208.153 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 226.138 208.153] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -226.138 -208.153] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-228.409 208.153 Td
-/F130_0 9.9626 Tf
-(is) 6.64505 Tj
--228 TJm
-(b) 4.9813 Tj
-20 TJm
-(ug) 9.9626 Tj
--228 TJm
-(free,) 17.9725 Tj
--232 TJm
-(both) 17.7135 Tj
--228 TJm
-(by) 9.9626 Tj
--228 TJm
-(design) 26.0123 Tj
--228 TJm
-(and) 14.386 Tj
--228 TJm
-(by) 9.9626 Tj
--228 TJm
-(testing.) 29.0609 Tj
--605 TJm
-(Hopefully) 40.3983 Tj
--228 TJm
-(you') 18.2614 Tj
-10 TJm
-(ll) 5.53921 Tj
--228 TJm
-(ne) 9.40469 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(er) 7.74094 Tj
--228 TJm
-(need) 18.8094 Tj
--228 TJm
-(to) 7.7509 Tj
--228 TJm
-(read) 17.1456 Tj
-72 196.198 Td
-(this) 14.396 Tj
--250 TJm
-(section) 28.224 Tj
--250 TJm
-(for) 11.6164 Tj
--250 TJm
-(real.) 17.4246 Tj
-[1 0 0 1 72 196.098] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -186.136] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 174.28 Td
-/F130_0 9.9626 Tf
-(Ne) 11.6164 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(ertheless,) 37.3498 Tj
--313 TJm
-(if) 6.08715 Tj
-[1 0 0 1 137.751 174.28] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -137.751 -174.28] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-137.751 174.28 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 167.639 174.28] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -167.639 -174.28] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-170.634 174.28 Td
-/F130_0 9.9626 Tf
-(dies) 16.0497 Tj
--301 TJm
-(with) 17.7135 Tj
--300 TJm
-(a) 4.42339 Tj
--301 TJm
-(se) 8.29885 Tj
-15 TJm
-(gmentation) 44.8317 Tj
--300 TJm
-(f) 3.31755 Tj
-10 TJm
-(ault,) 17.4346 Tj
--314 TJm
-(a) 4.42339 Tj
--300 TJm
-(b) 4.9813 Tj
-20 TJm
-(us) 8.85675 Tj
--301 TJm
-(error) 19.3573 Tj
--300 TJm
-(or) 8.29885 Tj
--301 TJm
-(an) 9.40469 Tj
--301 TJm
-(internal) 30.4357 Tj
--300 TJm
-(assertion) 35.417 Tj
--301 TJm
-(f) 3.31755 Tj
-10 TJm
-(ailure,) 25.1755 Tj
--313 TJm
-(it) 5.53921 Tj
--301 TJm
-(wil) 12.7322 Tj
-1 TJm
-(l) 2.7696 Tj
--301 TJm
-(ask) 13.2801 Tj
--301 TJm
-(you) 14.9439 Tj
--300 TJm
-(to) 7.7509 Tj
-72 162.325 Td
-(email) 22.1369 Tj
--242 TJm
-(me) 12.1743 Tj
--243 TJm
-(a) 4.42339 Tj
--242 TJm
-(b) 4.9813 Tj
-20 TJm
-(ug) 9.9626 Tj
--243 TJm
-(report.) 26.2813 Tj
--615 TJm
-(Experience) 44.8118 Tj
--242 TJm
-(from) 19.3673 Tj
--243 TJm
-(years) 21.0211 Tj
--242 TJm
-(of) 8.29885 Tj
--242 TJm
-(feedback) 35.955 Tj
--243 TJm
-(of) 8.29885 Tj
--242 TJm
-(bzip2) 22.1369 Tj
--243 TJm
-(users) 20.4731 Tj
--242 TJm
-(indicates) 35.417 Tj
--243 TJm
-(that) 14.9439 Tj
--242 TJm
-(almost) 26.5703 Tj
--242 TJm
-(all) 9.9626 Tj
--243 TJm
-(these) 20.4731 Tj
--242 TJm
-(problems) 37.0808 Tj
--243 TJm
-(can) 13.8281 Tj
-72 150.37 Td
-(be) 9.40469 Tj
--250 TJm
-(traced) 24.3386 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(either) 22.6848 Tj
--250 TJm
-(compiler) 35.417 Tj
--250 TJm
-(b) 4.9813 Tj
-20 TJm
-(ugs) 13.8381 Tj
--250 TJm
-(or) 8.29885 Tj
--250 TJm
-(hardw) 24.8965 Tj
-10 TJm
-(are) 12.1643 Tj
--250 TJm
-(problems.) 39.5714 Tj
-[1 0 0 1 72 148.213] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -97.3611] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 374.394 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.8541] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 40.5726 -6.7545] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -493.841 -50.9514] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-534.414 50.9514 Td
-/F130_0 9.9626 Tf
-(32) 9.9626 Tj
-[1 0 0 1 453.269 50.8518] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 93.5985 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.2765 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-Q
-showpage
-%%PageTrailer
-pdfEndPage
-%%Page: 36 36
-%%BeginPageSetup
-%%PageOrientation: Portrait
-pdfStartPage
-0 0 612 792 re W
-%%EndPageSetup
-[] 0 d
-1 i
-0 j
-0 J
-10 M
-1 w
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-false op
-false OP
-0 0 612 792 re
-W
-q
-[1 0 0 1 72 741.554] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 14.4459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 187.197 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 -6.8541] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.8541] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 116.328 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -382.4 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-498.728 749.245 Td
-/F130_0 9.9626 Tf
-(Miscellanea) 48.1393 Tj
-[1 0 0 1 266.071 749.146] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 280.796 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.974 -7.0936] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -0.4981] cm
-q
-[] 0 d
-0 J
-0.4981 w
-0 0.2491 m
-475.465 0.2491 l
-S
-Q
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 479.251 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -31.5168] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.9739 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -78.9739 -710.037] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-78.9739 710.037 Td
-/F130_0 9.9626 Tf
-(\225) 3.48691 Tj
-[1 0 0 1 82.4608 710.037] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.9925 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -86.944 -710.037] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 710.037 Td
-/F130_0 9.9626 Tf
-(Recompile) 43.1679 Tj
--306 TJm
-(the) 12.1743 Tj
--306 TJm
-(program) 33.7533 Tj
--306 TJm
-(with) 17.7135 Tj
--306 TJm
-(no) 9.9626 Tj
--306 TJm
-(optimisation,) 52.3136 Tj
--320 TJm
-(and) 14.386 Tj
--306 TJm
-(see) 12.7222 Tj
--306 TJm
-(if) 6.08715 Tj
--306 TJm
-(it) 5.53921 Tj
--306 TJm
-(w) 7.193 Tj
-10 TJm
-(orks.) 19.6462 Tj
--956 TJm
-(And/or) 28.224 Tj
--306 TJm
-(try) 11.0684 Tj
--306 TJm
-(a) 4.42339 Tj
--306 TJm
-(dif) 11.0684 Tj
-25 TJm
-(ferent) 23.2328 Tj
--306 TJm
-(compiler) 35.417 Tj
-55 TJm
-(.) 2.49065 Tj
--956 TJm
-(I) 3.31755 Tj
--306 TJm
-(heard) 22.1269 Tj
--306 TJm
-(all) 9.9626 Tj
-86.944 698.082 Td
-(sorts) 18.8194 Tj
--282 TJm
-(of) 8.29885 Tj
--282 TJm
-(stories) 26.0123 Tj
--282 TJm
-(about) 22.1369 Tj
--283 TJm
-(v) 4.9813 Tj
-25 TJm
-(arious) 24.3486 Tj
--282 TJm
-(\003a) 9.9626 Tj
-20 TJm
-(v) 4.9813 Tj
-20 TJm
-(ours) 17.1556 Tj
--282 TJm
-(of) 8.29885 Tj
--282 TJm
-(GNU) 21.579 Tj
--282 TJm
-(C) 6.64505 Tj
--282 TJm
-(\(and) 17.7035 Tj
--282 TJm
-(other) 20.4731 Tj
--283 TJm
-(compilers\)) 42.61 Tj
--282 TJm
-(generating) 42.0521 Tj
--282 TJm
-(bad) 14.386 Tj
--282 TJm
-(code) 18.8094 Tj
--282 TJm
-(for) 11.6164 Tj
-[1 0 0 1 472.141 698.082] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.141 -698.082] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-472.141 698.082 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 502.029 698.082] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -502.029 -698.082] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-502.029 698.082 Td
-/F130_0 9.9626 Tf
-(,) 2.49065 Tj
--290 TJm
-(and) 14.386 Tj
--282 TJm
-(I') 6.63509 Tj
-50 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
-86.944 686.127 Td
-(run) 13.2801 Tj
--250 TJm
-(across) 24.8965 Tj
--250 TJm
-(tw) 9.9626 Tj
-10 TJm
-(o) 4.9813 Tj
--250 TJm
-(such) 18.2614 Tj
--250 TJm
-(e) 4.42339 Tj
-15 TJm
-(xamples) 33.2053 Tj
--250 TJm
-(myself.) 29.6088 Tj
-[1 0 0 1 237.767 686.127] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -165.767 -12.1195] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -674.007] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 664.209 Td
-/F130_0 9.9626 Tf
-(2.7.X) 22.1369 Tj
--280 TJm
-(v) 4.9813 Tj
-15 TJm
-(ersions) 28.224 Tj
--279 TJm
-(of) 8.29885 Tj
--280 TJm
-(GNU) 21.579 Tj
--279 TJm
-(C) 6.64505 Tj
--280 TJm
-(are) 12.1643 Tj
--279 TJm
-(kno) 14.9439 Tj
-25 TJm
-(wn) 12.1743 Tj
--280 TJm
-(to) 7.7509 Tj
--280 TJm
-(generate) 33.7433 Tj
--279 TJm
-(bad) 14.386 Tj
--280 TJm
-(code) 18.8094 Tj
--279 TJm
-(from) 19.3673 Tj
--280 TJm
-(time) 17.7135 Tj
--279 TJm
-(to) 7.7509 Tj
--280 TJm
-(time,) 20.2042 Tj
--287 TJm
-(at) 7.193 Tj
--280 TJm
-(high) 17.7135 Tj
--279 TJm
-(optimisation) 49.823 Tj
--280 TJm
-(le) 7.193 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(els.) 13.5591 Tj
--797 TJm
-(If) 6.63509 Tj
--280 TJm
-(you) 14.9439 Tj
-86.944 652.254 Td
-(get) 12.1743 Tj
--295 TJm
-(problems,) 39.5714 Tj
--307 TJm
-(try) 11.0684 Tj
--296 TJm
-(using) 21.589 Tj
--295 TJm
-(the) 12.1743 Tj
--296 TJm
-(\003ags) 18.8194 Tj
-[1 0 0 1 220.116 652.254] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -220.116 -652.254] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-220.116 652.254 Td
-/F134_0 9.9626 Tf
-(-O2) 17.9327 Tj
-[1 0 0 1 238.049 652.254] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.9438 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -240.993 -652.254] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-240.993 652.254 Td
-/F134_0 9.9626 Tf
-(-fomit-frame-pointer) 119.551 Tj
-[1 0 0 1 360.544 652.254] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.9438 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -363.488 -652.254] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-363.488 652.254 Td
-/F134_0 9.9626 Tf
-(-fno-strength-reduce) 119.551 Tj
-[1 0 0 1 483.04 652.254] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -483.04 -652.254] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-483.04 652.254 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
--893 TJm
-(Y) 7.193 Tj
-110 TJm
-(ou) 9.9626 Tj
--295 TJm
-(should) 26.5703 Tj
-86.944 640.299 Td
-(speci\002cally) 45.3796 Tj
-[1 0 0 1 134.814 640.299] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -134.814 -640.299] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-134.814 640.299 Td
-/F637_0 9.9626 Tf
-(not) 12.7322 Tj
-[1 0 0 1 147.546 640.299] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -147.546 -640.299] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-150.036 640.299 Td
-/F130_0 9.9626 Tf
-(use) 13.2801 Tj
-[1 0 0 1 165.807 640.299] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -165.807 -640.299] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-165.807 640.299 Td
-/F134_0 9.9626 Tf
-(-funroll-loops) 83.6858 Tj
-[1 0 0 1 249.493 640.299] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -249.493 -640.299] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-249.493 640.299 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
-[1 0 0 1 72 638.142] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -628.179] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 618.381 Td
-/F130_0 9.9626 Tf
-(Y) 7.193 Tj
-110 TJm
-(ou) 9.9626 Tj
--249 TJm
-(may) 17.1556 Tj
--249 TJm
-(notice) 24.3486 Tj
--248 TJm
-(that) 14.9439 Tj
--249 TJm
-(the) 12.1743 Tj
--249 TJm
-(Mak) 18.2614 Tj
-10 TJm
-(e\002le) 17.1556 Tj
--249 TJm
-(runs) 17.1556 Tj
--248 TJm
-(six) 11.6264 Tj
--249 TJm
-(tests) 17.7135 Tj
--249 TJm
-(as) 8.29885 Tj
--249 TJm
-(part) 15.4918 Tj
--249 TJm
-(of) 8.29885 Tj
--248 TJm
-(the) 12.1743 Tj
--249 TJm
-(b) 4.9813 Tj
-20 TJm
-(uild) 15.5018 Tj
--249 TJm
-(process.) 32.3685 Tj
--619 TJm
-(If) 6.63509 Tj
--249 TJm
-(the) 12.1743 Tj
--249 TJm
-(program) 33.7533 Tj
--248 TJm
-(passes) 25.4544 Tj
--249 TJm
-(all) 9.9626 Tj
--249 TJm
-(of) 8.29885 Tj
--249 TJm
-(these,) 22.9638 Tj
--249 TJm
-(it') 8.85675 Tj
-55 TJm
-(s) 3.87545 Tj
-86.944 606.426 Td
-(a) 4.42339 Tj
--250 TJm
-(pretty) 23.2427 Tj
--250 TJm
-(good) 19.9252 Tj
--250 TJm
-(\(b) 8.29885 Tj
-20 TJm
-(ut) 7.7509 Tj
--250 TJm
-(not) 12.7322 Tj
--250 TJm
-(100%\)) 26.5603 Tj
--250 TJm
-(indication) 39.8504 Tj
--250 TJm
-(that) 14.9439 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(compiler) 35.417 Tj
--250 TJm
-(has) 13.2801 Tj
--250 TJm
-(done) 19.3673 Tj
--250 TJm
-(its) 9.41466 Tj
--250 TJm
-(job) 12.7322 Tj
--250 TJm
-(correctly) 35.4071 Tj
-65 TJm
-(.) 2.49065 Tj
-[1 0 0 1 72 604.269] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -19.761] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.9739 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -78.9739 -584.508] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-78.9739 584.508 Td
-/F130_0 9.9626 Tf
-(\225) 3.48691 Tj
-[1 0 0 1 82.4608 584.508] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.9925 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -86.944 -584.508] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 584.508 Td
-/F130_0 9.9626 Tf
-(If) 6.63509 Tj
-[1 0 0 1 95.9558 584.508] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -95.9558 -584.508] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-95.9558 584.508 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 125.844 584.508] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -125.844 -584.508] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-128.22 584.508 Td
-/F130_0 9.9626 Tf
-(crashes) 29.3199 Tj
--239 TJm
-(randomly) 38.1866 Tj
-65 TJm
-(,) 2.49065 Tj
--240 TJm
-(and) 14.386 Tj
--239 TJm
-(the) 12.1743 Tj
--239 TJm
-(crashe) 25.4445 Tj
-1 TJm
-(s) 3.87545 Tj
--239 TJm
-(are) 12.1643 Tj
--239 TJm
-(not) 12.7322 Tj
--238 TJm
-(repeatable,) 43.427 Tj
--241 TJm
-(you) 14.9439 Tj
--239 TJm
-(may) 17.1556 Tj
--238 TJm
-(ha) 9.40469 Tj
-20 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--239 TJm
-(a) 4.42339 Tj
--238 TJm
-(\003ak) 14.9439 Tj
-15 TJm
-(y) 4.9813 Tj
--239 TJm
-(memory) 33.2053 Tj
--238 TJm
-(subsystem.) 44.0048 Tj
-[1 0 0 1 510.112 584.508] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -510.112 -584.508] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-510.112 584.508 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 540 584.508] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -540 -584.508] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 572.553 Td
-/F130_0 9.9626 Tf
-(really) 22.6848 Tj
--254 TJm
-(hammers) 36.5229 Tj
--253 TJm
-(your) 18.2614 Tj
--254 TJm
-(memory) 33.2053 Tj
--253 TJm
-(hierarch) 32.6375 Tj
-5 TJm
-(y) 4.9813 Tj
-65 TJm
-(,) 2.49065 Tj
--255 TJm
-(and) 14.386 Tj
--253 TJm
-(if) 6.08715 Tj
--254 TJm
-(it') 8.85675 Tj
-55 TJm
-(s) 3.87545 Tj
--254 TJm
-(a) 4.42339 Tj
--253 TJm
-(bit) 10.5205 Tj
--254 TJm
-(mar) 15.4918 Tj
-18 TJm
-(ginal,) 22.4159 Tj
--254 TJm
-(you) 14.9439 Tj
--254 TJm
-(may) 17.1556 Tj
--253 TJm
-(get) 12.1743 Tj
--254 TJm
-(these) 20.4731 Tj
--253 TJm
-(problems.) 39.5714 Tj
--642 TJm
-(Ditto) 20.4831 Tj
--254 TJm
-(if) 6.08715 Tj
--253 TJm
-(your) 18.2614 Tj
--254 TJm
-(disk) 16.6077 Tj
-86.944 560.598 Td
-(or) 8.29885 Tj
--250 TJm
-(I/O) 13.2801 Tj
--250 TJm
-(subsystem) 41.5142 Tj
--250 TJm
-(is) 6.64505 Tj
--250 TJm
-(slo) 11.6264 Tj
-25 TJm
-(wly) 14.9439 Tj
--250 TJm
-(f) 3.31755 Tj
-10 TJm
-(ailing.) 25.1855 Tj
--620 TJm
-(Y) 7.193 Tj
-111 TJm
-(up,) 12.4533 Tj
--250 TJm
-(this) 14.396 Tj
--250 TJm
-(really) 22.6848 Tj
--250 TJm
-(does) 18.2614 Tj
--250 TJm
-(happen.) 31.2626 Tj
-[1 0 0 1 345.143 560.598] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -273.143 -12.1195] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -548.478] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 538.68 Td
-/F130_0 9.9626 Tf
-(T) 6.08715 Tj
-35 TJm
-(ry) 8.29885 Tj
--250 TJm
-(using) 21.589 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(dif) 11.0684 Tj
-25 TJm
-(ferent) 23.2328 Tj
--250 TJm
-(machine) 33.7533 Tj
--250 TJm
-(of) 8.29885 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(same) 20.4731 Tj
--250 TJm
-(type,) 19.6462 Tj
--250 TJm
-(and) 14.386 Tj
--250 TJm
-(see) 12.7222 Tj
--250 TJm
-(if) 6.08715 Tj
--250 TJm
-(you) 14.9439 Tj
--250 TJm
-(can) 13.8281 Tj
--250 TJm
-(repeat) 24.3386 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(problem.) 35.696 Tj
-[1 0 0 1 72 536.523] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -19.761] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.9739 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -78.9739 -516.762] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-78.9739 516.762 Td
-/F130_0 9.9626 Tf
-(\225) 3.48691 Tj
-[1 0 0 1 82.4608 516.762] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 1.9925 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -86.944 -516.762] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-86.944 516.762 Td
-/F130_0 9.9626 Tf
-(This) 17.7135 Tj
--229 TJm
-(isn') 14.9439 Tj
-18 TJm
-(t) 2.7696 Tj
--230 TJm
-(really) 22.6848 Tj
--229 TJm
-(a) 4.42339 Tj
--229 TJm
-(b) 4.9813 Tj
-20 TJm
-(ug,) 12.4533 Tj
--234 TJm
-(b) 4.9813 Tj
-20 TJm
-(ut) 7.7509 Tj
--229 TJm
-(...) 7.47195 Tj
--303 TJm
-(If) 6.63509 Tj
-[1 0 0 1 212.232 516.762] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -212.232 -516.762] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-212.232 516.762 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 242.12 516.762] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -242.12 -516.762] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-244.405 516.762 Td
-/F130_0 9.9626 Tf
-(tells) 16.6077 Tj
--229 TJm
-(you) 14.9439 Tj
--230 TJm
-(your) 18.2614 Tj
--229 TJm
-(\002le) 12.7322 Tj
--229 TJm
-(is) 6.64505 Tj
--230 TJm
-(corrupted) 38.1767 Tj
--229 TJm
-(on) 9.9626 Tj
--230 TJm
-(decompression,) 62.2563 Tj
--233 TJm
-(and) 14.386 Tj
--229 TJm
-(you) 14.9439 Tj
--230 TJm
-(obtained) 34.3112 Tj
--229 TJm
-(the) 12.1743 Tj
--229 TJm
-(\002le) 12.7322 Tj
-86.944 504.807 Td
-(via) 12.1743 Tj
--262 TJm
-(FTP) 17.1656 Tj
-111 TJm
-(,) 2.49065 Tj
--263 TJm
-(there) 19.9152 Tj
--262 TJm
-(is) 6.64505 Tj
--262 TJm
-(a) 4.42339 Tj
--262 TJm
-(possibility) 41.5241 Tj
--263 TJm
-(that) 14.9439 Tj
--262 TJm
-(you) 14.9439 Tj
--262 TJm
-(for) 11.6164 Tj
-18 TJm
-(got) 12.7322 Tj
--263 TJm
-(to) 7.7509 Tj
--262 TJm
-(tell) 12.7322 Tj
--262 TJm
-(FTP) 17.1656 Tj
--263 TJm
-(to) 7.7509 Tj
--262 TJm
-(do) 9.9626 Tj
--262 TJm
-(a) 4.42339 Tj
--262 TJm
-(binary) 25.4544 Tj
--263 TJm
-(mode) 22.1369 Tj
--262 TJm
-(transfer) 30.4258 Tj
-55 TJm
-(.) 2.49065 Tj
--694 TJm
-(That) 18.2614 Tj
--262 TJm
-(absolutely) 40.9562 Tj
--262 TJm
-(will) 15.5018 Tj
--263 TJm
-(cause) 22.1269 Tj
-86.944 492.852 Td
-(the) 12.1743 Tj
--250 TJm
-(\002le) 12.7322 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(be) 9.40469 Tj
--250 TJm
-(non-decompressible.) 82.7294 Tj
--620 TJm
-(Y) 7.193 Tj
-110 TJm
-(ou') 13.2801 Tj
-10 TJm
-(ll) 5.53921 Tj
--250 TJm
-(ha) 9.40469 Tj
-20 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(transfer) 30.4258 Tj
--250 TJm
-(it) 5.53921 Tj
--250 TJm
-(ag) 9.40469 Tj
-5 TJm
-(ain.) 14.6649 Tj
-[1 0 0 1 351.34 492.852] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -279.34 -12.1195] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -480.732] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 470.934 Td
-/F130_0 9.9626 Tf
-(If) 6.63509 Tj
--235 TJm
-(you') 18.2614 Tj
-50 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--236 TJm
-(incor) 20.4731 Tj
-1 TJm
-(p) 4.9813 Tj
--1 TJm
-(or) 8.29885 Tj
-1 TJm
-(ated) 16.5977 Tj
-[1 0 0 1 163.036 470.934] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -163.036 -470.934] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-163.036 470.934 Td
-/F134_0 9.9626 Tf
-(libbzip2) 47.8205 Tj
-[1 0 0 1 210.856 470.934] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -210.856 -470.934] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-213.2 470.934 Td
-/F130_0 9.9626 Tf
-(into) 15.5018 Tj
--235 TJm
-(your) 18.2614 Tj
--235 TJm
-(o) 4.9813 Tj
-25 TJm
-(wn) 12.1743 Tj
--236 TJm
-(program) 33.7533 Tj
--235 TJm
-(and) 14.386 Tj
--235 TJm
-(are) 12.1643 Tj
--236 TJm
-(get) 12.1743 Tj
-1 TJm
-(ting) 15.5018 Tj
--236 TJm
-(problems,) 39.5714 Tj
--238 TJm
-(please,) 27.3872 Tj
--238 TJm
-(please,) 27.3872 Tj
--238 TJm
-(please,) 27.3872 Tj
--238 TJm
-(check) 23.2328 Tj
--236 TJm
-(that) 14.9439 Tj
-72 458.979 Td
-(the) 12.1743 Tj
--242 TJm
-(parameters) 43.7059 Tj
--243 TJm
-(you) 14.9439 Tj
--242 TJm
-(are) 12.1643 Tj
--242 TJm
-(passing) 29.8878 Tj
--243 TJm
-(in) 7.7509 Tj
--242 TJm
-(calls) 18.2614 Tj
--242 TJm
-(to) 7.7509 Tj
--243 TJm
-(the) 12.1743 Tj
--242 TJm
-(library) 26.5603 Tj
-65 TJm
-(,) 2.49065 Tj
--244 TJm
-(are) 12.1643 Tj
--242 TJm
-(correct,) 30.1468 Tj
--244 TJm
-(and) 14.386 Tj
--243 TJm
-(in) 7.7509 Tj
--242 TJm
-(accordance) 44.8018 Tj
--242 TJm
-(with) 17.7135 Tj
--243 TJm
-(what) 19.3673 Tj
--242 TJm
-(the) 12.1743 Tj
--242 TJm
-(documentation) 59.2177 Tj
--243 TJm
-(says) 17.1556 Tj
-72 447.024 Td
-(is) 6.64505 Tj
--250 TJm
-(allo) 14.9439 Tj
-25 TJm
-(w) 7.193 Tj
-10 TJm
-(able.) 19.0883 Tj
--310 TJm
-(I) 3.31755 Tj
--250 TJm
-(ha) 9.40469 Tj
-20 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--250 TJm
-(tried) 18.2614 Tj
--250 TJm
-(to) 7.7509 Tj
--250 TJm
-(mak) 17.1556 Tj
-10 TJm
-(e) 4.42339 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(library) 26.5603 Tj
--250 TJm
-(rob) 13.2801 Tj
-20 TJm
-(ust) 11.6264 Tj
--250 TJm
-(ag) 9.40469 Tj
-5 TJm
-(ainst) 18.8194 Tj
--250 TJm
-(such) 18.2614 Tj
--250 TJm
-(problems,) 39.5714 Tj
--250 TJm
-(b) 4.9813 Tj
-20 TJm
-(ut) 7.7509 Tj
--250 TJm
-(I'm) 14.386 Tj
--250 TJm
-(sure) 16.5977 Tj
--250 TJm
-(I) 3.31755 Tj
--250 TJm
-(ha) 9.40469 Tj
-20 TJm
-(v) 4.9813 Tj
-15 TJm
-(en') 12.7222 Tj
-18 TJm
-(t) 2.7696 Tj
--250 TJm
-(succeeded.) 43.427 Tj
-[1 0 0 1 72 444.867] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -434.904] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 425.106 Td
-/F130_0 9.9626 Tf
-(Finally) 28.234 Tj
-65 TJm
-(,) 2.49065 Tj
--324 TJm
-(if) 6.08715 Tj
--310 TJm
-(the) 12.1743 Tj
--309 TJm
-(abo) 14.386 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--309 TJm
-(comments) 40.9562 Tj
--310 TJm
-(don') 18.2614 Tj
-18 TJm
-(t) 2.7696 Tj
--309 TJm
-(help,) 19.6462 Tj
--324 TJm
-(you') 18.2614 Tj
-10 TJm
-(ll) 5.53921 Tj
--310 TJm
-(ha) 9.40469 Tj
-20 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--309 TJm
-(to) 7.7509 Tj
--309 TJm
-(send) 18.2614 Tj
--310 TJm
-(me) 12.1743 Tj
--309 TJm
-(a) 4.42339 Tj
--309 TJm
-(b) 4.9813 Tj
-20 TJm
-(ug) 9.9626 Tj
--310 TJm
-(report.) 26.2813 Tj
--976 TJm
-(No) 12.1743 Tj
-25 TJm
-(w) 7.193 Tj
-65 TJm
-(,) 2.49065 Tj
--324 TJm
-(it') 8.85675 Tj
-55 TJm
-(s) 3.87545 Tj
--310 TJm
-(just) 14.396 Tj
--309 TJm
-(amazing) 33.7533 Tj
--309 TJm
-(ho) 9.9626 Tj
-25 TJm
-(w) 7.193 Tj
--310 TJm
-(man) 17.1556 Tj
-15 TJm
-(y) 4.9813 Tj
-72 413.151 Td
-(people) 26.5603 Tj
--250 TJm
-(will) 15.5018 Tj
--250 TJm
-(send) 18.2614 Tj
--250 TJm
-(me) 12.1743 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(b) 4.9813 Tj
-20 TJm
-(ug) 9.9626 Tj
--250 TJm
-(report) 23.7907 Tj
--250 TJm
-(saying) 26.0123 Tj
--250 TJm
-(something) 41.5142 Tj
--250 TJm
-(lik) 10.5205 Tj
-10 TJm
-(e:) 7.193 Tj
-[1 0 0 1 72 410.994] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -24.9066] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 23.9103 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 20.3237] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3685] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -401.629] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 401.629 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
--426 TJm
-(crashed) 41.8429 Tj
--426 TJm
-(with) 23.9102 Tj
--426 TJm
-(segmentation) 71.7307 Tj
--426 TJm
-(fault) 29.8878 Tj
--426 TJm
-(on) 11.9551 Tj
--426 TJm
-(my) 11.9551 Tj
--426 TJm
-(machine) 41.8429 Tj
-[1 0 0 1 72 386.087] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -376.125] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 364.169 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
--241 TJm
-(absolutely) 40.9562 Tj
--241 TJm
-(nothing) 30.4457 Tj
--241 TJm
-(el) 7.193 Tj
-1 TJm
-(se.) 10.7895 Tj
--614 TJm
-(Needless) 35.965 Tj
--241 TJm
-(to) 7.7509 Tj
--241 TJm
-(say) 13.2801 Tj
-65 TJm
-(,) 2.49065 Tj
--243 TJm
-(a) 4.42339 Tj
--241 TJm
-(such) 18.2614 Tj
--240 TJm
-(a) 4.42339 Tj
--241 TJm
-(report) 23.7907 Tj
--241 TJm
-(is) 6.64505 Tj
-[1 0 0 1 324.681 364.169] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -324.681 -364.169] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-324.681 364.169 Td
-/F637_0 9.9626 Tf
-(totally) 25.4644 Tj
-55 TJm
-(,) 2.49065 Tj
--243 TJm
-(utterly) 26.0123 Tj
-55 TJm
-(,) 2.49065 Tj
--242 TJm
-(completely) 43.158 Tj
--241 TJm
-(and) 14.9439 Tj
--241 TJm
-(compr) 25.4544 Tj
-37 TJm
-(ehensively) 41.4942 Tj
--241 TJm
-(100%) 23.2427 Tj
-72 352.214 Td
-(useless;) 31.5416 Tj
--257 TJm
-(a) 4.9813 Tj
--255 TJm
-(waste) 22.6948 Tj
--255 TJm
-(of) 7.7509 Tj
--255 TJm
-(your) 18.2614 Tj
--255 TJm
-(time) 17.1556 Tj
-10 TJm
-(,) 2.49065 Tj
--256 TJm
-(my) 11.6164 Tj
--255 TJm
-(time) 17.1556 Tj
-10 TJm
-(,) 2.49065 Tj
--256 TJm
-(and) 14.9439 Tj
--255 TJm
-(net) 12.1743 Tj
--255 TJm
-(bandwidth) 42.0721 Tj
-[1 0 0 1 302.574 352.214] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -302.574 -352.214] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-302.574 352.214 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
--650 TJm
-(W) 9.40469 Tj
-40 TJm
-(ith) 10.5205 Tj
--254 TJm
-(no) 9.9626 Tj
--255 TJm
-(details) 26.0123 Tj
--255 TJm
-(at) 7.193 Tj
--255 TJm
-(all,) 12.4533 Tj
--256 TJm
-(there') 23.2328 Tj
-55 TJm
-(s) 3.87545 Tj
--255 TJm
-(no) 9.9626 Tj
--255 TJm
-(w) 7.193 Tj
-10 TJm
-(ay) 9.40469 Tj
--255 TJm
-(I) 3.31755 Tj
--255 TJm
-(can) 13.8281 Tj
--255 TJm
-(possibly) 33.2153 Tj
--255 TJm
-(be) 9.40469 Tj
-15 TJm
-(gin) 12.7322 Tj
-72 340.259 Td
-(to) 7.7509 Tj
--250 TJm
-(\002gure) 23.2427 Tj
--250 TJm
-(out) 12.7322 Tj
--250 TJm
-(what) 19.3673 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(problem) 33.2053 Tj
--250 TJm
-(is.) 9.1357 Tj
-[1 0 0 1 72 338.102] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -328.14] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 318.341 Td
-/F130_0 9.9626 Tf
-(The) 15.4918 Tj
--309 TJm
-(rules) 19.3673 Tj
--309 TJm
-(of) 8.29885 Tj
--309 TJm
-(the) 12.1743 Tj
--310 TJm
-(g) 4.9813 Tj
-5 TJm
-(ame) 16.5977 Tj
--309 TJm
-(are:) 14.9339 Tj
--428 TJm
-(f) 3.31755 Tj
-10 TJm
-(acts,) 17.9825 Tj
--324 TJm
-(f) 3.31755 Tj
-10 TJm
-(acts,) 17.9825 Tj
--324 TJm
-(f) 3.31755 Tj
-10 TJm
-(acts.) 17.9825 Tj
--975 TJm
-(Don') 20.4731 Tj
-18 TJm
-(t) 2.7696 Tj
--309 TJm
-(omit) 18.2714 Tj
--309 TJm
-(them) 19.9252 Tj
--309 TJm
-(because) 31.5316 Tj
--309 TJm
-("oh,) 16.518 Tj
--324 TJm
-(the) 12.1743 Tj
-15 TJm
-(y) 4.9813 Tj
--309 TJm
-(w) 7.193 Tj
-10 TJm
-(on') 13.2801 Tj
-18 TJm
-(t) 2.7696 Tj
--309 TJm
-(be) 9.40469 Tj
--310 TJm
-(rele) 14.9339 Tj
-25 TJm
-(v) 4.9813 Tj
-25 TJm
-(ant".) 18.7297 Tj
--974 TJm
-(At) 9.9626 Tj
--310 TJm
-(the) 12.1743 Tj
--309 TJm
-(bare) 17.1456 Tj
-72 306.386 Td
-(minimum:) 41.5241 Tj
-[1 0 0 1 72 306.287] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -60.7721] cm
-/DeviceRGB {} cs
-[0.94899 0.94899 0.976456] sc
-/DeviceRGB {} CS
-[0.94899 0.94899 0.976456] SC
-0 0 468 59.7758 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 56.1892] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -296.922] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 296.922 Td
-/F134_0 9.9626 Tf
-(Machine) 41.8429 Tj
--426 TJm
-(type.) 29.8878 Tj
--852 TJm
-(Operating) 53.798 Tj
--426 TJm
-(system) 35.8654 Tj
--426 TJm
-(version.) 47.8205 Tj
-90 284.967 Td
-(Exact) 29.8878 Tj
--426 TJm
-(version) 41.8429 Tj
--426 TJm
-(of) 11.9551 Tj
--426 TJm
-(bzip2) 29.8878 Tj
--426 TJm
-(\(do) 17.9327 Tj
--426 TJm
-(bzip2) 29.8878 Tj
--426 TJm
-(-V\).) 23.9102 Tj
-90 273.011 Td
-(Exact) 29.8878 Tj
--426 TJm
-(version) 41.8429 Tj
--426 TJm
-(of) 11.9551 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(compiler) 47.8205 Tj
--426 TJm
-(used.) 29.8878 Tj
-90 261.056 Td
-(Flags) 29.8878 Tj
--426 TJm
-(passed) 35.8654 Tj
--426 TJm
-(to) 11.9551 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(compiler.) 53.798 Tj
-[1 0 0 1 72 245.514] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -235.552] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 223.597 Td
-/F130_0 9.9626 Tf
-(Ho) 12.1743 Tj
-25 TJm
-(we) 11.6164 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(er) 7.74094 Tj
-40 TJm
-(,) 2.49065 Tj
--254 TJm
-(the) 12.1743 Tj
--252 TJm
-(most) 19.3773 Tj
--253 TJm
-(important) 38.7446 Tj
--253 TJm
-(single) 23.8007 Tj
--253 TJm
-(thing) 20.4831 Tj
--253 TJm
-(t) 2.7696 Tj
-1 TJm
-(hat) 12.1743 Tj
--253 TJm
-(will) 15.5018 Tj
--253 TJm
-(help) 17.1556 Tj
--253 TJm
-(me) 12.1743 Tj
--253 TJm
-(is) 6.64505 Tj
--252 TJm
-(the) 12.1743 Tj
--253 TJm
-(\002le) 12.7322 Tj
--253 TJm
-(that) 14.9439 Tj
--253 TJm
-(you) 14.9439 Tj
--253 TJm
-(were) 19.3573 Tj
--253 TJm
-(trying) 23.8007 Tj
--252 TJm
-(to) 7.7509 Tj
--253 TJm
-(compress) 37.6287 Tj
--253 TJm
-(or) 8.29885 Tj
--253 TJm
-(decompress) 47.0334 Tj
-72 211.641 Td
-(at) 7.193 Tj
--304 TJm
-(the) 12.1743 Tj
--305 TJm
-(time) 17.7135 Tj
--304 TJm
-(the) 12.1743 Tj
--304 TJm
-(problem) 33.2053 Tj
--305 TJm
-(happened.) 40.6673 Tj
--946 TJm
-(W) 9.40469 Tj
-40 TJm
-(ithout) 23.2527 Tj
--304 TJm
-(that,) 17.4346 Tj
--318 TJm
-(my) 12.7322 Tj
--305 TJm
-(ability) 25.4644 Tj
--304 TJm
-(to) 7.7509 Tj
--304 TJm
-(do) 9.9626 Tj
--305 TJm
-(an) 9.40469 Tj
-15 TJm
-(ything) 25.4644 Tj
--304 TJm
-(more) 20.4731 Tj
--304 TJm
-(than) 17.1556 Tj
--305 TJm
-(speculate) 37.0708 Tj
--304 TJm
-(about) 22.1369 Tj
--304 TJm
-(the) 12.1743 Tj
--305 TJm
-(cause,) 24.6176 Tj
--318 TJm
-(is) 6.64505 Tj
-72 199.686 Td
-(limited.) 30.7247 Tj
-[1 0 0 1 72 199.587] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -189.624] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 164.933 Td
-/F122_0 20.6585 Tf
-(4.4.) 34.4584 Tj
--278 TJm
-(Did) 33.2808 Tj
--278 TJm
-(y) 11.4861 Tj
-25 TJm
-(ou) 25.2447 Tj
--278 TJm
-(g) 12.6223 Tj
--10 TJm
-(et) 18.3654 Tj
--278 TJm
-(the) 30.9877 Tj
--278 TJm
-(right) 45.9032 Tj
--278 TJm
-(pac) 35.5946 Tj
-20 TJm
-(ka) 22.9723 Tj
-10 TJm
-(g) 12.6223 Tj
--10 TJm
-(e?) 24.1085 Tj
-[1 0 0 1 72 160.337] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -150.374] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 143.016 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 101.888 143.016] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -101.888 -143.016] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-104.603 143.016 Td
-/F130_0 9.9626 Tf
-(is) 6.64505 Tj
--272 TJm
-(a) 4.42339 Tj
--273 TJm
-(resource) 33.7433 Tj
--272 TJm
-(hog.) 17.4346 Tj
--378 TJm
-(It) 6.08715 Tj
--272 TJm
-(soaks) 22.1369 Tj
--273 TJm
-(up) 9.9626 Tj
--272 TJm
-(lar) 10.5105 Tj
-18 TJm
-(ge) 9.40469 Tj
--273 TJm
-(amounts) 33.7633 Tj
--272 TJm
-(of) 8.29885 Tj
--273 TJm
-(CPU) 19.3773 Tj
--272 TJm
-(c) 4.42339 Tj
-15 TJm
-(ycles) 20.4731 Tj
--273 TJm
-(and) 14.386 Tj
--272 TJm
-(memory) 33.2053 Tj
-65 TJm
-(.) 2.49065 Tj
--755 TJm
-(Also,) 21.31 Tj
--278 TJm
-(it) 5.53921 Tj
--273 TJm
-(gi) 7.7509 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(es) 8.29885 Tj
--272 TJm
-(v) 4.9813 Tj
-15 TJm
-(ery) 12.7222 Tj
--273 TJm
-(lar) 10.5105 Tj
-18 TJm
-(ge) 9.40469 Tj
--272 TJm
-(latencies.) 37.3498 Tj
-72 131.06 Td
-(In) 8.29885 Tj
--251 TJm
-(the) 12.1743 Tj
--251 TJm
-(w) 7.193 Tj
-10 TJm
-(orst) 14.9439 Tj
--251 TJm
-(case,) 19.6363 Tj
--251 TJm
-(you) 14.9439 Tj
--251 TJm
-(can) 13.8281 Tj
--251 TJm
-(feed) 17.1456 Tj
--251 TJm
-(man) 17.1556 Tj
-15 TJm
-(y) 4.9813 Tj
--251 TJm
-(me) 12.1743 Tj
-15 TJm
-(g) 4.9813 Tj
-4 TJm
-(abyt) 17.1556 Tj
-1 TJm
-(es) 8.29885 Tj
--252 TJm
-(of) 8.29885 Tj
--251 TJm
-(uncompressed) 56.996 Tj
--251 TJm
-(data) 16.5977 Tj
--251 TJm
-(into) 15.5018 Tj
--251 TJm
-(the) 12.1743 Tj
--251 TJm
-(library) 26.5603 Tj
--251 TJm
-(before) 25.4445 Tj
--251 TJm
-(getting) 27.6761 Tj
--251 TJm
-(an) 9.40469 Tj
-15 TJm
-(y) 4.9813 Tj
--251 TJm
-(compressed) 47.0334 Tj
-72 119.105 Td
-(output,) 27.9551 Tj
--250 TJm
-(so) 8.85675 Tj
--250 TJm
-(this) 14.396 Tj
--250 TJm
-(probably) 35.417 Tj
--250 TJm
-(rules) 19.3673 Tj
--250 TJm
-(out) 12.7322 Tj
--250 TJm
-(applications) 48.1492 Tj
--250 TJm
-(requiring) 36.5229 Tj
--250 TJm
-(interacti) 32.6474 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(e) 4.42339 Tj
--250 TJm
-(beha) 18.8094 Tj
-20 TJm
-(viour) 21.031 Tj
-55 TJm
-(.) 2.49065 Tj
-[1 0 0 1 72 116.949] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -106.986] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 97.1875 Td
-/F130_0 9.9626 Tf
-(These) 23.7907 Tj
--304 TJm
-(aren') 20.4632 Tj
-18 TJm
-(t) 2.7696 Tj
--304 TJm
-(f) 3.31755 Tj
-10 TJm
-(aults) 18.8194 Tj
--304 TJm
-(of) 8.29885 Tj
--304 TJm
-(my) 12.7322 Tj
--304 TJm
-(implementation,) 65.0359 Tj
--317 TJm
-(I) 3.31755 Tj
--304 TJm
-(hope,) 21.8579 Tj
--318 TJm
-(b) 4.9813 Tj
-20 TJm
-(ut) 7.7509 Tj
--304 TJm
-(more) 20.4731 Tj
--304 TJm
-(an) 9.40469 Tj
--304 TJm
-(intrinsic) 32.6574 Tj
--304 TJm
-(property) 33.7533 Tj
--304 TJm
-(of) 8.29885 Tj
--304 TJm
-(the) 12.1743 Tj
--304 TJm
-(Burro) 23.2427 Tj
-25 TJm
-(ws-Wheeler) 48.1293 Tj
--304 TJm
-(transform) 38.7346 Tj
-72 85.2323 Td
-(\(unfortunately\).) 62.8042 Tj
--620 TJm
-(Maybe) 27.6661 Tj
--250 TJm
-(this) 14.396 Tj
--250 TJm
-(isn') 14.9439 Tj
-18 TJm
-(t) 2.7696 Tj
--250 TJm
-(what) 19.3673 Tj
--250 TJm
-(you) 14.9439 Tj
--250 TJm
-(w) 7.193 Tj
-10 TJm
-(ant.) 14.6649 Tj
-[1 0 0 1 72 83.0755] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -22.2611] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 374.394 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.8541] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 40.5726 -6.7545] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -493.841 -50.9514] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-534.414 50.9514 Td
-/F130_0 9.9626 Tf
-(33) 9.9626 Tj
-[1 0 0 1 453.269 50.8518] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 93.5985 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.2765 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-Q
-showpage
-%%PageTrailer
-pdfEndPage
-%%Page: 37 37
-%%BeginPageSetup
-%%PageOrientation: Portrait
-pdfStartPage
-0 0 612 792 re W
-%%EndPageSetup
-[] 0 d
-1 i
-0 j
-0 J
-10 M
-1 w
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-false op
-false OP
-0 0 612 792 re
-W
-q
-[1 0 0 1 72 741.554] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 14.4459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 187.197 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 -6.8541] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.8541] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 116.328 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -382.4 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-498.728 749.245 Td
-/F130_0 9.9626 Tf
-(Miscellanea) 48.1393 Tj
-[1 0 0 1 266.071 749.146] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 280.796 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.974 -7.0936] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -0.4981] cm
-q
-[] 0 d
-0 J
-0.4981 w
-0 0.2491 m
-475.465 0.2491 l
-S
-Q
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 479.251 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -540 -741.554] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 710.037 Td
-/F130_0 9.9626 Tf
-(If) 6.63509 Tj
--275 TJm
-(you) 14.9439 Tj
--274 TJm
-(w) 7.193 Tj
-10 TJm
-(ant) 12.1743 Tj
--275 TJm
-(a) 4.42339 Tj
--274 TJm
-(compressor) 45.9276 Tj
--275 TJm
-(and/or) 25.4544 Tj
--275 TJm
-(library) 26.5603 Tj
--274 TJm
-(which) 24.3486 Tj
--275 TJm
-(is) 6.64505 Tj
--274 TJm
-(f) 3.31755 Tj
-10 TJm
-(aster) 18.8094 Tj
-40 TJm
-(,) 2.49065 Tj
--281 TJm
-(uses) 17.1556 Tj
--275 TJm
-(less) 14.9439 Tj
--274 TJm
-(memory) 33.2053 Tj
--275 TJm
-(b) 4.9813 Tj
-20 TJm
-(ut) 7.7509 Tj
--275 TJm
-(gets) 16.0497 Tj
--274 TJm
-(pretty) 23.2427 Tj
--275 TJm
-(good) 19.9252 Tj
--274 TJm
-(compression,) 52.8516 Tj
--281 TJm
-(and) 14.386 Tj
--275 TJm
-(has) 13.2801 Tj
-72 698.082 Td
-(minimal) 33.2153 Tj
--288 TJm
-(latenc) 23.7907 Tj
-15 TJm
-(y) 4.9813 Tj
-65 TJm
-(,) 2.49065 Tj
--297 TJm
-(consider) 33.7533 Tj
--288 TJm
-(Jean-loup) 38.7346 Tj
--288 TJm
-(Gailly') 28.224 Tj
-55 TJm
-(s) 3.87545 Tj
--288 TJm
-(and) 14.386 Tj
--288 TJm
-(Mark) 21.579 Tj
--288 TJm
-(Adl) 14.9439 Tj
-1 TJm
-(er') 11.0585 Tj
-55 TJm
-(s) 3.87545 Tj
--288 TJm
-(w) 7.193 Tj
-10 TJm
-(ork,) 15.7708 Tj
-[1 0 0 1 353.879 698.082] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -353.879 -698.082] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-353.879 698.082 Td
-/F134_0 9.9626 Tf
-(zlib-1.2.1) 59.7756 Tj
-[1 0 0 1 413.655 698.082] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -413.655 -698.082] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-416.523 698.082 Td
-/F130_0 9.9626 Tf
-(and) 14.386 Tj
-[1 0 0 1 433.777 698.082] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -433.777 -698.082] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-433.777 698.082 Td
-/F134_0 9.9626 Tf
-(gzip-1.2.4) 59.7756 Tj
-[1 0 0 1 493.553 698.082] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -493.553 -698.082] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-493.553 698.082 Td
-/F130_0 9.9626 Tf
-(.) 2.49065 Tj
--847 TJm
-(Look) 21.031 Tj
--288 TJm
-(for) 11.6164 Tj
-72 686.127 Td
-(them) 19.9252 Tj
--250 TJm
-(at) 7.193 Tj
--250 TJm
-(http://www) 45.3896 Tj
-65 TJm
-(.zlib) 17.4346 Tj
-40 TJm
-(.or) 10.7895 Tj
-18 TJm
-(g) 4.9813 Tj
--250 TJm
-(and) 14.386 Tj
--250 TJm
-(http://www) 45.3896 Tj
-65 TJm
-(.gzip.or) 30.4357 Tj
-18 TJm
-(g) 4.9813 Tj
--250 TJm
-(respecti) 30.9837 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(ely) 12.1743 Tj
-65 TJm
-(.) 2.49065 Tj
-[1 0 0 1 72 683.97] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -674.008] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 664.209 Td
-/F130_0 9.9626 Tf
-(F) 5.53921 Tj
-15 TJm
-(or) 8.29885 Tj
--582 TJm
-(something) 41.5142 Tj
--583 TJm
-(f) 3.31755 Tj
-10 TJm
-(aster) 18.8094 Tj
--582 TJm
-(and) 14.386 Tj
--582 TJm
-(lighter) 26.0123 Tj
--583 TJm
-(still,) 17.4445 Tj
--665 TJm
-(you) 14.9439 Tj
--582 TJm
-(might) 23.2527 Tj
--583 TJm
-(try) 11.0684 Tj
--582 TJm
-(Markus) 30.4357 Tj
--582 TJm
-(F) 5.53921 Tj
--582 TJm
-(X) 7.193 Tj
--582 TJm
-(J) 3.87545 Tj
--582 TJm
-(Oberhumer') 48.6872 Tj
-55 TJm
-(s) 3.87545 Tj
-[1 0 0 1 437.433 664.209] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -437.433 -664.209] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-437.433 664.209 Td
-/F134_0 9.9626 Tf
-(LZO) 17.9327 Tj
-[1 0 0 1 455.365 664.209] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -455.365 -664.209] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-461.163 664.209 Td
-/F130_0 9.9626 Tf
-(real-time) 35.965 Tj
--582 TJm
-(compres-) 37.0708 Tj
-72 652.254 Td
-(sion/decompression) 79.1429 Tj
--250 TJm
-(library) 26.5603 Tj
-65 TJm
-(,) 2.49065 Tj
--250 TJm
-(at) 7.193 Tj
--250 TJm
-(http://www) 45.3896 Tj
-65 TJm
-(.oberhumer) 45.6486 Tj
-55 TJm
-(.com/opensource.) 70.2762 Tj
-[1 0 0 1 72 650.097] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -640.135] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 617.501 Td
-/F122_0 20.6585 Tf
-(4.5.) 34.4584 Tj
--278 TJm
-(Fur) 33.2808 Tj
--20 TJm
-(ther) 39.0239 Tj
--278 TJm
-(Reading) 81.4978 Tj
-[1 0 0 1 72 612.905] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9626] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -602.942] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 595.583 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 101.888 595.583] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -101.888 -595.583] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-104.923 595.583 Td
-/F130_0 9.9626 Tf
-(is) 6.64505 Tj
--305 TJm
-(not) 12.7322 Tj
--304 TJm
-(research) 33.1854 Tj
--305 TJm
-(w) 7.193 Tj
-10 TJm
-(ork,) 15.7708 Tj
--318 TJm
-(in) 7.7509 Tj
--305 TJm
-(the) 12.1743 Tj
--304 TJm
-(sense) 21.579 Tj
--305 TJm
-(that) 14.9439 Tj
--304 TJm
-(it) 5.53921 Tj
--305 TJm
-(doesn') 26.5603 Tj
-18 TJm
-(t) 2.7696 Tj
--305 TJm
-(present) 28.772 Tj
--304 TJm
-(an) 9.40469 Tj
-15 TJm
-(y) 4.9813 Tj
--305 TJm
-(ne) 9.40469 Tj
-25 TJm
-(w) 7.193 Tj
--304 TJm
-(ideas.) 22.9638 Tj
--474 TJm
-(Rather) 26.5603 Tj
-40 TJm
-(,) 2.49065 Tj
--318 TJm
-(it') 8.85675 Tj
-55 TJm
-(s) 3.87545 Tj
--305 TJm
-(an) 9.40469 Tj
--305 TJm
-(engineeri) 37.0708 Tj
-1 TJm
-(ng) 9.9626 Tj
--305 TJm
-(e) 4.42339 Tj
-15 TJm
-(x) 4.9813 Tj
-15 TJm
-(ercise) 23.2328 Tj
-72 583.628 Td
-(based) 22.6848 Tj
--250 TJm
-(on) 9.9626 Tj
--250 TJm
-(e) 4.42339 Tj
-15 TJm
-(xisting) 27.1282 Tj
--250 TJm
-(ideas.) 22.9638 Tj
-[1 0 0 1 72 581.471] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -9.9627] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -571.509] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 561.71 Td
-/F130_0 9.9626 Tf
-(F) 5.53921 Tj
-15 TJm
-(our) 13.2801 Tj
--250 TJm
-(documents) 43.1679 Tj
--250 TJm
-(describe) 33.1954 Tj
--250 TJm
-(essentially) 42.0621 Tj
--250 TJm
-(all) 9.9626 Tj
--250 TJm
-(the) 12.1743 Tj
--250 TJm
-(ideas) 20.4731 Tj
--250 TJm
-(behind) 27.1182 Tj
-[1 0 0 1 298.747 561.71] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -298.747 -561.71] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-298.747 561.71 Td
-/F134_0 9.9626 Tf
-(bzip2) 29.8878 Tj
-[1 0 0 1 328.635 561.71] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -328.635 -561.71] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-328.635 561.71 Td
-/F130_0 9.9626 Tf
-(:) 2.7696 Tj
-[1 0 0 1 72 559.554] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -299.875] cm
-/DeviceRGB {} cs
-[0.929398 0.968597 0.956848] sc
-/DeviceRGB {} CS
-[0.929398 0.968597 0.956848] SC
-0 0 468 298.879 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 295.293] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -550.189] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 550.189 Td
-/F134_0 9.9626 Tf
-(Michael) 41.8429 Tj
--426 TJm
-(Burrows) 41.8429 Tj
--426 TJm
-(and) 17.9327 Tj
--426 TJm
-(D.) 11.9551 Tj
--426 TJm
-(J.) 11.9551 Tj
--426 TJm
-(Wheeler:) 47.8205 Tj
-98.4879 538.234 Td
-("A) 11.9551 Tj
--426 TJm
-(block-sorting) 77.7083 Tj
--426 TJm
-(lossless) 47.8205 Tj
--426 TJm
-(data) 23.9102 Tj
--426 TJm
-(compression) 65.7532 Tj
--426 TJm
-(algorithm") 59.7756 Tj
-102.732 526.278 Td
-(10th) 23.9102 Tj
--426 TJm
-(May) 17.9327 Tj
--426 TJm
-(1994.) 29.8878 Tj
-102.732 514.323 Td
-(Digital) 41.8429 Tj
--426 TJm
-(SRC) 17.9327 Tj
--426 TJm
-(Research) 47.8205 Tj
--426 TJm
-(Report) 35.8654 Tj
--426 TJm
-(124.) 23.9102 Tj
-102.732 502.368 Td
-(ftp://ftp.digital.com/pub/DEC/SRC/research-reports/SRC-124.ps.g\
-z) 382.564 Tj
-102.732 490.413 Td
-(If) 11.9551 Tj
--426 TJm
-(you) 17.9327 Tj
--426 TJm
-(have) 23.9102 Tj
--426 TJm
-(trouble) 41.8429 Tj
--426 TJm
-(finding) 41.8429 Tj
--426 TJm
-(it,) 17.9327 Tj
--426 TJm
-(try) 17.9327 Tj
--426 TJm
-(searching) 53.798 Tj
--426 TJm
-(at) 11.9551 Tj
--426 TJm
-(the) 17.9327 Tj
-102.732 478.458 Td
-(New) 17.9327 Tj
--426 TJm
-(Zealand) 41.8429 Tj
--426 TJm
-(Digital) 41.8429 Tj
--426 TJm
-(Library,) 47.8205 Tj
--426 TJm
-(http://www.nzdl.org.) 119.551 Tj
-90 454.547 Td
-(Daniel) 35.8654 Tj
--426 TJm
-(S.) 11.9551 Tj
--426 TJm
-(Hirschberg) 59.7756 Tj
--426 TJm
-(and) 17.9327 Tj
--426 TJm
-(Debra) 29.8878 Tj
--426 TJm
-(A.) 11.9551 Tj
--426 TJm
-(LeLewer) 41.8429 Tj
-98.4879 442.592 Td
-("Efficient) 59.7756 Tj
--426 TJm
-(Decoding) 47.8205 Tj
--426 TJm
-(of) 11.9551 Tj
--426 TJm
-(Prefix) 35.8654 Tj
--426 TJm
-(Codes") 35.8654 Tj
-102.732 430.637 Td
-(Communications) 83.6858 Tj
--426 TJm
-(of) 11.9551 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(ACM,) 23.9102 Tj
--426 TJm
-(April) 29.8878 Tj
--426 TJm
-(1990,) 29.8878 Tj
--426 TJm
-(Vol) 17.9327 Tj
--426 TJm
-(33,) 17.9327 Tj
--426 TJm
-(Number) 35.8654 Tj
--426 TJm
-(4.) 11.9551 Tj
-102.732 418.682 Td
-(You) 17.9327 Tj
--426 TJm
-(might) 29.8878 Tj
--426 TJm
-(be) 11.9551 Tj
--426 TJm
-(able) 23.9102 Tj
--426 TJm
-(to) 11.9551 Tj
--426 TJm
-(get) 17.9327 Tj
--426 TJm
-(an) 11.9551 Tj
--426 TJm
-(electronic) 59.7756 Tj
--426 TJm
-(copy) 23.9102 Tj
--426 TJm
-(of) 11.9551 Tj
--426 TJm
-(this) 23.9102 Tj
-102.732 406.727 Td
-(from) 23.9102 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(ACM) 17.9327 Tj
--426 TJm
-(Digital) 41.8429 Tj
--426 TJm
-(Library.) 47.8205 Tj
-90 382.816 Td
-(David) 29.8878 Tj
--426 TJm
-(J.) 11.9551 Tj
--426 TJm
-(Wheeler) 41.8429 Tj
-102.732 370.861 Td
-(Program) 41.8429 Tj
--426 TJm
-(bred3.c) 41.8429 Tj
--426 TJm
-(and) 17.9327 Tj
--426 TJm
-(accompanying) 71.7307 Tj
--426 TJm
-(document) 47.8205 Tj
--426 TJm
-(bred3.ps.) 53.798 Tj
-102.732 358.906 Td
-(This) 23.9102 Tj
--426 TJm
-(contains) 47.8205 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(idea) 23.9102 Tj
--426 TJm
-(behind) 35.8654 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(multi-table) 65.7532 Tj
--426 TJm
-(Huffman) 41.8429 Tj
--426 TJm
-(coding) 35.8654 Tj
--426 TJm
-(scheme.) 41.8429 Tj
-102.732 346.951 Td
-(ftp://ftp.cl.cam.ac.uk/users/djw3/) 203.237 Tj
-90 323.041 Td
-(Jon) 17.9327 Tj
--426 TJm
-(L.) 11.9551 Tj
--426 TJm
-(Bentley) 41.8429 Tj
--426 TJm
-(and) 17.9327 Tj
--426 TJm
-(Robert) 35.8654 Tj
--426 TJm
-(Sedgewick) 53.798 Tj
-98.4879 311.085 Td
-("Fast) 29.8878 Tj
--426 TJm
-(Algorithms) 59.7756 Tj
--426 TJm
-(for) 17.9327 Tj
--426 TJm
-(Sorting) 41.8429 Tj
--426 TJm
-(and) 17.9327 Tj
--426 TJm
-(Searching) 53.798 Tj
--426 TJm
-(Strings") 47.8205 Tj
-102.732 299.13 Td
-(Available) 53.798 Tj
--426 TJm
-(from) 23.9102 Tj
--426 TJm
-(Sedgewick's) 65.7532 Tj
--426 TJm
-(web) 17.9327 Tj
--426 TJm
-(page,) 29.8878 Tj
-102.732 287.175 Td
-(www.cs.princeton.edu/~rs) 143.461 Tj
-[1 0 0 1 72 259.678] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -249.715] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 237.76 Td
-/F130_0 9.9626 Tf
-(The) 15.4918 Tj
--239 TJm
-(follo) 18.8194 Tj
-25 TJm
-(wing) 19.9252 Tj
--238 TJm
-(paper) 22.1269 Tj
--239 TJm
-(gi) 7.7509 Tj
-25 TJm
-(v) 4.9813 Tj
-15 TJm
-(es) 8.29885 Tj
--239 TJm
-(v) 4.9813 Tj
-25 TJm
-(aluable) 28.772 Tj
--238 TJm
-(additional) 39.8504 Tj
--239 TJm
-(insights) 31.0036 Tj
--238 TJm
-(into) 15.5018 Tj
--239 TJm
-(the) 12.1743 Tj
--239 TJm
-(algorithm,) 41.2352 Tj
--241 TJm
-(b) 4.9813 Tj
-20 TJm
-(ut) 7.7509 Tj
--238 TJm
-(is) 6.64505 Tj
--239 TJm
-(not) 12.7322 Tj
--239 TJm
-(immedi) 30.4457 Tj
-1 TJm
-(ately) 19.3673 Tj
--239 TJm
-(the) 12.1743 Tj
--239 TJm
-(basis) 19.9252 Tj
--238 TJm
-(of) 8.29885 Tj
--239 TJm
-(an) 9.40469 Tj
-15 TJm
-(y) 4.9813 Tj
--239 TJm
-(code) 18.8094 Tj
-72 225.805 Td
-(used) 18.2614 Tj
--250 TJm
-(in) 7.7509 Tj
--250 TJm
-(bzip2.) 24.6275 Tj
-[1 0 0 1 72 223.648] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -72.7273] cm
-/DeviceRGB {} cs
-[0.929398 0.968597 0.956848] sc
-/DeviceRGB {} CS
-[0.929398 0.968597 0.956848] SC
-0 0 468 71.731 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 68.1444] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -214.283] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 214.283 Td
-/F134_0 9.9626 Tf
-(Peter) 29.8878 Tj
--426 TJm
-(Fenwick:) 47.8205 Tj
-102.732 202.328 Td
-(Block) 29.8878 Tj
--426 TJm
-(Sorting) 41.8429 Tj
--426 TJm
-(Text) 23.9102 Tj
--426 TJm
-(Compression) 65.7532 Tj
-102.732 190.373 Td
-(Proceedings) 65.7532 Tj
--426 TJm
-(of) 11.9551 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(19th) 23.9102 Tj
--426 TJm
-(Australasian) 71.7307 Tj
--426 TJm
-(Computer) 47.8205 Tj
--426 TJm
-(Science) 41.8429 Tj
--426 TJm
-(Conference,) 65.7532 Tj
-111.22 178.418 Td
-(Melbourne,) 59.7756 Tj
--426 TJm
-(Australia.) 59.7756 Tj
--852 TJm
-(Jan) 17.9327 Tj
--426 TJm
-(31) 11.9551 Tj
--426 TJm
-(-) 5.97756 Tj
--426 TJm
-(Feb) 17.9327 Tj
--426 TJm
-(2,) 11.9551 Tj
--426 TJm
-(1996.) 29.8878 Tj
-102.732 166.463 Td
-(ftp://ftp.cs.auckland.ac.nz/pub/peter-f/ACSC96paper.ps) 322.788 Tj
-[1 0 0 1 72 150.921] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -140.958] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 129.003 Td
-/F130_0 9.9626 Tf
-(K) 7.193 Tj
-15 TJm
-(unihik) 25.4644 Tj
-10 TJm
-(o) 4.9813 Tj
--250 TJm
-(Sadakane') 41.4942 Tj
-55 TJm
-(s) 3.87545 Tj
--250 TJm
-(sorting) 27.6761 Tj
--250 TJm
-(algorithm,) 41.2352 Tj
--250 TJm
-(mentioned) 42.0621 Tj
--250 TJm
-(abo) 14.386 Tj
-15 TJm
-(v) 4.9813 Tj
-15 TJm
-(e,) 6.91404 Tj
--250 TJm
-(is) 6.64505 Tj
--250 TJm
-(a) 4.42339 Tj
-20 TJm
-(v) 4.9813 Tj
-25 TJm
-(ailable) 26.5603 Tj
--250 TJm
-(from:) 22.1369 Tj
-[1 0 0 1 72 126.846] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -36.8618] cm
-/DeviceRGB {} cs
-[0.929398 0.968597 0.956848] sc
-/DeviceRGB {} CS
-[0.929398 0.968597 0.956848] SC
-0 0 468 35.8655 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 32.2789] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -117.482] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 117.482 Td
-/F134_0 9.9626 Tf
-(http://naomi.is.s.u-tokyo.ac.jp/~sada/papers/Sada98b.ps.gz) 346.698 Tj
-[1 0 0 1 72 89.9846] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -29.1702] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 374.394 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.8542] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 40.5726 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -493.841 -50.9514] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-534.414 50.9514 Td
-/F130_0 9.9626 Tf
-(34) 9.9626 Tj
-[1 0 0 1 453.269 50.8518] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 93.5985 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.2765 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-Q
-showpage
-%%PageTrailer
-pdfEndPage
-%%Page: 38 38
-%%BeginPageSetup
-%%PageOrientation: Portrait
-pdfStartPage
-0 0 612 792 re W
-%%EndPageSetup
-[] 0 d
-1 i
-0 j
-0 J
-10 M
-1 w
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-false op
-false OP
-0 0 612 792 re
-W
-q
-[1 0 0 1 72 741.554] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 14.4459] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 187.197 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 -6.8541] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.8541] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 116.328 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -382.4 -749.245] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-498.728 749.245 Td
-/F130_0 9.9626 Tf
-(Miscellanea) 48.1393 Tj
-[1 0 0 1 266.071 749.146] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 280.796 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -472.974 -7.0936] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -0.4981] cm
-q
-[] 0 d
-0 J
-0.4981 w
-0 0.2491 m
-475.465 0.2491 l
-S
-Q
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 479.251 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -540 -741.554] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 710.037 Td
-/F130_0 9.9626 Tf
-(The) 15.4918 Tj
--250 TJm
-(Manber) 30.9837 Tj
-20 TJm
-(-Myers) 28.772 Tj
--250 TJm
-(suf) 12.1743 Tj
-25 TJm
-(\002x) 10.5205 Tj
--250 TJm
-(array) 20.4632 Tj
--250 TJm
-(construction) 49.2551 Tj
--250 TJm
-(algorithm) 38.7446 Tj
--250 TJm
-(is) 6.64505 Tj
--250 TJm
-(described) 38.1767 Tj
--250 TJm
-(in) 7.7509 Tj
--250 TJm
-(a) 4.42339 Tj
--250 TJm
-(paper) 22.1269 Tj
--250 TJm
-(a) 4.42339 Tj
-20 TJm
-(v) 4.9813 Tj
-25 TJm
-(ailable) 26.5603 Tj
--250 TJm
-(from:) 22.1369 Tj
-[1 0 0 1 72 707.88] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -36.8618] cm
-/DeviceRGB {} cs
-[0.929398 0.968597 0.956848] sc
-/DeviceRGB {} CS
-[0.929398 0.968597 0.956848] SC
-0 0 468 35.8655 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 32.2789] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3685] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -698.516] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 698.516 Td
-/F134_0 9.9626 Tf
-(http://www.cs.arizona.edu/people/gene/PAPERS/suffix.ps) 322.788 Tj
-[1 0 0 1 72 671.019] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -13.5492] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -72 -661.056] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-72 649.101 Td
-/F130_0 9.9626 Tf
-(Finally) 28.234 Tj
-65 TJm
-(,) 2.49065 Tj
--227 TJm
-(the) 12.1743 Tj
--221 TJm
-(follo) 18.8194 Tj
-25 TJm
-(wing) 19.9252 Tj
--222 TJm
-(papers) 26.0024 Tj
--221 TJm
-(document) 39.2925 Tj
--221 TJm
-(some) 21.031 Tj
--222 TJm
-(in) 7.7509 Tj
-40 TJm
-(v) 4.9813 Tj
-15 TJm
-(estig) 18.8194 Tj
-5 TJm
-(ations) 23.8007 Tj
--221 TJm
-(I) 3.31755 Tj
--221 TJm
-(made) 21.579 Tj
--222 TJm
-(into) 15.5018 Tj
--221 TJm
-(the) 12.1743 Tj
--221 TJm
-(performance) 50.341 Tj
--222 TJm
-(of) 8.29885 Tj
--221 TJm
-(sorting) 27.6761 Tj
--221 TJm
-(and) 14.386 Tj
--222 TJm
-(decompression) 59.7656 Tj
-72 637.146 Td
-(algorithms:) 45.3896 Tj
-[1 0 0 1 72 634.989] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 -132.503] cm
-/DeviceRGB {} cs
-[0.929398 0.968597 0.956848] sc
-/DeviceRGB {} CS
-[0.929398 0.968597 0.956848] SC
-0 0 468 131.507 re
-f
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 127.92] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 18 -8.3686] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -90 -625.624] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-90 625.624 Td
-/F134_0 9.9626 Tf
-(Julian) 35.8654 Tj
--426 TJm
-(Seward) 35.8654 Tj
-102.732 613.669 Td
-(On) 11.9551 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(Performance) 65.7532 Tj
--426 TJm
-(of) 11.9551 Tj
--426 TJm
-(BWT) 17.9327 Tj
--426 TJm
-(Sorting) 41.8429 Tj
--426 TJm
-(Algorithms) 59.7756 Tj
-102.732 601.714 Td
-(Proceedings) 65.7532 Tj
--426 TJm
-(of) 11.9551 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(IEEE) 23.9102 Tj
--426 TJm
-(Data) 23.9102 Tj
--426 TJm
-(Compression) 65.7532 Tj
--426 TJm
-(Conference) 59.7756 Tj
--426 TJm
-(2000) 23.9102 Tj
-111.22 589.759 Td
-(Snowbird,) 53.798 Tj
--426 TJm
-(Utah.) 29.8878 Tj
--852 TJm
-(28-30) 29.8878 Tj
--426 TJm
-(March) 29.8878 Tj
--426 TJm
-(2000.) 29.8878 Tj
-90 565.848 Td
-(Julian) 35.8654 Tj
--426 TJm
-(Seward) 35.8654 Tj
-102.732 553.893 Td
-(Space-time) 59.7756 Tj
--426 TJm
-(Tradeoffs) 53.798 Tj
--426 TJm
-(in) 11.9551 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(Inverse) 41.8429 Tj
--426 TJm
-(B-W) 17.9327 Tj
--426 TJm
-(Transform) 53.798 Tj
-102.732 541.938 Td
-(Proceedings) 65.7532 Tj
--426 TJm
-(of) 11.9551 Tj
--426 TJm
-(the) 17.9327 Tj
--426 TJm
-(IEEE) 23.9102 Tj
--426 TJm
-(Data) 23.9102 Tj
--426 TJm
-(Compression) 65.7532 Tj
--426 TJm
-(Conference) 59.7756 Tj
--426 TJm
-(2001) 23.9102 Tj
-111.22 529.983 Td
-(Snowbird,) 53.798 Tj
--426 TJm
-(Utah.) 29.8878 Tj
--852 TJm
-(27-29) 29.8878 Tj
--426 TJm
-(March) 29.8878 Tj
--426 TJm
-(2001.) 29.8878 Tj
-[1 0 0 1 72 502.486] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 468 3.5866] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -468 -3.5866] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 0 -451.634] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 1.8929 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 374.394 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 2.4907 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 0 6.8541] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 40.5726 -6.7546] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 -493.841 -50.9513] cm
-[1 0 0 1 0 0] Tm
-0 0 Td
-534.414 50.9513 Td
-/F130_0 9.9626 Tf
-(35) 9.9626 Tj
-[1 0 0 1 453.269 50.8518] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 93.5985 0] cm
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-/DeviceRGB {} cs
-[0 0 0] sc
-/DeviceRGB {} CS
-[0 0 0] SC
-[1 0 0 1 6.2765 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-[1 0 0 1 -13.1436 0] cm
-/DeviceGray {} cs
-[0] sc
-/DeviceGray {} CS
-[0] SC
-Q
-showpage
-%%PageTrailer
-pdfEndPage
-%%Trailer
-end
-%%DocumentSuppliedResources:
-%%+ font DTUUHP+NimbusSanL-Bold
-%%+ font VXAMRV+NimbusRomNo9L-Regu
-%%+ font MFECUR+NimbusMonL-Regu
-%%+ font ZOVMRD+CMMI10
-%%+ font ERVBFT+NimbusMonL-Bold
-%%+ font BZXIEB+CMSY10
-%%+ font WWWUTU+NimbusRomNo9L-ReguItal
-%%EOF
diff --git a/Utilities/cmbzip2/manual.xml b/Utilities/cmbzip2/manual.xml
deleted file mode 100644
index f224136..0000000
--- a/Utilities/cmbzip2/manual.xml
+++ /dev/null
@@ -1,2964 +0,0 @@
-<?xml version="1.0"?> <!-- -*- sgml -*- -->
-<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"[
-
-<!-- various strings, dates etc. common to all docs -->
-<!ENTITY % common-ents SYSTEM "entities.xml"> %common-ents;
-]>
-
-<book lang="en" id="userman" xreflabel="bzip2 Manual">
-
- <bookinfo>
- <title>bzip2 and libbzip2, version 1.0.5</title>
- <subtitle>A program and library for data compression</subtitle>
- <copyright>
- <year>&bz-lifespan;</year>
- <holder>Julian Seward</holder>
- </copyright>
- <releaseinfo>Version &bz-version; of &bz-date;</releaseinfo>
-
- <authorgroup>
- <author>
- <firstname>Julian</firstname>
- <surname>Seward</surname>
- <affiliation>
- <orgname>&bz-url;</orgname>
- </affiliation>
- </author>
- </authorgroup>
-
- <legalnotice>
-
- <para>This program, <computeroutput>bzip2</computeroutput>, the
- associated library <computeroutput>libbzip2</computeroutput>, and
- all documentation, are copyright &copy; &bz-lifespan; Julian Seward.
- All rights reserved.</para>
-
- <para>Redistribution and use in source and binary forms, with
- or without modification, are permitted provided that the
- following conditions are met:</para>
-
- <itemizedlist mark='bullet'>
-
- <listitem><para>Redistributions of source code must retain the
- above copyright notice, this list of conditions and the
- following disclaimer.</para></listitem>
-
- <listitem><para>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.</para></listitem>
-
- <listitem><para>Altered source versions must be plainly marked
- as such, and must not be misrepresented as being the original
- software.</para></listitem>
-
- <listitem><para>The name of the author may not be used to
- endorse or promote products derived from this software without
- specific prior written permission.</para></listitem>
-
- </itemizedlist>
-
- <para>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.</para>
-
- <para>PATENTS: To the best of my knowledge,
- <computeroutput>bzip2</computeroutput> and
- <computeroutput>libbzip2</computeroutput> do not use any patented
- algorithms. However, I do not have the resources to carry
- out a patent search. Therefore I cannot give any guarantee of
- the above statement.
- </para>
-
-</legalnotice>
-
-</bookinfo>
-
-
-
-<chapter id="intro" xreflabel="Introduction">
-<title>Introduction</title>
-
-<para><computeroutput>bzip2</computeroutput> compresses files
-using the Burrows-Wheeler block-sorting text compression
-algorithm, and Huffman coding. Compression is generally
-considerably better than that achieved by more conventional
-LZ77/LZ78-based compressors, and approaches the performance of
-the PPM family of statistical compressors.</para>
-
-<para><computeroutput>bzip2</computeroutput> is built on top of
-<computeroutput>libbzip2</computeroutput>, a flexible library for
-handling compressed data in the
-<computeroutput>bzip2</computeroutput> format. This manual
-describes both how to use the program and how to work with the
-library interface. Most of the manual is devoted to this
-library, not the program, which is good news if your interest is
-only in the program.</para>
-
-<itemizedlist mark='bullet'>
-
- <listitem><para><xref linkend="using"/> describes how to use
- <computeroutput>bzip2</computeroutput>; this is the only part
- you need to read if you just want to know how to operate the
- program.</para></listitem>
-
- <listitem><para><xref linkend="libprog"/> describes the
- programming interfaces in detail, and</para></listitem>
-
- <listitem><para><xref linkend="misc"/> records some
- miscellaneous notes which I thought ought to be recorded
- somewhere.</para></listitem>
-
-</itemizedlist>
-
-</chapter>
-
-
-<chapter id="using" xreflabel="How to use bzip2">
-<title>How to use bzip2</title>
-
-<para>This chapter contains a copy of the
-<computeroutput>bzip2</computeroutput> man page, and nothing
-else.</para>
-
-<sect1 id="name" xreflabel="NAME">
-<title>NAME</title>
-
-<itemizedlist mark='bullet'>
-
- <listitem><para><computeroutput>bzip2</computeroutput>,
- <computeroutput>bunzip2</computeroutput> - a block-sorting file
- compressor, v1.0.4</para></listitem>
-
- <listitem><para><computeroutput>bzcat</computeroutput> -
- decompresses files to stdout</para></listitem>
-
- <listitem><para><computeroutput>bzip2recover</computeroutput> -
- recovers data from damaged bzip2 files</para></listitem>
-
-</itemizedlist>
-
-</sect1>
-
-
-<sect1 id="synopsis" xreflabel="SYNOPSIS">
-<title>SYNOPSIS</title>
-
-<itemizedlist mark='bullet'>
-
- <listitem><para><computeroutput>bzip2</computeroutput> [
- -cdfkqstvzVL123456789 ] [ filenames ... ]</para></listitem>
-
- <listitem><para><computeroutput>bunzip2</computeroutput> [
- -fkvsVL ] [ filenames ... ]</para></listitem>
-
- <listitem><para><computeroutput>bzcat</computeroutput> [ -s ] [
- filenames ... ]</para></listitem>
-
- <listitem><para><computeroutput>bzip2recover</computeroutput>
- filename</para></listitem>
-
-</itemizedlist>
-
-</sect1>
-
-
-<sect1 id="description" xreflabel="DESCRIPTION">
-<title>DESCRIPTION</title>
-
-<para><computeroutput>bzip2</computeroutput> compresses files
-using the Burrows-Wheeler block sorting text compression
-algorithm, and Huffman coding. Compression is generally
-considerably better than that achieved by more conventional
-LZ77/LZ78-based compressors, and approaches the performance of
-the PPM family of statistical compressors.</para>
-
-<para>The command-line options are deliberately very similar to
-those of GNU <computeroutput>gzip</computeroutput>, but they are
-not identical.</para>
-
-<para><computeroutput>bzip2</computeroutput> expects a list of
-file names to accompany the command-line flags. Each file is
-replaced by a compressed version of itself, with the name
-<computeroutput>original_name.bz2</computeroutput>. Each
-compressed file has the same modification date, permissions, and,
-when possible, ownership as the corresponding original, so that
-these properties can be correctly restored at decompression time.
-File name handling is naive in the sense that there is no
-mechanism for preserving original file names, permissions,
-ownerships or dates in filesystems which lack these concepts, or
-have serious file name length restrictions, such as
-MS-DOS.</para>
-
-<para><computeroutput>bzip2</computeroutput> and
-<computeroutput>bunzip2</computeroutput> will by default not
-overwrite existing files. If you want this to happen, specify
-the <computeroutput>-f</computeroutput> flag.</para>
-
-<para>If no file names are specified,
-<computeroutput>bzip2</computeroutput> compresses from standard
-input to standard output. In this case,
-<computeroutput>bzip2</computeroutput> will decline to write
-compressed output to a terminal, as this would be entirely
-incomprehensible and therefore pointless.</para>
-
-<para><computeroutput>bunzip2</computeroutput> (or
-<computeroutput>bzip2 -d</computeroutput>) decompresses all
-specified files. Files which were not created by
-<computeroutput>bzip2</computeroutput> will be detected and
-ignored, and a warning issued.
-<computeroutput>bzip2</computeroutput> attempts to guess the
-filename for the decompressed file from that of the compressed
-file as follows:</para>
-
-<itemizedlist mark='bullet'>
-
- <listitem><para><computeroutput>filename.bz2 </computeroutput>
- becomes
- <computeroutput>filename</computeroutput></para></listitem>
-
- <listitem><para><computeroutput>filename.bz </computeroutput>
- becomes
- <computeroutput>filename</computeroutput></para></listitem>
-
- <listitem><para><computeroutput>filename.tbz2</computeroutput>
- becomes
- <computeroutput>filename.tar</computeroutput></para></listitem>
-
- <listitem><para><computeroutput>filename.tbz </computeroutput>
- becomes
- <computeroutput>filename.tar</computeroutput></para></listitem>
-
- <listitem><para><computeroutput>anyothername </computeroutput>
- becomes
- <computeroutput>anyothername.out</computeroutput></para></listitem>
-
-</itemizedlist>
-
-<para>If the file does not end in one of the recognised endings,
-<computeroutput>.bz2</computeroutput>,
-<computeroutput>.bz</computeroutput>,
-<computeroutput>.tbz2</computeroutput> or
-<computeroutput>.tbz</computeroutput>,
-<computeroutput>bzip2</computeroutput> complains that it cannot
-guess the name of the original file, and uses the original name
-with <computeroutput>.out</computeroutput> appended.</para>
-
-<para>As with compression, supplying no filenames causes
-decompression from standard input to standard output.</para>
-
-<para><computeroutput>bunzip2</computeroutput> will correctly
-decompress a file which is the concatenation of two or more
-compressed files. The result is the concatenation of the
-corresponding uncompressed files. Integrity testing
-(<computeroutput>-t</computeroutput>) of concatenated compressed
-files is also supported.</para>
-
-<para>You can also compress or decompress files to the standard
-output by giving the <computeroutput>-c</computeroutput> flag.
-Multiple files may be compressed and decompressed like this. The
-resulting outputs are fed sequentially to stdout. Compression of
-multiple files in this manner generates a stream containing
-multiple compressed file representations. Such a stream can be
-decompressed correctly only by
-<computeroutput>bzip2</computeroutput> version 0.9.0 or later.
-Earlier versions of <computeroutput>bzip2</computeroutput> will
-stop after decompressing the first file in the stream.</para>
-
-<para><computeroutput>bzcat</computeroutput> (or
-<computeroutput>bzip2 -dc</computeroutput>) decompresses all
-specified files to the standard output.</para>
-
-<para><computeroutput>bzip2</computeroutput> will read arguments
-from the environment variables
-<computeroutput>BZIP2</computeroutput> and
-<computeroutput>BZIP</computeroutput>, in that order, and will
-process them before any arguments read from the command line.
-This gives a convenient way to supply default arguments.</para>
-
-<para>Compression is always performed, even if the compressed
-file is slightly larger than the original. Files of less than
-about one hundred bytes tend to get larger, since the compression
-mechanism has a constant overhead in the region of 50 bytes.
-Random data (including the output of most file compressors) is
-coded at about 8.05 bits per byte, giving an expansion of around
-0.5%.</para>
-
-<para>As a self-check for your protection,
-<computeroutput>bzip2</computeroutput> uses 32-bit CRCs to make
-sure that the decompressed version of a file is identical to the
-original. This guards against corruption of the compressed data,
-and against undetected bugs in
-<computeroutput>bzip2</computeroutput> (hopefully very unlikely).
-The chances of data corruption going undetected is microscopic,
-about one chance in four billion for each file processed. Be
-aware, though, that the check occurs upon decompression, so it
-can only tell you that something is wrong. It can't help you
-recover the original uncompressed data. You can use
-<computeroutput>bzip2recover</computeroutput> to try to recover
-data from damaged files.</para>
-
-<para>Return values: 0 for a normal exit, 1 for environmental
-problems (file not found, invalid flags, I/O errors, etc.), 2
-to indicate a corrupt compressed file, 3 for an internal
-consistency error (eg, bug) which caused
-<computeroutput>bzip2</computeroutput> to panic.</para>
-
-</sect1>
-
-
-<sect1 id="options" xreflabel="OPTIONS">
-<title>OPTIONS</title>
-
-<variablelist>
-
- <varlistentry>
- <term><computeroutput>-c --stdout</computeroutput></term>
- <listitem><para>Compress or decompress to standard
- output.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><computeroutput>-d --decompress</computeroutput></term>
- <listitem><para>Force decompression.
- <computeroutput>bzip2</computeroutput>,
- <computeroutput>bunzip2</computeroutput> and
- <computeroutput>bzcat</computeroutput> are really the same
- program, and the decision about what actions to take is done on
- the basis of which name is used. This flag overrides that
- mechanism, and forces bzip2 to decompress.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><computeroutput>-z --compress</computeroutput></term>
- <listitem><para>The complement to
- <computeroutput>-d</computeroutput>: forces compression,
- regardless of the invokation name.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><computeroutput>-t --test</computeroutput></term>
- <listitem><para>Check integrity of the specified file(s), but
- don't decompress them. This really performs a trial
- decompression and throws away the result.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><computeroutput>-f --force</computeroutput></term>
- <listitem><para>Force overwrite of output files. Normally,
- <computeroutput>bzip2</computeroutput> will not overwrite
- existing output files. Also forces
- <computeroutput>bzip2</computeroutput> to break hard links to
- files, which it otherwise wouldn't do.</para>
- <para><computeroutput>bzip2</computeroutput> normally declines
- to decompress files which don't have the correct magic header
- bytes. If forced (<computeroutput>-f</computeroutput>),
- however, it will pass such files through unmodified. This is
- how GNU <computeroutput>gzip</computeroutput> behaves.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><computeroutput>-k --keep</computeroutput></term>
- <listitem><para>Keep (don't delete) input files during
- compression or decompression.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><computeroutput>-s --small</computeroutput></term>
- <listitem><para>Reduce memory usage, for compression,
- decompression and testing. Files are decompressed and tested
- using a modified algorithm which only requires 2.5 bytes per
- block byte. This means any file can be decompressed in 2300k
- of memory, albeit at about half the normal speed.</para>
- <para>During compression, <computeroutput>-s</computeroutput>
- selects a block size of 200k, which limits memory use to around
- the same figure, at the expense of your compression ratio. In
- short, if your machine is low on memory (8 megabytes or less),
- use <computeroutput>-s</computeroutput> for everything. See
- <xref linkend="memory-management"/> below.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><computeroutput>-q --quiet</computeroutput></term>
- <listitem><para>Suppress non-essential warning messages.
- Messages pertaining to I/O errors and other critical events
- will not be suppressed.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><computeroutput>-v --verbose</computeroutput></term>
- <listitem><para>Verbose mode -- show the compression ratio for
- each file processed. Further
- <computeroutput>-v</computeroutput>'s increase the verbosity
- level, spewing out lots of information which is primarily of
- interest for diagnostic purposes.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><computeroutput>-L --license -V --version</computeroutput></term>
- <listitem><para>Display the software version, license terms and
- conditions.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><computeroutput>-1</computeroutput> (or
- <computeroutput>--fast</computeroutput>) to
- <computeroutput>-9</computeroutput> (or
- <computeroutput>-best</computeroutput>)</term>
- <listitem><para>Set the block size to 100 k, 200 k ... 900 k
- when compressing. Has no effect when decompressing. See <xref
- linkend="memory-management" /> below. The
- <computeroutput>--fast</computeroutput> and
- <computeroutput>--best</computeroutput> aliases are primarily
- for GNU <computeroutput>gzip</computeroutput> compatibility.
- In particular, <computeroutput>--fast</computeroutput> doesn't
- make things significantly faster. And
- <computeroutput>--best</computeroutput> merely selects the
- default behaviour.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><computeroutput>--</computeroutput></term>
- <listitem><para>Treats all subsequent arguments as file names,
- even if they start with a dash. This is so you can handle
- files with names beginning with a dash, for example:
- <computeroutput>bzip2 --
- -myfilename</computeroutput>.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><computeroutput>--repetitive-fast</computeroutput></term>
- <term><computeroutput>--repetitive-best</computeroutput></term>
- <listitem><para>These flags are redundant in versions 0.9.5 and
- above. They provided some coarse control over the behaviour of
- the sorting algorithm in earlier versions, which was sometimes
- useful. 0.9.5 and above have an improved algorithm which
- renders these flags irrelevant.</para></listitem>
- </varlistentry>
-
-</variablelist>
-
-</sect1>
-
-
-<sect1 id="memory-management" xreflabel="MEMORY MANAGEMENT">
-<title>MEMORY MANAGEMENT</title>
-
-<para><computeroutput>bzip2</computeroutput> compresses large
-files in blocks. The block size affects both the compression
-ratio achieved, and the amount of memory needed for compression
-and decompression. The flags <computeroutput>-1</computeroutput>
-through <computeroutput>-9</computeroutput> specify the block
-size to be 100,000 bytes through 900,000 bytes (the default)
-respectively. At decompression time, the block size used for
-compression is read from the header of the compressed file, and
-<computeroutput>bunzip2</computeroutput> then allocates itself
-just enough memory to decompress the file. Since block sizes are
-stored in compressed files, it follows that the flags
-<computeroutput>-1</computeroutput> to
-<computeroutput>-9</computeroutput> are irrelevant to and so
-ignored during decompression.</para>
-
-<para>Compression and decompression requirements, in bytes, can be
-estimated as:</para>
-<programlisting>
-Compression: 400k + ( 8 x block size )
-
-Decompression: 100k + ( 4 x block size ), or
- 100k + ( 2.5 x block size )
-</programlisting>
-
-<para>Larger block sizes give rapidly diminishing marginal
-returns. Most of the compression comes from the first two or
-three hundred k of block size, a fact worth bearing in mind when
-using <computeroutput>bzip2</computeroutput> on small machines.
-It is also important to appreciate that the decompression memory
-requirement is set at compression time by the choice of block
-size.</para>
-
-<para>For files compressed with the default 900k block size,
-<computeroutput>bunzip2</computeroutput> will require about 3700
-kbytes to decompress. To support decompression of any file on a
-4 megabyte machine, <computeroutput>bunzip2</computeroutput> has
-an option to decompress using approximately half this amount of
-memory, about 2300 kbytes. Decompression speed is also halved,
-so you should use this option only where necessary. The relevant
-flag is <computeroutput>-s</computeroutput>.</para>
-
-<para>In general, try and use the largest block size memory
-constraints allow, since that maximises the compression achieved.
-Compression and decompression speed are virtually unaffected by
-block size.</para>
-
-<para>Another significant point applies to files which fit in a
-single block -- that means most files you'd encounter using a
-large block size. The amount of real memory touched is
-proportional to the size of the file, since the file is smaller
-than a block. For example, compressing a file 20,000 bytes long
-with the flag <computeroutput>-9</computeroutput> will cause the
-compressor to allocate around 7600k of memory, but only touch
-400k + 20000 * 8 = 560 kbytes of it. Similarly, the decompressor
-will allocate 3700k but only touch 100k + 20000 * 4 = 180
-kbytes.</para>
-
-<para>Here is a table which summarises the maximum memory usage
-for different block sizes. Also recorded is the total compressed
-size for 14 files of the Calgary Text Compression Corpus
-totalling 3,141,622 bytes. This column gives some feel for how
-compression varies with block size. These figures tend to
-understate the advantage of larger block sizes for larger files,
-since the Corpus is dominated by smaller files.</para>
-
-<programlisting>
- Compress Decompress Decompress Corpus
-Flag usage usage -s usage Size
-
- -1 1200k 500k 350k 914704
- -2 2000k 900k 600k 877703
- -3 2800k 1300k 850k 860338
- -4 3600k 1700k 1100k 846899
- -5 4400k 2100k 1350k 845160
- -6 5200k 2500k 1600k 838626
- -7 6100k 2900k 1850k 834096
- -8 6800k 3300k 2100k 828642
- -9 7600k 3700k 2350k 828642
-</programlisting>
-
-</sect1>
-
-
-<sect1 id="recovering" xreflabel="RECOVERING DATA FROM DAMAGED FILES">
-<title>RECOVERING DATA FROM DAMAGED FILES</title>
-
-<para><computeroutput>bzip2</computeroutput> compresses files in
-blocks, usually 900kbytes long. Each block is handled
-independently. If a media or transmission error causes a
-multi-block <computeroutput>.bz2</computeroutput> file to become
-damaged, it may be possible to recover data from the undamaged
-blocks in the file.</para>
-
-<para>The compressed representation of each block is delimited by
-a 48-bit pattern, which makes it possible to find the block
-boundaries with reasonable certainty. Each block also carries
-its own 32-bit CRC, so damaged blocks can be distinguished from
-undamaged ones.</para>
-
-<para><computeroutput>bzip2recover</computeroutput> is a simple
-program whose purpose is to search for blocks in
-<computeroutput>.bz2</computeroutput> files, and write each block
-out into its own <computeroutput>.bz2</computeroutput> file. You
-can then use <computeroutput>bzip2 -t</computeroutput> to test
-the integrity of the resulting files, and decompress those which
-are undamaged.</para>
-
-<para><computeroutput>bzip2recover</computeroutput> takes a
-single argument, the name of the damaged file, and writes a
-number of files <computeroutput>rec0001file.bz2</computeroutput>,
-<computeroutput>rec0002file.bz2</computeroutput>, etc, containing
-the extracted blocks. The output filenames are designed so that
-the use of wildcards in subsequent processing -- for example,
-<computeroutput>bzip2 -dc rec*file.bz2 &#62;
-recovered_data</computeroutput> -- lists the files in the correct
-order.</para>
-
-<para><computeroutput>bzip2recover</computeroutput> should be of
-most use dealing with large <computeroutput>.bz2</computeroutput>
-files, as these will contain many blocks. It is clearly futile
-to use it on damaged single-block files, since a damaged block
-cannot be recovered. If you wish to minimise any potential data
-loss through media or transmission errors, you might consider
-compressing with a smaller block size.</para>
-
-</sect1>
-
-
-<sect1 id="performance" xreflabel="PERFORMANCE NOTES">
-<title>PERFORMANCE NOTES</title>
-
-<para>The sorting phase of compression gathers together similar
-strings in the file. Because of this, files containing very long
-runs of repeated symbols, like "aabaabaabaab ..." (repeated
-several hundred times) may compress more slowly than normal.
-Versions 0.9.5 and above fare much better than previous versions
-in this respect. The ratio between worst-case and average-case
-compression time is in the region of 10:1. For previous
-versions, this figure was more like 100:1. You can use the
-<computeroutput>-vvvv</computeroutput> option to monitor progress
-in great detail, if you want.</para>
-
-<para>Decompression speed is unaffected by these
-phenomena.</para>
-
-<para><computeroutput>bzip2</computeroutput> usually allocates
-several megabytes of memory to operate in, and then charges all
-over it in a fairly random fashion. This means that performance,
-both for compressing and decompressing, is largely determined by
-the speed at which your machine can service cache misses.
-Because of this, small changes to the code to reduce the miss
-rate have been observed to give disproportionately large
-performance improvements. I imagine
-<computeroutput>bzip2</computeroutput> will perform best on
-machines with very large caches.</para>
-
-</sect1>
-
-
-
-<sect1 id="caveats" xreflabel="CAVEATS">
-<title>CAVEATS</title>
-
-<para>I/O error messages are not as helpful as they could be.
-<computeroutput>bzip2</computeroutput> tries hard to detect I/O
-errors and exit cleanly, but the details of what the problem is
-sometimes seem rather misleading.</para>
-
-<para>This manual page pertains to version &bz-version; of
-<computeroutput>bzip2</computeroutput>. Compressed data created by
-this version is entirely forwards and backwards compatible with the
-previous public releases, versions 0.1pl2, 0.9.0 and 0.9.5, 1.0.0,
-1.0.1, 1.0.2 and 1.0.3, but with the following exception: 0.9.0 and
-above can correctly decompress multiple concatenated compressed files.
-0.1pl2 cannot do this; it will stop after decompressing just the first
-file in the stream.</para>
-
-<para><computeroutput>bzip2recover</computeroutput> versions
-prior to 1.0.2 used 32-bit integers to represent bit positions in
-compressed files, so it could not handle compressed files more
-than 512 megabytes long. Versions 1.0.2 and above use 64-bit ints
-on some platforms which support them (GNU supported targets, and
-Windows). To establish whether or not
-<computeroutput>bzip2recover</computeroutput> was built with such
-a limitation, run it without arguments. In any event you can
-build yourself an unlimited version if you can recompile it with
-<computeroutput>MaybeUInt64</computeroutput> set to be an
-unsigned 64-bit integer.</para>
-
-</sect1>
-
-
-
-<sect1 id="author" xreflabel="AUTHOR">
-<title>AUTHOR</title>
-
-<para>Julian Seward,
-<computeroutput>&bz-email;</computeroutput></para>
-
-<para>The ideas embodied in
-<computeroutput>bzip2</computeroutput> are due to (at least) the
-following people: Michael Burrows and David Wheeler (for the
-block sorting transformation), David Wheeler (again, for the
-Huffman coder), Peter Fenwick (for the structured coding model in
-the original <computeroutput>bzip</computeroutput>, and many
-refinements), and Alistair Moffat, Radford Neal and Ian Witten
-(for the arithmetic coder in the original
-<computeroutput>bzip</computeroutput>). I am much indebted for
-their help, support and advice. See the manual in the source
-distribution for pointers to sources of documentation. Christian
-von Roques encouraged me to look for faster sorting algorithms,
-so as to speed up compression. Bela Lubkin encouraged me to
-improve the worst-case compression performance.
-Donna Robinson XMLised the documentation.
-Many people sent
-patches, helped with portability problems, lent machines, gave
-advice and were generally helpful.</para>
-
-</sect1>
-
-</chapter>
-
-
-
-<chapter id="libprog" xreflabel="Programming with libbzip2">
-<title>
-Programming with <computeroutput>libbzip2</computeroutput>
-</title>
-
-<para>This chapter describes the programming interface to
-<computeroutput>libbzip2</computeroutput>.</para>
-
-<para>For general background information, particularly about
-memory use and performance aspects, you'd be well advised to read
-<xref linkend="using"/> as well.</para>
-
-
-<sect1 id="top-level" xreflabel="Top-level structure">
-<title>Top-level structure</title>
-
-<para><computeroutput>libbzip2</computeroutput> is a flexible
-library for compressing and decompressing data in the
-<computeroutput>bzip2</computeroutput> data format. Although
-packaged as a single entity, it helps to regard the library as
-three separate parts: the low level interface, and the high level
-interface, and some utility functions.</para>
-
-<para>The structure of
-<computeroutput>libbzip2</computeroutput>'s interfaces is similar
-to that of Jean-loup Gailly's and Mark Adler's excellent
-<computeroutput>zlib</computeroutput> library.</para>
-
-<para>All externally visible symbols have names beginning
-<computeroutput>BZ2_</computeroutput>. This is new in version
-1.0. The intention is to minimise pollution of the namespaces of
-library clients.</para>
-
-<para>To use any part of the library, you need to
-<computeroutput>#include &lt;bzlib.h&gt;</computeroutput>
-into your sources.</para>
-
-
-
-<sect2 id="ll-summary" xreflabel="Low-level summary">
-<title>Low-level summary</title>
-
-<para>This interface provides services for compressing and
-decompressing data in memory. There's no provision for dealing
-with files, streams or any other I/O mechanisms, just straight
-memory-to-memory work. In fact, this part of the library can be
-compiled without inclusion of
-<computeroutput>stdio.h</computeroutput>, which may be helpful
-for embedded applications.</para>
-
-<para>The low-level part of the library has no global variables
-and is therefore thread-safe.</para>
-
-<para>Six routines make up the low level interface:
-<computeroutput>BZ2_bzCompressInit</computeroutput>,
-<computeroutput>BZ2_bzCompress</computeroutput>, and
-<computeroutput>BZ2_bzCompressEnd</computeroutput> for
-compression, and a corresponding trio
-<computeroutput>BZ2_bzDecompressInit</computeroutput>,
-<computeroutput>BZ2_bzDecompress</computeroutput> and
-<computeroutput>BZ2_bzDecompressEnd</computeroutput> for
-decompression. The <computeroutput>*Init</computeroutput>
-functions allocate memory for compression/decompression and do
-other initialisations, whilst the
-<computeroutput>*End</computeroutput> functions close down
-operations and release memory.</para>
-
-<para>The real work is done by
-<computeroutput>BZ2_bzCompress</computeroutput> and
-<computeroutput>BZ2_bzDecompress</computeroutput>. These
-compress and decompress data from a user-supplied input buffer to
-a user-supplied output buffer. These buffers can be any size;
-arbitrary quantities of data are handled by making repeated calls
-to these functions. This is a flexible mechanism allowing a
-consumer-pull style of activity, or producer-push, or a mixture
-of both.</para>
-
-</sect2>
-
-
-<sect2 id="hl-summary" xreflabel="High-level summary">
-<title>High-level summary</title>
-
-<para>This interface provides some handy wrappers around the
-low-level interface to facilitate reading and writing
-<computeroutput>bzip2</computeroutput> format files
-(<computeroutput>.bz2</computeroutput> files). The routines
-provide hooks to facilitate reading files in which the
-<computeroutput>bzip2</computeroutput> data stream is embedded
-within some larger-scale file structure, or where there are
-multiple <computeroutput>bzip2</computeroutput> data streams
-concatenated end-to-end.</para>
-
-<para>For reading files,
-<computeroutput>BZ2_bzReadOpen</computeroutput>,
-<computeroutput>BZ2_bzRead</computeroutput>,
-<computeroutput>BZ2_bzReadClose</computeroutput> and
-<computeroutput>BZ2_bzReadGetUnused</computeroutput> are
-supplied. For writing files,
-<computeroutput>BZ2_bzWriteOpen</computeroutput>,
-<computeroutput>BZ2_bzWrite</computeroutput> and
-<computeroutput>BZ2_bzWriteFinish</computeroutput> are
-available.</para>
-
-<para>As with the low-level library, no global variables are used
-so the library is per se thread-safe. However, if I/O errors
-occur whilst reading or writing the underlying compressed files,
-you may have to consult <computeroutput>errno</computeroutput> to
-determine the cause of the error. In that case, you'd need a C
-library which correctly supports
-<computeroutput>errno</computeroutput> in a multithreaded
-environment.</para>
-
-<para>To make the library a little simpler and more portable,
-<computeroutput>BZ2_bzReadOpen</computeroutput> and
-<computeroutput>BZ2_bzWriteOpen</computeroutput> require you to
-pass them file handles (<computeroutput>FILE*</computeroutput>s)
-which have previously been opened for reading or writing
-respectively. That avoids portability problems associated with
-file operations and file attributes, whilst not being much of an
-imposition on the programmer.</para>
-
-</sect2>
-
-
-<sect2 id="util-fns-summary" xreflabel="Utility functions summary">
-<title>Utility functions summary</title>
-
-<para>For very simple needs,
-<computeroutput>BZ2_bzBuffToBuffCompress</computeroutput> and
-<computeroutput>BZ2_bzBuffToBuffDecompress</computeroutput> are
-provided. These compress data in memory from one buffer to
-another buffer in a single function call. You should assess
-whether these functions fulfill your memory-to-memory
-compression/decompression requirements before investing effort in
-understanding the more general but more complex low-level
-interface.</para>
-
-<para>Yoshioka Tsuneo
-(<computeroutput>tsuneo@rr.iij4u.or.jp</computeroutput>) has
-contributed some functions to give better
-<computeroutput>zlib</computeroutput> compatibility. These
-functions are <computeroutput>BZ2_bzopen</computeroutput>,
-<computeroutput>BZ2_bzread</computeroutput>,
-<computeroutput>BZ2_bzwrite</computeroutput>,
-<computeroutput>BZ2_bzflush</computeroutput>,
-<computeroutput>BZ2_bzclose</computeroutput>,
-<computeroutput>BZ2_bzerror</computeroutput> and
-<computeroutput>BZ2_bzlibVersion</computeroutput>. You may find
-these functions more convenient for simple file reading and
-writing, than those in the high-level interface. These functions
-are not (yet) officially part of the library, and are minimally
-documented here. If they break, you get to keep all the pieces.
-I hope to document them properly when time permits.</para>
-
-<para>Yoshioka also contributed modifications to allow the
-library to be built as a Windows DLL.</para>
-
-</sect2>
-
-</sect1>
-
-
-<sect1 id="err-handling" xreflabel="Error handling">
-<title>Error handling</title>
-
-<para>The library is designed to recover cleanly in all
-situations, including the worst-case situation of decompressing
-random data. I'm not 100% sure that it can always do this, so
-you might want to add a signal handler to catch segmentation
-violations during decompression if you are feeling especially
-paranoid. I would be interested in hearing more about the
-robustness of the library to corrupted compressed data.</para>
-
-<para>Version 1.0.3 more robust in this respect than any
-previous version. Investigations with Valgrind (a tool for detecting
-problems with memory management) indicate
-that, at least for the few files I tested, all single-bit errors
-in the decompressed data are caught properly, with no
-segmentation faults, no uses of uninitialised data, no out of
-range reads or writes, and no infinite looping in the decompressor.
-So it's certainly pretty robust, although
-I wouldn't claim it to be totally bombproof.</para>
-
-<para>The file <computeroutput>bzlib.h</computeroutput> contains
-all definitions needed to use the library. In particular, you
-should definitely not include
-<computeroutput>bzlib_private.h</computeroutput>.</para>
-
-<para>In <computeroutput>bzlib.h</computeroutput>, the various
-return values are defined. The following list is not intended as
-an exhaustive description of the circumstances in which a given
-value may be returned -- those descriptions are given later.
-Rather, it is intended to convey the rough meaning of each return
-value. The first five actions are normal and not intended to
-denote an error situation.</para>
-
-<variablelist>
-
- <varlistentry>
- <term><computeroutput>BZ_OK</computeroutput></term>
- <listitem><para>The requested action was completed
- successfully.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><computeroutput>BZ_RUN_OK, BZ_FLUSH_OK,
- BZ_FINISH_OK</computeroutput></term>
- <listitem><para>In
- <computeroutput>BZ2_bzCompress</computeroutput>, the requested
- flush/finish/nothing-special action was completed
- successfully.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><computeroutput>BZ_STREAM_END</computeroutput></term>
- <listitem><para>Compression of data was completed, or the
- logical stream end was detected during
- decompression.</para></listitem>
- </varlistentry>
-
-</variablelist>
-
-<para>The following return values indicate an error of some
-kind.</para>
-
-<variablelist>
-
- <varlistentry>
- <term><computeroutput>BZ_CONFIG_ERROR</computeroutput></term>
- <listitem><para>Indicates that the library has been improperly
- compiled on your platform -- a major configuration error.
- Specifically, it means that
- <computeroutput>sizeof(char)</computeroutput>,
- <computeroutput>sizeof(short)</computeroutput> and
- <computeroutput>sizeof(int)</computeroutput> are not 1, 2 and
- 4 respectively, as they should be. Note that the library
- should still work properly on 64-bit platforms which follow
- the LP64 programming model -- that is, where
- <computeroutput>sizeof(long)</computeroutput> and
- <computeroutput>sizeof(void*)</computeroutput> are 8. Under
- LP64, <computeroutput>sizeof(int)</computeroutput> is still 4,
- so <computeroutput>libbzip2</computeroutput>, which doesn't
- use the <computeroutput>long</computeroutput> type, is
- OK.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><computeroutput>BZ_SEQUENCE_ERROR</computeroutput></term>
- <listitem><para>When using the library, it is important to call
- the functions in the correct sequence and with data structures
- (buffers etc) in the correct states.
- <computeroutput>libbzip2</computeroutput> checks as much as it
- can to ensure this is happening, and returns
- <computeroutput>BZ_SEQUENCE_ERROR</computeroutput> if not.
- Code which complies precisely with the function semantics, as
- detailed below, should never receive this value; such an event
- denotes buggy code which you should
- investigate.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><computeroutput>BZ_PARAM_ERROR</computeroutput></term>
- <listitem><para>Returned when a parameter to a function call is
- out of range or otherwise manifestly incorrect. As with
- <computeroutput>BZ_SEQUENCE_ERROR</computeroutput>, this
- denotes a bug in the client code. The distinction between
- <computeroutput>BZ_PARAM_ERROR</computeroutput> and
- <computeroutput>BZ_SEQUENCE_ERROR</computeroutput> is a bit
- hazy, but still worth making.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><computeroutput>BZ_MEM_ERROR</computeroutput></term>
- <listitem><para>Returned when a request to allocate memory
- failed. Note that the quantity of memory needed to decompress
- a stream cannot be determined until the stream's header has
- been read. So
- <computeroutput>BZ2_bzDecompress</computeroutput> and
- <computeroutput>BZ2_bzRead</computeroutput> may return
- <computeroutput>BZ_MEM_ERROR</computeroutput> even though some
- of the compressed data has been read. The same is not true
- for compression; once
- <computeroutput>BZ2_bzCompressInit</computeroutput> or
- <computeroutput>BZ2_bzWriteOpen</computeroutput> have
- successfully completed,
- <computeroutput>BZ_MEM_ERROR</computeroutput> cannot
- occur.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><computeroutput>BZ_DATA_ERROR</computeroutput></term>
- <listitem><para>Returned when a data integrity error is
- detected during decompression. Most importantly, this means
- when stored and computed CRCs for the data do not match. This
- value is also returned upon detection of any other anomaly in
- the compressed data.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><computeroutput>BZ_DATA_ERROR_MAGIC</computeroutput></term>
- <listitem><para>As a special case of
- <computeroutput>BZ_DATA_ERROR</computeroutput>, it is
- sometimes useful to know when the compressed stream does not
- start with the correct magic bytes (<computeroutput>'B' 'Z'
- 'h'</computeroutput>).</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><computeroutput>BZ_IO_ERROR</computeroutput></term>
- <listitem><para>Returned by
- <computeroutput>BZ2_bzRead</computeroutput> and
- <computeroutput>BZ2_bzWrite</computeroutput> when there is an
- error reading or writing in the compressed file, and by
- <computeroutput>BZ2_bzReadOpen</computeroutput> and
- <computeroutput>BZ2_bzWriteOpen</computeroutput> for attempts
- to use a file for which the error indicator (viz,
- <computeroutput>ferror(f)</computeroutput>) is set. On
- receipt of <computeroutput>BZ_IO_ERROR</computeroutput>, the
- caller should consult <computeroutput>errno</computeroutput>
- and/or <computeroutput>perror</computeroutput> to acquire
- operating-system specific information about the
- problem.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><computeroutput>BZ_UNEXPECTED_EOF</computeroutput></term>
- <listitem><para>Returned by
- <computeroutput>BZ2_bzRead</computeroutput> when the
- compressed file finishes before the logical end of stream is
- detected.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><computeroutput>BZ_OUTBUFF_FULL</computeroutput></term>
- <listitem><para>Returned by
- <computeroutput>BZ2_bzBuffToBuffCompress</computeroutput> and
- <computeroutput>BZ2_bzBuffToBuffDecompress</computeroutput> to
- indicate that the output data will not fit into the output
- buffer provided.</para></listitem>
- </varlistentry>
-
-</variablelist>
-
-</sect1>
-
-
-
-<sect1 id="low-level" xreflabel=">Low-level interface">
-<title>Low-level interface</title>
-
-
-<sect2 id="bzcompress-init" xreflabel="BZ2_bzCompressInit">
-<title><computeroutput>BZ2_bzCompressInit</computeroutput></title>
-
-<programlisting>
-typedef struct {
- char *next_in;
- unsigned int avail_in;
- unsigned int total_in_lo32;
- unsigned int total_in_hi32;
-
- char *next_out;
- unsigned int avail_out;
- unsigned int total_out_lo32;
- unsigned int total_out_hi32;
-
- void *state;
-
- void *(*bzalloc)(void *,int,int);
- void (*bzfree)(void *,void *);
- void *opaque;
-} bz_stream;
-
-int BZ2_bzCompressInit ( bz_stream *strm,
- int blockSize100k,
- int verbosity,
- int workFactor );
-</programlisting>
-
-<para>Prepares for compression. The
-<computeroutput>bz_stream</computeroutput> structure holds all
-data pertaining to the compression activity. A
-<computeroutput>bz_stream</computeroutput> structure should be
-allocated and initialised prior to the call. The fields of
-<computeroutput>bz_stream</computeroutput> comprise the entirety
-of the user-visible data. <computeroutput>state</computeroutput>
-is a pointer to the private data structures required for
-compression.</para>
-
-<para>Custom memory allocators are supported, via fields
-<computeroutput>bzalloc</computeroutput>,
-<computeroutput>bzfree</computeroutput>, and
-<computeroutput>opaque</computeroutput>. The value
-<computeroutput>opaque</computeroutput> is passed to as the first
-argument to all calls to <computeroutput>bzalloc</computeroutput>
-and <computeroutput>bzfree</computeroutput>, but is otherwise
-ignored by the library. The call <computeroutput>bzalloc (
-opaque, n, m )</computeroutput> is expected to return a pointer
-<computeroutput>p</computeroutput> to <computeroutput>n *
-m</computeroutput> bytes of memory, and <computeroutput>bzfree (
-opaque, p )</computeroutput> should free that memory.</para>
-
-<para>If you don't want to use a custom memory allocator, set
-<computeroutput>bzalloc</computeroutput>,
-<computeroutput>bzfree</computeroutput> and
-<computeroutput>opaque</computeroutput> to
-<computeroutput>NULL</computeroutput>, and the library will then
-use the standard <computeroutput>malloc</computeroutput> /
-<computeroutput>free</computeroutput> routines.</para>
-
-<para>Before calling
-<computeroutput>BZ2_bzCompressInit</computeroutput>, fields
-<computeroutput>bzalloc</computeroutput>,
-<computeroutput>bzfree</computeroutput> and
-<computeroutput>opaque</computeroutput> should be filled
-appropriately, as just described. Upon return, the internal
-state will have been allocated and initialised, and
-<computeroutput>total_in_lo32</computeroutput>,
-<computeroutput>total_in_hi32</computeroutput>,
-<computeroutput>total_out_lo32</computeroutput> and
-<computeroutput>total_out_hi32</computeroutput> will have been
-set to zero. These four fields are used by the library to inform
-the caller of the total amount of data passed into and out of the
-library, respectively. You should not try to change them. As of
-version 1.0, 64-bit counts are maintained, even on 32-bit
-platforms, using the <computeroutput>_hi32</computeroutput>
-fields to store the upper 32 bits of the count. So, for example,
-the total amount of data in is <computeroutput>(total_in_hi32
-&#60;&#60; 32) + total_in_lo32</computeroutput>.</para>
-
-<para>Parameter <computeroutput>blockSize100k</computeroutput>
-specifies the block size to be used for compression. It should
-be a value between 1 and 9 inclusive, and the actual block size
-used is 100000 x this figure. 9 gives the best compression but
-takes most memory.</para>
-
-<para>Parameter <computeroutput>verbosity</computeroutput> should
-be set to a number between 0 and 4 inclusive. 0 is silent, and
-greater numbers give increasingly verbose monitoring/debugging
-output. If the library has been compiled with
-<computeroutput>-DBZ_NO_STDIO</computeroutput>, no such output
-will appear for any verbosity setting.</para>
-
-<para>Parameter <computeroutput>workFactor</computeroutput>
-controls how the compression phase behaves when presented with
-worst case, highly repetitive, input data. If compression runs
-into difficulties caused by repetitive data, the library switches
-from the standard sorting algorithm to a fallback algorithm. The
-fallback is slower than the standard algorithm by perhaps a
-factor of three, but always behaves reasonably, no matter how bad
-the input.</para>
-
-<para>Lower values of <computeroutput>workFactor</computeroutput>
-reduce the amount of effort the standard algorithm will expend
-before resorting to the fallback. You should set this parameter
-carefully; too low, and many inputs will be handled by the
-fallback algorithm and so compress rather slowly, too high, and
-your average-to-worst case compression times can become very
-large. The default value of 30 gives reasonable behaviour over a
-wide range of circumstances.</para>
-
-<para>Allowable values range from 0 to 250 inclusive. 0 is a
-special case, equivalent to using the default value of 30.</para>
-
-<para>Note that the compressed output generated is the same
-regardless of whether or not the fallback algorithm is
-used.</para>
-
-<para>Be aware also that this parameter may disappear entirely in
-future versions of the library. In principle it should be
-possible to devise a good way to automatically choose which
-algorithm to use. Such a mechanism would render the parameter
-obsolete.</para>
-
-<para>Possible return values:</para>
-
-<programlisting>
-BZ_CONFIG_ERROR
- if the library has been mis-compiled
-BZ_PARAM_ERROR
- if strm is NULL
- or blockSize < 1 or blockSize > 9
- or verbosity < 0 or verbosity > 4
- or workFactor < 0 or workFactor > 250
-BZ_MEM_ERROR
- if not enough memory is available
-BZ_OK
- otherwise
-</programlisting>
-
-<para>Allowable next actions:</para>
-
-<programlisting>
-BZ2_bzCompress
- if BZ_OK is returned
- no specific action needed in case of error
-</programlisting>
-
-</sect2>
-
-
-<sect2 id="bzCompress" xreflabel="BZ2_bzCompress">
-<title><computeroutput>BZ2_bzCompress</computeroutput></title>
-
-<programlisting>
-int BZ2_bzCompress ( bz_stream *strm, int action );
-</programlisting>
-
-<para>Provides more input and/or output buffer space for the
-library. The caller maintains input and output buffers, and
-calls <computeroutput>BZ2_bzCompress</computeroutput> to transfer
-data between them.</para>
-
-<para>Before each call to
-<computeroutput>BZ2_bzCompress</computeroutput>,
-<computeroutput>next_in</computeroutput> should point at the data
-to be compressed, and <computeroutput>avail_in</computeroutput>
-should indicate how many bytes the library may read.
-<computeroutput>BZ2_bzCompress</computeroutput> updates
-<computeroutput>next_in</computeroutput>,
-<computeroutput>avail_in</computeroutput> and
-<computeroutput>total_in</computeroutput> to reflect the number
-of bytes it has read.</para>
-
-<para>Similarly, <computeroutput>next_out</computeroutput> should
-point to a buffer in which the compressed data is to be placed,
-with <computeroutput>avail_out</computeroutput> indicating how
-much output space is available.
-<computeroutput>BZ2_bzCompress</computeroutput> updates
-<computeroutput>next_out</computeroutput>,
-<computeroutput>avail_out</computeroutput> and
-<computeroutput>total_out</computeroutput> to reflect the number
-of bytes output.</para>
-
-<para>You may provide and remove as little or as much data as you
-like on each call of
-<computeroutput>BZ2_bzCompress</computeroutput>. In the limit,
-it is acceptable to supply and remove data one byte at a time,
-although this would be terribly inefficient. You should always
-ensure that at least one byte of output space is available at
-each call.</para>
-
-<para>A second purpose of
-<computeroutput>BZ2_bzCompress</computeroutput> is to request a
-change of mode of the compressed stream.</para>
-
-<para>Conceptually, a compressed stream can be in one of four
-states: IDLE, RUNNING, FLUSHING and FINISHING. Before
-initialisation
-(<computeroutput>BZ2_bzCompressInit</computeroutput>) and after
-termination (<computeroutput>BZ2_bzCompressEnd</computeroutput>),
-a stream is regarded as IDLE.</para>
-
-<para>Upon initialisation
-(<computeroutput>BZ2_bzCompressInit</computeroutput>), the stream
-is placed in the RUNNING state. Subsequent calls to
-<computeroutput>BZ2_bzCompress</computeroutput> should pass
-<computeroutput>BZ_RUN</computeroutput> as the requested action;
-other actions are illegal and will result in
-<computeroutput>BZ_SEQUENCE_ERROR</computeroutput>.</para>
-
-<para>At some point, the calling program will have provided all
-the input data it wants to. It will then want to finish up -- in
-effect, asking the library to process any data it might have
-buffered internally. In this state,
-<computeroutput>BZ2_bzCompress</computeroutput> will no longer
-attempt to read data from
-<computeroutput>next_in</computeroutput>, but it will want to
-write data to <computeroutput>next_out</computeroutput>. Because
-the output buffer supplied by the user can be arbitrarily small,
-the finishing-up operation cannot necessarily be done with a
-single call of
-<computeroutput>BZ2_bzCompress</computeroutput>.</para>
-
-<para>Instead, the calling program passes
-<computeroutput>BZ_FINISH</computeroutput> as an action to
-<computeroutput>BZ2_bzCompress</computeroutput>. This changes
-the stream's state to FINISHING. Any remaining input (ie,
-<computeroutput>next_in[0 .. avail_in-1]</computeroutput>) is
-compressed and transferred to the output buffer. To do this,
-<computeroutput>BZ2_bzCompress</computeroutput> must be called
-repeatedly until all the output has been consumed. At that
-point, <computeroutput>BZ2_bzCompress</computeroutput> returns
-<computeroutput>BZ_STREAM_END</computeroutput>, and the stream's
-state is set back to IDLE.
-<computeroutput>BZ2_bzCompressEnd</computeroutput> should then be
-called.</para>
-
-<para>Just to make sure the calling program does not cheat, the
-library makes a note of <computeroutput>avail_in</computeroutput>
-at the time of the first call to
-<computeroutput>BZ2_bzCompress</computeroutput> which has
-<computeroutput>BZ_FINISH</computeroutput> as an action (ie, at
-the time the program has announced its intention to not supply
-any more input). By comparing this value with that of
-<computeroutput>avail_in</computeroutput> over subsequent calls
-to <computeroutput>BZ2_bzCompress</computeroutput>, the library
-can detect any attempts to slip in more data to compress. Any
-calls for which this is detected will return
-<computeroutput>BZ_SEQUENCE_ERROR</computeroutput>. This
-indicates a programming mistake which should be corrected.</para>
-
-<para>Instead of asking to finish, the calling program may ask
-<computeroutput>BZ2_bzCompress</computeroutput> to take all the
-remaining input, compress it and terminate the current
-(Burrows-Wheeler) compression block. This could be useful for
-error control purposes. The mechanism is analogous to that for
-finishing: call <computeroutput>BZ2_bzCompress</computeroutput>
-with an action of <computeroutput>BZ_FLUSH</computeroutput>,
-remove output data, and persist with the
-<computeroutput>BZ_FLUSH</computeroutput> action until the value
-<computeroutput>BZ_RUN</computeroutput> is returned. As with
-finishing, <computeroutput>BZ2_bzCompress</computeroutput>
-detects any attempt to provide more input data once the flush has
-begun.</para>
-
-<para>Once the flush is complete, the stream returns to the
-normal RUNNING state.</para>
-
-<para>This all sounds pretty complex, but isn't really. Here's a
-table which shows which actions are allowable in each state, what
-action will be taken, what the next state is, and what the
-non-error return values are. Note that you can't explicitly ask
-what state the stream is in, but nor do you need to -- it can be
-inferred from the values returned by
-<computeroutput>BZ2_bzCompress</computeroutput>.</para>
-
-<programlisting>
-IDLE/any
- Illegal. IDLE state only exists after BZ2_bzCompressEnd or
- before BZ2_bzCompressInit.
- Return value = BZ_SEQUENCE_ERROR
-
-RUNNING/BZ_RUN
- Compress from next_in to next_out as much as possible.
- Next state = RUNNING
- Return value = BZ_RUN_OK
-
-RUNNING/BZ_FLUSH
- Remember current value of next_in. Compress from next_in
- to next_out as much as possible, but do not accept any more input.
- Next state = FLUSHING
- Return value = BZ_FLUSH_OK
-
-RUNNING/BZ_FINISH
- Remember current value of next_in. Compress from next_in
- to next_out as much as possible, but do not accept any more input.
- Next state = FINISHING
- Return value = BZ_FINISH_OK
-
-FLUSHING/BZ_FLUSH
- Compress from next_in to next_out as much as possible,
- but do not accept any more input.
- If all the existing input has been used up and all compressed
- output has been removed
- Next state = RUNNING; Return value = BZ_RUN_OK
- else
- Next state = FLUSHING; Return value = BZ_FLUSH_OK
-
-FLUSHING/other
- Illegal.
- Return value = BZ_SEQUENCE_ERROR
-
-FINISHING/BZ_FINISH
- Compress from next_in to next_out as much as possible,
- but to not accept any more input.
- If all the existing input has been used up and all compressed
- output has been removed
- Next state = IDLE; Return value = BZ_STREAM_END
- else
- Next state = FINISHING; Return value = BZ_FINISH_OK
-
-FINISHING/other
- Illegal.
- Return value = BZ_SEQUENCE_ERROR
-</programlisting>
-
-
-<para>That still looks complicated? Well, fair enough. The
-usual sequence of calls for compressing a load of data is:</para>
-
-<orderedlist>
-
- <listitem><para>Get started with
- <computeroutput>BZ2_bzCompressInit</computeroutput>.</para></listitem>
-
- <listitem><para>Shovel data in and shlurp out its compressed form
- using zero or more calls of
- <computeroutput>BZ2_bzCompress</computeroutput> with action =
- <computeroutput>BZ_RUN</computeroutput>.</para></listitem>
-
- <listitem><para>Finish up. Repeatedly call
- <computeroutput>BZ2_bzCompress</computeroutput> with action =
- <computeroutput>BZ_FINISH</computeroutput>, copying out the
- compressed output, until
- <computeroutput>BZ_STREAM_END</computeroutput> is
- returned.</para></listitem> <listitem><para>Close up and go home. Call
- <computeroutput>BZ2_bzCompressEnd</computeroutput>.</para></listitem>
-
-</orderedlist>
-
-<para>If the data you want to compress fits into your input
-buffer all at once, you can skip the calls of
-<computeroutput>BZ2_bzCompress ( ..., BZ_RUN )</computeroutput>
-and just do the <computeroutput>BZ2_bzCompress ( ..., BZ_FINISH
-)</computeroutput> calls.</para>
-
-<para>All required memory is allocated by
-<computeroutput>BZ2_bzCompressInit</computeroutput>. The
-compression library can accept any data at all (obviously). So
-you shouldn't get any error return values from the
-<computeroutput>BZ2_bzCompress</computeroutput> calls. If you
-do, they will be
-<computeroutput>BZ_SEQUENCE_ERROR</computeroutput>, and indicate
-a bug in your programming.</para>
-
-<para>Trivial other possible return values:</para>
-
-<programlisting>
-BZ_PARAM_ERROR
- if strm is NULL, or strm->s is NULL
-</programlisting>
-
-</sect2>
-
-
-<sect2 id="bzCompress-end" xreflabel="BZ2_bzCompressEnd">
-<title><computeroutput>BZ2_bzCompressEnd</computeroutput></title>
-
-<programlisting>
-int BZ2_bzCompressEnd ( bz_stream *strm );
-</programlisting>
-
-<para>Releases all memory associated with a compression
-stream.</para>
-
-<para>Possible return values:</para>
-
-<programlisting>
-BZ_PARAM_ERROR if strm is NULL or strm->s is NULL
-BZ_OK otherwise
-</programlisting>
-
-</sect2>
-
-
-<sect2 id="bzDecompress-init" xreflabel="BZ2_bzDecompressInit">
-<title><computeroutput>BZ2_bzDecompressInit</computeroutput></title>
-
-<programlisting>
-int BZ2_bzDecompressInit ( bz_stream *strm, int verbosity, int small );
-</programlisting>
-
-<para>Prepares for decompression. As with
-<computeroutput>BZ2_bzCompressInit</computeroutput>, a
-<computeroutput>bz_stream</computeroutput> record should be
-allocated and initialised before the call. Fields
-<computeroutput>bzalloc</computeroutput>,
-<computeroutput>bzfree</computeroutput> and
-<computeroutput>opaque</computeroutput> should be set if a custom
-memory allocator is required, or made
-<computeroutput>NULL</computeroutput> for the normal
-<computeroutput>malloc</computeroutput> /
-<computeroutput>free</computeroutput> routines. Upon return, the
-internal state will have been initialised, and
-<computeroutput>total_in</computeroutput> and
-<computeroutput>total_out</computeroutput> will be zero.</para>
-
-<para>For the meaning of parameter
-<computeroutput>verbosity</computeroutput>, see
-<computeroutput>BZ2_bzCompressInit</computeroutput>.</para>
-
-<para>If <computeroutput>small</computeroutput> is nonzero, the
-library will use an alternative decompression algorithm which
-uses less memory but at the cost of decompressing more slowly
-(roughly speaking, half the speed, but the maximum memory
-requirement drops to around 2300k). See <xref linkend="using"/>
-for more information on memory management.</para>
-
-<para>Note that the amount of memory needed to decompress a
-stream cannot be determined until the stream's header has been
-read, so even if
-<computeroutput>BZ2_bzDecompressInit</computeroutput> succeeds, a
-subsequent <computeroutput>BZ2_bzDecompress</computeroutput>
-could fail with
-<computeroutput>BZ_MEM_ERROR</computeroutput>.</para>
-
-<para>Possible return values:</para>
-
-<programlisting>
-BZ_CONFIG_ERROR
- if the library has been mis-compiled
-BZ_PARAM_ERROR
- if ( small != 0 && small != 1 )
- or (verbosity <; 0 || verbosity > 4)
-BZ_MEM_ERROR
- if insufficient memory is available
-</programlisting>
-
-<para>Allowable next actions:</para>
-
-<programlisting>
-BZ2_bzDecompress
- if BZ_OK was returned
- no specific action required in case of error
-</programlisting>
-
-</sect2>
-
-
-<sect2 id="bzDecompress" xreflabel="BZ2_bzDecompress">
-<title><computeroutput>BZ2_bzDecompress</computeroutput></title>
-
-<programlisting>
-int BZ2_bzDecompress ( bz_stream *strm );
-</programlisting>
-
-<para>Provides more input and/out output buffer space for the
-library. The caller maintains input and output buffers, and uses
-<computeroutput>BZ2_bzDecompress</computeroutput> to transfer
-data between them.</para>
-
-<para>Before each call to
-<computeroutput>BZ2_bzDecompress</computeroutput>,
-<computeroutput>next_in</computeroutput> should point at the
-compressed data, and <computeroutput>avail_in</computeroutput>
-should indicate how many bytes the library may read.
-<computeroutput>BZ2_bzDecompress</computeroutput> updates
-<computeroutput>next_in</computeroutput>,
-<computeroutput>avail_in</computeroutput> and
-<computeroutput>total_in</computeroutput> to reflect the number
-of bytes it has read.</para>
-
-<para>Similarly, <computeroutput>next_out</computeroutput> should
-point to a buffer in which the uncompressed output is to be
-placed, with <computeroutput>avail_out</computeroutput>
-indicating how much output space is available.
-<computeroutput>BZ2_bzCompress</computeroutput> updates
-<computeroutput>next_out</computeroutput>,
-<computeroutput>avail_out</computeroutput> and
-<computeroutput>total_out</computeroutput> to reflect the number
-of bytes output.</para>
-
-<para>You may provide and remove as little or as much data as you
-like on each call of
-<computeroutput>BZ2_bzDecompress</computeroutput>. In the limit,
-it is acceptable to supply and remove data one byte at a time,
-although this would be terribly inefficient. You should always
-ensure that at least one byte of output space is available at
-each call.</para>
-
-<para>Use of <computeroutput>BZ2_bzDecompress</computeroutput> is
-simpler than
-<computeroutput>BZ2_bzCompress</computeroutput>.</para>
-
-<para>You should provide input and remove output as described
-above, and repeatedly call
-<computeroutput>BZ2_bzDecompress</computeroutput> until
-<computeroutput>BZ_STREAM_END</computeroutput> is returned.
-Appearance of <computeroutput>BZ_STREAM_END</computeroutput>
-denotes that <computeroutput>BZ2_bzDecompress</computeroutput>
-has detected the logical end of the compressed stream.
-<computeroutput>BZ2_bzDecompress</computeroutput> will not
-produce <computeroutput>BZ_STREAM_END</computeroutput> until all
-output data has been placed into the output buffer, so once
-<computeroutput>BZ_STREAM_END</computeroutput> appears, you are
-guaranteed to have available all the decompressed output, and
-<computeroutput>BZ2_bzDecompressEnd</computeroutput> can safely
-be called.</para>
-
-<para>If case of an error return value, you should call
-<computeroutput>BZ2_bzDecompressEnd</computeroutput> to clean up
-and release memory.</para>
-
-<para>Possible return values:</para>
-
-<programlisting>
-BZ_PARAM_ERROR
- if strm is NULL or strm->s is NULL
- or strm->avail_out < 1
-BZ_DATA_ERROR
- if a data integrity error is detected in the compressed stream
-BZ_DATA_ERROR_MAGIC
- if the compressed stream doesn't begin with the right magic bytes
-BZ_MEM_ERROR
- if there wasn't enough memory available
-BZ_STREAM_END
- if the logical end of the data stream was detected and all
- output in has been consumed, eg s-->avail_out > 0
-BZ_OK
- otherwise
-</programlisting>
-
-<para>Allowable next actions:</para>
-
-<programlisting>
-BZ2_bzDecompress
- if BZ_OK was returned
-BZ2_bzDecompressEnd
- otherwise
-</programlisting>
-
-</sect2>
-
-
-<sect2 id="bzDecompress-end" xreflabel="BZ2_bzDecompressEnd">
-<title><computeroutput>BZ2_bzDecompressEnd</computeroutput></title>
-
-<programlisting>
-int BZ2_bzDecompressEnd ( bz_stream *strm );
-</programlisting>
-
-<para>Releases all memory associated with a decompression
-stream.</para>
-
-<para>Possible return values:</para>
-
-<programlisting>
-BZ_PARAM_ERROR
- if strm is NULL or strm->s is NULL
-BZ_OK
- otherwise
-</programlisting>
-
-<para>Allowable next actions:</para>
-
-<programlisting>
- None.
-</programlisting>
-
-</sect2>
-
-</sect1>
-
-
-<sect1 id="hl-interface" xreflabel="High-level interface">
-<title>High-level interface</title>
-
-<para>This interface provides functions for reading and writing
-<computeroutput>bzip2</computeroutput> format files. First, some
-general points.</para>
-
-<itemizedlist mark='bullet'>
-
- <listitem><para>All of the functions take an
- <computeroutput>int*</computeroutput> first argument,
- <computeroutput>bzerror</computeroutput>. After each call,
- <computeroutput>bzerror</computeroutput> should be consulted
- first to determine the outcome of the call. If
- <computeroutput>bzerror</computeroutput> is
- <computeroutput>BZ_OK</computeroutput>, the call completed
- successfully, and only then should the return value of the
- function (if any) be consulted. If
- <computeroutput>bzerror</computeroutput> is
- <computeroutput>BZ_IO_ERROR</computeroutput>, there was an
- error reading/writing the underlying compressed file, and you
- should then consult <computeroutput>errno</computeroutput> /
- <computeroutput>perror</computeroutput> to determine the cause
- of the difficulty. <computeroutput>bzerror</computeroutput>
- may also be set to various other values; precise details are
- given on a per-function basis below.</para></listitem>
-
- <listitem><para>If <computeroutput>bzerror</computeroutput> indicates
- an error (ie, anything except
- <computeroutput>BZ_OK</computeroutput> and
- <computeroutput>BZ_STREAM_END</computeroutput>), you should
- immediately call
- <computeroutput>BZ2_bzReadClose</computeroutput> (or
- <computeroutput>BZ2_bzWriteClose</computeroutput>, depending on
- whether you are attempting to read or to write) to free up all
- resources associated with the stream. Once an error has been
- indicated, behaviour of all calls except
- <computeroutput>BZ2_bzReadClose</computeroutput>
- (<computeroutput>BZ2_bzWriteClose</computeroutput>) is
- undefined. The implication is that (1)
- <computeroutput>bzerror</computeroutput> should be checked
- after each call, and (2) if
- <computeroutput>bzerror</computeroutput> indicates an error,
- <computeroutput>BZ2_bzReadClose</computeroutput>
- (<computeroutput>BZ2_bzWriteClose</computeroutput>) should then
- be called to clean up.</para></listitem>
-
- <listitem><para>The <computeroutput>FILE*</computeroutput> arguments
- passed to <computeroutput>BZ2_bzReadOpen</computeroutput> /
- <computeroutput>BZ2_bzWriteOpen</computeroutput> should be set
- to binary mode. Most Unix systems will do this by default, but
- other platforms, including Windows and Mac, will not. If you
- omit this, you may encounter problems when moving code to new
- platforms.</para></listitem>
-
- <listitem><para>Memory allocation requests are handled by
- <computeroutput>malloc</computeroutput> /
- <computeroutput>free</computeroutput>. At present there is no
- facility for user-defined memory allocators in the file I/O
- functions (could easily be added, though).</para></listitem>
-
-</itemizedlist>
-
-
-
-<sect2 id="bzreadopen" xreflabel="BZ2_bzReadOpen">
-<title><computeroutput>BZ2_bzReadOpen</computeroutput></title>
-
-<programlisting>
-typedef void BZFILE;
-
-BZFILE *BZ2_bzReadOpen( int *bzerror, FILE *f,
- int verbosity, int small,
- void *unused, int nUnused );
-</programlisting>
-
-<para>Prepare to read compressed data from file handle
-<computeroutput>f</computeroutput>.
-<computeroutput>f</computeroutput> should refer to a file which
-has been opened for reading, and for which the error indicator
-(<computeroutput>ferror(f)</computeroutput>)is not set. If
-<computeroutput>small</computeroutput> is 1, the library will try
-to decompress using less memory, at the expense of speed.</para>
-
-<para>For reasons explained below,
-<computeroutput>BZ2_bzRead</computeroutput> will decompress the
-<computeroutput>nUnused</computeroutput> bytes starting at
-<computeroutput>unused</computeroutput>, before starting to read
-from the file <computeroutput>f</computeroutput>. At most
-<computeroutput>BZ_MAX_UNUSED</computeroutput> bytes may be
-supplied like this. If this facility is not required, you should
-pass <computeroutput>NULL</computeroutput> and
-<computeroutput>0</computeroutput> for
-<computeroutput>unused</computeroutput> and
-n<computeroutput>Unused</computeroutput> respectively.</para>
-
-<para>For the meaning of parameters
-<computeroutput>small</computeroutput> and
-<computeroutput>verbosity</computeroutput>, see
-<computeroutput>BZ2_bzDecompressInit</computeroutput>.</para>
-
-<para>The amount of memory needed to decompress a file cannot be
-determined until the file's header has been read. So it is
-possible that <computeroutput>BZ2_bzReadOpen</computeroutput>
-returns <computeroutput>BZ_OK</computeroutput> but a subsequent
-call of <computeroutput>BZ2_bzRead</computeroutput> will return
-<computeroutput>BZ_MEM_ERROR</computeroutput>.</para>
-
-<para>Possible assignments to
-<computeroutput>bzerror</computeroutput>:</para>
-
-<programlisting>
-BZ_CONFIG_ERROR
- if the library has been mis-compiled
-BZ_PARAM_ERROR
- if f is NULL
- or small is neither 0 nor 1
- or ( unused == NULL && nUnused != 0 )
- or ( unused != NULL && !(0 <= nUnused <= BZ_MAX_UNUSED) )
-BZ_IO_ERROR
- if ferror(f) is nonzero
-BZ_MEM_ERROR
- if insufficient memory is available
-BZ_OK
- otherwise.
-</programlisting>
-
-<para>Possible return values:</para>
-
-<programlisting>
-Pointer to an abstract BZFILE
- if bzerror is BZ_OK
-NULL
- otherwise
-</programlisting>
-
-<para>Allowable next actions:</para>
-
-<programlisting>
-BZ2_bzRead
- if bzerror is BZ_OK
-BZ2_bzClose
- otherwise
-</programlisting>
-
-</sect2>
-
-
-<sect2 id="bzread" xreflabel="BZ2_bzRead">
-<title><computeroutput>BZ2_bzRead</computeroutput></title>
-
-<programlisting>
-int BZ2_bzRead ( int *bzerror, BZFILE *b, void *buf, int len );
-</programlisting>
-
-<para>Reads up to <computeroutput>len</computeroutput>
-(uncompressed) bytes from the compressed file
-<computeroutput>b</computeroutput> into the buffer
-<computeroutput>buf</computeroutput>. If the read was
-successful, <computeroutput>bzerror</computeroutput> is set to
-<computeroutput>BZ_OK</computeroutput> and the number of bytes
-read is returned. If the logical end-of-stream was detected,
-<computeroutput>bzerror</computeroutput> will be set to
-<computeroutput>BZ_STREAM_END</computeroutput>, and the number of
-bytes read is returned. All other
-<computeroutput>bzerror</computeroutput> values denote an
-error.</para>
-
-<para><computeroutput>BZ2_bzRead</computeroutput> will supply
-<computeroutput>len</computeroutput> bytes, unless the logical
-stream end is detected or an error occurs. Because of this, it
-is possible to detect the stream end by observing when the number
-of bytes returned is less than the number requested.
-Nevertheless, this is regarded as inadvisable; you should instead
-check <computeroutput>bzerror</computeroutput> after every call
-and watch out for
-<computeroutput>BZ_STREAM_END</computeroutput>.</para>
-
-<para>Internally, <computeroutput>BZ2_bzRead</computeroutput>
-copies data from the compressed file in chunks of size
-<computeroutput>BZ_MAX_UNUSED</computeroutput> bytes before
-decompressing it. If the file contains more bytes than strictly
-needed to reach the logical end-of-stream,
-<computeroutput>BZ2_bzRead</computeroutput> will almost certainly
-read some of the trailing data before signalling
-<computeroutput>BZ_SEQUENCE_END</computeroutput>. To collect the
-read but unused data once
-<computeroutput>BZ_SEQUENCE_END</computeroutput> has appeared,
-call <computeroutput>BZ2_bzReadGetUnused</computeroutput>
-immediately before
-<computeroutput>BZ2_bzReadClose</computeroutput>.</para>
-
-<para>Possible assignments to
-<computeroutput>bzerror</computeroutput>:</para>
-
-<programlisting>
-BZ_PARAM_ERROR
- if b is NULL or buf is NULL or len < 0
-BZ_SEQUENCE_ERROR
- if b was opened with BZ2_bzWriteOpen
-BZ_IO_ERROR
- if there is an error reading from the compressed file
-BZ_UNEXPECTED_EOF
- if the compressed file ended before
- the logical end-of-stream was detected
-BZ_DATA_ERROR
- if a data integrity error was detected in the compressed stream
-BZ_DATA_ERROR_MAGIC
- if the stream does not begin with the requisite header bytes
- (ie, is not a bzip2 data file). This is really
- a special case of BZ_DATA_ERROR.
-BZ_MEM_ERROR
- if insufficient memory was available
-BZ_STREAM_END
- if the logical end of stream was detected.
-BZ_OK
- otherwise.
-</programlisting>
-
-<para>Possible return values:</para>
-
-<programlisting>
-number of bytes read
- if bzerror is BZ_OK or BZ_STREAM_END
-undefined
- otherwise
-</programlisting>
-
-<para>Allowable next actions:</para>
-
-<programlisting>
-collect data from buf, then BZ2_bzRead or BZ2_bzReadClose
- if bzerror is BZ_OK
-collect data from buf, then BZ2_bzReadClose or BZ2_bzReadGetUnused
- if bzerror is BZ_SEQUENCE_END
-BZ2_bzReadClose
- otherwise
-</programlisting>
-
-</sect2>
-
-
-<sect2 id="bzreadgetunused" xreflabel="BZ2_bzReadGetUnused">
-<title><computeroutput>BZ2_bzReadGetUnused</computeroutput></title>
-
-<programlisting>
-void BZ2_bzReadGetUnused( int* bzerror, BZFILE *b,
- void** unused, int* nUnused );
-</programlisting>
-
-<para>Returns data which was read from the compressed file but
-was not needed to get to the logical end-of-stream.
-<computeroutput>*unused</computeroutput> is set to the address of
-the data, and <computeroutput>*nUnused</computeroutput> to the
-number of bytes. <computeroutput>*nUnused</computeroutput> will
-be set to a value between <computeroutput>0</computeroutput> and
-<computeroutput>BZ_MAX_UNUSED</computeroutput> inclusive.</para>
-
-<para>This function may only be called once
-<computeroutput>BZ2_bzRead</computeroutput> has signalled
-<computeroutput>BZ_STREAM_END</computeroutput> but before
-<computeroutput>BZ2_bzReadClose</computeroutput>.</para>
-
-<para>Possible assignments to
-<computeroutput>bzerror</computeroutput>:</para>
-
-<programlisting>
-BZ_PARAM_ERROR
- if b is NULL
- or unused is NULL or nUnused is NULL
-BZ_SEQUENCE_ERROR
- if BZ_STREAM_END has not been signalled
- or if b was opened with BZ2_bzWriteOpen
-BZ_OK
- otherwise
-</programlisting>
-
-<para>Allowable next actions:</para>
-
-<programlisting>
-BZ2_bzReadClose
-</programlisting>
-
-</sect2>
-
-
-<sect2 id="bzreadclose" xreflabel="BZ2_bzReadClose">
-<title><computeroutput>BZ2_bzReadClose</computeroutput></title>
-
-<programlisting>
-void BZ2_bzReadClose ( int *bzerror, BZFILE *b );
-</programlisting>
-
-<para>Releases all memory pertaining to the compressed file
-<computeroutput>b</computeroutput>.
-<computeroutput>BZ2_bzReadClose</computeroutput> does not call
-<computeroutput>fclose</computeroutput> on the underlying file
-handle, so you should do that yourself if appropriate.
-<computeroutput>BZ2_bzReadClose</computeroutput> should be called
-to clean up after all error situations.</para>
-
-<para>Possible assignments to
-<computeroutput>bzerror</computeroutput>:</para>
-
-<programlisting>
-BZ_SEQUENCE_ERROR
- if b was opened with BZ2_bzOpenWrite
-BZ_OK
- otherwise
-</programlisting>
-
-<para>Allowable next actions:</para>
-
-<programlisting>
-none
-</programlisting>
-
-</sect2>
-
-
-<sect2 id="bzwriteopen" xreflabel="BZ2_bzWriteOpen">
-<title><computeroutput>BZ2_bzWriteOpen</computeroutput></title>
-
-<programlisting>
-BZFILE *BZ2_bzWriteOpen( int *bzerror, FILE *f,
- int blockSize100k, int verbosity,
- int workFactor );
-</programlisting>
-
-<para>Prepare to write compressed data to file handle
-<computeroutput>f</computeroutput>.
-<computeroutput>f</computeroutput> should refer to a file which
-has been opened for writing, and for which the error indicator
-(<computeroutput>ferror(f)</computeroutput>)is not set.</para>
-
-<para>For the meaning of parameters
-<computeroutput>blockSize100k</computeroutput>,
-<computeroutput>verbosity</computeroutput> and
-<computeroutput>workFactor</computeroutput>, see
-<computeroutput>BZ2_bzCompressInit</computeroutput>.</para>
-
-<para>All required memory is allocated at this stage, so if the
-call completes successfully,
-<computeroutput>BZ_MEM_ERROR</computeroutput> cannot be signalled
-by a subsequent call to
-<computeroutput>BZ2_bzWrite</computeroutput>.</para>
-
-<para>Possible assignments to
-<computeroutput>bzerror</computeroutput>:</para>
-
-<programlisting>
-BZ_CONFIG_ERROR
- if the library has been mis-compiled
-BZ_PARAM_ERROR
- if f is NULL
- or blockSize100k < 1 or blockSize100k > 9
-BZ_IO_ERROR
- if ferror(f) is nonzero
-BZ_MEM_ERROR
- if insufficient memory is available
-BZ_OK
- otherwise
-</programlisting>
-
-<para>Possible return values:</para>
-
-<programlisting>
-Pointer to an abstract BZFILE
- if bzerror is BZ_OK
-NULL
- otherwise
-</programlisting>
-
-<para>Allowable next actions:</para>
-
-<programlisting>
-BZ2_bzWrite
- if bzerror is BZ_OK
- (you could go directly to BZ2_bzWriteClose, but this would be pretty pointless)
-BZ2_bzWriteClose
- otherwise
-</programlisting>
-
-</sect2>
-
-
-<sect2 id="bzwrite" xreflabel="BZ2_bzWrite">
-<title><computeroutput>BZ2_bzWrite</computeroutput></title>
-
-<programlisting>
-void BZ2_bzWrite ( int *bzerror, BZFILE *b, void *buf, int len );
-</programlisting>
-
-<para>Absorbs <computeroutput>len</computeroutput> bytes from the
-buffer <computeroutput>buf</computeroutput>, eventually to be
-compressed and written to the file.</para>
-
-<para>Possible assignments to
-<computeroutput>bzerror</computeroutput>:</para>
-
-<programlisting>
-BZ_PARAM_ERROR
- if b is NULL or buf is NULL or len < 0
-BZ_SEQUENCE_ERROR
- if b was opened with BZ2_bzReadOpen
-BZ_IO_ERROR
- if there is an error writing the compressed file.
-BZ_OK
- otherwise
-</programlisting>
-
-</sect2>
-
-
-<sect2 id="bzwriteclose" xreflabel="BZ2_bzWriteClose">
-<title><computeroutput>BZ2_bzWriteClose</computeroutput></title>
-
-<programlisting>
-void BZ2_bzWriteClose( int *bzerror, BZFILE* f,
- int abandon,
- unsigned int* nbytes_in,
- unsigned int* nbytes_out );
-
-void BZ2_bzWriteClose64( int *bzerror, BZFILE* f,
- int abandon,
- unsigned int* nbytes_in_lo32,
- unsigned int* nbytes_in_hi32,
- unsigned int* nbytes_out_lo32,
- unsigned int* nbytes_out_hi32 );
-</programlisting>
-
-<para>Compresses and flushes to the compressed file all data so
-far supplied by <computeroutput>BZ2_bzWrite</computeroutput>.
-The logical end-of-stream markers are also written, so subsequent
-calls to <computeroutput>BZ2_bzWrite</computeroutput> are
-illegal. All memory associated with the compressed file
-<computeroutput>b</computeroutput> is released.
-<computeroutput>fflush</computeroutput> is called on the
-compressed file, but it is not
-<computeroutput>fclose</computeroutput>'d.</para>
-
-<para>If <computeroutput>BZ2_bzWriteClose</computeroutput> is
-called to clean up after an error, the only action is to release
-the memory. The library records the error codes issued by
-previous calls, so this situation will be detected automatically.
-There is no attempt to complete the compression operation, nor to
-<computeroutput>fflush</computeroutput> the compressed file. You
-can force this behaviour to happen even in the case of no error,
-by passing a nonzero value to
-<computeroutput>abandon</computeroutput>.</para>
-
-<para>If <computeroutput>nbytes_in</computeroutput> is non-null,
-<computeroutput>*nbytes_in</computeroutput> will be set to be the
-total volume of uncompressed data handled. Similarly,
-<computeroutput>nbytes_out</computeroutput> will be set to the
-total volume of compressed data written. For compatibility with
-older versions of the library,
-<computeroutput>BZ2_bzWriteClose</computeroutput> only yields the
-lower 32 bits of these counts. Use
-<computeroutput>BZ2_bzWriteClose64</computeroutput> if you want
-the full 64 bit counts. These two functions are otherwise
-absolutely identical.</para>
-
-<para>Possible assignments to
-<computeroutput>bzerror</computeroutput>:</para>
-
-<programlisting>
-BZ_SEQUENCE_ERROR
- if b was opened with BZ2_bzReadOpen
-BZ_IO_ERROR
- if there is an error writing the compressed file
-BZ_OK
- otherwise
-</programlisting>
-
-</sect2>
-
-
-<sect2 id="embed" xreflabel="Handling embedded compressed data streams">
-<title>Handling embedded compressed data streams</title>
-
-<para>The high-level library facilitates use of
-<computeroutput>bzip2</computeroutput> data streams which form
-some part of a surrounding, larger data stream.</para>
-
-<itemizedlist mark='bullet'>
-
- <listitem><para>For writing, the library takes an open file handle,
- writes compressed data to it,
- <computeroutput>fflush</computeroutput>es it but does not
- <computeroutput>fclose</computeroutput> it. The calling
- application can write its own data before and after the
- compressed data stream, using that same file handle.</para></listitem>
-
- <listitem><para>Reading is more complex, and the facilities are not as
- general as they could be since generality is hard to reconcile
- with efficiency. <computeroutput>BZ2_bzRead</computeroutput>
- reads from the compressed file in blocks of size
- <computeroutput>BZ_MAX_UNUSED</computeroutput> bytes, and in
- doing so probably will overshoot the logical end of compressed
- stream. To recover this data once decompression has ended,
- call <computeroutput>BZ2_bzReadGetUnused</computeroutput> after
- the last call of <computeroutput>BZ2_bzRead</computeroutput>
- (the one returning
- <computeroutput>BZ_STREAM_END</computeroutput>) but before
- calling
- <computeroutput>BZ2_bzReadClose</computeroutput>.</para></listitem>
-
-</itemizedlist>
-
-<para>This mechanism makes it easy to decompress multiple
-<computeroutput>bzip2</computeroutput> streams placed end-to-end.
-As the end of one stream, when
-<computeroutput>BZ2_bzRead</computeroutput> returns
-<computeroutput>BZ_STREAM_END</computeroutput>, call
-<computeroutput>BZ2_bzReadGetUnused</computeroutput> to collect
-the unused data (copy it into your own buffer somewhere). That
-data forms the start of the next compressed stream. To start
-uncompressing that next stream, call
-<computeroutput>BZ2_bzReadOpen</computeroutput> again, feeding in
-the unused data via the <computeroutput>unused</computeroutput> /
-<computeroutput>nUnused</computeroutput> parameters. Keep doing
-this until <computeroutput>BZ_STREAM_END</computeroutput> return
-coincides with the physical end of file
-(<computeroutput>feof(f)</computeroutput>). In this situation
-<computeroutput>BZ2_bzReadGetUnused</computeroutput> will of
-course return no data.</para>
-
-<para>This should give some feel for how the high-level interface
-can be used. If you require extra flexibility, you'll have to
-bite the bullet and get to grips with the low-level
-interface.</para>
-
-</sect2>
-
-
-<sect2 id="std-rdwr" xreflabel="Standard file-reading/writing code">
-<title>Standard file-reading/writing code</title>
-
-<para>Here's how you'd write data to a compressed file:</para>
-
-<programlisting>
-FILE* f;
-BZFILE* b;
-int nBuf;
-char buf[ /* whatever size you like */ ];
-int bzerror;
-int nWritten;
-
-f = fopen ( "myfile.bz2", "w" );
-if ( !f ) {
- /* handle error */
-}
-b = BZ2_bzWriteOpen( &bzerror, f, 9 );
-if (bzerror != BZ_OK) {
- BZ2_bzWriteClose ( b );
- /* handle error */
-}
-
-while ( /* condition */ ) {
- /* get data to write into buf, and set nBuf appropriately */
- nWritten = BZ2_bzWrite ( &bzerror, b, buf, nBuf );
- if (bzerror == BZ_IO_ERROR) {
- BZ2_bzWriteClose ( &bzerror, b );
- /* handle error */
- }
-}
-
-BZ2_bzWriteClose( &bzerror, b );
-if (bzerror == BZ_IO_ERROR) {
- /* handle error */
-}
-</programlisting>
-
-<para>And to read from a compressed file:</para>
-
-<programlisting>
-FILE* f;
-BZFILE* b;
-int nBuf;
-char buf[ /* whatever size you like */ ];
-int bzerror;
-int nWritten;
-
-f = fopen ( "myfile.bz2", "r" );
-if ( !f ) {
- /* handle error */
-}
-b = BZ2_bzReadOpen ( &bzerror, f, 0, NULL, 0 );
-if ( bzerror != BZ_OK ) {
- BZ2_bzReadClose ( &bzerror, b );
- /* handle error */
-}
-
-bzerror = BZ_OK;
-while ( bzerror == BZ_OK && /* arbitrary other conditions */) {
- nBuf = BZ2_bzRead ( &bzerror, b, buf, /* size of buf */ );
- if ( bzerror == BZ_OK ) {
- /* do something with buf[0 .. nBuf-1] */
- }
-}
-if ( bzerror != BZ_STREAM_END ) {
- BZ2_bzReadClose ( &bzerror, b );
- /* handle error */
-} else {
- BZ2_bzReadClose ( &bzerror, b );
-}
-</programlisting>
-
-</sect2>
-
-</sect1>
-
-
-<sect1 id="util-fns" xreflabel="Utility functions">
-<title>Utility functions</title>
-
-
-<sect2 id="bzbufftobuffcompress" xreflabel="BZ2_bzBuffToBuffCompress">
-<title><computeroutput>BZ2_bzBuffToBuffCompress</computeroutput></title>
-
-<programlisting>
-int BZ2_bzBuffToBuffCompress( char* dest,
- unsigned int* destLen,
- char* source,
- unsigned int sourceLen,
- int blockSize100k,
- int verbosity,
- int workFactor );
-</programlisting>
-
-<para>Attempts to compress the data in <computeroutput>source[0
-.. sourceLen-1]</computeroutput> into the destination buffer,
-<computeroutput>dest[0 .. *destLen-1]</computeroutput>. If the
-destination buffer is big enough,
-<computeroutput>*destLen</computeroutput> is set to the size of
-the compressed data, and <computeroutput>BZ_OK</computeroutput>
-is returned. If the compressed data won't fit,
-<computeroutput>*destLen</computeroutput> is unchanged, and
-<computeroutput>BZ_OUTBUFF_FULL</computeroutput> is
-returned.</para>
-
-<para>Compression in this manner is a one-shot event, done with a
-single call to this function. The resulting compressed data is a
-complete <computeroutput>bzip2</computeroutput> format data
-stream. There is no mechanism for making additional calls to
-provide extra input data. If you want that kind of mechanism,
-use the low-level interface.</para>
-
-<para>For the meaning of parameters
-<computeroutput>blockSize100k</computeroutput>,
-<computeroutput>verbosity</computeroutput> and
-<computeroutput>workFactor</computeroutput>, see
-<computeroutput>BZ2_bzCompressInit</computeroutput>.</para>
-
-<para>To guarantee that the compressed data will fit in its
-buffer, allocate an output buffer of size 1% larger than the
-uncompressed data, plus six hundred extra bytes.</para>
-
-<para><computeroutput>BZ2_bzBuffToBuffDecompress</computeroutput>
-will not write data at or beyond
-<computeroutput>dest[*destLen]</computeroutput>, even in case of
-buffer overflow.</para>
-
-<para>Possible return values:</para>
-
-<programlisting>
-BZ_CONFIG_ERROR
- if the library has been mis-compiled
-BZ_PARAM_ERROR
- if dest is NULL or destLen is NULL
- or blockSize100k < 1 or blockSize100k > 9
- or verbosity < 0 or verbosity > 4
- or workFactor < 0 or workFactor > 250
-BZ_MEM_ERROR
- if insufficient memory is available
-BZ_OUTBUFF_FULL
- if the size of the compressed data exceeds *destLen
-BZ_OK
- otherwise
-</programlisting>
-
-</sect2>
-
-
-<sect2 id="bzbufftobuffdecompress" xreflabel="BZ2_bzBuffToBuffDecompress">
-<title><computeroutput>BZ2_bzBuffToBuffDecompress</computeroutput></title>
-
-<programlisting>
-int BZ2_bzBuffToBuffDecompress( char* dest,
- unsigned int* destLen,
- char* source,
- unsigned int sourceLen,
- int small,
- int verbosity );
-</programlisting>
-
-<para>Attempts to decompress the data in <computeroutput>source[0
-.. sourceLen-1]</computeroutput> into the destination buffer,
-<computeroutput>dest[0 .. *destLen-1]</computeroutput>. If the
-destination buffer is big enough,
-<computeroutput>*destLen</computeroutput> is set to the size of
-the uncompressed data, and <computeroutput>BZ_OK</computeroutput>
-is returned. If the compressed data won't fit,
-<computeroutput>*destLen</computeroutput> is unchanged, and
-<computeroutput>BZ_OUTBUFF_FULL</computeroutput> is
-returned.</para>
-
-<para><computeroutput>source</computeroutput> is assumed to hold
-a complete <computeroutput>bzip2</computeroutput> format data
-stream.
-<computeroutput>BZ2_bzBuffToBuffDecompress</computeroutput> tries
-to decompress the entirety of the stream into the output
-buffer.</para>
-
-<para>For the meaning of parameters
-<computeroutput>small</computeroutput> and
-<computeroutput>verbosity</computeroutput>, see
-<computeroutput>BZ2_bzDecompressInit</computeroutput>.</para>
-
-<para>Because the compression ratio of the compressed data cannot
-be known in advance, there is no easy way to guarantee that the
-output buffer will be big enough. You may of course make
-arrangements in your code to record the size of the uncompressed
-data, but such a mechanism is beyond the scope of this
-library.</para>
-
-<para><computeroutput>BZ2_bzBuffToBuffDecompress</computeroutput>
-will not write data at or beyond
-<computeroutput>dest[*destLen]</computeroutput>, even in case of
-buffer overflow.</para>
-
-<para>Possible return values:</para>
-
-<programlisting>
-BZ_CONFIG_ERROR
- if the library has been mis-compiled
-BZ_PARAM_ERROR
- if dest is NULL or destLen is NULL
- or small != 0 && small != 1
- or verbosity < 0 or verbosity > 4
-BZ_MEM_ERROR
- if insufficient memory is available
-BZ_OUTBUFF_FULL
- if the size of the compressed data exceeds *destLen
-BZ_DATA_ERROR
- if a data integrity error was detected in the compressed data
-BZ_DATA_ERROR_MAGIC
- if the compressed data doesn't begin with the right magic bytes
-BZ_UNEXPECTED_EOF
- if the compressed data ends unexpectedly
-BZ_OK
- otherwise
-</programlisting>
-
-</sect2>
-
-</sect1>
-
-
-<sect1 id="zlib-compat" xreflabel="zlib compatibility functions">
-<title><computeroutput>zlib</computeroutput> compatibility functions</title>
-
-<para>Yoshioka Tsuneo has contributed some functions to give
-better <computeroutput>zlib</computeroutput> compatibility.
-These functions are <computeroutput>BZ2_bzopen</computeroutput>,
-<computeroutput>BZ2_bzread</computeroutput>,
-<computeroutput>BZ2_bzwrite</computeroutput>,
-<computeroutput>BZ2_bzflush</computeroutput>,
-<computeroutput>BZ2_bzclose</computeroutput>,
-<computeroutput>BZ2_bzerror</computeroutput> and
-<computeroutput>BZ2_bzlibVersion</computeroutput>. These
-functions are not (yet) officially part of the library. If they
-break, you get to keep all the pieces. Nevertheless, I think
-they work ok.</para>
-
-<programlisting>
-typedef void BZFILE;
-
-const char * BZ2_bzlibVersion ( void );
-</programlisting>
-
-<para>Returns a string indicating the library version.</para>
-
-<programlisting>
-BZFILE * BZ2_bzopen ( const char *path, const char *mode );
-BZFILE * BZ2_bzdopen ( int fd, const char *mode );
-</programlisting>
-
-<para>Opens a <computeroutput>.bz2</computeroutput> file for
-reading or writing, using either its name or a pre-existing file
-descriptor. Analogous to <computeroutput>fopen</computeroutput>
-and <computeroutput>fdopen</computeroutput>.</para>
-
-<programlisting>
-int BZ2_bzread ( BZFILE* b, void* buf, int len );
-int BZ2_bzwrite ( BZFILE* b, void* buf, int len );
-</programlisting>
-
-<para>Reads/writes data from/to a previously opened
-<computeroutput>BZFILE</computeroutput>. Analogous to
-<computeroutput>fread</computeroutput> and
-<computeroutput>fwrite</computeroutput>.</para>
-
-<programlisting>
-int BZ2_bzflush ( BZFILE* b );
-void BZ2_bzclose ( BZFILE* b );
-</programlisting>
-
-<para>Flushes/closes a <computeroutput>BZFILE</computeroutput>.
-<computeroutput>BZ2_bzflush</computeroutput> doesn't actually do
-anything. Analogous to <computeroutput>fflush</computeroutput>
-and <computeroutput>fclose</computeroutput>.</para>
-
-<programlisting>
-const char * BZ2_bzerror ( BZFILE *b, int *errnum )
-</programlisting>
-
-<para>Returns a string describing the more recent error status of
-<computeroutput>b</computeroutput>, and also sets
-<computeroutput>*errnum</computeroutput> to its numerical
-value.</para>
-
-</sect1>
-
-
-<sect1 id="stdio-free"
- xreflabel="Using the library in a stdio-free environment">
-<title>Using the library in a <computeroutput>stdio</computeroutput>-free environment</title>
-
-
-<sect2 id="stdio-bye" xreflabel="Getting rid of stdio">
-<title>Getting rid of <computeroutput>stdio</computeroutput></title>
-
-<para>In a deeply embedded application, you might want to use
-just the memory-to-memory functions. You can do this
-conveniently by compiling the library with preprocessor symbol
-<computeroutput>BZ_NO_STDIO</computeroutput> defined. Doing this
-gives you a library containing only the following eight
-functions:</para>
-
-<para><computeroutput>BZ2_bzCompressInit</computeroutput>,
-<computeroutput>BZ2_bzCompress</computeroutput>,
-<computeroutput>BZ2_bzCompressEnd</computeroutput>
-<computeroutput>BZ2_bzDecompressInit</computeroutput>,
-<computeroutput>BZ2_bzDecompress</computeroutput>,
-<computeroutput>BZ2_bzDecompressEnd</computeroutput>
-<computeroutput>BZ2_bzBuffToBuffCompress</computeroutput>,
-<computeroutput>BZ2_bzBuffToBuffDecompress</computeroutput></para>
-
-<para>When compiled like this, all functions will ignore
-<computeroutput>verbosity</computeroutput> settings.</para>
-
-</sect2>
-
-
-<sect2 id="critical-error" xreflabel="Critical error handling">
-<title>Critical error handling</title>
-
-<para><computeroutput>libbzip2</computeroutput> contains a number
-of internal assertion checks which should, needless to say, never
-be activated. Nevertheless, if an assertion should fail,
-behaviour depends on whether or not the library was compiled with
-<computeroutput>BZ_NO_STDIO</computeroutput> set.</para>
-
-<para>For a normal compile, an assertion failure yields the
-message:</para>
-
-<blockquote>
-<para>bzip2/libbzip2: internal error number N.</para>
-<para>This is a bug in bzip2/libbzip2, &bz-version; of &bz-date;.
-Please report it to me at: &bz-email;. If this happened
-when you were using some program which uses libbzip2 as a
-component, you should also report this bug to the author(s)
-of that program. Please make an effort to report this bug;
-timely and accurate bug reports eventually lead to higher
-quality software. Thanks. Julian Seward, &bz-date;.
-</para></blockquote>
-
-<para>where <computeroutput>N</computeroutput> is some error code
-number. If <computeroutput>N == 1007</computeroutput>, it also
-prints some extra text advising the reader that unreliable memory
-is often associated with internal error 1007. (This is a
-frequently-observed-phenomenon with versions 1.0.0/1.0.1).</para>
-
-<para><computeroutput>exit(3)</computeroutput> is then
-called.</para>
-
-<para>For a <computeroutput>stdio</computeroutput>-free library,
-assertion failures result in a call to a function declared
-as:</para>
-
-<programlisting>
-extern void bz_internal_error ( int errcode );
-</programlisting>
-
-<para>The relevant code is passed as a parameter. You should
-supply such a function.</para>
-
-<para>In either case, once an assertion failure has occurred, any
-<computeroutput>bz_stream</computeroutput> records involved can
-be regarded as invalid. You should not attempt to resume normal
-operation with them.</para>
-
-<para>You may, of course, change critical error handling to suit
-your needs. As I said above, critical errors indicate bugs in
-the library and should not occur. All "normal" error situations
-are indicated via error return codes from functions, and can be
-recovered from.</para>
-
-</sect2>
-
-</sect1>
-
-
-<sect1 id="win-dll" xreflabel="Making a Windows DLL">
-<title>Making a Windows DLL</title>
-
-<para>Everything related to Windows has been contributed by
-Yoshioka Tsuneo
-(<computeroutput>tsuneo@rr.iij4u.or.jp</computeroutput>), so
-you should send your queries to him (but perhaps Cc: me,
-<computeroutput>&bz-email;</computeroutput>).</para>
-
-<para>My vague understanding of what to do is: using Visual C++
-5.0, open the project file
-<computeroutput>libbz2.dsp</computeroutput>, and build. That's
-all.</para>
-
-<para>If you can't open the project file for some reason, make a
-new one, naming these files:
-<computeroutput>blocksort.c</computeroutput>,
-<computeroutput>bzlib.c</computeroutput>,
-<computeroutput>compress.c</computeroutput>,
-<computeroutput>crctable.c</computeroutput>,
-<computeroutput>decompress.c</computeroutput>,
-<computeroutput>huffman.c</computeroutput>,
-<computeroutput>randtable.c</computeroutput> and
-<computeroutput>libbz2.def</computeroutput>. You will also need
-to name the header files <computeroutput>bzlib.h</computeroutput>
-and <computeroutput>bzlib_private.h</computeroutput>.</para>
-
-<para>If you don't use VC++, you may need to define the
-proprocessor symbol
-<computeroutput>_WIN32</computeroutput>.</para>
-
-<para>Finally, <computeroutput>dlltest.c</computeroutput> is a
-sample program using the DLL. It has a project file,
-<computeroutput>dlltest.dsp</computeroutput>.</para>
-
-<para>If you just want a makefile for Visual C, have a look at
-<computeroutput>makefile.msc</computeroutput>.</para>
-
-<para>Be aware that if you compile
-<computeroutput>bzip2</computeroutput> itself on Win32, you must
-set <computeroutput>BZ_UNIX</computeroutput> to 0 and
-<computeroutput>BZ_LCCWIN32</computeroutput> to 1, in the file
-<computeroutput>bzip2.c</computeroutput>, before compiling.
-Otherwise the resulting binary won't work correctly.</para>
-
-<para>I haven't tried any of this stuff myself, but it all looks
-plausible.</para>
-
-</sect1>
-
-</chapter>
-
-
-
-<chapter id="misc" xreflabel="Miscellanea">
-<title>Miscellanea</title>
-
-<para>These are just some random thoughts of mine. Your mileage
-may vary.</para>
-
-
-<sect1 id="limits" xreflabel="Limitations of the compressed file format">
-<title>Limitations of the compressed file format</title>
-
-<para><computeroutput>bzip2-1.0.X</computeroutput>,
-<computeroutput>0.9.5</computeroutput> and
-<computeroutput>0.9.0</computeroutput> use exactly the same file
-format as the original version,
-<computeroutput>bzip2-0.1</computeroutput>. This decision was
-made in the interests of stability. Creating yet another
-incompatible compressed file format would create further
-confusion and disruption for users.</para>
-
-<para>Nevertheless, this is not a painless decision. Development
-work since the release of
-<computeroutput>bzip2-0.1</computeroutput> in August 1997 has
-shown complexities in the file format which slow down
-decompression and, in retrospect, are unnecessary. These
-are:</para>
-
-<itemizedlist mark='bullet'>
-
- <listitem><para>The run-length encoder, which is the first of the
- compression transformations, is entirely irrelevant. The
- original purpose was to protect the sorting algorithm from the
- very worst case input: a string of repeated symbols. But
- algorithm steps Q6a and Q6b in the original Burrows-Wheeler
- technical report (SRC-124) show how repeats can be handled
- without difficulty in block sorting.</para></listitem>
-
- <listitem><para>The randomisation mechanism doesn't really need to be
- there. Udi Manber and Gene Myers published a suffix array
- construction algorithm a few years back, which can be employed
- to sort any block, no matter how repetitive, in O(N log N)
- time. Subsequent work by Kunihiko Sadakane has produced a
- derivative O(N (log N)^2) algorithm which usually outperforms
- the Manber-Myers algorithm.</para>
-
- <para>I could have changed to Sadakane's algorithm, but I find
- it to be slower than <computeroutput>bzip2</computeroutput>'s
- existing algorithm for most inputs, and the randomisation
- mechanism protects adequately against bad cases. I didn't
- think it was a good tradeoff to make. Partly this is due to
- the fact that I was not flooded with email complaints about
- <computeroutput>bzip2-0.1</computeroutput>'s performance on
- repetitive data, so perhaps it isn't a problem for real
- inputs.</para>
-
- <para>Probably the best long-term solution, and the one I have
- incorporated into 0.9.5 and above, is to use the existing
- sorting algorithm initially, and fall back to a O(N (log N)^2)
- algorithm if the standard algorithm gets into
- difficulties.</para></listitem>
-
- <listitem><para>The compressed file format was never designed to be
- handled by a library, and I have had to jump though some hoops
- to produce an efficient implementation of decompression. It's
- a bit hairy. Try passing
- <computeroutput>decompress.c</computeroutput> through the C
- preprocessor and you'll see what I mean. Much of this
- complexity could have been avoided if the compressed size of
- each block of data was recorded in the data stream.</para></listitem>
-
- <listitem><para>An Adler-32 checksum, rather than a CRC32 checksum,
- would be faster to compute.</para></listitem>
-
-</itemizedlist>
-
-<para>It would be fair to say that the
-<computeroutput>bzip2</computeroutput> format was frozen before I
-properly and fully understood the performance consequences of
-doing so.</para>
-
-<para>Improvements which I was able to incorporate into 0.9.0,
-despite using the same file format, are:</para>
-
-<itemizedlist mark='bullet'>
-
- <listitem><para>Single array implementation of the inverse BWT. This
- significantly speeds up decompression, presumably because it
- reduces the number of cache misses.</para></listitem>
-
- <listitem><para>Faster inverse MTF transform for large MTF values.
- The new implementation is based on the notion of sliding blocks
- of values.</para></listitem>
-
- <listitem><para><computeroutput>bzip2-0.9.0</computeroutput> now reads
- and writes files with <computeroutput>fread</computeroutput>
- and <computeroutput>fwrite</computeroutput>; version 0.1 used
- <computeroutput>putc</computeroutput> and
- <computeroutput>getc</computeroutput>. Duh! Well, you live
- and learn.</para></listitem>
-
-</itemizedlist>
-
-<para>Further ahead, it would be nice to be able to do random
-access into files. This will require some careful design of
-compressed file formats.</para>
-
-</sect1>
-
-
-<sect1 id="port-issues" xreflabel="Portability issues">
-<title>Portability issues</title>
-
-<para>After some consideration, I have decided not to use GNU
-<computeroutput>autoconf</computeroutput> to configure 0.9.5 or
-1.0.</para>
-
-<para><computeroutput>autoconf</computeroutput>, admirable and
-wonderful though it is, mainly assists with portability problems
-between Unix-like platforms. But
-<computeroutput>bzip2</computeroutput> doesn't have much in the
-way of portability problems on Unix; most of the difficulties
-appear when porting to the Mac, or to Microsoft's operating
-systems. <computeroutput>autoconf</computeroutput> doesn't help
-in those cases, and brings in a whole load of new
-complexity.</para>
-
-<para>Most people should be able to compile the library and
-program under Unix straight out-of-the-box, so to speak,
-especially if you have a version of GNU C available.</para>
-
-<para>There are a couple of
-<computeroutput>__inline__</computeroutput> directives in the
-code. GNU C (<computeroutput>gcc</computeroutput>) should be
-able to handle them. If you're not using GNU C, your C compiler
-shouldn't see them at all. If your compiler does, for some
-reason, see them and doesn't like them, just
-<computeroutput>#define</computeroutput>
-<computeroutput>__inline__</computeroutput> to be
-<computeroutput>/* */</computeroutput>. One easy way to do this
-is to compile with the flag
-<computeroutput>-D__inline__=</computeroutput>, which should be
-understood by most Unix compilers.</para>
-
-<para>If you still have difficulties, try compiling with the
-macro <computeroutput>BZ_STRICT_ANSI</computeroutput> defined.
-This should enable you to build the library in a strictly ANSI
-compliant environment. Building the program itself like this is
-dangerous and not supported, since you remove
-<computeroutput>bzip2</computeroutput>'s checks against
-compressing directories, symbolic links, devices, and other
-not-really-a-file entities. This could cause filesystem
-corruption!</para>
-
-<para>One other thing: if you create a
-<computeroutput>bzip2</computeroutput> binary for public distribution,
-please consider linking it statically (<computeroutput>gcc
--static</computeroutput>). This avoids all sorts of library-version
-issues that others may encounter later on.</para>
-
-<para>If you build <computeroutput>bzip2</computeroutput> on
-Win32, you must set <computeroutput>BZ_UNIX</computeroutput> to 0
-and <computeroutput>BZ_LCCWIN32</computeroutput> to 1, in the
-file <computeroutput>bzip2.c</computeroutput>, before compiling.
-Otherwise the resulting binary won't work correctly.</para>
-
-</sect1>
-
-
-<sect1 id="bugs" xreflabel="Reporting bugs">
-<title>Reporting bugs</title>
-
-<para>I tried pretty hard to make sure
-<computeroutput>bzip2</computeroutput> is bug free, both by
-design and by testing. Hopefully you'll never need to read this
-section for real.</para>
-
-<para>Nevertheless, if <computeroutput>bzip2</computeroutput> dies
-with a segmentation fault, a bus error or an internal assertion
-failure, it will ask you to email me a bug report. Experience from
-years of feedback of bzip2 users indicates that almost all these
-problems can be traced to either compiler bugs or hardware
-problems.</para>
-
-<itemizedlist mark='bullet'>
-
- <listitem><para>Recompile the program with no optimisation, and
- see if it works. And/or try a different compiler. I heard all
- sorts of stories about various flavours of GNU C (and other
- compilers) generating bad code for
- <computeroutput>bzip2</computeroutput>, and I've run across two
- such examples myself.</para>
-
- <para>2.7.X versions of GNU C are known to generate bad code
- from time to time, at high optimisation levels. If you get
- problems, try using the flags
- <computeroutput>-O2</computeroutput>
- <computeroutput>-fomit-frame-pointer</computeroutput>
- <computeroutput>-fno-strength-reduce</computeroutput>. You
- should specifically <emphasis>not</emphasis> use
- <computeroutput>-funroll-loops</computeroutput>.</para>
-
- <para>You may notice that the Makefile runs six tests as part
- of the build process. If the program passes all of these, it's
- a pretty good (but not 100%) indication that the compiler has
- done its job correctly.</para></listitem>
-
- <listitem><para>If <computeroutput>bzip2</computeroutput>
- crashes randomly, and the crashes are not repeatable, you may
- have a flaky memory subsystem.
- <computeroutput>bzip2</computeroutput> really hammers your
- memory hierarchy, and if it's a bit marginal, you may get these
- problems. Ditto if your disk or I/O subsystem is slowly
- failing. Yup, this really does happen.</para>
-
- <para>Try using a different machine of the same type, and see
- if you can repeat the problem.</para></listitem>
-
- <listitem><para>This isn't really a bug, but ... If
- <computeroutput>bzip2</computeroutput> tells you your file is
- corrupted on decompression, and you obtained the file via FTP,
- there is a possibility that you forgot to tell FTP to do a
- binary mode transfer. That absolutely will cause the file to
- be non-decompressible. You'll have to transfer it
- again.</para></listitem>
-
-</itemizedlist>
-
-<para>If you've incorporated
-<computeroutput>libbzip2</computeroutput> into your own program
-and are getting problems, please, please, please, check that the
-parameters you are passing in calls to the library, are correct,
-and in accordance with what the documentation says is allowable.
-I have tried to make the library robust against such problems,
-but I'm sure I haven't succeeded.</para>
-
-<para>Finally, if the above comments don't help, you'll have to
-send me a bug report. Now, it's just amazing how many people
-will send me a bug report saying something like:</para>
-
-<programlisting>
-bzip2 crashed with segmentation fault on my machine
-</programlisting>
-
-<para>and absolutely nothing else. Needless to say, a such a
-report is <emphasis>totally, utterly, completely and
-comprehensively 100% useless; a waste of your time, my time, and
-net bandwidth</emphasis>. With no details at all, there's no way
-I can possibly begin to figure out what the problem is.</para>
-
-<para>The rules of the game are: facts, facts, facts. Don't omit
-them because "oh, they won't be relevant". At the bare
-minimum:</para>
-
-<programlisting>
-Machine type. Operating system version.
-Exact version of bzip2 (do bzip2 -V).
-Exact version of the compiler used.
-Flags passed to the compiler.
-</programlisting>
-
-<para>However, the most important single thing that will help me
-is the file that you were trying to compress or decompress at the
-time the problem happened. Without that, my ability to do
-anything more than speculate about the cause, is limited.</para>
-
-</sect1>
-
-
-<sect1 id="package" xreflabel="Did you get the right package?">
-<title>Did you get the right package?</title>
-
-<para><computeroutput>bzip2</computeroutput> is a resource hog.
-It soaks up large amounts of CPU cycles and memory. Also, it
-gives very large latencies. In the worst case, you can feed many
-megabytes of uncompressed data into the library before getting
-any compressed output, so this probably rules out applications
-requiring interactive behaviour.</para>
-
-<para>These aren't faults of my implementation, I hope, but more
-an intrinsic property of the Burrows-Wheeler transform
-(unfortunately). Maybe this isn't what you want.</para>
-
-<para>If you want a compressor and/or library which is faster,
-uses less memory but gets pretty good compression, and has
-minimal latency, consider Jean-loup Gailly's and Mark Adler's
-work, <computeroutput>zlib-1.2.1</computeroutput> and
-<computeroutput>gzip-1.2.4</computeroutput>. Look for them at
-<ulink url="http://www.zlib.org">http://www.zlib.org</ulink> and
-<ulink url="http://www.gzip.org">http://www.gzip.org</ulink>
-respectively.</para>
-
-<para>For something faster and lighter still, you might try Markus F
-X J Oberhumer's <computeroutput>LZO</computeroutput> real-time
-compression/decompression library, at
-<ulink url="http://www.oberhumer.com/opensource">http://www.oberhumer.com/opensource</ulink>.</para>
-
-</sect1>
-
-
-
-<sect1 id="reading" xreflabel="Further Reading">
-<title>Further Reading</title>
-
-<para><computeroutput>bzip2</computeroutput> is not research
-work, in the sense that it doesn't present any new ideas.
-Rather, it's an engineering exercise based on existing
-ideas.</para>
-
-<para>Four documents describe essentially all the ideas behind
-<computeroutput>bzip2</computeroutput>:</para>
-
-<literallayout>Michael Burrows and D. J. Wheeler:
- "A block-sorting lossless data compression algorithm"
- 10th May 1994.
- Digital SRC Research Report 124.
- ftp://ftp.digital.com/pub/DEC/SRC/research-reports/SRC-124.ps.gz
- If you have trouble finding it, try searching at the
- New Zealand Digital Library, http://www.nzdl.org.
-
-Daniel S. Hirschberg and Debra A. LeLewer
- "Efficient Decoding of Prefix Codes"
- Communications of the ACM, April 1990, Vol 33, Number 4.
- You might be able to get an electronic copy of this
- from the ACM Digital Library.
-
-David J. Wheeler
- Program bred3.c and accompanying document bred3.ps.
- This contains the idea behind the multi-table Huffman coding scheme.
- ftp://ftp.cl.cam.ac.uk/users/djw3/
-
-Jon L. Bentley and Robert Sedgewick
- "Fast Algorithms for Sorting and Searching Strings"
- Available from Sedgewick's web page,
- www.cs.princeton.edu/~rs
-</literallayout>
-
-<para>The following paper gives valuable additional insights into
-the algorithm, but is not immediately the basis of any code used
-in bzip2.</para>
-
-<literallayout>Peter Fenwick:
- Block Sorting Text Compression
- Proceedings of the 19th Australasian Computer Science Conference,
- Melbourne, Australia. Jan 31 - Feb 2, 1996.
- ftp://ftp.cs.auckland.ac.nz/pub/peter-f/ACSC96paper.ps</literallayout>
-
-<para>Kunihiko Sadakane's sorting algorithm, mentioned above, is
-available from:</para>
-
-<literallayout>http://naomi.is.s.u-tokyo.ac.jp/~sada/papers/Sada98b.ps.gz
-</literallayout>
-
-<para>The Manber-Myers suffix array construction algorithm is
-described in a paper available from:</para>
-
-<literallayout>http://www.cs.arizona.edu/people/gene/PAPERS/suffix.ps
-</literallayout>
-
-<para>Finally, the following papers document some
-investigations I made into the performance of sorting
-and decompression algorithms:</para>
-
-<literallayout>Julian Seward
- On the Performance of BWT Sorting Algorithms
- Proceedings of the IEEE Data Compression Conference 2000
- Snowbird, Utah. 28-30 March 2000.
-
-Julian Seward
- Space-time Tradeoffs in the Inverse B-W Transform
- Proceedings of the IEEE Data Compression Conference 2001
- Snowbird, Utah. 27-29 March 2001.
-</literallayout>
-
-</sect1>
-
-</chapter>
-
-</book>
diff --git a/Utilities/cmbzip2/mk251.c b/Utilities/cmbzip2/mk251.c
index 39e94c0..6c5bbf9 100644
--- a/Utilities/cmbzip2/mk251.c
+++ b/Utilities/cmbzip2/mk251.c
@@ -9,8 +9,8 @@
This file is part of bzip2/libbzip2, a program and library for
lossless, block-sorting data compression.
- bzip2/libbzip2 version 1.0.5 of 10 December 2007
- Copyright (C) 1996-2007 Julian Seward <jseward@bzip.org>
+ bzip2/libbzip2 version 1.0.8 of 13 July 2019
+ Copyright (C) 1996-2019 Julian Seward <jseward@acm.org>
Please read the WARNING, DISCLAIMER and PATENTS sections in the
README file.
diff --git a/Utilities/cmbzip2/randtable.c b/Utilities/cmbzip2/randtable.c
index 068b763..bdc6d4a 100644
--- a/Utilities/cmbzip2/randtable.c
+++ b/Utilities/cmbzip2/randtable.c
@@ -8,8 +8,8 @@
This file is part of bzip2/libbzip2, a program and library for
lossless, block-sorting data compression.
- bzip2/libbzip2 version 1.0.5 of 10 December 2007
- Copyright (C) 1996-2007 Julian Seward <jseward@bzip.org>
+ bzip2/libbzip2 version 1.0.8 of 13 July 2019
+ Copyright (C) 1996-2019 Julian Seward <jseward@acm.org>
Please read the WARNING, DISCLAIMER and PATENTS sections in the
README file.
diff --git a/Utilities/cmbzip2/sample1.rb2 b/Utilities/cmbzip2/sample1.rb2
deleted file mode 100644
index 4edda36..0000000
--- a/Utilities/cmbzip2/sample1.rb2
+++ /dev/null
Binary files differ
diff --git a/Utilities/cmbzip2/sample1.ref b/Utilities/cmbzip2/sample1.ref
deleted file mode 100644
index dc869ee..0000000
--- a/Utilities/cmbzip2/sample1.ref
+++ /dev/null
Binary files differ
diff --git a/Utilities/cmbzip2/sample1.tst b/Utilities/cmbzip2/sample1.tst
deleted file mode 100644
index dc869ee..0000000
--- a/Utilities/cmbzip2/sample1.tst
+++ /dev/null
Binary files differ
diff --git a/Utilities/cmbzip2/sample2.rb2 b/Utilities/cmbzip2/sample2.rb2
deleted file mode 100644
index 8e54297..0000000
--- a/Utilities/cmbzip2/sample2.rb2
+++ /dev/null
Binary files differ
diff --git a/Utilities/cmbzip2/sample2.ref b/Utilities/cmbzip2/sample2.ref
deleted file mode 100644
index 40e5b58..0000000
--- a/Utilities/cmbzip2/sample2.ref
+++ /dev/null
Binary files differ
diff --git a/Utilities/cmbzip2/sample2.tst b/Utilities/cmbzip2/sample2.tst
deleted file mode 100644
index 40e5b58..0000000
--- a/Utilities/cmbzip2/sample2.tst
+++ /dev/null
Binary files differ
diff --git a/Utilities/cmbzip2/sample3.rb2 b/Utilities/cmbzip2/sample3.rb2
deleted file mode 100644
index 1c9b08c..0000000
--- a/Utilities/cmbzip2/sample3.rb2
+++ /dev/null
Binary files differ
diff --git a/Utilities/cmbzip2/sample3.ref b/Utilities/cmbzip2/sample3.ref
deleted file mode 100644
index 775a2f6..0000000
--- a/Utilities/cmbzip2/sample3.ref
+++ /dev/null
@@ -1,30007 +0,0 @@
-This file is exceedingly boring. If you find yourself
-reading it, please (1) take it from me that you can safely
-guess what the rest of the file says, and (2) seek professional
-help.
-
-ps. there are no further sarcastic remarks in this file.
-
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
diff --git a/Utilities/cmbzip2/sample3.tst b/Utilities/cmbzip2/sample3.tst
deleted file mode 100644
index 775a2f6..0000000
--- a/Utilities/cmbzip2/sample3.tst
+++ /dev/null
@@ -1,30007 +0,0 @@
-This file is exceedingly boring. If you find yourself
-reading it, please (1) take it from me that you can safely
-guess what the rest of the file says, and (2) seek professional
-help.
-
-ps. there are no further sarcastic remarks in this file.
-
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
-ugh
diff --git a/Utilities/cmbzip2/spewG.c b/Utilities/cmbzip2/spewG.c
index 7bd1284..65d24c8 100644
--- a/Utilities/cmbzip2/spewG.c
+++ b/Utilities/cmbzip2/spewG.c
@@ -13,15 +13,15 @@
This file is part of bzip2/libbzip2, a program and library for
lossless, block-sorting data compression.
- bzip2/libbzip2 version 1.0.5 of 10 December 2007
- Copyright (C) 1996-2007 Julian Seward <jseward@bzip.org>
+ bzip2/libbzip2 version 1.0.8 of 13 July 2019
+ Copyright (C) 1996-2019 Julian Seward <jseward@acm.org>
Please read the WARNING, DISCLAIMER and PATENTS sections in the
README file.
This program is released under the terms of the license contained
in the file LICENSE.
- ------------------------------------------------------------------ */
+ ------------------------------------------------------------------ */
#define _FILE_OFFSET_BITS 64
diff --git a/Utilities/cmbzip2/unzcrash.c b/Utilities/cmbzip2/unzcrash.c
index a1b7546..c68f93c 100644
--- a/Utilities/cmbzip2/unzcrash.c
+++ b/Utilities/cmbzip2/unzcrash.c
@@ -17,8 +17,8 @@
This file is part of bzip2/libbzip2, a program and library for
lossless, block-sorting data compression.
- bzip2/libbzip2 version 1.0.5 of 10 December 2007
- Copyright (C) 1996-2007 Julian Seward <jseward@bzip.org>
+ bzip2/libbzip2 version 1.0.8 of 13 July 2019
+ Copyright (C) 1996-2019 Julian Seward <jseward@acm.org>
Please read the WARNING, DISCLAIMER and PATENTS sections in the
README file.
diff --git a/Utilities/cmbzip2/words0 b/Utilities/cmbzip2/words0
deleted file mode 100644
index fbf442a..0000000
--- a/Utilities/cmbzip2/words0
+++ /dev/null
@@ -1,9 +0,0 @@
-
-If compilation produces errors, or a large number of warnings,
-please read README.COMPILATION.PROBLEMS -- you might be able to
-adjust the flags in this Makefile to improve matters.
-
-Also in README.COMPILATION.PROBLEMS are some hints that may help
-if your build produces an executable which is unable to correctly
-handle so-called 'large files' -- files of size 2GB or more.
-
diff --git a/Utilities/cmbzip2/words1 b/Utilities/cmbzip2/words1
deleted file mode 100644
index 2e83de9..0000000
--- a/Utilities/cmbzip2/words1
+++ /dev/null
@@ -1,4 +0,0 @@
-
-Doing 6 tests (3 compress, 3 uncompress) ...
-If there's a problem, things might stop at this point.
-
diff --git a/Utilities/cmbzip2/words2 b/Utilities/cmbzip2/words2
deleted file mode 100644
index caddcf4..0000000
--- a/Utilities/cmbzip2/words2
+++ /dev/null
@@ -1,5 +0,0 @@
-
-Checking test results. If any of the four "cmp"s which follow
-report any differences, something is wrong. If you can't easily
-figure out what, please let me know (jseward@bzip.org).
-
diff --git a/Utilities/cmbzip2/words3 b/Utilities/cmbzip2/words3
deleted file mode 100644
index 6972669..0000000
--- a/Utilities/cmbzip2/words3
+++ /dev/null
@@ -1,30 +0,0 @@
-
-If you got this far and the 'cmp's didn't complain, it looks
-like you're in business.
-
-To install in /usr/local/bin, /usr/local/lib, /usr/local/man and
-/usr/local/include, type
-
- make install
-
-To install somewhere else, eg, /xxx/yyy/{bin,lib,man,include}, type
-
- make install PREFIX=/xxx/yyy
-
-If you are (justifiably) paranoid and want to see what 'make install'
-is going to do, you can first do
-
- make -n install or
- make -n install PREFIX=/xxx/yyy respectively.
-
-The -n instructs make to show the commands it would execute, but
-not actually execute them.
-
-Instructions for use are in the preformatted manual page, in the file
-bzip2.txt. For more detailed documentation, read the full manual.
-It is available in Postscript form (manual.ps), PDF form (manual.pdf),
-and HTML form (manual.html).
-
-You can also do "bzip2 --help" to see some helpful information.
-"bzip2 -L" displays the software license.
-
diff --git a/Utilities/cmbzip2/xmlproc.sh b/Utilities/cmbzip2/xmlproc.sh
deleted file mode 100755
index 5384177..0000000
--- a/Utilities/cmbzip2/xmlproc.sh
+++ /dev/null
@@ -1,114 +0,0 @@
-#!/bin/bash
-# see the README file for usage etc.
-#
-# ------------------------------------------------------------------
-# This file is part of bzip2/libbzip2, a program and library for
-# lossless, block-sorting data compression.
-#
-# bzip2/libbzip2 version 1.0.5 of 10 December 2007
-# Copyright (C) 1996-2007 Julian Seward <jseward@bzip.org>
-#
-# Please read the WARNING, DISCLAIMER and PATENTS sections in the
-# README file.
-#
-# This program is released under the terms of the license contained
-# in the file LICENSE.
-# ----------------------------------------------------------------
-
-
-usage() {
- echo '';
- echo 'Usage: xmlproc.sh -[option] <filename.xml>';
- echo 'Specify a target from:';
- echo '-v verify xml file conforms to dtd';
- echo '-html output in html format (single file)';
- echo '-ps output in postscript format';
- echo '-pdf output in pdf format';
- exit;
-}
-
-if test $# -ne 2; then
- usage
-fi
-# assign the variable for the output type
-action=$1; shift
-# assign the output filename
-xmlfile=$1; shift
-# and check user input it correct
-if !(test -f $xmlfile); then
- echo "No such file: $xmlfile";
- exit;
-fi
-# some other stuff we will use
-OUT=output
-xsl_fo=bz-fo.xsl
-xsl_html=bz-html.xsl
-
-basename=$xmlfile
-basename=${basename//'.xml'/''}
-
-fofile="${basename}.fo"
-htmlfile="${basename}.html"
-pdffile="${basename}.pdf"
-psfile="${basename}.ps"
-xmlfmtfile="${basename}.fmt"
-
-# first process the xmlfile with CDATA tags
-./format.pl $xmlfile $xmlfmtfile
-# so the shell knows where the catalogs live
-export XML_CATALOG_FILES=/etc/xml/catalog
-
-# post-processing tidy up
-cleanup() {
- echo "Cleaning up: $@"
- while [ $# != 0 ]
- do
- arg=$1; shift;
- echo " deleting $arg";
- rm $arg
- done
-}
-
-case $action in
- -v)
- flags='--noout --xinclude --noblanks --postvalid'
- dtd='--dtdvalid http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd'
- xmllint $flags $dtd $xmlfmtfile 2> $OUT
- egrep 'error' $OUT
- rm $OUT
- ;;
-
- -html)
- echo "Creating $htmlfile ..."
- xsltproc --nonet --xinclude -o $htmlfile $xsl_html $xmlfmtfile
- cleanup $xmlfmtfile
- ;;
-
- -pdf)
- echo "Creating $pdffile ..."
- xsltproc --nonet --xinclude -o $fofile $xsl_fo $xmlfmtfile
- pdfxmltex $fofile >$OUT </dev/null
- pdfxmltex $fofile >$OUT </dev/null
- pdfxmltex $fofile >$OUT </dev/null
- cleanup $OUT $xmlfmtfile *.aux *.fo *.log *.out
- ;;
-
- -ps)
- echo "Creating $psfile ..."
- xsltproc --nonet --xinclude -o $fofile $xsl_fo $xmlfmtfile
- pdfxmltex $fofile >$OUT </dev/null
- pdfxmltex $fofile >$OUT </dev/null
- pdfxmltex $fofile >$OUT </dev/null
- pdftops $pdffile $psfile
- cleanup $OUT $xmlfmtfile $pdffile *.aux *.fo *.log *.out
-# passivetex is broken, so we can't go this route yet.
-# xmltex $fofile >$OUT </dev/null
-# xmltex $fofile >$OUT </dev/null
-# xmltex $fofile >$OUT </dev/null
-# dvips -R -q -o bzip-manual.ps *.dvi
- ;;
-
- *)
- usage
- ;;
-esac
diff --git a/Utilities/cmcurl/CMake/CurlSymbolHiding.cmake b/Utilities/cmcurl/CMake/CurlSymbolHiding.cmake
index 60ee8e6..8e5fd67 100644
--- a/Utilities/cmcurl/CMake/CurlSymbolHiding.cmake
+++ b/Utilities/cmcurl/CMake/CurlSymbolHiding.cmake
@@ -11,13 +11,7 @@ if(CURL_HIDDEN_SYMBOLS)
set(_SYMBOL_EXTERN "__attribute__ ((__visibility__ (\"default\")))")
set(_CFLAG_SYMBOLS_HIDE "-fvisibility=hidden")
elseif(CMAKE_COMPILER_IS_GNUCC)
- if(NOT CMAKE_VERSION VERSION_LESS 2.8.10)
- set(GCC_VERSION ${CMAKE_C_COMPILER_VERSION})
- else()
- execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion
- OUTPUT_VARIABLE GCC_VERSION)
- endif()
- if(NOT GCC_VERSION VERSION_LESS 3.4)
+ if(NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 3.4)
# note: this is considered buggy prior to 4.0 but the autotools don't care, so let's ignore that fact
set(SUPPORTS_SYMBOL_HIDING TRUE)
set(_SYMBOL_EXTERN "__attribute__ ((__visibility__ (\"default\")))")
@@ -29,7 +23,7 @@ if(CURL_HIDDEN_SYMBOLS)
set(_CFLAG_SYMBOLS_HIDE "-xldscope=hidden")
elseif(CMAKE_C_COMPILER_ID MATCHES "Intel" AND NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 9.0)
# note: this should probably just check for version 9.1.045 but I'm not 100% sure
- # so let's to it the same way autotools do.
+ # so let's do it the same way autotools do.
set(SUPPORTS_SYMBOL_HIDING TRUE)
set(_SYMBOL_EXTERN "__attribute__ ((__visibility__ (\"default\")))")
set(_CFLAG_SYMBOLS_HIDE "-fvisibility=hidden")
diff --git a/Utilities/cmcurl/CMake/CurlTests.c b/Utilities/cmcurl/CMake/CurlTests.c
index 07b516b..3ef35f0 100644
--- a/Utilities/cmcurl/CMake/CurlTests.c
+++ b/Utilities/cmcurl/CMake/CurlTests.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -125,6 +125,7 @@ int main(void)
#if defined(HAVE_GETHOSTBYADDR_R_5) || \
defined(HAVE_GETHOSTBYADDR_R_5_REENTRANT)
rc = gethostbyaddr_r(address, length, type, &h, &hdata);
+ (void)rc;
#elif defined(HAVE_GETHOSTBYADDR_R_7) || \
defined(HAVE_GETHOSTBYADDR_R_7_REENTRANT)
hp = gethostbyaddr_r(address, length, type, &h, buffer, 8192, &h_errnop);
@@ -132,6 +133,7 @@ int main(void)
#elif defined(HAVE_GETHOSTBYADDR_R_8) || \
defined(HAVE_GETHOSTBYADDR_R_8_REENTRANT)
rc = gethostbyaddr_r(address, length, type, &h, buffer, 8192, &hp, &h_errnop);
+ (void)rc;
#endif
#if defined(HAVE_GETHOSTBYNAME_R_3) || \
diff --git a/Utilities/cmcurl/CMake/FindBearSSL.cmake b/Utilities/cmcurl/CMake/FindBearSSL.cmake
new file mode 100644
index 0000000..20d239a
--- /dev/null
+++ b/Utilities/cmcurl/CMake/FindBearSSL.cmake
@@ -0,0 +1,9 @@
+find_path(BEARSSL_INCLUDE_DIRS bearssl.h)
+
+find_library(BEARSSL_LIBRARY bearssl)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(BEARSSL DEFAULT_MSG
+ BEARSSL_INCLUDE_DIRS BEARSSL_LIBRARY)
+
+mark_as_advanced(BEARSSL_INCLUDE_DIRS BEARSSL_LIBRARY)
diff --git a/Utilities/cmcurl/CMake/FindCARES.cmake b/Utilities/cmcurl/CMake/FindCARES.cmake
index 723044a..3d1bae6 100644
--- a/Utilities/cmcurl/CMake/FindCARES.cmake
+++ b/Utilities/cmcurl/CMake/FindCARES.cmake
@@ -7,34 +7,16 @@
# also defined, but not for general use are
# CARES_LIBRARY, where to find the c-ares library.
-find_path(CARES_INCLUDE_DIR ares.h
- /usr/local/include
- /usr/include
- )
+find_path(CARES_INCLUDE_DIR ares.h)
set(CARES_NAMES ${CARES_NAMES} cares)
find_library(CARES_LIBRARY
NAMES ${CARES_NAMES}
- PATHS /usr/lib /usr/local/lib
)
-if(CARES_LIBRARY AND CARES_INCLUDE_DIR)
- set(CARES_LIBRARIES ${CARES_LIBRARY})
- set(CARES_FOUND "YES")
-else()
- set(CARES_FOUND "NO")
-endif()
-
-
-if(CARES_FOUND)
- if(NOT CARES_FIND_QUIETLY)
- message(STATUS "Found c-ares: ${CARES_LIBRARIES}")
- endif()
-else()
- if(CARES_FIND_REQUIRED)
- message(FATAL_ERROR "Could not find c-ares library")
- endif()
-endif()
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(CARES
+ REQUIRED_VARS CARES_LIBRARY CARES_INCLUDE_DIR)
mark_as_advanced(
CARES_LIBRARY
diff --git a/Utilities/cmcurl/CMake/FindGSS.cmake b/Utilities/cmcurl/CMake/FindGSS.cmake
index 8a28f2f..a2f150c 100644
--- a/Utilities/cmcurl/CMake/FindGSS.cmake
+++ b/Utilities/cmcurl/CMake/FindGSS.cmake
@@ -62,6 +62,7 @@ if(NOT _GSS_FOUND) #not found by pkg-config. Let's take more traditional approac
COMMAND ${_GSS_CONFIGURE_SCRIPT} "--cflags" "gssapi"
OUTPUT_VARIABLE _GSS_CFLAGS
RESULT_VARIABLE _GSS_CONFIGURE_FAILED
+ OUTPUT_STRIP_TRAILING_WHITESPACE
)
message(STATUS "CFLAGS: ${_GSS_CFLAGS}")
if(NOT _GSS_CONFIGURE_FAILED) # 0 means success
@@ -84,6 +85,7 @@ if(NOT _GSS_FOUND) #not found by pkg-config. Let's take more traditional approac
COMMAND ${_GSS_CONFIGURE_SCRIPT} "--libs" "gssapi"
OUTPUT_VARIABLE _GSS_LIB_FLAGS
RESULT_VARIABLE _GSS_CONFIGURE_FAILED
+ OUTPUT_STRIP_TRAILING_WHITESPACE
)
message(STATUS "LDFLAGS: ${_GSS_LIB_FLAGS}")
@@ -110,6 +112,7 @@ if(NOT _GSS_FOUND) #not found by pkg-config. Let's take more traditional approac
COMMAND ${_GSS_CONFIGURE_SCRIPT} "--version"
OUTPUT_VARIABLE _GSS_VERSION
RESULT_VARIABLE _GSS_CONFIGURE_FAILED
+ OUTPUT_STRIP_TRAILING_WHITESPACE
)
# older versions may not have the "--version" parameter. In this case we just don't care.
@@ -121,6 +124,7 @@ if(NOT _GSS_FOUND) #not found by pkg-config. Let's take more traditional approac
COMMAND ${_GSS_CONFIGURE_SCRIPT} "--vendor"
OUTPUT_VARIABLE _GSS_VENDOR
RESULT_VARIABLE _GSS_CONFIGURE_FAILED
+ OUTPUT_STRIP_TRAILING_WHITESPACE
)
# older versions may not have the "--vendor" parameter. In this case we just don't care.
@@ -134,7 +138,7 @@ if(NOT _GSS_FOUND) #not found by pkg-config. Let's take more traditional approac
endif()
endif()
- else() # either there is no config script or we are on platform that doesn't provide one (Windows?)
+ else() # either there is no config script or we are on a platform that doesn't provide one (Windows?)
find_path(_GSS_INCLUDE_DIR
NAMES
@@ -164,7 +168,7 @@ if(NOT _GSS_FOUND) #not found by pkg-config. Let's take more traditional approac
set(CMAKE_REQUIRED_DEFINITIONS "")
endif()
else()
- # I'm not convienced if this is the right way but this is what autotools do at the moment
+ # I'm not convinced if this is the right way but this is what autotools do at the moment
find_path(_GSS_INCLUDE_DIR
NAMES
"gssapi.h"
diff --git a/Utilities/cmcurl/CMake/FindLibSSH2.cmake b/Utilities/cmcurl/CMake/FindLibSSH2.cmake
index 84822db..91e17c1 100644
--- a/Utilities/cmcurl/CMake/FindLibSSH2.cmake
+++ b/Utilities/cmcurl/CMake/FindLibSSH2.cmake
@@ -5,31 +5,18 @@
# LIBSSH2_INCLUDE_DIR - the libssh2 include directory
# LIBSSH2_LIBRARY - the libssh2 library name
-if(LIBSSH2_INCLUDE_DIR AND LIBSSH2_LIBRARY)
- set(LibSSH2_FIND_QUIETLY TRUE)
-endif()
-
-find_path(LIBSSH2_INCLUDE_DIR libssh2.h
-)
+find_path(LIBSSH2_INCLUDE_DIR libssh2.h)
-find_library(LIBSSH2_LIBRARY NAMES ssh2
-)
+find_library(LIBSSH2_LIBRARY NAMES ssh2 libssh2)
if(LIBSSH2_INCLUDE_DIR)
- file(STRINGS "${LIBSSH2_INCLUDE_DIR}/libssh2.h" libssh2_version_str REGEX "^#define[\t ]+LIBSSH2_VERSION_NUM[\t ]+0x[0-9][0-9][0-9][0-9][0-9][0-9].*")
-
- string(REGEX REPLACE "^.*LIBSSH2_VERSION_NUM[\t ]+0x([0-9][0-9]).*$" "\\1" LIBSSH2_VERSION_MAJOR "${libssh2_version_str}")
- string(REGEX REPLACE "^.*LIBSSH2_VERSION_NUM[\t ]+0x[0-9][0-9]([0-9][0-9]).*$" "\\1" LIBSSH2_VERSION_MINOR "${libssh2_version_str}")
- string(REGEX REPLACE "^.*LIBSSH2_VERSION_NUM[\t ]+0x[0-9][0-9][0-9][0-9]([0-9][0-9]).*$" "\\1" LIBSSH2_VERSION_PATCH "${libssh2_version_str}")
-
- string(REGEX REPLACE "^0(.+)" "\\1" LIBSSH2_VERSION_MAJOR "${LIBSSH2_VERSION_MAJOR}")
- string(REGEX REPLACE "^0(.+)" "\\1" LIBSSH2_VERSION_MINOR "${LIBSSH2_VERSION_MINOR}")
- string(REGEX REPLACE "^0(.+)" "\\1" LIBSSH2_VERSION_PATCH "${LIBSSH2_VERSION_PATCH}")
-
- set(LIBSSH2_VERSION "${LIBSSH2_VERSION_MAJOR}.${LIBSSH2_VERSION_MINOR}.${LIBSSH2_VERSION_PATCH}")
+ file(STRINGS "${LIBSSH2_INCLUDE_DIR}/libssh2.h" libssh2_version_str REGEX "^#define[\t ]+LIBSSH2_VERSION[\t ]+\"(.*)\"")
+ string(REGEX REPLACE "^.*\"([^\"]+)\"" "\\1" LIBSSH2_VERSION "${libssh2_version_str}")
endif()
include(FindPackageHandleStandardArgs)
-find_package_handle_standard_args(LibSSH2 DEFAULT_MSG LIBSSH2_INCLUDE_DIR LIBSSH2_LIBRARY )
+find_package_handle_standard_args(LibSSH2
+ REQUIRED_VARS LIBSSH2_LIBRARY LIBSSH2_INCLUDE_DIR
+ VERSION_VAR LIBSSH2_VERSION)
-mark_as_advanced(LIBSSH2_INCLUDE_DIR LIBSSH2_LIBRARY LIBSSH2_VERSION_MAJOR LIBSSH2_VERSION_MINOR LIBSSH2_VERSION_PATCH LIBSSH2_VERSION)
+mark_as_advanced(LIBSSH2_INCLUDE_DIR LIBSSH2_LIBRARY)
diff --git a/Utilities/cmcurl/CMake/FindNGHTTP2.cmake b/Utilities/cmcurl/CMake/FindNGHTTP2.cmake
index 348b961..5138e99 100644
--- a/Utilities/cmcurl/CMake/FindNGHTTP2.cmake
+++ b/Utilities/cmcurl/CMake/FindNGHTTP2.cmake
@@ -10,9 +10,9 @@ find_package_handle_standard_args(NGHTTP2
REQUIRED_VARS
NGHTTP2_LIBRARY
NGHTTP2_INCLUDE_DIR
- FAIL_MESSAGE
- "Could NOT find NGHTTP2"
)
set(NGHTTP2_INCLUDE_DIRS ${NGHTTP2_INCLUDE_DIR})
set(NGHTTP2_LIBRARIES ${NGHTTP2_LIBRARY})
+
+mark_as_advanced(NGHTTP2_INCLUDE_DIRS NGHTTP2_LIBRARIES)
diff --git a/Utilities/cmcurl/CMake/FindNSS.cmake b/Utilities/cmcurl/CMake/FindNSS.cmake
new file mode 100644
index 0000000..0043ce8
--- /dev/null
+++ b/Utilities/cmcurl/CMake/FindNSS.cmake
@@ -0,0 +1,17 @@
+if(UNIX)
+ find_package(PkgConfig QUIET)
+ pkg_search_module(PC_NSS nss)
+endif()
+if(NOT PC_NSS_FOUND)
+ return()
+endif()
+
+set(NSS_LIBRARIES ${PC_NSS_LINK_LIBRARIES})
+set(NSS_INCLUDE_DIRS ${PC_NSS_INCLUDE_DIRS})
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(NSS
+ REQUIRED_VARS NSS_LIBRARIES NSS_INCLUDE_DIRS
+ VERSION_VAR PC_NSS_VERSION)
+
+mark_as_advanced(NSS_INCLUDE_DIRS NSS_LIBRARIES)
diff --git a/Utilities/cmcurl/CMake/OtherTests.cmake b/Utilities/cmcurl/CMake/OtherTests.cmake
index c1c9aa3..8b15029 100644
--- a/Utilities/cmcurl/CMake/OtherTests.cmake
+++ b/Utilities/cmcurl/CMake/OtherTests.cmake
@@ -32,7 +32,7 @@ int main(void) {
return 0;
}" curl_cv_recv)
if(curl_cv_recv)
- if(NOT DEFINED curl_cv_func_recv_args OR "${curl_cv_func_recv_args}" STREQUAL "unknown")
+ if(NOT DEFINED curl_cv_func_recv_args OR curl_cv_func_recv_args STREQUAL "unknown")
foreach(recv_retv "int" "ssize_t" )
foreach(recv_arg1 "SOCKET" "int" )
foreach(recv_arg2 "char *" "void *" )
@@ -81,7 +81,7 @@ if(curl_cv_recv)
string(REGEX REPLACE "^[^,]*,[^,]*,[^,]*,[^,]*,([^,]*)$" "\\1" RECV_TYPE_RETV "${curl_cv_func_recv_args}")
endif()
- if("${curl_cv_func_recv_args}" STREQUAL "unknown")
+ if(curl_cv_func_recv_args STREQUAL "unknown")
message(FATAL_ERROR "Cannot find proper types to use for recv args")
endif()
else()
diff --git a/Utilities/cmcurl/CMake/Platforms/WindowsCache.cmake b/Utilities/cmcurl/CMake/Platforms/WindowsCache.cmake
index 2dbe1bb..4c4c63b 100644
--- a/Utilities/cmcurl/CMake/Platforms/WindowsCache.cmake
+++ b/Utilities/cmcurl/CMake/Platforms/WindowsCache.cmake
@@ -7,7 +7,6 @@ if(NOT UNIX)
set(HAVE_LIBNSL 0)
set(HAVE_GETHOSTNAME 1)
set(HAVE_LIBZ 0)
- set(HAVE_LIBCRYPTO 0)
set(HAVE_DLOPEN 0)
diff --git a/Utilities/cmcurl/CMake/Utilities.cmake b/Utilities/cmcurl/CMake/Utilities.cmake
index 5cb1d44..ffc411a 100644
--- a/Utilities/cmcurl/CMake/Utilities.cmake
+++ b/Utilities/cmcurl/CMake/Utilities.cmake
@@ -2,12 +2,11 @@
# Returns a list of arguments that evaluate to true
function(count_true output_count_var)
- set(lst)
+ set(lst_len 0)
foreach(option_var IN LISTS ARGN)
if(${option_var})
- list(APPEND lst ${option_var})
+ math(EXPR lst_len "${lst_len} + 1")
endif()
endforeach()
- list(LENGTH lst lst_len)
set(${output_count_var} ${lst_len} PARENT_SCOPE)
endfunction()
diff --git a/Utilities/cmcurl/CMakeLists.txt b/Utilities/cmcurl/CMakeLists.txt
index bc8a7dc..c90e768 100644
--- a/Utilities/cmcurl/CMakeLists.txt
+++ b/Utilities/cmcurl/CMakeLists.txt
@@ -24,17 +24,21 @@ set(CURL_DISABLE_TELNET ON CACHE INTERNAL "Disable curl telnet protocol?")
set(CURL_DISABLE_TFTP ON CACHE INTERNAL "Disable curl tftp protocol?")
set(CURL_DISABLE_VERBOSE_STRINGS OFF CACHE INTERNAL "Do not disable curl verbosity")
set(CURL_HIDDEN_SYMBOLS OFF CACHE INTERNAL "No curl hidden symbols")
+set(CURL_LTO OFF CACHE INTERNAL "Turn on compiler Link Time Optimizations")
+set(CURL_STATIC_CRT OFF CACHE INTERNAL "Set to ON to build libcurl with static CRT on Windows (/MT).")
set(CURL_WERROR OFF CACHE INTERNAL "Turn compiler warnings into errors")
set(DISABLED_THREADSAFE OFF CACHE INTERNAL "Curl can use thread-safe functions")
set(ENABLE_ARES OFF CACHE INTERNAL "No curl c-ares support")
set(ENABLE_CURLDEBUG OFF CACHE INTERNAL "No curl TrackMemory features")
set(ENABLE_DEBUG OFF CACHE INTERNAL "No curl debug features")
+set(ENABLE_INET_PTON OFF CACHE INTERNAL "Set to OFF to prevent usage of inet_pton when building against modern SDKs while still requiring compatibility with older Windows versions, such as Windows XP, Windows Server 2003 etc.")
set(ENABLE_IPV6 ON CACHE INTERNAL "Enable curl IPv6 support detection")
set(ENABLE_MANUAL OFF CACHE INTERNAL "No curl built-in manual")
set(ENABLE_THREADED_RESOLVER OFF CACHE INTERNAL "No curl POSIX threaded DNS lookup")
set(ENABLE_UNIX_SOCKETS OFF CACHE INTERNAL "No curl Unix domain sockets support")
set(HTTP_ONLY OFF CACHE INTERNAL "Curl is not http-only")
set(PICKY_COMPILER OFF CACHE INTERNAL "Enable picky compiler options")
+set(USE_NGHTTP2 ON)
set(USE_WIN32_LDAP OFF CACHE INTERNAL "No curl Windows LDAP")
if(CMAKE_USE_OPENSSL)
elseif(WIN32)
@@ -60,6 +64,8 @@ elseif(APPLE)
unset(CMAKE_USE_DARWINSSL CACHE)
endif()
set(CMAKE_USE_MBEDTLS OFF CACHE INTERNAL "Enable mbedTLS for SSL/TLS")
+set(CMAKE_USE_BEARSSL OFF CACHE INTERNAL "Enable BearSSL for SSL/TLS")
+set(CMAKE_USE_NSS OFF CACHE INTERNAL "Enable NSS for SSL/TLS")
# Windows Vista and above have inet_pton, but this will link on
# older versions and then the executable will fail to launch at
@@ -91,7 +97,7 @@ endif()
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -136,7 +142,7 @@ if(0) # This code not needed for building within CMake.
message(WARNING "the curl cmake build system is poorly maintained. Be aware")
endif()
-file(READ ${CURL_SOURCE_DIR}/include/curl/curlver.h CURL_VERSION_H_CONTENTS)
+file(STRINGS ${CURL_SOURCE_DIR}/include/curl/curlver.h CURL_VERSION_H_CONTENTS REGEX "#define LIBCURL_VERSION( |_NUM )")
string(REGEX MATCH "#define LIBCURL_VERSION \"[^\"]*"
CURL_VERSION ${CURL_VERSION_H_CONTENTS})
string(REGEX REPLACE "[^\"]+\"" "" CURL_VERSION ${CURL_VERSION})
@@ -168,7 +174,20 @@ option(ENABLE_ARES "Set to ON to enable c-ares support" OFF)
if(WIN32)
option(CURL_STATIC_CRT "Set to ON to build libcurl with static CRT on Windows (/MT)." OFF)
option(ENABLE_INET_PTON "Set to OFF to prevent usage of inet_pton when building against modern SDKs while still requiring compatibility with older Windows versions, such as Windows XP, Windows Server 2003 etc." ON)
+ if(0) # This code not needed for building within CMake.
+ set(CURL_TARGET_WINDOWS_VERSION "" CACHE STRING "Minimum target Windows version as hex string")
+ if(CURL_TARGET_WINDOWS_VERSION)
+ add_definitions(-D_WIN32_WINNT=${CURL_TARGET_WINDOWS_VERSION})
+ elseif(ENABLE_INET_PTON)
+ # _WIN32_WINNT_VISTA (0x0600)
+ add_definitions(-D_WIN32_WINNT=0x0600)
+ else()
+ # _WIN32_WINNT_WINXP (0x0501)
+ add_definitions(-D_WIN32_WINNT=0x0501)
+ endif()
+ endif()
endif()
+option(CURL_LTO "Turn on compiler Link Time Optimizations" OFF)
if(0) # This code not needed for building within CMake.
cmake_dependent_option(ENABLE_THREADED_RESOLVER "Set to ON to enable threaded DNS lookup"
@@ -184,8 +203,9 @@ if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_CLANG)
foreach(_CCOPT -pedantic -Wall -W -Wpointer-arith -Wwrite-strings -Wunused -Wshadow -Winline -Wnested-externs -Wmissing-declarations -Wmissing-prototypes -Wno-long-long -Wfloat-equal -Wno-multichar -Wsign-compare -Wundef -Wno-format-nonliteral -Wendif-labels -Wstrict-prototypes -Wdeclaration-after-statement -Wstrict-aliasing=3 -Wcast-align -Wtype-limits -Wold-style-declaration -Wmissing-parameter-type -Wempty-body -Wclobbered -Wignored-qualifiers -Wconversion -Wno-sign-conversion -Wvla -Wdouble-promotion -Wno-system-headers -Wno-pedantic-ms-format)
# surprisingly, CHECK_C_COMPILER_FLAG needs a new variable to store each new
# test result in.
- check_c_compiler_flag(${_CCOPT} OPT${_CCOPT})
- if(OPT${_CCOPT})
+ string(MAKE_C_IDENTIFIER "OPT${_CCOPT}" _optvarname)
+ check_c_compiler_flag(${_CCOPT} ${_optvarname})
+ if(${_optvarname})
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${_CCOPT}")
endif()
endforeach()
@@ -216,7 +236,6 @@ if(ENABLE_ARES)
set(USE_ARES 1)
find_package(CARES REQUIRED)
list(APPEND CURL_LIBS ${CARES_LIBRARY})
- set(CURL_LIBS ${CURL_LIBS} ${CARES_LIBRARY})
endif()
if(0) # This code not needed for building within CMake.
@@ -267,6 +286,7 @@ if(HTTP_ONLY)
set(CURL_DISABLE_RTSP ON)
set(CURL_DISABLE_POP3 ON)
set(CURL_DISABLE_IMAP ON)
+ set(CURL_DISABLE_SMB ON)
set(CURL_DISABLE_SMTP ON)
set(CURL_DISABLE_GOPHER ON)
endif()
@@ -332,6 +352,7 @@ if(${CMAKE_SYSTEM_NAME} MATCHES AIX)
endif()
# Include all the necessary files for macros
+include(CMakePushCheckState)
include(CheckFunctionExists)
include(CheckIncludeFile)
include(CheckIncludeFiles)
@@ -359,7 +380,7 @@ endif()
# Check for all needed libraries
if(0) # This code not needed for building within CMake.
-check_library_exists_concat("dl" dlopen HAVE_LIBDL)
+check_library_exists_concat("${CMAKE_DL_LIBS}" dlopen HAVE_LIBDL)
else()
# Use the cmake-defined dl libs as dl is should not be used
# on HPUX, but rather dld this avoids a warning
@@ -390,7 +411,7 @@ if(WIN32)
endif()
# check SSL libraries
-# TODO support GNUTLS, NSS, POLARSSL, CYASSL
+# TODO support GnuTLS and WolfSSL
if(APPLE)
option(CMAKE_USE_SECTRANSP "enable Apple OS native SSL/TLS" OFF)
@@ -401,9 +422,11 @@ if(WIN32)
CMAKE_USE_WINSSL OFF)
endif()
option(CMAKE_USE_MBEDTLS "Enable mbedTLS for SSL/TLS" OFF)
+option(CMAKE_USE_BEARSSL "Enable BearSSL for SSL/TLS" OFF)
+option(CMAKE_USE_NSS "Enable NSS for SSL/TLS" OFF)
set(openssl_default ON)
-if(WIN32 OR CMAKE_USE_SECTRANSP OR CMAKE_USE_WINSSL OR CMAKE_USE_MBEDTLS)
+if(WIN32 OR CMAKE_USE_SECTRANSP OR CMAKE_USE_WINSSL OR CMAKE_USE_MBEDTLS OR CMAKE_USE_NSS)
set(openssl_default OFF)
endif()
@@ -412,6 +435,8 @@ count_true(enabled_ssl_options_count
CMAKE_USE_SECTRANSP
CMAKE_USE_OPENSSL
CMAKE_USE_MBEDTLS
+ CMAKE_USE_BEARSSL
+ CMAKE_USE_NSS
)
if(enabled_ssl_options_count GREATER "1")
set(CURL_WITH_MULTI_SSL ON)
@@ -457,8 +482,6 @@ if(CMAKE_USE_OPENSSL)
endif()
set(SSL_ENABLED ON)
set(USE_OPENSSL ON)
- set(HAVE_LIBCRYPTO ON)
- set(HAVE_LIBSSL ON)
list(APPEND CURL_LIBS ${OPENSSL_LIBRARIES})
include_directories(${OPENSSL_INCLUDE_DIR})
@@ -492,6 +515,27 @@ if(CMAKE_USE_MBEDTLS)
include_directories(${MBEDTLS_INCLUDE_DIRS})
endif()
+if(CMAKE_USE_BEARSSL)
+ find_package(BearSSL REQUIRED)
+ set(SSL_ENABLED ON)
+ set(USE_BEARSSL ON)
+ list(APPEND CURL_LIBS ${BEARSSL_LIBRARY})
+ include_directories(${BEARSSL_INCLUDE_DIRS})
+endif()
+
+if(CMAKE_USE_NSS)
+ find_package(NSS REQUIRED)
+ include_directories(${NSS_INCLUDE_DIRS})
+ list(APPEND CURL_LIBS ${NSS_LIBRARIES})
+ set(SSL_ENABLED ON)
+ set(USE_NSS ON)
+ cmake_push_check_state()
+ set(CMAKE_REQUIRED_INCLUDES ${NSS_INCLUDE_DIRS})
+ set(CMAKE_REQUIRED_LIBRARIES ${NSS_LIBRARIES})
+ check_symbol_exists(PK11_CreateManagedGenericObject "pk11pub.h" HAVE_PK11_CREATEMANAGEDGENERICOBJECT)
+ cmake_pop_check_state()
+endif()
+
option(USE_NGHTTP2 "Use Nghttp2 library" OFF)
if(USE_NGHTTP2)
find_package(NGHTTP2 REQUIRED)
@@ -499,6 +543,10 @@ if(USE_NGHTTP2)
list(APPEND CURL_LIBS ${NGHTTP2_LIBRARIES})
endif()
+if(WIN32)
+ set(USE_WIN32_CRYPTO ON)
+endif()
+
if(NOT CURL_DISABLE_LDAP)
if(WIN32)
option(USE_WIN32_LDAP "Use Windows LDAP implementation" ON)
@@ -653,7 +701,7 @@ endif()
option(CURL_BROTLI "Set to ON to enable building curl with brotli support." OFF)
set(HAVE_BROTLI OFF)
if(CURL_BROTLI)
- find_package(BROTLI QUIET)
+ find_package(Brotli QUIET)
if(BROTLI_FOUND)
set(HAVE_BROTLI ON)
list(APPEND CURL_LIBS ${BROTLI_LIBRARIES})
@@ -793,7 +841,9 @@ elseif("${CURL_CA_PATH}" STREQUAL "none")
unset(CURL_CA_PATH CACHE)
elseif("${CURL_CA_PATH}" STREQUAL "auto")
unset(CURL_CA_PATH CACHE)
- set(CURL_CA_PATH_AUTODETECT TRUE)
+ if(NOT USE_NSS)
+ set(CURL_CA_PATH_AUTODETECT TRUE)
+ endif()
else()
set(CURL_CA_PATH_SET TRUE)
endif()
@@ -983,6 +1033,7 @@ check_symbol_exists(strlcat "${CURL_INCLUDES}" HAVE_STRLCAT)
check_symbol_exists(getpwuid "${CURL_INCLUDES}" HAVE_GETPWUID)
check_symbol_exists(getpwuid_r "${CURL_INCLUDES}" HAVE_GETPWUID_R)
check_symbol_exists(geteuid "${CURL_INCLUDES}" HAVE_GETEUID)
+check_symbol_exists(usleep "${CURL_INCLUDES}" HAVE_USLEEP)
check_symbol_exists(utime "${CURL_INCLUDES}" HAVE_UTIME)
check_symbol_exists(gmtime_r "${CURL_INCLUDES}" HAVE_GMTIME_R)
check_symbol_exists(localtime_r "${CURL_INCLUDES}" HAVE_LOCALTIME_R)
@@ -1010,6 +1061,7 @@ check_symbol_exists(ftruncate "${CURL_INCLUDES}" HAVE_FTRUNCATE)
check_symbol_exists(getprotobyname "${CURL_INCLUDES}" HAVE_GETPROTOBYNAME)
check_symbol_exists(getpeername "${CURL_INCLUDES}" HAVE_GETPEERNAME)
check_symbol_exists(getsockname "${CURL_INCLUDES}" HAVE_GETSOCKNAME)
+check_symbol_exists(if_nametoindex "${CURL_INCLUDES}" HAVE_IF_NAMETOINDEX)
check_symbol_exists(getrlimit "${CURL_INCLUDES}" HAVE_GETRLIMIT)
check_symbol_exists(setlocale "${CURL_INCLUDES}" HAVE_SETLOCALE)
check_symbol_exists(setmode "${CURL_INCLUDES}" HAVE_SETMODE)
@@ -1018,20 +1070,7 @@ check_symbol_exists(fcntl "${CURL_INCLUDES}" HAVE_FCNTL)
check_symbol_exists(ioctl "${CURL_INCLUDES}" HAVE_IOCTL)
check_symbol_exists(setsockopt "${CURL_INCLUDES}" HAVE_SETSOCKOPT)
check_function_exists(mach_absolute_time HAVE_MACH_ABSOLUTE_TIME)
-
-# symbol exists in win32, but function does not.
-if(WIN32)
- if(ENABLE_INET_PTON)
- check_function_exists(inet_pton HAVE_INET_PTON)
- # _WIN32_WINNT_VISTA (0x0600)
- add_definitions(-D_WIN32_WINNT=0x0600)
- else()
- # _WIN32_WINNT_WINXP (0x0501)
- add_definitions(-D_WIN32_WINNT=0x0501)
- endif()
-else()
- check_function_exists(inet_pton HAVE_INET_PTON)
-endif()
+check_symbol_exists(inet_pton "${CURL_INCLUDES}" HAVE_INET_PTON)
check_symbol_exists(fsetxattr "${CURL_INCLUDES}" HAVE_FSETXATTR)
if(HAVE_FSETXATTR)
@@ -1255,6 +1294,23 @@ if(CURL_WERROR)
endif()
endif()
+if(CURL_LTO)
+ if(CMAKE_VERSION VERSION_LESS 3.9)
+ message(FATAL_ERROR "Requested LTO but your cmake version ${CMAKE_VERSION} is to old. You need at least 3.9")
+ endif()
+
+ cmake_policy(SET CMP0069 NEW)
+
+ include(CheckIPOSupported)
+ check_ipo_supported(RESULT CURL_HAS_LTO OUTPUT CURL_LTO_ERROR LANGUAGES C)
+ if(CURL_HAS_LTO)
+ message(STATUS "LTO supported and enabled")
+ else()
+ message(FATAL_ERROR "LTO was requested - but compiler doesn't support it\n${CURL_LTO_ERROR}")
+ endif()
+endif()
+
+
# Ugly (but functional) way to include "Makefile.inc" by transforming it (= regenerate it).
function(transform_makefile_inc INPUT_FILE OUTPUT_FILE)
file(READ ${INPUT_FILE} MAKEFILE_INC_TEXT)
@@ -1309,14 +1365,22 @@ if(BUILD_TESTING)
add_subdirectory(tests)
endif()
+# NTLM support requires crypto function adaptions from various SSL libs
+# TODO alternative SSL libs tests for SSP1, GNUTLS, NSS
+if(NOT CURL_DISABLE_CRYPTO_AUTH AND (USE_OPENSSL OR USE_WINDOWS_SSPI OR USE_DARWINSSL OR USE_MBEDTLS OR USE_WIN32_CRYPTO))
+ set(use_ntlm ON)
+else()
+ set(use_ntlm OFF)
+endif()
+
# Helper to populate a list (_items) with a label when conditions (the remaining
# args) are satisfied
-function(_add_if label)
- # TODO need to disable policy CMP0054 (CMake 3.1) to allow this indirection
+macro(_add_if label)
+ # needs to be a macro to allow this indirection
if(${ARGN})
- set(_items ${_items} "${label}" PARENT_SCOPE)
+ set(_items ${_items} "${label}")
endif()
-endfunction()
+endmacro()
# Clear list and try to detect available features
set(_items)
@@ -1338,15 +1402,14 @@ _add_if("Kerberos" NOT CURL_DISABLE_CRYPTO_AUTH AND
(HAVE_GSSAPI OR USE_WINDOWS_SSPI))
# NTLM support requires crypto function adaptions from various SSL libs
# TODO alternative SSL libs tests for SSP1, GNUTLS, NSS
-if(NOT CURL_DISABLE_CRYPTO_AUTH AND (USE_OPENSSL OR USE_WINDOWS_SSPI OR USE_SECTRANSP OR USE_MBEDTLS))
- _add_if("NTLM" 1)
- # TODO missing option (autoconf: --enable-ntlm-wb)
- _add_if("NTLM_WB" NOT CURL_DISABLE_HTTP AND NTLM_WB_ENABLED)
-endif()
+_add_if("NTLM" use_ntlm)
+# TODO missing option (autoconf: --enable-ntlm-wb)
+_add_if("NTLM_WB" use_ntlm AND NOT CURL_DISABLE_HTTP AND NTLM_WB_ENABLED)
# TODO missing option (--enable-tls-srp), depends on GNUTLS_SRP/OPENSSL_SRP
_add_if("TLS-SRP" USE_TLS_SRP)
# TODO option --with-nghttp2 tests for nghttp2 lib and nghttp2/nghttp2.h header
_add_if("HTTP2" USE_NGHTTP2)
+_add_if("HTTPS-proxy" SSL_ENABLED AND (USE_OPENSSL OR USE_GNUTLS OR USE_NSS))
string(REPLACE ";" " " SUPPORT_FEATURES "${_items}")
message(STATUS "Enabled features: ${SUPPORT_FEATURES}")
@@ -1371,6 +1434,8 @@ _add_if("POP3" NOT CURL_DISABLE_POP3)
_add_if("POP3S" NOT CURL_DISABLE_POP3 AND SSL_ENABLED)
_add_if("IMAP" NOT CURL_DISABLE_IMAP)
_add_if("IMAPS" NOT CURL_DISABLE_IMAP AND SSL_ENABLED)
+_add_if("SMB" NOT CURL_DISABLE_SMB AND use_ntlm)
+_add_if("SMBS" NOT CURL_DISABLE_SMB AND SSL_ENABLED AND use_ntlm)
_add_if("SMTP" NOT CURL_DISABLE_SMTP)
_add_if("SMTPS" NOT CURL_DISABLE_SMTP AND SSL_ENABLED)
_add_if("SCP" USE_LIBSSH2)
@@ -1389,6 +1454,8 @@ _add_if("WinSSL" SSL_ENABLED AND USE_WINDOWS_SSPI)
_add_if("OpenSSL" SSL_ENABLED AND USE_OPENSSL)
_add_if("Secure Transport" SSL_ENABLED AND USE_SECTRANSP)
_add_if("mbedTLS" SSL_ENABLED AND USE_MBEDTLS)
+_add_if("BearSSL" SSL_ENABLED AND USE_BEARSSL)
+_add_if("NSS" SSL_ENABLED AND USE_NSS)
if(_items)
list(SORT _items)
endif()
diff --git a/Utilities/cmcurl/COPYING b/Utilities/cmcurl/COPYING
index 3528bd7..9d9e4af 100644
--- a/Utilities/cmcurl/COPYING
+++ b/Utilities/cmcurl/COPYING
@@ -1,6 +1,6 @@
COPYRIGHT AND PERMISSION NOTICE
-Copyright (c) 1996 - 2019, Daniel Stenberg, <daniel@haxx.se>, and many
+Copyright (c) 1996 - 2020, Daniel Stenberg, <daniel@haxx.se>, and many
contributors, see the THANKS file.
All rights reserved.
diff --git a/Utilities/cmcurl/include/curl/curl.h b/Utilities/cmcurl/include/curl/curl.h
index 089c427..7e99d5e 100644
--- a/Utilities/cmcurl/include/curl/curl.h
+++ b/Utilities/cmcurl/include/curl/curl.h
@@ -1,5 +1,5 @@
-#ifndef __CURL_CURL_H
-#define __CURL_CURL_H
+#ifndef CURLINC_CURL_H
+#define CURLINC_CURL_H
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -38,12 +38,12 @@
#include "system.h" /* determine things run-time */
/*
- * Define WIN32 when build target is Win32 API
+ * Define CURL_WIN32 when build target is Win32 API
*/
-#if (defined(_WIN32) || defined(__WIN32__)) && \
- !defined(WIN32) && !defined(__SYMBIAN32__)
-#define WIN32
+#if (defined(_WIN32) || defined(__WIN32__) || defined(WIN32)) && \
+ !defined(__SYMBIAN32__)
+#define CURL_WIN32
#endif
#include <stdio.h>
@@ -58,7 +58,7 @@
#include <sys/types.h>
#include <time.h>
-#if defined(WIN32) && !defined(_WIN32_WCE) && !defined(__CYGWIN__)
+#if defined(CURL_WIN32) && !defined(_WIN32_WCE) && !defined(__CYGWIN__)
#if !(defined(_WINSOCKAPI_) || defined(_WINSOCK_H) || \
defined(__LWIP_OPT_H__) || defined(LWIP_HDR_OPT_H))
/* The check above prevents the winsock2 inclusion if winsock.h already was
@@ -79,11 +79,11 @@
#include <sys/select.h>
#endif
-#if !defined(WIN32) && !defined(_WIN32_WCE)
+#if !defined(CURL_WIN32) && !defined(_WIN32_WCE)
#include <sys/socket.h>
#endif
-#if !defined(WIN32) && !defined(__WATCOMC__) && !defined(__VXWORKS__)
+#if !defined(CURL_WIN32) && !defined(__WATCOMC__) && !defined(__VXWORKS__)
#include <sys/time.h>
#endif
@@ -114,7 +114,7 @@ typedef void CURLSH;
#ifdef CURL_STATICLIB
# define CURL_EXTERN
-#elif defined(WIN32) || defined(__SYMBIAN32__) || \
+#elif defined(CURL_WIN32) || defined(__SYMBIAN32__) || \
(__has_declspec_attribute(dllexport) && \
__has_declspec_attribute(dllimport))
# if defined(BUILDING_LIBCURL)
@@ -130,7 +130,7 @@ typedef void CURLSH;
#ifndef curl_socket_typedef
/* socket typedef */
-#if defined(WIN32) && !defined(__LWIP_OPT_H__) && !defined(LWIP_HDR_OPT_H)
+#if defined(CURL_WIN32) && !defined(__LWIP_OPT_H__) && !defined(LWIP_HDR_OPT_H)
typedef SOCKET curl_socket_t;
#define CURL_SOCKET_BAD INVALID_SOCKET
#else
@@ -154,7 +154,8 @@ typedef enum {
CURLSSLBACKEND_SECURETRANSPORT = 9,
CURLSSLBACKEND_AXTLS = 10, /* never used since 7.63.0 */
CURLSSLBACKEND_MBEDTLS = 11,
- CURLSSLBACKEND_MESALINK = 12
+ CURLSSLBACKEND_MESALINK = 12,
+ CURLSSLBACKEND_BEARSSL = 13
} curl_sslbackend;
/* aliases for library clones and renames */
@@ -209,16 +210,22 @@ struct curl_httppost {
set. Added in 7.46.0 */
};
-/* This is the CURLOPT_PROGRESSFUNCTION callback proto. It is now considered
- deprecated but was the only choice up until 7.31.0 */
+
+/* This is a return code for the progress callback that, when returned, will
+ signal libcurl to continue executing the default progress function */
+#define CURL_PROGRESSFUNC_CONTINUE 0x10000001
+
+/* This is the CURLOPT_PROGRESSFUNCTION callback prototype. It is now
+ considered deprecated but was the only choice up until 7.31.0 */
typedef int (*curl_progress_callback)(void *clientp,
double dltotal,
double dlnow,
double ultotal,
double ulnow);
-/* This is the CURLOPT_XFERINFOFUNCTION callback proto. It was introduced in
- 7.32.0, it avoids floating point and provides more detailed information. */
+/* This is the CURLOPT_XFERINFOFUNCTION callback prototype. It was introduced
+ in 7.32.0, avoids the use of floating point numbers and provides more
+ detailed information. */
typedef int (*curl_xferinfo_callback)(void *clientp,
curl_off_t dltotal,
curl_off_t dlnow,
@@ -283,10 +290,7 @@ typedef enum {
#define CURLFINFOFLAG_KNOWN_SIZE (1<<6)
#define CURLFINFOFLAG_KNOWN_HLINKCOUNT (1<<7)
-/* Content of this structure depends on information which is known and is
- achievable (e.g. by FTP LIST parsing). Please see the url_easy_setopt(3) man
- page for callbacks returning this structure -- some fields are mandatory,
- some others are optional. The FLAG field has special meaning. */
+/* Information about a single file, used when doing FTP wildcard matching */
struct curl_fileinfo {
char *filename;
curlfiletype filetype;
@@ -602,6 +606,10 @@ typedef enum {
*/
CURLE_RECURSIVE_API_CALL, /* 93 - an api function was called from
inside a callback */
+ CURLE_AUTH_ERROR, /* 94 - an authentication function returned an
+ error */
+ CURLE_HTTP3, /* 95 - An HTTP/3 layer problem */
+ CURLE_QUIC_CONNECT_ERROR, /* 96 - QUIC connection error */
CURL_LAST /* never use! */
} CURLcode;
@@ -685,8 +693,10 @@ typedef enum {
typedef CURLcode (*curl_conv_callback)(char *buffer, size_t length);
typedef CURLcode (*curl_ssl_ctx_callback)(CURL *curl, /* easy handle */
- void *ssl_ctx, /* actually an
- OpenSSL SSL_CTX */
+ void *ssl_ctx, /* actually an OpenSSL
+ or WolfSSL SSL_CTX,
+ or an mbedTLS
+ mbedtls_ssl_config */
void *userptr);
typedef enum {
@@ -819,6 +829,10 @@ typedef enum {
SSL backends where such behavior is present. */
#define CURLSSLOPT_NO_REVOKE (1<<1)
+/* - NO_PARTIALCHAIN tells libcurl to *NOT* accept a partial certificate chain
+ if possible. The OpenSSL backend has this ability. */
+#define CURLSSLOPT_NO_PARTIALCHAIN (1<<2)
+
/* The default connection attempt delay in milliseconds for happy eyeballs.
CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.3 and happy-eyeballs-timeout-ms.d document
this value, keep them in sync. */
@@ -883,7 +897,7 @@ typedef enum {
/* CURLALTSVC_* are bits for the CURLOPT_ALTSVC_CTRL option */
#define CURLALTSVC_IMMEDIATELY (1<<0)
-#define CURLALTSVC_ALTUSED (1<<1)
+
#define CURLALTSVC_READONLYFILE (1<<2)
#define CURLALTSVC_H1 (1<<3)
#define CURLALTSVC_H2 (1<<4)
@@ -924,79 +938,64 @@ typedef enum {
but 32 */
#define CURLOPTTYPE_LONG 0
#define CURLOPTTYPE_OBJECTPOINT 10000
-#define CURLOPTTYPE_STRINGPOINT 10000
#define CURLOPTTYPE_FUNCTIONPOINT 20000
#define CURLOPTTYPE_OFF_T 30000
/* *STRINGPOINT is an alias for OBJECTPOINT to allow tools to extract the
string options from the header file */
-/* name is uppercase CURLOPT_<name>,
- type is one of the defined CURLOPTTYPE_<type>
- number is unique identifier */
-#ifdef CINIT
-#undef CINIT
-#endif
-#ifdef CURL_ISOCPP
-#define CINIT(na,t,nu) CURLOPT_ ## na = CURLOPTTYPE_ ## t + nu
-#else
-/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */
-#define LONG CURLOPTTYPE_LONG
-#define OBJECTPOINT CURLOPTTYPE_OBJECTPOINT
-#define STRINGPOINT CURLOPTTYPE_OBJECTPOINT
-#define FUNCTIONPOINT CURLOPTTYPE_FUNCTIONPOINT
-#define OFF_T CURLOPTTYPE_OFF_T
-#define CINIT(name,type,number) CURLOPT_/**/name = type + number
-#endif
+#define CURLOPT(na,t,nu) na = t + nu
+
+/* handy aliases that make no run-time difference */
+#define CURLOPTTYPE_STRINGPOINT CURLOPTTYPE_OBJECTPOINT
+#define CURLOPTTYPE_SLISTPOINT CURLOPTTYPE_OBJECTPOINT
/*
- * This macro-mania below setups the CURLOPT_[what] enum, to be used with
- * curl_easy_setopt(). The first argument in the CINIT() macro is the [what]
- * word.
+ * All CURLOPT_* values.
*/
typedef enum {
/* This is the FILE * or void * the regular output should be written to. */
- CINIT(WRITEDATA, OBJECTPOINT, 1),
+ CURLOPT(CURLOPT_WRITEDATA, CURLOPTTYPE_OBJECTPOINT, 1),
/* The full URL to get/put */
- CINIT(URL, STRINGPOINT, 2),
+ CURLOPT(CURLOPT_URL, CURLOPTTYPE_STRINGPOINT, 2),
/* Port number to connect to, if other than default. */
- CINIT(PORT, LONG, 3),
+ CURLOPT(CURLOPT_PORT, CURLOPTTYPE_LONG, 3),
/* Name of proxy to use. */
- CINIT(PROXY, STRINGPOINT, 4),
+ CURLOPT(CURLOPT_PROXY, CURLOPTTYPE_STRINGPOINT, 4),
/* "user:password;options" to use when fetching. */
- CINIT(USERPWD, STRINGPOINT, 5),
+ CURLOPT(CURLOPT_USERPWD, CURLOPTTYPE_STRINGPOINT, 5),
/* "user:password" to use with proxy. */
- CINIT(PROXYUSERPWD, STRINGPOINT, 6),
+ CURLOPT(CURLOPT_PROXYUSERPWD, CURLOPTTYPE_STRINGPOINT, 6),
/* Range to get, specified as an ASCII string. */
- CINIT(RANGE, STRINGPOINT, 7),
+ CURLOPT(CURLOPT_RANGE, CURLOPTTYPE_STRINGPOINT, 7),
/* not used */
/* Specified file stream to upload from (use as input): */
- CINIT(READDATA, OBJECTPOINT, 9),
+ CURLOPT(CURLOPT_READDATA, CURLOPTTYPE_OBJECTPOINT, 9),
/* Buffer to receive error messages in, must be at least CURL_ERROR_SIZE
* bytes big. */
- CINIT(ERRORBUFFER, OBJECTPOINT, 10),
+ CURLOPT(CURLOPT_ERRORBUFFER, CURLOPTTYPE_OBJECTPOINT, 10),
/* Function that will be called to store the output (instead of fwrite). The
* parameters will use fwrite() syntax, make sure to follow them. */
- CINIT(WRITEFUNCTION, FUNCTIONPOINT, 11),
+ CURLOPT(CURLOPT_WRITEFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 11),
/* Function that will be called to read the input (instead of fread). The
* parameters will use fread() syntax, make sure to follow them. */
- CINIT(READFUNCTION, FUNCTIONPOINT, 12),
+ CURLOPT(CURLOPT_READFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 12),
/* Time-out the read operation after this amount of seconds */
- CINIT(TIMEOUT, LONG, 13),
+ CURLOPT(CURLOPT_TIMEOUT, CURLOPTTYPE_LONG, 13),
/* If the CURLOPT_INFILE is used, this can be used to inform libcurl about
* how large the file being sent really is. That allows better error
@@ -1007,20 +1006,20 @@ typedef enum {
* which takes an off_t type, allowing platforms with larger off_t
* sizes to handle larger files. See below for INFILESIZE_LARGE.
*/
- CINIT(INFILESIZE, LONG, 14),
+ CURLOPT(CURLOPT_INFILESIZE, CURLOPTTYPE_LONG, 14),
/* POST static input fields. */
- CINIT(POSTFIELDS, OBJECTPOINT, 15),
+ CURLOPT(CURLOPT_POSTFIELDS, CURLOPTTYPE_OBJECTPOINT, 15),
/* Set the referrer page (needed by some CGIs) */
- CINIT(REFERER, STRINGPOINT, 16),
+ CURLOPT(CURLOPT_REFERER, CURLOPTTYPE_STRINGPOINT, 16),
/* Set the FTP PORT string (interface name, named or numerical IP address)
Use i.e '-' to use default address. */
- CINIT(FTPPORT, STRINGPOINT, 17),
+ CURLOPT(CURLOPT_FTPPORT, CURLOPTTYPE_STRINGPOINT, 17),
/* Set the User-Agent string (examined by some CGIs) */
- CINIT(USERAGENT, STRINGPOINT, 18),
+ CURLOPT(CURLOPT_USERAGENT, CURLOPTTYPE_STRINGPOINT, 18),
/* If the download receives less than "low speed limit" bytes/second
* during "low speed time" seconds, the operations is aborted.
@@ -1029,10 +1028,10 @@ typedef enum {
*/
/* Set the "low speed limit" */
- CINIT(LOW_SPEED_LIMIT, LONG, 19),
+ CURLOPT(CURLOPT_LOW_SPEED_LIMIT, CURLOPTTYPE_LONG, 19),
/* Set the "low speed time" */
- CINIT(LOW_SPEED_TIME, LONG, 20),
+ CURLOPT(CURLOPT_LOW_SPEED_TIME, CURLOPTTYPE_LONG, 20),
/* Set the continuation offset.
*
@@ -1040,48 +1039,48 @@ typedef enum {
* off_t types, allowing for large file offsets on platforms which
* use larger-than-32-bit off_t's. Look below for RESUME_FROM_LARGE.
*/
- CINIT(RESUME_FROM, LONG, 21),
+ CURLOPT(CURLOPT_RESUME_FROM, CURLOPTTYPE_LONG, 21),
/* Set cookie in request: */
- CINIT(COOKIE, STRINGPOINT, 22),
+ CURLOPT(CURLOPT_COOKIE, CURLOPTTYPE_STRINGPOINT, 22),
/* This points to a linked list of headers, struct curl_slist kind. This
list is also used for RTSP (in spite of its name) */
- CINIT(HTTPHEADER, OBJECTPOINT, 23),
+ CURLOPT(CURLOPT_HTTPHEADER, CURLOPTTYPE_SLISTPOINT, 23),
/* This points to a linked list of post entries, struct curl_httppost */
- CINIT(HTTPPOST, OBJECTPOINT, 24),
+ CURLOPT(CURLOPT_HTTPPOST, CURLOPTTYPE_OBJECTPOINT, 24),
/* name of the file keeping your private SSL-certificate */
- CINIT(SSLCERT, STRINGPOINT, 25),
+ CURLOPT(CURLOPT_SSLCERT, CURLOPTTYPE_STRINGPOINT, 25),
/* password for the SSL or SSH private key */
- CINIT(KEYPASSWD, STRINGPOINT, 26),
+ CURLOPT(CURLOPT_KEYPASSWD, CURLOPTTYPE_STRINGPOINT, 26),
/* send TYPE parameter? */
- CINIT(CRLF, LONG, 27),
+ CURLOPT(CURLOPT_CRLF, CURLOPTTYPE_LONG, 27),
/* send linked-list of QUOTE commands */
- CINIT(QUOTE, OBJECTPOINT, 28),
+ CURLOPT(CURLOPT_QUOTE, CURLOPTTYPE_SLISTPOINT, 28),
/* send FILE * or void * to store headers to, if you use a callback it
is simply passed to the callback unmodified */
- CINIT(HEADERDATA, OBJECTPOINT, 29),
+ CURLOPT(CURLOPT_HEADERDATA, CURLOPTTYPE_OBJECTPOINT, 29),
/* point to a file to read the initial cookies from, also enables
"cookie awareness" */
- CINIT(COOKIEFILE, STRINGPOINT, 31),
+ CURLOPT(CURLOPT_COOKIEFILE, CURLOPTTYPE_STRINGPOINT, 31),
/* What version to specifically try to use.
See CURL_SSLVERSION defines below. */
- CINIT(SSLVERSION, LONG, 32),
+ CURLOPT(CURLOPT_SSLVERSION, CURLOPTTYPE_LONG, 32),
/* What kind of HTTP time condition to use, see defines */
- CINIT(TIMECONDITION, LONG, 33),
+ CURLOPT(CURLOPT_TIMECONDITION, CURLOPTTYPE_LONG, 33),
/* Time to use with the above condition. Specified in number of seconds
since 1 Jan 1970 */
- CINIT(TIMEVALUE, LONG, 34),
+ CURLOPT(CURLOPT_TIMEVALUE, CURLOPTTYPE_LONG, 34),
/* 35 = OBSOLETE */
@@ -1089,37 +1088,58 @@ typedef enum {
HTTP: DELETE, TRACE and others
FTP: to use a different list command
*/
- CINIT(CUSTOMREQUEST, STRINGPOINT, 36),
+ CURLOPT(CURLOPT_CUSTOMREQUEST, CURLOPTTYPE_STRINGPOINT, 36),
/* FILE handle to use instead of stderr */
- CINIT(STDERR, OBJECTPOINT, 37),
+ CURLOPT(CURLOPT_STDERR, CURLOPTTYPE_OBJECTPOINT, 37),
/* 38 is not used */
/* send linked-list of post-transfer QUOTE commands */
- CINIT(POSTQUOTE, OBJECTPOINT, 39),
+ CURLOPT(CURLOPT_POSTQUOTE, CURLOPTTYPE_SLISTPOINT, 39),
+
+ /* OBSOLETE, do not use! */
+ CURLOPT(CURLOPT_OBSOLETE40, CURLOPTTYPE_OBJECTPOINT, 40),
+
+ /* talk a lot */
+ CURLOPT(CURLOPT_VERBOSE, CURLOPTTYPE_LONG, 41),
+
+ /* throw the header out too */
+ CURLOPT(CURLOPT_HEADER, CURLOPTTYPE_LONG, 42),
+
+ /* shut off the progress meter */
+ CURLOPT(CURLOPT_NOPROGRESS, CURLOPTTYPE_LONG, 43),
+
+ /* use HEAD to get http document */
+ CURLOPT(CURLOPT_NOBODY, CURLOPTTYPE_LONG, 44),
+
+ /* no output on http error codes >= 400 */
+ CURLOPT(CURLOPT_FAILONERROR, CURLOPTTYPE_LONG, 45),
- CINIT(OBSOLETE40, OBJECTPOINT, 40), /* OBSOLETE, do not use! */
+ /* this is an upload */
+ CURLOPT(CURLOPT_UPLOAD, CURLOPTTYPE_LONG, 46),
- CINIT(VERBOSE, LONG, 41), /* talk a lot */
- CINIT(HEADER, LONG, 42), /* throw the header out too */
- CINIT(NOPROGRESS, LONG, 43), /* shut off the progress meter */
- CINIT(NOBODY, LONG, 44), /* use HEAD to get http document */
- CINIT(FAILONERROR, LONG, 45), /* no output on http error codes >= 400 */
- CINIT(UPLOAD, LONG, 46), /* this is an upload */
- CINIT(POST, LONG, 47), /* HTTP POST method */
- CINIT(DIRLISTONLY, LONG, 48), /* bare names when listing directories */
+ /* HTTP POST method */
+ CURLOPT(CURLOPT_POST, CURLOPTTYPE_LONG, 47),
- CINIT(APPEND, LONG, 50), /* Append instead of overwrite on upload! */
+ /* bare names when listing directories */
+ CURLOPT(CURLOPT_DIRLISTONLY, CURLOPTTYPE_LONG, 48),
+
+ /* Append instead of overwrite on upload! */
+ CURLOPT(CURLOPT_APPEND, CURLOPTTYPE_LONG, 50),
/* Specify whether to read the user+password from the .netrc or the URL.
* This must be one of the CURL_NETRC_* enums below. */
- CINIT(NETRC, LONG, 51),
+ CURLOPT(CURLOPT_NETRC, CURLOPTTYPE_LONG, 51),
+
+ /* use Location: Luke! */
+ CURLOPT(CURLOPT_FOLLOWLOCATION, CURLOPTTYPE_LONG, 52),
- CINIT(FOLLOWLOCATION, LONG, 52), /* use Location: Luke! */
+ /* transfer data in text/ASCII format */
+ CURLOPT(CURLOPT_TRANSFERTEXT, CURLOPTTYPE_LONG, 53),
- CINIT(TRANSFERTEXT, LONG, 53), /* transfer data in text/ASCII format */
- CINIT(PUT, LONG, 54), /* HTTP PUT */
+ /* HTTP PUT */
+ CURLOPT(CURLOPT_PUT, CURLOPTTYPE_LONG, 54),
/* 55 = OBSOLETE */
@@ -1127,265 +1147,267 @@ typedef enum {
* Function that will be called instead of the internal progress display
* function. This function should be defined as the curl_progress_callback
* prototype defines. */
- CINIT(PROGRESSFUNCTION, FUNCTIONPOINT, 56),
+ CURLOPT(CURLOPT_PROGRESSFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 56),
/* Data passed to the CURLOPT_PROGRESSFUNCTION and CURLOPT_XFERINFOFUNCTION
callbacks */
- CINIT(PROGRESSDATA, OBJECTPOINT, 57),
+ CURLOPT(CURLOPT_PROGRESSDATA, CURLOPTTYPE_OBJECTPOINT, 57),
#define CURLOPT_XFERINFODATA CURLOPT_PROGRESSDATA
/* We want the referrer field set automatically when following locations */
- CINIT(AUTOREFERER, LONG, 58),
+ CURLOPT(CURLOPT_AUTOREFERER, CURLOPTTYPE_LONG, 58),
/* Port of the proxy, can be set in the proxy string as well with:
"[host]:[port]" */
- CINIT(PROXYPORT, LONG, 59),
+ CURLOPT(CURLOPT_PROXYPORT, CURLOPTTYPE_LONG, 59),
/* size of the POST input data, if strlen() is not good to use */
- CINIT(POSTFIELDSIZE, LONG, 60),
+ CURLOPT(CURLOPT_POSTFIELDSIZE, CURLOPTTYPE_LONG, 60),
/* tunnel non-http operations through a HTTP proxy */
- CINIT(HTTPPROXYTUNNEL, LONG, 61),
+ CURLOPT(CURLOPT_HTTPPROXYTUNNEL, CURLOPTTYPE_LONG, 61),
/* Set the interface string to use as outgoing network interface */
- CINIT(INTERFACE, STRINGPOINT, 62),
+ CURLOPT(CURLOPT_INTERFACE, CURLOPTTYPE_STRINGPOINT, 62),
/* Set the krb4/5 security level, this also enables krb4/5 awareness. This
* is a string, 'clear', 'safe', 'confidential' or 'private'. If the string
* is set but doesn't match one of these, 'private' will be used. */
- CINIT(KRBLEVEL, STRINGPOINT, 63),
+ CURLOPT(CURLOPT_KRBLEVEL, CURLOPTTYPE_STRINGPOINT, 63),
/* Set if we should verify the peer in ssl handshake, set 1 to verify. */
- CINIT(SSL_VERIFYPEER, LONG, 64),
+ CURLOPT(CURLOPT_SSL_VERIFYPEER, CURLOPTTYPE_LONG, 64),
/* The CApath or CAfile used to validate the peer certificate
this option is used only if SSL_VERIFYPEER is true */
- CINIT(CAINFO, STRINGPOINT, 65),
+ CURLOPT(CURLOPT_CAINFO, CURLOPTTYPE_STRINGPOINT, 65),
/* 66 = OBSOLETE */
/* 67 = OBSOLETE */
/* Maximum number of http redirects to follow */
- CINIT(MAXREDIRS, LONG, 68),
+ CURLOPT(CURLOPT_MAXREDIRS, CURLOPTTYPE_LONG, 68),
/* Pass a long set to 1 to get the date of the requested document (if
possible)! Pass a zero to shut it off. */
- CINIT(FILETIME, LONG, 69),
+ CURLOPT(CURLOPT_FILETIME, CURLOPTTYPE_LONG, 69),
/* This points to a linked list of telnet options */
- CINIT(TELNETOPTIONS, OBJECTPOINT, 70),
+ CURLOPT(CURLOPT_TELNETOPTIONS, CURLOPTTYPE_SLISTPOINT, 70),
/* Max amount of cached alive connections */
- CINIT(MAXCONNECTS, LONG, 71),
+ CURLOPT(CURLOPT_MAXCONNECTS, CURLOPTTYPE_LONG, 71),
- CINIT(OBSOLETE72, LONG, 72), /* OBSOLETE, do not use! */
+ /* OBSOLETE, do not use! */
+ CURLOPT(CURLOPT_OBSOLETE72, CURLOPTTYPE_LONG, 72),
/* 73 = OBSOLETE */
/* Set to explicitly use a new connection for the upcoming transfer.
Do not use this unless you're absolutely sure of this, as it makes the
operation slower and is less friendly for the network. */
- CINIT(FRESH_CONNECT, LONG, 74),
+ CURLOPT(CURLOPT_FRESH_CONNECT, CURLOPTTYPE_LONG, 74),
/* Set to explicitly forbid the upcoming transfer's connection to be re-used
when done. Do not use this unless you're absolutely sure of this, as it
makes the operation slower and is less friendly for the network. */
- CINIT(FORBID_REUSE, LONG, 75),
+ CURLOPT(CURLOPT_FORBID_REUSE, CURLOPTTYPE_LONG, 75),
/* Set to a file name that contains random data for libcurl to use to
seed the random engine when doing SSL connects. */
- CINIT(RANDOM_FILE, STRINGPOINT, 76),
+ CURLOPT(CURLOPT_RANDOM_FILE, CURLOPTTYPE_STRINGPOINT, 76),
/* Set to the Entropy Gathering Daemon socket pathname */
- CINIT(EGDSOCKET, STRINGPOINT, 77),
+ CURLOPT(CURLOPT_EGDSOCKET, CURLOPTTYPE_STRINGPOINT, 77),
/* Time-out connect operations after this amount of seconds, if connects are
OK within this time, then fine... This only aborts the connect phase. */
- CINIT(CONNECTTIMEOUT, LONG, 78),
+ CURLOPT(CURLOPT_CONNECTTIMEOUT, CURLOPTTYPE_LONG, 78),
/* Function that will be called to store headers (instead of fwrite). The
* parameters will use fwrite() syntax, make sure to follow them. */
- CINIT(HEADERFUNCTION, FUNCTIONPOINT, 79),
+ CURLOPT(CURLOPT_HEADERFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 79),
/* Set this to force the HTTP request to get back to GET. Only really usable
if POST, PUT or a custom request have been used first.
*/
- CINIT(HTTPGET, LONG, 80),
+ CURLOPT(CURLOPT_HTTPGET, CURLOPTTYPE_LONG, 80),
/* Set if we should verify the Common name from the peer certificate in ssl
* handshake, set 1 to check existence, 2 to ensure that it matches the
* provided hostname. */
- CINIT(SSL_VERIFYHOST, LONG, 81),
+ CURLOPT(CURLOPT_SSL_VERIFYHOST, CURLOPTTYPE_LONG, 81),
/* Specify which file name to write all known cookies in after completed
operation. Set file name to "-" (dash) to make it go to stdout. */
- CINIT(COOKIEJAR, STRINGPOINT, 82),
+ CURLOPT(CURLOPT_COOKIEJAR, CURLOPTTYPE_STRINGPOINT, 82),
/* Specify which SSL ciphers to use */
- CINIT(SSL_CIPHER_LIST, STRINGPOINT, 83),
+ CURLOPT(CURLOPT_SSL_CIPHER_LIST, CURLOPTTYPE_STRINGPOINT, 83),
/* Specify which HTTP version to use! This must be set to one of the
CURL_HTTP_VERSION* enums set below. */
- CINIT(HTTP_VERSION, LONG, 84),
+ CURLOPT(CURLOPT_HTTP_VERSION, CURLOPTTYPE_LONG, 84),
/* Specifically switch on or off the FTP engine's use of the EPSV command. By
default, that one will always be attempted before the more traditional
PASV command. */
- CINIT(FTP_USE_EPSV, LONG, 85),
+ CURLOPT(CURLOPT_FTP_USE_EPSV, CURLOPTTYPE_LONG, 85),
/* type of the file keeping your SSL-certificate ("DER", "PEM", "ENG") */
- CINIT(SSLCERTTYPE, STRINGPOINT, 86),
+ CURLOPT(CURLOPT_SSLCERTTYPE, CURLOPTTYPE_STRINGPOINT, 86),
/* name of the file keeping your private SSL-key */
- CINIT(SSLKEY, STRINGPOINT, 87),
+ CURLOPT(CURLOPT_SSLKEY, CURLOPTTYPE_STRINGPOINT, 87),
/* type of the file keeping your private SSL-key ("DER", "PEM", "ENG") */
- CINIT(SSLKEYTYPE, STRINGPOINT, 88),
+ CURLOPT(CURLOPT_SSLKEYTYPE, CURLOPTTYPE_STRINGPOINT, 88),
/* crypto engine for the SSL-sub system */
- CINIT(SSLENGINE, STRINGPOINT, 89),
+ CURLOPT(CURLOPT_SSLENGINE, CURLOPTTYPE_STRINGPOINT, 89),
/* set the crypto engine for the SSL-sub system as default
the param has no meaning...
*/
- CINIT(SSLENGINE_DEFAULT, LONG, 90),
+ CURLOPT(CURLOPT_SSLENGINE_DEFAULT, CURLOPTTYPE_LONG, 90),
/* Non-zero value means to use the global dns cache */
- CINIT(DNS_USE_GLOBAL_CACHE, LONG, 91), /* DEPRECATED, do not use! */
+ /* DEPRECATED, do not use! */
+ CURLOPT(CURLOPT_DNS_USE_GLOBAL_CACHE, CURLOPTTYPE_LONG, 91),
/* DNS cache timeout */
- CINIT(DNS_CACHE_TIMEOUT, LONG, 92),
+ CURLOPT(CURLOPT_DNS_CACHE_TIMEOUT, CURLOPTTYPE_LONG, 92),
/* send linked-list of pre-transfer QUOTE commands */
- CINIT(PREQUOTE, OBJECTPOINT, 93),
+ CURLOPT(CURLOPT_PREQUOTE, CURLOPTTYPE_SLISTPOINT, 93),
/* set the debug function */
- CINIT(DEBUGFUNCTION, FUNCTIONPOINT, 94),
+ CURLOPT(CURLOPT_DEBUGFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 94),
/* set the data for the debug function */
- CINIT(DEBUGDATA, OBJECTPOINT, 95),
+ CURLOPT(CURLOPT_DEBUGDATA, CURLOPTTYPE_OBJECTPOINT, 95),
/* mark this as start of a cookie session */
- CINIT(COOKIESESSION, LONG, 96),
+ CURLOPT(CURLOPT_COOKIESESSION, CURLOPTTYPE_LONG, 96),
/* The CApath directory used to validate the peer certificate
this option is used only if SSL_VERIFYPEER is true */
- CINIT(CAPATH, STRINGPOINT, 97),
+ CURLOPT(CURLOPT_CAPATH, CURLOPTTYPE_STRINGPOINT, 97),
/* Instruct libcurl to use a smaller receive buffer */
- CINIT(BUFFERSIZE, LONG, 98),
+ CURLOPT(CURLOPT_BUFFERSIZE, CURLOPTTYPE_LONG, 98),
/* Instruct libcurl to not use any signal/alarm handlers, even when using
timeouts. This option is useful for multi-threaded applications.
See libcurl-the-guide for more background information. */
- CINIT(NOSIGNAL, LONG, 99),
+ CURLOPT(CURLOPT_NOSIGNAL, CURLOPTTYPE_LONG, 99),
/* Provide a CURLShare for mutexing non-ts data */
- CINIT(SHARE, OBJECTPOINT, 100),
+ CURLOPT(CURLOPT_SHARE, CURLOPTTYPE_OBJECTPOINT, 100),
/* indicates type of proxy. accepted values are CURLPROXY_HTTP (default),
CURLPROXY_HTTPS, CURLPROXY_SOCKS4, CURLPROXY_SOCKS4A and
CURLPROXY_SOCKS5. */
- CINIT(PROXYTYPE, LONG, 101),
+ CURLOPT(CURLOPT_PROXYTYPE, CURLOPTTYPE_LONG, 101),
/* Set the Accept-Encoding string. Use this to tell a server you would like
the response to be compressed. Before 7.21.6, this was known as
CURLOPT_ENCODING */
- CINIT(ACCEPT_ENCODING, STRINGPOINT, 102),
+ CURLOPT(CURLOPT_ACCEPT_ENCODING, CURLOPTTYPE_STRINGPOINT, 102),
/* Set pointer to private data */
- CINIT(PRIVATE, OBJECTPOINT, 103),
+ CURLOPT(CURLOPT_PRIVATE, CURLOPTTYPE_OBJECTPOINT, 103),
/* Set aliases for HTTP 200 in the HTTP Response header */
- CINIT(HTTP200ALIASES, OBJECTPOINT, 104),
+ CURLOPT(CURLOPT_HTTP200ALIASES, CURLOPTTYPE_SLISTPOINT, 104),
/* Continue to send authentication (user+password) when following locations,
even when hostname changed. This can potentially send off the name
and password to whatever host the server decides. */
- CINIT(UNRESTRICTED_AUTH, LONG, 105),
+ CURLOPT(CURLOPT_UNRESTRICTED_AUTH, CURLOPTTYPE_LONG, 105),
/* Specifically switch on or off the FTP engine's use of the EPRT command (
it also disables the LPRT attempt). By default, those ones will always be
attempted before the good old traditional PORT command. */
- CINIT(FTP_USE_EPRT, LONG, 106),
+ CURLOPT(CURLOPT_FTP_USE_EPRT, CURLOPTTYPE_LONG, 106),
/* Set this to a bitmask value to enable the particular authentications
methods you like. Use this in combination with CURLOPT_USERPWD.
Note that setting multiple bits may cause extra network round-trips. */
- CINIT(HTTPAUTH, LONG, 107),
+ CURLOPT(CURLOPT_HTTPAUTH, CURLOPTTYPE_LONG, 107),
- /* Set the ssl context callback function, currently only for OpenSSL ssl_ctx
- in second argument. The function must be matching the
- curl_ssl_ctx_callback proto. */
- CINIT(SSL_CTX_FUNCTION, FUNCTIONPOINT, 108),
+ /* Set the ssl context callback function, currently only for OpenSSL or
+ WolfSSL ssl_ctx, or mbedTLS mbedtls_ssl_config in the second argument.
+ The function must match the curl_ssl_ctx_callback prototype. */
+ CURLOPT(CURLOPT_SSL_CTX_FUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 108),
/* Set the userdata for the ssl context callback function's third
argument */
- CINIT(SSL_CTX_DATA, OBJECTPOINT, 109),
+ CURLOPT(CURLOPT_SSL_CTX_DATA, CURLOPTTYPE_OBJECTPOINT, 109),
/* FTP Option that causes missing dirs to be created on the remote server.
In 7.19.4 we introduced the convenience enums for this option using the
CURLFTP_CREATE_DIR prefix.
*/
- CINIT(FTP_CREATE_MISSING_DIRS, LONG, 110),
+ CURLOPT(CURLOPT_FTP_CREATE_MISSING_DIRS, CURLOPTTYPE_LONG, 110),
/* Set this to a bitmask value to enable the particular authentications
methods you like. Use this in combination with CURLOPT_PROXYUSERPWD.
Note that setting multiple bits may cause extra network round-trips. */
- CINIT(PROXYAUTH, LONG, 111),
+ CURLOPT(CURLOPT_PROXYAUTH, CURLOPTTYPE_LONG, 111),
/* FTP option that changes the timeout, in seconds, associated with
getting a response. This is different from transfer timeout time and
essentially places a demand on the FTP server to acknowledge commands
in a timely manner. */
- CINIT(FTP_RESPONSE_TIMEOUT, LONG, 112),
+ CURLOPT(CURLOPT_FTP_RESPONSE_TIMEOUT, CURLOPTTYPE_LONG, 112),
#define CURLOPT_SERVER_RESPONSE_TIMEOUT CURLOPT_FTP_RESPONSE_TIMEOUT
/* Set this option to one of the CURL_IPRESOLVE_* defines (see below) to
tell libcurl to resolve names to those IP versions only. This only has
affect on systems with support for more than one, i.e IPv4 _and_ IPv6. */
- CINIT(IPRESOLVE, LONG, 113),
+ CURLOPT(CURLOPT_IPRESOLVE, CURLOPTTYPE_LONG, 113),
/* Set this option to limit the size of a file that will be downloaded from
an HTTP or FTP server.
Note there is also _LARGE version which adds large file support for
platforms which have larger off_t sizes. See MAXFILESIZE_LARGE below. */
- CINIT(MAXFILESIZE, LONG, 114),
+ CURLOPT(CURLOPT_MAXFILESIZE, CURLOPTTYPE_LONG, 114),
/* See the comment for INFILESIZE above, but in short, specifies
* the size of the file being uploaded. -1 means unknown.
*/
- CINIT(INFILESIZE_LARGE, OFF_T, 115),
+ CURLOPT(CURLOPT_INFILESIZE_LARGE, CURLOPTTYPE_OFF_T, 115),
- /* Sets the continuation offset. There is also a LONG version of this;
- * look above for RESUME_FROM.
+ /* Sets the continuation offset. There is also a CURLOPTTYPE_LONG version
+ * of this; look above for RESUME_FROM.
*/
- CINIT(RESUME_FROM_LARGE, OFF_T, 116),
+ CURLOPT(CURLOPT_RESUME_FROM_LARGE, CURLOPTTYPE_OFF_T, 116),
/* Sets the maximum size of data that will be downloaded from
* an HTTP or FTP server. See MAXFILESIZE above for the LONG version.
*/
- CINIT(MAXFILESIZE_LARGE, OFF_T, 117),
+ CURLOPT(CURLOPT_MAXFILESIZE_LARGE, CURLOPTTYPE_OFF_T, 117),
/* Set this option to the file name of your .netrc file you want libcurl
to parse (using the CURLOPT_NETRC option). If not set, libcurl will do
a poor attempt to find the user's home directory and check for a .netrc
file in there. */
- CINIT(NETRC_FILE, STRINGPOINT, 118),
+ CURLOPT(CURLOPT_NETRC_FILE, CURLOPTTYPE_STRINGPOINT, 118),
/* Enable SSL/TLS for FTP, pick one of:
CURLUSESSL_TRY - try using SSL, proceed anyway otherwise
CURLUSESSL_CONTROL - SSL for the control connection or fail
CURLUSESSL_ALL - SSL for all communication or fail
*/
- CINIT(USE_SSL, LONG, 119),
+ CURLOPT(CURLOPT_USE_SSL, CURLOPTTYPE_LONG, 119),
/* The _LARGE version of the standard POSTFIELDSIZE option */
- CINIT(POSTFIELDSIZE_LARGE, OFF_T, 120),
+ CURLOPT(CURLOPT_POSTFIELDSIZE_LARGE, CURLOPTTYPE_OFF_T, 120),
/* Enable/disable the TCP Nagle algorithm */
- CINIT(TCP_NODELAY, LONG, 121),
+ CURLOPT(CURLOPT_TCP_NODELAY, CURLOPTTYPE_LONG, 121),
/* 122 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */
/* 123 OBSOLETE. Gone in 7.16.0 */
@@ -1405,143 +1427,143 @@ typedef enum {
CURLFTPAUTH_SSL - try "AUTH SSL" first, then TLS
CURLFTPAUTH_TLS - try "AUTH TLS" first, then SSL
*/
- CINIT(FTPSSLAUTH, LONG, 129),
+ CURLOPT(CURLOPT_FTPSSLAUTH, CURLOPTTYPE_LONG, 129),
- CINIT(IOCTLFUNCTION, FUNCTIONPOINT, 130),
- CINIT(IOCTLDATA, OBJECTPOINT, 131),
+ CURLOPT(CURLOPT_IOCTLFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 130),
+ CURLOPT(CURLOPT_IOCTLDATA, CURLOPTTYPE_OBJECTPOINT, 131),
/* 132 OBSOLETE. Gone in 7.16.0 */
/* 133 OBSOLETE. Gone in 7.16.0 */
/* zero terminated string for pass on to the FTP server when asked for
"account" info */
- CINIT(FTP_ACCOUNT, STRINGPOINT, 134),
+ CURLOPT(CURLOPT_FTP_ACCOUNT, CURLOPTTYPE_STRINGPOINT, 134),
/* feed cookie into cookie engine */
- CINIT(COOKIELIST, STRINGPOINT, 135),
+ CURLOPT(CURLOPT_COOKIELIST, CURLOPTTYPE_STRINGPOINT, 135),
/* ignore Content-Length */
- CINIT(IGNORE_CONTENT_LENGTH, LONG, 136),
+ CURLOPT(CURLOPT_IGNORE_CONTENT_LENGTH, CURLOPTTYPE_LONG, 136),
/* Set to non-zero to skip the IP address received in a 227 PASV FTP server
response. Typically used for FTP-SSL purposes but is not restricted to
that. libcurl will then instead use the same IP address it used for the
control connection. */
- CINIT(FTP_SKIP_PASV_IP, LONG, 137),
+ CURLOPT(CURLOPT_FTP_SKIP_PASV_IP, CURLOPTTYPE_LONG, 137),
/* Select "file method" to use when doing FTP, see the curl_ftpmethod
above. */
- CINIT(FTP_FILEMETHOD, LONG, 138),
+ CURLOPT(CURLOPT_FTP_FILEMETHOD, CURLOPTTYPE_LONG, 138),
/* Local port number to bind the socket to */
- CINIT(LOCALPORT, LONG, 139),
+ CURLOPT(CURLOPT_LOCALPORT, CURLOPTTYPE_LONG, 139),
/* Number of ports to try, including the first one set with LOCALPORT.
Thus, setting it to 1 will make no additional attempts but the first.
*/
- CINIT(LOCALPORTRANGE, LONG, 140),
+ CURLOPT(CURLOPT_LOCALPORTRANGE, CURLOPTTYPE_LONG, 140),
/* no transfer, set up connection and let application use the socket by
extracting it with CURLINFO_LASTSOCKET */
- CINIT(CONNECT_ONLY, LONG, 141),
+ CURLOPT(CURLOPT_CONNECT_ONLY, CURLOPTTYPE_LONG, 141),
/* Function that will be called to convert from the
network encoding (instead of using the iconv calls in libcurl) */
- CINIT(CONV_FROM_NETWORK_FUNCTION, FUNCTIONPOINT, 142),
+ CURLOPT(CURLOPT_CONV_FROM_NETWORK_FUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 142),
/* Function that will be called to convert to the
network encoding (instead of using the iconv calls in libcurl) */
- CINIT(CONV_TO_NETWORK_FUNCTION, FUNCTIONPOINT, 143),
+ CURLOPT(CURLOPT_CONV_TO_NETWORK_FUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 143),
/* Function that will be called to convert from UTF8
(instead of using the iconv calls in libcurl)
Note that this is used only for SSL certificate processing */
- CINIT(CONV_FROM_UTF8_FUNCTION, FUNCTIONPOINT, 144),
+ CURLOPT(CURLOPT_CONV_FROM_UTF8_FUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 144),
/* if the connection proceeds too quickly then need to slow it down */
/* limit-rate: maximum number of bytes per second to send or receive */
- CINIT(MAX_SEND_SPEED_LARGE, OFF_T, 145),
- CINIT(MAX_RECV_SPEED_LARGE, OFF_T, 146),
+ CURLOPT(CURLOPT_MAX_SEND_SPEED_LARGE, CURLOPTTYPE_OFF_T, 145),
+ CURLOPT(CURLOPT_MAX_RECV_SPEED_LARGE, CURLOPTTYPE_OFF_T, 146),
/* Pointer to command string to send if USER/PASS fails. */
- CINIT(FTP_ALTERNATIVE_TO_USER, STRINGPOINT, 147),
+ CURLOPT(CURLOPT_FTP_ALTERNATIVE_TO_USER, CURLOPTTYPE_STRINGPOINT, 147),
/* callback function for setting socket options */
- CINIT(SOCKOPTFUNCTION, FUNCTIONPOINT, 148),
- CINIT(SOCKOPTDATA, OBJECTPOINT, 149),
+ CURLOPT(CURLOPT_SOCKOPTFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 148),
+ CURLOPT(CURLOPT_SOCKOPTDATA, CURLOPTTYPE_OBJECTPOINT, 149),
/* set to 0 to disable session ID re-use for this transfer, default is
enabled (== 1) */
- CINIT(SSL_SESSIONID_CACHE, LONG, 150),
+ CURLOPT(CURLOPT_SSL_SESSIONID_CACHE, CURLOPTTYPE_LONG, 150),
/* allowed SSH authentication methods */
- CINIT(SSH_AUTH_TYPES, LONG, 151),
+ CURLOPT(CURLOPT_SSH_AUTH_TYPES, CURLOPTTYPE_LONG, 151),
/* Used by scp/sftp to do public/private key authentication */
- CINIT(SSH_PUBLIC_KEYFILE, STRINGPOINT, 152),
- CINIT(SSH_PRIVATE_KEYFILE, STRINGPOINT, 153),
+ CURLOPT(CURLOPT_SSH_PUBLIC_KEYFILE, CURLOPTTYPE_STRINGPOINT, 152),
+ CURLOPT(CURLOPT_SSH_PRIVATE_KEYFILE, CURLOPTTYPE_STRINGPOINT, 153),
/* Send CCC (Clear Command Channel) after authentication */
- CINIT(FTP_SSL_CCC, LONG, 154),
+ CURLOPT(CURLOPT_FTP_SSL_CCC, CURLOPTTYPE_LONG, 154),
/* Same as TIMEOUT and CONNECTTIMEOUT, but with ms resolution */
- CINIT(TIMEOUT_MS, LONG, 155),
- CINIT(CONNECTTIMEOUT_MS, LONG, 156),
+ CURLOPT(CURLOPT_TIMEOUT_MS, CURLOPTTYPE_LONG, 155),
+ CURLOPT(CURLOPT_CONNECTTIMEOUT_MS, CURLOPTTYPE_LONG, 156),
/* set to zero to disable the libcurl's decoding and thus pass the raw body
data to the application even when it is encoded/compressed */
- CINIT(HTTP_TRANSFER_DECODING, LONG, 157),
- CINIT(HTTP_CONTENT_DECODING, LONG, 158),
+ CURLOPT(CURLOPT_HTTP_TRANSFER_DECODING, CURLOPTTYPE_LONG, 157),
+ CURLOPT(CURLOPT_HTTP_CONTENT_DECODING, CURLOPTTYPE_LONG, 158),
/* Permission used when creating new files and directories on the remote
server for protocols that support it, SFTP/SCP/FILE */
- CINIT(NEW_FILE_PERMS, LONG, 159),
- CINIT(NEW_DIRECTORY_PERMS, LONG, 160),
+ CURLOPT(CURLOPT_NEW_FILE_PERMS, CURLOPTTYPE_LONG, 159),
+ CURLOPT(CURLOPT_NEW_DIRECTORY_PERMS, CURLOPTTYPE_LONG, 160),
/* Set the behaviour of POST when redirecting. Values must be set to one
of CURL_REDIR* defines below. This used to be called CURLOPT_POST301 */
- CINIT(POSTREDIR, LONG, 161),
+ CURLOPT(CURLOPT_POSTREDIR, CURLOPTTYPE_LONG, 161),
/* used by scp/sftp to verify the host's public key */
- CINIT(SSH_HOST_PUBLIC_KEY_MD5, STRINGPOINT, 162),
+ CURLOPT(CURLOPT_SSH_HOST_PUBLIC_KEY_MD5, CURLOPTTYPE_STRINGPOINT, 162),
/* Callback function for opening socket (instead of socket(2)). Optionally,
callback is able change the address or refuse to connect returning
CURL_SOCKET_BAD. The callback should have type
curl_opensocket_callback */
- CINIT(OPENSOCKETFUNCTION, FUNCTIONPOINT, 163),
- CINIT(OPENSOCKETDATA, OBJECTPOINT, 164),
+ CURLOPT(CURLOPT_OPENSOCKETFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 163),
+ CURLOPT(CURLOPT_OPENSOCKETDATA, CURLOPTTYPE_OBJECTPOINT, 164),
/* POST volatile input fields. */
- CINIT(COPYPOSTFIELDS, OBJECTPOINT, 165),
+ CURLOPT(CURLOPT_COPYPOSTFIELDS, CURLOPTTYPE_OBJECTPOINT, 165),
/* set transfer mode (;type=<a|i>) when doing FTP via an HTTP proxy */
- CINIT(PROXY_TRANSFER_MODE, LONG, 166),
+ CURLOPT(CURLOPT_PROXY_TRANSFER_MODE, CURLOPTTYPE_LONG, 166),
/* Callback function for seeking in the input stream */
- CINIT(SEEKFUNCTION, FUNCTIONPOINT, 167),
- CINIT(SEEKDATA, OBJECTPOINT, 168),
+ CURLOPT(CURLOPT_SEEKFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 167),
+ CURLOPT(CURLOPT_SEEKDATA, CURLOPTTYPE_OBJECTPOINT, 168),
/* CRL file */
- CINIT(CRLFILE, STRINGPOINT, 169),
+ CURLOPT(CURLOPT_CRLFILE, CURLOPTTYPE_STRINGPOINT, 169),
/* Issuer certificate */
- CINIT(ISSUERCERT, STRINGPOINT, 170),
+ CURLOPT(CURLOPT_ISSUERCERT, CURLOPTTYPE_STRINGPOINT, 170),
/* (IPv6) Address scope */
- CINIT(ADDRESS_SCOPE, LONG, 171),
+ CURLOPT(CURLOPT_ADDRESS_SCOPE, CURLOPTTYPE_LONG, 171),
/* Collect certificate chain info and allow it to get retrievable with
CURLINFO_CERTINFO after the transfer is complete. */
- CINIT(CERTINFO, LONG, 172),
+ CURLOPT(CURLOPT_CERTINFO, CURLOPTTYPE_LONG, 172),
/* "name" and "pwd" to use when fetching. */
- CINIT(USERNAME, STRINGPOINT, 173),
- CINIT(PASSWORD, STRINGPOINT, 174),
+ CURLOPT(CURLOPT_USERNAME, CURLOPTTYPE_STRINGPOINT, 173),
+ CURLOPT(CURLOPT_PASSWORD, CURLOPTTYPE_STRINGPOINT, 174),
/* "name" and "pwd" to use with Proxy when fetching. */
- CINIT(PROXYUSERNAME, STRINGPOINT, 175),
- CINIT(PROXYPASSWORD, STRINGPOINT, 176),
+ CURLOPT(CURLOPT_PROXYUSERNAME, CURLOPTTYPE_STRINGPOINT, 175),
+ CURLOPT(CURLOPT_PROXYPASSWORD, CURLOPTTYPE_STRINGPOINT, 176),
/* Comma separated list of hostnames defining no-proxy zones. These should
match both hostnames directly, and hostnames within a domain. For
@@ -1550,103 +1572,103 @@ typedef enum {
implementations of this, .local.com will be considered to be the same as
local.com. A single * is the only valid wildcard, and effectively
disables the use of proxy. */
- CINIT(NOPROXY, STRINGPOINT, 177),
+ CURLOPT(CURLOPT_NOPROXY, CURLOPTTYPE_STRINGPOINT, 177),
/* block size for TFTP transfers */
- CINIT(TFTP_BLKSIZE, LONG, 178),
+ CURLOPT(CURLOPT_TFTP_BLKSIZE, CURLOPTTYPE_LONG, 178),
/* Socks Service */
- CINIT(SOCKS5_GSSAPI_SERVICE, STRINGPOINT, 179), /* DEPRECATED, do not use! */
+ /* DEPRECATED, do not use! */
+ CURLOPT(CURLOPT_SOCKS5_GSSAPI_SERVICE, CURLOPTTYPE_STRINGPOINT, 179),
/* Socks Service */
- CINIT(SOCKS5_GSSAPI_NEC, LONG, 180),
+ CURLOPT(CURLOPT_SOCKS5_GSSAPI_NEC, CURLOPTTYPE_LONG, 180),
/* set the bitmask for the protocols that are allowed to be used for the
transfer, which thus helps the app which takes URLs from users or other
external inputs and want to restrict what protocol(s) to deal
with. Defaults to CURLPROTO_ALL. */
- CINIT(PROTOCOLS, LONG, 181),
+ CURLOPT(CURLOPT_PROTOCOLS, CURLOPTTYPE_LONG, 181),
/* set the bitmask for the protocols that libcurl is allowed to follow to,
as a subset of the CURLOPT_PROTOCOLS ones. That means the protocol needs
- to be set in both bitmasks to be allowed to get redirected to. Defaults
- to all protocols except FILE and SCP. */
- CINIT(REDIR_PROTOCOLS, LONG, 182),
+ to be set in both bitmasks to be allowed to get redirected to. */
+ CURLOPT(CURLOPT_REDIR_PROTOCOLS, CURLOPTTYPE_LONG, 182),
/* set the SSH knownhost file name to use */
- CINIT(SSH_KNOWNHOSTS, STRINGPOINT, 183),
+ CURLOPT(CURLOPT_SSH_KNOWNHOSTS, CURLOPTTYPE_STRINGPOINT, 183),
/* set the SSH host key callback, must point to a curl_sshkeycallback
function */
- CINIT(SSH_KEYFUNCTION, FUNCTIONPOINT, 184),
+ CURLOPT(CURLOPT_SSH_KEYFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 184),
/* set the SSH host key callback custom pointer */
- CINIT(SSH_KEYDATA, OBJECTPOINT, 185),
+ CURLOPT(CURLOPT_SSH_KEYDATA, CURLOPTTYPE_OBJECTPOINT, 185),
/* set the SMTP mail originator */
- CINIT(MAIL_FROM, STRINGPOINT, 186),
+ CURLOPT(CURLOPT_MAIL_FROM, CURLOPTTYPE_STRINGPOINT, 186),
/* set the list of SMTP mail receiver(s) */
- CINIT(MAIL_RCPT, OBJECTPOINT, 187),
+ CURLOPT(CURLOPT_MAIL_RCPT, CURLOPTTYPE_SLISTPOINT, 187),
/* FTP: send PRET before PASV */
- CINIT(FTP_USE_PRET, LONG, 188),
+ CURLOPT(CURLOPT_FTP_USE_PRET, CURLOPTTYPE_LONG, 188),
/* RTSP request method (OPTIONS, SETUP, PLAY, etc...) */
- CINIT(RTSP_REQUEST, LONG, 189),
+ CURLOPT(CURLOPT_RTSP_REQUEST, CURLOPTTYPE_LONG, 189),
/* The RTSP session identifier */
- CINIT(RTSP_SESSION_ID, STRINGPOINT, 190),
+ CURLOPT(CURLOPT_RTSP_SESSION_ID, CURLOPTTYPE_STRINGPOINT, 190),
/* The RTSP stream URI */
- CINIT(RTSP_STREAM_URI, STRINGPOINT, 191),
+ CURLOPT(CURLOPT_RTSP_STREAM_URI, CURLOPTTYPE_STRINGPOINT, 191),
/* The Transport: header to use in RTSP requests */
- CINIT(RTSP_TRANSPORT, STRINGPOINT, 192),
+ CURLOPT(CURLOPT_RTSP_TRANSPORT, CURLOPTTYPE_STRINGPOINT, 192),
/* Manually initialize the client RTSP CSeq for this handle */
- CINIT(RTSP_CLIENT_CSEQ, LONG, 193),
+ CURLOPT(CURLOPT_RTSP_CLIENT_CSEQ, CURLOPTTYPE_LONG, 193),
/* Manually initialize the server RTSP CSeq for this handle */
- CINIT(RTSP_SERVER_CSEQ, LONG, 194),
+ CURLOPT(CURLOPT_RTSP_SERVER_CSEQ, CURLOPTTYPE_LONG, 194),
/* The stream to pass to INTERLEAVEFUNCTION. */
- CINIT(INTERLEAVEDATA, OBJECTPOINT, 195),
+ CURLOPT(CURLOPT_INTERLEAVEDATA, CURLOPTTYPE_OBJECTPOINT, 195),
/* Let the application define a custom write method for RTP data */
- CINIT(INTERLEAVEFUNCTION, FUNCTIONPOINT, 196),
+ CURLOPT(CURLOPT_INTERLEAVEFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 196),
/* Turn on wildcard matching */
- CINIT(WILDCARDMATCH, LONG, 197),
+ CURLOPT(CURLOPT_WILDCARDMATCH, CURLOPTTYPE_LONG, 197),
/* Directory matching callback called before downloading of an
individual file (chunk) started */
- CINIT(CHUNK_BGN_FUNCTION, FUNCTIONPOINT, 198),
+ CURLOPT(CURLOPT_CHUNK_BGN_FUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 198),
/* Directory matching callback called after the file (chunk)
was downloaded, or skipped */
- CINIT(CHUNK_END_FUNCTION, FUNCTIONPOINT, 199),
+ CURLOPT(CURLOPT_CHUNK_END_FUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 199),
/* Change match (fnmatch-like) callback for wildcard matching */
- CINIT(FNMATCH_FUNCTION, FUNCTIONPOINT, 200),
+ CURLOPT(CURLOPT_FNMATCH_FUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 200),
/* Let the application define custom chunk data pointer */
- CINIT(CHUNK_DATA, OBJECTPOINT, 201),
+ CURLOPT(CURLOPT_CHUNK_DATA, CURLOPTTYPE_OBJECTPOINT, 201),
/* FNMATCH_FUNCTION user pointer */
- CINIT(FNMATCH_DATA, OBJECTPOINT, 202),
+ CURLOPT(CURLOPT_FNMATCH_DATA, CURLOPTTYPE_OBJECTPOINT, 202),
/* send linked-list of name:port:address sets */
- CINIT(RESOLVE, OBJECTPOINT, 203),
+ CURLOPT(CURLOPT_RESOLVE, CURLOPTTYPE_SLISTPOINT, 203),
/* Set a username for authenticated TLS */
- CINIT(TLSAUTH_USERNAME, STRINGPOINT, 204),
+ CURLOPT(CURLOPT_TLSAUTH_USERNAME, CURLOPTTYPE_STRINGPOINT, 204),
/* Set a password for authenticated TLS */
- CINIT(TLSAUTH_PASSWORD, STRINGPOINT, 205),
+ CURLOPT(CURLOPT_TLSAUTH_PASSWORD, CURLOPTTYPE_STRINGPOINT, 205),
/* Set authentication type for authenticated TLS */
- CINIT(TLSAUTH_TYPE, STRINGPOINT, 206),
+ CURLOPT(CURLOPT_TLSAUTH_TYPE, CURLOPTTYPE_STRINGPOINT, 206),
/* Set to 1 to enable the "TE:" header in HTTP requests to ask for
compressed transfer-encoded responses. Set to 0 to disable the use of TE:
@@ -1658,268 +1680,274 @@ typedef enum {
option is set to 1.
*/
- CINIT(TRANSFER_ENCODING, LONG, 207),
+ CURLOPT(CURLOPT_TRANSFER_ENCODING, CURLOPTTYPE_LONG, 207),
/* Callback function for closing socket (instead of close(2)). The callback
should have type curl_closesocket_callback */
- CINIT(CLOSESOCKETFUNCTION, FUNCTIONPOINT, 208),
- CINIT(CLOSESOCKETDATA, OBJECTPOINT, 209),
+ CURLOPT(CURLOPT_CLOSESOCKETFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 208),
+ CURLOPT(CURLOPT_CLOSESOCKETDATA, CURLOPTTYPE_OBJECTPOINT, 209),
/* allow GSSAPI credential delegation */
- CINIT(GSSAPI_DELEGATION, LONG, 210),
+ CURLOPT(CURLOPT_GSSAPI_DELEGATION, CURLOPTTYPE_LONG, 210),
/* Set the name servers to use for DNS resolution */
- CINIT(DNS_SERVERS, STRINGPOINT, 211),
+ CURLOPT(CURLOPT_DNS_SERVERS, CURLOPTTYPE_STRINGPOINT, 211),
/* Time-out accept operations (currently for FTP only) after this amount
of milliseconds. */
- CINIT(ACCEPTTIMEOUT_MS, LONG, 212),
+ CURLOPT(CURLOPT_ACCEPTTIMEOUT_MS, CURLOPTTYPE_LONG, 212),
/* Set TCP keepalive */
- CINIT(TCP_KEEPALIVE, LONG, 213),
+ CURLOPT(CURLOPT_TCP_KEEPALIVE, CURLOPTTYPE_LONG, 213),
/* non-universal keepalive knobs (Linux, AIX, HP-UX, more) */
- CINIT(TCP_KEEPIDLE, LONG, 214),
- CINIT(TCP_KEEPINTVL, LONG, 215),
+ CURLOPT(CURLOPT_TCP_KEEPIDLE, CURLOPTTYPE_LONG, 214),
+ CURLOPT(CURLOPT_TCP_KEEPINTVL, CURLOPTTYPE_LONG, 215),
/* Enable/disable specific SSL features with a bitmask, see CURLSSLOPT_* */
- CINIT(SSL_OPTIONS, LONG, 216),
+ CURLOPT(CURLOPT_SSL_OPTIONS, CURLOPTTYPE_LONG, 216),
/* Set the SMTP auth originator */
- CINIT(MAIL_AUTH, STRINGPOINT, 217),
+ CURLOPT(CURLOPT_MAIL_AUTH, CURLOPTTYPE_STRINGPOINT, 217),
/* Enable/disable SASL initial response */
- CINIT(SASL_IR, LONG, 218),
+ CURLOPT(CURLOPT_SASL_IR, CURLOPTTYPE_LONG, 218),
/* Function that will be called instead of the internal progress display
* function. This function should be defined as the curl_xferinfo_callback
* prototype defines. (Deprecates CURLOPT_PROGRESSFUNCTION) */
- CINIT(XFERINFOFUNCTION, FUNCTIONPOINT, 219),
+ CURLOPT(CURLOPT_XFERINFOFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 219),
/* The XOAUTH2 bearer token */
- CINIT(XOAUTH2_BEARER, STRINGPOINT, 220),
+ CURLOPT(CURLOPT_XOAUTH2_BEARER, CURLOPTTYPE_STRINGPOINT, 220),
/* Set the interface string to use as outgoing network
* interface for DNS requests.
* Only supported by the c-ares DNS backend */
- CINIT(DNS_INTERFACE, STRINGPOINT, 221),
+ CURLOPT(CURLOPT_DNS_INTERFACE, CURLOPTTYPE_STRINGPOINT, 221),
/* Set the local IPv4 address to use for outgoing DNS requests.
* Only supported by the c-ares DNS backend */
- CINIT(DNS_LOCAL_IP4, STRINGPOINT, 222),
+ CURLOPT(CURLOPT_DNS_LOCAL_IP4, CURLOPTTYPE_STRINGPOINT, 222),
/* Set the local IPv6 address to use for outgoing DNS requests.
* Only supported by the c-ares DNS backend */
- CINIT(DNS_LOCAL_IP6, STRINGPOINT, 223),
+ CURLOPT(CURLOPT_DNS_LOCAL_IP6, CURLOPTTYPE_STRINGPOINT, 223),
/* Set authentication options directly */
- CINIT(LOGIN_OPTIONS, STRINGPOINT, 224),
+ CURLOPT(CURLOPT_LOGIN_OPTIONS, CURLOPTTYPE_STRINGPOINT, 224),
/* Enable/disable TLS NPN extension (http2 over ssl might fail without) */
- CINIT(SSL_ENABLE_NPN, LONG, 225),
+ CURLOPT(CURLOPT_SSL_ENABLE_NPN, CURLOPTTYPE_LONG, 225),
/* Enable/disable TLS ALPN extension (http2 over ssl might fail without) */
- CINIT(SSL_ENABLE_ALPN, LONG, 226),
+ CURLOPT(CURLOPT_SSL_ENABLE_ALPN, CURLOPTTYPE_LONG, 226),
/* Time to wait for a response to a HTTP request containing an
* Expect: 100-continue header before sending the data anyway. */
- CINIT(EXPECT_100_TIMEOUT_MS, LONG, 227),
+ CURLOPT(CURLOPT_EXPECT_100_TIMEOUT_MS, CURLOPTTYPE_LONG, 227),
/* This points to a linked list of headers used for proxy requests only,
struct curl_slist kind */
- CINIT(PROXYHEADER, OBJECTPOINT, 228),
+ CURLOPT(CURLOPT_PROXYHEADER, CURLOPTTYPE_SLISTPOINT, 228),
/* Pass in a bitmask of "header options" */
- CINIT(HEADEROPT, LONG, 229),
+ CURLOPT(CURLOPT_HEADEROPT, CURLOPTTYPE_LONG, 229),
/* The public key in DER form used to validate the peer public key
this option is used only if SSL_VERIFYPEER is true */
- CINIT(PINNEDPUBLICKEY, STRINGPOINT, 230),
+ CURLOPT(CURLOPT_PINNEDPUBLICKEY, CURLOPTTYPE_STRINGPOINT, 230),
/* Path to Unix domain socket */
- CINIT(UNIX_SOCKET_PATH, STRINGPOINT, 231),
+ CURLOPT(CURLOPT_UNIX_SOCKET_PATH, CURLOPTTYPE_STRINGPOINT, 231),
/* Set if we should verify the certificate status. */
- CINIT(SSL_VERIFYSTATUS, LONG, 232),
+ CURLOPT(CURLOPT_SSL_VERIFYSTATUS, CURLOPTTYPE_LONG, 232),
/* Set if we should enable TLS false start. */
- CINIT(SSL_FALSESTART, LONG, 233),
+ CURLOPT(CURLOPT_SSL_FALSESTART, CURLOPTTYPE_LONG, 233),
/* Do not squash dot-dot sequences */
- CINIT(PATH_AS_IS, LONG, 234),
+ CURLOPT(CURLOPT_PATH_AS_IS, CURLOPTTYPE_LONG, 234),
/* Proxy Service Name */
- CINIT(PROXY_SERVICE_NAME, STRINGPOINT, 235),
+ CURLOPT(CURLOPT_PROXY_SERVICE_NAME, CURLOPTTYPE_STRINGPOINT, 235),
/* Service Name */
- CINIT(SERVICE_NAME, STRINGPOINT, 236),
+ CURLOPT(CURLOPT_SERVICE_NAME, CURLOPTTYPE_STRINGPOINT, 236),
/* Wait/don't wait for pipe/mutex to clarify */
- CINIT(PIPEWAIT, LONG, 237),
+ CURLOPT(CURLOPT_PIPEWAIT, CURLOPTTYPE_LONG, 237),
/* Set the protocol used when curl is given a URL without a protocol */
- CINIT(DEFAULT_PROTOCOL, STRINGPOINT, 238),
+ CURLOPT(CURLOPT_DEFAULT_PROTOCOL, CURLOPTTYPE_STRINGPOINT, 238),
/* Set stream weight, 1 - 256 (default is 16) */
- CINIT(STREAM_WEIGHT, LONG, 239),
+ CURLOPT(CURLOPT_STREAM_WEIGHT, CURLOPTTYPE_LONG, 239),
/* Set stream dependency on another CURL handle */
- CINIT(STREAM_DEPENDS, OBJECTPOINT, 240),
+ CURLOPT(CURLOPT_STREAM_DEPENDS, CURLOPTTYPE_OBJECTPOINT, 240),
/* Set E-xclusive stream dependency on another CURL handle */
- CINIT(STREAM_DEPENDS_E, OBJECTPOINT, 241),
+ CURLOPT(CURLOPT_STREAM_DEPENDS_E, CURLOPTTYPE_OBJECTPOINT, 241),
/* Do not send any tftp option requests to the server */
- CINIT(TFTP_NO_OPTIONS, LONG, 242),
+ CURLOPT(CURLOPT_TFTP_NO_OPTIONS, CURLOPTTYPE_LONG, 242),
/* Linked-list of host:port:connect-to-host:connect-to-port,
overrides the URL's host:port (only for the network layer) */
- CINIT(CONNECT_TO, OBJECTPOINT, 243),
+ CURLOPT(CURLOPT_CONNECT_TO, CURLOPTTYPE_SLISTPOINT, 243),
/* Set TCP Fast Open */
- CINIT(TCP_FASTOPEN, LONG, 244),
+ CURLOPT(CURLOPT_TCP_FASTOPEN, CURLOPTTYPE_LONG, 244),
/* Continue to send data if the server responds early with an
* HTTP status code >= 300 */
- CINIT(KEEP_SENDING_ON_ERROR, LONG, 245),
+ CURLOPT(CURLOPT_KEEP_SENDING_ON_ERROR, CURLOPTTYPE_LONG, 245),
/* The CApath or CAfile used to validate the proxy certificate
this option is used only if PROXY_SSL_VERIFYPEER is true */
- CINIT(PROXY_CAINFO, STRINGPOINT, 246),
+ CURLOPT(CURLOPT_PROXY_CAINFO, CURLOPTTYPE_STRINGPOINT, 246),
/* The CApath directory used to validate the proxy certificate
this option is used only if PROXY_SSL_VERIFYPEER is true */
- CINIT(PROXY_CAPATH, STRINGPOINT, 247),
+ CURLOPT(CURLOPT_PROXY_CAPATH, CURLOPTTYPE_STRINGPOINT, 247),
/* Set if we should verify the proxy in ssl handshake,
set 1 to verify. */
- CINIT(PROXY_SSL_VERIFYPEER, LONG, 248),
+ CURLOPT(CURLOPT_PROXY_SSL_VERIFYPEER, CURLOPTTYPE_LONG, 248),
/* Set if we should verify the Common name from the proxy certificate in ssl
* handshake, set 1 to check existence, 2 to ensure that it matches
* the provided hostname. */
- CINIT(PROXY_SSL_VERIFYHOST, LONG, 249),
+ CURLOPT(CURLOPT_PROXY_SSL_VERIFYHOST, CURLOPTTYPE_LONG, 249),
/* What version to specifically try to use for proxy.
See CURL_SSLVERSION defines below. */
- CINIT(PROXY_SSLVERSION, LONG, 250),
+ CURLOPT(CURLOPT_PROXY_SSLVERSION, CURLOPTTYPE_LONG, 250),
/* Set a username for authenticated TLS for proxy */
- CINIT(PROXY_TLSAUTH_USERNAME, STRINGPOINT, 251),
+ CURLOPT(CURLOPT_PROXY_TLSAUTH_USERNAME, CURLOPTTYPE_STRINGPOINT, 251),
/* Set a password for authenticated TLS for proxy */
- CINIT(PROXY_TLSAUTH_PASSWORD, STRINGPOINT, 252),
+ CURLOPT(CURLOPT_PROXY_TLSAUTH_PASSWORD, CURLOPTTYPE_STRINGPOINT, 252),
/* Set authentication type for authenticated TLS for proxy */
- CINIT(PROXY_TLSAUTH_TYPE, STRINGPOINT, 253),
+ CURLOPT(CURLOPT_PROXY_TLSAUTH_TYPE, CURLOPTTYPE_STRINGPOINT, 253),
/* name of the file keeping your private SSL-certificate for proxy */
- CINIT(PROXY_SSLCERT, STRINGPOINT, 254),
+ CURLOPT(CURLOPT_PROXY_SSLCERT, CURLOPTTYPE_STRINGPOINT, 254),
/* type of the file keeping your SSL-certificate ("DER", "PEM", "ENG") for
proxy */
- CINIT(PROXY_SSLCERTTYPE, STRINGPOINT, 255),
+ CURLOPT(CURLOPT_PROXY_SSLCERTTYPE, CURLOPTTYPE_STRINGPOINT, 255),
/* name of the file keeping your private SSL-key for proxy */
- CINIT(PROXY_SSLKEY, STRINGPOINT, 256),
+ CURLOPT(CURLOPT_PROXY_SSLKEY, CURLOPTTYPE_STRINGPOINT, 256),
/* type of the file keeping your private SSL-key ("DER", "PEM", "ENG") for
proxy */
- CINIT(PROXY_SSLKEYTYPE, STRINGPOINT, 257),
+ CURLOPT(CURLOPT_PROXY_SSLKEYTYPE, CURLOPTTYPE_STRINGPOINT, 257),
/* password for the SSL private key for proxy */
- CINIT(PROXY_KEYPASSWD, STRINGPOINT, 258),
+ CURLOPT(CURLOPT_PROXY_KEYPASSWD, CURLOPTTYPE_STRINGPOINT, 258),
/* Specify which SSL ciphers to use for proxy */
- CINIT(PROXY_SSL_CIPHER_LIST, STRINGPOINT, 259),
+ CURLOPT(CURLOPT_PROXY_SSL_CIPHER_LIST, CURLOPTTYPE_STRINGPOINT, 259),
/* CRL file for proxy */
- CINIT(PROXY_CRLFILE, STRINGPOINT, 260),
+ CURLOPT(CURLOPT_PROXY_CRLFILE, CURLOPTTYPE_STRINGPOINT, 260),
/* Enable/disable specific SSL features with a bitmask for proxy, see
CURLSSLOPT_* */
- CINIT(PROXY_SSL_OPTIONS, LONG, 261),
+ CURLOPT(CURLOPT_PROXY_SSL_OPTIONS, CURLOPTTYPE_LONG, 261),
/* Name of pre proxy to use. */
- CINIT(PRE_PROXY, STRINGPOINT, 262),
+ CURLOPT(CURLOPT_PRE_PROXY, CURLOPTTYPE_STRINGPOINT, 262),
/* The public key in DER form used to validate the proxy public key
this option is used only if PROXY_SSL_VERIFYPEER is true */
- CINIT(PROXY_PINNEDPUBLICKEY, STRINGPOINT, 263),
+ CURLOPT(CURLOPT_PROXY_PINNEDPUBLICKEY, CURLOPTTYPE_STRINGPOINT, 263),
/* Path to an abstract Unix domain socket */
- CINIT(ABSTRACT_UNIX_SOCKET, STRINGPOINT, 264),
+ CURLOPT(CURLOPT_ABSTRACT_UNIX_SOCKET, CURLOPTTYPE_STRINGPOINT, 264),
/* Suppress proxy CONNECT response headers from user callbacks */
- CINIT(SUPPRESS_CONNECT_HEADERS, LONG, 265),
+ CURLOPT(CURLOPT_SUPPRESS_CONNECT_HEADERS, CURLOPTTYPE_LONG, 265),
/* The request target, instead of extracted from the URL */
- CINIT(REQUEST_TARGET, STRINGPOINT, 266),
+ CURLOPT(CURLOPT_REQUEST_TARGET, CURLOPTTYPE_STRINGPOINT, 266),
/* bitmask of allowed auth methods for connections to SOCKS5 proxies */
- CINIT(SOCKS5_AUTH, LONG, 267),
+ CURLOPT(CURLOPT_SOCKS5_AUTH, CURLOPTTYPE_LONG, 267),
/* Enable/disable SSH compression */
- CINIT(SSH_COMPRESSION, LONG, 268),
+ CURLOPT(CURLOPT_SSH_COMPRESSION, CURLOPTTYPE_LONG, 268),
/* Post MIME data. */
- CINIT(MIMEPOST, OBJECTPOINT, 269),
+ CURLOPT(CURLOPT_MIMEPOST, CURLOPTTYPE_OBJECTPOINT, 269),
/* Time to use with the CURLOPT_TIMECONDITION. Specified in number of
seconds since 1 Jan 1970. */
- CINIT(TIMEVALUE_LARGE, OFF_T, 270),
+ CURLOPT(CURLOPT_TIMEVALUE_LARGE, CURLOPTTYPE_OFF_T, 270),
/* Head start in milliseconds to give happy eyeballs. */
- CINIT(HAPPY_EYEBALLS_TIMEOUT_MS, LONG, 271),
+ CURLOPT(CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS, CURLOPTTYPE_LONG, 271),
/* Function that will be called before a resolver request is made */
- CINIT(RESOLVER_START_FUNCTION, FUNCTIONPOINT, 272),
+ CURLOPT(CURLOPT_RESOLVER_START_FUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 272),
/* User data to pass to the resolver start callback. */
- CINIT(RESOLVER_START_DATA, OBJECTPOINT, 273),
+ CURLOPT(CURLOPT_RESOLVER_START_DATA, CURLOPTTYPE_OBJECTPOINT, 273),
/* send HAProxy PROXY protocol header? */
- CINIT(HAPROXYPROTOCOL, LONG, 274),
+ CURLOPT(CURLOPT_HAPROXYPROTOCOL, CURLOPTTYPE_LONG, 274),
/* shuffle addresses before use when DNS returns multiple */
- CINIT(DNS_SHUFFLE_ADDRESSES, LONG, 275),
+ CURLOPT(CURLOPT_DNS_SHUFFLE_ADDRESSES, CURLOPTTYPE_LONG, 275),
/* Specify which TLS 1.3 ciphers suites to use */
- CINIT(TLS13_CIPHERS, STRINGPOINT, 276),
- CINIT(PROXY_TLS13_CIPHERS, STRINGPOINT, 277),
+ CURLOPT(CURLOPT_TLS13_CIPHERS, CURLOPTTYPE_STRINGPOINT, 276),
+ CURLOPT(CURLOPT_PROXY_TLS13_CIPHERS, CURLOPTTYPE_STRINGPOINT, 277),
/* Disallow specifying username/login in URL. */
- CINIT(DISALLOW_USERNAME_IN_URL, LONG, 278),
+ CURLOPT(CURLOPT_DISALLOW_USERNAME_IN_URL, CURLOPTTYPE_LONG, 278),
/* DNS-over-HTTPS URL */
- CINIT(DOH_URL, STRINGPOINT, 279),
+ CURLOPT(CURLOPT_DOH_URL, CURLOPTTYPE_STRINGPOINT, 279),
/* Preferred buffer size to use for uploads */
- CINIT(UPLOAD_BUFFERSIZE, LONG, 280),
+ CURLOPT(CURLOPT_UPLOAD_BUFFERSIZE, CURLOPTTYPE_LONG, 280),
/* Time in ms between connection upkeep calls for long-lived connections. */
- CINIT(UPKEEP_INTERVAL_MS, LONG, 281),
+ CURLOPT(CURLOPT_UPKEEP_INTERVAL_MS, CURLOPTTYPE_LONG, 281),
/* Specify URL using CURL URL API. */
- CINIT(CURLU, OBJECTPOINT, 282),
+ CURLOPT(CURLOPT_CURLU, CURLOPTTYPE_OBJECTPOINT, 282),
/* add trailing data just after no more data is available */
- CINIT(TRAILERFUNCTION, FUNCTIONPOINT, 283),
+ CURLOPT(CURLOPT_TRAILERFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 283),
/* pointer to be passed to HTTP_TRAILER_FUNCTION */
- CINIT(TRAILERDATA, OBJECTPOINT, 284),
+ CURLOPT(CURLOPT_TRAILERDATA, CURLOPTTYPE_OBJECTPOINT, 284),
/* set this to 1L to allow HTTP/0.9 responses or 0L to disallow */
- CINIT(HTTP09_ALLOWED, LONG, 285),
+ CURLOPT(CURLOPT_HTTP09_ALLOWED, CURLOPTTYPE_LONG, 285),
/* alt-svc control bitmask */
- CINIT(ALTSVC_CTRL, LONG, 286),
+ CURLOPT(CURLOPT_ALTSVC_CTRL, CURLOPTTYPE_LONG, 286),
/* alt-svc cache file name to possibly read from/write to */
- CINIT(ALTSVC, STRINGPOINT, 287),
+ CURLOPT(CURLOPT_ALTSVC, CURLOPTTYPE_STRINGPOINT, 287),
/* maximum age of a connection to consider it for reuse (in seconds) */
- CINIT(MAXAGE_CONN, LONG, 288),
+ CURLOPT(CURLOPT_MAXAGE_CONN, CURLOPTTYPE_LONG, 288),
+
+ /* SASL authorisation identity */
+ CURLOPT(CURLOPT_SASL_AUTHZID, CURLOPTTYPE_STRINGPOINT, 289),
+
+ /* allow RCPT TO command to fail for some recipients */
+ CURLOPT(CURLOPT_MAIL_RCPT_ALLLOWFAILS, CURLOPTTYPE_LONG, 290),
CURLOPT_LASTENTRY /* the last unused */
} CURLoption;
@@ -1974,7 +2002,8 @@ enum {
CURL_HTTP_VERSION_2TLS, /* use version 2 for HTTPS, version 1.1 for HTTP */
CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE, /* please use HTTP 2 without HTTP/1.1
Upgrade */
-
+ CURL_HTTP_VERSION_3 = 30, /* Makes use of explicit HTTP/3 without fallback.
+ Use CURLOPT_ALTSVC to enable HTTP/3 upgrade */
CURL_HTTP_VERSION_LAST /* *ILLEGAL* http version */
};
@@ -2200,52 +2229,35 @@ CURL_EXTERN CURLcode curl_mime_headers(curl_mimepart *part,
struct curl_slist *headers,
int take_ownership);
-/* Old form API. */
-/* name is uppercase CURLFORM_<name> */
-#ifdef CFINIT
-#undef CFINIT
-#endif
-
-#ifdef CURL_ISOCPP
-#define CFINIT(name) CURLFORM_ ## name
-#else
-/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */
-#define CFINIT(name) CURLFORM_/**/name
-#endif
-
typedef enum {
- CFINIT(NOTHING), /********* the first one is unused ************/
-
- /* */
- CFINIT(COPYNAME),
- CFINIT(PTRNAME),
- CFINIT(NAMELENGTH),
- CFINIT(COPYCONTENTS),
- CFINIT(PTRCONTENTS),
- CFINIT(CONTENTSLENGTH),
- CFINIT(FILECONTENT),
- CFINIT(ARRAY),
- CFINIT(OBSOLETE),
- CFINIT(FILE),
-
- CFINIT(BUFFER),
- CFINIT(BUFFERPTR),
- CFINIT(BUFFERLENGTH),
-
- CFINIT(CONTENTTYPE),
- CFINIT(CONTENTHEADER),
- CFINIT(FILENAME),
- CFINIT(END),
- CFINIT(OBSOLETE2),
-
- CFINIT(STREAM),
- CFINIT(CONTENTLEN), /* added in 7.46.0, provide a curl_off_t length */
+ CURLFORM_NOTHING, /********* the first one is unused ************/
+ CURLFORM_COPYNAME,
+ CURLFORM_PTRNAME,
+ CURLFORM_NAMELENGTH,
+ CURLFORM_COPYCONTENTS,
+ CURLFORM_PTRCONTENTS,
+ CURLFORM_CONTENTSLENGTH,
+ CURLFORM_FILECONTENT,
+ CURLFORM_ARRAY,
+ CURLFORM_OBSOLETE,
+ CURLFORM_FILE,
+
+ CURLFORM_BUFFER,
+ CURLFORM_BUFFERPTR,
+ CURLFORM_BUFFERLENGTH,
+
+ CURLFORM_CONTENTTYPE,
+ CURLFORM_CONTENTHEADER,
+ CURLFORM_FILENAME,
+ CURLFORM_END,
+ CURLFORM_OBSOLETE2,
+
+ CURLFORM_STREAM,
+ CURLFORM_CONTENTLEN, /* added in 7.46.0, provide a curl_off_t length */
CURLFORM_LASTENTRY /* the last unused */
} CURLformoption;
-#undef CFINIT /* done */
-
/* structure to be used as parameter for CURLFORM_ARRAY */
struct curl_forms {
CURLformoption option;
@@ -2514,8 +2526,8 @@ CURL_EXTERN void curl_slist_free_all(struct curl_slist *);
*/
CURL_EXTERN time_t curl_getdate(const char *p, const time_t *unused);
-/* info about the certificate chain, only for OpenSSL builds. Asked
- for with CURLOPT_CERTINFO / CURLINFO_CERTINFO */
+/* info about the certificate chain, only for OpenSSL, GnuTLS, Schannel, NSS
+ and GSKit builds. Asked for with CURLOPT_CERTINFO / CURLINFO_CERTINFO */
struct curl_certinfo {
int num_of_certs; /* number of certificates with information */
struct curl_slist **certinfo; /* for each index in this array, there's a
@@ -2610,8 +2622,9 @@ typedef enum {
CURLINFO_STARTTRANSFER_TIME_T = CURLINFO_OFF_T + 54,
CURLINFO_REDIRECT_TIME_T = CURLINFO_OFF_T + 55,
CURLINFO_APPCONNECT_TIME_T = CURLINFO_OFF_T + 56,
+ CURLINFO_RETRY_AFTER = CURLINFO_OFF_T + 57,
- CURLINFO_LASTONE = 56
+ CURLINFO_LASTONE = 57
} CURLINFO;
/* CURLINFO_RESPONSE_CODE is the new name for the option previously known as
@@ -2710,6 +2723,7 @@ typedef enum {
CURLVERSION_THIRD,
CURLVERSION_FOURTH,
CURLVERSION_FIFTH,
+ CURLVERSION_SIXTH,
CURLVERSION_LAST /* never actually use this */
} CURLversion;
@@ -2718,7 +2732,7 @@ typedef enum {
meant to be a built-in version number for what kind of struct the caller
expects. If the struct ever changes, we redefine the NOW to another enum
from above. */
-#define CURLVERSION_NOW CURLVERSION_FIFTH
+#define CURLVERSION_NOW CURLVERSION_SIXTH
typedef struct {
CURLversion age; /* age of the returned struct */
@@ -2747,11 +2761,16 @@ typedef struct {
const char *libssh_version; /* human readable string */
/* These fields were added in CURLVERSION_FIFTH */
-
unsigned int brotli_ver_num; /* Numeric Brotli version
(MAJOR << 24) | (MINOR << 12) | PATCH */
const char *brotli_version; /* human readable string. */
+ /* These fields were added in CURLVERSION_SIXTH */
+ unsigned int nghttp2_ver_num; /* Numeric nghttp2 version
+ (MAJOR << 16) | (MINOR << 8) | PATCH */
+ const char *nghttp2_version; /* human readable string. */
+ const char *quic_version; /* human readable quic (+ HTTP/3) library +
+ version or NULL */
} curl_version_info_data;
#define CURL_VERSION_IPV6 (1<<0) /* IPv6-enabled */
@@ -2784,6 +2803,9 @@ typedef struct {
#define CURL_VERSION_MULTI_SSL (1<<22) /* Multiple SSL backends available */
#define CURL_VERSION_BROTLI (1<<23) /* Brotli features are present. */
#define CURL_VERSION_ALTSVC (1<<24) /* Alt-Svc handling built-in */
+#define CURL_VERSION_HTTP3 (1<<25) /* HTTP3 support built-in */
+
+#define CURL_VERSION_ESNI (1<<26) /* ESNI support */
/*
* NAME curl_version_info()
@@ -2866,4 +2888,4 @@ CURL_EXTERN CURLcode curl_easy_pause(CURL *handle, int bitmask);
#endif /* __STDC__ >= 1 */
#endif /* gcc >= 4.3 && !__cplusplus */
-#endif /* __CURL_CURL_H */
+#endif /* CURLINC_CURL_H */
diff --git a/Utilities/cmcurl/include/curl/curlver.h b/Utilities/cmcurl/include/curl/curlver.h
index 04efb93..8fd0874 100644
--- a/Utilities/cmcurl/include/curl/curlver.h
+++ b/Utilities/cmcurl/include/curl/curlver.h
@@ -1,5 +1,5 @@
-#ifndef __CURL_CURLVER_H
-#define __CURL_CURLVER_H
+#ifndef CURLINC_CURLVER_H
+#define CURLINC_CURLVER_H
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -26,16 +26,16 @@
a script at release-time. This was made its own header file in 7.11.2 */
/* This is the global package copyright */
-#define LIBCURL_COPYRIGHT "1996 - 2019 Daniel Stenberg, <daniel@haxx.se>."
+#define LIBCURL_COPYRIGHT "1996 - 2020 Daniel Stenberg, <daniel@haxx.se>."
/* This is the version number of the libcurl package from which this header
file origins: */
-#define LIBCURL_VERSION "7.65.0"
+#define LIBCURL_VERSION "7.69.0"
/* The numeric version number is also available "in parts" by using these
defines: */
#define LIBCURL_VERSION_MAJOR 7
-#define LIBCURL_VERSION_MINOR 65
+#define LIBCURL_VERSION_MINOR 69
#define LIBCURL_VERSION_PATCH 0
/* This is the numeric version of the libcurl version number, meant for easier
@@ -57,7 +57,7 @@
CURL_VERSION_BITS() macro since curl's own configure script greps for it
and needs it to contain the full number.
*/
-#define LIBCURL_VERSION_NUM 0x074100
+#define LIBCURL_VERSION_NUM 0x074500
/*
* This is the date and time when the full source package was created. The
@@ -74,4 +74,4 @@
#define CURL_AT_LEAST_VERSION(x,y,z) \
(LIBCURL_VERSION_NUM >= CURL_VERSION_BITS(x, y, z))
-#endif /* __CURL_CURLVER_H */
+#endif /* CURLINC_CURLVER_H */
diff --git a/Utilities/cmcurl/include/curl/easy.h b/Utilities/cmcurl/include/curl/easy.h
index f42a8a9..592f5d3 100644
--- a/Utilities/cmcurl/include/curl/easy.h
+++ b/Utilities/cmcurl/include/curl/easy.h
@@ -1,5 +1,5 @@
-#ifndef __CURL_EASY_H
-#define __CURL_EASY_H
+#ifndef CURLINC_EASY_H
+#define CURLINC_EASY_H
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/include/curl/mprintf.h b/Utilities/cmcurl/include/curl/mprintf.h
index e20f546..f615ed7 100644
--- a/Utilities/cmcurl/include/curl/mprintf.h
+++ b/Utilities/cmcurl/include/curl/mprintf.h
@@ -1,5 +1,5 @@
-#ifndef __CURL_MPRINTF_H
-#define __CURL_MPRINTF_H
+#ifndef CURLINC_MPRINTF_H
+#define CURLINC_MPRINTF_H
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -47,4 +47,4 @@ CURL_EXTERN char *curl_mvaprintf(const char *format, va_list args);
}
#endif
-#endif /* __CURL_MPRINTF_H */
+#endif /* CURLINC_MPRINTF_H */
diff --git a/Utilities/cmcurl/include/curl/multi.h b/Utilities/cmcurl/include/curl/multi.h
index b19dbaf..bda9bb7 100644
--- a/Utilities/cmcurl/include/curl/multi.h
+++ b/Utilities/cmcurl/include/curl/multi.h
@@ -1,5 +1,5 @@
-#ifndef __CURL_MULTI_H
-#define __CURL_MULTI_H
+#ifndef CURLINC_MULTI_H
+#define CURLINC_MULTI_H
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -72,6 +72,8 @@ typedef enum {
attempted to get added - again */
CURLM_RECURSIVE_API_CALL, /* an api function was called from inside a
callback */
+ CURLM_WAKEUP_FAILURE, /* wakeup is unavailable or failed */
+ CURLM_BAD_FUNCTION_ARGUMENT, /* function called with a bad parameter */
CURLM_LAST
} CURLMcode;
@@ -173,6 +175,29 @@ CURL_EXTERN CURLMcode curl_multi_wait(CURLM *multi_handle,
int timeout_ms,
int *ret);
+/*
+ * Name: curl_multi_poll()
+ *
+ * Desc: Poll on all fds within a CURLM set as well as any
+ * additional fds passed to the function.
+ *
+ * Returns: CURLMcode type, general multi error code.
+ */
+CURL_EXTERN CURLMcode curl_multi_poll(CURLM *multi_handle,
+ struct curl_waitfd extra_fds[],
+ unsigned int extra_nfds,
+ int timeout_ms,
+ int *ret);
+
+/*
+ * Name: curl_multi_wakeup()
+ *
+ * Desc: wakes up a sleeping curl_multi_poll call.
+ *
+ * Returns: CURLMcode type, general multi error code.
+ */
+CURL_EXTERN CURLMcode curl_multi_wakeup(CURLM *multi_handle);
+
/*
* Name: curl_multi_perform()
*
@@ -319,68 +344,58 @@ CURL_EXTERN CURLMcode curl_multi_socket_all(CURLM *multi_handle,
CURL_EXTERN CURLMcode curl_multi_timeout(CURLM *multi_handle,
long *milliseconds);
-#undef CINIT /* re-using the same name as in curl.h */
-
-#ifdef CURL_ISOCPP
-#define CINIT(name,type,num) CURLMOPT_ ## name = CURLOPTTYPE_ ## type + num
-#else
-/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */
-#define LONG CURLOPTTYPE_LONG
-#define OBJECTPOINT CURLOPTTYPE_OBJECTPOINT
-#define FUNCTIONPOINT CURLOPTTYPE_FUNCTIONPOINT
-#define OFF_T CURLOPTTYPE_OFF_T
-#define CINIT(name,type,number) CURLMOPT_/**/name = type + number
-#endif
-
typedef enum {
/* This is the socket callback function pointer */
- CINIT(SOCKETFUNCTION, FUNCTIONPOINT, 1),
+ CURLOPT(CURLMOPT_SOCKETFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 1),
/* This is the argument passed to the socket callback */
- CINIT(SOCKETDATA, OBJECTPOINT, 2),
+ CURLOPT(CURLMOPT_SOCKETDATA, CURLOPTTYPE_OBJECTPOINT, 2),
/* set to 1 to enable pipelining for this multi handle */
- CINIT(PIPELINING, LONG, 3),
+ CURLOPT(CURLMOPT_PIPELINING, CURLOPTTYPE_LONG, 3),
/* This is the timer callback function pointer */
- CINIT(TIMERFUNCTION, FUNCTIONPOINT, 4),
+ CURLOPT(CURLMOPT_TIMERFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 4),
/* This is the argument passed to the timer callback */
- CINIT(TIMERDATA, OBJECTPOINT, 5),
+ CURLOPT(CURLMOPT_TIMERDATA, CURLOPTTYPE_OBJECTPOINT, 5),
/* maximum number of entries in the connection cache */
- CINIT(MAXCONNECTS, LONG, 6),
+ CURLOPT(CURLMOPT_MAXCONNECTS, CURLOPTTYPE_LONG, 6),
/* maximum number of (pipelining) connections to one host */
- CINIT(MAX_HOST_CONNECTIONS, LONG, 7),
+ CURLOPT(CURLMOPT_MAX_HOST_CONNECTIONS, CURLOPTTYPE_LONG, 7),
/* maximum number of requests in a pipeline */
- CINIT(MAX_PIPELINE_LENGTH, LONG, 8),
+ CURLOPT(CURLMOPT_MAX_PIPELINE_LENGTH, CURLOPTTYPE_LONG, 8),
/* a connection with a content-length longer than this
will not be considered for pipelining */
- CINIT(CONTENT_LENGTH_PENALTY_SIZE, OFF_T, 9),
+ CURLOPT(CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE, CURLOPTTYPE_OFF_T, 9),
/* a connection with a chunk length longer than this
will not be considered for pipelining */
- CINIT(CHUNK_LENGTH_PENALTY_SIZE, OFF_T, 10),
+ CURLOPT(CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE, CURLOPTTYPE_OFF_T, 10),
/* a list of site names(+port) that are blacklisted from
pipelining */
- CINIT(PIPELINING_SITE_BL, OBJECTPOINT, 11),
+ CURLOPT(CURLMOPT_PIPELINING_SITE_BL, CURLOPTTYPE_OBJECTPOINT, 11),
/* a list of server types that are blacklisted from
pipelining */
- CINIT(PIPELINING_SERVER_BL, OBJECTPOINT, 12),
+ CURLOPT(CURLMOPT_PIPELINING_SERVER_BL, CURLOPTTYPE_OBJECTPOINT, 12),
/* maximum number of open connections in total */
- CINIT(MAX_TOTAL_CONNECTIONS, LONG, 13),
+ CURLOPT(CURLMOPT_MAX_TOTAL_CONNECTIONS, CURLOPTTYPE_LONG, 13),
/* This is the server push callback function pointer */
- CINIT(PUSHFUNCTION, FUNCTIONPOINT, 14),
+ CURLOPT(CURLMOPT_PUSHFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 14),
/* This is the argument passed to the server push callback */
- CINIT(PUSHDATA, OBJECTPOINT, 15),
+ CURLOPT(CURLMOPT_PUSHDATA, CURLOPTTYPE_OBJECTPOINT, 15),
+
+ /* maximum number of concurrent streams to support on a connection */
+ CURLOPT(CURLMOPT_MAX_CONCURRENT_STREAMS, CURLOPTTYPE_LONG, 16),
CURLMOPT_LASTENTRY /* the last unused */
} CURLMoption;
diff --git a/Utilities/cmcurl/include/curl/stdcheaders.h b/Utilities/cmcurl/include/curl/stdcheaders.h
index 027b6f4..a6bdc1a 100644
--- a/Utilities/cmcurl/include/curl/stdcheaders.h
+++ b/Utilities/cmcurl/include/curl/stdcheaders.h
@@ -1,5 +1,5 @@
-#ifndef __STDC_HEADERS_H
-#define __STDC_HEADERS_H
+#ifndef CURLINC_STDCHEADERS_H
+#define CURLINC_STDCHEADERS_H
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -30,4 +30,4 @@ size_t fwrite(const void *, size_t, size_t, FILE *);
int strcasecmp(const char *, const char *);
int strncasecmp(const char *, const char *, size_t);
-#endif /* __STDC_HEADERS_H */
+#endif /* CURLINC_STDCHEADERS_H */
diff --git a/Utilities/cmcurl/include/curl/system.h b/Utilities/cmcurl/include/curl/system.h
index 1e555ec..867af61 100644
--- a/Utilities/cmcurl/include/curl/system.h
+++ b/Utilities/cmcurl/include/curl/system.h
@@ -1,5 +1,5 @@
-#ifndef __CURL_SYSTEM_H
-#define __CURL_SYSTEM_H
+#ifndef CURLINC_SYSTEM_H
+#define CURLINC_SYSTEM_H
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -137,15 +137,26 @@
# define CURL_TYPEOF_CURL_SOCKLEN_T int
#elif defined(__LCC__)
-# define CURL_TYPEOF_CURL_OFF_T long
-# define CURL_FORMAT_CURL_OFF_T "ld"
-# define CURL_FORMAT_CURL_OFF_TU "lu"
-# define CURL_SUFFIX_CURL_OFF_T L
-# define CURL_SUFFIX_CURL_OFF_TU UL
-# define CURL_TYPEOF_CURL_SOCKLEN_T int
+# if defined(__e2k__) /* MCST eLbrus C Compiler */
+# define CURL_TYPEOF_CURL_OFF_T long
+# define CURL_FORMAT_CURL_OFF_T "ld"
+# define CURL_FORMAT_CURL_OFF_TU "lu"
+# define CURL_SUFFIX_CURL_OFF_T L
+# define CURL_SUFFIX_CURL_OFF_TU UL
+# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
+# define CURL_PULL_SYS_TYPES_H 1
+# define CURL_PULL_SYS_SOCKET_H 1
+# else /* Local (or Little) C Compiler */
+# define CURL_TYPEOF_CURL_OFF_T long
+# define CURL_FORMAT_CURL_OFF_T "ld"
+# define CURL_FORMAT_CURL_OFF_TU "lu"
+# define CURL_SUFFIX_CURL_OFF_T L
+# define CURL_SUFFIX_CURL_OFF_TU UL
+# define CURL_TYPEOF_CURL_SOCKLEN_T int
+# endif
#elif defined(__SYMBIAN32__)
-# if defined(__EABI__) /* Treat all ARM compilers equally */
+# if defined(__EABI__) /* Treat all ARM compilers equally */
# define CURL_TYPEOF_CURL_OFF_T long long
# define CURL_FORMAT_CURL_OFF_T "lld"
# define CURL_FORMAT_CURL_OFF_TU "llu"
@@ -288,7 +299,6 @@
# define CURL_TYPEOF_CURL_SOCKLEN_T int
#elif defined(__TINYC__) /* also known as tcc */
-
# define CURL_TYPEOF_CURL_OFF_T long long
# define CURL_FORMAT_CURL_OFF_T "lld"
# define CURL_FORMAT_CURL_OFF_TU "llu"
@@ -377,6 +387,7 @@
# define CURL_SUFFIX_CURL_OFF_TU ULL
# elif defined(__LP64__) || \
defined(__x86_64__) || defined(__ppc64__) || defined(__sparc64__) || \
+ defined(__e2k__) || \
(defined(__SIZEOF_LONG__) && __SIZEOF_LONG__ == 8) || \
(defined(__LONG_MAX__) && __LONG_MAX__ == 9223372036854775807L)
# define CURL_TYPEOF_CURL_OFF_T long
@@ -473,21 +484,21 @@
*/
#if defined(__BORLANDC__) && (__BORLANDC__ == 0x0551)
-# define __CURL_OFF_T_C_HLPR2(x) x
-# define __CURL_OFF_T_C_HLPR1(x) __CURL_OFF_T_C_HLPR2(x)
-# define CURL_OFF_T_C(Val) __CURL_OFF_T_C_HLPR1(Val) ## \
- __CURL_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_T)
-# define CURL_OFF_TU_C(Val) __CURL_OFF_T_C_HLPR1(Val) ## \
- __CURL_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_TU)
+# define CURLINC_OFF_T_C_HLPR2(x) x
+# define CURLINC_OFF_T_C_HLPR1(x) CURLINC_OFF_T_C_HLPR2(x)
+# define CURL_OFF_T_C(Val) CURLINC_OFF_T_C_HLPR1(Val) ## \
+ CURLINC_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_T)
+# define CURL_OFF_TU_C(Val) CURLINC_OFF_T_C_HLPR1(Val) ## \
+ CURLINC_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_TU)
#else
# ifdef CURL_ISOCPP
-# define __CURL_OFF_T_C_HLPR2(Val,Suffix) Val ## Suffix
+# define CURLINC_OFF_T_C_HLPR2(Val,Suffix) Val ## Suffix
# else
-# define __CURL_OFF_T_C_HLPR2(Val,Suffix) Val/**/Suffix
+# define CURLINC_OFF_T_C_HLPR2(Val,Suffix) Val/**/Suffix
# endif
-# define __CURL_OFF_T_C_HLPR1(Val,Suffix) __CURL_OFF_T_C_HLPR2(Val,Suffix)
-# define CURL_OFF_T_C(Val) __CURL_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_T)
-# define CURL_OFF_TU_C(Val) __CURL_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_TU)
+# define CURLINC_OFF_T_C_HLPR1(Val,Suffix) CURLINC_OFF_T_C_HLPR2(Val,Suffix)
+# define CURL_OFF_T_C(Val) CURLINC_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_T)
+# define CURL_OFF_TU_C(Val) CURLINC_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_TU)
#endif
-#endif /* __CURL_SYSTEM_H */
+#endif /* CURLINC_SYSTEM_H */
diff --git a/Utilities/cmcurl/include/curl/typecheck-gcc.h b/Utilities/cmcurl/include/curl/typecheck-gcc.h
index 2d1de4d..03c84fc 100644
--- a/Utilities/cmcurl/include/curl/typecheck-gcc.h
+++ b/Utilities/cmcurl/include/curl/typecheck-gcc.h
@@ -1,5 +1,5 @@
-#ifndef __CURL_TYPECHECK_GCC_H
-#define __CURL_TYPECHECK_GCC_H
+#ifndef CURLINC_TYPECHECK_GCC_H
+#define CURLINC_TYPECHECK_GCC_H
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
@@ -25,10 +25,10 @@
/* wraps curl_easy_setopt() with typechecking */
/* To add a new kind of warning, add an
- * if(_curl_is_sometype_option(_curl_opt))
- * if(!_curl_is_sometype(value))
+ * if(curlcheck_sometype_option(_curl_opt))
+ * if(!curlcheck_sometype(value))
* _curl_easy_setopt_err_sometype();
- * block and define _curl_is_sometype_option, _curl_is_sometype and
+ * block and define curlcheck_sometype_option, curlcheck_sometype and
* _curl_easy_setopt_err_sometype below
*
* NOTE: We use two nested 'if' statements here instead of the && operator, in
@@ -38,112 +38,112 @@
* To add an option that uses the same type as an existing option, you'll just
* need to extend the appropriate _curl_*_option macro
*/
-#define curl_easy_setopt(handle, option, value) \
-__extension__ ({ \
- __typeof__(option) _curl_opt = option; \
- if(__builtin_constant_p(_curl_opt)) { \
- if(_curl_is_long_option(_curl_opt)) \
- if(!_curl_is_long(value)) \
- _curl_easy_setopt_err_long(); \
- if(_curl_is_off_t_option(_curl_opt)) \
- if(!_curl_is_off_t(value)) \
- _curl_easy_setopt_err_curl_off_t(); \
- if(_curl_is_string_option(_curl_opt)) \
- if(!_curl_is_string(value)) \
- _curl_easy_setopt_err_string(); \
- if(_curl_is_write_cb_option(_curl_opt)) \
- if(!_curl_is_write_cb(value)) \
- _curl_easy_setopt_err_write_callback(); \
- if((_curl_opt) == CURLOPT_RESOLVER_START_FUNCTION) \
- if(!_curl_is_resolver_start_callback(value)) \
- _curl_easy_setopt_err_resolver_start_callback(); \
- if((_curl_opt) == CURLOPT_READFUNCTION) \
- if(!_curl_is_read_cb(value)) \
- _curl_easy_setopt_err_read_cb(); \
- if((_curl_opt) == CURLOPT_IOCTLFUNCTION) \
- if(!_curl_is_ioctl_cb(value)) \
- _curl_easy_setopt_err_ioctl_cb(); \
- if((_curl_opt) == CURLOPT_SOCKOPTFUNCTION) \
- if(!_curl_is_sockopt_cb(value)) \
- _curl_easy_setopt_err_sockopt_cb(); \
- if((_curl_opt) == CURLOPT_OPENSOCKETFUNCTION) \
- if(!_curl_is_opensocket_cb(value)) \
- _curl_easy_setopt_err_opensocket_cb(); \
- if((_curl_opt) == CURLOPT_PROGRESSFUNCTION) \
- if(!_curl_is_progress_cb(value)) \
- _curl_easy_setopt_err_progress_cb(); \
- if((_curl_opt) == CURLOPT_DEBUGFUNCTION) \
- if(!_curl_is_debug_cb(value)) \
- _curl_easy_setopt_err_debug_cb(); \
- if((_curl_opt) == CURLOPT_SSL_CTX_FUNCTION) \
- if(!_curl_is_ssl_ctx_cb(value)) \
- _curl_easy_setopt_err_ssl_ctx_cb(); \
- if(_curl_is_conv_cb_option(_curl_opt)) \
- if(!_curl_is_conv_cb(value)) \
- _curl_easy_setopt_err_conv_cb(); \
- if((_curl_opt) == CURLOPT_SEEKFUNCTION) \
- if(!_curl_is_seek_cb(value)) \
- _curl_easy_setopt_err_seek_cb(); \
- if(_curl_is_cb_data_option(_curl_opt)) \
- if(!_curl_is_cb_data(value)) \
- _curl_easy_setopt_err_cb_data(); \
- if((_curl_opt) == CURLOPT_ERRORBUFFER) \
- if(!_curl_is_error_buffer(value)) \
- _curl_easy_setopt_err_error_buffer(); \
- if((_curl_opt) == CURLOPT_STDERR) \
- if(!_curl_is_FILE(value)) \
- _curl_easy_setopt_err_FILE(); \
- if(_curl_is_postfields_option(_curl_opt)) \
- if(!_curl_is_postfields(value)) \
- _curl_easy_setopt_err_postfields(); \
- if((_curl_opt) == CURLOPT_HTTPPOST) \
- if(!_curl_is_arr((value), struct curl_httppost)) \
- _curl_easy_setopt_err_curl_httpost(); \
- if((_curl_opt) == CURLOPT_MIMEPOST) \
- if(!_curl_is_ptr((value), curl_mime)) \
- _curl_easy_setopt_err_curl_mimepost(); \
- if(_curl_is_slist_option(_curl_opt)) \
- if(!_curl_is_arr((value), struct curl_slist)) \
- _curl_easy_setopt_err_curl_slist(); \
- if((_curl_opt) == CURLOPT_SHARE) \
- if(!_curl_is_ptr((value), CURLSH)) \
- _curl_easy_setopt_err_CURLSH(); \
- } \
- curl_easy_setopt(handle, _curl_opt, value); \
-})
+#define curl_easy_setopt(handle, option, value) \
+ __extension__({ \
+ __typeof__(option) _curl_opt = option; \
+ if(__builtin_constant_p(_curl_opt)) { \
+ if(curlcheck_long_option(_curl_opt)) \
+ if(!curlcheck_long(value)) \
+ _curl_easy_setopt_err_long(); \
+ if(curlcheck_off_t_option(_curl_opt)) \
+ if(!curlcheck_off_t(value)) \
+ _curl_easy_setopt_err_curl_off_t(); \
+ if(curlcheck_string_option(_curl_opt)) \
+ if(!curlcheck_string(value)) \
+ _curl_easy_setopt_err_string(); \
+ if(curlcheck_write_cb_option(_curl_opt)) \
+ if(!curlcheck_write_cb(value)) \
+ _curl_easy_setopt_err_write_callback(); \
+ if((_curl_opt) == CURLOPT_RESOLVER_START_FUNCTION) \
+ if(!curlcheck_resolver_start_callback(value)) \
+ _curl_easy_setopt_err_resolver_start_callback(); \
+ if((_curl_opt) == CURLOPT_READFUNCTION) \
+ if(!curlcheck_read_cb(value)) \
+ _curl_easy_setopt_err_read_cb(); \
+ if((_curl_opt) == CURLOPT_IOCTLFUNCTION) \
+ if(!curlcheck_ioctl_cb(value)) \
+ _curl_easy_setopt_err_ioctl_cb(); \
+ if((_curl_opt) == CURLOPT_SOCKOPTFUNCTION) \
+ if(!curlcheck_sockopt_cb(value)) \
+ _curl_easy_setopt_err_sockopt_cb(); \
+ if((_curl_opt) == CURLOPT_OPENSOCKETFUNCTION) \
+ if(!curlcheck_opensocket_cb(value)) \
+ _curl_easy_setopt_err_opensocket_cb(); \
+ if((_curl_opt) == CURLOPT_PROGRESSFUNCTION) \
+ if(!curlcheck_progress_cb(value)) \
+ _curl_easy_setopt_err_progress_cb(); \
+ if((_curl_opt) == CURLOPT_DEBUGFUNCTION) \
+ if(!curlcheck_debug_cb(value)) \
+ _curl_easy_setopt_err_debug_cb(); \
+ if((_curl_opt) == CURLOPT_SSL_CTX_FUNCTION) \
+ if(!curlcheck_ssl_ctx_cb(value)) \
+ _curl_easy_setopt_err_ssl_ctx_cb(); \
+ if(curlcheck_conv_cb_option(_curl_opt)) \
+ if(!curlcheck_conv_cb(value)) \
+ _curl_easy_setopt_err_conv_cb(); \
+ if((_curl_opt) == CURLOPT_SEEKFUNCTION) \
+ if(!curlcheck_seek_cb(value)) \
+ _curl_easy_setopt_err_seek_cb(); \
+ if(curlcheck_cb_data_option(_curl_opt)) \
+ if(!curlcheck_cb_data(value)) \
+ _curl_easy_setopt_err_cb_data(); \
+ if((_curl_opt) == CURLOPT_ERRORBUFFER) \
+ if(!curlcheck_error_buffer(value)) \
+ _curl_easy_setopt_err_error_buffer(); \
+ if((_curl_opt) == CURLOPT_STDERR) \
+ if(!curlcheck_FILE(value)) \
+ _curl_easy_setopt_err_FILE(); \
+ if(curlcheck_postfields_option(_curl_opt)) \
+ if(!curlcheck_postfields(value)) \
+ _curl_easy_setopt_err_postfields(); \
+ if((_curl_opt) == CURLOPT_HTTPPOST) \
+ if(!curlcheck_arr((value), struct curl_httppost)) \
+ _curl_easy_setopt_err_curl_httpost(); \
+ if((_curl_opt) == CURLOPT_MIMEPOST) \
+ if(!curlcheck_ptr((value), curl_mime)) \
+ _curl_easy_setopt_err_curl_mimepost(); \
+ if(curlcheck_slist_option(_curl_opt)) \
+ if(!curlcheck_arr((value), struct curl_slist)) \
+ _curl_easy_setopt_err_curl_slist(); \
+ if((_curl_opt) == CURLOPT_SHARE) \
+ if(!curlcheck_ptr((value), CURLSH)) \
+ _curl_easy_setopt_err_CURLSH(); \
+ } \
+ curl_easy_setopt(handle, _curl_opt, value); \
+ })
/* wraps curl_easy_getinfo() with typechecking */
-#define curl_easy_getinfo(handle, info, arg) \
-__extension__ ({ \
- __typeof__(info) _curl_info = info; \
- if(__builtin_constant_p(_curl_info)) { \
- if(_curl_is_string_info(_curl_info)) \
- if(!_curl_is_arr((arg), char *)) \
- _curl_easy_getinfo_err_string(); \
- if(_curl_is_long_info(_curl_info)) \
- if(!_curl_is_arr((arg), long)) \
- _curl_easy_getinfo_err_long(); \
- if(_curl_is_double_info(_curl_info)) \
- if(!_curl_is_arr((arg), double)) \
- _curl_easy_getinfo_err_double(); \
- if(_curl_is_slist_info(_curl_info)) \
- if(!_curl_is_arr((arg), struct curl_slist *)) \
- _curl_easy_getinfo_err_curl_slist(); \
- if(_curl_is_tlssessioninfo_info(_curl_info)) \
- if(!_curl_is_arr((arg), struct curl_tlssessioninfo *)) \
- _curl_easy_getinfo_err_curl_tlssesssioninfo(); \
- if(_curl_is_certinfo_info(_curl_info)) \
- if(!_curl_is_arr((arg), struct curl_certinfo *)) \
- _curl_easy_getinfo_err_curl_certinfo(); \
- if(_curl_is_socket_info(_curl_info)) \
- if(!_curl_is_arr((arg), curl_socket_t)) \
- _curl_easy_getinfo_err_curl_socket(); \
- if(_curl_is_off_t_info(_curl_info)) \
- if(!_curl_is_arr((arg), curl_off_t)) \
- _curl_easy_getinfo_err_curl_off_t(); \
- } \
- curl_easy_getinfo(handle, _curl_info, arg); \
-})
+#define curl_easy_getinfo(handle, info, arg) \
+ __extension__({ \
+ __typeof__(info) _curl_info = info; \
+ if(__builtin_constant_p(_curl_info)) { \
+ if(curlcheck_string_info(_curl_info)) \
+ if(!curlcheck_arr((arg), char *)) \
+ _curl_easy_getinfo_err_string(); \
+ if(curlcheck_long_info(_curl_info)) \
+ if(!curlcheck_arr((arg), long)) \
+ _curl_easy_getinfo_err_long(); \
+ if(curlcheck_double_info(_curl_info)) \
+ if(!curlcheck_arr((arg), double)) \
+ _curl_easy_getinfo_err_double(); \
+ if(curlcheck_slist_info(_curl_info)) \
+ if(!curlcheck_arr((arg), struct curl_slist *)) \
+ _curl_easy_getinfo_err_curl_slist(); \
+ if(curlcheck_tlssessioninfo_info(_curl_info)) \
+ if(!curlcheck_arr((arg), struct curl_tlssessioninfo *)) \
+ _curl_easy_getinfo_err_curl_tlssesssioninfo(); \
+ if(curlcheck_certinfo_info(_curl_info)) \
+ if(!curlcheck_arr((arg), struct curl_certinfo *)) \
+ _curl_easy_getinfo_err_curl_certinfo(); \
+ if(curlcheck_socket_info(_curl_info)) \
+ if(!curlcheck_arr((arg), curl_socket_t)) \
+ _curl_easy_getinfo_err_curl_socket(); \
+ if(curlcheck_off_t_info(_curl_info)) \
+ if(!curlcheck_arr((arg), curl_off_t)) \
+ _curl_easy_getinfo_err_curl_off_t(); \
+ } \
+ curl_easy_getinfo(handle, _curl_info, arg); \
+ })
/*
* For now, just make sure that the functions are called with three arguments
@@ -156,83 +156,83 @@ __extension__ ({ \
* functions */
/* To define a new warning, use _CURL_WARNING(identifier, "message") */
-#define _CURL_WARNING(id, message) \
- static void __attribute__((__warning__(message))) \
- __attribute__((__unused__)) __attribute__((__noinline__)) \
+#define CURLWARNING(id, message) \
+ static void __attribute__((__warning__(message))) \
+ __attribute__((__unused__)) __attribute__((__noinline__)) \
id(void) { __asm__(""); }
-_CURL_WARNING(_curl_easy_setopt_err_long,
+CURLWARNING(_curl_easy_setopt_err_long,
"curl_easy_setopt expects a long argument for this option")
-_CURL_WARNING(_curl_easy_setopt_err_curl_off_t,
+CURLWARNING(_curl_easy_setopt_err_curl_off_t,
"curl_easy_setopt expects a curl_off_t argument for this option")
-_CURL_WARNING(_curl_easy_setopt_err_string,
+CURLWARNING(_curl_easy_setopt_err_string,
"curl_easy_setopt expects a "
"string ('char *' or char[]) argument for this option"
)
-_CURL_WARNING(_curl_easy_setopt_err_write_callback,
+CURLWARNING(_curl_easy_setopt_err_write_callback,
"curl_easy_setopt expects a curl_write_callback argument for this option")
-_CURL_WARNING(_curl_easy_setopt_err_resolver_start_callback,
+CURLWARNING(_curl_easy_setopt_err_resolver_start_callback,
"curl_easy_setopt expects a "
"curl_resolver_start_callback argument for this option"
)
-_CURL_WARNING(_curl_easy_setopt_err_read_cb,
+CURLWARNING(_curl_easy_setopt_err_read_cb,
"curl_easy_setopt expects a curl_read_callback argument for this option")
-_CURL_WARNING(_curl_easy_setopt_err_ioctl_cb,
+CURLWARNING(_curl_easy_setopt_err_ioctl_cb,
"curl_easy_setopt expects a curl_ioctl_callback argument for this option")
-_CURL_WARNING(_curl_easy_setopt_err_sockopt_cb,
+CURLWARNING(_curl_easy_setopt_err_sockopt_cb,
"curl_easy_setopt expects a curl_sockopt_callback argument for this option")
-_CURL_WARNING(_curl_easy_setopt_err_opensocket_cb,
+CURLWARNING(_curl_easy_setopt_err_opensocket_cb,
"curl_easy_setopt expects a "
"curl_opensocket_callback argument for this option"
)
-_CURL_WARNING(_curl_easy_setopt_err_progress_cb,
+CURLWARNING(_curl_easy_setopt_err_progress_cb,
"curl_easy_setopt expects a curl_progress_callback argument for this option")
-_CURL_WARNING(_curl_easy_setopt_err_debug_cb,
+CURLWARNING(_curl_easy_setopt_err_debug_cb,
"curl_easy_setopt expects a curl_debug_callback argument for this option")
-_CURL_WARNING(_curl_easy_setopt_err_ssl_ctx_cb,
+CURLWARNING(_curl_easy_setopt_err_ssl_ctx_cb,
"curl_easy_setopt expects a curl_ssl_ctx_callback argument for this option")
-_CURL_WARNING(_curl_easy_setopt_err_conv_cb,
+CURLWARNING(_curl_easy_setopt_err_conv_cb,
"curl_easy_setopt expects a curl_conv_callback argument for this option")
-_CURL_WARNING(_curl_easy_setopt_err_seek_cb,
+CURLWARNING(_curl_easy_setopt_err_seek_cb,
"curl_easy_setopt expects a curl_seek_callback argument for this option")
-_CURL_WARNING(_curl_easy_setopt_err_cb_data,
+CURLWARNING(_curl_easy_setopt_err_cb_data,
"curl_easy_setopt expects a "
"private data pointer as argument for this option")
-_CURL_WARNING(_curl_easy_setopt_err_error_buffer,
+CURLWARNING(_curl_easy_setopt_err_error_buffer,
"curl_easy_setopt expects a "
"char buffer of CURL_ERROR_SIZE as argument for this option")
-_CURL_WARNING(_curl_easy_setopt_err_FILE,
+CURLWARNING(_curl_easy_setopt_err_FILE,
"curl_easy_setopt expects a 'FILE *' argument for this option")
-_CURL_WARNING(_curl_easy_setopt_err_postfields,
+CURLWARNING(_curl_easy_setopt_err_postfields,
"curl_easy_setopt expects a 'void *' or 'char *' argument for this option")
-_CURL_WARNING(_curl_easy_setopt_err_curl_httpost,
+CURLWARNING(_curl_easy_setopt_err_curl_httpost,
"curl_easy_setopt expects a 'struct curl_httppost *' "
"argument for this option")
-_CURL_WARNING(_curl_easy_setopt_err_curl_mimepost,
+CURLWARNING(_curl_easy_setopt_err_curl_mimepost,
"curl_easy_setopt expects a 'curl_mime *' "
"argument for this option")
-_CURL_WARNING(_curl_easy_setopt_err_curl_slist,
+CURLWARNING(_curl_easy_setopt_err_curl_slist,
"curl_easy_setopt expects a 'struct curl_slist *' argument for this option")
-_CURL_WARNING(_curl_easy_setopt_err_CURLSH,
+CURLWARNING(_curl_easy_setopt_err_CURLSH,
"curl_easy_setopt expects a CURLSH* argument for this option")
-_CURL_WARNING(_curl_easy_getinfo_err_string,
+CURLWARNING(_curl_easy_getinfo_err_string,
"curl_easy_getinfo expects a pointer to 'char *' for this info")
-_CURL_WARNING(_curl_easy_getinfo_err_long,
+CURLWARNING(_curl_easy_getinfo_err_long,
"curl_easy_getinfo expects a pointer to long for this info")
-_CURL_WARNING(_curl_easy_getinfo_err_double,
+CURLWARNING(_curl_easy_getinfo_err_double,
"curl_easy_getinfo expects a pointer to double for this info")
-_CURL_WARNING(_curl_easy_getinfo_err_curl_slist,
+CURLWARNING(_curl_easy_getinfo_err_curl_slist,
"curl_easy_getinfo expects a pointer to 'struct curl_slist *' for this info")
-_CURL_WARNING(_curl_easy_getinfo_err_curl_tlssesssioninfo,
+CURLWARNING(_curl_easy_getinfo_err_curl_tlssesssioninfo,
"curl_easy_getinfo expects a pointer to "
"'struct curl_tlssessioninfo *' for this info")
-_CURL_WARNING(_curl_easy_getinfo_err_curl_certinfo,
+CURLWARNING(_curl_easy_getinfo_err_curl_certinfo,
"curl_easy_getinfo expects a pointer to "
"'struct curl_certinfo *' for this info")
-_CURL_WARNING(_curl_easy_getinfo_err_curl_socket,
+CURLWARNING(_curl_easy_getinfo_err_curl_socket,
"curl_easy_getinfo expects a pointer to curl_socket_t for this info")
-_CURL_WARNING(_curl_easy_getinfo_err_curl_off_t,
+CURLWARNING(_curl_easy_getinfo_err_curl_off_t,
"curl_easy_getinfo expects a pointer to curl_off_t for this info")
/* groups of curl_easy_setops options that take the same type of argument */
@@ -244,14 +244,14 @@ _CURL_WARNING(_curl_easy_getinfo_err_curl_off_t,
*/
/* evaluates to true if option takes a long argument */
-#define _curl_is_long_option(option) \
+#define curlcheck_long_option(option) \
(0 < (option) && (option) < CURLOPTTYPE_OBJECTPOINT)
-#define _curl_is_off_t_option(option) \
+#define curlcheck_off_t_option(option) \
((option) > CURLOPTTYPE_OFF_T)
/* evaluates to true if option takes a char* argument */
-#define _curl_is_string_option(option) \
+#define curlcheck_string_option(option) \
((option) == CURLOPT_ABSTRACT_UNIX_SOCKET || \
(option) == CURLOPT_ACCEPT_ENCODING || \
(option) == CURLOPT_ALTSVC || \
@@ -300,15 +300,18 @@ _CURL_WARNING(_curl_easy_getinfo_err_curl_off_t,
(option) == CURLOPT_PROXY_SSLKEY || \
(option) == CURLOPT_PROXY_SSLKEYTYPE || \
(option) == CURLOPT_PROXY_SSL_CIPHER_LIST || \
+ (option) == CURLOPT_PROXY_TLS13_CIPHERS || \
(option) == CURLOPT_PROXY_TLSAUTH_PASSWORD || \
- (option) == CURLOPT_PROXY_TLSAUTH_USERNAME || \
(option) == CURLOPT_PROXY_TLSAUTH_TYPE || \
+ (option) == CURLOPT_PROXY_TLSAUTH_USERNAME || \
(option) == CURLOPT_RANDOM_FILE || \
(option) == CURLOPT_RANGE || \
(option) == CURLOPT_REFERER || \
+ (option) == CURLOPT_REQUEST_TARGET || \
(option) == CURLOPT_RTSP_SESSION_ID || \
(option) == CURLOPT_RTSP_STREAM_URI || \
(option) == CURLOPT_RTSP_TRANSPORT || \
+ (option) == CURLOPT_SASL_AUTHZID || \
(option) == CURLOPT_SERVICE_NAME || \
(option) == CURLOPT_SOCKS5_GSSAPI_SERVICE || \
(option) == CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 || \
@@ -321,6 +324,7 @@ _CURL_WARNING(_curl_easy_getinfo_err_curl_off_t,
(option) == CURLOPT_SSLKEY || \
(option) == CURLOPT_SSLKEYTYPE || \
(option) == CURLOPT_SSL_CIPHER_LIST || \
+ (option) == CURLOPT_TLS13_CIPHERS || \
(option) == CURLOPT_TLSAUTH_PASSWORD || \
(option) == CURLOPT_TLSAUTH_TYPE || \
(option) == CURLOPT_TLSAUTH_USERNAME || \
@@ -333,18 +337,18 @@ _CURL_WARNING(_curl_easy_getinfo_err_curl_off_t,
0)
/* evaluates to true if option takes a curl_write_callback argument */
-#define _curl_is_write_cb_option(option) \
- ((option) == CURLOPT_HEADERFUNCTION || \
+#define curlcheck_write_cb_option(option) \
+ ((option) == CURLOPT_HEADERFUNCTION || \
(option) == CURLOPT_WRITEFUNCTION)
/* evaluates to true if option takes a curl_conv_callback argument */
-#define _curl_is_conv_cb_option(option) \
- ((option) == CURLOPT_CONV_TO_NETWORK_FUNCTION || \
- (option) == CURLOPT_CONV_FROM_NETWORK_FUNCTION || \
+#define curlcheck_conv_cb_option(option) \
+ ((option) == CURLOPT_CONV_TO_NETWORK_FUNCTION || \
+ (option) == CURLOPT_CONV_FROM_NETWORK_FUNCTION || \
(option) == CURLOPT_CONV_FROM_UTF8_FUNCTION)
/* evaluates to true if option takes a data argument to pass to a callback */
-#define _curl_is_cb_data_option(option) \
+#define curlcheck_cb_data_option(option) \
((option) == CURLOPT_CHUNK_DATA || \
(option) == CURLOPT_CLOSESOCKETDATA || \
(option) == CURLOPT_DEBUGDATA || \
@@ -362,17 +366,17 @@ _CURL_WARNING(_curl_easy_getinfo_err_curl_off_t,
(option) == CURLOPT_SSL_CTX_DATA || \
(option) == CURLOPT_WRITEDATA || \
(option) == CURLOPT_RESOLVER_START_DATA || \
- (option) == CURLOPT_CURLU || \
+ (option) == CURLOPT_TRAILERDATA || \
0)
/* evaluates to true if option takes a POST data argument (void* or char*) */
-#define _curl_is_postfields_option(option) \
+#define curlcheck_postfields_option(option) \
((option) == CURLOPT_POSTFIELDS || \
(option) == CURLOPT_COPYPOSTFIELDS || \
0)
/* evaluates to true if option takes a struct curl_slist * argument */
-#define _curl_is_slist_option(option) \
+#define curlcheck_slist_option(option) \
((option) == CURLOPT_HTTP200ALIASES || \
(option) == CURLOPT_HTTPHEADER || \
(option) == CURLOPT_MAIL_RCPT || \
@@ -382,45 +386,46 @@ _CURL_WARNING(_curl_easy_getinfo_err_curl_off_t,
(option) == CURLOPT_QUOTE || \
(option) == CURLOPT_RESOLVE || \
(option) == CURLOPT_TELNETOPTIONS || \
+ (option) == CURLOPT_CONNECT_TO || \
0)
/* groups of curl_easy_getinfo infos that take the same type of argument */
/* evaluates to true if info expects a pointer to char * argument */
-#define _curl_is_string_info(info) \
+#define curlcheck_string_info(info) \
(CURLINFO_STRING < (info) && (info) < CURLINFO_LONG)
/* evaluates to true if info expects a pointer to long argument */
-#define _curl_is_long_info(info) \
+#define curlcheck_long_info(info) \
(CURLINFO_LONG < (info) && (info) < CURLINFO_DOUBLE)
/* evaluates to true if info expects a pointer to double argument */
-#define _curl_is_double_info(info) \
+#define curlcheck_double_info(info) \
(CURLINFO_DOUBLE < (info) && (info) < CURLINFO_SLIST)
/* true if info expects a pointer to struct curl_slist * argument */
-#define _curl_is_slist_info(info) \
+#define curlcheck_slist_info(info) \
(((info) == CURLINFO_SSL_ENGINES) || ((info) == CURLINFO_COOKIELIST))
/* true if info expects a pointer to struct curl_tlssessioninfo * argument */
-#define _curl_is_tlssessioninfo_info(info) \
+#define curlcheck_tlssessioninfo_info(info) \
(((info) == CURLINFO_TLS_SSL_PTR) || ((info) == CURLINFO_TLS_SESSION))
/* true if info expects a pointer to struct curl_certinfo * argument */
-#define _curl_is_certinfo_info(info) ((info) == CURLINFO_CERTINFO)
+#define curlcheck_certinfo_info(info) ((info) == CURLINFO_CERTINFO)
/* true if info expects a pointer to struct curl_socket_t argument */
-#define _curl_is_socket_info(info) \
+#define curlcheck_socket_info(info) \
(CURLINFO_SOCKET < (info) && (info) < CURLINFO_OFF_T)
/* true if info expects a pointer to curl_off_t argument */
-#define _curl_is_off_t_info(info) \
+#define curlcheck_off_t_info(info) \
(CURLINFO_OFF_T < (info))
/* typecheck helpers -- check whether given expression has requested type*/
-/* For pointers, you can use the _curl_is_ptr/_curl_is_arr macros,
+/* For pointers, you can use the curlcheck_ptr/curlcheck_arr macros,
* otherwise define a new macro. Search for __builtin_types_compatible_p
* in the GCC manual.
* NOTE: these macros MUST NOT EVALUATE their arguments! The argument is
@@ -430,35 +435,35 @@ _CURL_WARNING(_curl_easy_getinfo_err_curl_off_t,
*/
/* XXX: should evaluate to true if expr is a pointer */
-#define _curl_is_any_ptr(expr) \
+#define curlcheck_any_ptr(expr) \
(sizeof(expr) == sizeof(void *))
/* evaluates to true if expr is NULL */
/* XXX: must not evaluate expr, so this check is not accurate */
-#define _curl_is_NULL(expr) \
+#define curlcheck_NULL(expr) \
(__builtin_types_compatible_p(__typeof__(expr), __typeof__(NULL)))
/* evaluates to true if expr is type*, const type* or NULL */
-#define _curl_is_ptr(expr, type) \
- (_curl_is_NULL(expr) || \
- __builtin_types_compatible_p(__typeof__(expr), type *) || \
+#define curlcheck_ptr(expr, type) \
+ (curlcheck_NULL(expr) || \
+ __builtin_types_compatible_p(__typeof__(expr), type *) || \
__builtin_types_compatible_p(__typeof__(expr), const type *))
/* evaluates to true if expr is one of type[], type*, NULL or const type* */
-#define _curl_is_arr(expr, type) \
- (_curl_is_ptr((expr), type) || \
+#define curlcheck_arr(expr, type) \
+ (curlcheck_ptr((expr), type) || \
__builtin_types_compatible_p(__typeof__(expr), type []))
/* evaluates to true if expr is a string */
-#define _curl_is_string(expr) \
- (_curl_is_arr((expr), char) || \
- _curl_is_arr((expr), signed char) || \
- _curl_is_arr((expr), unsigned char))
+#define curlcheck_string(expr) \
+ (curlcheck_arr((expr), char) || \
+ curlcheck_arr((expr), signed char) || \
+ curlcheck_arr((expr), unsigned char))
/* evaluates to true if expr is a long (no matter the signedness)
* XXX: for now, int is also accepted (and therefore short and char, which
* are promoted to int when passed to a variadic function) */
-#define _curl_is_long(expr) \
+#define curlcheck_long(expr) \
(__builtin_types_compatible_p(__typeof__(expr), long) || \
__builtin_types_compatible_p(__typeof__(expr), signed long) || \
__builtin_types_compatible_p(__typeof__(expr), unsigned long) || \
@@ -473,59 +478,59 @@ _CURL_WARNING(_curl_easy_getinfo_err_curl_off_t,
__builtin_types_compatible_p(__typeof__(expr), unsigned char))
/* evaluates to true if expr is of type curl_off_t */
-#define _curl_is_off_t(expr) \
+#define curlcheck_off_t(expr) \
(__builtin_types_compatible_p(__typeof__(expr), curl_off_t))
/* evaluates to true if expr is abuffer suitable for CURLOPT_ERRORBUFFER */
/* XXX: also check size of an char[] array? */
-#define _curl_is_error_buffer(expr) \
- (_curl_is_NULL(expr) || \
- __builtin_types_compatible_p(__typeof__(expr), char *) || \
+#define curlcheck_error_buffer(expr) \
+ (curlcheck_NULL(expr) || \
+ __builtin_types_compatible_p(__typeof__(expr), char *) || \
__builtin_types_compatible_p(__typeof__(expr), char[]))
/* evaluates to true if expr is of type (const) void* or (const) FILE* */
#if 0
-#define _curl_is_cb_data(expr) \
- (_curl_is_ptr((expr), void) || \
- _curl_is_ptr((expr), FILE))
+#define curlcheck_cb_data(expr) \
+ (curlcheck_ptr((expr), void) || \
+ curlcheck_ptr((expr), FILE))
#else /* be less strict */
-#define _curl_is_cb_data(expr) \
- _curl_is_any_ptr(expr)
+#define curlcheck_cb_data(expr) \
+ curlcheck_any_ptr(expr)
#endif
/* evaluates to true if expr is of type FILE* */
-#define _curl_is_FILE(expr) \
- (_curl_is_NULL(expr) || \
+#define curlcheck_FILE(expr) \
+ (curlcheck_NULL(expr) || \
(__builtin_types_compatible_p(__typeof__(expr), FILE *)))
/* evaluates to true if expr can be passed as POST data (void* or char*) */
-#define _curl_is_postfields(expr) \
- (_curl_is_ptr((expr), void) || \
- _curl_is_arr((expr), char) || \
- _curl_is_arr((expr), unsigned char))
+#define curlcheck_postfields(expr) \
+ (curlcheck_ptr((expr), void) || \
+ curlcheck_arr((expr), char) || \
+ curlcheck_arr((expr), unsigned char))
/* helper: __builtin_types_compatible_p distinguishes between functions and
* function pointers, hide it */
-#define _curl_callback_compatible(func, type) \
- (__builtin_types_compatible_p(__typeof__(func), type) || \
+#define curlcheck_cb_compatible(func, type) \
+ (__builtin_types_compatible_p(__typeof__(func), type) || \
__builtin_types_compatible_p(__typeof__(func) *, type))
/* evaluates to true if expr is of type curl_resolver_start_callback */
-#define _curl_is_resolver_start_callback(expr) \
- (_curl_is_NULL(expr) || \
- _curl_callback_compatible((expr), curl_resolver_start_callback))
+#define curlcheck_resolver_start_callback(expr) \
+ (curlcheck_NULL(expr) || \
+ curlcheck_cb_compatible((expr), curl_resolver_start_callback))
/* evaluates to true if expr is of type curl_read_callback or "similar" */
-#define _curl_is_read_cb(expr) \
- (_curl_is_NULL(expr) || \
- _curl_callback_compatible((expr), __typeof__(fread) *) || \
- _curl_callback_compatible((expr), curl_read_callback) || \
- _curl_callback_compatible((expr), _curl_read_callback1) || \
- _curl_callback_compatible((expr), _curl_read_callback2) || \
- _curl_callback_compatible((expr), _curl_read_callback3) || \
- _curl_callback_compatible((expr), _curl_read_callback4) || \
- _curl_callback_compatible((expr), _curl_read_callback5) || \
- _curl_callback_compatible((expr), _curl_read_callback6))
+#define curlcheck_read_cb(expr) \
+ (curlcheck_NULL(expr) || \
+ curlcheck_cb_compatible((expr), __typeof__(fread) *) || \
+ curlcheck_cb_compatible((expr), curl_read_callback) || \
+ curlcheck_cb_compatible((expr), _curl_read_callback1) || \
+ curlcheck_cb_compatible((expr), _curl_read_callback2) || \
+ curlcheck_cb_compatible((expr), _curl_read_callback3) || \
+ curlcheck_cb_compatible((expr), _curl_read_callback4) || \
+ curlcheck_cb_compatible((expr), _curl_read_callback5) || \
+ curlcheck_cb_compatible((expr), _curl_read_callback6))
typedef size_t (*_curl_read_callback1)(char *, size_t, size_t, void *);
typedef size_t (*_curl_read_callback2)(char *, size_t, size_t, const void *);
typedef size_t (*_curl_read_callback3)(char *, size_t, size_t, FILE *);
@@ -534,16 +539,16 @@ typedef size_t (*_curl_read_callback5)(void *, size_t, size_t, const void *);
typedef size_t (*_curl_read_callback6)(void *, size_t, size_t, FILE *);
/* evaluates to true if expr is of type curl_write_callback or "similar" */
-#define _curl_is_write_cb(expr) \
- (_curl_is_read_cb(expr) || \
- _curl_callback_compatible((expr), __typeof__(fwrite) *) || \
- _curl_callback_compatible((expr), curl_write_callback) || \
- _curl_callback_compatible((expr), _curl_write_callback1) || \
- _curl_callback_compatible((expr), _curl_write_callback2) || \
- _curl_callback_compatible((expr), _curl_write_callback3) || \
- _curl_callback_compatible((expr), _curl_write_callback4) || \
- _curl_callback_compatible((expr), _curl_write_callback5) || \
- _curl_callback_compatible((expr), _curl_write_callback6))
+#define curlcheck_write_cb(expr) \
+ (curlcheck_read_cb(expr) || \
+ curlcheck_cb_compatible((expr), __typeof__(fwrite) *) || \
+ curlcheck_cb_compatible((expr), curl_write_callback) || \
+ curlcheck_cb_compatible((expr), _curl_write_callback1) || \
+ curlcheck_cb_compatible((expr), _curl_write_callback2) || \
+ curlcheck_cb_compatible((expr), _curl_write_callback3) || \
+ curlcheck_cb_compatible((expr), _curl_write_callback4) || \
+ curlcheck_cb_compatible((expr), _curl_write_callback5) || \
+ curlcheck_cb_compatible((expr), _curl_write_callback6))
typedef size_t (*_curl_write_callback1)(const char *, size_t, size_t, void *);
typedef size_t (*_curl_write_callback2)(const char *, size_t, size_t,
const void *);
@@ -554,37 +559,37 @@ typedef size_t (*_curl_write_callback5)(const void *, size_t, size_t,
typedef size_t (*_curl_write_callback6)(const void *, size_t, size_t, FILE *);
/* evaluates to true if expr is of type curl_ioctl_callback or "similar" */
-#define _curl_is_ioctl_cb(expr) \
- (_curl_is_NULL(expr) || \
- _curl_callback_compatible((expr), curl_ioctl_callback) || \
- _curl_callback_compatible((expr), _curl_ioctl_callback1) || \
- _curl_callback_compatible((expr), _curl_ioctl_callback2) || \
- _curl_callback_compatible((expr), _curl_ioctl_callback3) || \
- _curl_callback_compatible((expr), _curl_ioctl_callback4))
+#define curlcheck_ioctl_cb(expr) \
+ (curlcheck_NULL(expr) || \
+ curlcheck_cb_compatible((expr), curl_ioctl_callback) || \
+ curlcheck_cb_compatible((expr), _curl_ioctl_callback1) || \
+ curlcheck_cb_compatible((expr), _curl_ioctl_callback2) || \
+ curlcheck_cb_compatible((expr), _curl_ioctl_callback3) || \
+ curlcheck_cb_compatible((expr), _curl_ioctl_callback4))
typedef curlioerr (*_curl_ioctl_callback1)(CURL *, int, void *);
typedef curlioerr (*_curl_ioctl_callback2)(CURL *, int, const void *);
typedef curlioerr (*_curl_ioctl_callback3)(CURL *, curliocmd, void *);
typedef curlioerr (*_curl_ioctl_callback4)(CURL *, curliocmd, const void *);
/* evaluates to true if expr is of type curl_sockopt_callback or "similar" */
-#define _curl_is_sockopt_cb(expr) \
- (_curl_is_NULL(expr) || \
- _curl_callback_compatible((expr), curl_sockopt_callback) || \
- _curl_callback_compatible((expr), _curl_sockopt_callback1) || \
- _curl_callback_compatible((expr), _curl_sockopt_callback2))
+#define curlcheck_sockopt_cb(expr) \
+ (curlcheck_NULL(expr) || \
+ curlcheck_cb_compatible((expr), curl_sockopt_callback) || \
+ curlcheck_cb_compatible((expr), _curl_sockopt_callback1) || \
+ curlcheck_cb_compatible((expr), _curl_sockopt_callback2))
typedef int (*_curl_sockopt_callback1)(void *, curl_socket_t, curlsocktype);
typedef int (*_curl_sockopt_callback2)(const void *, curl_socket_t,
curlsocktype);
/* evaluates to true if expr is of type curl_opensocket_callback or
"similar" */
-#define _curl_is_opensocket_cb(expr) \
- (_curl_is_NULL(expr) || \
- _curl_callback_compatible((expr), curl_opensocket_callback) || \
- _curl_callback_compatible((expr), _curl_opensocket_callback1) || \
- _curl_callback_compatible((expr), _curl_opensocket_callback2) || \
- _curl_callback_compatible((expr), _curl_opensocket_callback3) || \
- _curl_callback_compatible((expr), _curl_opensocket_callback4))
+#define curlcheck_opensocket_cb(expr) \
+ (curlcheck_NULL(expr) || \
+ curlcheck_cb_compatible((expr), curl_opensocket_callback) || \
+ curlcheck_cb_compatible((expr), _curl_opensocket_callback1) || \
+ curlcheck_cb_compatible((expr), _curl_opensocket_callback2) || \
+ curlcheck_cb_compatible((expr), _curl_opensocket_callback3) || \
+ curlcheck_cb_compatible((expr), _curl_opensocket_callback4))
typedef curl_socket_t (*_curl_opensocket_callback1)
(void *, curlsocktype, struct curl_sockaddr *);
typedef curl_socket_t (*_curl_opensocket_callback2)
@@ -595,28 +600,28 @@ typedef curl_socket_t (*_curl_opensocket_callback4)
(const void *, curlsocktype, const struct curl_sockaddr *);
/* evaluates to true if expr is of type curl_progress_callback or "similar" */
-#define _curl_is_progress_cb(expr) \
- (_curl_is_NULL(expr) || \
- _curl_callback_compatible((expr), curl_progress_callback) || \
- _curl_callback_compatible((expr), _curl_progress_callback1) || \
- _curl_callback_compatible((expr), _curl_progress_callback2))
+#define curlcheck_progress_cb(expr) \
+ (curlcheck_NULL(expr) || \
+ curlcheck_cb_compatible((expr), curl_progress_callback) || \
+ curlcheck_cb_compatible((expr), _curl_progress_callback1) || \
+ curlcheck_cb_compatible((expr), _curl_progress_callback2))
typedef int (*_curl_progress_callback1)(void *,
double, double, double, double);
typedef int (*_curl_progress_callback2)(const void *,
double, double, double, double);
/* evaluates to true if expr is of type curl_debug_callback or "similar" */
-#define _curl_is_debug_cb(expr) \
- (_curl_is_NULL(expr) || \
- _curl_callback_compatible((expr), curl_debug_callback) || \
- _curl_callback_compatible((expr), _curl_debug_callback1) || \
- _curl_callback_compatible((expr), _curl_debug_callback2) || \
- _curl_callback_compatible((expr), _curl_debug_callback3) || \
- _curl_callback_compatible((expr), _curl_debug_callback4) || \
- _curl_callback_compatible((expr), _curl_debug_callback5) || \
- _curl_callback_compatible((expr), _curl_debug_callback6) || \
- _curl_callback_compatible((expr), _curl_debug_callback7) || \
- _curl_callback_compatible((expr), _curl_debug_callback8))
+#define curlcheck_debug_cb(expr) \
+ (curlcheck_NULL(expr) || \
+ curlcheck_cb_compatible((expr), curl_debug_callback) || \
+ curlcheck_cb_compatible((expr), _curl_debug_callback1) || \
+ curlcheck_cb_compatible((expr), _curl_debug_callback2) || \
+ curlcheck_cb_compatible((expr), _curl_debug_callback3) || \
+ curlcheck_cb_compatible((expr), _curl_debug_callback4) || \
+ curlcheck_cb_compatible((expr), _curl_debug_callback5) || \
+ curlcheck_cb_compatible((expr), _curl_debug_callback6) || \
+ curlcheck_cb_compatible((expr), _curl_debug_callback7) || \
+ curlcheck_cb_compatible((expr), _curl_debug_callback8))
typedef int (*_curl_debug_callback1) (CURL *,
curl_infotype, char *, size_t, void *);
typedef int (*_curl_debug_callback2) (CURL *,
@@ -636,17 +641,17 @@ typedef int (*_curl_debug_callback8) (CURL *,
/* evaluates to true if expr is of type curl_ssl_ctx_callback or "similar" */
/* this is getting even messier... */
-#define _curl_is_ssl_ctx_cb(expr) \
- (_curl_is_NULL(expr) || \
- _curl_callback_compatible((expr), curl_ssl_ctx_callback) || \
- _curl_callback_compatible((expr), _curl_ssl_ctx_callback1) || \
- _curl_callback_compatible((expr), _curl_ssl_ctx_callback2) || \
- _curl_callback_compatible((expr), _curl_ssl_ctx_callback3) || \
- _curl_callback_compatible((expr), _curl_ssl_ctx_callback4) || \
- _curl_callback_compatible((expr), _curl_ssl_ctx_callback5) || \
- _curl_callback_compatible((expr), _curl_ssl_ctx_callback6) || \
- _curl_callback_compatible((expr), _curl_ssl_ctx_callback7) || \
- _curl_callback_compatible((expr), _curl_ssl_ctx_callback8))
+#define curlcheck_ssl_ctx_cb(expr) \
+ (curlcheck_NULL(expr) || \
+ curlcheck_cb_compatible((expr), curl_ssl_ctx_callback) || \
+ curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback1) || \
+ curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback2) || \
+ curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback3) || \
+ curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback4) || \
+ curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback5) || \
+ curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback6) || \
+ curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback7) || \
+ curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback8))
typedef CURLcode (*_curl_ssl_ctx_callback1)(CURL *, void *, void *);
typedef CURLcode (*_curl_ssl_ctx_callback2)(CURL *, void *, const void *);
typedef CURLcode (*_curl_ssl_ctx_callback3)(CURL *, const void *, void *);
@@ -669,26 +674,26 @@ typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback8;
#endif
/* evaluates to true if expr is of type curl_conv_callback or "similar" */
-#define _curl_is_conv_cb(expr) \
- (_curl_is_NULL(expr) || \
- _curl_callback_compatible((expr), curl_conv_callback) || \
- _curl_callback_compatible((expr), _curl_conv_callback1) || \
- _curl_callback_compatible((expr), _curl_conv_callback2) || \
- _curl_callback_compatible((expr), _curl_conv_callback3) || \
- _curl_callback_compatible((expr), _curl_conv_callback4))
+#define curlcheck_conv_cb(expr) \
+ (curlcheck_NULL(expr) || \
+ curlcheck_cb_compatible((expr), curl_conv_callback) || \
+ curlcheck_cb_compatible((expr), _curl_conv_callback1) || \
+ curlcheck_cb_compatible((expr), _curl_conv_callback2) || \
+ curlcheck_cb_compatible((expr), _curl_conv_callback3) || \
+ curlcheck_cb_compatible((expr), _curl_conv_callback4))
typedef CURLcode (*_curl_conv_callback1)(char *, size_t length);
typedef CURLcode (*_curl_conv_callback2)(const char *, size_t length);
typedef CURLcode (*_curl_conv_callback3)(void *, size_t length);
typedef CURLcode (*_curl_conv_callback4)(const void *, size_t length);
/* evaluates to true if expr is of type curl_seek_callback or "similar" */
-#define _curl_is_seek_cb(expr) \
- (_curl_is_NULL(expr) || \
- _curl_callback_compatible((expr), curl_seek_callback) || \
- _curl_callback_compatible((expr), _curl_seek_callback1) || \
- _curl_callback_compatible((expr), _curl_seek_callback2))
+#define curlcheck_seek_cb(expr) \
+ (curlcheck_NULL(expr) || \
+ curlcheck_cb_compatible((expr), curl_seek_callback) || \
+ curlcheck_cb_compatible((expr), _curl_seek_callback1) || \
+ curlcheck_cb_compatible((expr), _curl_seek_callback2))
typedef CURLcode (*_curl_seek_callback1)(void *, curl_off_t, int);
typedef CURLcode (*_curl_seek_callback2)(const void *, curl_off_t, int);
-#endif /* __CURL_TYPECHECK_GCC_H */
+#endif /* CURLINC_TYPECHECK_GCC_H */
diff --git a/Utilities/cmcurl/include/curl/urlapi.h b/Utilities/cmcurl/include/curl/urlapi.h
index 58e89d8..f2d0677 100644
--- a/Utilities/cmcurl/include/curl/urlapi.h
+++ b/Utilities/cmcurl/include/curl/urlapi.h
@@ -1,5 +1,5 @@
-#ifndef __CURL_URLAPI_H
-#define __CURL_URLAPI_H
+#ifndef CURLINC_URLAPI_H
+#define CURLINC_URLAPI_H
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
@@ -77,6 +77,8 @@ typedef enum {
#define CURLU_URLENCODE (1<<7) /* URL encode on set */
#define CURLU_APPENDQUERY (1<<8) /* append a form style part */
#define CURLU_GUESS_SCHEME (1<<9) /* legacy curl-style guessing */
+#define CURLU_NO_AUTHORITY (1<<10) /* Allow empty authority when the
+ scheme is unknown. */
typedef struct Curl_URL CURLU;
@@ -120,4 +122,4 @@ CURL_EXTERN CURLUcode curl_url_set(CURLU *handle, CURLUPart what,
} /* end of extern "C" */
#endif
-#endif
+#endif /* CURLINC_URLAPI_H */
diff --git a/Utilities/cmcurl/lib/CMakeLists.txt b/Utilities/cmcurl/lib/CMakeLists.txt
index 2a6279c..230c7cf 100644
--- a/Utilities/cmcurl/lib/CMakeLists.txt
+++ b/Utilities/cmcurl/lib/CMakeLists.txt
@@ -20,7 +20,6 @@ list(APPEND HHEADERS
if(MSVC AND NOT CURL_STATICLIB)
list(APPEND CSOURCES libcurl.rc)
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4127")
endif()
# SET(CSOURCES
@@ -101,7 +100,7 @@ if(NOT BUILD_SHARED_LIBS)
set_target_properties(${LIB_NAME} PROPERTIES INTERFACE_COMPILE_DEFINITIONS CURL_STATICLIB)
endif()
-target_link_libraries(${LIB_NAME} ${CURL_LIBS})
+target_link_libraries(${LIB_NAME} PRIVATE ${CURL_LIBS})
if(0) # This code not needed for building within CMake.
if(WIN32)
@@ -121,6 +120,12 @@ endif()
set_target_properties(${LIB_NAME} PROPERTIES PREFIX "")
set_target_properties(${LIB_NAME} PROPERTIES IMPORT_PREFIX "")
+if(CURL_HAS_LTO)
+ set_target_properties(${LIB_NAME} PROPERTIES
+ INTERPROCEDURAL_OPTIMIZATION_RELEASE TRUE
+ INTERPROCEDURAL_OPTIMIZATION_RELWITHDEBINFO TRUE)
+endif()
+
if(WIN32)
if(BUILD_SHARED_LIBS)
# Add "_imp" as a suffix before the extension to avoid conflicting with the statically linked "libcurl.lib"
diff --git a/Utilities/cmcurl/lib/Makefile.inc b/Utilities/cmcurl/lib/Makefile.inc
index 235b82b..46ded90 100644
--- a/Utilities/cmcurl/lib/Makefile.inc
+++ b/Utilities/cmcurl/lib/Makefile.inc
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -28,14 +28,22 @@ LIB_VAUTH_CFILES = vauth/vauth.c vauth/cleartext.c vauth/cram.c \
LIB_VAUTH_HFILES = vauth/vauth.h vauth/digest.h vauth/ntlm.h
LIB_VTLS_CFILES = vtls/openssl.c vtls/gtls.c vtls/vtls.c vtls/nss.c \
- vtls/polarssl.c vtls/polarssl_threadlock.c \
- vtls/cyassl.c vtls/schannel.c vtls/schannel_verify.c \
- vtls/sectransp.c vtls/gskit.c vtls/mbedtls.c vtls/mesalink.c
+ vtls/mbedtls_threadlock.c vtls/wolfssl.c vtls/schannel.c \
+ vtls/schannel_verify.c vtls/sectransp.c vtls/gskit.c vtls/mbedtls.c \
+ vtls/mesalink.c vtls/bearssl.c
-LIB_VTLS_HFILES = vtls/openssl.h vtls/vtls.h vtls/gtls.h \
- vtls/nssg.h vtls/polarssl.h vtls/polarssl_threadlock.h \
- vtls/cyassl.h vtls/schannel.h vtls/sectransp.h vtls/gskit.h \
- vtls/mbedtls.h vtls/mesalink.h
+LIB_VTLS_HFILES = vtls/openssl.h vtls/vtls.h vtls/gtls.h vtls/nssg.h \
+ vtls/mbedtls_threadlock.h vtls/wolfssl.h vtls/schannel.h \
+ vtls/sectransp.h vtls/gskit.h vtls/mbedtls.h vtls/mesalink.h \
+ vtls/bearssl.h
+
+LIB_VQUIC_CFILES = vquic/ngtcp2.c vquic/quiche.c
+
+LIB_VQUIC_HFILES = vquic/ngtcp2.h vquic/quiche.h
+
+LIB_VSSH_CFILES = vssh/libssh2.c vssh/libssh.c vssh/wolfssh.c
+
+LIB_VSSH_HFILES = vssh/ssh.h
LIB_CFILES = file.c timeval.c base64.c hostip.c progress.c formdata.c \
cookie.c http.c sendf.c ftp.c url.c dict.c if2ip.c speedcheck.c \
@@ -46,7 +54,7 @@ LIB_CFILES = file.c timeval.c base64.c hostip.c progress.c formdata.c \
http_digest.c md4.c md5.c http_negotiate.c inet_pton.c strtoofft.c \
strerror.c amigaos.c hostasyn.c hostip4.c hostip6.c hostsyn.c \
inet_ntop.c parsedate.c select.c tftp.c splay.c strdup.c socks.c \
- ssh.c ssh-libssh.c curl_addrinfo.c socks_gssapi.c socks_sspi.c \
+ curl_addrinfo.c socks_gssapi.c socks_sspi.c \
curl_sspi.c slist.c nonblock.c curl_memrchr.c imap.c pop3.c smtp.c \
pingpong.c rtsp.c curl_threads.c warnless.c hmac.c curl_rtmp.c \
openldap.c curl_gethostname.c gopher.c idn_win32.c \
@@ -55,7 +63,7 @@ LIB_CFILES = file.c timeval.c base64.c hostip.c progress.c formdata.c \
curl_multibyte.c hostcheck.c conncache.c dotdot.c \
x509asn1.c http2.c smb.c curl_endian.c curl_des.c system_win32.c \
mime.c sha256.c setopt.c curl_path.c curl_ctype.c curl_range.c psl.c \
- doh.c urlapi.c curl_get_line.c altsvc.c
+ doh.c urlapi.c curl_get_line.c altsvc.c socketpair.c rename.c
LIB_HFILES = arpa_telnet.h netrc.h file.h timeval.h hostip.h progress.h \
formdata.h cookie.h http.h sendf.h ftp.h url.h dict.h if2ip.h \
@@ -66,7 +74,7 @@ LIB_HFILES = arpa_telnet.h netrc.h file.h timeval.h hostip.h progress.h \
http_negotiate.h inet_pton.h amigaos.h strtoofft.h strerror.h \
inet_ntop.h curlx.h curl_memory.h curl_setup.h transfer.h select.h \
easyif.h multiif.h parsedate.h tftp.h sockaddr.h splay.h strdup.h \
- socks.h ssh.h curl_base64.h curl_addrinfo.h curl_sspi.h \
+ socks.h curl_base64.h curl_addrinfo.h curl_sspi.h \
slist.h nonblock.h curl_memrchr.h imap.h pop3.h smtp.h pingpong.h \
rtsp.h curl_threads.h warnless.h curl_hmac.h curl_rtmp.h \
curl_gethostname.h gopher.h http_proxy.h non-ascii.h asyn.h \
@@ -76,9 +84,11 @@ LIB_HFILES = arpa_telnet.h netrc.h file.h timeval.h hostip.h progress.h \
x509asn1.h http2.h sigpipe.h smb.h curl_endian.h curl_des.h \
curl_printf.h system_win32.h rand.h mime.h curl_sha256.h setopt.h \
curl_path.h curl_ctype.h curl_range.h psl.h doh.h urlapi-int.h \
- curl_get_line.h altsvc.h
+ curl_get_line.h altsvc.h quic.h socketpair.h rename.h
LIB_RCFILES = libcurl.rc
-CSOURCES = $(LIB_CFILES) $(LIB_VAUTH_CFILES) $(LIB_VTLS_CFILES)
-HHEADERS = $(LIB_HFILES) $(LIB_VAUTH_HFILES) $(LIB_VTLS_HFILES)
+CSOURCES = $(LIB_CFILES) $(LIB_VAUTH_CFILES) $(LIB_VTLS_CFILES) \
+ $(LIB_VQUIC_CFILES) $(LIB_VSSH_CFILES)
+HHEADERS = $(LIB_HFILES) $(LIB_VAUTH_HFILES) $(LIB_VTLS_HFILES) \
+ $(LIB_VQUIC_HFILES) $(LIB_VSSH_HFILES)
diff --git a/Utilities/cmcurl/lib/altsvc.c b/Utilities/cmcurl/lib/altsvc.c
index 85a4e01..c39d86e 100644
--- a/Utilities/cmcurl/lib/altsvc.c
+++ b/Utilities/cmcurl/lib/altsvc.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2019 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -34,6 +34,8 @@
#include "parsedate.h"
#include "sendf.h"
#include "warnless.h"
+#include "rand.h"
+#include "rename.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
@@ -48,15 +50,19 @@
#define MAX_ALTSVC_ALPNLENSTR "10"
#define MAX_ALTSVC_ALPNLEN 10
+#if (defined(USE_QUICHE) || defined(USE_NGTCP2)) && !defined(UNITTESTS)
+#define H3VERSION "h3-27"
+#else
+#define H3VERSION "h3"
+#endif
+
static enum alpnid alpn2alpnid(char *name)
{
if(strcasecompare(name, "h1"))
return ALPN_h1;
if(strcasecompare(name, "h2"))
return ALPN_h2;
- if(strcasecompare(name, "h2c"))
- return ALPN_h2c;
- if(strcasecompare(name, "h3"))
+ if(strcasecompare(name, H3VERSION))
return ALPN_h3;
return ALPN_none; /* unknown, probably rubbish input */
}
@@ -69,10 +75,8 @@ const char *Curl_alpnid2str(enum alpnid id)
return "h1";
case ALPN_h2:
return "h2";
- case ALPN_h2c:
- return "h2c";
case ALPN_h3:
- return "h3";
+ return H3VERSION;
default:
return ""; /* bad */
}
@@ -81,8 +85,8 @@ const char *Curl_alpnid2str(enum alpnid id)
static void altsvc_free(struct altsvc *as)
{
- free(as->srchost);
- free(as->dsthost);
+ free(as->src.host);
+ free(as->dst.host);
free(as);
}
@@ -97,17 +101,17 @@ static struct altsvc *altsvc_createid(const char *srchost,
if(!as)
return NULL;
- as->srchost = strdup(srchost);
- if(!as->srchost)
+ as->src.host = strdup(srchost);
+ if(!as->src.host)
goto error;
- as->dsthost = strdup(dsthost);
- if(!as->dsthost)
+ as->dst.host = strdup(dsthost);
+ if(!as->dst.host)
goto error;
- as->srcalpnid = srcalpnid;
- as->dstalpnid = dstalpnid;
- as->srcport = curlx_ultous(srcport);
- as->dstport = curlx_ultous(dstport);
+ as->src.alpnid = srcalpnid;
+ as->dst.alpnid = dstalpnid;
+ as->src.port = curlx_ultous(srcport);
+ as->dst.port = curlx_ultous(dstport);
return as;
error:
@@ -156,7 +160,7 @@ static CURLcode altsvc_add(struct altsvcinfo *asi, char *line)
date, &persist, &prio);
if(9 == rc) {
struct altsvc *as;
- time_t expires = curl_getdate(date, NULL);
+ time_t expires = Curl_getdate_capped(date);
as = altsvc_create(srchost, dsthost, srcalpn, dstalpn, srcport, dstport);
if(as) {
as->expires = expires;
@@ -183,7 +187,16 @@ static CURLcode altsvc_load(struct altsvcinfo *asi, const char *file)
{
CURLcode result = CURLE_OK;
char *line = NULL;
- FILE *fp = fopen(file, FOPEN_READTEXT);
+ FILE *fp;
+
+ /* we need a private copy of the file name so that the altsvc cache file
+ name survives an easy handle reset */
+ free(asi->filename);
+ asi->filename = strdup(file);
+ if(!asi->filename)
+ return CURLE_OUT_OF_MEMORY;
+
+ fp = fopen(file, FOPEN_READTEXT);
if(fp) {
line = malloc(MAX_ALTSVC_LINE);
if(!line)
@@ -204,6 +217,7 @@ static CURLcode altsvc_load(struct altsvcinfo *asi, const char *file)
return result;
fail:
+ Curl_safefree(asi->filename);
free(line);
fclose(fp);
return CURLE_OUT_OF_MEMORY;
@@ -226,8 +240,8 @@ static CURLcode altsvc_out(struct altsvc *as, FILE *fp)
"\"%d%02d%02d "
"%02d:%02d:%02d\" "
"%u %d\n",
- Curl_alpnid2str(as->srcalpnid), as->srchost, as->srcport,
- Curl_alpnid2str(as->dstalpnid), as->dsthost, as->dstport,
+ Curl_alpnid2str(as->src.alpnid), as->src.host, as->src.port,
+ Curl_alpnid2str(as->dst.alpnid), as->dst.host, as->dst.port,
stamp.tm_year + 1900, stamp.tm_mon + 1, stamp.tm_mday,
stamp.tm_hour, stamp.tm_min, stamp.tm_sec,
as->persist, as->prio);
@@ -252,7 +266,7 @@ struct altsvcinfo *Curl_altsvc_init(void)
#ifdef USE_NGHTTP2
| CURLALTSVC_H2
#endif
-#ifdef USE_HTTP3
+#ifdef ENABLE_QUIC
| CURLALTSVC_H3
#endif
;
@@ -297,6 +311,7 @@ void Curl_altsvc_cleanup(struct altsvcinfo *altsvc)
n = e->next;
altsvc_free(as);
}
+ free(altsvc->filename);
free(altsvc);
}
}
@@ -304,34 +319,57 @@ void Curl_altsvc_cleanup(struct altsvcinfo *altsvc)
/*
* Curl_altsvc_save() writes the altsvc cache to a file.
*/
-CURLcode Curl_altsvc_save(struct altsvcinfo *altsvc, const char *file)
+CURLcode Curl_altsvc_save(struct Curl_easy *data,
+ struct altsvcinfo *altsvc, const char *file)
{
struct curl_llist_element *e;
struct curl_llist_element *n;
CURLcode result = CURLE_OK;
FILE *out;
+ char *tempstore;
+ unsigned char randsuffix[9];
if(!altsvc)
/* no cache activated */
return CURLE_OK;
- if((altsvc->flags & CURLALTSVC_READONLYFILE) || !file[0])
- /* marked as read-only or zero length file name */
+ /* if not new name is given, use the one we stored from the load */
+ if(!file && altsvc->filename)
+ file = altsvc->filename;
+
+ if((altsvc->flags & CURLALTSVC_READONLYFILE) || !file || !file[0])
+ /* marked as read-only, no file or zero length file name */
return CURLE_OK;
- out = fopen(file, FOPEN_WRITETEXT);
+
+ if(Curl_rand_hex(data, randsuffix, sizeof(randsuffix)))
+ return CURLE_FAILED_INIT;
+
+ tempstore = aprintf("%s.%s.tmp", file, randsuffix);
+ if(!tempstore)
+ return CURLE_OUT_OF_MEMORY;
+
+ out = fopen(tempstore, FOPEN_WRITETEXT);
if(!out)
- return CURLE_WRITE_ERROR;
- fputs("# Your alt-svc cache. https://curl.haxx.se/docs/alt-svc.html\n"
- "# This file was generated by libcurl! Edit at your own risk.\n",
- out);
- for(e = altsvc->list.head; e; e = n) {
- struct altsvc *as = e->ptr;
- n = e->next;
- result = altsvc_out(as, out);
+ result = CURLE_WRITE_ERROR;
+ else {
+ fputs("# Your alt-svc cache. https://curl.haxx.se/docs/alt-svc.html\n"
+ "# This file was generated by libcurl! Edit at your own risk.\n",
+ out);
+ for(e = altsvc->list.head; e; e = n) {
+ struct altsvc *as = e->ptr;
+ n = e->next;
+ result = altsvc_out(as, out);
+ if(result)
+ break;
+ }
+ fclose(out);
+ if(!result && Curl_rename(tempstore, file))
+ result = CURLE_WRITE_ERROR;
+
if(result)
- break;
+ unlink(tempstore);
}
- fclose(out);
+ free(tempstore);
return result;
}
@@ -343,15 +381,15 @@ static CURLcode getalnum(const char **ptr, char *alpnbuf, size_t buflen)
while(*p && ISBLANK(*p))
p++;
protop = p;
- while(*p && ISALNUM(*p))
+ while(*p && !ISBLANK(*p) && (*p != ';') && (*p != '='))
p++;
len = p - protop;
+ *ptr = p;
if(!len || (len >= buflen))
return CURLE_BAD_FUNCTION_ARGUMENT;
memcpy(alpnbuf, protop, len);
alpnbuf[len] = 0;
- *ptr = p;
return CURLE_OK;
}
@@ -365,9 +403,9 @@ static void altsvc_flush(struct altsvcinfo *asi, enum alpnid srcalpnid,
for(e = asi->list.head; e; e = n) {
struct altsvc *as = e->ptr;
n = e->next;
- if((srcalpnid == as->srcalpnid) &&
- (srcport == as->srcport) &&
- strcasecompare(srchost, as->srchost)) {
+ if((srcalpnid == as->src.alpnid) &&
+ (srcport == as->src.port) &&
+ strcasecompare(srchost, as->src.host)) {
Curl_llist_remove(&asi->list, e, NULL);
altsvc_free(as);
asi->num--;
@@ -397,6 +435,10 @@ static time_t debugtime(void *unused)
*
* 'value' points to the header *value*. That's contents to the right of the
* header name.
+ *
+ * Currently this function rejects invalid data without returning an error.
+ * Invalid host name, port number will result in the specific alternative
+ * being rejected. Unknown protocols are skipped.
*/
CURLcode Curl_altsvc_parse(struct Curl_easy *data,
struct altsvcinfo *asi, const char *value,
@@ -410,12 +452,11 @@ CURLcode Curl_altsvc_parse(struct Curl_easy *data,
char alpnbuf[MAX_ALTSVC_ALPNLEN] = "";
struct altsvc *as;
unsigned short dstport = srcport; /* the same by default */
- const char *semip;
- time_t maxage = 24 * 3600; /* default is 24 hours */
- bool persist = FALSE;
CURLcode result = getalnum(&p, alpnbuf, sizeof(alpnbuf));
- if(result)
- return result;
+ if(result) {
+ infof(data, "Excessive alt-svc header, ignoring...\n");
+ return CURLE_OK;
+ }
DEBUGASSERT(asi);
@@ -427,47 +468,20 @@ CURLcode Curl_altsvc_parse(struct Curl_easy *data,
return CURLE_OK;
}
- /* The 'ma' and 'persist' flags are annoyingly meant for all alternatives
- but are set after the list on the line. Scan for the semicolons and get
- those fields first! */
- semip = p;
- do {
- semip = strchr(semip, ';');
- if(semip) {
- char option[32];
- unsigned long num;
- char *end_ptr;
- semip++; /* pass the semicolon */
- result = getalnum(&semip, option, sizeof(option));
- if(result)
- break;
- while(*semip && ISBLANK(*semip))
- semip++;
- if(*semip != '=')
- continue;
- semip++;
- num = strtoul(semip, &end_ptr, 10);
- if(num < ULONG_MAX) {
- if(strcasecompare("ma", option))
- maxage = num;
- else if(strcasecompare("persist", option) && (num == 1))
- persist = TRUE;
- }
- semip = end_ptr;
- }
- } while(semip);
-
do {
if(*p == '=') {
/* [protocol]="[host][:port]" */
dstalpnid = alpn2alpnid(alpnbuf);
- if(!dstalpnid) {
- infof(data, "Unknown alt-svc protocol \"%s\", ignoring...\n", alpnbuf);
- return CURLE_OK;
- }
p++;
if(*p == '\"') {
const char *dsthost;
+ const char *value_ptr;
+ char option[32];
+ unsigned long num;
+ char *end_ptr;
+ bool quoted = FALSE;
+ time_t maxage = 24 * 3600; /* default is 24 hours */
+ bool persist = FALSE;
p++;
if(*p != ':') {
/* host name starts here */
@@ -475,11 +489,15 @@ CURLcode Curl_altsvc_parse(struct Curl_easy *data,
while(*p && (ISALNUM(*p) || (*p == '.') || (*p == '-')))
p++;
len = p - hostp;
- if(!len || (len >= MAX_ALTSVC_HOSTLEN))
- return CURLE_BAD_FUNCTION_ARGUMENT;
- memcpy(namebuf, hostp, len);
- namebuf[len] = 0;
- dsthost = namebuf;
+ if(!len || (len >= MAX_ALTSVC_HOSTLEN)) {
+ infof(data, "Excessive alt-svc host name, ignoring...\n");
+ dstalpnid = ALPN_none;
+ }
+ else {
+ memcpy(namebuf, hostp, len);
+ namebuf[len] = 0;
+ dsthost = namebuf;
+ }
}
else {
/* no destination name, use source host */
@@ -487,31 +505,86 @@ CURLcode Curl_altsvc_parse(struct Curl_easy *data,
}
if(*p == ':') {
/* a port number */
- char *end_ptr;
unsigned long port = strtoul(++p, &end_ptr, 10);
if(port > USHRT_MAX || end_ptr == p || *end_ptr != '\"') {
infof(data, "Unknown alt-svc port number, ignoring...\n");
- return CURLE_OK;
+ dstalpnid = ALPN_none;
}
p = end_ptr;
dstport = curlx_ultous(port);
}
if(*p++ != '\"')
- return CURLE_BAD_FUNCTION_ARGUMENT;
- as = altsvc_createid(srchost, dsthost,
- srcalpnid, dstalpnid,
- srcport, dstport);
- if(as) {
- /* The expires time also needs to take the Age: value (if any) into
- account. [See RFC 7838 section 3.1] */
- as->expires = maxage + time(NULL);
- as->persist = persist;
- Curl_llist_insert_next(&asi->list, asi->list.tail, as, &as->node);
- asi->num++; /* one more entry */
- infof(data, "Added alt-svc: %s:%d over %s\n", dsthost, dstport,
- Curl_alpnid2str(dstalpnid));
+ break;
+ /* Handle the optional 'ma' and 'persist' flags. Unknown flags
+ are skipped. */
+ for(;;) {
+ while(*p && ISBLANK(*p) && *p != ';' && *p != ',')
+ p++;
+ if(!*p || *p == ',')
+ break;
+ p++; /* pass the semicolon */
+ if(!*p)
+ break;
+ result = getalnum(&p, option, sizeof(option));
+ if(result) {
+ /* skip option if name is too long */
+ option[0] = '\0';
+ }
+ while(*p && ISBLANK(*p))
+ p++;
+ if(*p != '=')
+ return CURLE_OK;
+ p++;
+ while(*p && ISBLANK(*p))
+ p++;
+ if(!*p)
+ return CURLE_OK;
+ if(*p == '\"') {
+ /* quoted value */
+ p++;
+ quoted = TRUE;
+ }
+ value_ptr = p;
+ if(quoted) {
+ while(*p && *p != '\"')
+ p++;
+ if(!*p++)
+ return CURLE_OK;
+ }
+ else {
+ while(*p && !ISBLANK(*p) && *p!= ';' && *p != ',')
+ p++;
+ }
+ num = strtoul(value_ptr, &end_ptr, 10);
+ if((end_ptr != value_ptr) && (num < ULONG_MAX)) {
+ if(strcasecompare("ma", option))
+ maxage = num;
+ else if(strcasecompare("persist", option) && (num == 1))
+ persist = TRUE;
+ }
+ }
+ if(dstalpnid) {
+ as = altsvc_createid(srchost, dsthost,
+ srcalpnid, dstalpnid,
+ srcport, dstport);
+ if(as) {
+ /* The expires time also needs to take the Age: value (if any) into
+ account. [See RFC 7838 section 3.1] */
+ as->expires = maxage + time(NULL);
+ as->persist = persist;
+ Curl_llist_insert_next(&asi->list, asi->list.tail, as, &as->node);
+ asi->num++; /* one more entry */
+ infof(data, "Added alt-svc: %s:%d over %s\n", dsthost, dstport,
+ Curl_alpnid2str(dstalpnid));
+ }
+ }
+ else {
+ infof(data, "Unknown alt-svc protocol \"%s\", skipping...\n",
+ alpnbuf);
}
}
+ else
+ break;
/* after the double quote there can be a comma if there's another
string or a semicolon if no more */
if(*p == ',') {
@@ -519,11 +592,11 @@ CURLcode Curl_altsvc_parse(struct Curl_easy *data,
p++;
result = getalnum(&p, alpnbuf, sizeof(alpnbuf));
if(result)
- /* failed to parse, but since we already did at least one host we
- return OK */
- return CURLE_OK;
+ break;
}
}
+ else
+ break;
} while(*p && (*p != ';') && (*p != '\n') && (*p != '\r'));
return CURLE_OK;
@@ -535,31 +608,31 @@ CURLcode Curl_altsvc_parse(struct Curl_easy *data,
bool Curl_altsvc_lookup(struct altsvcinfo *asi,
enum alpnid srcalpnid, const char *srchost,
int srcport,
- enum alpnid *dstalpnid, const char **dsthost,
- int *dstport)
+ struct altsvc **dstentry,
+ const int versions) /* one or more bits */
{
struct curl_llist_element *e;
struct curl_llist_element *n;
time_t now = time(NULL);
DEBUGASSERT(asi);
DEBUGASSERT(srchost);
- DEBUGASSERT(dsthost);
+ DEBUGASSERT(dstentry);
for(e = asi->list.head; e; e = n) {
struct altsvc *as = e->ptr;
n = e->next;
if(as->expires < now) {
/* an expired entry, remove */
+ Curl_llist_remove(&asi->list, e, NULL);
altsvc_free(as);
continue;
}
- if((as->srcalpnid == srcalpnid) &&
- strcasecompare(as->srchost, srchost) &&
- as->srcport == srcport) {
+ if((as->src.alpnid == srcalpnid) &&
+ strcasecompare(as->src.host, srchost) &&
+ (as->src.port == srcport) &&
+ (versions & as->dst.alpnid)) {
/* match */
- *dstalpnid = as->dstalpnid;
- *dsthost = as->dsthost;
- *dstport = as->dstport;
+ *dstentry = as;
return TRUE;
}
}
diff --git a/Utilities/cmcurl/lib/altsvc.h b/Utilities/cmcurl/lib/altsvc.h
index eefb45b..248e71e 100644
--- a/Utilities/cmcurl/lib/altsvc.h
+++ b/Utilities/cmcurl/lib/altsvc.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2019 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -28,20 +28,21 @@
#include "llist.h"
enum alpnid {
- ALPN_none,
- ALPN_h1,
- ALPN_h2,
- ALPN_h2c,
- ALPN_h3
+ ALPN_none = 0,
+ ALPN_h1 = CURLALTSVC_H1,
+ ALPN_h2 = CURLALTSVC_H2,
+ ALPN_h3 = CURLALTSVC_H3
+};
+
+struct althost {
+ char *host;
+ unsigned short port;
+ enum alpnid alpnid;
};
struct altsvc {
- char *srchost;
- char *dsthost;
- unsigned short srcport;
- unsigned short dstport;
- enum alpnid srcalpnid;
- enum alpnid dstalpnid;
+ struct althost src;
+ struct althost dst;
time_t expires;
bool persist;
int prio;
@@ -58,7 +59,8 @@ struct altsvcinfo {
const char *Curl_alpnid2str(enum alpnid id);
struct altsvcinfo *Curl_altsvc_init(void);
CURLcode Curl_altsvc_load(struct altsvcinfo *asi, const char *file);
-CURLcode Curl_altsvc_save(struct altsvcinfo *asi, const char *file);
+CURLcode Curl_altsvc_save(struct Curl_easy *data,
+ struct altsvcinfo *asi, const char *file);
CURLcode Curl_altsvc_ctrl(struct altsvcinfo *asi, const long ctrl);
void Curl_altsvc_cleanup(struct altsvcinfo *altsvc);
CURLcode Curl_altsvc_parse(struct Curl_easy *data,
@@ -68,10 +70,10 @@ CURLcode Curl_altsvc_parse(struct Curl_easy *data,
bool Curl_altsvc_lookup(struct altsvcinfo *asi,
enum alpnid srcalpnid, const char *srchost,
int srcport,
- enum alpnid *dstalpnid, const char **dsthost,
- int *dstport);
+ struct altsvc **dstentry,
+ const int versions); /* CURLALTSVC_H* bits */
#else
/* disabled */
-#define Curl_altsvc_save(a,b)
+#define Curl_altsvc_save(a,b,c)
#endif /* CURL_DISABLE_HTTP || USE_ALTSVC */
#endif /* HEADER_CURL_ALTSVC_H */
diff --git a/Utilities/cmcurl/lib/asyn-ares.c b/Utilities/cmcurl/lib/asyn-ares.c
index 8561a47..b76e665 100644
--- a/Utilities/cmcurl/lib/asyn-ares.c
+++ b/Utilities/cmcurl/lib/asyn-ares.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -253,16 +253,14 @@ static void destroy_async_data(struct Curl_async *async)
*/
int Curl_resolver_getsock(struct connectdata *conn,
- curl_socket_t *socks,
- int numsocks)
-
+ curl_socket_t *socks)
{
struct timeval maxtime;
struct timeval timebuf;
struct timeval *timeout;
long milli;
int max = ares_getsock((ares_channel)conn->data->state.resolver,
- (ares_socket_t *)socks, numsocks);
+ (ares_socket_t *)socks, MAX_SOCKSPEREASYHANDLE);
maxtime.tv_sec = CURL_TIMEOUT_RESOLVE;
maxtime.tv_usec = 0;
@@ -628,26 +626,11 @@ Curl_addrinfo *Curl_resolver_getaddrinfo(struct connectdata *conn,
{
char *bufp;
struct Curl_easy *data = conn->data;
- struct in_addr in;
int family = PF_INET;
-#ifdef ENABLE_IPV6 /* CURLRES_IPV6 */
- struct in6_addr in6;
-#endif /* CURLRES_IPV6 */
*waitp = 0; /* default to synchronous response */
- /* First check if this is an IPv4 address string */
- if(Curl_inet_pton(AF_INET, hostname, &in) > 0) {
- /* This is a dotted IP address 123.123.123.123-style */
- return Curl_ip2addr(AF_INET, &in, hostname, port);
- }
-
#ifdef ENABLE_IPV6 /* CURLRES_IPV6 */
- /* Otherwise, check if this is an IPv6 address string */
- if(Curl_inet_pton (AF_INET6, hostname, &in6) > 0)
- /* This must be an IPv6 address literal. */
- return Curl_ip2addr(AF_INET6, &in6, hostname, port);
-
switch(conn->ip_version) {
default:
#if ARES_VERSION >= 0x010601
@@ -686,7 +669,7 @@ Curl_addrinfo *Curl_resolver_getaddrinfo(struct connectdata *conn,
res->last_status = ARES_ENOTFOUND;
#ifdef ENABLE_IPV6 /* CURLRES_IPV6 */
if(family == PF_UNSPEC) {
- if(Curl_ipv6works()) {
+ if(Curl_ipv6works(conn)) {
res->num_pending = 2;
/* areschannel is already setup in the Curl_open() function */
@@ -734,7 +717,11 @@ CURLcode Curl_set_dns_servers(struct Curl_easy *data,
return CURLE_OK;
#if (ARES_VERSION >= 0x010704)
+#if (ARES_VERSION >= 0x010b00)
+ ares_result = ares_set_servers_ports_csv(data->state.resolver, servers);
+#else
ares_result = ares_set_servers_csv(data->state.resolver, servers);
+#endif
switch(ares_result) {
case ARES_SUCCESS:
result = CURLE_OK;
diff --git a/Utilities/cmcurl/lib/asyn-thread.c b/Utilities/cmcurl/lib/asyn-thread.c
index 55e0811..68dcbb3 100644
--- a/Utilities/cmcurl/lib/asyn-thread.c
+++ b/Utilities/cmcurl/lib/asyn-thread.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -21,6 +21,7 @@
***************************************************************************/
#include "curl_setup.h"
+#include "socketpair.h"
/***********************************************************************
* Only for threaded name resolves builds
@@ -70,10 +71,10 @@
#include "strerror.h"
#include "url.h"
#include "multiif.h"
-#include "inet_pton.h"
#include "inet_ntop.h"
#include "curl_threads.h"
#include "connect.h"
+#include "socketpair.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
#include "curl_memory.h"
@@ -163,6 +164,10 @@ struct thread_sync_data {
char *hostname; /* hostname to resolve, Curl_async.hostname
duplicate */
int port;
+#ifdef USE_SOCKETPAIR
+ struct connectdata *conn;
+ curl_socket_t sock_pair[2]; /* socket pair */
+#endif
int sock_error;
Curl_addrinfo *res;
#ifdef HAVE_GETADDRINFO
@@ -197,6 +202,15 @@ void destroy_thread_sync_data(struct thread_sync_data * tsd)
if(tsd->res)
Curl_freeaddrinfo(tsd->res);
+#ifdef USE_SOCKETPAIR
+ /*
+ * close one end of the socket pair (may be done in resolver thread);
+ * the other end (for reading) is always closed in the parent thread.
+ */
+ if(tsd->sock_pair[1] != CURL_SOCKET_BAD) {
+ sclose(tsd->sock_pair[1]);
+ }
+#endif
memset(tsd, 0, sizeof(*tsd));
}
@@ -230,6 +244,14 @@ int init_thread_sync_data(struct thread_data * td,
Curl_mutex_init(tsd->mtx);
+#ifdef USE_SOCKETPAIR
+ /* create socket pair, avoid AF_LOCAL since it doesn't build on Solaris */
+ if(Curl_socketpair(AF_UNIX, SOCK_STREAM, 0, &tsd->sock_pair[0]) < 0) {
+ tsd->sock_pair[0] = CURL_SOCKET_BAD;
+ tsd->sock_pair[1] = CURL_SOCKET_BAD;
+ goto err_exit;
+ }
+#endif
tsd->sock_error = CURL_ASYNC_SUCCESS;
/* Copying hostname string because original can be destroyed by parent
@@ -276,6 +298,9 @@ static unsigned int CURL_STDCALL getaddrinfo_thread(void *arg)
struct thread_data *td = tsd->td;
char service[12];
int rc;
+#ifdef USE_SOCKETPAIR
+ char buf[1];
+#endif
msnprintf(service, sizeof(service), "%d", tsd->port);
@@ -298,6 +323,16 @@ static unsigned int CURL_STDCALL getaddrinfo_thread(void *arg)
free(td);
}
else {
+#ifdef USE_SOCKETPAIR
+ if(tsd->sock_pair[1] != CURL_SOCKET_BAD) {
+ /* DNS has been resolved, signal client task */
+ buf[0] = 1;
+ if(swrite(tsd->sock_pair[1], buf, sizeof(buf)) < 0) {
+ /* update sock_erro to errno */
+ tsd->sock_error = SOCKERRNO;
+ }
+ }
+#endif
tsd->done = 1;
Curl_mutex_release(tsd->mtx);
}
@@ -348,6 +383,10 @@ static void destroy_async_data(struct Curl_async *async)
if(async->os_specific) {
struct thread_data *td = (struct thread_data*) async->os_specific;
int done;
+#ifdef USE_SOCKETPAIR
+ curl_socket_t sock_rd = td->tsd.sock_pair[0];
+ struct connectdata *conn = td->tsd.conn;
+#endif
/*
* if the thread is still blocking in the resolve syscall, detach it and
@@ -369,6 +408,15 @@ static void destroy_async_data(struct Curl_async *async)
free(async->os_specific);
}
+#ifdef USE_SOCKETPAIR
+ /*
+ * ensure CURLMOPT_SOCKETFUNCTION fires CURL_POLL_REMOVE
+ * before the FD is invalidated to avoid EBADF on EPOLL_CTL_DEL
+ */
+ if(conn)
+ Curl_multi_closed(conn->data, sock_rd);
+ sclose(sock_rd);
+#endif
}
async->os_specific = NULL;
@@ -569,8 +617,9 @@ CURLcode Curl_resolver_is_resolved(struct connectdata *conn,
}
else {
/* poll for name lookup done with exponential backoff up to 250ms */
- timediff_t elapsed = Curl_timediff(Curl_now(),
- data->progress.t_startsingle);
+ /* should be fine even if this converts to 32 bit */
+ time_t elapsed = (time_t)Curl_timediff(Curl_now(),
+ data->progress.t_startsingle);
if(elapsed < 0)
elapsed = 0;
@@ -592,26 +641,45 @@ CURLcode Curl_resolver_is_resolved(struct connectdata *conn,
}
int Curl_resolver_getsock(struct connectdata *conn,
- curl_socket_t *socks,
- int numsocks)
+ curl_socket_t *socks)
{
+ int ret_val = 0;
time_t milli;
timediff_t ms;
struct Curl_easy *data = conn->data;
struct resdata *reslv = (struct resdata *)data->state.resolver;
+#ifdef USE_SOCKETPAIR
+ struct thread_data *td = (struct thread_data*)conn->async.os_specific;
+#else
(void)socks;
- (void)numsocks;
- ms = Curl_timediff(Curl_now(), reslv->start);
- if(ms < 3)
- milli = 0;
- else if(ms <= 50)
- milli = ms/3;
- else if(ms <= 250)
- milli = 50;
- else
- milli = 200;
- Curl_expire(data, milli, EXPIRE_ASYNC_NAME);
- return 0;
+#endif
+
+#ifdef USE_SOCKETPAIR
+ if(td) {
+ /* return read fd to client for polling the DNS resolution status */
+ socks[0] = td->tsd.sock_pair[0];
+ DEBUGASSERT(td->tsd.conn == conn || !td->tsd.conn);
+ td->tsd.conn = conn;
+ ret_val = GETSOCK_READSOCK(0);
+ }
+ else {
+#endif
+ ms = Curl_timediff(Curl_now(), reslv->start);
+ if(ms < 3)
+ milli = 0;
+ else if(ms <= 50)
+ milli = (time_t)ms/3;
+ else if(ms <= 250)
+ milli = 50;
+ else
+ milli = 200;
+ Curl_expire(data, milli, EXPIRE_ASYNC_NAME);
+#ifdef USE_SOCKETPAIR
+ }
+#endif
+
+
+ return ret_val;
}
#ifndef HAVE_GETADDRINFO
@@ -623,16 +691,11 @@ Curl_addrinfo *Curl_resolver_getaddrinfo(struct connectdata *conn,
int port,
int *waitp)
{
- struct in_addr in;
struct Curl_easy *data = conn->data;
struct resdata *reslv = (struct resdata *)data->state.resolver;
*waitp = 0; /* default to synchronous response */
- if(Curl_inet_pton(AF_INET, hostname, &in) > 0)
- /* This is a dotted IP address 123.123.123.123-style */
- return Curl_ip2addr(AF_INET, &in, hostname, port);
-
reslv->start = Curl_now();
/* fire up a new resolver thread! */
@@ -657,32 +720,12 @@ Curl_addrinfo *Curl_resolver_getaddrinfo(struct connectdata *conn,
int *waitp)
{
struct addrinfo hints;
- char sbuf[12];
int pf = PF_INET;
struct Curl_easy *data = conn->data;
struct resdata *reslv = (struct resdata *)data->state.resolver;
*waitp = 0; /* default to synchronous response */
-#ifndef USE_RESOLVE_ON_IPS
- {
- struct in_addr in;
- /* First check if this is an IPv4 address string */
- if(Curl_inet_pton(AF_INET, hostname, &in) > 0)
- /* This is a dotted IP address 123.123.123.123-style */
- return Curl_ip2addr(AF_INET, &in, hostname, port);
- }
-#ifdef CURLRES_IPV6
- {
- struct in6_addr in6;
- /* check if this is an IPv6 address string */
- if(Curl_inet_pton(AF_INET6, hostname, &in6) > 0)
- /* This is an IPv6 address literal */
- return Curl_ip2addr(AF_INET6, &in6, hostname, port);
- }
-#endif /* CURLRES_IPV6 */
-#endif /* !USE_RESOLVE_ON_IPS */
-
#ifdef CURLRES_IPV6
/*
* Check if a limited name resolve has been requested.
@@ -699,16 +742,15 @@ Curl_addrinfo *Curl_resolver_getaddrinfo(struct connectdata *conn,
break;
}
- if((pf != PF_INET) && !Curl_ipv6works())
+ if((pf != PF_INET) && !Curl_ipv6works(conn))
/* The stack seems to be a non-IPv6 one */
pf = PF_INET;
#endif /* CURLRES_IPV6 */
memset(&hints, 0, sizeof(hints));
hints.ai_family = pf;
- hints.ai_socktype = conn->socktype;
-
- msnprintf(sbuf, sizeof(sbuf), "%d", port);
+ hints.ai_socktype = (conn->transport == TRNSPRT_TCP)?
+ SOCK_STREAM : SOCK_DGRAM;
reslv->start = Curl_now();
/* fire up a new resolver thread! */
diff --git a/Utilities/cmcurl/lib/asyn.h b/Utilities/cmcurl/lib/asyn.h
index ccd4b1f..081c3fe 100644
--- a/Utilities/cmcurl/lib/asyn.h
+++ b/Utilities/cmcurl/lib/asyn.h
@@ -114,8 +114,7 @@ void Curl_resolver_kill(struct connectdata *conn);
* return bitmask indicating what file descriptors (referring to array indexes
* in the 'sock' array) to wait for, read/write.
*/
-int Curl_resolver_getsock(struct connectdata *conn, curl_socket_t *sock,
- int numsocks);
+int Curl_resolver_getsock(struct connectdata *conn, curl_socket_t *sock);
/*
* Curl_resolver_is_resolved()
diff --git a/Utilities/cmcurl/lib/base64.c b/Utilities/cmcurl/lib/base64.c
index fb081a6..643cef6 100644
--- a/Utilities/cmcurl/lib/base64.c
+++ b/Utilities/cmcurl/lib/base64.c
@@ -24,8 +24,8 @@
#include "curl_setup.h"
-#if !defined(CURL_DISABLE_HTTP_AUTH) || defined(USE_LIBSSH2) || \
- defined(USE_LIBSSH) || !defined(CURL_DISABLE_LDAP) || \
+#if !defined(CURL_DISABLE_HTTP_AUTH) || defined(USE_SSH) || \
+ !defined(CURL_DISABLE_LDAP) || \
!defined(CURL_DISABLE_DOH) || defined(USE_SSL)
#include "urldata.h" /* for the Curl_easy definition */
diff --git a/Utilities/cmcurl/lib/conncache.c b/Utilities/cmcurl/lib/conncache.c
index 5350919..cbd3bb1 100644
--- a/Utilities/cmcurl/lib/conncache.c
+++ b/Utilities/cmcurl/lib/conncache.c
@@ -6,7 +6,7 @@
* \___|\___/|_| \_\_____|
*
* Copyright (C) 2012 - 2016, Linus Nielsen Feltzing, <linus@haxx.se>
- * Copyright (C) 2012 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -40,26 +40,7 @@
#include "curl_memory.h"
#include "memdebug.h"
-#ifdef CURLDEBUG
-/* the debug versions of these macros make extra certain that the lock is
- never doubly locked or unlocked */
-#define CONN_LOCK(x) if((x)->share) { \
- Curl_share_lock((x), CURL_LOCK_DATA_CONNECT, CURL_LOCK_ACCESS_SINGLE); \
- DEBUGASSERT(!(x)->state.conncache_lock); \
- (x)->state.conncache_lock = TRUE; \
- }
-
-#define CONN_UNLOCK(x) if((x)->share) { \
- DEBUGASSERT((x)->state.conncache_lock); \
- (x)->state.conncache_lock = FALSE; \
- Curl_share_unlock((x), CURL_LOCK_DATA_CONNECT); \
- }
-#else
-#define CONN_LOCK(x) if((x)->share) \
- Curl_share_lock((x), CURL_LOCK_DATA_CONNECT, CURL_LOCK_ACCESS_SINGLE)
-#define CONN_UNLOCK(x) if((x)->share) \
- Curl_share_unlock((x), CURL_LOCK_DATA_CONNECT)
-#endif
+#define HASHKEY_SIZE 128
static void conn_llist_dtor(void *user, void *element)
{
@@ -120,6 +101,7 @@ static int bundle_remove_conn(struct connectbundle *cb_ptr,
}
curr = curr->next;
}
+ DEBUGASSERT(0);
return 0;
}
@@ -141,10 +123,8 @@ int Curl_conncache_init(struct conncache *connc, int size)
rc = Curl_hash_init(&connc->hash, size, Curl_hash_str,
Curl_str_key_compare, free_bundle_hash_entry);
- if(rc) {
- Curl_close(connc->closure_handle);
- connc->closure_handle = NULL;
- }
+ if(rc)
+ Curl_close(&connc->closure_handle);
else
connc->closure_handle->state.conn_cache = connc;
@@ -159,23 +139,27 @@ void Curl_conncache_destroy(struct conncache *connc)
/* creates a key to find a bundle for this connection */
static void hashkey(struct connectdata *conn, char *buf,
- size_t len) /* something like 128 is fine */
+ size_t len, /* something like 128 is fine */
+ const char **hostp)
{
const char *hostname;
+ long port = conn->remote_port;
- if(conn->bits.socksproxy)
- hostname = conn->socks_proxy.host.name;
- else if(conn->bits.httpproxy)
+ if(conn->bits.httpproxy && !conn->bits.tunnel_proxy) {
hostname = conn->http_proxy.host.name;
+ port = conn->port;
+ }
else if(conn->bits.conn_to_host)
hostname = conn->conn_to_host.name;
else
hostname = conn->host.name;
- DEBUGASSERT(len > 32);
+ if(hostp)
+ /* report back which name we used */
+ *hostp = hostname;
/* put the number first so that the hostname gets cut off if too long */
- msnprintf(buf, len, "%ld%s", conn->port, hostname);
+ msnprintf(buf, len, "%ld%s", port, hostname);
}
void Curl_conncache_unlock(struct Curl_easy *data)
@@ -195,30 +179,19 @@ size_t Curl_conncache_size(struct Curl_easy *data)
return num;
}
-/* Returns number of connections currently held in the connections's bundle
- Locks/unlocks the cache itself!
-*/
-size_t Curl_conncache_bundle_size(struct connectdata *conn)
-{
- size_t num;
- CONN_LOCK(conn->data);
- num = conn->bundle->num_connections;
- CONN_UNLOCK(conn->data);
- return num;
-}
-
/* Look up the bundle with all the connections to the same host this
connectdata struct is setup to use.
**NOTE**: When it returns, it holds the connection cache lock! */
struct connectbundle *Curl_conncache_find_bundle(struct connectdata *conn,
- struct conncache *connc)
+ struct conncache *connc,
+ const char **hostp)
{
struct connectbundle *bundle = NULL;
CONN_LOCK(conn->data);
if(connc) {
- char key[128];
- hashkey(conn, key, sizeof(key));
+ char key[HASHKEY_SIZE];
+ hashkey(conn, key, sizeof(key), hostp);
bundle = Curl_hash_pick(&connc->hash, key, strlen(key));
}
@@ -267,17 +240,17 @@ CURLcode Curl_conncache_add_conn(struct conncache *connc,
struct Curl_easy *data = conn->data;
/* *find_bundle() locks the connection cache */
- bundle = Curl_conncache_find_bundle(conn, data->state.conn_cache);
+ bundle = Curl_conncache_find_bundle(conn, data->state.conn_cache, NULL);
if(!bundle) {
int rc;
- char key[128];
+ char key[HASHKEY_SIZE];
result = bundle_create(data, &new_bundle);
if(result) {
goto unlock;
}
- hashkey(conn, key, sizeof(key));
+ hashkey(conn, key, sizeof(key), NULL);
rc = conncache_add_bundle(data->state.conn_cache, key, new_bundle);
if(!rc) {
@@ -423,17 +396,15 @@ conncache_find_first_connection(struct conncache *connc)
*
* Return TRUE if stored, FALSE if closed.
*/
-bool Curl_conncache_return_conn(struct connectdata *conn)
+bool Curl_conncache_return_conn(struct Curl_easy *data,
+ struct connectdata *conn)
{
- struct Curl_easy *data = conn->data;
-
/* data->multi->maxconnects can be negative, deal with it. */
size_t maxconnects =
(data->multi->maxconnects < 0) ? data->multi->num_easy * 4:
data->multi->maxconnects;
struct connectdata *conn_candidate = NULL;
- conn->data = NULL; /* no owner anymore */
conn->lastused = Curl_now(); /* it was used up until now */
if(maxconnects > 0 &&
Curl_conncache_size(data) > maxconnects) {
@@ -536,7 +507,8 @@ Curl_conncache_extract_oldest(struct Curl_easy *data)
while(curr) {
conn = curr->ptr;
- if(!CONN_INUSE(conn) && !conn->data) {
+ if(!CONN_INUSE(conn) && !conn->data && !conn->bits.close &&
+ !conn->bits.connect_only) {
/* Set higher score for the age passed since the connection was used */
score = Curl_timediff(now, conn->lastused);
@@ -588,7 +560,7 @@ void Curl_conncache_close_all_connections(struct conncache *connc)
Curl_hostcache_clean(connc->closure_handle,
connc->closure_handle->dns.hostcache);
- Curl_close(connc->closure_handle);
+ Curl_close(&connc->closure_handle);
sigpipe_restore(&pipe_st);
}
}
diff --git a/Utilities/cmcurl/lib/conncache.h b/Utilities/cmcurl/lib/conncache.h
index 35be9e0..e3e4c9c 100644
--- a/Utilities/cmcurl/lib/conncache.h
+++ b/Utilities/cmcurl/lib/conncache.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2015 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2015 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
* Copyright (C) 2012 - 2014, Linus Nielsen Feltzing, <linus@haxx.se>
*
* This software is licensed as described in the file COPYING, which
@@ -42,6 +42,27 @@ struct conncache {
#define BUNDLE_UNKNOWN 0 /* initial value */
#define BUNDLE_MULTIPLEX 2
+#ifdef CURLDEBUG
+/* the debug versions of these macros make extra certain that the lock is
+ never doubly locked or unlocked */
+#define CONN_LOCK(x) if((x)->share) { \
+ Curl_share_lock((x), CURL_LOCK_DATA_CONNECT, CURL_LOCK_ACCESS_SINGLE); \
+ DEBUGASSERT(!(x)->state.conncache_lock); \
+ (x)->state.conncache_lock = TRUE; \
+ }
+
+#define CONN_UNLOCK(x) if((x)->share) { \
+ DEBUGASSERT((x)->state.conncache_lock); \
+ (x)->state.conncache_lock = FALSE; \
+ Curl_share_unlock((x), CURL_LOCK_DATA_CONNECT); \
+ }
+#else
+#define CONN_LOCK(x) if((x)->share) \
+ Curl_share_lock((x), CURL_LOCK_DATA_CONNECT, CURL_LOCK_ACCESS_SINGLE)
+#define CONN_UNLOCK(x) if((x)->share) \
+ Curl_share_unlock((x), CURL_LOCK_DATA_CONNECT)
+#endif
+
struct connectbundle {
int multiuse; /* supports multi-use */
size_t num_connections; /* Number of connections in the bundle */
@@ -54,13 +75,14 @@ void Curl_conncache_destroy(struct conncache *connc);
/* return the correct bundle, to a host or a proxy */
struct connectbundle *Curl_conncache_find_bundle(struct connectdata *conn,
- struct conncache *connc);
+ struct conncache *connc,
+ const char **hostp);
void Curl_conncache_unlock(struct Curl_easy *data);
/* returns number of connections currently held in the connection cache */
size_t Curl_conncache_size(struct Curl_easy *data);
-size_t Curl_conncache_bundle_size(struct connectdata *conn);
-bool Curl_conncache_return_conn(struct connectdata *conn);
+bool Curl_conncache_return_conn(struct Curl_easy *data,
+ struct connectdata *conn);
CURLcode Curl_conncache_add_conn(struct conncache *connc,
struct connectdata *conn) WARN_UNUSED_RESULT;
void Curl_conncache_remove_conn(struct Curl_easy *data,
diff --git a/Utilities/cmcurl/lib/connect.c b/Utilities/cmcurl/lib/connect.c
index 002535b..0a7475c 100644
--- a/Utilities/cmcurl/lib/connect.c
+++ b/Utilities/cmcurl/lib/connect.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -75,6 +75,8 @@
#include "conncache.h"
#include "multihandle.h"
#include "system_win32.h"
+#include "quic.h"
+#include "socks.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
@@ -165,7 +167,7 @@ tcpkeepalive(struct Curl_easy *data,
static CURLcode
singleipconnect(struct connectdata *conn,
const Curl_addrinfo *ai, /* start connecting to this */
- curl_socket_t *sock);
+ int sockindex); /* 0 or 1 among the temp ones */
/*
* Curl_timeleft() returns the amount of milliseconds left allowed for the
@@ -368,6 +370,11 @@ static CURLcode bindlocal(struct connectdata *conn,
infof(data, "Name '%s' family %i resolved to '%s' family %i\n",
dev, af, myhost, h->addr->ai_family);
Curl_resolv_unlock(data, h);
+ if(af != h->addr->ai_family) {
+ /* bad IP version combo, signal the caller to try another address
+ family if available */
+ return CURLE_UNSUPPORTED_PROTOCOL;
+ }
done = 1;
}
else {
@@ -590,7 +597,7 @@ static CURLcode trynextip(struct connectdata *conn,
}
if(ai) {
- result = singleipconnect(conn, ai, &conn->tempsock[tempindex]);
+ result = singleipconnect(conn, ai, tempindex);
if(result == CURLE_COULDNT_CONNECT) {
ai = ai->ai_next;
continue;
@@ -620,13 +627,10 @@ void Curl_persistconninfo(struct connectdata *conn)
conn->data->info.conn_local_port = conn->local_port;
}
-UNITTEST bool getaddressinfo(struct sockaddr *sa, char *addr,
- long *port);
-
/* retrieves ip address and port from a sockaddr structure.
note it calls Curl_inet_ntop which sets errno on fail, not SOCKERRNO. */
-UNITTEST bool getaddressinfo(struct sockaddr *sa, char *addr,
- long *port)
+bool Curl_addr2string(struct sockaddr *sa, curl_socklen_t salen,
+ char *addr, long *port)
{
struct sockaddr_in *si = NULL;
#ifdef ENABLE_IPV6
@@ -634,6 +638,8 @@ UNITTEST bool getaddressinfo(struct sockaddr *sa, char *addr,
#endif
#if defined(HAVE_SYS_UN_H) && defined(AF_UNIX)
struct sockaddr_un *su = NULL;
+#else
+ (void)salen;
#endif
switch(sa->sa_family) {
@@ -659,8 +665,12 @@ UNITTEST bool getaddressinfo(struct sockaddr *sa, char *addr,
#endif
#if defined(HAVE_SYS_UN_H) && defined(AF_UNIX)
case AF_UNIX:
- su = (struct sockaddr_un*)sa;
- msnprintf(addr, MAX_IPADR_LEN, "%s", su->sun_path);
+ if(salen > (curl_socklen_t)sizeof(sa_family_t)) {
+ su = (struct sockaddr_un*)sa;
+ msnprintf(addr, MAX_IPADR_LEN, "%s", su->sun_path);
+ }
+ else
+ addr[0] = 0; /* socket with no name */
*port = 0;
return TRUE;
#endif
@@ -678,8 +688,8 @@ UNITTEST bool getaddressinfo(struct sockaddr *sa, char *addr,
connection */
void Curl_updateconninfo(struct connectdata *conn, curl_socket_t sockfd)
{
- if(conn->socktype == SOCK_DGRAM)
- /* there's no connection! */
+ if(conn->transport != TRNSPRT_TCP)
+ /* there's no TCP connection! */
return;
#if defined(HAVE_GETPEERNAME) || defined(HAVE_GETSOCKNAME)
@@ -688,10 +698,11 @@ void Curl_updateconninfo(struct connectdata *conn, curl_socket_t sockfd)
char buffer[STRERROR_LEN];
struct Curl_sockaddr_storage ssrem;
struct Curl_sockaddr_storage ssloc;
- curl_socklen_t len;
+ curl_socklen_t plen;
+ curl_socklen_t slen;
#ifdef HAVE_GETPEERNAME
- len = sizeof(struct Curl_sockaddr_storage);
- if(getpeername(sockfd, (struct sockaddr*) &ssrem, &len)) {
+ plen = sizeof(struct Curl_sockaddr_storage);
+ if(getpeername(sockfd, (struct sockaddr*) &ssrem, &plen)) {
int error = SOCKERRNO;
failf(data, "getpeername() failed with errno %d: %s",
error, Curl_strerror(error, buffer, sizeof(buffer)));
@@ -699,9 +710,9 @@ void Curl_updateconninfo(struct connectdata *conn, curl_socket_t sockfd)
}
#endif
#ifdef HAVE_GETSOCKNAME
- len = sizeof(struct Curl_sockaddr_storage);
+ slen = sizeof(struct Curl_sockaddr_storage);
memset(&ssloc, 0, sizeof(ssloc));
- if(getsockname(sockfd, (struct sockaddr*) &ssloc, &len)) {
+ if(getsockname(sockfd, (struct sockaddr*) &ssloc, &slen)) {
int error = SOCKERRNO;
failf(data, "getsockname() failed with errno %d: %s",
error, Curl_strerror(error, buffer, sizeof(buffer)));
@@ -709,8 +720,8 @@ void Curl_updateconninfo(struct connectdata *conn, curl_socket_t sockfd)
}
#endif
#ifdef HAVE_GETPEERNAME
- if(!getaddressinfo((struct sockaddr*)&ssrem,
- conn->primary_ip, &conn->primary_port)) {
+ if(!Curl_addr2string((struct sockaddr*)&ssrem, plen,
+ conn->primary_ip, &conn->primary_port)) {
failf(data, "ssrem inet_ntop() failed with errno %d: %s",
errno, Curl_strerror(errno, buffer, sizeof(buffer)));
return;
@@ -718,8 +729,8 @@ void Curl_updateconninfo(struct connectdata *conn, curl_socket_t sockfd)
memcpy(conn->ip_addr_str, conn->primary_ip, MAX_IPADR_LEN);
#endif
#ifdef HAVE_GETSOCKNAME
- if(!getaddressinfo((struct sockaddr*)&ssloc,
- conn->local_ip, &conn->local_port)) {
+ if(!Curl_addr2string((struct sockaddr*)&ssloc, slen,
+ conn->local_ip, &conn->local_port)) {
failf(data, "ssloc inet_ntop() failed with errno %d: %s",
errno, Curl_strerror(errno, buffer, sizeof(buffer)));
return;
@@ -734,6 +745,79 @@ void Curl_updateconninfo(struct connectdata *conn, curl_socket_t sockfd)
Curl_persistconninfo(conn);
}
+/* After a TCP connection to the proxy has been verified, this function does
+ the next magic steps. If 'done' isn't set TRUE, it is not done yet and
+ must be called again.
+
+ Note: this function's sub-functions call failf()
+
+*/
+static CURLcode connect_SOCKS(struct connectdata *conn, int sockindex,
+ bool *done)
+{
+ CURLcode result = CURLE_OK;
+
+ if(conn->bits.socksproxy) {
+#ifndef CURL_DISABLE_PROXY
+ /* for the secondary socket (FTP), use the "connect to host"
+ * but ignore the "connect to port" (use the secondary port)
+ */
+ const char * const host =
+ conn->bits.httpproxy ?
+ conn->http_proxy.host.name :
+ conn->bits.conn_to_host ?
+ conn->conn_to_host.name :
+ sockindex == SECONDARYSOCKET ?
+ conn->secondaryhostname : conn->host.name;
+ const int port =
+ conn->bits.httpproxy ? (int)conn->http_proxy.port :
+ sockindex == SECONDARYSOCKET ? conn->secondary_port :
+ conn->bits.conn_to_port ? conn->conn_to_port :
+ conn->remote_port;
+ switch(conn->socks_proxy.proxytype) {
+ case CURLPROXY_SOCKS5:
+ case CURLPROXY_SOCKS5_HOSTNAME:
+ result = Curl_SOCKS5(conn->socks_proxy.user, conn->socks_proxy.passwd,
+ host, port, sockindex, conn, done);
+ break;
+
+ case CURLPROXY_SOCKS4:
+ case CURLPROXY_SOCKS4A:
+ result = Curl_SOCKS4(conn->socks_proxy.user, host, port, sockindex,
+ conn, done);
+ break;
+
+ default:
+ failf(conn->data, "unknown proxytype option given");
+ result = CURLE_COULDNT_CONNECT;
+ } /* switch proxytype */
+#else
+ (void)sockindex;
+#endif /* CURL_DISABLE_PROXY */
+ }
+ else
+ *done = TRUE; /* no SOCKS proxy, so consider us connected */
+
+ return result;
+}
+
+/*
+ * post_SOCKS() is called after a successful connect to the peer, which
+ * *could* be a SOCKS proxy
+ */
+static void post_SOCKS(struct connectdata *conn,
+ int sockindex,
+ bool *connected)
+{
+ conn->bits.tcpconnect[sockindex] = TRUE;
+
+ *connected = TRUE;
+ if(sockindex == FIRSTSOCKET)
+ Curl_pgrsTime(conn->data, TIMER_CONNECT); /* connect done */
+ Curl_updateconninfo(conn, conn->sock[sockindex]);
+ Curl_verboseconnect(conn);
+}
+
/*
* Curl_is_connected() checks if the socket has connected.
*/
@@ -771,11 +855,37 @@ CURLcode Curl_is_connected(struct connectdata *conn,
return CURLE_OPERATION_TIMEDOUT;
}
+ if(SOCKS_STATE(conn->cnnct.state)) {
+ /* still doing SOCKS */
+ result = connect_SOCKS(conn, sockindex, connected);
+ if(!result && *connected)
+ post_SOCKS(conn, sockindex, connected);
+ return result;
+ }
+
for(i = 0; i<2; i++) {
const int other = i ^ 1;
if(conn->tempsock[i] == CURL_SOCKET_BAD)
continue;
+#ifdef ENABLE_QUIC
+ if(conn->transport == TRNSPRT_QUIC) {
+ result = Curl_quic_is_connected(conn, i, connected);
+ if(result) {
+ error = SOCKERRNO;
+ goto error;
+ }
+ if(*connected) {
+ /* use this socket from now on */
+ conn->sock[sockindex] = conn->tempsock[i];
+ conn->ip_addr = conn->tempaddr[i];
+ conn->tempsock[i] = CURL_SOCKET_BAD;
+ connkeep(conn, "HTTP/3 default");
+ }
+ return result;
+ }
+#endif
+
#ifdef mpeix
/* Call this function once now, and ignore the results. We do this to
"clear" the error state on the socket so that we can later read it
@@ -789,8 +899,8 @@ CURLcode Curl_is_connected(struct connectdata *conn,
if(rc == 0) { /* no connection yet */
error = 0;
if(Curl_timediff(now, conn->connecttime) >= conn->timeoutms_per_addr) {
- infof(data, "After %ldms connect time, move on!\n",
- conn->timeoutms_per_addr);
+ infof(data, "After %" CURL_FORMAT_TIMEDIFF_T
+ "ms connect time, move on!\n", conn->timeoutms_per_addr);
error = ETIMEDOUT;
}
@@ -819,18 +929,13 @@ CURLcode Curl_is_connected(struct connectdata *conn,
conn->tempsock[other] = CURL_SOCKET_BAD;
}
- /* see if we need to do any proxy magic first once we connected */
- result = Curl_connected_proxy(conn, sockindex);
- if(result)
+ /* see if we need to kick off any SOCKS proxy magic once we
+ connected */
+ result = connect_SOCKS(conn, sockindex, connected);
+ if(result || !*connected)
return result;
- conn->bits.tcpconnect[sockindex] = TRUE;
-
- *connected = TRUE;
- if(sockindex == FIRSTSOCKET)
- Curl_pgrsTime(data, TIMER_CONNECT); /* connect done */
- Curl_updateconninfo(conn, conn->sock[sockindex]);
- Curl_verboseconnect(conn);
+ post_SOCKS(conn, sockindex, connected);
return CURLE_OK;
}
@@ -839,6 +944,9 @@ CURLcode Curl_is_connected(struct connectdata *conn,
else if(rc & CURL_CSELECT_ERR)
(void)verifyconnect(conn->tempsock[i], &error);
+#ifdef ENABLE_QUIC
+ error:
+#endif
/*
* The connection failed here, we should attempt to connect to the "next
* address" for the given host. But first remember the latest error.
@@ -848,19 +956,21 @@ CURLcode Curl_is_connected(struct connectdata *conn,
SET_SOCKERRNO(error);
if(conn->tempaddr[i]) {
CURLcode status;
+#ifndef CURL_DISABLE_VERBOSE_STRINGS
char ipaddress[MAX_IPADR_LEN];
char buffer[STRERROR_LEN];
Curl_printable_address(conn->tempaddr[i], ipaddress, MAX_IPADR_LEN);
+#endif
infof(data, "connect to %s port %ld failed: %s\n",
ipaddress, conn->port,
Curl_strerror(error, buffer, sizeof(buffer)));
conn->timeoutms_per_addr = conn->tempaddr[i]->ai_next == NULL ?
- allow : allow / 2;
+ allow : allow / 2;
status = trynextip(conn, sockindex, i);
- if(status != CURLE_COULDNT_CONNECT
- || conn->tempsock[other] == CURL_SOCKET_BAD)
+ if((status != CURLE_COULDNT_CONNECT) ||
+ conn->tempsock[other] == CURL_SOCKET_BAD)
/* the last attempt failed and no other sockets remain open */
result = status;
}
@@ -892,6 +1002,14 @@ CURLcode Curl_is_connected(struct connectdata *conn,
failf(data, "Failed to connect to %s port %ld: %s",
hostname, conn->port,
Curl_strerror(error, buffer, sizeof(buffer)));
+
+#ifdef WSAETIMEDOUT
+ if(WSAETIMEDOUT == data->state.os_errno)
+ result = CURLE_OPERATION_TIMEDOUT;
+#elif defined(ETIMEDOUT)
+ if(ETIMEDOUT == data->state.os_errno)
+ result = CURLE_OPERATION_TIMEDOUT;
+#endif
}
return result;
@@ -900,14 +1018,12 @@ CURLcode Curl_is_connected(struct connectdata *conn,
static void tcpnodelay(struct connectdata *conn, curl_socket_t sockfd)
{
#if defined(TCP_NODELAY)
-#if !defined(CURL_DISABLE_VERBOSE_STRINGS)
- struct Curl_easy *data = conn->data;
-#endif
curl_socklen_t onoff = (curl_socklen_t) 1;
int level = IPPROTO_TCP;
+#if !defined(CURL_DISABLE_VERBOSE_STRINGS)
+ struct Curl_easy *data = conn->data;
char buffer[STRERROR_LEN];
-
-#if defined(CURL_DISABLE_VERBOSE_STRINGS)
+#else
(void) conn;
#endif
@@ -915,8 +1031,6 @@ static void tcpnodelay(struct connectdata *conn, curl_socket_t sockfd)
sizeof(onoff)) < 0)
infof(data, "Could not set TCP_NODELAY: %s\n",
Curl_strerror(SOCKERRNO, buffer, sizeof(buffer)));
- else
- infof(data, "TCP_NODELAY set\n");
#else
(void)conn;
(void)sockfd;
@@ -999,7 +1113,7 @@ void Curl_sndbufset(curl_socket_t sockfd)
*/
static CURLcode singleipconnect(struct connectdata *conn,
const Curl_addrinfo *ai,
- curl_socket_t *sockp)
+ int sockindex)
{
struct Curl_sockaddr_ex addr;
int rc = -1;
@@ -1015,7 +1129,7 @@ static CURLcode singleipconnect(struct connectdata *conn,
int optval = 1;
#endif
char buffer[STRERROR_LEN];
-
+ curl_socket_t *sockp = &conn->tempsock[sockindex];
*sockp = CURL_SOCKET_BAD;
result = Curl_socket(conn, ai, &addr, &sockfd);
@@ -1026,8 +1140,8 @@ static CURLcode singleipconnect(struct connectdata *conn,
return CURLE_OK;
/* store remote address and port used in this connection attempt */
- if(!getaddressinfo((struct sockaddr*)&addr.sa_addr,
- ipaddress, &port)) {
+ if(!Curl_addr2string((struct sockaddr*)&addr.sa_addr, addr.addrlen,
+ ipaddress, &port)) {
/* malformed address or bug in inet_ntop, try next address */
failf(data, "sa_addr inet_ntop() failed with errno %d: %s",
errno, Curl_strerror(errno, buffer, sizeof(buffer)));
@@ -1094,8 +1208,8 @@ static CURLcode singleipconnect(struct connectdata *conn,
if(conn->num_addr > 1)
Curl_expire(data, conn->timeoutms_per_addr, EXPIRE_DNS_PER_NAME);
- /* Connect TCP sockets, bind UDP */
- if(!isconnected && (conn->socktype == SOCK_STREAM)) {
+ /* Connect TCP and QUIC sockets */
+ if(!isconnected && (conn->transport != TRNSPRT_UDP)) {
if(conn->bits.tcp_fastopen) {
#if defined(CONNECT_DATA_IDEMPOTENT) /* Darwin */
# if defined(HAVE_BUILTIN_AVAILABLE)
@@ -1124,8 +1238,6 @@ static CURLcode singleipconnect(struct connectdata *conn,
if(setsockopt(sockfd, IPPROTO_TCP, TCP_FASTOPEN_CONNECT,
(void *)&optval, sizeof(optval)) < 0)
infof(data, "Failed to enable TCP Fast Open on fd %d\n", sockfd);
- else
- infof(data, "TCP_FASTOPEN_CONNECT set\n");
rc = connect(sockfd, &addr.sa_addr, addr.addrlen);
#elif defined(MSG_FASTOPEN) /* old Linux */
@@ -1141,6 +1253,16 @@ static CURLcode singleipconnect(struct connectdata *conn,
if(-1 == rc)
error = SOCKERRNO;
+#ifdef ENABLE_QUIC
+ else if(conn->transport == TRNSPRT_QUIC) {
+ /* pass in 'sockfd' separately since it hasn't been put into the
+ tempsock array at this point */
+ result = Curl_quic_connect(conn, sockfd, sockindex,
+ &addr.sa_addr, addr.addrlen);
+ if(result)
+ error = SOCKERRNO;
+ }
+#endif
}
else {
*sockp = sockfd;
@@ -1214,7 +1336,7 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
/* start connecting to first IP */
while(conn->tempaddr[0]) {
- result = singleipconnect(conn, conn->tempaddr[0], &(conn->tempsock[0]));
+ result = singleipconnect(conn, conn->tempaddr[0], 0);
if(!result)
break;
conn->tempaddr[0] = conn->tempaddr[0]->ai_next;
@@ -1326,12 +1448,11 @@ int Curl_closesocket(struct connectdata *conn,
curl_socket_t sock)
{
if(conn && conn->fclosesocket) {
- if((sock == conn->sock[SECONDARYSOCKET]) &&
- conn->sock_accepted[SECONDARYSOCKET])
+ if((sock == conn->sock[SECONDARYSOCKET]) && conn->sock_accepted)
/* if this socket matches the second socket, and that was created with
accept, then we MUST NOT call the callback but clear the accepted
status */
- conn->sock_accepted[SECONDARYSOCKET] = FALSE;
+ conn->sock_accepted = FALSE;
else {
int rc;
Curl_multi_closed(conn->data, sock);
@@ -1381,8 +1502,9 @@ CURLcode Curl_socket(struct connectdata *conn,
*/
addr->family = ai->ai_family;
- addr->socktype = conn->socktype;
- addr->protocol = conn->socktype == SOCK_DGRAM?IPPROTO_UDP:ai->ai_protocol;
+ addr->socktype = (conn->transport == TRNSPRT_TCP) ? SOCK_STREAM : SOCK_DGRAM;
+ addr->protocol = conn->transport != TRNSPRT_TCP ? IPPROTO_UDP :
+ ai->ai_protocol;
addr->addrlen = ai->ai_addrlen;
if(addr->addrlen > sizeof(struct Curl_sockaddr_storage))
@@ -1413,6 +1535,11 @@ CURLcode Curl_socket(struct connectdata *conn,
/* no socket, no connection */
return CURLE_COULDNT_CONNECT;
+ if(conn->transport == TRNSPRT_QUIC) {
+ /* QUIC sockets need to be nonblocking */
+ (void)curlx_nonblock(*sockfd, TRUE);
+ }
+
#if defined(ENABLE_IPV6) && defined(HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID)
if(conn->scope_id && (addr->family == AF_INET6)) {
struct sockaddr_in6 * const sa6 = (void *)&addr->sa_addr;
diff --git a/Utilities/cmcurl/lib/connect.h b/Utilities/cmcurl/lib/connect.h
index 6a5c755..b23085a 100644
--- a/Utilities/cmcurl/lib/connect.h
+++ b/Utilities/cmcurl/lib/connect.h
@@ -51,6 +51,9 @@ timediff_t Curl_timeleft(struct Curl_easy *data,
curl_socket_t Curl_getconnectinfo(struct Curl_easy *data,
struct connectdata **connp);
+bool Curl_addr2string(struct sockaddr *sa, curl_socklen_t salen,
+ char *addr, long *port);
+
/*
* Check if a connection seems to be alive.
*/
diff --git a/Utilities/cmcurl/lib/cookie.c b/Utilities/cmcurl/lib/cookie.c
index 9a9e14d..69bc042 100644
--- a/Utilities/cmcurl/lib/cookie.c
+++ b/Utilities/cmcurl/lib/cookie.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -96,6 +96,9 @@ Example set of cookies:
#include "curl_get_line.h"
#include "curl_memrchr.h"
#include "inet_pton.h"
+#include "parsedate.h"
+#include "rand.h"
+#include "rename.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
@@ -536,9 +539,9 @@ Curl_cookie_add(struct Curl_easy *data,
* only test for names where that can possibly be true.
*/
if(nlen > 3 && name[0] == '_' && name[1] == '_') {
- if(strncasecompare("__Secure-", name, 9))
+ if(!strncmp("__Secure-", name, 9))
co->prefix |= COOKIE_PREFIX__SECURE;
- else if(strncasecompare("__Host-", name, 7))
+ else if(!strncmp("__Host-", name, 7))
co->prefix |= COOKIE_PREFIX__HOST;
}
@@ -715,7 +718,7 @@ Curl_cookie_add(struct Curl_easy *data,
else if(co->expirestr) {
/* Note that if the date couldn't get parsed for whatever reason,
the cookie will be treated as a session cookie */
- co->expires = curl_getdate(co->expirestr, NULL);
+ co->expires = Curl_getdate_capped(co->expirestr);
/* Session cookies have expires set to 0 so if we get that back
from the date parser let's add a second to make it a
@@ -819,22 +822,14 @@ Curl_cookie_add(struct Curl_easy *data,
badcookie = TRUE;
break;
case 1:
- /* This field got its explanation on the 23rd of May 2001 by
- Andrés García:
-
- flag: A TRUE/FALSE value indicating if all machines within a given
- domain can access the variable. This value is set automatically by
- the browser, depending on the value you set for the domain.
-
- As far as I can see, it is set to true when the cookie says
+ /* flag: A TRUE/FALSE value indicating if all machines within a given
+ domain can access the variable. Set TRUE when the cookie says
.domain.com and to false when the domain is complete www.domain.com
*/
co->tailmatch = strcasecompare(ptr, "TRUE")?TRUE:FALSE;
break;
case 2:
- /* It turns out, that sometimes the file format allows the path
- field to remain not filled in, we try to detect this and work
- around it! Andrés García made us aware of this... */
+ /* The file format allows the path field to remain not filled in */
if(strcmp("TRUE", ptr) && strcmp("FALSE", ptr)) {
/* only if the path doesn't look like a boolean option! */
co->path = strdup(ptr);
@@ -1053,7 +1048,7 @@ Curl_cookie_add(struct Curl_easy *data,
*clist = *co; /* then store all the new data */
- free(co); /* free the newly alloced memory */
+ free(co); /* free the newly allocated memory */
co = clist; /* point to the previous struct instead */
/* We have replaced a cookie, now skip the rest of the list but
@@ -1098,6 +1093,8 @@ Curl_cookie_add(struct Curl_easy *data,
*
* If 'newsession' is TRUE, discard all "session cookies" on read from file.
*
+ * Note that 'data' might be called as NULL pointer.
+ *
* Returns NULL on out of memory. Invalid cookies are ignored.
****************************************************************************/
struct CookieInfo *Curl_cookie_init(struct Curl_easy *data,
@@ -1168,6 +1165,8 @@ struct CookieInfo *Curl_cookie_init(struct Curl_easy *data,
}
c->running = TRUE; /* now, we're running */
+ if(data)
+ data->state.cookie_engine = TRUE;
return c;
@@ -1504,11 +1503,14 @@ static char *get_netscape_format(const struct Cookie *co)
*
* The function returns non-zero on write failure.
*/
-static int cookie_output(struct CookieInfo *c, const char *dumphere)
+static int cookie_output(struct Curl_easy *data,
+ struct CookieInfo *c, const char *filename)
{
struct Cookie *co;
- FILE *out;
+ FILE *out = NULL;
bool use_stdout = FALSE;
+ char *tempstore = NULL;
+ bool error = false;
if(!c)
/* no cookie engine alive */
@@ -1517,16 +1519,24 @@ static int cookie_output(struct CookieInfo *c, const char *dumphere)
/* at first, remove expired cookies */
remove_expired(c);
- if(!strcmp("-", dumphere)) {
+ if(!strcmp("-", filename)) {
/* use stdout */
out = stdout;
use_stdout = TRUE;
}
else {
- out = fopen(dumphere, FOPEN_WRITETEXT);
- if(!out) {
- return 1; /* failure */
- }
+ unsigned char randsuffix[9];
+
+ if(Curl_rand_hex(data, randsuffix, sizeof(randsuffix)))
+ return 2;
+
+ tempstore = aprintf("%s.%s.tmp", filename, randsuffix);
+ if(!tempstore)
+ return 1;
+
+ out = fopen(tempstore, FOPEN_WRITETEXT);
+ if(!out)
+ goto error;
}
fputs("# Netscape HTTP Cookie File\n"
@@ -1536,35 +1546,31 @@ static int cookie_output(struct CookieInfo *c, const char *dumphere)
if(c->numcookies) {
unsigned int i;
- unsigned int j;
+ size_t nvalid = 0;
struct Cookie **array;
- array = malloc(sizeof(struct Cookie *) * c->numcookies);
+ array = calloc(1, sizeof(struct Cookie *) * c->numcookies);
if(!array) {
- if(!use_stdout)
- fclose(out);
- return 1;
+ goto error;
}
- j = 0;
+ /* only sort the cookies with a domain property */
for(i = 0; i < COOKIE_HASH_SIZE; i++) {
for(co = c->cookies[i]; co; co = co->next) {
if(!co->domain)
continue;
- array[j++] = co;
+ array[nvalid++] = co;
}
}
- qsort(array, c->numcookies, sizeof(struct Cookie *), cookie_sort_ct);
+ qsort(array, nvalid, sizeof(struct Cookie *), cookie_sort_ct);
- for(i = 0; i < j; i++) {
+ for(i = 0; i < nvalid; i++) {
char *format_ptr = get_netscape_format(array[i]);
if(format_ptr == NULL) {
fprintf(out, "#\n# Fatal libcurl error\n");
free(array);
- if(!use_stdout)
- fclose(out);
- return 1;
+ goto error;
}
fprintf(out, "%s\n", format_ptr);
free(format_ptr);
@@ -1572,10 +1578,24 @@ static int cookie_output(struct CookieInfo *c, const char *dumphere)
free(array);
}
- if(!use_stdout)
+
+ if(!use_stdout) {
fclose(out);
+ out = NULL;
+ if(Curl_rename(tempstore, filename)) {
+ unlink(tempstore);
+ goto error;
+ }
+ }
- return 0;
+ goto cleanup;
+error:
+ error = true;
+cleanup:
+ if(out && !use_stdout)
+ fclose(out);
+ free(tempstore);
+ return error ? 1 : 0;
}
static struct curl_slist *cookie_list(struct Curl_easy *data)
@@ -1621,7 +1641,7 @@ struct curl_slist *Curl_cookie_list(struct Curl_easy *data)
return list;
}
-void Curl_flush_cookies(struct Curl_easy *data, int cleanup)
+void Curl_flush_cookies(struct Curl_easy *data, bool cleanup)
{
if(data->set.str[STRING_COOKIEJAR]) {
if(data->change.cookielist) {
@@ -1634,7 +1654,7 @@ void Curl_flush_cookies(struct Curl_easy *data, int cleanup)
Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE);
/* if we have a destination file for all the cookies to get dumped to */
- if(cookie_output(data->cookies, data->set.str[STRING_COOKIEJAR]))
+ if(cookie_output(data, data->cookies, data->set.str[STRING_COOKIEJAR]))
infof(data, "WARNING: failed to save cookies in %s\n",
data->set.str[STRING_COOKIEJAR]);
}
@@ -1650,6 +1670,7 @@ void Curl_flush_cookies(struct Curl_easy *data, int cleanup)
if(cleanup && (!data->share || (data->cookies != data->share->cookies))) {
Curl_cookie_cleanup(data->cookies);
+ data->cookies = NULL;
}
Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE);
}
diff --git a/Utilities/cmcurl/lib/cookie.h b/Utilities/cmcurl/lib/cookie.h
index b2730cf..b3865e6 100644
--- a/Utilities/cmcurl/lib/cookie.h
+++ b/Utilities/cmcurl/lib/cookie.h
@@ -109,7 +109,7 @@ void Curl_cookie_clearsess(struct CookieInfo *cookies);
#define Curl_cookie_cleanup(x) Curl_nop_stmt
#define Curl_flush_cookies(x,y) Curl_nop_stmt
#else
-void Curl_flush_cookies(struct Curl_easy *data, int cleanup);
+void Curl_flush_cookies(struct Curl_easy *data, bool cleanup);
void Curl_cookie_cleanup(struct CookieInfo *);
struct CookieInfo *Curl_cookie_init(struct Curl_easy *data,
const char *, struct CookieInfo *, bool);
diff --git a/Utilities/cmcurl/lib/curl_base64.h b/Utilities/cmcurl/lib/curl_base64.h
index 7e9fc26..cfb6ee7 100644
--- a/Utilities/cmcurl/lib/curl_base64.h
+++ b/Utilities/cmcurl/lib/curl_base64.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/curl_config.h.cmake b/Utilities/cmcurl/lib/curl_config.h.cmake
index b285c3f..ab8f225 100644
--- a/Utilities/cmcurl/lib/curl_config.h.cmake
+++ b/Utilities/cmcurl/lib/curl_config.h.cmake
@@ -64,6 +64,9 @@
#define CURL_EXTERN_SYMBOL
#endif
+/* Allow SMB to work on Windows */
+#cmakedefine USE_WIN32_CRYPTO
+
/* Use Windows LDAP implementation */
#cmakedefine USE_WIN32_LDAP 1
@@ -139,9 +142,6 @@
/* Define to 1 if you have the <dlfcn.h> header file. */
#cmakedefine HAVE_DLFCN_H 1
-/* Define to 1 if you have the `ENGINE_load_builtin_engines' function. */
-#cmakedefine HAVE_ENGINE_LOAD_BUILTIN_ENGINES 1
-
/* Define to 1 if you have the <errno.h> header file. */
#cmakedefine HAVE_ERRNO_H 1
@@ -232,6 +232,9 @@
/* Define to 1 if you have the `getsockname' function. */
#cmakedefine HAVE_GETSOCKNAME 1
+/* Define to 1 if you have the `if_nametoindex' function. */
+#cmakedefine HAVE_IF_NAMETOINDEX 1
+
/* Define to 1 if you have the `getpwuid' function. */
#cmakedefine HAVE_GETPWUID 1
@@ -395,9 +398,6 @@
/* Define to 1 if you have the <libssh2.h> header file. */
#cmakedefine HAVE_LIBSSH2_H 1
-/* Define to 1 if you have the `ssl' library (-lssl). */
-#cmakedefine HAVE_LIBSSL 1
-
/* if zlib is available */
#cmakedefine HAVE_LIBZ 1
@@ -446,9 +446,6 @@
/* Define to 1 if you have the <openssl/crypto.h> header file. */
#cmakedefine HAVE_OPENSSL_CRYPTO_H 1
-/* Define to 1 if you have the <openssl/engine.h> header file. */
-#cmakedefine HAVE_OPENSSL_ENGINE_H 1
-
/* Define to 1 if you have the <openssl/err.h> header file. */
#cmakedefine HAVE_OPENSSL_ERR_H 1
@@ -575,9 +572,6 @@
/* Define to 1 if you have the `socket' function. */
#cmakedefine HAVE_SOCKET 1
-/* Define to 1 if you have the `SSL_get_shutdown' function. */
-#cmakedefine HAVE_SSL_GET_SHUTDOWN 1
-
/* Define to 1 if you have the <ssl.h> header file. */
#cmakedefine HAVE_SSL_H 1
@@ -879,35 +873,44 @@
/* Define to the function return type for send. */
#cmakedefine SEND_TYPE_RETV ${SEND_TYPE_RETV}
+/*
+ Note: SIZEOF_* variables are fetched with CMake through check_type_size().
+ As per CMake documentation on CheckTypeSize, C preprocessor code is
+ generated by CMake into SIZEOF_*_CODE. This is what we use in the
+ following statements.
+
+ Reference: https://cmake.org/cmake/help/latest/module/CheckTypeSize.html
+*/
+
/* The size of `int', as computed by sizeof. */
-@SIZEOF_INT_CODE@
+${SIZEOF_INT_CODE}
/* The size of `short', as computed by sizeof. */
-@SIZEOF_SHORT_CODE@
+${SIZEOF_SHORT_CODE}
/* The size of `long', as computed by sizeof. */
-@SIZEOF_LONG_CODE@
+${SIZEOF_LONG_CODE}
/* The size of `long long', as computed by sizeof. */
-@SIZEOF_LONG_LONG_CODE@
+${SIZEOF_LONG_LONG_CODE}
/* The size of `__int64', as computed by sizeof. */
-@SIZEOF___INT64_CODE@
+${SIZEOF___INT64_CODE}
/* The size of `off_t', as computed by sizeof. */
-@SIZEOF_OFF_T_CODE@
+${SIZEOF_OFF_T_CODE}
/* The size of `curl_off_t', as computed by sizeof. */
-@SIZEOF_CURL_OFF_T_CODE@
+${SIZEOF_CURL_OFF_T_CODE}
/* The size of `size_t', as computed by sizeof. */
-@SIZEOF_SIZE_T_CODE@
+${SIZEOF_SIZE_T_CODE}
/* The size of `ssize_t', as computed by sizeof. */
-@SIZEOF_SSIZE_T_CODE@
+${SIZEOF_SSIZE_T_CODE}
/* The size of `time_t', as computed by sizeof. */
-@SIZEOF_TIME_T_CODE@
+${SIZEOF_TIME_T_CODE}
/* Define to 1 if you have the ANSI C header files. */
#cmakedefine STDC_HEADERS 1
@@ -933,15 +936,15 @@
/* if GnuTLS is enabled */
#cmakedefine USE_GNUTLS 1
-/* if PolarSSL is enabled */
-#cmakedefine USE_POLARSSL 1
-
/* if Secure Transport is enabled */
#cmakedefine USE_SECTRANSP 1
/* if mbedTLS is enabled */
#cmakedefine USE_MBEDTLS 1
+/* if BearSSL is enabled */
+#cmakedefine USE_BEARSSL 1
+
/* if libSSH2 is in use */
#cmakedefine USE_LIBSSH2 1
@@ -951,6 +954,9 @@
/* if NSS is enabled */
#cmakedefine USE_NSS 1
+/* if you have the PK11_CreateManagedGenericObject function */
+#cmakedefine HAVE_PK11_CREATEMANAGEDGENERICOBJECT 1
+
/* if you want to use OpenLDAP code instead of legacy ldap implementation */
#cmakedefine USE_OPENLDAP 1
diff --git a/Utilities/cmcurl/lib/curl_des.c b/Utilities/cmcurl/lib/curl_des.c
index b123a00..39c0f35 100644
--- a/Utilities/cmcurl/lib/curl_des.c
+++ b/Utilities/cmcurl/lib/curl_des.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2015, Steve Holme, <steve_holme@hotmail.com>.
+ * Copyright (C) 2015 - 2019, Steve Holme, <steve_holme@hotmail.com>.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/curl_des.h b/Utilities/cmcurl/lib/curl_des.h
index 129060f..a42eeb5 100644
--- a/Utilities/cmcurl/lib/curl_des.h
+++ b/Utilities/cmcurl/lib/curl_des.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2015, Steve Holme, <steve_holme@hotmail.com>.
+ * Copyright (C) 2015 - 2019, Steve Holme, <steve_holme@hotmail.com>.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/curl_endian.c b/Utilities/cmcurl/lib/curl_endian.c
index b7563b3..a774d13 100644
--- a/Utilities/cmcurl/lib/curl_endian.c
+++ b/Utilities/cmcurl/lib/curl_endian.c
@@ -81,6 +81,7 @@ unsigned short Curl_read16_be(const unsigned char *buf)
((unsigned short)buf[1]));
}
+#if (CURL_SIZEOF_CURL_OFF_T > 4)
/*
* write32_le()
*
@@ -100,7 +101,6 @@ static void write32_le(const int value, unsigned char *buffer)
buffer[3] = (char)((value & 0xFF000000) >> 24);
}
-#if (CURL_SIZEOF_CURL_OFF_T > 4)
/*
* Curl_write64_le()
*
diff --git a/Utilities/cmcurl/lib/curl_endian.h b/Utilities/cmcurl/lib/curl_endian.h
index 4f345a6..9830e58 100644
--- a/Utilities/cmcurl/lib/curl_endian.h
+++ b/Utilities/cmcurl/lib/curl_endian.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -31,9 +31,6 @@ unsigned int Curl_read32_le(const unsigned char *buf);
/* Converts a 16-bit integer from big endian */
unsigned short Curl_read16_be(const unsigned char *buf);
-/* Converts a 32-bit integer to little endian */
-void Curl_write32_le(const int value, unsigned char *buffer);
-
#if (CURL_SIZEOF_CURL_OFF_T > 4)
/* Converts a 64-bit integer to little endian */
#if defined(HAVE_LONGLONG)
diff --git a/Utilities/cmcurl/lib/curl_fnmatch.h b/Utilities/cmcurl/lib/curl_fnmatch.h
index 69ffe39..34fccae 100644
--- a/Utilities/cmcurl/lib/curl_fnmatch.h
+++ b/Utilities/cmcurl/lib/curl_fnmatch.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/curl_gethostname.h b/Utilities/cmcurl/lib/curl_gethostname.h
index 07517c5..8ae15e6 100644
--- a/Utilities/cmcurl/lib/curl_gethostname.h
+++ b/Utilities/cmcurl/lib/curl_gethostname.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/curl_hmac.h b/Utilities/cmcurl/lib/curl_hmac.h
index 756dc9e..3ff799b 100644
--- a/Utilities/cmcurl/lib/curl_hmac.h
+++ b/Utilities/cmcurl/lib/curl_hmac.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -24,6 +24,8 @@
#ifndef CURL_DISABLE_CRYPTO_AUTH
+#define HMAC_MD5_LENGTH 16
+
typedef void (* HMAC_hinit_func)(void *context);
typedef void (* HMAC_hupdate_func)(void *context,
const unsigned char *data,
@@ -62,6 +64,11 @@ int Curl_HMAC_update(HMAC_context *context,
unsigned int len);
int Curl_HMAC_final(HMAC_context *context, unsigned char *result);
+CURLcode Curl_hmacit(const HMAC_params *hashparams,
+ const unsigned char *key, const size_t keylen,
+ const unsigned char *data, const size_t datalen,
+ unsigned char *output);
+
#endif
#endif /* HEADER_CURL_HMAC_H */
diff --git a/Utilities/cmcurl/lib/curl_ldap.h b/Utilities/cmcurl/lib/curl_ldap.h
index 94c0029..912e131 100644
--- a/Utilities/cmcurl/lib/curl_ldap.h
+++ b/Utilities/cmcurl/lib/curl_ldap.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/curl_md4.h b/Utilities/cmcurl/lib/curl_md4.h
index 392203f..c7bb209 100644
--- a/Utilities/cmcurl/lib/curl_md4.h
+++ b/Utilities/cmcurl/lib/curl_md4.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -24,14 +24,13 @@
#include "curl_setup.h"
-#if defined(USE_NSS) || defined(USE_OS400CRYPTO) || \
- (defined(USE_OPENSSL) && defined(OPENSSL_NO_MD4)) || \
- (defined(USE_MBEDTLS) && !defined(MBEDTLS_MD4_C))
+#if !defined(CURL_DISABLE_CRYPTO_AUTH)
-void Curl_md4it(unsigned char *output, const unsigned char *input, size_t len);
+#define MD4_DIGEST_LENGTH 16
-#endif /* defined(USE_NSS) || defined(USE_OS400CRYPTO) ||
- (defined(USE_OPENSSL) && defined(OPENSSL_NO_MD4)) ||
- (defined(USE_MBEDTLS) && !defined(MBEDTLS_MD4_C)) */
+void Curl_md4it(unsigned char *output, const unsigned char *input,
+ const size_t len);
+
+#endif /* !defined(CURL_DISABLE_CRYPTO_AUTH) */
#endif /* HEADER_CURL_MD4_H */
diff --git a/Utilities/cmcurl/lib/curl_md5.h b/Utilities/cmcurl/lib/curl_md5.h
index aaf25f6..dd46441 100644
--- a/Utilities/cmcurl/lib/curl_md5.h
+++ b/Utilities/cmcurl/lib/curl_md5.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -49,8 +49,8 @@ typedef struct {
extern const MD5_params Curl_DIGEST_MD5[1];
extern const HMAC_params Curl_HMAC_MD5[1];
-void Curl_md5it(unsigned char *output,
- const unsigned char *input);
+void Curl_md5it(unsigned char *output, const unsigned char *input,
+ const size_t len);
MD5_context * Curl_MD5_init(const MD5_params *md5params);
CURLcode Curl_MD5_update(MD5_context *context,
diff --git a/Utilities/cmcurl/lib/curl_memrchr.h b/Utilities/cmcurl/lib/curl_memrchr.h
index 747509c..90a8a07 100644
--- a/Utilities/cmcurl/lib/curl_memrchr.h
+++ b/Utilities/cmcurl/lib/curl_memrchr.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/curl_multibyte.c b/Utilities/cmcurl/lib/curl_multibyte.c
index e48334f..e384344 100644
--- a/Utilities/cmcurl/lib/curl_multibyte.c
+++ b/Utilities/cmcurl/lib/curl_multibyte.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/curl_multibyte.h b/Utilities/cmcurl/lib/curl_multibyte.h
index 615f5c0..3becf41 100644
--- a/Utilities/cmcurl/lib/curl_multibyte.h
+++ b/Utilities/cmcurl/lib/curl_multibyte.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -61,8 +61,13 @@ char *Curl_convert_wchar_to_UTF8(const wchar_t *str_w);
#define Curl_convert_UTF8_to_tchar(ptr) Curl_convert_UTF8_to_wchar((ptr))
#define Curl_convert_tchar_to_UTF8(ptr) Curl_convert_wchar_to_UTF8((ptr))
-#define Curl_unicodefree(ptr) \
- do {if((ptr)) {free((ptr)); (ptr) = NULL;}} WHILE_FALSE
+#define Curl_unicodefree(ptr) \
+ do { \
+ if(ptr) { \
+ free(ptr); \
+ (ptr) = NULL; \
+ } \
+ } while(0)
typedef union {
unsigned short *tchar_ptr;
@@ -76,7 +81,7 @@ typedef union {
#define Curl_convert_UTF8_to_tchar(ptr) (ptr)
#define Curl_convert_tchar_to_UTF8(ptr) (ptr)
#define Curl_unicodefree(ptr) \
- do {(ptr) = NULL;} WHILE_FALSE
+ do {(ptr) = NULL;} while(0)
typedef union {
char *tchar_ptr;
diff --git a/Utilities/cmcurl/lib/curl_ntlm_core.c b/Utilities/cmcurl/lib/curl_ntlm_core.c
index b6df38f..f9b823b 100644
--- a/Utilities/cmcurl/lib/curl_ntlm_core.c
+++ b/Utilities/cmcurl/lib/curl_ntlm_core.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -55,11 +55,6 @@
#ifdef USE_OPENSSL
# include <openssl/des.h>
-# ifndef OPENSSL_NO_MD4
-# include <openssl/md4.h>
-# else
-# include "curl_md4.h"
-# endif
# include <openssl/md5.h>
# include <openssl/ssl.h>
# include <openssl/rand.h>
@@ -79,29 +74,23 @@
#elif defined(USE_GNUTLS_NETTLE)
# include <nettle/des.h>
-# include <nettle/md4.h>
#elif defined(USE_GNUTLS)
# include <gcrypt.h>
# define MD5_DIGEST_LENGTH 16
-# define MD4_DIGEST_LENGTH 16
#elif defined(USE_NSS)
# include <nss.h>
# include <pk11pub.h>
# include <hasht.h>
-# include "curl_md4.h"
# define MD5_DIGEST_LENGTH MD5_LENGTH
#elif defined(USE_MBEDTLS)
# include <mbedtls/des.h>
-# include <mbedtls/md4.h>
-# if !defined(MBEDTLS_MD4_C)
-# include "curl_md4.h"
-# endif
+# include "curl_md4.h"
#elif defined(USE_SECTRANSP)
@@ -110,7 +99,6 @@
#elif defined(USE_OS400CRYPTO)
# include "cipher.mih" /* mih/cipher */
-# include "curl_md4.h"
#elif defined(USE_WIN32_CRYPTO)
# include <wincrypt.h>
#else
@@ -126,12 +114,12 @@
#include "warnless.h"
#include "curl_endian.h"
#include "curl_des.h"
+#include "curl_md4.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
#include "curl_memory.h"
#include "memdebug.h"
-#define NTLM_HMAC_MD5_LEN (16)
#define NTLMv2_BLOB_SIGNATURE "\x01\x01\x00\x00"
#define NTLMv2_BLOB_LEN (44 -16 + ntlm->target_info_len + 4)
@@ -218,7 +206,6 @@ static bool encrypt_des(const unsigned char *in, unsigned char *out,
const unsigned char *key_56)
{
const CK_MECHANISM_TYPE mech = CKM_DES_ECB; /* DES cipher in ECB mode */
- PK11SlotInfo *slot = NULL;
char key[8]; /* expanded 64 bit key */
SECItem key_item;
PK11SymKey *symkey = NULL;
@@ -228,7 +215,7 @@ static bool encrypt_des(const unsigned char *in, unsigned char *out,
bool rv = FALSE;
/* use internal slot for DES encryption (requires NSS to be initialized) */
- slot = PK11_GetInternalKeySlot();
+ PK11SlotInfo *slot = PK11_GetInternalKeySlot();
if(!slot)
return FALSE;
@@ -553,7 +540,7 @@ CURLcode Curl_ntlm_core_mk_nt_hash(struct Curl_easy *data,
CURLcode result;
if(len > SIZE_T_MAX/2) /* avoid integer overflow */
return CURLE_OUT_OF_MEMORY;
- pw = len ? malloc(len * 2) : strdup("");
+ pw = len ? malloc(len * 2) : (unsigned char *)strdup("");
if(!pw)
return CURLE_OUT_OF_MEMORY;
@@ -567,57 +554,10 @@ CURLcode Curl_ntlm_core_mk_nt_hash(struct Curl_easy *data,
if(result)
return result;
- {
- /* Create NT hashed password. */
-#ifdef USE_OPENSSL
-#if !defined(OPENSSL_NO_MD4)
- MD4_CTX MD4pw;
- MD4_Init(&MD4pw);
- MD4_Update(&MD4pw, pw, 2 * len);
- MD4_Final(ntbuffer, &MD4pw);
-#else
- Curl_md4it(ntbuffer, pw, 2 * len);
-#endif
-#elif defined(USE_GNUTLS_NETTLE)
- struct md4_ctx MD4pw;
- md4_init(&MD4pw);
- md4_update(&MD4pw, (unsigned int)(2 * len), pw);
- md4_digest(&MD4pw, MD4_DIGEST_SIZE, ntbuffer);
-#elif defined(USE_GNUTLS)
- gcry_md_hd_t MD4pw;
- gcry_md_open(&MD4pw, GCRY_MD_MD4, 0);
- gcry_md_write(MD4pw, pw, 2 * len);
- memcpy(ntbuffer, gcry_md_read(MD4pw, 0), MD4_DIGEST_LENGTH);
- gcry_md_close(MD4pw);
-#elif defined(USE_NSS)
- Curl_md4it(ntbuffer, pw, 2 * len);
-#elif defined(USE_MBEDTLS)
-#if defined(MBEDTLS_MD4_C)
- mbedtls_md4(pw, 2 * len, ntbuffer);
-#else
- Curl_md4it(ntbuffer, pw, 2 * len);
-#endif
-#elif defined(USE_SECTRANSP)
- (void)CC_MD4(pw, (CC_LONG)(2 * len), ntbuffer);
-#elif defined(USE_OS400CRYPTO)
- Curl_md4it(ntbuffer, pw, 2 * len);
-#elif defined(USE_WIN32_CRYPTO)
- HCRYPTPROV hprov;
- if(CryptAcquireContext(&hprov, NULL, NULL, PROV_RSA_FULL,
- CRYPT_VERIFYCONTEXT)) {
- HCRYPTHASH hhash;
- if(CryptCreateHash(hprov, CALG_MD4, 0, 0, &hhash)) {
- DWORD length = 16;
- CryptHashData(hhash, pw, (unsigned int)len * 2, 0);
- CryptGetHashParam(hhash, HP_HASHVAL, ntbuffer, &length, 0);
- CryptDestroyHash(hhash);
- }
- CryptReleaseContext(hprov, 0);
- }
-#endif
+ /* Create NT hashed password. */
+ Curl_md4it(ntbuffer, pw, 2 * len);
- memset(ntbuffer + 16, 0, 21 - 16);
- }
+ memset(ntbuffer + 16, 0, 21 - 16);
free(pw);
@@ -626,25 +566,6 @@ CURLcode Curl_ntlm_core_mk_nt_hash(struct Curl_easy *data,
#if defined(USE_NTLM_V2) && !defined(USE_WINDOWS_SSPI)
-/* This returns the HMAC MD5 digest */
-static CURLcode hmac_md5(const unsigned char *key, unsigned int keylen,
- const unsigned char *data, unsigned int datalen,
- unsigned char *output)
-{
- HMAC_context *ctxt = Curl_HMAC_init(Curl_HMAC_MD5, key, keylen);
-
- if(!ctxt)
- return CURLE_OUT_OF_MEMORY;
-
- /* Update the digest with the given challenge */
- Curl_HMAC_update(ctxt, data, datalen);
-
- /* Finalise the digest */
- Curl_HMAC_final(ctxt, output);
-
- return CURLE_OK;
-}
-
/* This creates the NTLMv2 hash by using NTLM hash as the key and Unicode
* (uppercase UserName + Domain) as the data
*/
@@ -674,8 +595,8 @@ CURLcode Curl_ntlm_core_mk_ntlmv2_hash(const char *user, size_t userlen,
ascii_uppercase_to_unicode_le(identity, user, userlen);
ascii_to_unicode_le(identity + (userlen << 1), domain, domlen);
- result = hmac_md5(ntlmhash, 16, identity, curlx_uztoui(identity_len),
- ntlmv2hash);
+ result = Curl_hmacit(Curl_HMAC_MD5, ntlmhash, 16, identity, identity_len,
+ ntlmv2hash);
free(identity);
return result;
@@ -721,7 +642,7 @@ CURLcode Curl_ntlm_core_mk_ntlmv2_resp(unsigned char *ntlmv2hash,
unsigned int len = 0;
unsigned char *ptr = NULL;
- unsigned char hmac_output[NTLM_HMAC_MD5_LEN];
+ unsigned char hmac_output[HMAC_MD5_LENGTH];
curl_off_t tw;
CURLcode result = CURLE_OK;
@@ -740,7 +661,7 @@ CURLcode Curl_ntlm_core_mk_ntlmv2_resp(unsigned char *ntlmv2hash,
tw = ((curl_off_t)time(NULL) + CURL_OFF_T_C(11644473600)) * 10000000;
/* Calculate the response len */
- len = NTLM_HMAC_MD5_LEN + NTLMv2_BLOB_LEN;
+ len = HMAC_MD5_LENGTH + NTLMv2_BLOB_LEN;
/* Allocate the response */
ptr = calloc(1, len);
@@ -748,7 +669,7 @@ CURLcode Curl_ntlm_core_mk_ntlmv2_resp(unsigned char *ntlmv2hash,
return CURLE_OUT_OF_MEMORY;
/* Create the BLOB structure */
- msnprintf((char *)ptr + NTLM_HMAC_MD5_LEN, NTLMv2_BLOB_LEN,
+ msnprintf((char *)ptr + HMAC_MD5_LENGTH, NTLMv2_BLOB_LEN,
"%c%c%c%c" /* NTLMv2_BLOB_SIGNATURE */
"%c%c%c%c", /* Reserved = 0 */
NTLMv2_BLOB_SIGNATURE[0], NTLMv2_BLOB_SIGNATURE[1],
@@ -761,7 +682,7 @@ CURLcode Curl_ntlm_core_mk_ntlmv2_resp(unsigned char *ntlmv2hash,
/* Concatenate the Type 2 challenge with the BLOB and do HMAC MD5 */
memcpy(ptr + 8, &ntlm->nonce[0], 8);
- result = hmac_md5(ntlmv2hash, NTLM_HMAC_MD5_LEN, ptr + 8,
+ result = Curl_hmacit(Curl_HMAC_MD5, ntlmv2hash, HMAC_MD5_LENGTH, ptr + 8,
NTLMv2_BLOB_LEN + 8, hmac_output);
if(result) {
free(ptr);
@@ -769,7 +690,7 @@ CURLcode Curl_ntlm_core_mk_ntlmv2_resp(unsigned char *ntlmv2hash,
}
/* Concatenate the HMAC MD5 output with the BLOB */
- memcpy(ptr, hmac_output, NTLM_HMAC_MD5_LEN);
+ memcpy(ptr, hmac_output, HMAC_MD5_LENGTH);
/* Return the response */
*ntresp = ptr;
@@ -804,7 +725,8 @@ CURLcode Curl_ntlm_core_mk_lmv2_resp(unsigned char *ntlmv2hash,
memcpy(&data[0], challenge_server, 8);
memcpy(&data[8], challenge_client, 8);
- result = hmac_md5(ntlmv2hash, 16, &data[0], 16, hmac_output);
+ result = Curl_hmacit(Curl_HMAC_MD5, ntlmv2hash, 16, &data[0], 16,
+ hmac_output);
if(result)
return result;
diff --git a/Utilities/cmcurl/lib/curl_ntlm_core.h b/Utilities/cmcurl/lib/curl_ntlm_core.h
index 3b4b805..e1643d6 100644
--- a/Utilities/cmcurl/lib/curl_ntlm_core.h
+++ b/Utilities/cmcurl/lib/curl_ntlm_core.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -46,9 +46,9 @@
#define USE_NTRESPONSES
/* Define USE_NTLM2SESSION in order to make the type-3 message include the
- NTLM2Session response message, requires USE_NTRESPONSES defined to 1 and a
- Crypto engine that we have curl_ssl_md5sum() for. */
-#if defined(USE_NTRESPONSES) && !defined(USE_WIN32_CRYPTO)
+ NTLM2Session response message, requires USE_NTRESPONSES defined to 1 and
+ MD5 support */
+#if defined(USE_NTRESPONSES) && !defined(CURL_DISABLE_CRYPTO_AUTH)
#define USE_NTLM2SESSION
#endif
diff --git a/Utilities/cmcurl/lib/curl_ntlm_wb.c b/Utilities/cmcurl/lib/curl_ntlm_wb.c
index 80266e2..f820b84 100644
--- a/Utilities/cmcurl/lib/curl_ntlm_wb.c
+++ b/Utilities/cmcurl/lib/curl_ntlm_wb.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -76,22 +76,22 @@
# define sclose_nolog(x) close((x))
#endif
-void Curl_http_auth_cleanup_ntlm_wb(struct connectdata *conn)
+static void ntlm_wb_cleanup(struct ntlmdata *ntlm)
{
- if(conn->ntlm_auth_hlpr_socket != CURL_SOCKET_BAD) {
- sclose(conn->ntlm_auth_hlpr_socket);
- conn->ntlm_auth_hlpr_socket = CURL_SOCKET_BAD;
+ if(ntlm->ntlm_auth_hlpr_socket != CURL_SOCKET_BAD) {
+ sclose(ntlm->ntlm_auth_hlpr_socket);
+ ntlm->ntlm_auth_hlpr_socket = CURL_SOCKET_BAD;
}
- if(conn->ntlm_auth_hlpr_pid) {
+ if(ntlm->ntlm_auth_hlpr_pid) {
int i;
for(i = 0; i < 4; i++) {
- pid_t ret = waitpid(conn->ntlm_auth_hlpr_pid, NULL, WNOHANG);
- if(ret == conn->ntlm_auth_hlpr_pid || errno == ECHILD)
+ pid_t ret = waitpid(ntlm->ntlm_auth_hlpr_pid, NULL, WNOHANG);
+ if(ret == ntlm->ntlm_auth_hlpr_pid || errno == ECHILD)
break;
switch(i) {
case 0:
- kill(conn->ntlm_auth_hlpr_pid, SIGTERM);
+ kill(ntlm->ntlm_auth_hlpr_pid, SIGTERM);
break;
case 1:
/* Give the process another moment to shut down cleanly before
@@ -99,22 +99,21 @@ void Curl_http_auth_cleanup_ntlm_wb(struct connectdata *conn)
Curl_wait_ms(1);
break;
case 2:
- kill(conn->ntlm_auth_hlpr_pid, SIGKILL);
+ kill(ntlm->ntlm_auth_hlpr_pid, SIGKILL);
break;
case 3:
break;
}
}
- conn->ntlm_auth_hlpr_pid = 0;
+ ntlm->ntlm_auth_hlpr_pid = 0;
}
- free(conn->challenge_header);
- conn->challenge_header = NULL;
- free(conn->response_header);
- conn->response_header = NULL;
+ Curl_safefree(ntlm->challenge);
+ Curl_safefree(ntlm->response);
}
-static CURLcode ntlm_wb_init(struct connectdata *conn, const char *userp)
+static CURLcode ntlm_wb_init(struct Curl_easy *data, struct ntlmdata *ntlm,
+ const char *userp)
{
curl_socket_t sockfds[2];
pid_t child_pid;
@@ -128,9 +127,13 @@ static CURLcode ntlm_wb_init(struct connectdata *conn, const char *userp)
#endif
char buffer[STRERROR_LEN];
+#if defined(CURL_DISABLE_VERBOSE_STRINGS)
+ (void) data;
+#endif
+
/* Return if communication with ntlm_auth already set up */
- if(conn->ntlm_auth_hlpr_socket != CURL_SOCKET_BAD ||
- conn->ntlm_auth_hlpr_pid)
+ if(ntlm->ntlm_auth_hlpr_socket != CURL_SOCKET_BAD ||
+ ntlm->ntlm_auth_hlpr_pid)
return CURLE_OK;
username = userp;
@@ -181,13 +184,13 @@ static CURLcode ntlm_wb_init(struct connectdata *conn, const char *userp)
ntlm_auth = NTLM_WB_FILE;
if(access(ntlm_auth, X_OK) != 0) {
- failf(conn->data, "Could not access ntlm_auth: %s errno %d: %s",
+ failf(data, "Could not access ntlm_auth: %s errno %d: %s",
ntlm_auth, errno, Curl_strerror(errno, buffer, sizeof(buffer)));
goto done;
}
- if(socketpair(AF_UNIX, SOCK_STREAM, 0, sockfds)) {
- failf(conn->data, "Could not open socket pair. errno %d: %s",
+ if(Curl_socketpair(AF_UNIX, SOCK_STREAM, 0, sockfds)) {
+ failf(data, "Could not open socket pair. errno %d: %s",
errno, Curl_strerror(errno, buffer, sizeof(buffer)));
goto done;
}
@@ -196,7 +199,7 @@ static CURLcode ntlm_wb_init(struct connectdata *conn, const char *userp)
if(child_pid == -1) {
sclose(sockfds[0]);
sclose(sockfds[1]);
- failf(conn->data, "Could not fork. errno %d: %s",
+ failf(data, "Could not fork. errno %d: %s",
errno, Curl_strerror(errno, buffer, sizeof(buffer)));
goto done;
}
@@ -208,13 +211,13 @@ static CURLcode ntlm_wb_init(struct connectdata *conn, const char *userp)
/* Don't use sclose in the child since it fools the socket leak detector */
sclose_nolog(sockfds[0]);
if(dup2(sockfds[1], STDIN_FILENO) == -1) {
- failf(conn->data, "Could not redirect child stdin. errno %d: %s",
+ failf(data, "Could not redirect child stdin. errno %d: %s",
errno, Curl_strerror(errno, buffer, sizeof(buffer)));
exit(1);
}
if(dup2(sockfds[1], STDOUT_FILENO) == -1) {
- failf(conn->data, "Could not redirect child stdout. errno %d: %s",
+ failf(data, "Could not redirect child stdout. errno %d: %s",
errno, Curl_strerror(errno, buffer, sizeof(buffer)));
exit(1);
}
@@ -234,14 +237,14 @@ static CURLcode ntlm_wb_init(struct connectdata *conn, const char *userp)
NULL);
sclose_nolog(sockfds[1]);
- failf(conn->data, "Could not execl(). errno %d: %s",
+ failf(data, "Could not execl(). errno %d: %s",
errno, Curl_strerror(errno, buffer, sizeof(buffer)));
exit(1);
}
sclose(sockfds[1]);
- conn->ntlm_auth_hlpr_socket = sockfds[0];
- conn->ntlm_auth_hlpr_pid = child_pid;
+ ntlm->ntlm_auth_hlpr_socket = sockfds[0];
+ ntlm->ntlm_auth_hlpr_pid = child_pid;
free(domain);
free(ntlm_auth_alloc);
return CURLE_OK;
@@ -255,17 +258,21 @@ done:
/* if larger than this, something is seriously wrong */
#define MAX_NTLM_WB_RESPONSE 100000
-static CURLcode ntlm_wb_response(struct connectdata *conn,
+static CURLcode ntlm_wb_response(struct Curl_easy *data, struct ntlmdata *ntlm,
const char *input, curlntlm state)
{
char *buf = malloc(NTLM_BUFSIZE);
size_t len_in = strlen(input), len_out = 0;
+#if defined(CURL_DISABLE_VERBOSE_STRINGS)
+ (void) data;
+#endif
+
if(!buf)
return CURLE_OUT_OF_MEMORY;
while(len_in > 0) {
- ssize_t written = swrite(conn->ntlm_auth_hlpr_socket, input, len_in);
+ ssize_t written = swrite(ntlm->ntlm_auth_hlpr_socket, input, len_in);
if(written == -1) {
/* Interrupted by a signal, retry it */
if(errno == EINTR)
@@ -281,7 +288,7 @@ static CURLcode ntlm_wb_response(struct connectdata *conn,
ssize_t size;
char *newbuf;
- size = sread(conn->ntlm_auth_hlpr_socket, buf + len_out, NTLM_BUFSIZE);
+ size = sread(ntlm->ntlm_auth_hlpr_socket, buf + len_out, NTLM_BUFSIZE);
if(size == -1) {
if(errno == EINTR)
continue;
@@ -297,7 +304,7 @@ static CURLcode ntlm_wb_response(struct connectdata *conn,
}
if(len_out > MAX_NTLM_WB_RESPONSE) {
- failf(conn->data, "too large ntlm_wb response!");
+ failf(data, "too large ntlm_wb response!");
free(buf);
return CURLE_OUT_OF_MEMORY;
}
@@ -325,9 +332,9 @@ static CURLcode ntlm_wb_response(struct connectdata *conn,
(buf[0]!='A' || buf[1]!='F' || buf[2]!=' '))
goto done;
- conn->response_header = aprintf("NTLM %.*s", len_out - 4, buf + 3);
+ ntlm->response = aprintf("%.*s", len_out - 4, buf + 3);
free(buf);
- if(!conn->response_header)
+ if(!ntlm->response)
return CURLE_OUT_OF_MEMORY;
return CURLE_OK;
done:
@@ -339,6 +346,7 @@ CURLcode Curl_input_ntlm_wb(struct connectdata *conn,
bool proxy,
const char *header)
{
+ struct ntlmdata *ntlm = proxy ? &conn->proxyntlm : &conn->ntlm;
curlntlm *state = proxy ? &conn->proxy_ntlm_state : &conn->http_ntlm_state;
if(!checkprefix("NTLM", header))
@@ -349,8 +357,8 @@ CURLcode Curl_input_ntlm_wb(struct connectdata *conn,
header++;
if(*header) {
- conn->challenge_header = strdup(header);
- if(!conn->challenge_header)
+ ntlm->challenge = strdup(header);
+ if(!ntlm->challenge)
return CURLE_OUT_OF_MEMORY;
*state = NTLMSTATE_TYPE2; /* We got a type-2 message */
@@ -389,11 +397,11 @@ CURLcode Curl_output_ntlm_wb(struct connectdata *conn,
char **allocuserpwd;
/* point to the name and password for this */
const char *userp;
+ struct ntlmdata *ntlm;
curlntlm *state;
struct auth *authp;
CURLcode res = CURLE_OK;
- char *input;
DEBUGASSERT(conn);
DEBUGASSERT(conn->data);
@@ -401,12 +409,14 @@ CURLcode Curl_output_ntlm_wb(struct connectdata *conn,
if(proxy) {
allocuserpwd = &conn->allocptr.proxyuserpwd;
userp = conn->http_proxy.user;
+ ntlm = &conn->proxyntlm;
state = &conn->proxy_ntlm_state;
authp = &conn->data->state.authproxy;
}
else {
allocuserpwd = &conn->allocptr.userpwd;
userp = conn->user;
+ ntlm = &conn->ntlm;
state = &conn->http_ntlm_state;
authp = &conn->data->state.authhost;
}
@@ -432,38 +442,36 @@ CURLcode Curl_output_ntlm_wb(struct connectdata *conn,
* request handling process.
*/
/* Create communication with ntlm_auth */
- res = ntlm_wb_init(conn, userp);
+ res = ntlm_wb_init(conn->data, ntlm, userp);
if(res)
return res;
- res = ntlm_wb_response(conn, "YR\n", *state);
+ res = ntlm_wb_response(conn->data, ntlm, "YR\n", *state);
if(res)
return res;
free(*allocuserpwd);
- *allocuserpwd = aprintf("%sAuthorization: %s\r\n",
+ *allocuserpwd = aprintf("%sAuthorization: NTLM %s\r\n",
proxy ? "Proxy-" : "",
- conn->response_header);
+ ntlm->response);
DEBUG_OUT(fprintf(stderr, "**** Header %s\n ", *allocuserpwd));
- free(conn->response_header);
+ Curl_safefree(ntlm->response);
if(!*allocuserpwd)
return CURLE_OUT_OF_MEMORY;
- conn->response_header = NULL;
break;
- case NTLMSTATE_TYPE2:
- input = aprintf("TT %s\n", conn->challenge_header);
+ case NTLMSTATE_TYPE2: {
+ char *input = aprintf("TT %s\n", ntlm->challenge);
if(!input)
return CURLE_OUT_OF_MEMORY;
- res = ntlm_wb_response(conn, input, *state);
+ res = ntlm_wb_response(conn->data, ntlm, input, *state);
free(input);
- input = NULL;
if(res)
return res;
free(*allocuserpwd);
- *allocuserpwd = aprintf("%sAuthorization: %s\r\n",
+ *allocuserpwd = aprintf("%sAuthorization: NTLM %s\r\n",
proxy ? "Proxy-" : "",
- conn->response_header);
+ ntlm->response);
DEBUG_OUT(fprintf(stderr, "**** %s\n ", *allocuserpwd));
*state = NTLMSTATE_TYPE3; /* we sent a type-3 */
authp->done = TRUE;
@@ -471,7 +479,7 @@ CURLcode Curl_output_ntlm_wb(struct connectdata *conn,
if(!*allocuserpwd)
return CURLE_OUT_OF_MEMORY;
break;
-
+ }
case NTLMSTATE_TYPE3:
/* connection is already authenticated,
* don't send a header in future requests */
@@ -486,4 +494,10 @@ CURLcode Curl_output_ntlm_wb(struct connectdata *conn,
return CURLE_OK;
}
+void Curl_http_auth_cleanup_ntlm_wb(struct connectdata *conn)
+{
+ ntlm_wb_cleanup(&conn->ntlm);
+ ntlm_wb_cleanup(&conn->proxyntlm);
+}
+
#endif /* !CURL_DISABLE_HTTP && USE_NTLM && NTLM_WB_ENABLED */
diff --git a/Utilities/cmcurl/lib/curl_path.c b/Utilities/cmcurl/lib/curl_path.c
index 85dddce..f429634 100644
--- a/Utilities/cmcurl/lib/curl_path.c
+++ b/Utilities/cmcurl/lib/curl_path.c
@@ -55,7 +55,7 @@ CURLcode Curl_getworkingpath(struct connectdata *conn,
}
if((working_path_len > 3) && (!memcmp(working_path, "/~/", 3)))
/* It is referenced to the home directory, so strip the leading '/~/' */
- memcpy(real_path, working_path + 3, 4 + working_path_len-3);
+ memcpy(real_path, working_path + 3, working_path_len - 2);
else
memcpy(real_path, working_path, 1 + working_path_len);
}
diff --git a/Utilities/cmcurl/lib/curl_rtmp.c b/Utilities/cmcurl/lib/curl_rtmp.c
index 16b1de1..df8f2b1 100644
--- a/Utilities/cmcurl/lib/curl_rtmp.c
+++ b/Utilities/cmcurl/lib/curl_rtmp.c
@@ -199,13 +199,13 @@ static CURLcode rtmp_setup_connection(struct connectdata *conn)
RTMP_Free(r);
return CURLE_URL_MALFORMAT;
}
- conn->proto.generic = r;
+ conn->proto.rtmp = r;
return CURLE_OK;
}
static CURLcode rtmp_connect(struct connectdata *conn, bool *done)
{
- RTMP *r = conn->proto.generic;
+ RTMP *r = conn->proto.rtmp;
SET_RCVTIMEO(tv, 10);
r->m_sb.sb_socket = (int)conn->sock[FIRSTSOCKET];
@@ -240,7 +240,7 @@ static CURLcode rtmp_connect(struct connectdata *conn, bool *done)
static CURLcode rtmp_do(struct connectdata *conn, bool *done)
{
struct Curl_easy *data = conn->data;
- RTMP *r = conn->proto.generic;
+ RTMP *r = conn->proto.rtmp;
if(!RTMP_ConnectStream(r, 0))
return CURLE_FAILED_INIT;
@@ -268,10 +268,10 @@ static CURLcode rtmp_done(struct connectdata *conn, CURLcode status,
static CURLcode rtmp_disconnect(struct connectdata *conn,
bool dead_connection)
{
- RTMP *r = conn->proto.generic;
+ RTMP *r = conn->proto.rtmp;
(void)dead_connection;
if(r) {
- conn->proto.generic = NULL;
+ conn->proto.rtmp = NULL;
RTMP_Close(r);
RTMP_Free(r);
}
@@ -281,7 +281,7 @@ static CURLcode rtmp_disconnect(struct connectdata *conn,
static ssize_t rtmp_recv(struct connectdata *conn, int sockindex, char *buf,
size_t len, CURLcode *err)
{
- RTMP *r = conn->proto.generic;
+ RTMP *r = conn->proto.rtmp;
ssize_t nread;
(void)sockindex; /* unused */
@@ -302,7 +302,7 @@ static ssize_t rtmp_recv(struct connectdata *conn, int sockindex, char *buf,
static ssize_t rtmp_send(struct connectdata *conn, int sockindex,
const void *buf, size_t len, CURLcode *err)
{
- RTMP *r = conn->proto.generic;
+ RTMP *r = conn->proto.rtmp;
ssize_t num;
(void)sockindex; /* unused */
diff --git a/Utilities/cmcurl/lib/curl_rtmp.h b/Utilities/cmcurl/lib/curl_rtmp.h
index 3306e22..86a0138 100644
--- a/Utilities/cmcurl/lib/curl_rtmp.h
+++ b/Utilities/cmcurl/lib/curl_rtmp.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2010, Howard Chu, <hyc@highlandsun.com>
+ * Copyright (C) 2010 - 2019, Howard Chu, <hyc@highlandsun.com>
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/curl_sasl.c b/Utilities/cmcurl/lib/curl_sasl.c
index 018e422..8c1c866 100644
--- a/Utilities/cmcurl/lib/curl_sasl.c
+++ b/Utilities/cmcurl/lib/curl_sasl.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2012 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -272,6 +272,7 @@ CURLcode Curl_sasl_start(struct SASL *sasl, struct connectdata *conn,
data->set.str[STRING_SERVICE_NAME] :
sasl->params->service;
#endif
+ const char *oauth_bearer = data->set.str[STRING_BEARER];
sasl->force_ir = force_ir; /* Latch for future use */
sasl->authused = 0; /* No mechanism used yet */
@@ -341,7 +342,7 @@ CURLcode Curl_sasl_start(struct SASL *sasl, struct connectdata *conn,
}
else
#endif
- if((enabledmechs & SASL_MECH_OAUTHBEARER) && conn->oauth_bearer) {
+ if((enabledmechs & SASL_MECH_OAUTHBEARER) && oauth_bearer) {
mech = SASL_MECH_STRING_OAUTHBEARER;
state1 = SASL_OAUTH2;
state2 = SASL_OAUTH2_RESP;
@@ -351,17 +352,17 @@ CURLcode Curl_sasl_start(struct SASL *sasl, struct connectdata *conn,
result = Curl_auth_create_oauth_bearer_message(data, conn->user,
hostname,
port,
- conn->oauth_bearer,
+ oauth_bearer,
&resp, &len);
}
- else if((enabledmechs & SASL_MECH_XOAUTH2) && conn->oauth_bearer) {
+ else if((enabledmechs & SASL_MECH_XOAUTH2) && oauth_bearer) {
mech = SASL_MECH_STRING_XOAUTH2;
state1 = SASL_OAUTH2;
sasl->authused = SASL_MECH_XOAUTH2;
if(force_ir || data->set.sasl_ir)
result = Curl_auth_create_xoauth_bearer_message(data, conn->user,
- conn->oauth_bearer,
+ oauth_bearer,
&resp, &len);
}
else if(enabledmechs & SASL_MECH_PLAIN) {
@@ -370,8 +371,9 @@ CURLcode Curl_sasl_start(struct SASL *sasl, struct connectdata *conn,
sasl->authused = SASL_MECH_PLAIN;
if(force_ir || data->set.sasl_ir)
- result = Curl_auth_create_plain_message(data, NULL, conn->user,
- conn->passwd, &resp, &len);
+ result = Curl_auth_create_plain_message(data, conn->sasl_authzid,
+ conn->user, conn->passwd,
+ &resp, &len);
}
else if(enabledmechs & SASL_MECH_LOGIN) {
mech = SASL_MECH_STRING_LOGIN;
@@ -430,6 +432,7 @@ CURLcode Curl_sasl_continue(struct SASL *sasl, struct connectdata *conn,
char *serverdata;
#endif
size_t len = 0;
+ const char *oauth_bearer = data->set.str[STRING_BEARER];
*progress = SASL_INPROGRESS;
@@ -453,8 +456,9 @@ CURLcode Curl_sasl_continue(struct SASL *sasl, struct connectdata *conn,
*progress = SASL_DONE;
return result;
case SASL_PLAIN:
- result = Curl_auth_create_plain_message(data, NULL, conn->user,
- conn->passwd, &resp, &len);
+ result = Curl_auth_create_plain_message(data, conn->sasl_authzid,
+ conn->user, conn->passwd,
+ &resp, &len);
break;
case SASL_LOGIN:
result = Curl_auth_create_login_message(data, conn->user, &resp, &len);
@@ -556,7 +560,7 @@ CURLcode Curl_sasl_continue(struct SASL *sasl, struct connectdata *conn,
result = Curl_auth_create_oauth_bearer_message(data, conn->user,
hostname,
port,
- conn->oauth_bearer,
+ oauth_bearer,
&resp, &len);
/* Failures maybe sent by the server as continuations for OAUTHBEARER */
@@ -564,7 +568,7 @@ CURLcode Curl_sasl_continue(struct SASL *sasl, struct connectdata *conn,
}
else
result = Curl_auth_create_xoauth_bearer_message(data, conn->user,
- conn->oauth_bearer,
+ oauth_bearer,
&resp, &len);
break;
diff --git a/Utilities/cmcurl/lib/curl_setup.h b/Utilities/cmcurl/lib/curl_setup.h
index efba5dd..ecd6afb 100644
--- a/Utilities/cmcurl/lib/curl_setup.h
+++ b/Utilities/cmcurl/lib/curl_setup.h
@@ -27,6 +27,14 @@
#endif
/*
+ * Disable Visual Studio warnings:
+ * 4127 "conditional expression is constant"
+ */
+#ifdef _MSC_VER
+#pragma warning(disable:4127)
+#endif
+
+/*
* Define WIN32 when build target is Win32 API
*/
@@ -96,6 +104,10 @@
# include "config-vxworks.h"
#endif
+#ifdef __PLAN9__
+# include "config-plan9.h"
+#endif
+
#endif /* HAVE_CONFIG_H */
#if defined(_MSC_VER)
@@ -497,7 +509,6 @@
#ifdef WIN32
# define DIR_CHAR "\\"
-# define DOT_CHAR "_"
#else /* WIN32 */
@@ -523,14 +534,6 @@
# endif
# define DIR_CHAR "/"
-# ifndef DOT_CHAR
-# define DOT_CHAR "."
-# endif
-
-# ifdef MSDOS
-# undef DOT_CHAR
-# define DOT_CHAR "_"
-# endif
# ifndef fileno /* sunos 4 have this as a macro! */
int fileno(FILE *stream);
@@ -583,6 +586,12 @@
* Mutually exclusive CURLRES_* definitions.
*/
+#if defined(ENABLE_IPV6) && defined(HAVE_GETADDRINFO)
+# define CURLRES_IPV6
+#else
+# define CURLRES_IPV4
+#endif
+
#ifdef USE_ARES
# define CURLRES_ASYNCH
# define CURLRES_ARES
@@ -597,12 +606,6 @@
# define CURLRES_SYNCH
#endif
-#ifdef ENABLE_IPV6
-# define CURLRES_IPV6
-#else
-# define CURLRES_IPV4
-#endif
-
/* ---------------------------------------------------------------- */
/*
@@ -662,9 +665,10 @@ int netware_init(void);
#define LIBIDN_REQUIRED_VERSION "0.4.1"
#if defined(USE_GNUTLS) || defined(USE_OPENSSL) || defined(USE_NSS) || \
- defined(USE_POLARSSL) || defined(USE_MBEDTLS) || \
- defined(USE_CYASSL) || defined(USE_SCHANNEL) || \
- defined(USE_SECTRANSP) || defined(USE_GSKIT) || defined(USE_MESALINK)
+ defined(USE_MBEDTLS) || \
+ defined(USE_WOLFSSL) || defined(USE_SCHANNEL) || \
+ defined(USE_SECTRANSP) || defined(USE_GSKIT) || defined(USE_MESALINK) || \
+ defined(USE_BEARSSL)
#define USE_SSL /* SSL support has been enabled */
#endif
@@ -733,7 +737,7 @@ int netware_init(void);
*/
#ifndef Curl_nop_stmt
-# define Curl_nop_stmt do { } WHILE_FALSE
+# define Curl_nop_stmt do { } while(0)
#endif
/*
@@ -842,4 +846,8 @@ int getpwuid_r(uid_t uid, struct passwd *pwd, char *buf,
#define UNITTEST static
#endif
+#if defined(USE_NGTCP2) || defined(USE_QUICHE)
+#define ENABLE_QUIC
+#endif
+
#endif /* HEADER_CURL_SETUP_H */
diff --git a/Utilities/cmcurl/lib/curl_setup_once.h b/Utilities/cmcurl/lib/curl_setup_once.h
index 413ccea..8890f38 100644
--- a/Utilities/cmcurl/lib/curl_setup_once.h
+++ b/Utilities/cmcurl/lib/curl_setup_once.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -330,27 +330,6 @@ struct timeval {
#include "curl_ctype.h"
/*
- * Macro WHILE_FALSE may be used to build single-iteration do-while loops,
- * avoiding compiler warnings. Mostly intended for other macro definitions.
- */
-
-#define WHILE_FALSE while(0)
-
-#if defined(_MSC_VER) && !defined(__POCC__)
-# undef WHILE_FALSE
-# if (_MSC_VER < 1500)
-# define WHILE_FALSE while(1, 0)
-# else
-# define WHILE_FALSE \
-__pragma(warning(push)) \
-__pragma(warning(disable:4127)) \
-while(0) \
-__pragma(warning(pop))
-# endif
-#endif
-
-
-/*
* Typedef to 'int' if sig_atomic_t is not an available 'typedefed' type.
*/
@@ -387,7 +366,7 @@ typedef int sig_atomic_t;
#ifdef DEBUGBUILD
#define DEBUGF(x) x
#else
-#define DEBUGF(x) do { } WHILE_FALSE
+#define DEBUGF(x) do { } while(0)
#endif
@@ -395,10 +374,11 @@ typedef int sig_atomic_t;
* Macro used to include assertion code only in debug builds.
*/
+#undef DEBUGASSERT
#if defined(DEBUGBUILD) && defined(HAVE_ASSERT_H)
#define DEBUGASSERT(x) assert(x)
#else
-#define DEBUGASSERT(x) do { } WHILE_FALSE
+#define DEBUGASSERT(x) do { } while(0)
#endif
diff --git a/Utilities/cmcurl/lib/curl_sha256.h b/Utilities/cmcurl/lib/curl_sha256.h
index 6db4b04..35d286c 100644
--- a/Utilities/cmcurl/lib/curl_sha256.h
+++ b/Utilities/cmcurl/lib/curl_sha256.h
@@ -7,7 +7,8 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2010, Florin Petriuc, <petriuc.florin@gmail.com>
+ * Copyright (C) 2017, Florin Petriuc, <petriuc.florin@gmail.com>
+ * Copyright (C) 2018 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -24,8 +25,10 @@
#ifndef CURL_DISABLE_CRYPTO_AUTH
-void Curl_sha256it(unsigned char *outbuffer,
- const unsigned char *input);
+#define SHA256_DIGEST_LENGTH 32
+
+void Curl_sha256it(unsigned char *outbuffer, const unsigned char *input,
+ const size_t len);
#endif
diff --git a/Utilities/cmcurl/lib/curl_sspi.c b/Utilities/cmcurl/lib/curl_sspi.c
index 1d0de4e..f7cc10f 100644
--- a/Utilities/cmcurl/lib/curl_sspi.c
+++ b/Utilities/cmcurl/lib/curl_sspi.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/curl_sspi.h b/Utilities/cmcurl/lib/curl_sspi.h
index 2bbf947..c09026e 100644
--- a/Utilities/cmcurl/lib/curl_sspi.h
+++ b/Utilities/cmcurl/lib/curl_sspi.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/curl_threads.c b/Utilities/cmcurl/lib/curl_threads.c
index 8e5937a..064c075 100644
--- a/Utilities/cmcurl/lib/curl_threads.c
+++ b/Utilities/cmcurl/lib/curl_threads.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/curl_threads.h b/Utilities/cmcurl/lib/curl_threads.h
index 2a93644..65d1a79 100644
--- a/Utilities/cmcurl/lib/curl_threads.h
+++ b/Utilities/cmcurl/lib/curl_threads.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/dict.h b/Utilities/cmcurl/lib/dict.h
index 12c0f33..38a55ac 100644
--- a/Utilities/cmcurl/lib/dict.h
+++ b/Utilities/cmcurl/lib/dict.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/doh.c b/Utilities/cmcurl/lib/doh.c
index 6d1f330..aaa8f15 100644
--- a/Utilities/cmcurl/lib/doh.c
+++ b/Utilities/cmcurl/lib/doh.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2018 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2018 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -74,17 +74,50 @@ static const char *doh_strerror(DOHcode code)
#define UNITTEST static
#endif
+/* @unittest 1655
+ */
UNITTEST DOHcode doh_encode(const char *host,
DNStype dnstype,
unsigned char *dnsp, /* buffer */
size_t len, /* buffer size */
size_t *olen) /* output length */
{
- size_t hostlen = strlen(host);
+ const size_t hostlen = strlen(host);
unsigned char *orig = dnsp;
const char *hostp = host;
- if(len < (12 + hostlen + 4))
+ /* The expected output length is 16 bytes more than the length of
+ * the QNAME-encoding of the host name.
+ *
+ * A valid DNS name may not contain a zero-length label, except at
+ * the end. For this reason, a name beginning with a dot, or
+ * containing a sequence of two or more consecutive dots, is invalid
+ * and cannot be encoded as a QNAME.
+ *
+ * If the host name ends with a trailing dot, the corresponding
+ * QNAME-encoding is one byte longer than the host name. If (as is
+ * also valid) the hostname is shortened by the omission of the
+ * trailing dot, then its QNAME-encoding will be two bytes longer
+ * than the host name.
+ *
+ * Each [ label, dot ] pair is encoded as [ length, label ],
+ * preserving overall length. A final [ label ] without a dot is
+ * also encoded as [ length, label ], increasing overall length
+ * by one. The encoding is completed by appending a zero byte,
+ * representing the zero-length root label, again increasing
+ * the overall length by one.
+ */
+
+ size_t expected_len;
+ DEBUGASSERT(hostlen);
+ expected_len = 12 + 1 + hostlen + 4;
+ if(host[hostlen-1]!='.')
+ expected_len++;
+
+ if(expected_len > (256 + 16)) /* RFCs 1034, 1035 */
+ return DOH_DNS_NAME_TOO_LONG;
+
+ if(len < expected_len)
return DOH_TOO_SMALL_BUFFER;
*dnsp++ = 0; /* 16 bit id */
@@ -100,38 +133,43 @@ UNITTEST DOHcode doh_encode(const char *host,
*dnsp++ = '\0';
*dnsp++ = '\0'; /* ARCOUNT */
- /* store a QNAME */
- do {
- char *dot = strchr(hostp, '.');
+ /* encode each label and store it in the QNAME */
+ while(*hostp) {
size_t labellen;
- bool found = false;
- if(dot) {
- found = true;
+ char *dot = strchr(hostp, '.');
+ if(dot)
labellen = dot - hostp;
- }
else
labellen = strlen(hostp);
- if(labellen > 63) {
- /* too long label, error out */
+ if((labellen > 63) || (!labellen)) {
+ /* label is too long or too short, error out */
*olen = 0;
return DOH_DNS_BAD_LABEL;
}
+ /* label is non-empty, process it */
*dnsp++ = (unsigned char)labellen;
memcpy(dnsp, hostp, labellen);
dnsp += labellen;
- hostp += labellen + 1;
- if(!found) {
- *dnsp++ = 0; /* terminating zero */
- break;
- }
- } while(1);
+ hostp += labellen;
+ /* advance past dot, but only if there is one */
+ if(dot)
+ hostp++;
+ } /* next label */
+
+ *dnsp++ = 0; /* append zero-length label for root */
+
+ /* There are assigned TYPE codes beyond 255: use range [1..65535] */
+ *dnsp++ = (unsigned char)(255 & (dnstype>>8)); /* upper 8 bit TYPE */
+ *dnsp++ = (unsigned char)(255 & dnstype); /* lower 8 bit TYPE */
- *dnsp++ = '\0'; /* upper 8 bit TYPE */
- *dnsp++ = (unsigned char)dnstype;
*dnsp++ = '\0'; /* upper 8 bit CLASS */
*dnsp++ = DNS_CLASS_IN; /* IN - "the Internet" */
*olen = dnsp - orig;
+
+ /* verify that our estimation of length is valid, since
+ * this has led to buffer overflows in this function */
+ DEBUGASSERT(*olen == expected_len);
return DOH_OK;
}
@@ -180,7 +218,7 @@ do { \
result = curl_easy_setopt(doh, x, y); \
if(result) \
goto error; \
-} WHILE_FALSE
+} while(0)
static CURLcode dohprobe(struct Curl_easy *data,
struct dnsprobe *p, DNStype dnstype,
@@ -225,7 +263,10 @@ static CURLcode dohprobe(struct Curl_easy *data,
}
timeout_ms = Curl_timeleft(data, NULL, TRUE);
-
+ if(timeout_ms <= 0) {
+ result = CURLE_OPERATION_TIMEDOUT;
+ goto error;
+ }
/* Curl_open() is the internal version of curl_easy_init() */
result = Curl_open(&doh);
if(!result) {
@@ -246,6 +287,9 @@ static CURLcode dohprobe(struct Curl_easy *data,
#ifndef CURLDEBUG
/* enforce HTTPS if not debug */
ERROR_CHECK_SETOPT(CURLOPT_PROTOCOLS, CURLPROTO_HTTPS);
+#else
+ /* in debug mode, also allow http */
+ ERROR_CHECK_SETOPT(CURLOPT_PROTOCOLS, CURLPROTO_HTTP|CURLPROTO_HTTPS);
#endif
ERROR_CHECK_SETOPT(CURLOPT_TIMEOUT_MS, (long)timeout_ms);
if(data->set.verbose)
@@ -259,38 +303,42 @@ static CURLcode dohprobe(struct Curl_easy *data,
ERROR_CHECK_SETOPT(CURLOPT_SSL_FALSESTART, 1L);
if(data->set.ssl.primary.verifyhost)
ERROR_CHECK_SETOPT(CURLOPT_SSL_VERIFYHOST, 2L);
+#ifndef CURL_DISABLE_PROXY
if(data->set.proxy_ssl.primary.verifyhost)
ERROR_CHECK_SETOPT(CURLOPT_PROXY_SSL_VERIFYHOST, 2L);
- if(data->set.ssl.primary.verifypeer)
- ERROR_CHECK_SETOPT(CURLOPT_SSL_VERIFYPEER, 1L);
if(data->set.proxy_ssl.primary.verifypeer)
ERROR_CHECK_SETOPT(CURLOPT_PROXY_SSL_VERIFYPEER, 1L);
+ if(data->set.str[STRING_SSL_CAFILE_PROXY]) {
+ ERROR_CHECK_SETOPT(CURLOPT_PROXY_CAINFO,
+ data->set.str[STRING_SSL_CAFILE_PROXY]);
+ }
+ if(data->set.str[STRING_SSL_CRLFILE_PROXY]) {
+ ERROR_CHECK_SETOPT(CURLOPT_PROXY_CRLFILE,
+ data->set.str[STRING_SSL_CRLFILE_PROXY]);
+ }
+ if(data->set.proxy_ssl.no_revoke)
+ ERROR_CHECK_SETOPT(CURLOPT_PROXY_SSL_OPTIONS, CURLSSLOPT_NO_REVOKE);
+ if(data->set.str[STRING_SSL_CAPATH_PROXY]) {
+ ERROR_CHECK_SETOPT(CURLOPT_PROXY_CAPATH,
+ data->set.str[STRING_SSL_CAPATH_PROXY]);
+ }
+#endif
+ if(data->set.ssl.primary.verifypeer)
+ ERROR_CHECK_SETOPT(CURLOPT_SSL_VERIFYPEER, 1L);
if(data->set.ssl.primary.verifystatus)
ERROR_CHECK_SETOPT(CURLOPT_SSL_VERIFYSTATUS, 1L);
if(data->set.str[STRING_SSL_CAFILE_ORIG]) {
ERROR_CHECK_SETOPT(CURLOPT_CAINFO,
data->set.str[STRING_SSL_CAFILE_ORIG]);
}
- if(data->set.str[STRING_SSL_CAFILE_PROXY]) {
- ERROR_CHECK_SETOPT(CURLOPT_PROXY_CAINFO,
- data->set.str[STRING_SSL_CAFILE_PROXY]);
- }
if(data->set.str[STRING_SSL_CAPATH_ORIG]) {
ERROR_CHECK_SETOPT(CURLOPT_CAPATH,
data->set.str[STRING_SSL_CAPATH_ORIG]);
}
- if(data->set.str[STRING_SSL_CAPATH_PROXY]) {
- ERROR_CHECK_SETOPT(CURLOPT_PROXY_CAPATH,
- data->set.str[STRING_SSL_CAPATH_PROXY]);
- }
if(data->set.str[STRING_SSL_CRLFILE_ORIG]) {
ERROR_CHECK_SETOPT(CURLOPT_CRLFILE,
data->set.str[STRING_SSL_CRLFILE_ORIG]);
}
- if(data->set.str[STRING_SSL_CRLFILE_PROXY]) {
- ERROR_CHECK_SETOPT(CURLOPT_PROXY_CRLFILE,
- data->set.str[STRING_SSL_CRLFILE_PROXY]);
- }
if(data->set.ssl.certinfo)
ERROR_CHECK_SETOPT(CURLOPT_CERTINFO, 1L);
if(data->set.str[STRING_SSL_RANDOM_FILE]) {
@@ -303,8 +351,6 @@ static CURLcode dohprobe(struct Curl_easy *data,
}
if(data->set.ssl.no_revoke)
ERROR_CHECK_SETOPT(CURLOPT_SSL_OPTIONS, CURLSSLOPT_NO_REVOKE);
- if(data->set.proxy_ssl.no_revoke)
- ERROR_CHECK_SETOPT(CURLOPT_PROXY_SSL_OPTIONS, CURLSSLOPT_NO_REVOKE);
if(data->set.ssl.fsslctx)
ERROR_CHECK_SETOPT(CURLOPT_SSL_CTX_FUNCTION, data->set.ssl.fsslctx);
if(data->set.ssl.fsslctxp)
@@ -325,7 +371,7 @@ static CURLcode dohprobe(struct Curl_easy *data,
error:
free(nurl);
- Curl_close(doh);
+ Curl_close(&doh);
return result;
}
@@ -341,6 +387,7 @@ Curl_addrinfo *Curl_doh(struct connectdata *conn,
{
struct Curl_easy *data = conn->data;
CURLcode result = CURLE_OK;
+ int slot;
*waitp = TRUE; /* this never returns synchronously */
(void)conn;
(void)hostname;
@@ -359,8 +406,8 @@ Curl_addrinfo *Curl_doh(struct connectdata *conn,
if(conn->ip_version != CURL_IPRESOLVE_V6) {
/* create IPv4 DOH request */
- result = dohprobe(data, &data->req.doh.probe[0], DNS_TYPE_A,
- hostname, data->set.str[STRING_DOH],
+ result = dohprobe(data, &data->req.doh.probe[DOH_PROBE_SLOT_IPADDR_V4],
+ DNS_TYPE_A, hostname, data->set.str[STRING_DOH],
data->multi, data->req.doh.headers);
if(result)
goto error;
@@ -369,8 +416,8 @@ Curl_addrinfo *Curl_doh(struct connectdata *conn,
if(conn->ip_version != CURL_IPRESOLVE_V4) {
/* create IPv6 DOH request */
- result = dohprobe(data, &data->req.doh.probe[1], DNS_TYPE_AAAA,
- hostname, data->set.str[STRING_DOH],
+ result = dohprobe(data, &data->req.doh.probe[DOH_PROBE_SLOT_IPADDR_V6],
+ DNS_TYPE_AAAA, hostname, data->set.str[STRING_DOH],
data->multi, data->req.doh.headers);
if(result)
goto error;
@@ -381,10 +428,9 @@ Curl_addrinfo *Curl_doh(struct connectdata *conn,
error:
curl_slist_free_all(data->req.doh.headers);
data->req.doh.headers = NULL;
- curl_easy_cleanup(data->req.doh.probe[0].easy);
- data->req.doh.probe[0].easy = NULL;
- curl_easy_cleanup(data->req.doh.probe[1].easy);
- data->req.doh.probe[1].easy = NULL;
+ for(slot = 0; slot < DOH_PROBE_SLOTS; slot++) {
+ Curl_close(&data->req.doh.probe[slot].easy);
+ }
return NULL;
}
@@ -419,8 +465,14 @@ static unsigned short get16bit(unsigned char *doh, int index)
static unsigned int get32bit(unsigned char *doh, int index)
{
- return (doh[index] << 24) | (doh[index + 1] << 16) |
- (doh[index + 2] << 8) | doh[index + 3];
+ /* make clang and gcc optimize this to bswap by incrementing
+ the pointer first. */
+ doh += index;
+
+ /* avoid undefined behaviour by casting to unsigned before shifting
+ 24 bits, possibly into the sign bit. codegen is same, but
+ ub sanitizer won't be upset */
+ return ( (unsigned)doh[0] << 24) | (doh[1] << 16) |(doh[2] << 8) | doh[3];
}
static DOHcode store_a(unsigned char *doh, int index, struct dohentry *d)
@@ -496,7 +548,7 @@ static DOHcode store_cname(unsigned char *doh,
if((index + 1) >= dohlen)
return DOH_DNS_OUT_OF_RANGE;
- /* move to the the new index */
+ /* move to the new index */
newpos = (length & 0x3f) << 8 | doh[index + 1];
index = newpos;
continue;
@@ -561,6 +613,9 @@ static DOHcode rdata(unsigned char *doh,
if(rc)
return rc;
break;
+ case DNS_TYPE_DNAME:
+ /* explicit for clarity; just skip; rely on synthesized CNAME */
+ break;
default:
/* unsupported type, just skip it */
break;
@@ -622,8 +677,10 @@ UNITTEST DOHcode doh_decode(unsigned char *doh,
return DOH_DNS_OUT_OF_RANGE;
type = get16bit(doh, index);
- if((type != DNS_TYPE_CNAME) && (type != dnstype))
- /* Not the same type as was asked for nor CNAME */
+ if((type != DNS_TYPE_CNAME) /* may be synthesized from DNAME */
+ && (type != DNS_TYPE_DNAME) /* if present, accept and ignore */
+ && (type != dnstype))
+ /* Not the same type as was asked for nor CNAME nor DNAME */
return DOH_DNS_UNEXPECTED_TYPE;
index += 2;
@@ -884,47 +941,43 @@ UNITTEST void de_cleanup(struct dohentry *d)
CURLcode Curl_doh_is_resolved(struct connectdata *conn,
struct Curl_dns_entry **dnsp)
{
+ CURLcode result;
struct Curl_easy *data = conn->data;
*dnsp = NULL; /* defaults to no response */
- if(!data->req.doh.probe[0].easy && !data->req.doh.probe[1].easy) {
+ if(!data->req.doh.probe[DOH_PROBE_SLOT_IPADDR_V4].easy &&
+ !data->req.doh.probe[DOH_PROBE_SLOT_IPADDR_V6].easy) {
failf(data, "Could not DOH-resolve: %s", conn->async.hostname);
return conn->bits.proxy?CURLE_COULDNT_RESOLVE_PROXY:
CURLE_COULDNT_RESOLVE_HOST;
}
else if(!data->req.doh.pending) {
- DOHcode rc;
- DOHcode rc2;
+ DOHcode rc[DOH_PROBE_SLOTS];
struct dohentry de;
+ int slot;
/* remove DOH handles from multi handle and close them */
- curl_multi_remove_handle(data->multi, data->req.doh.probe[0].easy);
- Curl_close(data->req.doh.probe[0].easy);
- curl_multi_remove_handle(data->multi, data->req.doh.probe[1].easy);
- Curl_close(data->req.doh.probe[1].easy);
-
+ for(slot = 0; slot < DOH_PROBE_SLOTS; slot++) {
+ curl_multi_remove_handle(data->multi, data->req.doh.probe[slot].easy);
+ Curl_close(&data->req.doh.probe[slot].easy);
+ }
/* parse the responses, create the struct and return it! */
init_dohentry(&de);
- rc = doh_decode(data->req.doh.probe[0].serverdoh.memory,
- data->req.doh.probe[0].serverdoh.size,
- data->req.doh.probe[0].dnstype,
- &de);
- free(data->req.doh.probe[0].serverdoh.memory);
- if(rc) {
- infof(data, "DOH: %s type %s for %s\n", doh_strerror(rc),
- type2name(data->req.doh.probe[0].dnstype),
- data->req.doh.host);
- }
- rc2 = doh_decode(data->req.doh.probe[1].serverdoh.memory,
- data->req.doh.probe[1].serverdoh.size,
- data->req.doh.probe[1].dnstype,
- &de);
- free(data->req.doh.probe[1].serverdoh.memory);
- if(rc2) {
- infof(data, "DOH: %s type %s for %s\n", doh_strerror(rc2),
- type2name(data->req.doh.probe[1].dnstype),
- data->req.doh.host);
- }
- if(!rc || !rc2) {
+ for(slot = 0; slot < DOH_PROBE_SLOTS; slot++) {
+ rc[slot] = doh_decode(data->req.doh.probe[slot].serverdoh.memory,
+ data->req.doh.probe[slot].serverdoh.size,
+ data->req.doh.probe[slot].dnstype,
+ &de);
+ Curl_safefree(data->req.doh.probe[slot].serverdoh.memory);
+ if(rc[slot]) {
+ infof(data, "DOH: %s type %s for %s\n", doh_strerror(rc[slot]),
+ type2name(data->req.doh.probe[slot].dnstype),
+ data->req.doh.host);
+ }
+ } /* next slot */
+
+ result = CURLE_COULDNT_RESOLVE_HOST; /* until we know better */
+ if(!rc[DOH_PROBE_SLOT_IPADDR_V4] || !rc[DOH_PROBE_SLOT_IPADDR_V6]) {
+ /* we have an address, of one kind or other */
struct Curl_dns_entry *dns;
struct Curl_addrinfo *ai;
@@ -946,21 +999,26 @@ CURLcode Curl_doh_is_resolved(struct connectdata *conn,
if(data->share)
Curl_share_unlock(data, CURL_LOCK_DATA_DNS);
- de_cleanup(&de);
- if(!dns)
+ if(!dns) {
/* returned failure, bail out nicely */
Curl_freeaddrinfo(ai);
+ }
else {
conn->async.dns = dns;
*dnsp = dns;
- return CURLE_OK;
+ result = CURLE_OK; /* address resolution OK */
}
- }
+ } /* address processing done */
+
+ /* Now process any build-specific attributes retrieved from DNS */
+
+ /* All done */
de_cleanup(&de);
+ return result;
- return CURLE_COULDNT_RESOLVE_HOST;
- }
+ } /* !data->req.doh.pending */
+ /* else wait for pending DOH transactions to complete */
return CURLE_OK;
}
diff --git a/Utilities/cmcurl/lib/doh.h b/Utilities/cmcurl/lib/doh.h
index 34bfa6f..fc053ed 100644
--- a/Utilities/cmcurl/lib/doh.h
+++ b/Utilities/cmcurl/lib/doh.h
@@ -40,8 +40,7 @@ Curl_addrinfo *Curl_doh(struct connectdata *conn,
CURLcode Curl_doh_is_resolved(struct connectdata *conn,
struct Curl_dns_entry **dns);
-int Curl_doh_getsock(struct connectdata *conn, curl_socket_t *socks,
- int numsocks);
+int Curl_doh_getsock(struct connectdata *conn, curl_socket_t *socks);
typedef enum {
DOH_OK,
@@ -56,14 +55,16 @@ typedef enum {
DOH_DNS_UNEXPECTED_TYPE, /* 9 */
DOH_DNS_UNEXPECTED_CLASS, /* 10 */
DOH_NO_CONTENT, /* 11 */
- DOH_DNS_BAD_ID /* 12 */
+ DOH_DNS_BAD_ID, /* 12 */
+ DOH_DNS_NAME_TOO_LONG /* 13 */
} DOHcode;
typedef enum {
DNS_TYPE_A = 1,
DNS_TYPE_NS = 2,
DNS_TYPE_CNAME = 5,
- DNS_TYPE_AAAA = 28
+ DNS_TYPE_AAAA = 28,
+ DNS_TYPE_DNAME = 39 /* RFC6672 */
} DNStype;
#define DOH_MAX_ADDR 24
diff --git a/Utilities/cmcurl/lib/dotdot.c b/Utilities/cmcurl/lib/dotdot.c
index 2c6177a..fe4f497 100644
--- a/Utilities/cmcurl/lib/dotdot.c
+++ b/Utilities/cmcurl/lib/dotdot.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/dotdot.h b/Utilities/cmcurl/lib/dotdot.h
index 125af43..f70b1db 100644
--- a/Utilities/cmcurl/lib/dotdot.h
+++ b/Utilities/cmcurl/lib/dotdot.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/easy.c b/Utilities/cmcurl/lib/easy.c
index 4a6f965..1a69127 100644
--- a/Utilities/cmcurl/lib/easy.c
+++ b/Utilities/cmcurl/lib/easy.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -72,10 +72,11 @@
#include "warnless.h"
#include "multiif.h"
#include "sigpipe.h"
-#include "ssh.h"
+#include "vssh/ssh.h"
#include "setopt.h"
#include "http_digest.h"
#include "system_win32.h"
+#include "http2.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
@@ -157,20 +158,20 @@ static CURLcode global_init(long flags, bool memoryfuncs)
if(!Curl_ssl_init()) {
DEBUGF(fprintf(stderr, "Error: Curl_ssl_init failed\n"));
- return CURLE_FAILED_INIT;
+ goto fail;
}
#ifdef WIN32
if(Curl_win32_init(flags)) {
DEBUGF(fprintf(stderr, "Error: win32_init failed\n"));
- return CURLE_FAILED_INIT;
+ goto fail;
}
#endif
#ifdef __AMIGA__
if(!Curl_amiga_init()) {
DEBUGF(fprintf(stderr, "Error: Curl_amiga_init failed\n"));
- return CURLE_FAILED_INIT;
+ goto fail;
}
#endif
@@ -182,33 +183,31 @@ static CURLcode global_init(long flags, bool memoryfuncs)
if(Curl_resolver_global_init()) {
DEBUGF(fprintf(stderr, "Error: resolver_global_init failed\n"));
- return CURLE_FAILED_INIT;
+ goto fail;
}
- (void)Curl_ipv6works();
-
-#if defined(USE_LIBSSH2) && defined(HAVE_LIBSSH2_INIT)
- if(libssh2_init(0)) {
- DEBUGF(fprintf(stderr, "Error: libssh2_init failed\n"));
- return CURLE_FAILED_INIT;
+#if defined(USE_SSH)
+ if(Curl_ssh_init()) {
+ goto fail;
}
#endif
-#if defined(USE_LIBSSH)
- if(ssh_init()) {
- DEBUGF(fprintf(stderr, "Error: libssh_init failed\n"));
+#ifdef USE_WOLFSSH
+ if(WS_SUCCESS != wolfSSH_Init()) {
+ DEBUGF(fprintf(stderr, "Error: wolfSSH_Init failed\n"));
return CURLE_FAILED_INIT;
}
#endif
- if(flags & CURL_GLOBAL_ACK_EINTR)
- Curl_ack_eintr = 1;
-
init_flags = flags;
Curl_version_init();
return CURLE_OK;
+
+ fail:
+ initialized--; /* undo the increase */
+ return CURLE_FAILED_INIT;
}
@@ -274,12 +273,10 @@ void curl_global_cleanup(void)
Curl_amiga_cleanup();
-#if defined(USE_LIBSSH2) && defined(HAVE_LIBSSH2_EXIT)
- (void)libssh2_exit();
-#endif
+ Curl_ssh_cleanup();
-#if defined(USE_LIBSSH)
- (void)ssh_finalize();
+#ifdef USE_WOLFSSH
+ (void)wolfSSH_Cleanup();
#endif
init_flags = 0;
@@ -602,27 +599,11 @@ static CURLcode easy_transfer(struct Curl_multi *multi)
while(!done && !mcode) {
int still_running = 0;
- bool gotsocket = FALSE;
-
- mcode = Curl_multi_wait(multi, NULL, 0, 1000, NULL, &gotsocket);
-
- if(!mcode) {
- if(!gotsocket) {
- long sleep_ms;
-
- /* If it returns without any filedescriptor instantly, we need to
- avoid busy-looping during periods where it has nothing particular
- to wait for */
- curl_multi_timeout(multi, &sleep_ms);
- if(sleep_ms) {
- if(sleep_ms > 1000)
- sleep_ms = 1000;
- Curl_wait_ms((int)sleep_ms);
- }
- }
+ mcode = curl_multi_poll(multi, NULL, 0, 1000, NULL);
+
+ if(!mcode)
mcode = curl_multi_perform(multi, &still_running);
- }
/* only read 'still_running' if curl_multi_perform() return OK */
if(!mcode && !still_running) {
@@ -710,10 +691,6 @@ static CURLcode easy_perform(struct Curl_easy *data, bool events)
sigpipe_ignore(data, &pipe_st);
- /* assign this after curl_multi_add_handle() since that function checks for
- it and rejects this handle otherwise */
- data->multi = multi;
-
/* run the transfer */
result = events ? easy_events(multi) : easy_transfer(multi);
@@ -761,7 +738,7 @@ void curl_easy_cleanup(struct Curl_easy *data)
return;
sigpipe_ignore(data, &pipe_st);
- Curl_close(data);
+ Curl_close(&data);
sigpipe_restore(&pipe_st);
}
@@ -942,6 +919,8 @@ struct Curl_easy *curl_easy_duphandle(struct Curl_easy *data)
*/
void curl_easy_reset(struct Curl_easy *data)
{
+ long old_buffer_size = data->set.buffer_size;
+
Curl_free_request_state(data);
/* zero out UserDefined data: */
@@ -965,6 +944,18 @@ void curl_easy_reset(struct Curl_easy *data)
#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_CRYPTO_AUTH)
Curl_http_auth_cleanup_digest(data);
#endif
+
+ /* resize receive buffer */
+ if(old_buffer_size != data->set.buffer_size) {
+ char *newbuff = realloc(data->state.buffer, data->set.buffer_size + 1);
+ if(!newbuff) {
+ DEBUGF(fprintf(stderr, "Error: realloc of buffer failed\n"));
+ /* nothing we can do here except use the old size */
+ data->set.buffer_size = old_buffer_size;
+ }
+ else
+ data->state.buffer = newbuff;
+ }
}
/*
@@ -995,55 +986,63 @@ CURLcode curl_easy_pause(struct Curl_easy *data, int action)
/* put it back in the keepon */
k->keepon = newstate;
- if(!(newstate & KEEP_RECV_PAUSE) && data->state.tempcount) {
- /* there are buffers for sending that can be delivered as the receive
- pausing is lifted! */
- unsigned int i;
- unsigned int count = data->state.tempcount;
- struct tempbuf writebuf[3]; /* there can only be three */
- struct connectdata *conn = data->conn;
- struct Curl_easy *saved_data = NULL;
-
- /* copy the structs to allow for immediate re-pausing */
- for(i = 0; i < data->state.tempcount; i++) {
- writebuf[i] = data->state.tempwrite[i];
- data->state.tempwrite[i].buf = NULL;
- }
- data->state.tempcount = 0;
+ if(!(newstate & KEEP_RECV_PAUSE)) {
+ Curl_http2_stream_pause(data, FALSE);
+
+ if(data->state.tempcount) {
+ /* there are buffers for sending that can be delivered as the receive
+ pausing is lifted! */
+ unsigned int i;
+ unsigned int count = data->state.tempcount;
+ struct tempbuf writebuf[3]; /* there can only be three */
+ struct connectdata *conn = data->conn;
+ struct Curl_easy *saved_data = NULL;
+
+ /* copy the structs to allow for immediate re-pausing */
+ for(i = 0; i < data->state.tempcount; i++) {
+ writebuf[i] = data->state.tempwrite[i];
+ data->state.tempwrite[i].buf = NULL;
+ }
+ data->state.tempcount = 0;
- /* set the connection's current owner */
- if(conn->data != data) {
- saved_data = conn->data;
- conn->data = data;
- }
+ /* set the connection's current owner */
+ if(conn->data != data) {
+ saved_data = conn->data;
+ conn->data = data;
+ }
- for(i = 0; i < count; i++) {
- /* even if one function returns error, this loops through and frees all
- buffers */
- if(!result)
- result = Curl_client_write(conn, writebuf[i].type, writebuf[i].buf,
- writebuf[i].len);
- free(writebuf[i].buf);
- }
+ for(i = 0; i < count; i++) {
+ /* even if one function returns error, this loops through and frees
+ all buffers */
+ if(!result)
+ result = Curl_client_write(conn, writebuf[i].type, writebuf[i].buf,
+ writebuf[i].len);
+ free(writebuf[i].buf);
+ }
- /* recover previous owner of the connection */
- if(saved_data)
- conn->data = saved_data;
+ /* recover previous owner of the connection */
+ if(saved_data)
+ conn->data = saved_data;
- if(result)
- return result;
+ if(result)
+ return result;
+ }
}
/* if there's no error and we're not pausing both directions, we want
to have this handle checked soon */
- if(!result &&
- ((newstate&(KEEP_RECV_PAUSE|KEEP_SEND_PAUSE)) !=
- (KEEP_RECV_PAUSE|KEEP_SEND_PAUSE)) )
+ if((newstate & (KEEP_RECV_PAUSE|KEEP_SEND_PAUSE)) !=
+ (KEEP_RECV_PAUSE|KEEP_SEND_PAUSE)) {
+ data->state.drain++;
Curl_expire(data, 0, EXPIRE_RUN_NOW); /* get this handle going again */
+ if(data->multi)
+ Curl_update_timer(data->multi);
+ }
- /* This transfer may have been moved in or out of the bundle, update
- the corresponding socket callback, if used */
- Curl_updatesocket(data);
+ if(!data->state.done)
+ /* This transfer may have been moved in or out of the bundle, update the
+ corresponding socket callback, if used */
+ Curl_updatesocket(data);
return result;
}
@@ -1138,6 +1137,35 @@ CURLcode curl_easy_send(struct Curl_easy *data, const void *buffer,
}
/*
+ * Wrapper to call functions in Curl_conncache_foreach()
+ *
+ * Returns always 0.
+ */
+static int conn_upkeep(struct connectdata *conn,
+ void *param)
+{
+ /* Param is unused. */
+ (void)param;
+
+ if(conn->handler->connection_check) {
+ /* Do a protocol-specific keepalive check on the connection. */
+ conn->handler->connection_check(conn, CONNCHECK_KEEPALIVE);
+ }
+
+ return 0; /* continue iteration */
+}
+
+static CURLcode upkeep(struct conncache *conn_cache, void *data)
+{
+ /* Loop over every connection and make connection alive. */
+ Curl_conncache_foreach(data,
+ conn_cache,
+ data,
+ conn_upkeep);
+ return CURLE_OK;
+}
+
+/*
* Performs connection upkeep for the given session handle.
*/
CURLcode curl_easy_upkeep(struct Curl_easy *data)
@@ -1148,7 +1176,7 @@ CURLcode curl_easy_upkeep(struct Curl_easy *data)
if(data->multi_easy) {
/* Use the common function to keep connections alive. */
- return Curl_upkeep(&data->multi_easy->conn_cache, data);
+ return upkeep(&data->multi_easy->conn_cache, data);
}
else {
/* No connections, so just return success */
diff --git a/Utilities/cmcurl/lib/easyif.h b/Utilities/cmcurl/lib/easyif.h
index 6ba7e54..8a309c5 100644
--- a/Utilities/cmcurl/lib/easyif.h
+++ b/Utilities/cmcurl/lib/easyif.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/file.c b/Utilities/cmcurl/lib/file.c
index d349cd9..2492370 100644
--- a/Utilities/cmcurl/lib/file.c
+++ b/Utilities/cmcurl/lib/file.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -136,7 +136,7 @@ static CURLcode file_connect(struct connectdata *conn, bool *done)
struct Curl_easy *data = conn->data;
char *real_path;
struct FILEPROTO *file = data->req.protop;
- int fd;
+ int fd = -1;
#ifdef DOS_FILESYSTEM
size_t i;
char *actual_path;
@@ -181,7 +181,9 @@ static CURLcode file_connect(struct connectdata *conn, bool *done)
return CURLE_URL_MALFORMAT;
}
- fd = open_readonly(actual_path, O_RDONLY|O_BINARY);
+ if(strncmp("\\\\", actual_path, 2))
+ /* refuse to open path that starts with two backslashes */
+ fd = open_readonly(actual_path, O_RDONLY|O_BINARY);
file->path = actual_path;
#else
if(memchr(real_path, 0, real_path_len)) {
diff --git a/Utilities/cmcurl/lib/file.h b/Utilities/cmcurl/lib/file.h
index 20828ad..f6b74a7 100644
--- a/Utilities/cmcurl/lib/file.h
+++ b/Utilities/cmcurl/lib/file.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/formdata.c b/Utilities/cmcurl/lib/formdata.c
index 429d479..50a37e0 100644
--- a/Utilities/cmcurl/lib/formdata.c
+++ b/Utilities/cmcurl/lib/formdata.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/ftp.c b/Utilities/cmcurl/lib/ftp.c
index 53510f8..7292e01 100644
--- a/Utilities/cmcurl/lib/ftp.c
+++ b/Utilities/cmcurl/lib/ftp.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -55,7 +55,6 @@
#include "transfer.h"
#include "escape.h"
#include "http.h" /* for HTTP proxy tunnel stuff */
-#include "socks.h"
#include "ftp.h"
#include "fileinfo.h"
#include "ftplistparser.h"
@@ -78,6 +77,7 @@
#include "warnless.h"
#include "http_proxy.h"
#include "non-ascii.h"
+#include "socks.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
#include "curl_memory.h"
@@ -132,10 +132,8 @@ static CURLcode ftp_connect(struct connectdata *conn, bool *done);
static CURLcode ftp_disconnect(struct connectdata *conn, bool dead_connection);
static CURLcode ftp_do_more(struct connectdata *conn, int *completed);
static CURLcode ftp_multi_statemach(struct connectdata *conn, bool *done);
-static int ftp_getsock(struct connectdata *conn, curl_socket_t *socks,
- int numsocks);
-static int ftp_domore_getsock(struct connectdata *conn, curl_socket_t *socks,
- int numsocks);
+static int ftp_getsock(struct connectdata *conn, curl_socket_t *socks);
+static int ftp_domore_getsock(struct connectdata *conn, curl_socket_t *socks);
static CURLcode ftp_doing(struct connectdata *conn,
bool *dophase_done);
static CURLcode ftp_setup_connection(struct connectdata * conn);
@@ -255,18 +253,6 @@ static void freedirs(struct ftp_conn *ftpc)
Curl_safefree(ftpc->newhost);
}
-/* Returns non-zero if the given string contains CR (\r) or LF (\n),
- which are not allowed within RFC 959 <string>.
- Note: The input string is in the client's encoding which might
- not be ASCII, so escape sequences \r & \n must be used instead
- of hex values 0x0d & 0x0a.
-*/
-static bool isBadFtpString(const char *string)
-{
- return ((NULL != strchr(string, '\r')) ||
- (NULL != strchr(string, '\n'))) ? TRUE : FALSE;
-}
-
/***********************************************************************
*
* AcceptServerConnect()
@@ -305,7 +291,7 @@ static CURLcode AcceptServerConnect(struct connectdata *conn)
conn->sock[SECONDARYSOCKET] = s;
(void)curlx_nonblock(s, TRUE); /* enable non-blocking */
- conn->sock_accepted[SECONDARYSOCKET] = TRUE;
+ conn->sock_accepted = TRUE;
if(data->set.fsockopt) {
int error = 0;
@@ -382,7 +368,7 @@ static CURLcode ReceivedServerConnect(struct connectdata *conn, bool *received)
struct ftp_conn *ftpc = &conn->proto.ftpc;
struct pingpong *pp = &ftpc->pp;
int result;
- time_t timeout_ms;
+ timediff_t timeout_ms;
ssize_t nread;
int ftpcode;
@@ -493,7 +479,7 @@ static CURLcode InitiateTransfer(struct connectdata *conn)
static CURLcode AllowServerConnect(struct connectdata *conn, bool *connected)
{
struct Curl_easy *data = conn->data;
- time_t timeout_ms;
+ timediff_t timeout_ms;
CURLcode result = CURLE_OK;
*connected = FALSE;
@@ -525,7 +511,7 @@ static CURLcode AllowServerConnect(struct connectdata *conn, bool *connected)
}
else {
/* Add timeout to multi handle and break out of the loop */
- if(!result && *connected == FALSE) {
+ if(*connected == FALSE) {
Curl_expire(data, data->set.accepttimeout > 0 ?
data->set.accepttimeout: DEFAULT_ACCEPT_TIMEOUT, 0);
}
@@ -565,10 +551,8 @@ static CURLcode ftp_readresp(curl_socket_t sockfd,
#ifdef HAVE_GSSAPI
char * const buf = data->state.buffer;
#endif
- CURLcode result = CURLE_OK;
int code;
-
- result = Curl_pp_readresp(sockfd, pp, &code, size);
+ CURLcode result = Curl_pp_readresp(sockfd, pp, &code, size);
#if defined(HAVE_GSSAPI)
/* handle the security-oriented responses 6xx ***/
@@ -789,9 +773,8 @@ static void _state(struct connectdata *conn,
static CURLcode ftp_state_user(struct connectdata *conn)
{
CURLcode result;
- struct FTP *ftp = conn->data->req.protop;
/* send USER */
- PPSENDF(&conn->proto.ftpc.pp, "USER %s", ftp->user?ftp->user:"");
+ PPSENDF(&conn->proto.ftpc.pp, "USER %s", conn->user?conn->user:"");
state(conn, FTP_USER);
conn->data->state.ftp_trying_alternative = FALSE;
@@ -812,26 +795,24 @@ static CURLcode ftp_state_pwd(struct connectdata *conn)
/* For the FTP "protocol connect" and "doing" phases only */
static int ftp_getsock(struct connectdata *conn,
- curl_socket_t *socks,
- int numsocks)
+ curl_socket_t *socks)
{
- return Curl_pp_getsock(&conn->proto.ftpc.pp, socks, numsocks);
+ return Curl_pp_getsock(&conn->proto.ftpc.pp, socks);
}
/* For the FTP "DO_MORE" phase only */
-static int ftp_domore_getsock(struct connectdata *conn, curl_socket_t *socks,
- int numsocks)
+static int ftp_domore_getsock(struct connectdata *conn, curl_socket_t *socks)
{
struct ftp_conn *ftpc = &conn->proto.ftpc;
- if(!numsocks)
- return GETSOCK_BLANK;
-
/* When in DO_MORE state, we could be either waiting for us to connect to a
* remote site, or we could wait for that site to connect to us. Or just
* handle ordinary commands.
*/
+ if(SOCKS_STATE(conn->cnnct.state))
+ return Curl_SOCKS_getsock(conn, socks, SECONDARYSOCKET);
+
if(FTP_STOP == ftpc->state) {
int bits = GETSOCK_READSOCK(0);
@@ -858,7 +839,7 @@ static int ftp_domore_getsock(struct connectdata *conn, curl_socket_t *socks,
return bits;
}
- return Curl_pp_getsock(&conn->proto.ftpc.pp, socks, numsocks);
+ return Curl_pp_getsock(&conn->proto.ftpc.pp, socks);
}
/* This is called after the FTP_QUOTE state is passed.
@@ -876,6 +857,10 @@ static CURLcode ftp_state_cwd(struct connectdata *conn)
/* already done and fine */
result = ftp_state_mdtm(conn);
else {
+ /* FTPFILE_NOCWD with full path: expect ftpc->cwddone! */
+ DEBUGASSERT((conn->data->set.ftp_filemethod != FTPFILE_NOCWD) ||
+ !(ftpc->dirdepth && ftpc->dirs[0][0] == '/'));
+
ftpc->count2 = 0; /* count2 counts failed CWDs */
/* count3 is set to allow a MKD to fail once. In the case when first CWD
@@ -883,10 +868,9 @@ static CURLcode ftp_state_cwd(struct connectdata *conn)
dir) this then allows for a second try to CWD to it */
ftpc->count3 = (conn->data->set.ftp_create_missing_dirs == 2)?1:0;
- if((conn->data->set.ftp_filemethod == FTPFILE_NOCWD) && !ftpc->cwdcount)
- /* No CWD necessary */
- result = ftp_state_mdtm(conn);
- else if(conn->bits.reuse && ftpc->entrypath) {
+ if(conn->bits.reuse && ftpc->entrypath &&
+ /* no need to go to entrypath when we have an absolute path */
+ !(ftpc->dirdepth && ftpc->dirs[0][0] == '/')) {
/* This is a re-used connection. Since we change directory to where the
transfer is taking place, we must first get back to the original dir
where we ended up after login: */
@@ -926,7 +910,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
struct ftp_conn *ftpc = &conn->proto.ftpc;
struct Curl_easy *data = conn->data;
curl_socket_t portsock = CURL_SOCKET_BAD;
- char myhost[256] = "";
+ char myhost[MAX_IPADR_LEN + 1] = "";
struct Curl_sockaddr_storage ss;
Curl_addrinfo *res, *ai;
@@ -937,9 +921,8 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
#ifdef ENABLE_IPV6
struct sockaddr_in6 * const sa6 = (void *)sa;
#endif
- char tmp[1024];
static const char mode[][5] = { "EPRT", "PORT" };
- int rc;
+ enum resolve_t rc;
int error;
char *host = NULL;
char *string_ftpport = data->set.str[STRING_FTPPORT];
@@ -1252,8 +1235,10 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
break;
}
if(PORT == fcmd) {
+ /* large enough for [IP address],[num],[num] */
+ char target[sizeof(myhost) + 20];
char *source = myhost;
- char *dest = tmp;
+ char *dest = target;
/* translate x.x.x.x to x,x,x,x */
while(source && *source) {
@@ -1267,7 +1252,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
*dest = 0;
msnprintf(dest, 20, ",%d,%d", (int)(port>>8), (int)(port&0xff));
- result = Curl_pp_sendf(&ftpc->pp, "%s %s", mode[fcmd], tmp);
+ result = Curl_pp_sendf(&ftpc->pp, "%s %s", mode[fcmd], target);
if(result) {
failf(data, "Failure sending PORT command: %s",
curl_easy_strerror(result));
@@ -1445,31 +1430,37 @@ static CURLcode ftp_state_list(struct connectdata *conn)
servers either... */
/*
- if FTPFILE_NOCWD was specified, we are currently in
- the user's home directory, so we should add the path
+ if FTPFILE_NOCWD was specified, we should add the path
as argument for the LIST / NLST / or custom command.
Whether the server will support this, is uncertain.
The other ftp_filemethods will CWD into dir/dir/ first and
then just do LIST (in that case: nothing to do here)
*/
- char *cmd, *lstArg, *slashPos;
- const char *inpath = ftp->path;
-
- lstArg = NULL;
- if((data->set.ftp_filemethod == FTPFILE_NOCWD) &&
- inpath && inpath[0] && strchr(inpath, '/')) {
- size_t n = strlen(inpath);
-
- /* Check if path does not end with /, as then we cut off the file part */
- if(inpath[n - 1] != '/') {
- /* chop off the file part if format is dir/dir/file */
- slashPos = strrchr(inpath, '/');
- n = slashPos - inpath;
- }
- result = Curl_urldecode(data, inpath, n, &lstArg, NULL, TRUE);
+ char *lstArg = NULL;
+ char *cmd;
+
+ if((data->set.ftp_filemethod == FTPFILE_NOCWD) && ftp->path) {
+ /* url-decode before evaluation: e.g. paths starting/ending with %2f */
+ const char *slashPos = NULL;
+ char *rawPath = NULL;
+ result = Curl_urldecode(data, ftp->path, 0, &rawPath, NULL, TRUE);
if(result)
return result;
+
+ slashPos = strrchr(rawPath, '/');
+ if(slashPos) {
+ /* chop off the file part if format is dir/file otherwise remove
+ the trailing slash for dir/dir/ except for absolute path / */
+ size_t n = slashPos - rawPath;
+ if(n == 0)
+ ++n;
+
+ lstArg = rawPath;
+ lstArg[n] = '\0';
+ }
+ else
+ free(rawPath);
}
cmd = aprintf("%s%s%s",
@@ -1478,15 +1469,12 @@ static CURLcode ftp_state_list(struct connectdata *conn)
(data->set.ftp_list_only?"NLST":"LIST"),
lstArg? " ": "",
lstArg? lstArg: "");
+ free(lstArg);
- if(!cmd) {
- free(lstArg);
+ if(!cmd)
return CURLE_OUT_OF_MEMORY;
- }
result = Curl_pp_sendf(&conn->proto.ftpc.pp, "%s", cmd);
-
- free(lstArg);
free(cmd);
if(result)
@@ -1499,24 +1487,14 @@ static CURLcode ftp_state_list(struct connectdata *conn)
static CURLcode ftp_state_retr_prequote(struct connectdata *conn)
{
- CURLcode result = CURLE_OK;
-
/* We've sent the TYPE, now we must send the list of prequote strings */
-
- result = ftp_state_quote(conn, TRUE, FTP_RETR_PREQUOTE);
-
- return result;
+ return ftp_state_quote(conn, TRUE, FTP_RETR_PREQUOTE);
}
static CURLcode ftp_state_stor_prequote(struct connectdata *conn)
{
- CURLcode result = CURLE_OK;
-
/* We've sent the TYPE, now we must send the list of prequote strings */
-
- result = ftp_state_quote(conn, TRUE, FTP_STOR_PREQUOTE);
-
- return result;
+ return ftp_state_quote(conn, TRUE, FTP_STOR_PREQUOTE);
}
static CURLcode ftp_state_type(struct connectdata *conn)
@@ -1819,7 +1797,7 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn,
CURLcode result;
struct Curl_easy *data = conn->data;
struct Curl_dns_entry *addr = NULL;
- int rc;
+ enum resolve_t rc;
unsigned short connectport; /* the local port connect() should use! */
char *str = &data->state.buffer[4]; /* start on the first letter */
@@ -2052,13 +2030,11 @@ static CURLcode ftp_state_mdtm_resp(struct connectdata *conn,
&year, &month, &day, &hour, &minute, &second)) {
/* we have a time, reformat it */
char timebuf[24];
- time_t secs = time(NULL);
-
msnprintf(timebuf, sizeof(timebuf),
"%04d%02d%02d %02d:%02d:%02d GMT",
year, month, day, hour, minute, second);
/* now, convert this into a time() value: */
- data->info.filetime = curl_getdate(timebuf, &secs);
+ data->info.filetime = Curl_getdate_capped(timebuf);
}
#ifdef CURL_FTP_HTTPSTYLE_HEAD
@@ -2261,9 +2237,25 @@ static CURLcode ftp_state_size_resp(struct connectdata *conn,
char *buf = data->state.buffer;
/* get the size from the ascii string: */
- if(ftpcode == 213)
+ if(ftpcode == 213) {
+ /* To allow servers to prepend "rubbish" in the response string, we scan
+ for all the digits at the end of the response and parse only those as a
+ number. */
+ char *start = &buf[4];
+ char *fdigit = strchr(start, '\r');
+ if(fdigit) {
+ do
+ fdigit--;
+ while(ISDIGIT(*fdigit) && (fdigit > start));
+ if(!ISDIGIT(*fdigit))
+ fdigit++;
+ }
+ else
+ fdigit = start;
/* ignores parsing errors, which will make the size remain unknown */
- (void)curlx_strtoofft(buf + 4, NULL, 0, &filesize);
+ (void)curlx_strtoofft(fdigit, NULL, 0, &filesize);
+
+ }
if(instate == FTP_SIZE) {
#ifdef CURL_FTP_HTTPSTYLE_HEAD
@@ -2527,7 +2519,6 @@ static CURLcode ftp_state_user_resp(struct connectdata *conn,
{
CURLcode result = CURLE_OK;
struct Curl_easy *data = conn->data;
- struct FTP *ftp = data->req.protop;
struct ftp_conn *ftpc = &conn->proto.ftpc;
(void)instate; /* no use for this yet */
@@ -2535,7 +2526,7 @@ static CURLcode ftp_state_user_resp(struct connectdata *conn,
if((ftpcode == 331) && (ftpc->state == FTP_USER)) {
/* 331 Password required for ...
(the server requires to send the user's password too) */
- PPSENDF(&ftpc->pp, "PASS %s", ftp->passwd?ftp->passwd:"");
+ PPSENDF(&ftpc->pp, "PASS %s", conn->passwd?conn->passwd:"");
state(conn, FTP_PASS);
}
else if(ftpcode/100 == 2) {
@@ -3134,7 +3125,8 @@ static CURLcode ftp_done(struct connectdata *conn, CURLcode status,
ssize_t nread;
int ftpcode;
CURLcode result = CURLE_OK;
- char *path = NULL;
+ char *rawPath = NULL;
+ size_t pathLen = 0;
if(!ftp)
return CURLE_OK;
@@ -3172,9 +3164,6 @@ static CURLcode ftp_done(struct connectdata *conn, CURLcode status,
break;
}
- /* now store a copy of the directory we are in */
- free(ftpc->prevpath);
-
if(data->state.wildcardmatch) {
if(data->set.chunk_end && ftpc->file) {
Curl_set_in_callback(data, true);
@@ -3185,41 +3174,41 @@ static CURLcode ftp_done(struct connectdata *conn, CURLcode status,
}
if(!result)
- /* get the "raw" path */
- result = Curl_urldecode(data, ftp->path, 0, &path, NULL, TRUE);
+ /* get the url-decoded "raw" path */
+ result = Curl_urldecode(data, ftp->path, 0, &rawPath, &pathLen, TRUE);
if(result) {
/* We can limp along anyway (and should try to since we may already be in
* the error path) */
ftpc->ctl_valid = FALSE; /* mark control connection as bad */
connclose(conn, "FTP: out of memory!"); /* mark for connection closure */
+ free(ftpc->prevpath);
ftpc->prevpath = NULL; /* no path remembering */
}
- else {
- size_t flen = ftpc->file?strlen(ftpc->file):0; /* file is "raw" already */
- size_t dlen = strlen(path)-flen;
- if(!ftpc->cwdfail) {
- ftpc->prevmethod = data->set.ftp_filemethod;
- if(dlen && (data->set.ftp_filemethod != FTPFILE_NOCWD)) {
- ftpc->prevpath = path;
- if(flen)
- /* if 'path' is not the whole string */
- ftpc->prevpath[dlen] = 0; /* terminate */
+ else { /* remember working directory for connection reuse */
+ if((data->set.ftp_filemethod == FTPFILE_NOCWD) && (rawPath[0] == '/'))
+ free(rawPath); /* full path => no CWDs happened => keep ftpc->prevpath */
+ else {
+ free(ftpc->prevpath);
+
+ if(!ftpc->cwdfail) {
+ if(data->set.ftp_filemethod == FTPFILE_NOCWD)
+ pathLen = 0; /* relative path => working directory is FTP home */
+ else
+ pathLen -= ftpc->file?strlen(ftpc->file):0; /* file is url-decoded */
+
+ rawPath[pathLen] = '\0';
+ ftpc->prevpath = rawPath;
}
else {
- free(path);
- /* we never changed dir */
- ftpc->prevpath = strdup("");
- if(!ftpc->prevpath)
- return CURLE_OUT_OF_MEMORY;
+ free(rawPath);
+ ftpc->prevpath = NULL; /* no path */
}
- if(ftpc->prevpath)
- infof(data, "Remembering we are in dir \"%s\"\n", ftpc->prevpath);
- }
- else {
- ftpc->prevpath = NULL; /* no path */
- free(path);
}
+
+ if(ftpc->prevpath)
+ infof(data, "Remembering we are in dir \"%s\"\n", ftpc->prevpath);
}
+
/* free the dir tree and file parts */
freedirs(ftpc);
@@ -3532,14 +3521,13 @@ static CURLcode ftp_do_more(struct connectdata *conn, int *completep)
/* if we got an error or if we don't wait for a data connection return
immediately */
- if(result || (ftpc->wait_data_conn != TRUE))
+ if(result || !ftpc->wait_data_conn)
return result;
- if(ftpc->wait_data_conn)
- /* if we reach the end of the FTP state machine here, *complete will be
- TRUE but so is ftpc->wait_data_conn, which says we need to wait for
- the data connection and therefore we're not actually complete */
- *completep = 0;
+ /* if we reach the end of the FTP state machine here, *complete will be
+ TRUE but so is ftpc->wait_data_conn, which says we need to wait for the
+ data connection and therefore we're not actually complete */
+ *completep = 0;
}
if(ftp->transfer <= FTPTRANSFER_INFO) {
@@ -3573,13 +3561,8 @@ static CURLcode ftp_do_more(struct connectdata *conn, int *completep)
return result;
result = ftp_multi_statemach(conn, &complete);
- if(ftpc->wait_data_conn)
- /* if we reach the end of the FTP state machine here, *complete will be
- TRUE but so is ftpc->wait_data_conn, which says we need to wait for
- the data connection and therefore we're not actually complete */
- *completep = 0;
- else
- *completep = (int)complete;
+ /* ftpc->wait_data_conn is always false here */
+ *completep = (int)complete;
}
else {
/* download */
@@ -3619,10 +3602,8 @@ static CURLcode ftp_do_more(struct connectdata *conn, int *completep)
return result;
}
- if(!result && (ftp->transfer != FTPTRANSFER_BODY))
- /* no data to transfer. FIX: it feels like a kludge to have this here
- too! */
- Curl_setup_transfer(data, -1, -1, FALSE, -1);
+ /* no data to transfer */
+ Curl_setup_transfer(data, -1, -1, FALSE, -1);
if(!ftpc->wait_data_conn) {
/* no waiting for the data connection so this is now complete */
@@ -4100,186 +4081,142 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
/* the ftp struct is already inited in ftp_connect() */
struct FTP *ftp = data->req.protop;
struct ftp_conn *ftpc = &conn->proto.ftpc;
- const char *slash_pos; /* position of the first '/' char in curpos */
- const char *path_to_use = ftp->path;
- const char *cur_pos;
- const char *filename = NULL;
-
- cur_pos = path_to_use; /* current position in path. point at the begin of
- next path component */
+ const char *slashPos = NULL;
+ const char *fileName = NULL;
+ CURLcode result = CURLE_OK;
+ char *rawPath = NULL; /* url-decoded "raw" path */
+ size_t pathLen = 0;
ftpc->ctl_valid = FALSE;
ftpc->cwdfail = FALSE;
- switch(data->set.ftp_filemethod) {
- case FTPFILE_NOCWD:
- /* fastest, but less standard-compliant */
-
- /*
- The best time to check whether the path is a file or directory is right
- here. so:
+ /* url-decode ftp path before further evaluation */
+ result = Curl_urldecode(data, ftp->path, 0, &rawPath, &pathLen, TRUE);
+ if(result)
+ return result;
- the first condition in the if() right here, is there just in case
- someone decides to set path to NULL one day
- */
- if(path_to_use[0] &&
- (path_to_use[strlen(path_to_use) - 1] != '/') )
- filename = path_to_use; /* this is a full file path */
- /*
- else {
- ftpc->file is not used anywhere other than for operations on a file.
- In other words, never for directory operations.
- So we can safely leave filename as NULL here and use it as a
- argument in dir/file decisions.
- }
- */
- break;
+ switch(data->set.ftp_filemethod) {
+ case FTPFILE_NOCWD: /* fastest, but less standard-compliant */
- case FTPFILE_SINGLECWD:
- /* get the last slash */
- if(!path_to_use[0]) {
- /* no dir, no file */
- ftpc->dirdepth = 0;
+ if((pathLen > 0) && (rawPath[pathLen - 1] != '/'))
+ fileName = rawPath; /* this is a full file path */
+ /*
+ else: ftpc->file is not used anywhere other than for operations on
+ a file. In other words, never for directory operations.
+ So we can safely leave filename as NULL here and use it as a
+ argument in dir/file decisions.
+ */
break;
- }
- slash_pos = strrchr(cur_pos, '/');
- if(slash_pos || !*cur_pos) {
- size_t dirlen = slash_pos-cur_pos;
- CURLcode result;
- ftpc->dirs = calloc(1, sizeof(ftpc->dirs[0]));
- if(!ftpc->dirs)
- return CURLE_OUT_OF_MEMORY;
+ case FTPFILE_SINGLECWD:
+ slashPos = strrchr(rawPath, '/');
+ if(slashPos) {
+ /* get path before last slash, except for / */
+ size_t dirlen = slashPos - rawPath;
+ if(dirlen == 0)
+ dirlen++;
+
+ ftpc->dirs = calloc(1, sizeof(ftpc->dirs[0]));
+ if(!ftpc->dirs) {
+ free(rawPath);
+ return CURLE_OUT_OF_MEMORY;
+ }
- if(!dirlen)
- dirlen++;
+ ftpc->dirs[0] = calloc(1, dirlen + 1);
+ if(!ftpc->dirs[0]) {
+ free(rawPath);
+ return CURLE_OUT_OF_MEMORY;
+ }
- result = Curl_urldecode(conn->data, slash_pos ? cur_pos : "/",
- slash_pos ? dirlen : 1,
- &ftpc->dirs[0], NULL,
- TRUE);
- if(result) {
- freedirs(ftpc);
- return result;
+ strncpy(ftpc->dirs[0], rawPath, dirlen);
+ ftpc->dirdepth = 1; /* we consider it to be a single dir */
+ fileName = slashPos + 1; /* rest is file name */
}
- ftpc->dirdepth = 1; /* we consider it to be a single dir */
- filename = slash_pos ? slash_pos + 1 : cur_pos; /* rest is file name */
- }
- else
- filename = cur_pos; /* this is a file name only */
- break;
+ else
+ fileName = rawPath; /* file name only (or empty) */
+ break;
- default: /* allow pretty much anything */
- case FTPFILE_MULTICWD:
- ftpc->dirdepth = 0;
- ftpc->diralloc = 5; /* default dir depth to allocate */
- ftpc->dirs = calloc(ftpc->diralloc, sizeof(ftpc->dirs[0]));
- if(!ftpc->dirs)
- return CURLE_OUT_OF_MEMORY;
+ default: /* allow pretty much anything */
+ case FTPFILE_MULTICWD: {
+ /* current position: begin of next path component */
+ const char *curPos = rawPath;
+
+ int dirAlloc = 0; /* number of entries allocated for the 'dirs' array */
+ const char *str = rawPath;
+ for(; *str != 0; ++str)
+ if (*str == '/')
+ ++dirAlloc;
+
+ if(dirAlloc > 0) {
+ ftpc->dirs = calloc(dirAlloc, sizeof(ftpc->dirs[0]));
+ if(!ftpc->dirs) {
+ free(rawPath);
+ return CURLE_OUT_OF_MEMORY;
+ }
+
+ /* parse the URL path into separate path components */
+ while((slashPos = strchr(curPos, '/')) != NULL) {
+ size_t compLen = slashPos - curPos;
+
+ /* path starts with a slash: add that as a directory */
+ if((compLen == 0) && (ftpc->dirdepth == 0))
+ ++compLen;
- /* we have a special case for listing the root dir only */
- if(!strcmp(path_to_use, "/")) {
- cur_pos++; /* make it point to the zero byte */
- ftpc->dirs[0] = strdup("/");
- ftpc->dirdepth++;
- }
- else {
- /* parse the URL path into separate path components */
- while((slash_pos = strchr(cur_pos, '/')) != NULL) {
- /* 1 or 0 pointer offset to indicate absolute directory */
- ssize_t absolute_dir = ((cur_pos - ftp->path > 0) &&
- (ftpc->dirdepth == 0))?1:0;
-
- /* seek out the next path component */
- if(slash_pos-cur_pos) {
/* we skip empty path components, like "x//y" since the FTP command
CWD requires a parameter and a non-existent parameter a) doesn't
work on many servers and b) has no effect on the others. */
- size_t len = slash_pos - cur_pos + absolute_dir;
- CURLcode result =
- Curl_urldecode(conn->data, cur_pos - absolute_dir, len,
- &ftpc->dirs[ftpc->dirdepth], NULL,
- TRUE);
- if(result) {
- freedirs(ftpc);
- return result;
- }
- }
- else {
- cur_pos = slash_pos + 1; /* jump to the rest of the string */
- if(!ftpc->dirdepth) {
- /* path starts with a slash, add that as a directory */
- ftpc->dirs[ftpc->dirdepth] = strdup("/");
- if(!ftpc->dirs[ftpc->dirdepth++]) { /* run out of memory ... */
- failf(data, "no memory");
- freedirs(ftpc);
+ if(compLen > 0) {
+ char *comp = calloc(1, compLen + 1);
+ if(!comp) {
+ free(rawPath);
return CURLE_OUT_OF_MEMORY;
}
+ strncpy(comp, curPos, compLen);
+ ftpc->dirs[ftpc->dirdepth++] = comp;
}
- continue;
- }
-
- cur_pos = slash_pos + 1; /* jump to the rest of the string */
- if(++ftpc->dirdepth >= ftpc->diralloc) {
- /* enlarge array */
- char **bigger;
- ftpc->diralloc *= 2; /* double the size each time */
- bigger = realloc(ftpc->dirs, ftpc->diralloc * sizeof(ftpc->dirs[0]));
- if(!bigger) {
- freedirs(ftpc);
- return CURLE_OUT_OF_MEMORY;
- }
- ftpc->dirs = bigger;
+ curPos = slashPos + 1;
}
}
+ DEBUGASSERT(ftpc->dirdepth <= dirAlloc);
+ fileName = curPos; /* the rest is the file name (or empty) */
}
- filename = cur_pos; /* the rest is the file name */
break;
} /* switch */
- if(filename && *filename) {
- CURLcode result =
- Curl_urldecode(conn->data, filename, 0, &ftpc->file, NULL, TRUE);
-
- if(result) {
- freedirs(ftpc);
- return result;
- }
- }
+ if(fileName && *fileName)
+ ftpc->file = strdup(fileName);
else
- ftpc->file = NULL; /* instead of point to a zero byte, we make it a NULL
- pointer */
+ ftpc->file = NULL; /* instead of point to a zero byte,
+ we make it a NULL pointer */
if(data->set.upload && !ftpc->file && (ftp->transfer == FTPTRANSFER_BODY)) {
/* We need a file name when uploading. Return error! */
failf(data, "Uploading to a URL without a file name!");
+ free(rawPath);
return CURLE_URL_MALFORMAT;
}
ftpc->cwddone = FALSE; /* default to not done */
- if(ftpc->prevpath) {
- /* prevpath is "raw" so we convert the input path before we compare the
- strings */
- size_t dlen;
- char *path;
- CURLcode result =
- Curl_urldecode(conn->data, ftp->path, 0, &path, &dlen, TRUE);
- if(result) {
- freedirs(ftpc);
- return result;
- }
+ if((data->set.ftp_filemethod == FTPFILE_NOCWD) && (rawPath[0] == '/'))
+ ftpc->cwddone = TRUE; /* skip CWD for absolute paths */
+ else { /* newly created FTP connections are already in entry path */
+ const char *oldPath = conn->bits.reuse ? ftpc->prevpath : "";
+ if(oldPath) {
+ size_t n = pathLen;
+ if(data->set.ftp_filemethod == FTPFILE_NOCWD)
+ n = 0; /* CWD to entry for relative paths */
+ else
+ n -= ftpc->file?strlen(ftpc->file):0;
- dlen -= ftpc->file?strlen(ftpc->file):0;
- if((dlen == strlen(ftpc->prevpath)) &&
- !strncmp(path, ftpc->prevpath, dlen) &&
- (ftpc->prevmethod == data->set.ftp_filemethod)) {
- infof(data, "Request has same path as previous transfer\n");
- ftpc->cwddone = TRUE;
+ if((strlen(oldPath) == n) && !strncmp(rawPath, oldPath, n)) {
+ infof(data, "Request has same path as previous transfer\n");
+ ftpc->cwddone = TRUE;
+ }
}
- free(path);
}
+ free(rawPath);
return CURLE_OK;
}
@@ -4423,18 +4360,6 @@ static CURLcode ftp_setup_connection(struct connectdata *conn)
/* get some initial data into the ftp struct */
ftp->transfer = FTPTRANSFER_BODY;
ftp->downloadsize = 0;
-
- /* No need to duplicate user+password, the connectdata struct won't change
- during a session, but we re-init them here since on subsequent inits
- since the conn struct may have changed or been replaced.
- */
- ftp->user = conn->user;
- ftp->passwd = conn->passwd;
- if(isBadFtpString(ftp->user))
- return CURLE_URL_MALFORMAT;
- if(isBadFtpString(ftp->passwd))
- return CURLE_URL_MALFORMAT;
-
conn->proto.ftpc.known_filesize = -1; /* unknown size for now */
return CURLE_OK;
diff --git a/Utilities/cmcurl/lib/ftp.h b/Utilities/cmcurl/lib/ftp.h
index 828d69a..984347f 100644
--- a/Utilities/cmcurl/lib/ftp.h
+++ b/Utilities/cmcurl/lib/ftp.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -102,8 +102,6 @@ typedef enum {
perhaps the Curl_easy is changed between the times the connection is
used. */
struct FTP {
- char *user; /* user name string */
- char *passwd; /* password string */
char *path; /* points to the urlpieces struct field */
char *pathalloc; /* if non-NULL a pointer to an allocated path */
@@ -121,8 +119,7 @@ struct ftp_conn {
char *entrypath; /* the PWD reply when we logged on */
char **dirs; /* realloc()ed array for path components */
int dirdepth; /* number of entries used in the 'dirs' array */
- int diralloc; /* number of entries allocated for the 'dirs' array */
- char *file; /* decoded file */
+ char *file; /* url-decoded file name (or path) */
bool dont_check; /* Set to TRUE to prevent the final (post-transfer)
file size and 226/250 status check. It should still
read the line, just ignore the result. */
@@ -135,8 +132,7 @@ struct ftp_conn {
bool cwdfail; /* set TRUE if a CWD command fails, as then we must prevent
caching the current directory */
bool wait_data_conn; /* this is set TRUE if data connection is waited */
- char *prevpath; /* conn->path from the previous transfer */
- curl_ftpfile prevmethod; /* ftp method in previous transfer */
+ char *prevpath; /* url-decoded conn->path from the previous transfer */
char transfertype; /* set by ftp_transfertype for use by Curl_client_write()a
and others (A/I or zero) */
int count1; /* general purpose counter for the state machine */
diff --git a/Utilities/cmcurl/lib/ftplistparser.c b/Utilities/cmcurl/lib/ftplistparser.c
index c4eb437..f399a4c 100644
--- a/Utilities/cmcurl/lib/ftplistparser.c
+++ b/Utilities/cmcurl/lib/ftplistparser.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/ftplistparser.h b/Utilities/cmcurl/lib/ftplistparser.h
index 8128887..b34ae9b 100644
--- a/Utilities/cmcurl/lib/ftplistparser.h
+++ b/Utilities/cmcurl/lib/ftplistparser.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/getenv.c b/Utilities/cmcurl/lib/getenv.c
index 89d181d..9385b8f 100644
--- a/Utilities/cmcurl/lib/getenv.c
+++ b/Utilities/cmcurl/lib/getenv.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -27,25 +27,48 @@
#include "memdebug.h"
-static
-char *GetEnv(const char *variable)
+static char *GetEnv(const char *variable)
{
#if defined(_WIN32_WCE) || defined(CURL_WINDOWS_APP)
(void)variable;
return NULL;
-#else
-#ifdef WIN32
- char env[MAX_PATH]; /* MAX_PATH is from windef.h */
- char *temp = getenv(variable);
- env[0] = '\0';
- if(temp != NULL)
- ExpandEnvironmentStringsA(temp, env, sizeof(env));
- return (env[0] != '\0')?strdup(env):NULL;
+#elif defined(WIN32)
+ /* This uses Windows API instead of C runtime getenv() to get the environment
+ variable since some changes aren't always visible to the latter. #4774 */
+ char *buf = NULL;
+ char *tmp;
+ DWORD bufsize;
+ DWORD rc = 1;
+ const DWORD max = 32768; /* max env var size from MSCRT source */
+
+ for(;;) {
+ tmp = realloc(buf, rc);
+ if(!tmp) {
+ free(buf);
+ return NULL;
+ }
+
+ buf = tmp;
+ bufsize = rc;
+
+ /* It's possible for rc to be 0 if the variable was found but empty.
+ Since getenv doesn't make that distinction we ignore it as well. */
+ rc = GetEnvironmentVariableA(variable, buf, bufsize);
+ if(!rc || rc == bufsize || rc > max) {
+ free(buf);
+ return NULL;
+ }
+
+ /* if rc < bufsize then rc is bytes written not including null */
+ if(rc < bufsize)
+ return buf;
+
+ /* else rc is bytes needed, try again */
+ }
#else
char *env = getenv(variable);
return (env && env[0])?strdup(env):NULL;
#endif
-#endif
}
char *curl_getenv(const char *v)
diff --git a/Utilities/cmcurl/lib/getinfo.c b/Utilities/cmcurl/lib/getinfo.c
index e118da8..2b8f230 100644
--- a/Utilities/cmcurl/lib/getinfo.c
+++ b/Utilities/cmcurl/lib/getinfo.c
@@ -235,6 +235,9 @@ static CURLcode getinfo_long(struct Curl_easy *data, CURLINFO info,
case 20:
*param_longp = CURL_HTTP_VERSION_2_0;
break;
+ case 30:
+ *param_longp = CURL_HTTP_VERSION_3;
+ break;
default:
*param_longp = CURL_HTTP_VERSION_NONE;
break;
@@ -243,7 +246,6 @@ static CURLcode getinfo_long(struct Curl_easy *data, CURLINFO info,
case CURLINFO_PROTOCOL:
*param_longp = data->info.conn_protocol;
break;
-
default:
return CURLE_UNKNOWN_OPTION;
}
@@ -301,7 +303,9 @@ static CURLcode getinfo_offt(struct Curl_easy *data, CURLINFO info,
case CURLINFO_REDIRECT_TIME_T:
*param_offt = data->progress.t_redirect;
break;
-
+ case CURLINFO_RETRY_AFTER:
+ *param_offt = data->info.retry_after;
+ break;
default:
return CURLE_UNKNOWN_OPTION;
}
diff --git a/Utilities/cmcurl/lib/getinfo.h b/Utilities/cmcurl/lib/getinfo.h
index aecf717..8d2af42 100644
--- a/Utilities/cmcurl/lib/getinfo.h
+++ b/Utilities/cmcurl/lib/getinfo.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/gopher.h b/Utilities/cmcurl/lib/gopher.h
index 501c990..dec2557 100644
--- a/Utilities/cmcurl/lib/gopher.h
+++ b/Utilities/cmcurl/lib/gopher.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/hash.h b/Utilities/cmcurl/lib/hash.h
index 90a25d1..558d0f4 100644
--- a/Utilities/cmcurl/lib/hash.h
+++ b/Utilities/cmcurl/lib/hash.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -80,7 +80,7 @@ int Curl_hash_delete(struct curl_hash *h, void *key, size_t key_len);
void *Curl_hash_pick(struct curl_hash *, void *key, size_t key_len);
void Curl_hash_apply(struct curl_hash *h, void *user,
void (*cb)(void *user, void *ptr));
-int Curl_hash_count(struct curl_hash *h);
+#define Curl_hash_count(h) ((h)->size)
void Curl_hash_destroy(struct curl_hash *h);
void Curl_hash_clean(struct curl_hash *h);
void Curl_hash_clean_with_criterium(struct curl_hash *h, void *user,
diff --git a/Utilities/cmcurl/lib/hmac.c b/Utilities/cmcurl/lib/hmac.c
index bf49ebe..ae68827 100644
--- a/Utilities/cmcurl/lib/hmac.c
+++ b/Utilities/cmcurl/lib/hmac.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -30,6 +30,7 @@
#include "curl_hmac.h"
#include "curl_memory.h"
+#include "warnless.h"
/* The last #include file should be: */
#include "memdebug.h"
@@ -129,4 +130,40 @@ int Curl_HMAC_final(HMAC_context *ctxt, unsigned char *result)
return 0;
}
+/*
+ * Curl_hmacit()
+ *
+ * This is used to generate a HMAC hash, for the specified input data, given
+ * the specified hash function and key.
+ *
+ * Parameters:
+ *
+ * hashparams [in] - The hash function (Curl_HMAC_MD5).
+ * key [in] - The key to use.
+ * keylen [in] - The length of the key.
+ * data [in] - The data to encrypt.
+ * datalen [in] - The length of the data.
+ * output [in/out] - The output buffer.
+ *
+ * Returns CURLE_OK on success.
+ */
+CURLcode Curl_hmacit(const HMAC_params *hashparams,
+ const unsigned char *key, const size_t keylen,
+ const unsigned char *data, const size_t datalen,
+ unsigned char *output)
+{
+ HMAC_context *ctxt = Curl_HMAC_init(hashparams, key, curlx_uztoui(keylen));
+
+ if(!ctxt)
+ return CURLE_OUT_OF_MEMORY;
+
+ /* Update the digest with the given challenge */
+ Curl_HMAC_update(ctxt, data, curlx_uztoui(datalen));
+
+ /* Finalise the digest */
+ Curl_HMAC_final(ctxt, output);
+
+ return CURLE_OK;
+}
+
#endif /* CURL_DISABLE_CRYPTO_AUTH */
diff --git a/Utilities/cmcurl/lib/hostcheck.c b/Utilities/cmcurl/lib/hostcheck.c
index 115d24b..9e0db05 100644
--- a/Utilities/cmcurl/lib/hostcheck.c
+++ b/Utilities/cmcurl/lib/hostcheck.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/hostcheck.h b/Utilities/cmcurl/lib/hostcheck.h
index f562df9..9c18085 100644
--- a/Utilities/cmcurl/lib/hostcheck.h
+++ b/Utilities/cmcurl/lib/hostcheck.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/hostip.c b/Utilities/cmcurl/lib/hostip.c
index cf33ed8..c0feb79 100644
--- a/Utilities/cmcurl/lib/hostip.c
+++ b/Utilities/cmcurl/lib/hostip.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -59,6 +59,7 @@
#include "strerror.h"
#include "url.h"
#include "inet_ntop.h"
+#include "inet_pton.h"
#include "multiif.h"
#include "doh.h"
#include "warnless.h"
@@ -482,16 +483,16 @@ Curl_cache_addr(struct Curl_easy *data,
* CURLRESOLV_PENDING (1) = waiting for response, no pointer
*/
-int Curl_resolv(struct connectdata *conn,
- const char *hostname,
- int port,
- bool allowDOH,
- struct Curl_dns_entry **entry)
+enum resolve_t Curl_resolv(struct connectdata *conn,
+ const char *hostname,
+ int port,
+ bool allowDOH,
+ struct Curl_dns_entry **entry)
{
struct Curl_dns_entry *dns = NULL;
struct Curl_easy *data = conn->data;
CURLcode result;
- int rc = CURLRESOLV_ERROR; /* default to failure */
+ enum resolve_t rc = CURLRESOLV_ERROR; /* default to failure */
*entry = NULL;
@@ -512,13 +513,11 @@ int Curl_resolv(struct connectdata *conn,
if(!dns) {
/* The entry was not in the cache. Resolve it to IP address */
- Curl_addrinfo *addr;
+ Curl_addrinfo *addr = NULL;
int respwait = 0;
-
- /* Check what IP specifics the app has requested and if we can provide it.
- * If not, bail out. */
- if(!Curl_ipvalid(conn))
- return CURLRESOLV_ERROR;
+#ifndef USE_RESOLVE_ON_IPS
+ struct in_addr in;
+#endif
/* notify the resolver start callback */
if(data->set.resolver_start) {
@@ -531,20 +530,43 @@ int Curl_resolv(struct connectdata *conn,
return CURLRESOLV_ERROR;
}
- if(allowDOH && data->set.doh) {
- addr = Curl_doh(conn, hostname, port, &respwait);
+#ifndef USE_RESOLVE_ON_IPS
+ /* First check if this is an IPv4 address string */
+ if(Curl_inet_pton(AF_INET, hostname, &in) > 0)
+ /* This is a dotted IP address 123.123.123.123-style */
+ addr = Curl_ip2addr(AF_INET, &in, hostname, port);
+#ifdef ENABLE_IPV6
+ if(!addr) {
+ struct in6_addr in6;
+ /* check if this is an IPv6 address string */
+ if(Curl_inet_pton(AF_INET6, hostname, &in6) > 0)
+ /* This is an IPv6 address literal */
+ addr = Curl_ip2addr(AF_INET6, &in6, hostname, port);
}
- else {
- /* If Curl_getaddrinfo() returns NULL, 'respwait' might be set to a
- non-zero value indicating that we need to wait for the response to the
- resolve call */
- addr = Curl_getaddrinfo(conn,
+#endif /* ENABLE_IPV6 */
+#endif /* !USE_RESOLVE_ON_IPS */
+
+ if(!addr) {
+ /* Check what IP specifics the app has requested and if we can provide
+ * it. If not, bail out. */
+ if(!Curl_ipvalid(conn))
+ return CURLRESOLV_ERROR;
+
+ if(allowDOH && data->set.doh) {
+ addr = Curl_doh(conn, hostname, port, &respwait);
+ }
+ else {
+ /* If Curl_getaddrinfo() returns NULL, 'respwait' might be set to a
+ non-zero value indicating that we need to wait for the response to
+ the resolve call */
+ addr = Curl_getaddrinfo(conn,
#ifdef DEBUGBUILD
- (data->set.str[STRING_DEVICE]
- && !strcmp(data->set.str[STRING_DEVICE],
- "LocalHost"))?"localhost":
+ (data->set.str[STRING_DEVICE]
+ && !strcmp(data->set.str[STRING_DEVICE],
+ "LocalHost"))?"localhost":
#endif
- hostname, port, &respwait);
+ hostname, port, &respwait);
+ }
}
if(!addr) {
if(respwait) {
@@ -620,11 +642,11 @@ RETSIGTYPE alarmfunc(int sig)
* CURLRESOLV_PENDING (1) = waiting for response, no pointer
*/
-int Curl_resolv_timeout(struct connectdata *conn,
- const char *hostname,
- int port,
- struct Curl_dns_entry **entry,
- time_t timeoutms)
+enum resolve_t Curl_resolv_timeout(struct connectdata *conn,
+ const char *hostname,
+ int port,
+ struct Curl_dns_entry **entry,
+ timediff_t timeoutms)
{
#ifdef USE_ALARM_TIMEOUT
#ifdef HAVE_SIGACTION
@@ -640,7 +662,7 @@ int Curl_resolv_timeout(struct connectdata *conn,
volatile unsigned int prev_alarm = 0;
struct Curl_easy *data = conn->data;
#endif /* USE_ALARM_TIMEOUT */
- int rc;
+ enum resolve_t rc;
*entry = NULL;
@@ -749,7 +771,7 @@ clean_up:
conn->created) / 1000;
/* the alarm period is counted in even number of seconds */
- unsigned long alarm_set = prev_alarm - elapsed_secs;
+ unsigned long alarm_set = (unsigned long)(prev_alarm - elapsed_secs);
if(!alarm_set ||
((alarm_set >= 0x80000000) && (prev_alarm < 0x80000000)) ) {
@@ -1021,25 +1043,27 @@ CURLcode Curl_loadhostpairs(struct Curl_easy *data)
CURLcode Curl_resolv_check(struct connectdata *conn,
struct Curl_dns_entry **dns)
{
+#if defined(CURL_DISABLE_DOH) && !defined(CURLRES_ASYNCH)
+ (void)dns;
+#endif
+
if(conn->data->set.doh)
return Curl_doh_is_resolved(conn, dns);
return Curl_resolver_is_resolved(conn, dns);
}
int Curl_resolv_getsock(struct connectdata *conn,
- curl_socket_t *socks,
- int numsocks)
+ curl_socket_t *socks)
{
#ifdef CURLRES_ASYNCH
if(conn->data->set.doh)
/* nothing to wait for during DOH resolve, those handles have their own
sockets */
return GETSOCK_BLANK;
- return Curl_resolver_getsock(conn, socks, numsocks);
+ return Curl_resolver_getsock(conn, socks);
#else
(void)conn;
(void)socks;
- (void)numsocks;
return GETSOCK_BLANK;
#endif
}
diff --git a/Utilities/cmcurl/lib/hostip.h b/Utilities/cmcurl/lib/hostip.h
index 9dc0d5a..baf1e58 100644
--- a/Utilities/cmcurl/lib/hostip.h
+++ b/Utilities/cmcurl/lib/hostip.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -25,6 +25,7 @@
#include "curl_setup.h"
#include "hash.h"
#include "curl_addrinfo.h"
+#include "timeval.h" /* for timediff_t */
#include "asyn.h"
#ifdef HAVE_SETJMP_H
@@ -61,7 +62,6 @@ struct connectdata;
* Returns a struct curl_hash pointer on success, NULL on failure.
*/
struct curl_hash *Curl_global_host_cache_init(void);
-void Curl_global_host_cache_dtor(void);
struct Curl_dns_entry {
Curl_addrinfo *addr;
@@ -79,26 +79,29 @@ struct Curl_dns_entry {
* use, or we'll leak memory!
*/
/* return codes */
-#define CURLRESOLV_TIMEDOUT -2
-#define CURLRESOLV_ERROR -1
-#define CURLRESOLV_RESOLVED 0
-#define CURLRESOLV_PENDING 1
-int Curl_resolv(struct connectdata *conn,
- const char *hostname,
- int port,
- bool allowDOH,
- struct Curl_dns_entry **dnsentry);
-int Curl_resolv_timeout(struct connectdata *conn, const char *hostname,
- int port, struct Curl_dns_entry **dnsentry,
- time_t timeoutms);
+enum resolve_t {
+ CURLRESOLV_TIMEDOUT = -2,
+ CURLRESOLV_ERROR = -1,
+ CURLRESOLV_RESOLVED = 0,
+ CURLRESOLV_PENDING = 1
+};
+enum resolve_t Curl_resolv(struct connectdata *conn,
+ const char *hostname,
+ int port,
+ bool allowDOH,
+ struct Curl_dns_entry **dnsentry);
+enum resolve_t Curl_resolv_timeout(struct connectdata *conn,
+ const char *hostname, int port,
+ struct Curl_dns_entry **dnsentry,
+ timediff_t timeoutms);
#ifdef CURLRES_IPV6
/*
* Curl_ipv6works() returns TRUE if IPv6 seems to work.
*/
-bool Curl_ipv6works(void);
+bool Curl_ipv6works(struct connectdata *conn);
#else
-#define Curl_ipv6works() FALSE
+#define Curl_ipv6works(x) FALSE
#endif
/*
@@ -124,9 +127,6 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
void Curl_resolv_unlock(struct Curl_easy *data,
struct Curl_dns_entry *dns);
-/* for debugging purposes only: */
-void Curl_scan_cache_used(void *user, void *ptr);
-
/* init a new dns cache and return success */
int Curl_mk_dnscache(struct curl_hash *hash);
@@ -237,11 +237,6 @@ CURLcode Curl_set_dns_local_ip6(struct Curl_easy *data,
void Curl_hostcache_clean(struct Curl_easy *data, struct curl_hash *hash);
/*
- * Destroy the hostcache of this handle.
- */
-void Curl_hostcache_destroy(struct Curl_easy *data);
-
-/*
* Populate the cache with specified entries from CURLOPT_RESOLVE.
*/
CURLcode Curl_loadhostpairs(struct Curl_easy *data);
@@ -249,7 +244,6 @@ CURLcode Curl_loadhostpairs(struct Curl_easy *data);
CURLcode Curl_resolv_check(struct connectdata *conn,
struct Curl_dns_entry **dns);
int Curl_resolv_getsock(struct connectdata *conn,
- curl_socket_t *socks,
- int numsocks);
+ curl_socket_t *socks);
#endif /* HEADER_CURL_HOSTIP_H */
diff --git a/Utilities/cmcurl/lib/hostip4.c b/Utilities/cmcurl/lib/hostip4.c
index e6ba710..d5009a3 100644
--- a/Utilities/cmcurl/lib/hostip4.c
+++ b/Utilities/cmcurl/lib/hostip4.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -52,7 +52,6 @@
#include "share.h"
#include "strerror.h"
#include "url.h"
-#include "inet_pton.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
#include "curl_memory.h"
@@ -128,28 +127,22 @@ Curl_addrinfo *Curl_ipv4_resolve_r(const char *hostname,
#endif
Curl_addrinfo *ai = NULL;
struct hostent *h = NULL;
- struct in_addr in;
struct hostent *buf = NULL;
- if(Curl_inet_pton(AF_INET, hostname, &in) > 0)
- /* This is a dotted IP address 123.123.123.123-style */
- return Curl_ip2addr(AF_INET, &in, hostname, port);
-
#if defined(HAVE_GETADDRINFO_THREADSAFE)
- else {
- struct addrinfo hints;
- char sbuf[12];
- char *sbufptr = NULL;
-
- memset(&hints, 0, sizeof(hints));
- hints.ai_family = PF_INET;
- hints.ai_socktype = SOCK_STREAM;
- if(port) {
- msnprintf(sbuf, sizeof(sbuf), "%d", port);
- sbufptr = sbuf;
- }
+ struct addrinfo hints;
+ char sbuf[12];
+ char *sbufptr = NULL;
+
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = PF_INET;
+ hints.ai_socktype = SOCK_STREAM;
+ if(port) {
+ msnprintf(sbuf, sizeof(sbuf), "%d", port);
+ sbufptr = sbuf;
+ }
- (void)Curl_getaddrinfo_ex(hostname, sbufptr, &hints, &ai);
+ (void)Curl_getaddrinfo_ex(hostname, sbufptr, &hints, &ai);
#elif defined(HAVE_GETHOSTBYNAME_R)
/*
@@ -157,144 +150,141 @@ Curl_addrinfo *Curl_ipv4_resolve_r(const char *hostname,
* Since there are three different versions of it, the following code is
* somewhat #ifdef-ridden.
*/
- else {
- int h_errnop;
-
- buf = calloc(1, CURL_HOSTENT_SIZE);
- if(!buf)
- return NULL; /* major failure */
- /*
- * The clearing of the buffer is a workaround for a gethostbyname_r bug in
- * qnx nto and it is also _required_ for some of these functions on some
- * platforms.
- */
+ int h_errnop;
+
+ buf = calloc(1, CURL_HOSTENT_SIZE);
+ if(!buf)
+ return NULL; /* major failure */
+ /*
+ * The clearing of the buffer is a workaround for a gethostbyname_r bug in
+ * qnx nto and it is also _required_ for some of these functions on some
+ * platforms.
+ */
#if defined(HAVE_GETHOSTBYNAME_R_5)
- /* Solaris, IRIX and more */
- h = gethostbyname_r(hostname,
- (struct hostent *)buf,
- (char *)buf + sizeof(struct hostent),
- CURL_HOSTENT_SIZE - sizeof(struct hostent),
- &h_errnop);
-
- /* If the buffer is too small, it returns NULL and sets errno to
- * ERANGE. The errno is thread safe if this is compiled with
- * -D_REENTRANT as then the 'errno' variable is a macro defined to get
- * used properly for threads.
- */
+ /* Solaris, IRIX and more */
+ h = gethostbyname_r(hostname,
+ (struct hostent *)buf,
+ (char *)buf + sizeof(struct hostent),
+ CURL_HOSTENT_SIZE - sizeof(struct hostent),
+ &h_errnop);
+
+ /* If the buffer is too small, it returns NULL and sets errno to
+ * ERANGE. The errno is thread safe if this is compiled with
+ * -D_REENTRANT as then the 'errno' variable is a macro defined to get
+ * used properly for threads.
+ */
- if(h) {
- ;
- }
- else
+ if(h) {
+ ;
+ }
+ else
#elif defined(HAVE_GETHOSTBYNAME_R_6)
- /* Linux */
-
- (void)gethostbyname_r(hostname,
- (struct hostent *)buf,
- (char *)buf + sizeof(struct hostent),
- CURL_HOSTENT_SIZE - sizeof(struct hostent),
- &h, /* DIFFERENCE */
- &h_errnop);
- /* Redhat 8, using glibc 2.2.93 changed the behavior. Now all of a
- * sudden this function returns EAGAIN if the given buffer size is too
- * small. Previous versions are known to return ERANGE for the same
- * problem.
- *
- * This wouldn't be such a big problem if older versions wouldn't
- * sometimes return EAGAIN on a common failure case. Alas, we can't
- * assume that EAGAIN *or* ERANGE means ERANGE for any given version of
- * glibc.
- *
- * For now, we do that and thus we may call the function repeatedly and
- * fail for older glibc versions that return EAGAIN, until we run out of
- * buffer size (step_size grows beyond CURL_HOSTENT_SIZE).
- *
- * If anyone has a better fix, please tell us!
- *
- * -------------------------------------------------------------------
- *
- * On October 23rd 2003, Dan C dug up more details on the mysteries of
- * gethostbyname_r() in glibc:
- *
- * In glibc 2.2.5 the interface is different (this has also been
- * discovered in glibc 2.1.1-6 as shipped by Redhat 6). What I can't
- * explain, is that tests performed on glibc 2.2.4-34 and 2.2.4-32
- * (shipped/upgraded by Redhat 7.2) don't show this behavior!
- *
- * In this "buggy" version, the return code is -1 on error and 'errno'
- * is set to the ERANGE or EAGAIN code. Note that 'errno' is not a
- * thread-safe variable.
- */
+ /* Linux */
+
+ (void)gethostbyname_r(hostname,
+ (struct hostent *)buf,
+ (char *)buf + sizeof(struct hostent),
+ CURL_HOSTENT_SIZE - sizeof(struct hostent),
+ &h, /* DIFFERENCE */
+ &h_errnop);
+ /* Redhat 8, using glibc 2.2.93 changed the behavior. Now all of a
+ * sudden this function returns EAGAIN if the given buffer size is too
+ * small. Previous versions are known to return ERANGE for the same
+ * problem.
+ *
+ * This wouldn't be such a big problem if older versions wouldn't
+ * sometimes return EAGAIN on a common failure case. Alas, we can't
+ * assume that EAGAIN *or* ERANGE means ERANGE for any given version of
+ * glibc.
+ *
+ * For now, we do that and thus we may call the function repeatedly and
+ * fail for older glibc versions that return EAGAIN, until we run out of
+ * buffer size (step_size grows beyond CURL_HOSTENT_SIZE).
+ *
+ * If anyone has a better fix, please tell us!
+ *
+ * -------------------------------------------------------------------
+ *
+ * On October 23rd 2003, Dan C dug up more details on the mysteries of
+ * gethostbyname_r() in glibc:
+ *
+ * In glibc 2.2.5 the interface is different (this has also been
+ * discovered in glibc 2.1.1-6 as shipped by Redhat 6). What I can't
+ * explain, is that tests performed on glibc 2.2.4-34 and 2.2.4-32
+ * (shipped/upgraded by Redhat 7.2) don't show this behavior!
+ *
+ * In this "buggy" version, the return code is -1 on error and 'errno'
+ * is set to the ERANGE or EAGAIN code. Note that 'errno' is not a
+ * thread-safe variable.
+ */
- if(!h) /* failure */
+ if(!h) /* failure */
#elif defined(HAVE_GETHOSTBYNAME_R_3)
- /* AIX, Digital Unix/Tru64, HPUX 10, more? */
-
- /* For AIX 4.3 or later, we don't use gethostbyname_r() at all, because of
- * the plain fact that it does not return unique full buffers on each
- * call, but instead several of the pointers in the hostent structs will
- * point to the same actual data! This have the unfortunate down-side that
- * our caching system breaks down horribly. Luckily for us though, AIX 4.3
- * and more recent versions have a "completely thread-safe"[*] libc where
- * all the data is stored in thread-specific memory areas making calls to
- * the plain old gethostbyname() work fine even for multi-threaded
- * programs.
- *
- * This AIX 4.3 or later detection is all made in the configure script.
- *
- * Troels Walsted Hansen helped us work this out on March 3rd, 2003.
- *
- * [*] = much later we've found out that it isn't at all "completely
- * thread-safe", but at least the gethostbyname() function is.
+ /* AIX, Digital Unix/Tru64, HPUX 10, more? */
+
+ /* For AIX 4.3 or later, we don't use gethostbyname_r() at all, because of
+ * the plain fact that it does not return unique full buffers on each
+ * call, but instead several of the pointers in the hostent structs will
+ * point to the same actual data! This have the unfortunate down-side that
+ * our caching system breaks down horribly. Luckily for us though, AIX 4.3
+ * and more recent versions have a "completely thread-safe"[*] libc where
+ * all the data is stored in thread-specific memory areas making calls to
+ * the plain old gethostbyname() work fine even for multi-threaded
+ * programs.
+ *
+ * This AIX 4.3 or later detection is all made in the configure script.
+ *
+ * Troels Walsted Hansen helped us work this out on March 3rd, 2003.
+ *
+ * [*] = much later we've found out that it isn't at all "completely
+ * thread-safe", but at least the gethostbyname() function is.
+ */
+
+ if(CURL_HOSTENT_SIZE >=
+ (sizeof(struct hostent) + sizeof(struct hostent_data))) {
+
+ /* August 22nd, 2000: Albert Chin-A-Young brought an updated version
+ * that should work! September 20: Richard Prescott worked on the buffer
+ * size dilemma.
*/
- if(CURL_HOSTENT_SIZE >=
- (sizeof(struct hostent) + sizeof(struct hostent_data))) {
-
- /* August 22nd, 2000: Albert Chin-A-Young brought an updated version
- * that should work! September 20: Richard Prescott worked on the buffer
- * size dilemma.
- */
-
- res = gethostbyname_r(hostname,
- (struct hostent *)buf,
- (struct hostent_data *)((char *)buf +
- sizeof(struct hostent)));
- h_errnop = SOCKERRNO; /* we don't deal with this, but set it anyway */
- }
- else
- res = -1; /* failure, too smallish buffer size */
-
- if(!res) { /* success */
-
- h = buf; /* result expected in h */
-
- /* This is the worst kind of the different gethostbyname_r() interfaces.
- * Since we don't know how big buffer this particular lookup required,
- * we can't realloc down the huge alloc without doing closer analysis of
- * the returned data. Thus, we always use CURL_HOSTENT_SIZE for every
- * name lookup. Fixing this would require an extra malloc() and then
- * calling Curl_addrinfo_copy() that subsequent realloc()s down the new
- * memory area to the actually used amount.
- */
- }
- else
+ res = gethostbyname_r(hostname,
+ (struct hostent *)buf,
+ (struct hostent_data *)((char *)buf +
+ sizeof(struct hostent)));
+ h_errnop = SOCKERRNO; /* we don't deal with this, but set it anyway */
+ }
+ else
+ res = -1; /* failure, too smallish buffer size */
+
+ if(!res) { /* success */
+
+ h = buf; /* result expected in h */
+
+ /* This is the worst kind of the different gethostbyname_r() interfaces.
+ * Since we don't know how big buffer this particular lookup required,
+ * we can't realloc down the huge alloc without doing closer analysis of
+ * the returned data. Thus, we always use CURL_HOSTENT_SIZE for every
+ * name lookup. Fixing this would require an extra malloc() and then
+ * calling Curl_addrinfo_copy() that subsequent realloc()s down the new
+ * memory area to the actually used amount.
+ */
+ }
+ else
#endif /* HAVE_...BYNAME_R_5 || HAVE_...BYNAME_R_6 || HAVE_...BYNAME_R_3 */
- {
- h = NULL; /* set return code to NULL */
- free(buf);
- }
+ {
+ h = NULL; /* set return code to NULL */
+ free(buf);
+ }
#else /* HAVE_GETADDRINFO_THREADSAFE || HAVE_GETHOSTBYNAME_R */
- /*
- * Here is code for platforms that don't have a thread safe
- * getaddrinfo() nor gethostbyname_r() function or for which
- * gethostbyname() is the preferred one.
- */
- else {
- h = gethostbyname((void *)hostname);
+ /*
+ * Here is code for platforms that don't have a thread safe
+ * getaddrinfo() nor gethostbyname_r() function or for which
+ * gethostbyname() is the preferred one.
+ */
+ h = gethostbyname((void *)hostname);
#endif /* HAVE_GETADDRINFO_THREADSAFE || HAVE_GETHOSTBYNAME_R */
- }
if(h) {
ai = Curl_he2ai(h, port);
diff --git a/Utilities/cmcurl/lib/hostip6.c b/Utilities/cmcurl/lib/hostip6.c
index 5511f1a..41ff986 100644
--- a/Utilities/cmcurl/lib/hostip6.c
+++ b/Utilities/cmcurl/lib/hostip6.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -62,13 +62,19 @@
/*
* Curl_ipv6works() returns TRUE if IPv6 seems to work.
*/
-bool Curl_ipv6works(void)
+bool Curl_ipv6works(struct connectdata *conn)
{
- /* the nature of most system is that IPv6 status doesn't come and go
- during a program's lifetime so we only probe the first time and then we
- have the info kept for fast re-use */
- static int ipv6_works = -1;
- if(-1 == ipv6_works) {
+ if(conn) {
+ /* the nature of most system is that IPv6 status doesn't come and go
+ during a program's lifetime so we only probe the first time and then we
+ have the info kept for fast re-use */
+ DEBUGASSERT(conn);
+ DEBUGASSERT(conn->data);
+ DEBUGASSERT(conn->data->multi);
+ return conn->data->multi->ipv6_works;
+ }
+ else {
+ int ipv6_works = -1;
/* probe to see if we have a working IPv6 stack */
curl_socket_t s = socket(PF_INET6, SOCK_DGRAM, 0);
if(s == CURL_SOCKET_BAD)
@@ -78,8 +84,8 @@ bool Curl_ipv6works(void)
ipv6_works = 1;
Curl_closesocket(NULL, s);
}
+ return (ipv6_works>0)?TRUE:FALSE;
}
- return (ipv6_works>0)?TRUE:FALSE;
}
/*
@@ -89,7 +95,7 @@ bool Curl_ipv6works(void)
bool Curl_ipvalid(struct connectdata *conn)
{
if(conn->ip_version == CURL_IPRESOLVE_V6)
- return Curl_ipv6works();
+ return Curl_ipv6works(conn);
return TRUE;
}
@@ -159,13 +165,14 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
break;
}
- if((pf != PF_INET) && !Curl_ipv6works())
+ if((pf != PF_INET) && !Curl_ipv6works(conn))
/* The stack seems to be a non-IPv6 one */
pf = PF_INET;
memset(&hints, 0, sizeof(hints));
hints.ai_family = pf;
- hints.ai_socktype = conn->socktype;
+ hints.ai_socktype = (conn->transport == TRNSPRT_TCP) ?
+ SOCK_STREAM : SOCK_DGRAM;
#ifndef USE_RESOLVE_ON_IPS
/*
diff --git a/Utilities/cmcurl/lib/hostsyn.c b/Utilities/cmcurl/lib/hostsyn.c
index 3de6746..9e31008 100644
--- a/Utilities/cmcurl/lib/hostsyn.c
+++ b/Utilities/cmcurl/lib/hostsyn.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/http.c b/Utilities/cmcurl/lib/http.c
index 338c59a..bff3adc 100644
--- a/Utilities/cmcurl/lib/http.c
+++ b/Utilities/cmcurl/lib/http.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -88,8 +88,7 @@
*/
static int http_getsock_do(struct connectdata *conn,
- curl_socket_t *socks,
- int numsocks);
+ curl_socket_t *socks);
static int http_should_fail(struct connectdata *conn);
#ifndef CURL_DISABLE_PROXY
@@ -99,8 +98,7 @@ static CURLcode add_haproxy_protocol_header(struct connectdata *conn);
#ifdef USE_SSL
static CURLcode https_connecting(struct connectdata *conn, bool *done);
static int https_getsock(struct connectdata *conn,
- curl_socket_t *socks,
- int numsocks);
+ curl_socket_t *socks);
#else
#define https_connecting(x,y) CURLE_COULDNT_CONNECT
#endif
@@ -171,10 +169,22 @@ static CURLcode http_setup_conn(struct connectdata *conn)
Curl_mime_initpart(&http->form, conn->data);
data->req.protop = http;
- if(!CONN_INUSE(conn))
- /* if not already multi-using, setup connection details */
- Curl_http2_setup_conn(conn);
- Curl_http2_setup_req(data);
+ if(data->set.httpversion == CURL_HTTP_VERSION_3) {
+ if(conn->handler->flags & PROTOPT_SSL)
+ /* Only go HTTP/3 directly on HTTPS URLs. It needs a UDP socket and does
+ the QUIC dance. */
+ conn->transport = TRNSPRT_QUIC;
+ else {
+ failf(data, "HTTP/3 requested for non-HTTPS URL");
+ return CURLE_URL_MALFORMAT;
+ }
+ }
+ else {
+ if(!CONN_INUSE(conn))
+ /* if not already multi-using, setup connection details */
+ Curl_http2_setup_conn(conn);
+ Curl_http2_setup_req(data);
+ }
return CURLE_OK;
}
@@ -334,7 +344,7 @@ static CURLcode http_output_bearer(struct connectdata *conn)
userp = &conn->allocptr.userpwd;
free(*userp);
*userp = aprintf("Authorization: Bearer %s\r\n",
- conn->oauth_bearer);
+ conn->data->set.str[STRING_BEARER]);
if(!*userp) {
result = CURLE_OUT_OF_MEMORY;
@@ -383,7 +393,7 @@ static bool pickoneauth(struct auth *pick, unsigned long mask)
}
/*
- * Curl_http_perhapsrewind()
+ * http_perhapsrewind()
*
* If we are doing POST or PUT {
* If we have more data to send {
@@ -440,9 +450,6 @@ static CURLcode http_perhapsrewind(struct connectdata *conn)
/* figure out how much data we are expected to send */
switch(data->set.httpreq) {
case HTTPREQ_POST:
- if(data->state.infilesize != -1)
- expectsend = data->state.infilesize;
- break;
case HTTPREQ_PUT:
if(data->state.infilesize != -1)
expectsend = data->state.infilesize;
@@ -548,7 +555,7 @@ CURLcode Curl_http_auth_act(struct connectdata *conn)
CURLcode result = CURLE_OK;
unsigned long authmask = ~0ul;
- if(!conn->oauth_bearer)
+ if(!data->set.str[STRING_BEARER])
authmask &= (unsigned long)~CURLAUTH_BEARER;
if(100 <= data->req.httpcode && 199 >= data->req.httpcode)
@@ -558,7 +565,7 @@ CURLcode Curl_http_auth_act(struct connectdata *conn)
if(data->state.authproblem)
return data->set.http_fail_on_error?CURLE_HTTP_RETURNED_ERROR:CURLE_OK;
- if((conn->bits.user_passwd || conn->oauth_bearer) &&
+ if((conn->bits.user_passwd || data->set.str[STRING_BEARER]) &&
((data->req.httpcode == 401) ||
(conn->bits.authneg && data->req.httpcode < 300))) {
pickhost = pickoneauth(&data->state.authhost, authmask);
@@ -634,9 +641,7 @@ output_auth_headers(struct connectdata *conn,
{
const char *auth = NULL;
CURLcode result = CURLE_OK;
-#if !defined(CURL_DISABLE_VERBOSE_STRINGS) || defined(USE_SPNEGO)
struct Curl_easy *data = conn->data;
-#endif
#ifdef CURL_DISABLE_CRYPTO_AUTH
(void)request;
@@ -644,7 +649,7 @@ output_auth_headers(struct connectdata *conn,
#endif
#ifdef USE_SPNEGO
- if((authstatus->picked == CURLAUTH_NEGOTIATE)) {
+ if(authstatus->picked == CURLAUTH_NEGOTIATE) {
auth = "Negotiate";
result = Curl_output_negotiate(conn, proxy);
if(result)
@@ -700,7 +705,7 @@ output_auth_headers(struct connectdata *conn,
}
if(authstatus->picked == CURLAUTH_BEARER) {
/* Bearer */
- if((!proxy && conn->oauth_bearer &&
+ if((!proxy && data->set.str[STRING_BEARER] &&
!Curl_checkheaders(conn, "Authorization:"))) {
auth = "Bearer";
result = http_output_bearer(conn);
@@ -758,7 +763,7 @@ Curl_http_output_auth(struct connectdata *conn,
authproxy = &data->state.authproxy;
if((conn->bits.httpproxy && conn->bits.proxy_user_passwd) ||
- conn->bits.user_passwd || conn->oauth_bearer)
+ conn->bits.user_passwd || data->set.str[STRING_BEARER])
/* continue please */;
else {
authhost->done = TRUE;
@@ -1136,10 +1141,14 @@ Curl_send_buffer *Curl_add_buffer_init(void)
*/
void Curl_add_buffer_free(Curl_send_buffer **inp)
{
- Curl_send_buffer *in = *inp;
- if(in) /* deal with NULL input */
+ Curl_send_buffer *in;
+ if(!inp)
+ return;
+ in = *inp;
+ if(in) { /* deal with NULL input */
free(in->buffer);
- free(in);
+ free(in);
+ }
*inp = NULL;
}
@@ -1497,11 +1506,9 @@ CURLcode Curl_http_connect(struct connectdata *conn, bool *done)
interface and then we're always _sending_ a request and thus we wait for
the single socket to become writable only */
static int http_getsock_do(struct connectdata *conn,
- curl_socket_t *socks,
- int numsocks)
+ curl_socket_t *socks)
{
/* write mode */
- (void)numsocks; /* unused, we trust it to be at least 1 */
socks[0] = conn->sock[FIRSTSOCKET];
return GETSOCK_WRITESOCK(0);
}
@@ -1555,6 +1562,13 @@ static CURLcode https_connecting(struct connectdata *conn, bool *done)
CURLcode result;
DEBUGASSERT((conn) && (conn->handler->flags & PROTOPT_SSL));
+#ifdef ENABLE_QUIC
+ if(conn->transport == TRNSPRT_QUIC) {
+ *done = TRUE;
+ return CURLE_OK;
+ }
+#endif
+
/* perform SSL initialization for this socket */
result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET, done);
if(result)
@@ -1564,11 +1578,10 @@ static CURLcode https_connecting(struct connectdata *conn, bool *done)
}
static int https_getsock(struct connectdata *conn,
- curl_socket_t *socks,
- int numsocks)
+ curl_socket_t *socks)
{
if(conn->handler->flags & PROTOPT_SSL)
- return Curl_ssl_getsock(conn, socks, numsocks);
+ return Curl_ssl_getsock(conn, socks);
return GETSOCK_BLANK;
}
#endif /* USE_SSL */
@@ -1602,7 +1615,8 @@ CURLcode Curl_http_done(struct connectdata *conn,
Curl_add_buffer_free(&http->send_buffer);
}
- Curl_http2_done(conn, premature);
+ Curl_http2_done(data, premature);
+ Curl_quic_done(data, premature);
Curl_mime_cleanpart(&http->form);
@@ -1650,6 +1664,12 @@ static bool use_http_1_1plus(const struct Curl_easy *data,
static const char *get_http_string(const struct Curl_easy *data,
const struct connectdata *conn)
{
+#ifdef ENABLE_QUIC
+ if((data->set.httpversion == CURL_HTTP_VERSION_3) ||
+ (conn->httpversion == 30))
+ return "3";
+#endif
+
#ifdef USE_NGHTTP2
if(conn->proto.httpc.h2)
return "2";
@@ -1669,8 +1689,8 @@ static CURLcode expect100(struct Curl_easy *data,
CURLcode result = CURLE_OK;
data->state.expect100header = FALSE; /* default to false unless it is set
to TRUE below */
- if(use_http_1_1plus(data, conn) &&
- (conn->httpversion != 20)) {
+ if(!data->state.disableexpect && use_http_1_1plus(data, conn) &&
+ (conn->httpversion < 20)) {
/* if not doing HTTP 1.0 or version 2, or disabled explicitly, we add an
Expect: 100-continue to the headers which actually speeds up post
operations (as there is one packet coming back from the web server) */
@@ -1700,7 +1720,7 @@ enum proxy_use {
will return an error code if one of the headers is
not formatted correctly */
CURLcode Curl_http_compile_trailers(struct curl_slist *trailers,
- Curl_send_buffer *buffer,
+ Curl_send_buffer **buffer,
struct Curl_easy *handle)
{
char *ptr = NULL;
@@ -1726,7 +1746,7 @@ CURLcode Curl_http_compile_trailers(struct curl_slist *trailers,
/* only add correctly formatted trailers */
ptr = strchr(trailers->data, ':');
if(ptr && *(ptr + 1) == ' ') {
- result = Curl_add_bufferf(&buffer, "%s%s", trailers->data,
+ result = Curl_add_bufferf(buffer, "%s%s", trailers->data,
endofline_native);
if(result)
return result;
@@ -1735,7 +1755,7 @@ CURLcode Curl_http_compile_trailers(struct curl_slist *trailers,
infof(handle, "Malformatted trailing header ! Skipping trailer.");
trailers = trailers->next;
}
- result = Curl_add_buffer(&buffer, endofline_network,
+ result = Curl_add_buffer(buffer, endofline_network,
strlen(endofline_network));
return result;
}
@@ -1851,7 +1871,7 @@ CURLcode Curl_add_custom_headers(struct connectdata *conn,
Connection: */
checkprefix("Connection:", compare))
;
- else if((conn->httpversion == 20) &&
+ else if((conn->httpversion >= 20) &&
checkprefix("Transfer-Encoding:", compare))
/* HTTP/2 doesn't support chunked requests */
;
@@ -1881,9 +1901,10 @@ CURLcode Curl_add_custom_headers(struct connectdata *conn,
}
#ifndef CURL_DISABLE_PARSEDATE
-CURLcode Curl_add_timecondition(struct Curl_easy *data,
+CURLcode Curl_add_timecondition(const struct connectdata *conn,
Curl_send_buffer *req_buffer)
{
+ struct Curl_easy *data = conn->data;
const struct tm *tm;
struct tm keeptime;
CURLcode result;
@@ -1916,6 +1937,11 @@ CURLcode Curl_add_timecondition(struct Curl_easy *data,
break;
}
+ if(Curl_checkheaders(conn, condp)) {
+ /* A custom header was specified; it will be sent instead. */
+ return CURLE_OK;
+ }
+
/* The If-Modified-Since header family should have their times set in
* GMT as RFC2616 defines: "All HTTP date/time stamps MUST be
* represented in Greenwich Mean Time (GMT), without exception. For the
@@ -1941,10 +1967,10 @@ CURLcode Curl_add_timecondition(struct Curl_easy *data,
}
#else
/* disabled */
-CURLcode Curl_add_timecondition(struct Curl_easy *data,
+CURLcode Curl_add_timecondition(const struct connectdata *conn,
Curl_send_buffer *req_buffer)
{
- (void)data;
+ (void)conn;
(void)req_buffer;
return CURLE_OK;
}
@@ -1976,55 +2002,57 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
const char *httpstring;
Curl_send_buffer *req_buffer;
curl_off_t postsize = 0; /* curl_off_t to handle large file sizes */
+ char *altused = NULL;
/* Always consider the DO phase done after this function call, even if there
may be parts of the request that is not yet sent, since we can deal with
the rest of the request in the PERFORM phase. */
*done = TRUE;
- if(conn->httpversion < 20) { /* unless the connection is re-used and already
- http2 */
- switch(conn->negnpn) {
- case CURL_HTTP_VERSION_2:
- conn->httpversion = 20; /* we know we're on HTTP/2 now */
-
- result = Curl_http2_switched(conn, NULL, 0);
- if(result)
- return result;
- break;
- case CURL_HTTP_VERSION_1_1:
- /* continue with HTTP/1.1 when explicitly requested */
- break;
- default:
- /* Check if user wants to use HTTP/2 with clear TCP*/
-#ifdef USE_NGHTTP2
- if(conn->data->set.httpversion ==
- CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE) {
- if(conn->bits.httpproxy && !conn->bits.tunnel_proxy) {
- /* We don't support HTTP/2 proxies yet. Also it's debatable whether
- or not this setting should apply to HTTP/2 proxies. */
- infof(data, "Ignoring HTTP/2 prior knowledge due to proxy\n");
- break;
- }
-
- DEBUGF(infof(data, "HTTP/2 over clean TCP\n"));
- conn->httpversion = 20;
+ if(conn->transport != TRNSPRT_QUIC) {
+ if(conn->httpversion < 20) { /* unless the connection is re-used and
+ already http2 */
+ switch(conn->negnpn) {
+ case CURL_HTTP_VERSION_2:
+ conn->httpversion = 20; /* we know we're on HTTP/2 now */
result = Curl_http2_switched(conn, NULL, 0);
if(result)
return result;
- }
+ break;
+ case CURL_HTTP_VERSION_1_1:
+ /* continue with HTTP/1.1 when explicitly requested */
+ break;
+ default:
+ /* Check if user wants to use HTTP/2 with clear TCP*/
+#ifdef USE_NGHTTP2
+ if(conn->data->set.httpversion ==
+ CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE) {
+ if(conn->bits.httpproxy && !conn->bits.tunnel_proxy) {
+ /* We don't support HTTP/2 proxies yet. Also it's debatable
+ whether or not this setting should apply to HTTP/2 proxies. */
+ infof(data, "Ignoring HTTP/2 prior knowledge due to proxy\n");
+ break;
+ }
+
+ DEBUGF(infof(data, "HTTP/2 over clean TCP\n"));
+ conn->httpversion = 20;
+
+ result = Curl_http2_switched(conn, NULL, 0);
+ if(result)
+ return result;
+ }
#endif
- break;
+ break;
+ }
+ }
+ else {
+ /* prepare for a http2 request */
+ result = Curl_http2_setup(conn);
+ if(result)
+ return result;
}
}
- else {
- /* prepare for a http2 request */
- result = Curl_http2_setup(conn);
- if(result)
- return result;
- }
-
http = data->req.protop;
DEBUGASSERT(http);
@@ -2220,14 +2248,16 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
else {
if((conn->handler->protocol & PROTO_FAMILY_HTTP) &&
(((httpreq == HTTPREQ_POST_MIME || httpreq == HTTPREQ_POST_FORM) &&
- http->postsize < 0) ||
- (data->set.upload && data->state.infilesize == -1))) {
+ http->postsize < 0) ||
+ ((data->set.upload || httpreq == HTTPREQ_POST) &&
+ data->state.infilesize == -1))) {
if(conn->bits.authneg)
/* don't enable chunked during auth neg */
;
else if(use_http_1_1plus(data, conn)) {
- /* HTTP, upload, unknown file size and not HTTP 1.0 */
- data->req.upload_chunky = TRUE;
+ if(conn->httpversion < 20)
+ /* HTTP, upload, unknown file size and not HTTP 1.0 */
+ data->req.upload_chunky = TRUE;
}
else {
failf(data, "Chunky upload is not supported by HTTP 1.0");
@@ -2328,7 +2358,6 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
/* and no fragment part */
CURLUcode uc;
- char *url;
CURLU *h = curl_url_dup(data->state.uh);
if(!h)
return CURLE_OUT_OF_MEMORY;
@@ -2359,19 +2388,15 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
return CURLE_OUT_OF_MEMORY;
}
}
- /* now extract the new version of the URL */
- uc = curl_url_get(h, CURLUPART_URL, &url, 0);
+ /* Extract the URL to use in the request. Store in STRING_TEMP_URL for
+ clean-up reasons if the function returns before the free() further
+ down. */
+ uc = curl_url_get(h, CURLUPART_URL, &data->set.str[STRING_TEMP_URL], 0);
if(uc) {
curl_url_cleanup(h);
return CURLE_OUT_OF_MEMORY;
}
- if(data->change.url_alloc)
- free(data->change.url);
-
- data->change.url = url;
- data->change.url_alloc = TRUE;
-
curl_url_cleanup(h);
if(strcasecompare("ftp", data->state.up.scheme)) {
@@ -2550,12 +2575,16 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
query = NULL;
}
+#ifndef CURL_DISABLE_PROXY
/* url */
if(conn->bits.httpproxy && !conn->bits.tunnel_proxy) {
- char *url = data->change.url;
+ char *url = data->set.str[STRING_TEMP_URL];
result = Curl_add_buffer(&req_buffer, url, strlen(url));
+ Curl_safefree(data->set.str[STRING_TEMP_URL]);
}
- else if(paste_ftp_userpwd)
+ else
+#endif
+ if(paste_ftp_userpwd)
result = Curl_add_bufferf(&req_buffer, "ftp://%s:%s@%s",
conn->user, conn->passwd,
path + sizeof("ftp://") - 1);
@@ -2569,6 +2598,14 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
if(result)
return result;
+#ifdef USE_ALTSVC
+ if(conn->bits.altused && !Curl_checkheaders(conn, "Alt-Used")) {
+ altused = aprintf("Alt-Used: %s:%d\r\n",
+ conn->conn_to_host.name, conn->conn_to_port);
+ if(!altused)
+ return CURLE_OUT_OF_MEMORY;
+ }
+#endif
result =
Curl_add_bufferf(&req_buffer,
"%s" /* ftp typecode (;type=x) */
@@ -2583,7 +2620,8 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
"%s" /* accept-encoding */
"%s" /* referer */
"%s" /* Proxy-Connection */
- "%s",/* transfer-encoding */
+ "%s" /* transfer-encoding */
+ "%s",/* Alt-Used */
ftp_typecode,
httpstring,
@@ -2609,13 +2647,15 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
!conn->bits.tunnel_proxy &&
!Curl_checkProxyheaders(conn, "Proxy-Connection"))?
"Proxy-Connection: Keep-Alive\r\n":"",
- te
+ te,
+ altused ? altused : ""
);
/* clear userpwd and proxyuserpwd to avoid re-using old credentials
* from re-used connections */
Curl_safefree(conn->allocptr.userpwd);
Curl_safefree(conn->allocptr.proxyuserpwd);
+ free(altused);
if(result)
return result;
@@ -2635,7 +2675,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
struct Cookie *co = NULL; /* no cookies from start */
int count = 0;
- if(data->cookies) {
+ if(data->cookies && data->state.cookie_engine) {
Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE);
co = Curl_cookie_getlist(data->cookies,
conn->allocptr.cookiehost?
@@ -2683,7 +2723,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
}
#endif
- result = Curl_add_timecondition(data, req_buffer);
+ result = Curl_add_timecondition(conn, req_buffer);
if(result)
return result;
@@ -3000,11 +3040,12 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
failf(data, "Failed sending HTTP request");
else
/* HTTP GET/HEAD download: */
- Curl_setup_transfer(data, FIRSTSOCKET, -1, TRUE,
- http->postdata?FIRSTSOCKET:-1);
+ Curl_setup_transfer(data, FIRSTSOCKET, -1, TRUE, -1);
}
if(result)
return result;
+ if(!postsize)
+ data->req.upload_done = TRUE;
if(data->req.writebytecount) {
/* if a request-body has been sent off, we make sure this progress is noted
@@ -3147,6 +3188,9 @@ static CURLcode header_append(struct Curl_easy *data,
struct SingleRequest *k,
size_t length)
{
+ /* length is at most the size of a full read buffer, for which the upper
+ bound is CURL_MAX_READ_SIZE. There is thus no chance of overflow in this
+ calculation. */
size_t newsize = k->hbuflen + length;
if(newsize > CURL_MAX_HTTP_HEADER) {
/* The reason to have a max limit for this is to avoid the risk of a bad
@@ -3501,7 +3545,16 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
*/
Curl_expire_done(data, EXPIRE_100_TIMEOUT);
if(!k->upload_done) {
- if(data->set.http_keep_sending_on_error) {
+ if((k->httpcode == 417) && data->state.expect100header) {
+ /* 417 Expectation Failed - try again without the Expect
+ header */
+ infof(data, "Got 417 while waiting for a 100\n");
+ data->state.disableexpect = TRUE;
+ DEBUGASSERT(!data->req.newurl);
+ data->req.newurl = strdup(conn->data->change.url);
+ Curl_done_sending(conn, k);
+ }
+ else if(data->set.http_keep_sending_on_error) {
infof(data, "HTTP error before end of send, keep sending\n");
if(k->exp100 > EXP100_SEND_DATA) {
k->exp100 = EXP100_SEND_DATA;
@@ -3511,8 +3564,10 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
else {
infof(data, "HTTP error before end of send, stop sending\n");
streamclose(conn, "Stop sending data before everything sent");
+ result = Curl_done_sending(conn, k);
+ if(result)
+ return result;
k->upload_done = TRUE;
- k->keepon &= ~KEEP_SEND; /* don't send */
if(data->state.expect100header)
k->exp100 = EXP100_FAILED;
}
@@ -3649,6 +3704,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
* guarantees on future behaviors since it isn't within the protocol.
*/
char separator;
+ char twoorthree[2];
nc = sscanf(HEADER1,
" HTTP/%1d.%1d%c%3d",
&httpversion_major,
@@ -3656,8 +3712,8 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
&separator,
&k->httpcode);
- if(nc == 1 && httpversion_major == 2 &&
- 1 == sscanf(HEADER1, " HTTP/2 %d", &k->httpcode)) {
+ if(nc == 1 && httpversion_major >= 2 &&
+ 2 == sscanf(HEADER1, " HTTP/%1[23] %d", twoorthree, &k->httpcode)) {
conn->httpversion = 0;
nc = 4;
separator = ' ';
@@ -3695,7 +3751,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
}
}
else {
- failf(data, "Unsupported HTTP version in response\n");
+ failf(data, "Unsupported HTTP version in response");
return CURLE_UNSUPPORTED_PROTOCOL;
}
}
@@ -3769,6 +3825,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
"HTTP 1.1 or later with persistent connection\n"));
}
+ k->http_bodyless = k->httpcode >= 100 && k->httpcode < 200;
switch(k->httpcode) {
case 304:
/* (quote from RFC2616, section 10.3.5): The 304 response
@@ -3786,10 +3843,9 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
* empty line after the header fields. */
k->size = 0;
k->maxdownload = 0;
- k->ignorecl = TRUE; /* ignore Content-Length headers */
+ k->http_bodyless = TRUE;
break;
default:
- /* nothing */
break;
}
}
@@ -3805,8 +3861,8 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
return result;
/* Check for Content-Length: header lines to get size */
- if(!k->ignorecl && !data->set.ignorecl &&
- checkprefix("Content-Length:", k->p)) {
+ if(!k->http_bodyless &&
+ !data->set.ignorecl && checkprefix("Content-Length:", k->p)) {
curl_off_t contentlength;
CURLofft offt = curlx_strtoofft(k->p + 15, NULL, 10, &contentlength);
@@ -3895,7 +3951,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
*/
streamclose(conn, "Connection: close used");
}
- else if(checkprefix("Transfer-Encoding:", k->p)) {
+ else if(!k->http_bodyless && checkprefix("Transfer-Encoding:", k->p)) {
/* One or more encodings. We check for chunked and/or a compression
algorithm. */
/*
@@ -3911,7 +3967,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
if(result)
return result;
}
- else if(checkprefix("Content-Encoding:", k->p) &&
+ else if(!k->http_bodyless && checkprefix("Content-Encoding:", k->p) &&
data->set.str[STRING_ENCODING]) {
/*
* Process Content-Encoding. Look for the values: identity,
@@ -3924,7 +3980,20 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
if(result)
return result;
}
- else if(checkprefix("Content-Range:", k->p)) {
+ else if(checkprefix("Retry-After:", k->p)) {
+ /* Retry-After = HTTP-date / delay-seconds */
+ curl_off_t retry_after = 0; /* zero for unknown or "now" */
+ time_t date = Curl_getdate_capped(&k->p[12]);
+ if(-1 == date) {
+ /* not a date, try it as a decimal number */
+ (void)curlx_strtoofft(&k->p[12], NULL, 10, &retry_after);
+ }
+ else
+ /* convert date to number of seconds into the future */
+ retry_after = date - time(NULL);
+ data->info.retry_after = retry_after; /* store it */
+ }
+ else if(!k->http_bodyless && checkprefix("Content-Range:", k->p)) {
/* Content-Range: bytes [num]-
Content-Range: bytes: [num]-
Content-Range: [num]-
@@ -3954,7 +4023,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
data->state.resume_from = 0; /* get everything */
}
#if !defined(CURL_DISABLE_COOKIES)
- else if(data->cookies &&
+ else if(data->cookies && data->state.cookie_engine &&
checkprefix("Set-Cookie:", k->p)) {
Curl_share_lock(data, CURL_LOCK_DATA_COOKIE,
CURL_LOCK_ACCESS_SINGLE);
@@ -3970,11 +4039,9 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE);
}
#endif
- else if(checkprefix("Last-Modified:", k->p) &&
+ else if(!k->http_bodyless && checkprefix("Last-Modified:", k->p) &&
(data->set.timecondition || data->set.get_filetime) ) {
- time_t secs = time(NULL);
- k->timeofdoc = curl_getdate(k->p + strlen("Last-Modified:"),
- &secs);
+ k->timeofdoc = Curl_getdate_capped(k->p + strlen("Last-Modified:"));
if(data->set.get_filetime)
data->info.filetime = k->timeofdoc;
}
@@ -3995,7 +4062,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
if(result)
return result;
}
- #ifdef USE_SPNEGO
+#ifdef USE_SPNEGO
else if(checkprefix("Persistent-Auth", k->p)) {
struct negotiatedata *negdata = &conn->negotiate;
struct auth *authp = &data->state.authhost;
@@ -4003,14 +4070,15 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
char *persistentauth = Curl_copy_header_value(k->p);
if(!persistentauth)
return CURLE_OUT_OF_MEMORY;
- negdata->noauthpersist = checkprefix("false", persistentauth);
+ negdata->noauthpersist = checkprefix("false", persistentauth)?
+ TRUE:FALSE;
negdata->havenoauthpersist = TRUE;
infof(data, "Negotiate: noauthpersist -> %d, header part: %s",
negdata->noauthpersist, persistentauth);
free(persistentauth);
}
}
- #endif
+#endif
else if((k->httpcode >= 300 && k->httpcode < 400) &&
checkprefix("Location:", k->p) &&
!data->req.location) {
diff --git a/Utilities/cmcurl/lib/http.h b/Utilities/cmcurl/lib/http.h
index a59fe7a..4c1825f 100644
--- a/Utilities/cmcurl/lib/http.h
+++ b/Utilities/cmcurl/lib/http.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -69,32 +69,24 @@ CURLcode Curl_add_buffer_send(Curl_send_buffer **inp,
size_t included_body_bytes,
int socketindex);
-CURLcode Curl_add_timecondition(struct Curl_easy *data,
+CURLcode Curl_add_timecondition(const struct connectdata *conn,
Curl_send_buffer *buf);
CURLcode Curl_add_custom_headers(struct connectdata *conn,
bool is_connect,
Curl_send_buffer *req_buffer);
CURLcode Curl_http_compile_trailers(struct curl_slist *trailers,
- Curl_send_buffer *buffer,
+ Curl_send_buffer **buffer,
struct Curl_easy *handle);
/* protocol-specific functions set up to be called by the main engine */
CURLcode Curl_http(struct connectdata *conn, bool *done);
CURLcode Curl_http_done(struct connectdata *, CURLcode, bool premature);
CURLcode Curl_http_connect(struct connectdata *conn, bool *done);
-CURLcode Curl_http_setup_conn(struct connectdata *conn);
-
-/* The following functions are defined in http_chunks.c */
-void Curl_httpchunk_init(struct connectdata *conn);
-CHUNKcode Curl_httpchunk_read(struct connectdata *conn, char *datap,
- ssize_t length, ssize_t *wrote);
/* These functions are in http.c */
-void Curl_http_auth_stage(struct Curl_easy *data, int stage);
CURLcode Curl_http_input_auth(struct connectdata *conn, bool proxy,
const char *auth);
CURLcode Curl_http_auth_act(struct connectdata *conn);
-CURLcode Curl_http_perhapsrewind(struct connectdata *conn);
/* If only the PICKNONE bit is set, there has been a round-trip and we
selected to use no auth at all. Ie, we actively select no auth, as opposed
@@ -124,11 +116,15 @@ CURLcode Curl_http_perhapsrewind(struct connectdata *conn);
*
*/
#ifndef EXPECT_100_THRESHOLD
-#define EXPECT_100_THRESHOLD 1024
+#define EXPECT_100_THRESHOLD (1024*1024)
#endif
#endif /* CURL_DISABLE_HTTP */
+#ifdef USE_NGHTTP3
+struct h3out; /* see ngtcp2 */
+#endif
+
/****************************************************************************
* HTTP unique setup
***************************************************************************/
@@ -175,19 +171,39 @@ struct HTTP {
int status_code; /* HTTP status code */
const uint8_t *pausedata; /* pointer to data received in on_data_chunk */
size_t pauselen; /* the number of bytes left in data */
- bool closed; /* TRUE on HTTP2 stream close */
bool close_handled; /* TRUE if stream closure is handled by libcurl */
+
+ char **push_headers; /* allocated array */
+ size_t push_headers_used; /* number of entries filled in */
+ size_t push_headers_alloc; /* number of entries allocated */
+#endif
+#if defined(USE_NGHTTP2) || defined(USE_NGHTTP3)
+ bool closed; /* TRUE on HTTP2 stream close */
char *mem; /* points to a buffer in memory to store received data */
size_t len; /* size of the buffer 'mem' points to */
size_t memlen; /* size of data copied to mem */
-
+#endif
+#if defined(USE_NGHTTP2) || defined(ENABLE_QUIC)
+ /* fields used by both HTTP/2 and HTTP/3 */
const uint8_t *upload_mem; /* points to a buffer to read from */
size_t upload_len; /* size of the buffer 'upload_mem' points to */
curl_off_t upload_left; /* number of bytes left to upload */
+#endif
- char **push_headers; /* allocated array */
- size_t push_headers_used; /* number of entries filled in */
- size_t push_headers_alloc; /* number of entries allocated */
+#ifdef ENABLE_QUIC
+ /*********** for HTTP/3 we store stream-local data here *************/
+ int64_t stream3_id; /* stream we are interested in */
+ bool firstheader; /* FALSE until headers arrive */
+ bool firstbody; /* FALSE until body arrives */
+ bool h3req; /* FALSE until request is issued */
+ bool upload_done;
+#endif
+#ifdef USE_NGHTTP3
+ size_t unacked_window;
+ struct h3out *h3out; /* per-stream buffers for upload */
+ char *overflow_buf; /* excess data received during a single Curl_read */
+ size_t overflow_buflen; /* amount of data currently in overflow_buf */
+ size_t overflow_bufsize; /* size of the overflow_buf allocation */
#endif
};
diff --git a/Utilities/cmcurl/lib/http2.c b/Utilities/cmcurl/lib/http2.c
index 8e7bc21..72b38a3 100644
--- a/Utilities/cmcurl/lib/http2.c
+++ b/Utilities/cmcurl/lib/http2.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -43,19 +43,11 @@
#define H2_BUFSIZE 32768
-#if (NGHTTP2_VERSION_NUM < 0x010000)
+#if (NGHTTP2_VERSION_NUM < 0x010c00)
#error too old nghttp2 version, upgrade!
#endif
-#if (NGHTTP2_VERSION_NUM > 0x010800)
-#define NGHTTP2_HAS_HTTP2_STRERROR 1
-#endif
-
-#if (NGHTTP2_VERSION_NUM >= 0x010900)
-/* nghttp2_session_callbacks_set_error_callback is present in nghttp2 1.9.0 or
- later */
-#define NGHTTP2_HAS_ERROR_CALLBACK 1
-#else
+#ifdef CURL_DISABLE_VERBOSE_STRINGS
#define nghttp2_session_callbacks_set_error_callback(x,y)
#endif
@@ -63,12 +55,12 @@
#define NGHTTP2_HAS_SET_LOCAL_WINDOW_SIZE 1
#endif
-#define HTTP2_HUGE_WINDOW_SIZE (1 << 30)
+#define HTTP2_HUGE_WINDOW_SIZE (32 * 1024 * 1024) /* 32 MB */
#ifdef DEBUG_HTTP2
#define H2BUGF(x) x
#else
-#define H2BUGF(x) do { } WHILE_FALSE
+#define H2BUGF(x) do { } while(0)
#endif
@@ -100,16 +92,11 @@ void Curl_http2_init_userset(struct UserDefined *set)
}
static int http2_perform_getsock(const struct connectdata *conn,
- curl_socket_t *sock, /* points to
- numsocks
- number of
- sockets */
- int numsocks)
+ curl_socket_t *sock)
{
const struct http_conn *c = &conn->proto.httpc;
struct SingleRequest *k = &conn->data->req;
int bitmap = GETSOCK_BLANK;
- (void)numsocks;
sock[0] = conn->sock[FIRSTSOCKET];
@@ -126,11 +113,9 @@ static int http2_perform_getsock(const struct connectdata *conn,
}
static int http2_getsock(struct connectdata *conn,
- curl_socket_t *sock, /* points to numsocks
- number of sockets */
- int numsocks)
+ curl_socket_t *socks)
{
- return http2_perform_getsock(conn, sock, numsocks);
+ return http2_perform_getsock(conn, socks);
}
/*
@@ -240,7 +225,7 @@ static unsigned int http2_conncheck(struct connectdata *check,
if(checks_to_perform & CONNCHECK_KEEPALIVE) {
struct curltime now = Curl_now();
- time_t elapsed = Curl_timediff(now, check->keepalive);
+ timediff_t elapsed = Curl_timediff(now, check->keepalive);
if(elapsed > check->upkeep_interval_ms) {
/* Perform an HTTP/2 PING */
@@ -269,7 +254,7 @@ static unsigned int http2_conncheck(struct connectdata *check,
return ret_val;
}
-/* called from Curl_http_setup_conn */
+/* called from http_setup_conn */
void Curl_http2_setup_req(struct Curl_easy *data)
{
struct HTTP *http = data->req.protop;
@@ -286,7 +271,7 @@ void Curl_http2_setup_req(struct Curl_easy *data)
http->memlen = 0;
}
-/* called from Curl_http_setup_conn */
+/* called from http_setup_conn */
void Curl_http2_setup_conn(struct connectdata *conn)
{
conn->proto.httpc.settings.max_concurrent_streams =
@@ -351,35 +336,6 @@ int Curl_http2_ver(char *p, size_t len)
return msnprintf(p, len, " nghttp2/%s", h2->version_str);
}
-/* HTTP/2 error code to name based on the Error Code Registry.
-https://tools.ietf.org/html/rfc7540#page-77
-nghttp2_error_code enums are identical.
-*/
-static const char *http2_strerror(uint32_t err)
-{
-#ifndef NGHTTP2_HAS_HTTP2_STRERROR
- const char *str[] = {
- "NO_ERROR", /* 0x0 */
- "PROTOCOL_ERROR", /* 0x1 */
- "INTERNAL_ERROR", /* 0x2 */
- "FLOW_CONTROL_ERROR", /* 0x3 */
- "SETTINGS_TIMEOUT", /* 0x4 */
- "STREAM_CLOSED", /* 0x5 */
- "FRAME_SIZE_ERROR", /* 0x6 */
- "REFUSED_STREAM", /* 0x7 */
- "CANCEL", /* 0x8 */
- "COMPRESSION_ERROR", /* 0x9 */
- "CONNECT_ERROR", /* 0xA */
- "ENHANCE_YOUR_CALM", /* 0xB */
- "INADEQUATE_SECURITY", /* 0xC */
- "HTTP_1_1_REQUIRED" /* 0xD */
- };
- return (err < sizeof(str) / sizeof(str[0])) ? str[err] : "unknown";
-#else
- return nghttp2_http2_strerror(err);
-#endif
-}
-
/*
* The implementation of nghttp2_send_callback type. Here we write |data| with
* size |length| to the network and return the number of bytes actually
@@ -503,16 +459,14 @@ static struct Curl_easy *duphandle(struct Curl_easy *data)
/* setup the request struct */
struct HTTP *http = calloc(1, sizeof(struct HTTP));
if(!http) {
- (void)Curl_close(second);
- second = NULL;
+ (void)Curl_close(&second);
}
else {
second->req.protop = http;
http->header_recvbuf = Curl_add_buffer_init();
if(!http->header_recvbuf) {
free(http);
- (void)Curl_close(second);
- second = NULL;
+ (void)Curl_close(&second);
}
else {
Curl_http2_setup_req(second);
@@ -554,7 +508,7 @@ static int push_promise(struct Curl_easy *data,
stream = data->req.protop;
if(!stream) {
failf(data, "Internal NULL stream!\n");
- (void)Curl_close(newhandle);
+ (void)Curl_close(&newhandle);
rv = 1;
goto fail;
}
@@ -576,7 +530,7 @@ static int push_promise(struct Curl_easy *data,
/* denied, kill off the new handle again */
http2_stream_free(newhandle->req.protop);
newhandle->req.protop = NULL;
- (void)Curl_close(newhandle);
+ (void)Curl_close(&newhandle);
goto fail;
}
@@ -592,7 +546,7 @@ static int push_promise(struct Curl_easy *data,
infof(data, "failed to add handle to multi\n");
http2_stream_free(newhandle->req.protop);
newhandle->req.protop = NULL;
- Curl_close(newhandle);
+ Curl_close(&newhandle);
rv = 1;
goto fail;
}
@@ -847,7 +801,7 @@ static int on_stream_close(nghttp2_session *session, int32_t stream_id,
return 0;
}
H2BUGF(infof(data_s, "on_stream_close(), %s (err %d), stream %u\n",
- http2_strerror(error_code), error_code, stream_id));
+ nghttp2_strerror(error_code), error_code, stream_id));
stream = data_s->req.protop;
if(!stream)
return NGHTTP2_ERR_CALLBACK_FAILURE;
@@ -855,6 +809,7 @@ static int on_stream_close(nghttp2_session *session, int32_t stream_id,
stream->closed = TRUE;
httpc = &conn->proto.httpc;
drain_this(data_s, httpc);
+ Curl_expire(data_s, 0, EXPIRE_RUN_NOW);
httpc->error_code = error_code;
/* remove the entry from the hash as the stream is now gone */
@@ -974,7 +929,9 @@ static int on_header(nghttp2_session *session, const nghttp2_frame *frame,
if(!check)
/* no memory */
return NGHTTP2_ERR_CALLBACK_FAILURE;
- if(!Curl_strcasecompare(check, (const char *)value)) {
+ if(!Curl_strcasecompare(check, (const char *)value) &&
+ ((conn->remote_port != conn->given->defport) ||
+ !Curl_strcasecompare(conn->host.name, (const char *)value))) {
/* This is push is not for the same authority that was asked for in
* the URL. RFC 7540 section 8.2 says: "A client MUST treat a
* PUSH_PROMISE for which the server is not authoritative as a stream
@@ -1144,8 +1101,7 @@ static ssize_t data_source_read_callback(nghttp2_session *session,
return nread;
}
-#if defined(NGHTTP2_HAS_ERROR_CALLBACK) && \
- !defined(CURL_DISABLE_VERBOSE_STRINGS)
+#if !defined(CURL_DISABLE_VERBOSE_STRINGS)
static int error_callback(nghttp2_session *session,
const char *msg,
size_t len,
@@ -1162,9 +1118,10 @@ static void populate_settings(struct connectdata *conn,
struct http_conn *httpc)
{
nghttp2_settings_entry *iv = httpc->local_settings;
+ DEBUGASSERT(conn->data);
iv[0].settings_id = NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS;
- iv[0].value = 100;
+ iv[0].value = Curl_multi_max_concurrent_streams(conn->data->multi);
iv[1].settings_id = NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE;
iv[1].value = HTTP2_HUGE_WINDOW_SIZE;
@@ -1175,11 +1132,10 @@ static void populate_settings(struct connectdata *conn,
httpc->local_settings_num = 3;
}
-void Curl_http2_done(struct connectdata *conn, bool premature)
+void Curl_http2_done(struct Curl_easy *data, bool premature)
{
- struct Curl_easy *data = conn->data;
struct HTTP *http = data->req.protop;
- struct http_conn *httpc = &conn->proto.httpc;
+ struct http_conn *httpc = &data->conn->proto.httpc;
/* there might be allocated resources done before this got the 'h2' pointer
setup */
@@ -1199,9 +1155,6 @@ void Curl_http2_done(struct connectdata *conn, bool premature)
if(!httpc->h2) /* not HTTP/2 ? */
return;
- if(data->state.drain)
- drained_transfer(data, httpc);
-
if(premature) {
/* RST_STREAM */
if(!nghttp2_submit_rst_stream(httpc->h2, NGHTTP2_FLAG_NONE,
@@ -1213,6 +1166,10 @@ void Curl_http2_done(struct connectdata *conn, bool premature)
httpc->pause_stream_id = 0;
}
}
+
+ if(data->state.drain)
+ drained_transfer(data, httpc);
+
/* -1 means unassigned and 0 means cleared */
if(http->stream_id > 0) {
int rv = nghttp2_session_set_stream_user_data(httpc->h2,
@@ -1263,9 +1220,7 @@ static CURLcode http2_init(struct connectdata *conn)
/* nghttp2_on_header_callback */
nghttp2_session_callbacks_set_on_header_callback(callbacks, on_header);
-#ifndef CURL_DISABLE_VERBOSE_STRINGS
nghttp2_session_callbacks_set_error_callback(callbacks, error_callback);
-#endif
/* The nghttp2 session is not yet setup, do it */
rc = nghttp2_session_client_new(&conn->proto.httpc.h2, callbacks, conn);
@@ -1463,7 +1418,7 @@ static ssize_t http2_handle_stream_close(struct connectdata *conn,
}
else if(httpc->error_code != NGHTTP2_NO_ERROR) {
failf(data, "HTTP/2 stream %d was not closed cleanly: %s (err %u)",
- stream->stream_id, http2_strerror(httpc->error_code),
+ stream->stream_id, nghttp2_strerror(httpc->error_code),
httpc->error_code);
*err = CURLE_HTTP2_STREAM;
return -1;
@@ -1541,6 +1496,7 @@ static int h2_session_send(struct Curl_easy *data,
H2BUGF(infof(data, "Queuing PRIORITY on stream %u (easy %p)\n",
stream->stream_id, data));
+ DEBUGASSERT(stream->stream_id != -1);
rv = nghttp2_submit_priority(h2, NGHTTP2_FLAG_NONE, stream->stream_id,
&pri_spec);
if(rv)
@@ -1565,6 +1521,11 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex,
if(should_close_session(httpc)) {
H2BUGF(infof(data,
"http2_recv: nothing to do in this session\n"));
+ if(conn->bits.close) {
+ /* already marked for closure, return OK and we're done */
+ *err = CURLE_OK;
+ return 0;
+ }
*err = CURLE_HTTP2;
return -1;
}
@@ -1594,8 +1555,12 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex,
return ncopy;
}
- H2BUGF(infof(data, "http2_recv: easy %p (stream %u)\n",
- data, stream->stream_id));
+ H2BUGF(infof(data, "http2_recv: easy %p (stream %u) win %u/%u\n",
+ data, stream->stream_id,
+ nghttp2_session_get_local_window_size(httpc->h2),
+ nghttp2_session_get_stream_local_window_size(httpc->h2,
+ stream->stream_id)
+ ));
if((data->state.drain) && stream->memlen) {
H2BUGF(infof(data, "http2_recv: DRAIN %zu bytes stream %u!! (%p => %p)\n",
@@ -1626,7 +1591,6 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex,
stream->pausedata += nread;
stream->pauselen -= nread;
- infof(data, "%zd data bytes written\n", nread);
if(stream->pauselen == 0) {
H2BUGF(infof(data, "Unpaused by stream %u\n", stream->stream_id));
DEBUGASSERT(httpc->pause_stream_id == stream->stream_id);
@@ -1660,6 +1624,9 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex,
socket is not read. But it seems that usually streams are
notified with its drain property, and socket is read again
quickly. */
+ if(stream->closed)
+ /* closed overrides paused */
+ return 0;
H2BUGF(infof(data, "stream %x is paused, pause id: %x\n",
stream->stream_id, httpc->pause_stream_id));
*err = CURLE_AGAIN;
@@ -1754,14 +1721,16 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex,
else if(!stream->closed) {
drained_transfer(data, httpc);
}
+ else
+ /* this stream is closed, trigger a another read ASAP to detect that */
+ Curl_expire(data, 0, EXPIRE_RUN_NOW);
return retlen;
}
- /* If stream is closed, return 0 to signal the http routine to close
+ /* If this stream is closed, return 0 to signal the http routine to close
the connection */
- if(stream->closed) {
- return http2_handle_stream_close(conn, data, stream, err);
- }
+ if(stream->closed)
+ return 0;
*err = CURLE_AGAIN;
H2BUGF(infof(data, "http2_recv returns AGAIN for stream %u\n",
stream->stream_id));
@@ -1772,8 +1741,9 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex,
field list. */
#define AUTHORITY_DST_IDX 3
+/* USHRT_MAX is 65535 == 0xffff */
#define HEADER_OVERFLOW(x) \
- (x.namelen > (uint16_t)-1 || x.valuelen > (uint16_t)-1 - x.namelen)
+ (x.namelen > 0xffff || x.valuelen > 0xffff - x.namelen)
/*
* Check header memory for the token "trailers".
@@ -1880,7 +1850,11 @@ static ssize_t http2_send(struct connectdata *conn, int sockindex,
are going to send or sending request body in DATA frame */
stream->upload_mem = mem;
stream->upload_len = len;
- nghttp2_session_resume_data(h2, stream->stream_id);
+ rv = nghttp2_session_resume_data(h2, stream->stream_id);
+ if(nghttp2_is_fatal(rv)) {
+ *err = CURLE_SEND_ERROR;
+ return -1;
+ }
rv = h2_session_send(conn->data, h2);
if(nghttp2_is_fatal(rv)) {
*err = CURLE_SEND_ERROR;
@@ -2019,8 +1993,10 @@ static ssize_t http2_send(struct connectdata *conn, int sockindex,
nva[i].namelen = strlen((char *)nva[i].name);
}
else {
- nva[i].name = (unsigned char *)hdbuf;
nva[i].namelen = (size_t)(end - hdbuf);
+ /* Lower case the header name for HTTP/2 */
+ Curl_strntolower((char *)hdbuf, hdbuf, nva[i].namelen);
+ nva[i].name = (unsigned char *)hdbuf;
}
hdbuf = end + 1;
while(*hdbuf == ' ' || *hdbuf == '\t')
@@ -2130,17 +2106,14 @@ static ssize_t http2_send(struct connectdata *conn, int sockindex,
return -1;
}
- if(stream->stream_id != -1) {
- /* If whole HEADERS frame was sent off to the underlying socket,
- the nghttp2 library calls data_source_read_callback. But only
- it found that no data available, so it deferred the DATA
- transmission. Which means that nghttp2_session_want_write()
- returns 0 on http2_perform_getsock(), which results that no
- writable socket check is performed. To workaround this, we
- issue nghttp2_session_resume_data() here to bring back DATA
- transmission from deferred state. */
- nghttp2_session_resume_data(h2, stream->stream_id);
- }
+ /* If whole HEADERS frame was sent off to the underlying socket, the nghttp2
+ library calls data_source_read_callback. But only it found that no data
+ available, so it deferred the DATA transmission. Which means that
+ nghttp2_session_want_write() returns 0 on http2_perform_getsock(), which
+ results that no writable socket check is performed. To workaround this,
+ we issue nghttp2_session_resume_data() here to bring back DATA
+ transmission from deferred state. */
+ nghttp2_session_resume_data(h2, stream->stream_id);
return len;
@@ -2255,7 +2228,6 @@ CURLcode Curl_http2_switched(struct connectdata *conn,
}
}
-#ifdef NGHTTP2_HAS_SET_LOCAL_WINDOW_SIZE
rv = nghttp2_session_set_local_window_size(httpc->h2, NGHTTP2_FLAG_NONE, 0,
HTTP2_HUGE_WINDOW_SIZE);
if(rv != 0) {
@@ -2263,7 +2235,6 @@ CURLcode Curl_http2_switched(struct connectdata *conn,
nghttp2_strerror(rv), rv);
return CURLE_HTTP2;
}
-#endif
/* we are going to copy mem to httpc->inbuf. This is required since
mem is part of buffer pointed by stream->mem, and callbacks
@@ -2321,6 +2292,51 @@ CURLcode Curl_http2_switched(struct connectdata *conn,
return CURLE_OK;
}
+CURLcode Curl_http2_stream_pause(struct Curl_easy *data, bool pause)
+{
+ DEBUGASSERT(data);
+ DEBUGASSERT(data->conn);
+ /* if it isn't HTTP/2, we're done */
+ if(!data->conn->proto.httpc.h2)
+ return CURLE_OK;
+#ifdef NGHTTP2_HAS_SET_LOCAL_WINDOW_SIZE
+ else {
+ struct HTTP *stream = data->req.protop;
+ struct http_conn *httpc = &data->conn->proto.httpc;
+ uint32_t window = !pause * HTTP2_HUGE_WINDOW_SIZE;
+ int rv = nghttp2_session_set_local_window_size(httpc->h2,
+ NGHTTP2_FLAG_NONE,
+ stream->stream_id,
+ window);
+ if(rv) {
+ failf(data, "nghttp2_session_set_local_window_size() failed: %s(%d)",
+ nghttp2_strerror(rv), rv);
+ return CURLE_HTTP2;
+ }
+
+ /* make sure the window update gets sent */
+ rv = h2_session_send(data, httpc->h2);
+ if(rv)
+ return CURLE_SEND_ERROR;
+
+ DEBUGF(infof(data, "Set HTTP/2 window size to %u for stream %u\n",
+ window, stream->stream_id));
+
+#ifdef DEBUGBUILD
+ {
+ /* read out the stream local window again */
+ uint32_t window2 =
+ nghttp2_session_get_stream_local_window_size(httpc->h2,
+ stream->stream_id);
+ DEBUGF(infof(data, "HTTP/2 window size is now %u for stream %u\n",
+ window2, stream->stream_id));
+ }
+#endif
+ }
+#endif
+ return CURLE_OK;
+}
+
CURLcode Curl_http2_add_child(struct Curl_easy *parent,
struct Curl_easy *child,
bool exclusive)
@@ -2414,8 +2430,6 @@ bool Curl_h2_http_1_1_error(struct connectdata *conn)
#else /* !USE_NGHTTP2 */
/* Satisfy external references even if http2 is not compiled in. */
-
-#define CURL_DISABLE_TYPECHECK
#include <curl/curl.h>
char *curl_pushheader_bynum(struct curl_pushheaders *h, size_t num)
diff --git a/Utilities/cmcurl/lib/http2.h b/Utilities/cmcurl/lib/http2.h
index db6217b..1989aff 100644
--- a/Utilities/cmcurl/lib/http2.h
+++ b/Utilities/cmcurl/lib/http2.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -42,16 +42,15 @@ const char *Curl_http2_strerror(uint32_t err);
CURLcode Curl_http2_init(struct connectdata *conn);
void Curl_http2_init_state(struct UrlState *state);
void Curl_http2_init_userset(struct UserDefined *set);
-CURLcode Curl_http2_send_request(struct connectdata *conn);
CURLcode Curl_http2_request_upgrade(Curl_send_buffer *req,
struct connectdata *conn);
CURLcode Curl_http2_setup(struct connectdata *conn);
CURLcode Curl_http2_switched(struct connectdata *conn,
const char *data, size_t nread);
-/* called from Curl_http_setup_conn */
+/* called from http_setup_conn */
void Curl_http2_setup_conn(struct connectdata *conn);
void Curl_http2_setup_req(struct Curl_easy *data);
-void Curl_http2_done(struct connectdata *conn, bool premature);
+void Curl_http2_done(struct Curl_easy *data, bool premature);
CURLcode Curl_http2_done_sending(struct connectdata *conn);
CURLcode Curl_http2_add_child(struct Curl_easy *parent,
struct Curl_easy *child,
@@ -59,11 +58,11 @@ CURLcode Curl_http2_add_child(struct Curl_easy *parent,
void Curl_http2_remove_child(struct Curl_easy *parent,
struct Curl_easy *child);
void Curl_http2_cleanup_dependencies(struct Curl_easy *data);
+CURLcode Curl_http2_stream_pause(struct Curl_easy *data, bool pause);
/* returns true if the HTTP/2 stream error was HTTP_1_1_REQUIRED */
bool Curl_h2_http_1_1_error(struct connectdata *conn);
#else /* USE_NGHTTP2 */
-#define Curl_http2_send_request(x) CURLE_UNSUPPORTED_PROTOCOL
#define Curl_http2_request_upgrade(x,y) CURLE_UNSUPPORTED_PROTOCOL
#define Curl_http2_setup(x) CURLE_UNSUPPORTED_PROTOCOL
#define Curl_http2_switched(x,y,z) CURLE_UNSUPPORTED_PROTOCOL
@@ -76,6 +75,7 @@ bool Curl_h2_http_1_1_error(struct connectdata *conn);
#define Curl_http2_add_child(x, y, z)
#define Curl_http2_remove_child(x, y)
#define Curl_http2_cleanup_dependencies(x)
+#define Curl_http2_stream_pause(x, y)
#define Curl_h2_http_1_1_error(x) 0
#endif
diff --git a/Utilities/cmcurl/lib/http_chunks.c b/Utilities/cmcurl/lib/http_chunks.c
index 18dfcb2..b6ffa41 100644
--- a/Utilities/cmcurl/lib/http_chunks.c
+++ b/Utilities/cmcurl/lib/http_chunks.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -109,7 +109,8 @@ void Curl_httpchunk_init(struct connectdata *conn)
CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
char *datap,
ssize_t datalen,
- ssize_t *wrotep)
+ ssize_t *wrotep,
+ CURLcode *extrap)
{
CURLcode result = CURLE_OK;
struct Curl_easy *data = conn->data;
@@ -125,8 +126,10 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
chunk read process, to properly calculate the content length*/
if(data->set.http_te_skip && !k->ignorebody) {
result = Curl_client_write(conn, CLIENTWRITE_BODY, datap, datalen);
- if(result)
- return CHUNKE_WRITE_ERROR;
+ if(result) {
+ *extrap = result;
+ return CHUNKE_PASSTHRU_ERROR;
+ }
}
while(length) {
@@ -197,8 +200,10 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
else
result = Curl_client_write(conn, CLIENTWRITE_BODY, datap, piece);
- if(result)
- return CHUNKE_WRITE_ERROR;
+ if(result) {
+ *extrap = result;
+ return CHUNKE_PASSTHRU_ERROR;
+ }
}
*wrote += piece;
@@ -244,8 +249,10 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
if(!data->set.http_te_skip) {
result = Curl_client_write(conn, CLIENTWRITE_HEADER,
conn->trailer, conn->trlPos);
- if(result)
- return CHUNKE_WRITE_ERROR;
+ if(result) {
+ *extrap = result;
+ return CHUNKE_PASSTHRU_ERROR;
+ }
}
conn->trlPos = 0;
ch->state = CHUNK_TRAILER_CR;
@@ -339,8 +346,9 @@ const char *Curl_chunked_strerror(CHUNKcode code)
return "Illegal or missing hexadecimal sequence";
case CHUNKE_BAD_CHUNK:
return "Malformed encoding found";
- case CHUNKE_WRITE_ERROR:
- return "Write error";
+ case CHUNKE_PASSTHRU_ERROR:
+ DEBUGASSERT(0); /* never used */
+ return "";
case CHUNKE_BAD_ENCODING:
return "Bad content-encoding found";
case CHUNKE_OUT_OF_MEMORY:
diff --git a/Utilities/cmcurl/lib/http_chunks.h b/Utilities/cmcurl/lib/http_chunks.h
index b969c55..8f4a33c 100644
--- a/Utilities/cmcurl/lib/http_chunks.h
+++ b/Utilities/cmcurl/lib/http_chunks.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -21,6 +21,9 @@
* KIND, either express or implied.
*
***************************************************************************/
+
+struct connectdata;
+
/*
* The longest possible hexadecimal number we support in a chunked transfer.
* Weird enough, RFC2616 doesn't set a maximum size! Since we use strtoul()
@@ -71,9 +74,9 @@ typedef enum {
CHUNKE_TOO_LONG_HEX = 1,
CHUNKE_ILLEGAL_HEX,
CHUNKE_BAD_CHUNK,
- CHUNKE_WRITE_ERROR,
CHUNKE_BAD_ENCODING,
CHUNKE_OUT_OF_MEMORY,
+ CHUNKE_PASSTHRU_ERROR, /* Curl_httpchunk_read() returns a CURLcode to use */
CHUNKE_LAST
} CHUNKcode;
@@ -87,4 +90,10 @@ struct Curl_chunker {
size_t dataleft; /* untouched data amount at the end of the last buffer */
};
+/* The following functions are defined in http_chunks.c */
+void Curl_httpchunk_init(struct connectdata *conn);
+CHUNKcode Curl_httpchunk_read(struct connectdata *conn, char *datap,
+ ssize_t length, ssize_t *wrote,
+ CURLcode *passthru);
+
#endif /* HEADER_CURL_HTTP_CHUNKS_H */
diff --git a/Utilities/cmcurl/lib/http_negotiate.c b/Utilities/cmcurl/lib/http_negotiate.c
index c8f4064..8e1f3bf 100644
--- a/Utilities/cmcurl/lib/http_negotiate.c
+++ b/Utilities/cmcurl/lib/http_negotiate.c
@@ -148,10 +148,10 @@ CURLcode Curl_output_negotiate(struct connectdata *conn, bool proxy)
}
if(!neg_ctx->context) {
result = Curl_input_negotiate(conn, proxy, "Negotiate");
- if(result == CURLE_LOGIN_DENIED) {
+ if(result == CURLE_AUTH_ERROR) {
/* negotiate auth failed, let's continue unauthenticated to stay
* compatible with the behavior before curl-7_64_0-158-g6c6035532 */
- conn->data->state.authproblem = TRUE;
+ authp->done = TRUE;
return CURLE_OK;
}
else if(result)
diff --git a/Utilities/cmcurl/lib/http_ntlm.c b/Utilities/cmcurl/lib/http_ntlm.c
index e4a4fe0..342b242 100644
--- a/Utilities/cmcurl/lib/http_ntlm.c
+++ b/Utilities/cmcurl/lib/http_ntlm.c
@@ -44,9 +44,7 @@
/* SSL backend-specific #if branches in this file must be kept in the order
documented in curl_ntlm_core. */
-#if defined(NTLM_NEEDS_NSS_INIT)
-#include "vtls/nssg.h"
-#elif defined(USE_WINDOWS_SSPI)
+#if defined(USE_WINDOWS_SSPI)
#include "curl_sspi.h"
#endif
@@ -137,11 +135,6 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, bool proxy)
DEBUGASSERT(conn);
DEBUGASSERT(conn->data);
-#if defined(NTLM_NEEDS_NSS_INIT)
- if(CURLE_OK != Curl_nss_force_init(conn->data))
- return CURLE_OUT_OF_MEMORY;
-#endif
-
if(proxy) {
allocuserpwd = &conn->allocptr.proxyuserpwd;
userp = conn->http_proxy.user;
diff --git a/Utilities/cmcurl/lib/http_proxy.c b/Utilities/cmcurl/lib/http_proxy.c
index d7ed117..75c7a60 100644
--- a/Utilities/cmcurl/lib/http_proxy.c
+++ b/Utilities/cmcurl/lib/http_proxy.c
@@ -58,8 +58,9 @@ static CURLcode https_proxy_connect(struct connectdata *conn, int sockindex)
Curl_ssl_connect_nonblocking(conn, sockindex,
&conn->bits.proxy_ssl_connected[sockindex]);
if(result)
- conn->bits.close = TRUE; /* a failed connection is marked for closure to
- prevent (bad) re-use or similar */
+ /* a failed connection is marked for closure to prevent (bad) re-use or
+ similar */
+ connclose(conn, "TLS handshake failed");
}
return result;
#else
@@ -327,7 +328,7 @@ static CURLcode CONNECT(struct connectdata *conn,
{ /* READING RESPONSE PHASE */
int error = SELECT_OK;
- while(s->keepon && !error) {
+ while(s->keepon) {
ssize_t gotbytes;
/* make sure we have space to read more data */
@@ -384,11 +385,12 @@ static CURLcode CONNECT(struct connectdata *conn,
/* chunked-encoded body, so we need to do the chunked dance
properly to know when the end of the body is reached */
CHUNKcode r;
+ CURLcode extra;
ssize_t tookcareof = 0;
/* now parse the chunked piece of data so that we can
properly tell when the stream ends */
- r = Curl_httpchunk_read(conn, s->ptr, 1, &tookcareof);
+ r = Curl_httpchunk_read(conn, s->ptr, 1, &tookcareof, &extra);
if(r == CHUNKE_STOP) {
/* we're done reading chunks! */
infof(data, "chunk reading DONE\n");
@@ -455,6 +457,7 @@ static CURLcode CONNECT(struct connectdata *conn,
}
else if(s->chunked_encoding) {
CHUNKcode r;
+ CURLcode extra;
infof(data, "Ignore chunked response-body\n");
@@ -472,7 +475,8 @@ static CURLcode CONNECT(struct connectdata *conn,
/* now parse the chunked piece of data so that we can
properly tell when the stream ends */
- r = Curl_httpchunk_read(conn, s->line_start + 1, 1, &gotbytes);
+ r = Curl_httpchunk_read(conn, s->line_start + 1, 1, &gotbytes,
+ &extra);
if(r == CHUNKE_STOP) {
/* we're done reading chunks! */
infof(data, "chunk reading DONE\n");
@@ -632,6 +636,7 @@ static CURLcode CONNECT(struct connectdata *conn,
conn->allocptr.proxyuserpwd = NULL;
data->state.authproxy.done = TRUE;
+ data->state.authproxy.multipass = FALSE;
infof(data, "Proxy replied %d to CONNECT request\n",
data->info.httpproxycode);
diff --git a/Utilities/cmcurl/lib/imap.c b/Utilities/cmcurl/lib/imap.c
index bdcc69c..66172bd 100644
--- a/Utilities/cmcurl/lib/imap.c
+++ b/Utilities/cmcurl/lib/imap.c
@@ -95,8 +95,7 @@ static CURLcode imap_done(struct connectdata *conn, CURLcode status,
static CURLcode imap_connect(struct connectdata *conn, bool *done);
static CURLcode imap_disconnect(struct connectdata *conn, bool dead);
static CURLcode imap_multi_statemach(struct connectdata *conn, bool *done);
-static int imap_getsock(struct connectdata *conn, curl_socket_t *socks,
- int numsocks);
+static int imap_getsock(struct connectdata *conn, curl_socket_t *socks);
static CURLcode imap_doing(struct connectdata *conn, bool *dophase_done);
static CURLcode imap_setup_connection(struct connectdata *conn);
static char *imap_atom(const char *str, bool escape_only);
@@ -444,10 +443,8 @@ static CURLcode imap_perform_capability(struct connectdata *conn)
*/
static CURLcode imap_perform_starttls(struct connectdata *conn)
{
- CURLcode result = CURLE_OK;
-
/* Send the STARTTLS command */
- result = imap_sendf(conn, "STARTTLS");
+ CURLcode result = imap_sendf(conn, "STARTTLS");
if(!result)
state(conn, IMAP_STARTTLS);
@@ -463,11 +460,10 @@ static CURLcode imap_perform_starttls(struct connectdata *conn)
*/
static CURLcode imap_perform_upgrade_tls(struct connectdata *conn)
{
- CURLcode result = CURLE_OK;
- struct imap_conn *imapc = &conn->proto.imapc;
-
/* Start the SSL connection */
- result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET, &imapc->ssldone);
+ struct imap_conn *imapc = &conn->proto.imapc;
+ CURLcode result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET,
+ &imapc->ssldone);
if(!result) {
if(imapc->state != IMAP_UPGRADETLS)
@@ -826,10 +822,8 @@ static CURLcode imap_perform_search(struct connectdata *conn)
*/
static CURLcode imap_perform_logout(struct connectdata *conn)
{
- CURLcode result = CURLE_OK;
-
/* Send the LOGOUT command */
- result = imap_sendf(conn, "LOGOUT");
+ CURLcode result = imap_sendf(conn, "LOGOUT");
if(!result)
state(conn, IMAP_LOGOUT);
@@ -1312,6 +1306,7 @@ static CURLcode imap_statemach_act(struct connectdata *conn)
break;
case IMAP_LIST:
+ case IMAP_SEARCH:
result = imap_state_listsearch_resp(conn, imapcode, imapc->state);
break;
@@ -1335,10 +1330,6 @@ static CURLcode imap_statemach_act(struct connectdata *conn)
result = imap_state_append_final_resp(conn, imapcode, imapc->state);
break;
- case IMAP_SEARCH:
- result = imap_state_listsearch_resp(conn, imapcode, imapc->state);
- break;
-
case IMAP_LOGOUT:
/* fallthrough, just stop! */
default:
@@ -1397,10 +1388,9 @@ static CURLcode imap_init(struct connectdata *conn)
}
/* For the IMAP "protocol connect" and "doing" phases only */
-static int imap_getsock(struct connectdata *conn, curl_socket_t *socks,
- int numsocks)
+static int imap_getsock(struct connectdata *conn, curl_socket_t *socks)
{
- return Curl_pp_getsock(&conn->proto.imapc.pp, socks, numsocks);
+ return Curl_pp_getsock(&conn->proto.imapc.pp, socks);
}
/***********************************************************************
diff --git a/Utilities/cmcurl/lib/imap.h b/Utilities/cmcurl/lib/imap.h
index 0efcfd2..4786f56 100644
--- a/Utilities/cmcurl/lib/imap.h
+++ b/Utilities/cmcurl/lib/imap.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2009 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2009 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/inet_ntop.c b/Utilities/cmcurl/lib/inet_ntop.c
index 855981c..9a5af7f 100644
--- a/Utilities/cmcurl/lib/inet_ntop.c
+++ b/Utilities/cmcurl/lib/inet_ntop.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 1996-2001 Internet Software Consortium.
+ * Copyright (C) 1996-2019 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
diff --git a/Utilities/cmcurl/lib/inet_ntop.h b/Utilities/cmcurl/lib/inet_ntop.h
index d150bb6..9d3f237 100644
--- a/Utilities/cmcurl/lib/inet_ntop.h
+++ b/Utilities/cmcurl/lib/inet_ntop.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/inet_pton.c b/Utilities/cmcurl/lib/inet_pton.c
index 0d65ae0..9c87a05 100644
--- a/Utilities/cmcurl/lib/inet_pton.c
+++ b/Utilities/cmcurl/lib/inet_pton.c
@@ -1,6 +1,6 @@
/* This is from the BIND 4.9.4 release, modified to compile by itself */
-/* Copyright (c) 1996 by Internet Software Consortium.
+/* Copyright (c) 1996 - 2019 by Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
diff --git a/Utilities/cmcurl/lib/inet_pton.h b/Utilities/cmcurl/lib/inet_pton.h
index 0209b9b..e695af9 100644
--- a/Utilities/cmcurl/lib/inet_pton.h
+++ b/Utilities/cmcurl/lib/inet_pton.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/krb5.c b/Utilities/cmcurl/lib/krb5.c
index 147ab02..5bd8e71 100644
--- a/Utilities/cmcurl/lib/krb5.c
+++ b/Utilities/cmcurl/lib/krb5.c
@@ -1,8 +1,8 @@
/* GSSAPI/krb5 support for FTP - loosely based on old krb4.c
*
- * Copyright (c) 1995, 1996, 1997, 1998, 1999 Kungliga Tekniska Högskolan
+ * Copyright (c) 1995, 1996, 1997, 1998, 1999 Kungliga Tekniska Högskolan
* (Royal Institute of Technology, Stockholm, Sweden).
- * Copyright (c) 2004 - 2017 Daniel Stenberg
+ * Copyright (c) 2004 - 2019 Daniel Stenberg
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -320,10 +320,8 @@ static void krb5_end(void *app_data)
OM_uint32 min;
gss_ctx_id_t *context = app_data;
if(*context != GSS_C_NO_CONTEXT) {
-#ifdef DEBUGBUILD
- OM_uint32 maj =
-#endif
- gss_delete_sec_context(&min, context, GSS_C_NO_BUFFER);
+ OM_uint32 maj = gss_delete_sec_context(&min, context, GSS_C_NO_BUFFER);
+ (void)maj;
DEBUGASSERT(maj == GSS_S_COMPLETE);
}
}
diff --git a/Utilities/cmcurl/lib/ldap.c b/Utilities/cmcurl/lib/ldap.c
index fd31faa..771edb4 100644
--- a/Utilities/cmcurl/lib/ldap.c
+++ b/Utilities/cmcurl/lib/ldap.c
@@ -112,13 +112,19 @@ static void _ldap_free_urldesc(LDAPURLDesc *ludp);
#define LDAP_TRACE(x) do { \
_ldap_trace("%u: ", __LINE__); \
_ldap_trace x; \
- } WHILE_FALSE
+ } while(0)
static void _ldap_trace(const char *fmt, ...);
#else
#define LDAP_TRACE(x) Curl_nop_stmt
#endif
+#if defined(USE_WIN32_LDAP) && defined(ldap_err2string)
+/* Use ansi error strings in UNICODE builds */
+#undef ldap_err2string
+#define ldap_err2string ldap_err2stringA
+#endif
+
static CURLcode Curl_ldap(struct connectdata *conn, bool *done);
@@ -838,10 +844,10 @@ static bool split_str(char *str, char ***out, size_t *count)
static int _ldap_url_parse2(const struct connectdata *conn, LDAPURLDesc *ludp)
{
int rc = LDAP_SUCCESS;
- char *path;
- char *query;
char *p;
- char *q;
+ char *path;
+ char *q = NULL;
+ char *query = NULL;
size_t i;
if(!conn->data ||
@@ -859,11 +865,13 @@ static int _ldap_url_parse2(const struct connectdata *conn, LDAPURLDesc *ludp)
if(!path)
return LDAP_NO_MEMORY;
- /* Duplicate the query */
- q = query = strdup(conn->data->state.up.query);
- if(!query) {
- free(path);
- return LDAP_NO_MEMORY;
+ /* Duplicate the query if present */
+ if(conn->data->state.up.query) {
+ q = query = strdup(conn->data->state.up.query);
+ if(!query) {
+ free(path);
+ return LDAP_NO_MEMORY;
+ }
}
/* Parse the DN (Distinguished Name) */
diff --git a/Utilities/cmcurl/lib/llist.c b/Utilities/cmcurl/lib/llist.c
index f8769c2..e7c6f51 100644
--- a/Utilities/cmcurl/lib/llist.c
+++ b/Utilities/cmcurl/lib/llist.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -144,54 +144,3 @@ Curl_llist_count(struct curl_llist *list)
{
return list->size;
}
-
-/*
- * @unittest: 1300
- */
-void Curl_llist_move(struct curl_llist *list, struct curl_llist_element *e,
- struct curl_llist *to_list,
- struct curl_llist_element *to_e)
-{
- /* Remove element from list */
- if(e == NULL || list->size == 0)
- return;
-
- if(e == list->head) {
- list->head = e->next;
-
- if(list->head == NULL)
- list->tail = NULL;
- else
- e->next->prev = NULL;
- }
- else {
- e->prev->next = e->next;
- if(!e->next)
- list->tail = e->prev;
- else
- e->next->prev = e->prev;
- }
-
- --list->size;
-
- /* Add element to to_list after to_e */
- if(to_list->size == 0) {
- to_list->head = e;
- to_list->head->prev = NULL;
- to_list->head->next = NULL;
- to_list->tail = e;
- }
- else {
- e->next = to_e->next;
- e->prev = to_e;
- if(to_e->next) {
- to_e->next->prev = e;
- }
- else {
- to_list->tail = e;
- }
- to_e->next = e;
- }
-
- ++to_list->size;
-}
diff --git a/Utilities/cmcurl/lib/llist.h b/Utilities/cmcurl/lib/llist.h
index b9d4c89..0178c42 100644
--- a/Utilities/cmcurl/lib/llist.h
+++ b/Utilities/cmcurl/lib/llist.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -47,7 +47,4 @@ void Curl_llist_remove(struct curl_llist *, struct curl_llist_element *,
void *);
size_t Curl_llist_count(struct curl_llist *);
void Curl_llist_destroy(struct curl_llist *, void *);
-void Curl_llist_move(struct curl_llist *, struct curl_llist_element *,
- struct curl_llist *, struct curl_llist_element *);
-
#endif /* HEADER_CURL_LLIST_H */
diff --git a/Utilities/cmcurl/lib/md4.c b/Utilities/cmcurl/lib/md4.c
index e7c77bc..38f1b2b 100644
--- a/Utilities/cmcurl/lib/md4.c
+++ b/Utilities/cmcurl/lib/md4.c
@@ -1,5 +1,225 @@
-/*
- * !checksrc! disable COPYRIGHT
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include "curl_setup.h"
+
+#if !defined(CURL_DISABLE_CRYPTO_AUTH)
+
+#include "curl_md4.h"
+#include "warnless.h"
+
+#ifdef USE_OPENSSL
+#include <openssl/opensslconf.h>
+#endif /* USE_OPENSSL */
+
+#ifdef USE_MBEDTLS
+#include <mbedtls/config.h>
+#include <mbedtls/version.h>
+
+#if(MBEDTLS_VERSION_NUMBER >= 0x02070000)
+ #define HAS_MBEDTLS_RESULT_CODE_BASED_FUNCTIONS
+#endif
+#endif /* USE_MBEDTLS */
+
+#if defined(USE_GNUTLS_NETTLE)
+
+#include <nettle/md4.h>
+
+#include "curl_memory.h"
+
+/* The last #include file should be: */
+#include "memdebug.h"
+
+typedef struct md4_ctx MD4_CTX;
+
+static void MD4_Init(MD4_CTX *ctx)
+{
+ md4_init(ctx);
+}
+
+static void MD4_Update(MD4_CTX *ctx, const void *data, unsigned long size)
+{
+ md4_update(ctx, size, data);
+}
+
+static void MD4_Final(unsigned char *result, MD4_CTX *ctx)
+{
+ md4_digest(ctx, MD4_DIGEST_SIZE, result);
+}
+
+#elif defined(USE_GNUTLS)
+
+#include <gcrypt.h>
+
+#include "curl_memory.h"
+
+/* The last #include file should be: */
+#include "memdebug.h"
+
+typedef gcry_md_hd_t MD4_CTX;
+
+static void MD4_Init(MD4_CTX *ctx)
+{
+ gcry_md_open(ctx, GCRY_MD_MD4, 0);
+}
+
+static void MD4_Update(MD4_CTX *ctx, const void *data, unsigned long size)
+{
+ gcry_md_write(*ctx, data, size);
+}
+
+static void MD4_Final(unsigned char *result, MD4_CTX *ctx)
+{
+ memcpy(result, gcry_md_read(*ctx, 0), MD4_DIGEST_LENGTH);
+ gcry_md_close(*ctx);
+}
+
+#elif defined(USE_OPENSSL) && !defined(OPENSSL_NO_MD4)
+/* When OpenSSL is available we use the MD4-functions from OpenSSL */
+#include <openssl/md4.h>
+
+#elif (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && \
+ (__MAC_OS_X_VERSION_MAX_ALLOWED >= 1040)) || \
+ (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && \
+ (__IPHONE_OS_VERSION_MAX_ALLOWED >= 20000))
+
+#include <CommonCrypto/CommonDigest.h>
+
+#include "curl_memory.h"
+
+/* The last #include file should be: */
+#include "memdebug.h"
+
+typedef CC_MD4_CTX MD4_CTX;
+
+static void MD4_Init(MD4_CTX *ctx)
+{
+ (void)CC_MD4_Init(ctx);
+}
+
+static void MD4_Update(MD4_CTX *ctx, const void *data, unsigned long size)
+{
+ (void)CC_MD4_Update(ctx, data, (CC_LONG)size);
+}
+
+static void MD4_Final(unsigned char *result, MD4_CTX *ctx)
+{
+ (void)CC_MD4_Final(result, ctx);
+}
+
+#elif defined(USE_WIN32_CRYPTO)
+
+#include <wincrypt.h>
+
+#include "curl_memory.h"
+
+/* The last #include file should be: */
+#include "memdebug.h"
+
+typedef struct {
+ HCRYPTPROV hCryptProv;
+ HCRYPTHASH hHash;
+} MD4_CTX;
+
+static void MD4_Init(MD4_CTX *ctx)
+{
+ ctx->hCryptProv = 0;
+ ctx->hHash = 0;
+
+ if(CryptAcquireContext(&ctx->hCryptProv, NULL, NULL, PROV_RSA_FULL,
+ CRYPT_VERIFYCONTEXT)) {
+ CryptCreateHash(ctx->hCryptProv, CALG_MD4, 0, 0, &ctx->hHash);
+ }
+}
+
+static void MD4_Update(MD4_CTX *ctx, const void *data, unsigned long size)
+{
+ CryptHashData(ctx->hHash, (BYTE *)data, (unsigned int) size, 0);
+}
+
+static void MD4_Final(unsigned char *result, MD4_CTX *ctx)
+{
+ unsigned long length = 0;
+
+ CryptGetHashParam(ctx->hHash, HP_HASHVAL, NULL, &length, 0);
+ if(length == MD4_DIGEST_LENGTH)
+ CryptGetHashParam(ctx->hHash, HP_HASHVAL, result, &length, 0);
+
+ if(ctx->hHash)
+ CryptDestroyHash(ctx->hHash);
+
+ if(ctx->hCryptProv)
+ CryptReleaseContext(ctx->hCryptProv, 0);
+}
+
+#elif(defined(USE_MBEDTLS) && defined(MBEDTLS_MD4_C))
+
+#include <mbedtls/md4.h>
+
+#include "curl_memory.h"
+
+/* The last #include file should be: */
+#include "memdebug.h"
+
+typedef struct {
+ void *data;
+ unsigned long size;
+} MD4_CTX;
+
+static void MD4_Init(MD4_CTX *ctx)
+{
+ ctx->data = NULL;
+ ctx->size = 0;
+}
+
+static void MD4_Update(MD4_CTX *ctx, const void *data, unsigned long size)
+{
+ if(ctx->data == NULL) {
+ ctx->data = malloc(size);
+ if(ctx->data != NULL) {
+ memcpy(ctx->data, data, size);
+ ctx->size = size;
+ }
+ }
+}
+
+static void MD4_Final(unsigned char *result, MD4_CTX *ctx)
+{
+ if(ctx->data != NULL) {
+#if !defined(HAS_MBEDTLS_RESULT_CODE_BASED_FUNCTIONS)
+ mbedtls_md4(ctx->data, ctx->size, result);
+#else
+ (void) mbedtls_md4_ret(ctx->data, ctx->size, result);
+#endif
+
+ Curl_safefree(ctx->data);
+ ctx->size = 0;
+ }
+}
+
+#else
+/* When no other crypto library is available, or the crypto library doesn't
+ * support MD4, we use this code segment this implementation of it
+ *
* This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.
* MD4 Message-Digest Algorithm (RFC 1320).
*
@@ -36,19 +256,6 @@
* compile-time configuration.
*/
-#include "curl_setup.h"
-
-/* The NSS, OS/400, and when not included, OpenSSL and mbed TLS crypto
- * libraries do not provide the MD4 hash algorithm, so we use this
- * implementation of it */
-#if defined(USE_NSS) || defined(USE_OS400CRYPTO) || \
- (defined(USE_OPENSSL) && defined(OPENSSL_NO_MD4)) || \
- (defined(USE_MBEDTLS) && !defined(MBEDTLS_MD4_C))
-
-#include "curl_md4.h"
-#include "warnless.h"
-
-#ifndef HAVE_OPENSSL
#include <string.h>
@@ -298,16 +505,16 @@ static void MD4_Final(unsigned char *result, MD4_CTX *ctx)
memset(ctx, 0, sizeof(*ctx));
}
-#endif
+#endif /* CRYPTO LIBS */
-void Curl_md4it(unsigned char *output, const unsigned char *input, size_t len)
+void Curl_md4it(unsigned char *output, const unsigned char *input,
+ const size_t len)
{
MD4_CTX ctx;
+
MD4_Init(&ctx);
MD4_Update(&ctx, input, curlx_uztoui(len));
MD4_Final(output, &ctx);
}
-#endif /* defined(USE_NSS) || defined(USE_OS400CRYPTO) ||
- (defined(USE_OPENSSL) && defined(OPENSSL_NO_MD4)) ||
- (defined(USE_MBEDTLS) && !defined(MBEDTLS_MD4_C)) */
+#endif /* CURL_DISABLE_CRYPTO_AUTH */
diff --git a/Utilities/cmcurl/lib/md5.c b/Utilities/cmcurl/lib/md5.c
index 2b81ca4..3f601b3 100644
--- a/Utilities/cmcurl/lib/md5.c
+++ b/Utilities/cmcurl/lib/md5.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -30,6 +30,14 @@
#include "curl_hmac.h"
#include "warnless.h"
+#ifdef USE_MBEDTLS
+#include <mbedtls/version.h>
+
+#if(MBEDTLS_VERSION_NUMBER >= 0x02070000)
+ #define HAS_MBEDTLS_RESULT_CODE_BASED_FUNCTIONS
+#endif
+#endif /* USE_MBEDTLS */
+
#if defined(USE_GNUTLS_NETTLE)
#include <nettle/md5.h>
@@ -51,7 +59,7 @@ static void MD5_Update(MD5_CTX *ctx,
md5_update(ctx, inputLen, input);
}
-static void MD5_Final(unsigned char digest[16], MD5_CTX *ctx)
+static void MD5_Final(unsigned char *digest, MD5_CTX *ctx)
{
md5_digest(ctx, 16, digest);
}
@@ -77,7 +85,7 @@ static void MD5_Update(MD5_CTX *ctx,
gcry_md_write(*ctx, input, inputLen);
}
-static void MD5_Final(unsigned char digest[16], MD5_CTX *ctx)
+static void MD5_Final(unsigned char *digest, MD5_CTX *ctx)
{
memcpy(digest, gcry_md_read(*ctx, 0), 16);
gcry_md_close(*ctx);
@@ -90,6 +98,46 @@ static void MD5_Final(unsigned char digest[16], MD5_CTX *ctx)
/* The last #include file should be: */
#include "memdebug.h"
+#elif defined(USE_MBEDTLS)
+
+#include <mbedtls/md5.h>
+
+#include "curl_memory.h"
+
+/* The last #include file should be: */
+#include "memdebug.h"
+
+typedef mbedtls_md5_context MD5_CTX;
+
+static void MD5_Init(MD5_CTX *ctx)
+{
+#if !defined(HAS_MBEDTLS_RESULT_CODE_BASED_FUNCTIONS)
+ mbedtls_md5_starts(ctx);
+#else
+ (void) mbedtls_md5_starts_ret(ctx);
+#endif
+}
+
+static void MD5_Update(MD5_CTX *ctx,
+ const unsigned char *data,
+ unsigned int length)
+{
+#if !defined(HAS_MBEDTLS_RESULT_CODE_BASED_FUNCTIONS)
+ mbedtls_md5_update(ctx, data, length);
+#else
+ (void) mbedtls_md5_update_ret(ctx, data, length);
+#endif
+}
+
+static void MD5_Final(unsigned char *digest, MD5_CTX *ctx)
+{
+#if !defined(HAS_MBEDTLS_RESULT_CODE_BASED_FUNCTIONS)
+ mbedtls_md5_finish(ctx, digest);
+#else
+ (void) mbedtls_md5_finish_ret(ctx, digest);
+#endif
+}
+
#elif (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && \
(__MAC_OS_X_VERSION_MAX_ALLOWED >= 1040)) || \
(defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && \
@@ -119,12 +167,12 @@ static void MD5_Update(MD5_CTX *ctx,
CC_MD5_Update(ctx, input, inputLen);
}
-static void MD5_Final(unsigned char digest[16], MD5_CTX *ctx)
+static void MD5_Final(unsigned char *digest, MD5_CTX *ctx)
{
CC_MD5_Final(digest, ctx);
}
-#elif defined(WIN32) && !defined(CURL_WINDOWS_APP)
+#elif defined(USE_WIN32_CRYPTO)
#include <wincrypt.h>
#include "curl_memory.h"
@@ -151,7 +199,7 @@ static void MD5_Update(MD5_CTX *ctx,
CryptHashData(ctx->hHash, (unsigned char *)input, inputLen, 0);
}
-static void MD5_Final(unsigned char digest[16], MD5_CTX *ctx)
+static void MD5_Final(unsigned char *digest, MD5_CTX *ctx)
{
unsigned long length = 0;
CryptGetHashParam(ctx->hHash, HP_HASHVAL, NULL, &length, 0);
@@ -164,7 +212,9 @@ static void MD5_Final(unsigned char digest[16], MD5_CTX *ctx)
}
#else
+
/* When no other crypto library is available we use this code segment */
+
/*
* This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.
* MD5 Message-Digest Algorithm (RFC 1321).
@@ -513,12 +563,13 @@ const MD5_params Curl_DIGEST_MD5[] = {
/*
* @unittest: 1601
*/
-void Curl_md5it(unsigned char *outbuffer, /* 16 bytes */
- const unsigned char *input)
+void Curl_md5it(unsigned char *outbuffer, const unsigned char *input,
+ const size_t len)
{
MD5_CTX ctx;
+
MD5_Init(&ctx);
- MD5_Update(&ctx, input, curlx_uztoui(strlen((char *)input)));
+ MD5_Update(&ctx, input, curlx_uztoui(len));
MD5_Final(outbuffer, &ctx);
}
diff --git a/Utilities/cmcurl/lib/memdebug.h b/Utilities/cmcurl/lib/memdebug.h
index 5236f60..7ca4426 100644
--- a/Utilities/cmcurl/lib/memdebug.h
+++ b/Utilities/cmcurl/lib/memdebug.h
@@ -169,6 +169,6 @@ CURL_EXTERN int curl_dbg_fclose(FILE *file, int line, const char *source);
*/
#define Curl_safefree(ptr) \
- do { free((ptr)); (ptr) = NULL;} WHILE_FALSE
+ do { free((ptr)); (ptr) = NULL;} while(0)
#endif /* HEADER_CURL_MEMDEBUG_H */
diff --git a/Utilities/cmcurl/lib/mime.c b/Utilities/cmcurl/lib/mime.c
index 2135f72..2571287 100644
--- a/Utilities/cmcurl/lib/mime.c
+++ b/Utilities/cmcurl/lib/mime.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -1135,6 +1135,8 @@ CURLcode Curl_mime_duppart(curl_mimepart *dst, const curl_mimepart *src)
const curl_mimepart *s;
CURLcode res = CURLE_OK;
+ DEBUGASSERT(dst);
+
/* Duplicate content. */
switch(src->kind) {
case MIMEKIND_NONE:
@@ -1184,20 +1186,18 @@ CURLcode Curl_mime_duppart(curl_mimepart *dst, const curl_mimepart *src)
}
}
- /* Duplicate other fields. */
- if(dst != NULL)
+ if(!res) {
+ /* Duplicate other fields. */
dst->encoder = src->encoder;
- else
- res = CURLE_WRITE_ERROR;
- if(!res)
res = curl_mime_type(dst, src->mimetype);
+ }
if(!res)
res = curl_mime_name(dst, src->name);
if(!res)
res = curl_mime_filename(dst, src->filename);
/* If an error occurred, rollback. */
- if(res && dst)
+ if(res)
Curl_mime_cleanpart(dst);
return res;
@@ -1901,4 +1901,11 @@ CURLcode curl_mime_headers(curl_mimepart *part,
return CURLE_NOT_BUILT_IN;
}
+CURLcode Curl_mime_add_header(struct curl_slist **slp, const char *fmt, ...)
+{
+ (void)slp;
+ (void)fmt;
+ return CURLE_NOT_BUILT_IN;
+}
+
#endif /* if disabled */
diff --git a/Utilities/cmcurl/lib/mime.h b/Utilities/cmcurl/lib/mime.h
index 4c9a5fb..4312125 100644
--- a/Utilities/cmcurl/lib/mime.h
+++ b/Utilities/cmcurl/lib/mime.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -127,7 +127,9 @@ struct curl_mimepart_s {
mime_encoder_state encstate; /* Data encoder state. */
};
-#if (!defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_MIME)) || \
+CURLcode Curl_mime_add_header(struct curl_slist **slp, const char *fmt, ...);
+
+#if (!defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_MIME)) || \
!defined(CURL_DISABLE_SMTP) || !defined(CURL_DISABLE_IMAP)
/* Prototypes. */
@@ -144,7 +146,6 @@ curl_off_t Curl_mime_size(curl_mimepart *part);
size_t Curl_mime_read(char *buffer, size_t size, size_t nitems,
void *instream);
CURLcode Curl_mime_rewind(curl_mimepart *part);
-CURLcode Curl_mime_add_header(struct curl_slist **slp, const char *fmt, ...);
const char *Curl_mime_contenttype(const char *filename);
#else
@@ -157,7 +158,6 @@ const char *Curl_mime_contenttype(const char *filename);
#define Curl_mime_size(x) (curl_off_t) -1
#define Curl_mime_read NULL
#define Curl_mime_rewind(x) ((void)x, CURLE_NOT_BUILT_IN)
-#define Curl_mime_add_header(x,y,...) CURLE_NOT_BUILT_IN
#endif
diff --git a/Utilities/cmcurl/lib/mprintf.c b/Utilities/cmcurl/lib/mprintf.c
index e190936..bc00913 100644
--- a/Utilities/cmcurl/lib/mprintf.c
+++ b/Utilities/cmcurl/lib/mprintf.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1999 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1999 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -104,7 +104,7 @@ static const char upper_digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
done++; \
else \
return done; /* return immediately on failure */ \
- } WHILE_FALSE
+ } while(0)
/* Data type to read from the arglist */
typedef enum {
diff --git a/Utilities/cmcurl/lib/multi.c b/Utilities/cmcurl/lib/multi.c
index c7c46ee..cef2805 100644
--- a/Utilities/cmcurl/lib/multi.c
+++ b/Utilities/cmcurl/lib/multi.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -46,6 +46,8 @@
#include "connect.h"
#include "http_proxy.h"
#include "http2.h"
+#include "socketpair.h"
+#include "socks.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
#include "curl_memory.h"
@@ -71,8 +73,6 @@
static CURLMcode singlesocket(struct Curl_multi *multi,
struct Curl_easy *data);
-static int update_timer(struct Curl_multi *multi);
-
static CURLMcode add_next_timeout(struct curltime now,
struct Curl_multi *multi,
struct Curl_easy *d);
@@ -189,7 +189,7 @@ static void mstate(struct Curl_easy *data, CURLMstate state
*/
struct Curl_sh_entry {
- struct curl_llist list; /* list of easy handles using this socket */
+ struct curl_hash transfers; /* hash of transfers using this socket */
unsigned int action; /* what combined action READ/WRITE this socket waits
for */
void *socketp; /* settable by users with curl_multi_assign() */
@@ -206,12 +206,36 @@ struct Curl_sh_entry {
static struct Curl_sh_entry *sh_getentry(struct curl_hash *sh,
curl_socket_t s)
{
- if(s != CURL_SOCKET_BAD)
+ if(s != CURL_SOCKET_BAD) {
/* only look for proper sockets */
return Curl_hash_pick(sh, (char *)&s, sizeof(curl_socket_t));
+ }
return NULL;
}
+#define TRHASH_SIZE 13
+static size_t trhash(void *key, size_t key_length, size_t slots_num)
+{
+ size_t keyval = (size_t)*(struct Curl_easy **)key;
+ (void) key_length;
+
+ return (keyval % slots_num);
+}
+
+static size_t trhash_compare(void *k1, size_t k1_len, void *k2, size_t k2_len)
+{
+ (void)k1_len;
+ (void)k2_len;
+
+ return *(struct Curl_easy **)k1 == *(struct Curl_easy **)k2;
+}
+
+static void trhash_dtor(void *nada)
+{
+ (void)nada;
+}
+
+
/* make sure this socket is present in the hash for this handle */
static struct Curl_sh_entry *sh_addentry(struct curl_hash *sh,
curl_socket_t s)
@@ -219,19 +243,25 @@ static struct Curl_sh_entry *sh_addentry(struct curl_hash *sh,
struct Curl_sh_entry *there = sh_getentry(sh, s);
struct Curl_sh_entry *check;
- if(there)
+ if(there) {
/* it is present, return fine */
return there;
+ }
/* not present, add it */
check = calloc(1, sizeof(struct Curl_sh_entry));
if(!check)
return NULL; /* major failure */
- Curl_llist_init(&check->list, NULL);
+ if(Curl_hash_init(&check->transfers, TRHASH_SIZE, trhash,
+ trhash_compare, trhash_dtor)) {
+ free(check);
+ return NULL;
+ }
/* make/add new hash entry */
if(!Curl_hash_add(sh, (char *)&s, sizeof(curl_socket_t), check)) {
+ Curl_hash_destroy(&check->transfers);
free(check);
return NULL; /* major failure */
}
@@ -241,8 +271,11 @@ static struct Curl_sh_entry *sh_addentry(struct curl_hash *sh,
/* delete the given socket + handle from the hash */
-static void sh_delentry(struct curl_hash *sh, curl_socket_t s)
+static void sh_delentry(struct Curl_sh_entry *entry,
+ struct curl_hash *sh, curl_socket_t s)
{
+ Curl_hash_destroy(&entry->transfers);
+
/* We remove the hash entry. This will end up in a call to
sh_freeentry(). */
Curl_hash_delete(sh, (char *)&s, sizeof(curl_socket_t));
@@ -311,17 +344,6 @@ static CURLMcode multi_addmsg(struct Curl_multi *multi,
return CURLM_OK;
}
-/*
- * multi_freeamsg()
- *
- * Callback used by the llist system when a single list entry is destroyed.
- */
-static void multi_freeamsg(void *a, void *b)
-{
- (void)a;
- (void)b;
-}
-
struct Curl_multi *Curl_multi_handle(int hashsize, /* socket hash */
int chashsize) /* connection hash */
{
@@ -341,11 +363,30 @@ struct Curl_multi *Curl_multi_handle(int hashsize, /* socket hash */
if(Curl_conncache_init(&multi->conn_cache, chashsize))
goto error;
- Curl_llist_init(&multi->msglist, multi_freeamsg);
- Curl_llist_init(&multi->pending, multi_freeamsg);
+ Curl_llist_init(&multi->msglist, NULL);
+ Curl_llist_init(&multi->pending, NULL);
+
+ multi->multiplexing = TRUE;
/* -1 means it not set by user, use the default value */
multi->maxconnects = -1;
+ multi->max_concurrent_streams = 100;
+ multi->ipv6_works = Curl_ipv6works(NULL);
+
+#ifdef ENABLE_WAKEUP
+ if(Curl_socketpair(AF_UNIX, SOCK_STREAM, 0, multi->wakeup_pair) < 0) {
+ multi->wakeup_pair[0] = CURL_SOCKET_BAD;
+ multi->wakeup_pair[1] = CURL_SOCKET_BAD;
+ }
+ else if(curlx_nonblock(multi->wakeup_pair[0], TRUE) < 0 ||
+ curlx_nonblock(multi->wakeup_pair[1], TRUE) < 0) {
+ sclose(multi->wakeup_pair[0]);
+ sclose(multi->wakeup_pair[1]);
+ multi->wakeup_pair[0] = CURL_SOCKET_BAD;
+ multi->wakeup_pair[1] = CURL_SOCKET_BAD;
+ }
+#endif
+
return multi;
error:
@@ -453,16 +494,16 @@ CURLMcode curl_multi_add_handle(struct Curl_multi *multi,
/* increase the alive-counter */
multi->num_alive++;
- /* A somewhat crude work-around for a little glitch in update_timer() that
- happens if the lastcall time is set to the same time when the handle is
- removed as when the next handle is added, as then the check in
- update_timer() that prevents calling the application multiple times with
- the same timer info will not trigger and then the new handle's timeout
- will not be notified to the app.
+ /* A somewhat crude work-around for a little glitch in Curl_update_timer()
+ that happens if the lastcall time is set to the same time when the handle
+ is removed as when the next handle is added, as then the check in
+ Curl_update_timer() that prevents calling the application multiple times
+ with the same timer info will not trigger and then the new handle's
+ timeout will not be notified to the app.
The work-around is thus simply to clear the 'lastcall' variable to force
- update_timer() to always trigger a callback to the app when a new easy
- handle is added */
+ Curl_update_timer() to always trigger a callback to the app when a new
+ easy handle is added */
memset(&multi->timer_lastcall, 0, sizeof(multi->timer_lastcall));
/* The closure handle only ever has default timeouts set. To improve the
@@ -475,7 +516,7 @@ CURLMcode curl_multi_add_handle(struct Curl_multi *multi,
data->state.conn_cache->closure_handle->set.no_signal =
data->set.no_signal;
- update_timer(multi);
+ Curl_update_timer(multi);
return CURLM_OK;
}
@@ -510,6 +551,8 @@ static CURLcode multi_done(struct Curl_easy *data,
/* Stop if multi_done() has already been called */
return CURLE_OK;
+ conn->data = data; /* ensure the connection uses this transfer now */
+
/* Stop the resolver and free its own resources (but not dns_entry yet). */
Curl_resolver_kill(conn);
@@ -546,15 +589,20 @@ static CURLcode multi_done(struct Curl_easy *data,
process_pending_handles(data->multi); /* connection / multiplex */
+ CONN_LOCK(data);
detach_connnection(data);
if(CONN_INUSE(conn)) {
/* Stop if still used. */
+ /* conn->data must not remain pointing to this transfer since it is going
+ away! Find another to own it! */
+ conn->data = conn->easyq.head->ptr;
+ CONN_UNLOCK(data);
DEBUGF(infof(data, "Connection still in use %zu, "
"no more multi_done now!\n",
conn->easyq.size));
return CURLE_OK;
}
-
+ conn->data = NULL; /* the connection now has no owner */
data->state.done = TRUE; /* called just now! */
if(conn->dns_entry) {
@@ -597,7 +645,10 @@ static CURLcode multi_done(struct Curl_easy *data,
#endif
) || conn->bits.close
|| (premature && !(conn->handler->flags & PROTOPT_STREAM))) {
- CURLcode res2 = Curl_disconnect(data, conn, premature);
+ CURLcode res2;
+ connclose(conn, "disconnecting");
+ CONN_UNLOCK(data);
+ res2 = Curl_disconnect(data, conn, premature);
/* If we had an error already, make sure we return that one. But
if we got a new error, return that. */
@@ -614,9 +665,9 @@ static CURLcode multi_done(struct Curl_easy *data,
conn->bits.httpproxy ? conn->http_proxy.host.dispname :
conn->bits.conn_to_host ? conn->conn_to_host.dispname :
conn->host.dispname);
-
/* the connection is no longer in use by this transfer */
- if(Curl_conncache_return_conn(conn)) {
+ CONN_UNLOCK(data);
+ if(Curl_conncache_return_conn(data, conn)) {
/* remember the most recently used connection */
data->state.lastconnect = conn;
infof(data, "%s\n", buffer);
@@ -674,19 +725,14 @@ CURLMcode curl_multi_remove_handle(struct Curl_multi *multi,
easy_owns_conn = TRUE;
}
- /* The timer must be shut down before data->multi is set to NULL,
- else the timenode will remain in the splay tree after
- curl_easy_cleanup is called. */
- Curl_expire_clear(data);
-
if(data->conn) {
/* we must call multi_done() here (if we still own the connection) so that
we don't leave a half-baked one around */
if(easy_owns_conn) {
- /* multi_done() clears the conn->data field to lose the association
- between the easy handle and the connection
+ /* multi_done() clears the association between the easy handle and the
+ connection.
Note that this ignores the return code simply because there's
nothing really useful to do with it anyway! */
@@ -694,6 +740,11 @@ CURLMcode curl_multi_remove_handle(struct Curl_multi *multi,
}
}
+ /* The timer must be shut down before data->multi is set to NULL, else the
+ timenode will remain in the splay tree after curl_easy_cleanup is
+ called. Do it after multi_done() in case that sets another time! */
+ Curl_expire_clear(data);
+
if(data->connect_queue.ptr)
/* the handle was in the pending list waiting for an available connection,
so go ahead and remove it */
@@ -723,10 +774,8 @@ CURLMcode curl_multi_remove_handle(struct Curl_multi *multi,
vanish with this handle */
/* Remove the association between the connection and the handle */
- if(data->conn) {
- data->conn->data = NULL;
+ if(data->conn)
detach_connnection(data);
- }
#ifdef USE_LIBPSL
/* Remove the PSL association. */
@@ -765,7 +814,7 @@ CURLMcode curl_multi_remove_handle(struct Curl_multi *multi,
We do not touch the easy handle here! */
multi->num_easy--; /* one less to care about now */
- update_timer(multi);
+ Curl_update_timer(multi);
return CURLM_OK;
}
@@ -797,25 +846,30 @@ void Curl_attach_connnection(struct Curl_easy *data,
}
static int waitconnect_getsock(struct connectdata *conn,
- curl_socket_t *sock,
- int numsocks)
+ curl_socket_t *sock)
{
int i;
int s = 0;
int rc = 0;
- if(!numsocks)
- return GETSOCK_BLANK;
-
#ifdef USE_SSL
if(CONNECT_FIRSTSOCKET_PROXY_SSL())
- return Curl_ssl_getsock(conn, sock, numsocks);
+ return Curl_ssl_getsock(conn, sock);
#endif
+ if(SOCKS_STATE(conn->cnnct.state))
+ return Curl_SOCKS_getsock(conn, sock, FIRSTSOCKET);
+
for(i = 0; i<2; i++) {
if(conn->tempsock[i] != CURL_SOCKET_BAD) {
sock[s] = conn->tempsock[i];
- rc |= GETSOCK_WRITESOCK(s++);
+ rc |= GETSOCK_WRITESOCK(s);
+#ifdef ENABLE_QUIC
+ if(conn->transport == TRNSPRT_QUIC)
+ /* when connecting QUIC, we want to read the socket too */
+ rc |= GETSOCK_READSOCK(s);
+#endif
+ s++;
}
}
@@ -823,12 +877,8 @@ static int waitconnect_getsock(struct connectdata *conn,
}
static int waitproxyconnect_getsock(struct connectdata *conn,
- curl_socket_t *sock,
- int numsocks)
+ curl_socket_t *sock)
{
- if(!numsocks)
- return GETSOCK_BLANK;
-
sock[0] = conn->sock[FIRSTSOCKET];
/* when we've sent a CONNECT to a proxy, we should rather wait for the
@@ -840,19 +890,37 @@ static int waitproxyconnect_getsock(struct connectdata *conn,
}
static int domore_getsock(struct connectdata *conn,
- curl_socket_t *socks,
- int numsocks)
+ curl_socket_t *socks)
{
if(conn && conn->handler->domore_getsock)
- return conn->handler->domore_getsock(conn, socks, numsocks);
+ return conn->handler->domore_getsock(conn, socks);
return GETSOCK_BLANK;
}
-/* returns bitmapped flags for this handle and its sockets */
+static int doing_getsock(struct connectdata *conn,
+ curl_socket_t *socks)
+{
+ if(conn && conn->handler->doing_getsock)
+ return conn->handler->doing_getsock(conn, socks);
+ return GETSOCK_BLANK;
+}
+
+static int protocol_getsock(struct connectdata *conn,
+ curl_socket_t *socks)
+{
+ if(conn->handler->proto_getsock)
+ return conn->handler->proto_getsock(conn, socks);
+ /* Backup getsock logic. Since there is a live socket in use, we must wait
+ for it or it will be removed from watching when the multi_socket API is
+ used. */
+ socks[0] = conn->sock[FIRSTSOCKET];
+ return GETSOCK_READSOCK(0) | GETSOCK_WRITESOCK(0);
+}
+
+/* returns bitmapped flags for this handle and its sockets. The 'socks[]'
+ array contains MAX_SOCKSPEREASYHANDLE entries. */
static int multi_getsock(struct Curl_easy *data,
- curl_socket_t *socks, /* points to numsocks number
- of sockets */
- int numsocks)
+ curl_socket_t *socks)
{
/* The no connection case can happen when this is called from
curl_multi_remove_handle() => singlesocket() => multi_getsock().
@@ -884,30 +952,30 @@ static int multi_getsock(struct Curl_easy *data,
return 0;
case CURLM_STATE_WAITRESOLVE:
- return Curl_resolv_getsock(data->conn, socks, numsocks);
+ return Curl_resolv_getsock(data->conn, socks);
case CURLM_STATE_PROTOCONNECT:
case CURLM_STATE_SENDPROTOCONNECT:
- return Curl_protocol_getsock(data->conn, socks, numsocks);
+ return protocol_getsock(data->conn, socks);
case CURLM_STATE_DO:
case CURLM_STATE_DOING:
- return Curl_doing_getsock(data->conn, socks, numsocks);
+ return doing_getsock(data->conn, socks);
case CURLM_STATE_WAITPROXYCONNECT:
- return waitproxyconnect_getsock(data->conn, socks, numsocks);
+ return waitproxyconnect_getsock(data->conn, socks);
case CURLM_STATE_WAITCONNECT:
- return waitconnect_getsock(data->conn, socks, numsocks);
+ return waitconnect_getsock(data->conn, socks);
case CURLM_STATE_DO_MORE:
- return domore_getsock(data->conn, socks, numsocks);
+ return domore_getsock(data->conn, socks);
case CURLM_STATE_DO_DONE: /* since is set after DO is completed, we switch
to waiting for the same as the *PERFORM
states */
case CURLM_STATE_PERFORM:
- return Curl_single_getsock(data->conn, socks, numsocks);
+ return Curl_single_getsock(data->conn, socks);
}
}
@@ -933,7 +1001,7 @@ CURLMcode curl_multi_fdset(struct Curl_multi *multi,
data = multi->easyp;
while(data) {
- int bitmap = multi_getsock(data, sockbunch, MAX_SOCKSPEREASYHANDLE);
+ int bitmap = multi_getsock(data, sockbunch);
for(i = 0; i< MAX_SOCKSPEREASYHANDLE; i++) {
curl_socket_t s = CURL_SOCKET_BAD;
@@ -963,12 +1031,13 @@ CURLMcode curl_multi_fdset(struct Curl_multi *multi,
#define NUM_POLLS_ON_STACK 10
-CURLMcode Curl_multi_wait(struct Curl_multi *multi,
- struct curl_waitfd extra_fds[],
- unsigned int extra_nfds,
- int timeout_ms,
- int *ret,
- bool *gotsocket) /* if any socket was checked */
+static CURLMcode Curl_multi_wait(struct Curl_multi *multi,
+ struct curl_waitfd extra_fds[],
+ unsigned int extra_nfds,
+ int timeout_ms,
+ int *ret,
+ bool extrawait, /* when no socket, wait */
+ bool use_wakeup)
{
struct Curl_easy *data;
curl_socket_t sockbunch[MAX_SOCKSPEREASYHANDLE];
@@ -982,19 +1051,19 @@ CURLMcode Curl_multi_wait(struct Curl_multi *multi,
struct pollfd a_few_on_stack[NUM_POLLS_ON_STACK];
struct pollfd *ufds = &a_few_on_stack[0];
- if(gotsocket)
- *gotsocket = FALSE;
-
if(!GOOD_MULTI_HANDLE(multi))
return CURLM_BAD_HANDLE;
if(multi->in_callback)
return CURLM_RECURSIVE_API_CALL;
+ if(timeout_ms < 0)
+ return CURLM_BAD_FUNCTION_ARGUMENT;
+
/* Count up how many fds we have from the multi handle */
data = multi->easyp;
while(data) {
- bitmap = multi_getsock(data, sockbunch, MAX_SOCKSPEREASYHANDLE);
+ bitmap = multi_getsock(data, sockbunch);
for(i = 0; i< MAX_SOCKSPEREASYHANDLE; i++) {
curl_socket_t s = CURL_SOCKET_BAD;
@@ -1025,6 +1094,12 @@ CURLMcode Curl_multi_wait(struct Curl_multi *multi,
curlfds = nfds; /* number of internal file descriptors */
nfds += extra_nfds; /* add the externally provided ones */
+#ifdef ENABLE_WAKEUP
+ if(use_wakeup && multi->wakeup_pair[0] != CURL_SOCKET_BAD) {
+ ++nfds;
+ }
+#endif
+
if(nfds > NUM_POLLS_ON_STACK) {
/* 'nfds' is a 32 bit value and 'struct pollfd' is typically 8 bytes
big, so at 2^29 sockets this value might wrap. When a process gets
@@ -1044,7 +1119,7 @@ CURLMcode Curl_multi_wait(struct Curl_multi *multi,
/* Add the curl handles to our pollfds first */
data = multi->easyp;
while(data) {
- bitmap = multi_getsock(data, sockbunch, MAX_SOCKSPEREASYHANDLE);
+ bitmap = multi_getsock(data, sockbunch);
for(i = 0; i< MAX_SOCKSPEREASYHANDLE; i++) {
curl_socket_t s = CURL_SOCKET_BAD;
@@ -1083,6 +1158,14 @@ CURLMcode Curl_multi_wait(struct Curl_multi *multi,
++nfds;
}
+#ifdef ENABLE_WAKEUP
+ if(use_wakeup && multi->wakeup_pair[0] != CURL_SOCKET_BAD) {
+ ufds[nfds].fd = multi->wakeup_pair[0];
+ ufds[nfds].events = POLLIN;
+ ++nfds;
+ }
+#endif
+
if(nfds) {
int pollrc;
/* wait... */
@@ -1106,6 +1189,29 @@ CURLMcode Curl_multi_wait(struct Curl_multi *multi,
extra_fds[i].revents = mask;
}
+
+#ifdef ENABLE_WAKEUP
+ if(use_wakeup && multi->wakeup_pair[0] != CURL_SOCKET_BAD) {
+ if(ufds[curlfds + extra_nfds].revents & POLLIN) {
+ char buf[64];
+ while(1) {
+ /* the reading socket is non-blocking, try to read
+ data from it until it receives an error (except EINTR).
+ In normal cases it will get EAGAIN or EWOULDBLOCK
+ when there is no more data, breaking the loop. */
+ if(sread(multi->wakeup_pair[0], buf, sizeof(buf)) <= 0) {
+#ifndef USE_WINSOCK
+ if(EINTR == SOCKERRNO)
+ continue;
+#endif
+ break;
+ }
+ }
+ /* do not count the wakeup socket into the returned value */
+ retcode--;
+ }
+ }
+#endif
}
}
@@ -1113,9 +1219,23 @@ CURLMcode Curl_multi_wait(struct Curl_multi *multi,
free(ufds);
if(ret)
*ret = retcode;
- if(gotsocket && (extra_fds || curlfds))
+ if(!extrawait || nfds)
/* if any socket was checked */
- *gotsocket = TRUE;
+ ;
+ else {
+ long sleep_ms = 0;
+
+ /* Avoid busy-looping when there's nothing particular to wait for */
+ if(!curl_multi_timeout(multi, &sleep_ms) && sleep_ms) {
+ if(sleep_ms > timeout_ms)
+ sleep_ms = timeout_ms;
+ /* when there are no easy handles in the multi, this holds a -1
+ timeout */
+ else if((sleep_ms < 0) && extrawait)
+ sleep_ms = timeout_ms;
+ Curl_wait_ms((int)sleep_ms);
+ }
+ }
return CURLM_OK;
}
@@ -1126,7 +1246,65 @@ CURLMcode curl_multi_wait(struct Curl_multi *multi,
int timeout_ms,
int *ret)
{
- return Curl_multi_wait(multi, extra_fds, extra_nfds, timeout_ms, ret, NULL);
+ return Curl_multi_wait(multi, extra_fds, extra_nfds, timeout_ms, ret, FALSE,
+ FALSE);
+}
+
+CURLMcode curl_multi_poll(struct Curl_multi *multi,
+ struct curl_waitfd extra_fds[],
+ unsigned int extra_nfds,
+ int timeout_ms,
+ int *ret)
+{
+ return Curl_multi_wait(multi, extra_fds, extra_nfds, timeout_ms, ret, TRUE,
+ TRUE);
+}
+
+CURLMcode curl_multi_wakeup(struct Curl_multi *multi)
+{
+ /* this function is usually called from another thread,
+ it has to be careful only to access parts of the
+ Curl_multi struct that are constant */
+
+ /* GOOD_MULTI_HANDLE can be safely called */
+ if(!GOOD_MULTI_HANDLE(multi))
+ return CURLM_BAD_HANDLE;
+
+#ifdef ENABLE_WAKEUP
+ /* the wakeup_pair variable is only written during init and cleanup,
+ making it safe to access from another thread after the init part
+ and before cleanup */
+ if(multi->wakeup_pair[1] != CURL_SOCKET_BAD) {
+ char buf[1];
+ buf[0] = 1;
+ while(1) {
+ /* swrite() is not thread-safe in general, because concurrent calls
+ can have their messages interleaved, but in this case the content
+ of the messages does not matter, which makes it ok to call.
+
+ The write socket is set to non-blocking, this way this function
+ cannot block, making it safe to call even from the same thread
+ that will call Curl_multi_wait(). If swrite() returns that it
+ would block, it's considered successful because it means that
+ previous calls to this function will wake up the poll(). */
+ if(swrite(multi->wakeup_pair[1], buf, sizeof(buf)) < 0) {
+ int err = SOCKERRNO;
+ int return_success;
+#ifdef USE_WINSOCK
+ return_success = WSAEWOULDBLOCK == err;
+#else
+ if(EINTR == err)
+ continue;
+ return_success = EWOULDBLOCK == err || EAGAIN == err;
+#endif
+ if(!return_success)
+ return CURLM_WAKEUP_FAILURE;
+ }
+ return CURLM_OK;
+ }
+ }
+#endif
+ return CURLM_WAKEUP_FAILURE;
}
/*
@@ -1189,6 +1367,7 @@ static CURLcode multi_do(struct Curl_easy *data, bool *done)
DEBUGASSERT(conn);
DEBUGASSERT(conn->handler);
+ DEBUGASSERT(conn->data == data);
if(conn->handler->do_it) {
/* generic protocol-specific function pointer set in curl_connect() */
@@ -1226,6 +1405,109 @@ static CURLcode multi_do_more(struct connectdata *conn, int *complete)
return result;
}
+/*
+ * We are doing protocol-specific connecting and this is being called over and
+ * over from the multi interface until the connection phase is done on
+ * protocol layer.
+ */
+
+static CURLcode protocol_connecting(struct connectdata *conn,
+ bool *done)
+{
+ CURLcode result = CURLE_OK;
+
+ if(conn && conn->handler->connecting) {
+ *done = FALSE;
+ result = conn->handler->connecting(conn, done);
+ }
+ else
+ *done = TRUE;
+
+ return result;
+}
+
+/*
+ * We are DOING this is being called over and over from the multi interface
+ * until the DOING phase is done on protocol layer.
+ */
+
+static CURLcode protocol_doing(struct connectdata *conn, bool *done)
+{
+ CURLcode result = CURLE_OK;
+
+ if(conn && conn->handler->doing) {
+ *done = FALSE;
+ result = conn->handler->doing(conn, done);
+ }
+ else
+ *done = TRUE;
+
+ return result;
+}
+
+/*
+ * We have discovered that the TCP connection has been successful, we can now
+ * proceed with some action.
+ *
+ */
+static CURLcode protocol_connect(struct connectdata *conn,
+ bool *protocol_done)
+{
+ CURLcode result = CURLE_OK;
+
+ DEBUGASSERT(conn);
+ DEBUGASSERT(protocol_done);
+
+ *protocol_done = FALSE;
+
+ if(conn->bits.tcpconnect[FIRSTSOCKET] && conn->bits.protoconnstart) {
+ /* We already are connected, get back. This may happen when the connect
+ worked fine in the first call, like when we connect to a local server
+ or proxy. Note that we don't know if the protocol is actually done.
+
+ Unless this protocol doesn't have any protocol-connect callback, as
+ then we know we're done. */
+ if(!conn->handler->connecting)
+ *protocol_done = TRUE;
+
+ return CURLE_OK;
+ }
+
+ if(!conn->bits.protoconnstart) {
+
+ result = Curl_proxy_connect(conn, FIRSTSOCKET);
+ if(result)
+ return result;
+
+ if(CONNECT_FIRSTSOCKET_PROXY_SSL())
+ /* wait for HTTPS proxy SSL initialization to complete */
+ return CURLE_OK;
+
+ if(conn->bits.tunnel_proxy && conn->bits.httpproxy &&
+ Curl_connect_ongoing(conn))
+ /* when using an HTTP tunnel proxy, await complete tunnel establishment
+ before proceeding further. Return CURLE_OK so we'll be called again */
+ return CURLE_OK;
+
+ if(conn->handler->connect_it) {
+ /* is there a protocol-specific connect() procedure? */
+
+ /* Call the protocol-specific connect function */
+ result = conn->handler->connect_it(conn, protocol_done);
+ }
+ else
+ *protocol_done = TRUE;
+
+ /* it has started, possibly even completed but that knowledge isn't stored
+ in this bit! */
+ if(!result)
+ conn->bits.protoconnstart = TRUE;
+ }
+
+ return result; /* pass back status */
+}
+
+
static CURLMcode multi_runsingle(struct Curl_multi *multi,
struct curltime now,
struct Curl_easy *data)
@@ -1233,7 +1515,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
struct Curl_message *msg = NULL;
bool connected;
bool async;
- bool protocol_connect = FALSE;
+ bool protocol_connected = FALSE;
bool dophase_done = FALSE;
bool done = FALSE;
CURLMcode rc;
@@ -1252,6 +1534,9 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
bool stream_error = FALSE;
rc = CURLM_OK;
+ DEBUGASSERT((data->mstate <= CURLM_STATE_CONNECT) ||
+ (data->mstate >= CURLM_STATE_DONE) ||
+ data->conn);
if(!data->conn &&
data->mstate > CURLM_STATE_CONNECT &&
data->mstate < CURLM_STATE_DONE) {
@@ -1349,7 +1634,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
if(data->set.connecttimeout)
Curl_expire(data, data->set.connecttimeout, EXPIRE_CONNECTTIMEOUT);
- result = Curl_connect(data, &async, &protocol_connect);
+ result = Curl_connect(data, &async, &protocol_connected);
if(CURLE_NO_CONNECTION_AVAILABLE == result) {
/* There was no connection available. We will go to the pending
state and wait for an available connection. */
@@ -1377,7 +1662,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
WAITDO or DO! */
rc = CURLM_CALL_MULTI_PERFORM;
- if(protocol_connect)
+ if(protocol_connected)
multistate(data, CURLM_STATE_DO);
else {
#ifndef CURL_DISABLE_HTTP
@@ -1432,7 +1717,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
if(dns) {
/* Perform the next step in the connection phase, and then move on
to the WAITCONNECT state */
- result = Curl_once_resolved(data->conn, &protocol_connect);
+ result = Curl_once_resolved(data->conn, &protocol_connected);
if(result)
/* if Curl_once_resolved() returns failure, the connection struct
@@ -1441,7 +1726,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
else {
/* call again please so that we get the next socket setup */
rc = CURLM_CALL_MULTI_PERFORM;
- if(protocol_connect)
+ if(protocol_connected)
multistate(data, CURLM_STATE_DO);
else {
#ifndef CURL_DISABLE_HTTP
@@ -1466,7 +1751,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
case CURLM_STATE_WAITPROXYCONNECT:
/* this is HTTP-specific, but sending CONNECT to a proxy is HTTP... */
DEBUGASSERT(data->conn);
- result = Curl_http_connect(data->conn, &protocol_connect);
+ result = Curl_http_connect(data->conn, &protocol_connected);
if(data->conn->bits.proxy_connect_closed) {
rc = CURLM_CALL_MULTI_PERFORM;
@@ -1517,8 +1802,8 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
break;
case CURLM_STATE_SENDPROTOCONNECT:
- result = Curl_protocol_connect(data->conn, &protocol_connect);
- if(!result && !protocol_connect)
+ result = protocol_connect(data->conn, &protocol_connected);
+ if(!result && !protocol_connected)
/* switch to waiting state */
multistate(data, CURLM_STATE_PROTOCONNECT);
else if(!result) {
@@ -1536,8 +1821,8 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
case CURLM_STATE_PROTOCONNECT:
/* protocol-specific connect phase */
- result = Curl_protocol_connecting(data->conn, &protocol_connect);
- if(!result && protocol_connect) {
+ result = protocol_connecting(data->conn, &protocol_connected);
+ if(!result && protocol_connected) {
/* after the connect has completed, go WAITDO or DO */
multistate(data, CURLM_STATE_DO);
rc = CURLM_CALL_MULTI_PERFORM;
@@ -1659,8 +1944,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
case CURLM_STATE_DOING:
/* we continue DOING until the DO phase is complete */
DEBUGASSERT(data->conn);
- result = Curl_protocol_doing(data->conn,
- &dophase_done);
+ result = protocol_doing(data->conn, &dophase_done);
if(!result) {
if(dophase_done) {
/* after DO, go DO_DONE or DO_MORE */
@@ -1911,8 +2195,13 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
}
}
}
- else if(comeback)
- rc = CURLM_CALL_MULTI_PERFORM;
+ else if(comeback) {
+ /* This avoids CURLM_CALL_MULTI_PERFORM so that a very fast transfer
+ won't get stuck on this transfer at the expense of other concurrent
+ transfers */
+ Curl_expire(data, 0, EXPIRE_RUN_NOW);
+ rc = CURLM_OK;
+ }
break;
}
@@ -1988,13 +2277,15 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
if(stream_error) {
/* Don't attempt to send data over a connection that timed out */
bool dead_connection = result == CURLE_OPERATION_TIMEDOUT;
- /* disconnect properly */
- Curl_disconnect(data, data->conn, dead_connection);
+ struct connectdata *conn = data->conn;
/* This is where we make sure that the conn pointer is reset.
We don't have to do this in every case block above where a
failure is detected */
detach_connnection(data);
+
+ /* disconnect properly */
+ Curl_disconnect(data, conn, dead_connection);
}
}
else if(data->mstate == CURLM_STATE_CONNECT) {
@@ -2093,7 +2384,7 @@ CURLMcode curl_multi_perform(struct Curl_multi *multi, int *running_handles)
*running_handles = multi->num_alive;
if(CURLM_OK >= returncode)
- update_timer(multi);
+ Curl_update_timer(multi);
return returncode;
}
@@ -2145,6 +2436,11 @@ CURLMcode curl_multi_cleanup(struct Curl_multi *multi)
Curl_hash_destroy(&multi->hostcache);
Curl_psl_destroy(&multi->psl);
+
+#ifdef ENABLE_WAKEUP
+ sclose(multi->wakeup_pair[0]);
+ sclose(multi->wakeup_pair[1]);
+#endif
free(multi);
return CURLM_OK;
@@ -2210,7 +2506,7 @@ static CURLMcode singlesocket(struct Curl_multi *multi,
/* Fill in the 'current' struct with the state as it is now: what sockets to
supervise and for what actions */
- curraction = multi_getsock(data, socks, MAX_SOCKSPEREASYHANDLE);
+ curraction = multi_getsock(data, socks);
/* We have 0 .. N sockets already and we get to know about the 0 .. M
sockets we should have from now on. Detect the differences, remove no
@@ -2238,14 +2534,14 @@ static CURLMcode singlesocket(struct Curl_multi *multi,
actions[i] = action;
if(entry) {
/* check if new for this transfer */
- for(i = 0; i< data->numsocks; i++) {
- if(s == data->sockets[i]) {
- prevaction = data->actions[i];
+ int j;
+ for(j = 0; j< data->numsocks; j++) {
+ if(s == data->sockets[j]) {
+ prevaction = data->actions[j];
sincebefore = TRUE;
break;
}
}
-
}
else {
/* this is a socket we didn't have before, add it to the hash! */
@@ -2273,29 +2569,22 @@ static CURLMcode singlesocket(struct Curl_multi *multi,
if(action & CURL_POLL_OUT)
entry->writers++;
- /* add 'data' to the list of handles using this socket! */
- Curl_llist_insert_next(&entry->list, entry->list.tail,
- data, &data->sh_queue);
+ /* add 'data' to the transfer hash on this socket! */
+ if(!Curl_hash_add(&entry->transfers, (char *)&data, /* hash key */
+ sizeof(struct Curl_easy *), data))
+ return CURLM_OUT_OF_MEMORY;
}
comboaction = (entry->writers? CURL_POLL_OUT : 0) |
(entry->readers ? CURL_POLL_IN : 0);
-#if 0
- infof(data, "--- Comboaction: %u readers %u writers\n",
- entry->readers, entry->writers);
-#endif
- /* check if it has the same action set */
- if(entry->action == comboaction)
+ /* socket existed before and has the same action set as before */
+ if(sincebefore && (entry->action == comboaction))
/* same, continue */
continue;
- /* we know (entry != NULL) at this point, see the logic above */
if(multi->socket_cb)
- multi->socket_cb(data,
- s,
- comboaction,
- multi->socket_userp,
+ multi->socket_cb(data, s, comboaction, multi->socket_userp,
entry->socketp);
entry->action = comboaction; /* store the current action state */
@@ -2335,11 +2624,14 @@ static CURLMcode singlesocket(struct Curl_multi *multi,
multi->socket_cb(data, s, CURL_POLL_REMOVE,
multi->socket_userp,
entry->socketp);
- sh_delentry(&multi->sockhash, s);
+ sh_delentry(entry, &multi->sockhash, s);
}
else {
- /* remove this transfer as a user of this socket */
- Curl_llist_remove(&entry->list, &data->sh_queue, NULL);
+ /* still users, but remove this handle as a user of this socket */
+ if(Curl_hash_delete(&entry->transfers, (char *)&data,
+ sizeof(struct Curl_easy *))) {
+ DEBUGASSERT(NULL);
+ }
}
}
} /* for loop over numsocks */
@@ -2383,7 +2675,7 @@ void Curl_multi_closed(struct Curl_easy *data, curl_socket_t s)
entry->socketp);
/* now remove it from the socket hash */
- sh_delentry(&multi->sockhash, s);
+ sh_delentry(entry, &multi->sockhash, s);
}
}
}
@@ -2474,7 +2766,6 @@ static CURLMcode multi_socket(struct Curl_multi *multi,
return result;
}
if(s != CURL_SOCKET_TIMEOUT) {
-
struct Curl_sh_entry *entry = sh_getentry(&multi->sockhash, s);
if(!entry)
@@ -2485,37 +2776,22 @@ static CURLMcode multi_socket(struct Curl_multi *multi,
and just move on. */
;
else {
- struct curl_llist *list = &entry->list;
- struct curl_llist_element *e;
- SIGPIPE_VARIABLE(pipe_st);
+ struct curl_hash_iterator iter;
+ struct curl_hash_element *he;
/* the socket can be shared by many transfers, iterate */
- for(e = list->head; e; e = e->next) {
- data = (struct Curl_easy *)e->ptr;
-
- if(data->magic != CURLEASY_MAGIC_NUMBER)
- /* bad bad bad bad bad bad bad */
- return CURLM_INTERNAL_ERROR;
+ Curl_hash_start_iterate(&entry->transfers, &iter);
+ for(he = Curl_hash_next_element(&iter); he;
+ he = Curl_hash_next_element(&iter)) {
+ data = (struct Curl_easy *)he->ptr;
+ DEBUGASSERT(data);
+ DEBUGASSERT(data->magic == CURLEASY_MAGIC_NUMBER);
if(data->conn && !(data->conn->handler->flags & PROTOPT_DIRLOCK))
/* set socket event bitmask if they're not locked */
data->conn->cselect_bits = ev_bitmask;
- sigpipe_ignore(data, &pipe_st);
- result = multi_runsingle(multi, now, data);
- sigpipe_restore(&pipe_st);
-
- if(data->conn && !(data->conn->handler->flags & PROTOPT_DIRLOCK))
- /* clear the bitmask only if not locked */
- data->conn->cselect_bits = 0;
-
- if(CURLM_OK >= result) {
- /* get the socket(s) and check if the state has been changed since
- last */
- result = singlesocket(multi, data);
- if(result)
- return result;
- }
+ Curl_expire(data, 0, EXPIRE_RUN_NOW);
}
/* Now we fall-through and do the timer-based stuff, since we don't want
@@ -2530,9 +2806,10 @@ static CURLMcode multi_socket(struct Curl_multi *multi,
}
else {
/* Asked to run due to time-out. Clear the 'lastcall' variable to force
- update_timer() to trigger a callback to the app again even if the same
- timeout is still the one to run after this call. That handles the case
- when the application asks libcurl to run the timeout prematurely. */
+ Curl_update_timer() to trigger a callback to the app again even if the
+ same timeout is still the one to run after this call. That handles the
+ case when the application asks libcurl to run the timeout
+ prematurely. */
memset(&multi->timer_lastcall, 0, sizeof(multi->timer_lastcall));
}
@@ -2631,6 +2908,16 @@ CURLMcode curl_multi_setopt(struct Curl_multi *multi,
break;
case CURLMOPT_PIPELINING_SERVER_BL:
break;
+ case CURLMOPT_MAX_CONCURRENT_STREAMS:
+ {
+ long streams = va_arg(param, long);
+ if(streams < 1)
+ streams = 100;
+ multi->max_concurrent_streams =
+ (streams > (long)INITIAL_MAX_CONCURRENT_STREAMS)?
+ INITIAL_MAX_CONCURRENT_STREAMS : (unsigned int)streams;
+ }
+ break;
default:
res = CURLM_UNKNOWN_OPTION;
break;
@@ -2650,7 +2937,7 @@ CURLMcode curl_multi_socket(struct Curl_multi *multi, curl_socket_t s,
return CURLM_RECURSIVE_API_CALL;
result = multi_socket(multi, FALSE, s, 0, running_handles);
if(CURLM_OK >= result)
- update_timer(multi);
+ Curl_update_timer(multi);
return result;
}
@@ -2662,7 +2949,7 @@ CURLMcode curl_multi_socket_action(struct Curl_multi *multi, curl_socket_t s,
return CURLM_RECURSIVE_API_CALL;
result = multi_socket(multi, FALSE, s, ev_bitmask, running_handles);
if(CURLM_OK >= result)
- update_timer(multi);
+ Curl_update_timer(multi);
return result;
}
@@ -2674,7 +2961,7 @@ CURLMcode curl_multi_socket_all(struct Curl_multi *multi, int *running_handles)
return CURLM_RECURSIVE_API_CALL;
result = multi_socket(multi, TRUE, CURL_SOCKET_BAD, 0, running_handles);
if(CURLM_OK >= result)
- update_timer(multi);
+ Curl_update_timer(multi);
return result;
}
@@ -2734,14 +3021,14 @@ CURLMcode curl_multi_timeout(struct Curl_multi *multi,
* Tell the application it should update its timers, if it subscribes to the
* update timer callback.
*/
-static int update_timer(struct Curl_multi *multi)
+void Curl_update_timer(struct Curl_multi *multi)
{
long timeout_ms;
if(!multi->timer_cb)
- return 0;
+ return;
if(multi_timeout(multi, &timeout_ms)) {
- return -1;
+ return;
}
if(timeout_ms < 0) {
static const struct curltime none = {0, 0};
@@ -2749,9 +3036,10 @@ static int update_timer(struct Curl_multi *multi)
multi->timer_lastcall = none;
/* there's no timeout now but there was one previously, tell the app to
disable it */
- return multi->timer_cb(multi, -1, multi->timer_userp);
+ multi->timer_cb(multi, -1, multi->timer_userp);
+ return;
}
- return 0;
+ return;
}
/* When multi_timeout() is done, multi->timetree points to the node with the
@@ -2759,11 +3047,11 @@ static int update_timer(struct Curl_multi *multi)
* if this is the same (fixed) time as we got in a previous call and then
* avoid calling the callback again. */
if(Curl_splaycomparekeys(multi->timetree->key, multi->timer_lastcall) == 0)
- return 0;
+ return;
multi->timer_lastcall = multi->timetree->key;
- return multi->timer_cb(multi, timeout_ms, multi->timer_userp);
+ multi->timer_cb(multi, timeout_ms, multi->timer_userp);
}
/*
@@ -2840,7 +3128,7 @@ multi_addtimeout(struct Curl_easy *data,
*
* Expire replaces a former timeout using the same id if already set.
*/
-void Curl_expire(struct Curl_easy *data, time_t milli, expire_id id)
+void Curl_expire(struct Curl_easy *data, timediff_t milli, expire_id id)
{
struct Curl_multi *multi = data->multi;
struct curltime *nowp = &data->state.expiretime;
@@ -2854,7 +3142,7 @@ void Curl_expire(struct Curl_easy *data, time_t milli, expire_id id)
DEBUGASSERT(id < EXPIRE_LAST);
set = Curl_now();
- set.tv_sec += milli/1000;
+ set.tv_sec += (time_t)(milli/1000); /* might be a 64 to 32 bit conversion */
set.tv_usec += (unsigned int)(milli%1000)*1000;
if(set.tv_usec >= 1000000) {
@@ -3068,3 +3356,9 @@ void Curl_multi_dump(struct Curl_multi *multi)
}
}
#endif
+
+unsigned int Curl_multi_max_concurrent_streams(struct Curl_multi *multi)
+{
+ DEBUGASSERT(multi);
+ return multi->max_concurrent_streams;
+}
diff --git a/Utilities/cmcurl/lib/multihandle.h b/Utilities/cmcurl/lib/multihandle.h
index 279379a..91eca16 100644
--- a/Utilities/cmcurl/lib/multihandle.h
+++ b/Utilities/cmcurl/lib/multihandle.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -24,6 +24,7 @@
#include "conncache.h"
#include "psl.h"
+#include "socketpair.h"
struct Curl_message {
struct curl_llist_element list;
@@ -66,6 +67,14 @@ typedef enum {
#define CURLPIPE_ANY (CURLPIPE_MULTIPLEX)
+#if defined(USE_SOCKETPAIR) && !defined(USE_BLOCKING_SOCKETS)
+#define ENABLE_WAKEUP
+#endif
+
+
+/* value for MAXIMUM CONCURRENT STREAMS upper limit */
+#define INITIAL_MAX_CONCURRENT_STREAMS ((1U << 31) - 1)
+
/* This is the struct known as CURLM on the outside */
struct Curl_multi {
/* First a simple identifier to easier detect if a user mix up
@@ -110,11 +119,6 @@ struct Curl_multi {
same actual socket) */
struct curl_hash sockhash;
- /* multiplexing wanted */
- bool multiplexing;
-
- bool recheckstate; /* see Curl_multi_connchanged */
-
/* Shared connection cache (bundles)*/
struct conncache conn_cache;
@@ -132,7 +136,17 @@ struct Curl_multi {
void *timer_userp;
struct curltime timer_lastcall; /* the fixed time for the timeout for the
previous callback */
+ unsigned int max_concurrent_streams;
+
+#ifdef ENABLE_WAKEUP
+ curl_socket_t wakeup_pair[2]; /* socketpair() used for wakeup
+ 0 is used for read, 1 is used for write */
+#endif
+ /* multiplexing wanted */
+ bool multiplexing;
+ bool recheckstate; /* see Curl_multi_connchanged */
bool in_callback; /* true while executing a callback */
+ bool ipv6_works;
};
#endif /* HEADER_CURL_MULTIHANDLE_H */
diff --git a/Utilities/cmcurl/lib/multiif.h b/Utilities/cmcurl/lib/multiif.h
index e8a5e70..bde755e 100644
--- a/Utilities/cmcurl/lib/multiif.h
+++ b/Utilities/cmcurl/lib/multiif.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -27,10 +27,10 @@
*/
void Curl_updatesocket(struct Curl_easy *data);
-void Curl_expire(struct Curl_easy *data, time_t milli, expire_id);
+void Curl_expire(struct Curl_easy *data, timediff_t milli, expire_id);
void Curl_expire_clear(struct Curl_easy *data);
void Curl_expire_done(struct Curl_easy *data, expire_id id);
-void Curl_detach_connnection(struct Curl_easy *data);
+void Curl_update_timer(struct Curl_multi *multi);
void Curl_attach_connnection(struct Curl_easy *data,
struct connectdata *conn);
bool Curl_multiplex_wanted(const struct Curl_multi *multi);
@@ -89,11 +89,8 @@ CURLMcode Curl_multi_add_perform(struct Curl_multi *multi,
struct Curl_easy *data,
struct connectdata *conn);
-CURLMcode Curl_multi_wait(struct Curl_multi *multi,
- struct curl_waitfd extra_fds[],
- unsigned int extra_nfds,
- int timeout_ms,
- int *ret,
- bool *gotsocket); /* if any socket was checked */
+
+/* Return the value of the CURLMOPT_MAX_CONCURRENT_STREAMS option */
+unsigned int Curl_multi_max_concurrent_streams(struct Curl_multi *multi);
#endif /* HEADER_CURL_MULTIIF_H */
diff --git a/Utilities/cmcurl/lib/netrc.c b/Utilities/cmcurl/lib/netrc.c
index 1bd998f..1c9da31 100644
--- a/Utilities/cmcurl/lib/netrc.c
+++ b/Utilities/cmcurl/lib/netrc.c
@@ -45,27 +45,27 @@ enum host_lookup_state {
HOSTVALID /* this is "our" machine! */
};
+#define NETRC_FILE_MISSING 1
+#define NETRC_FAILED -1
+#define NETRC_SUCCESS 0
+
/*
- * @unittest: 1304
- *
- * *loginp and *passwordp MUST be allocated if they aren't NULL when passed
- * in.
+ * Returns zero on success.
*/
-int Curl_parsenetrc(const char *host,
- char **loginp,
- char **passwordp,
- bool *login_changed,
- bool *password_changed,
- char *netrcfile)
+static int parsenetrc(const char *host,
+ char **loginp,
+ char **passwordp,
+ bool *login_changed,
+ bool *password_changed,
+ char *netrcfile)
{
FILE *file;
- int retcode = 1;
+ int retcode = NETRC_FILE_MISSING;
char *login = *loginp;
char *password = *passwordp;
bool specific_login = (login && *login != 0);
bool login_alloc = FALSE;
bool password_alloc = FALSE;
- bool netrc_alloc = FALSE;
enum host_lookup_state state = NOTHING;
char state_login = 0; /* Found a login keyword */
@@ -73,51 +73,9 @@ int Curl_parsenetrc(const char *host,
int state_our_login = FALSE; /* With specific_login, found *our* login
name */
-#define NETRC DOT_CHAR "netrc"
-
- if(!netrcfile) {
- bool home_alloc = FALSE;
- char *home = curl_getenv("HOME"); /* portable environment reader */
- if(home) {
- home_alloc = TRUE;
-#if defined(HAVE_GETPWUID_R) && defined(HAVE_GETEUID)
- }
- else {
- struct passwd pw, *pw_res;
- char pwbuf[1024];
- if(!getpwuid_r(geteuid(), &pw, pwbuf, sizeof(pwbuf), &pw_res)
- && pw_res) {
- home = strdup(pw.pw_dir);
- if(!home)
- return CURLE_OUT_OF_MEMORY;
- home_alloc = TRUE;
- }
-#elif defined(HAVE_GETPWUID) && defined(HAVE_GETEUID)
- }
- else {
- struct passwd *pw;
- pw = getpwuid(geteuid());
- if(pw) {
- home = pw->pw_dir;
- }
-#endif
- }
-
- if(!home)
- return retcode; /* no home directory found (or possibly out of memory) */
-
- netrcfile = curl_maprintf("%s%s%s", home, DIR_CHAR, NETRC);
- if(home_alloc)
- free(home);
- if(!netrcfile) {
- return -1;
- }
- netrc_alloc = TRUE;
- }
+ DEBUGASSERT(netrcfile);
file = fopen(netrcfile, FOPEN_READTEXT);
- if(netrc_alloc)
- free(netrcfile);
if(file) {
char *tok;
char *tok_buf;
@@ -130,7 +88,7 @@ int Curl_parsenetrc(const char *host,
if(tok && *tok == '#')
/* treat an initial hash as a comment line */
continue;
- while(!done && tok) {
+ while(tok) {
if((login && *login) && (password && *password)) {
done = TRUE;
@@ -148,14 +106,14 @@ int Curl_parsenetrc(const char *host,
}
else if(strcasecompare("default", tok)) {
state = HOSTVALID;
- retcode = 0; /* we did find our host */
+ retcode = NETRC_SUCCESS; /* we did find our host */
}
break;
case HOSTFOUND:
if(strcasecompare(host, tok)) {
/* and yes, this is our host! */
state = HOSTVALID;
- retcode = 0; /* we did find our host */
+ retcode = NETRC_SUCCESS; /* we did find our host */
}
else
/* not our host */
@@ -174,7 +132,7 @@ int Curl_parsenetrc(const char *host,
}
login = strdup(tok);
if(!login) {
- retcode = -1; /* allocation failed */
+ retcode = NETRC_FAILED; /* allocation failed */
goto out;
}
login_alloc = TRUE;
@@ -190,7 +148,7 @@ int Curl_parsenetrc(const char *host,
}
password = strdup(tok);
if(!password) {
- retcode = -1; /* allocation failed */
+ retcode = NETRC_FAILED; /* allocation failed */
goto out;
}
password_alloc = TRUE;
@@ -215,6 +173,7 @@ int Curl_parsenetrc(const char *host,
out:
if(!retcode) {
+ /* success */
*login_changed = FALSE;
*password_changed = FALSE;
if(login_alloc) {
@@ -242,4 +201,78 @@ int Curl_parsenetrc(const char *host,
return retcode;
}
+/*
+ * @unittest: 1304
+ *
+ * *loginp and *passwordp MUST be allocated if they aren't NULL when passed
+ * in.
+ */
+int Curl_parsenetrc(const char *host,
+ char **loginp,
+ char **passwordp,
+ bool *login_changed,
+ bool *password_changed,
+ char *netrcfile)
+{
+ int retcode = 1;
+ char *filealloc = NULL;
+
+ if(!netrcfile) {
+ char *home = NULL;
+ char *homea = curl_getenv("HOME"); /* portable environment reader */
+ if(homea) {
+ home = homea;
+#if defined(HAVE_GETPWUID_R) && defined(HAVE_GETEUID)
+ }
+ else {
+ struct passwd pw, *pw_res;
+ char pwbuf[1024];
+ if(!getpwuid_r(geteuid(), &pw, pwbuf, sizeof(pwbuf), &pw_res)
+ && pw_res) {
+ home = pw.pw_dir;
+ }
+#elif defined(HAVE_GETPWUID) && defined(HAVE_GETEUID)
+ }
+ else {
+ struct passwd *pw;
+ pw = getpwuid(geteuid());
+ if(pw) {
+ home = pw->pw_dir;
+ }
+#endif
+ }
+
+ if(!home)
+ return retcode; /* no home directory found (or possibly out of
+ memory) */
+
+ filealloc = curl_maprintf("%s%s.netrc", home, DIR_CHAR);
+ if(!filealloc) {
+ free(homea);
+ return -1;
+ }
+ retcode = parsenetrc(host, loginp, passwordp, login_changed,
+ password_changed, filealloc);
+ free(filealloc);
+#ifdef WIN32
+ if(retcode == NETRC_FILE_MISSING) {
+ /* fallback to the old-style "_netrc" file */
+ filealloc = curl_maprintf("%s%s_netrc", home, DIR_CHAR);
+ if(!filealloc) {
+ free(homea);
+ return -1;
+ }
+ retcode = parsenetrc(host, loginp, passwordp, login_changed,
+ password_changed, filealloc);
+ free(filealloc);
+ }
+#endif
+ free(homea);
+ }
+ else
+ retcode = parsenetrc(host, loginp, passwordp, login_changed,
+ password_changed, netrcfile);
+ return retcode;
+}
+
#endif
diff --git a/Utilities/cmcurl/lib/non-ascii.c b/Utilities/cmcurl/lib/non-ascii.c
index 42beaec..a48e67d 100644
--- a/Utilities/cmcurl/lib/non-ascii.c
+++ b/Utilities/cmcurl/lib/non-ascii.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/nonblock.c b/Utilities/cmcurl/lib/nonblock.c
index 4d105c1..abeb659 100644
--- a/Utilities/cmcurl/lib/nonblock.c
+++ b/Utilities/cmcurl/lib/nonblock.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/nonblock.h b/Utilities/cmcurl/lib/nonblock.h
index eb18ea1..d50d315 100644
--- a/Utilities/cmcurl/lib/nonblock.h
+++ b/Utilities/cmcurl/lib/nonblock.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/openldap.c b/Utilities/cmcurl/lib/openldap.c
index eeab2c7..734ca5f 100644
--- a/Utilities/cmcurl/lib/openldap.c
+++ b/Utilities/cmcurl/lib/openldap.c
@@ -151,7 +151,7 @@ static const char *url_errs[] = {
"bad or missing extensions"
};
-typedef struct ldapconninfo {
+struct ldapconninfo {
LDAP *ld;
Curl_recv *recv; /* for stacking SSL handler */
Curl_send *send;
@@ -160,7 +160,7 @@ typedef struct ldapconninfo {
bool ssldone;
bool sslinst;
bool didbind;
-} ldapconninfo;
+};
typedef struct ldapreqinfo {
int msgid;
@@ -169,7 +169,7 @@ typedef struct ldapreqinfo {
static CURLcode ldap_setup_connection(struct connectdata *conn)
{
- ldapconninfo *li;
+ struct ldapconninfo *li;
LDAPURLDesc *lud;
struct Curl_easy *data = conn->data;
int rc, proto;
@@ -190,11 +190,11 @@ static CURLcode ldap_setup_connection(struct connectdata *conn)
proto = ldap_pvt_url_scheme2proto(lud->lud_scheme);
ldap_free_urldesc(lud);
- li = calloc(1, sizeof(ldapconninfo));
+ li = calloc(1, sizeof(struct ldapconninfo));
if(!li)
return CURLE_OUT_OF_MEMORY;
li->proto = proto;
- conn->proto.generic = li;
+ conn->proto.ldapc = li;
connkeep(conn, "OpenLDAP default");
return CURLE_OK;
}
@@ -205,7 +205,7 @@ static Sockbuf_IO ldapsb_tls;
static CURLcode ldap_connect(struct connectdata *conn, bool *done)
{
- ldapconninfo *li = conn->proto.generic;
+ struct ldapconninfo *li = conn->proto.ldapc;
struct Curl_easy *data = conn->data;
int rc, proto = LDAP_VERSION3;
char hosturl[1024];
@@ -252,7 +252,7 @@ static CURLcode ldap_connect(struct connectdata *conn, bool *done)
static CURLcode ldap_connecting(struct connectdata *conn, bool *done)
{
- ldapconninfo *li = conn->proto.generic;
+ struct ldapconninfo *li = conn->proto.ldapc;
struct Curl_easy *data = conn->data;
LDAPMessage *msg = NULL;
struct timeval tv = {0, 1}, *tvp;
@@ -357,7 +357,7 @@ static CURLcode ldap_connecting(struct connectdata *conn, bool *done)
static CURLcode ldap_disconnect(struct connectdata *conn, bool dead_connection)
{
- ldapconninfo *li = conn->proto.generic;
+ struct ldapconninfo *li = conn->proto.ldapc;
(void) dead_connection;
if(li) {
@@ -365,7 +365,7 @@ static CURLcode ldap_disconnect(struct connectdata *conn, bool dead_connection)
ldap_unbind_ext(li->ld, NULL, NULL);
li->ld = NULL;
}
- conn->proto.generic = NULL;
+ conn->proto.ldapc = NULL;
free(li);
}
return CURLE_OK;
@@ -373,7 +373,7 @@ static CURLcode ldap_disconnect(struct connectdata *conn, bool dead_connection)
static CURLcode ldap_do(struct connectdata *conn, bool *done)
{
- ldapconninfo *li = conn->proto.generic;
+ struct ldapconninfo *li = conn->proto.ldapc;
ldapreqinfo *lr;
CURLcode status = CURLE_OK;
int rc = 0;
@@ -427,7 +427,7 @@ static CURLcode ldap_done(struct connectdata *conn, CURLcode res,
if(lr) {
/* if there was a search in progress, abandon it */
if(lr->msgid) {
- ldapconninfo *li = conn->proto.generic;
+ struct ldapconninfo *li = conn->proto.ldapc;
ldap_abandon_ext(li->ld, lr->msgid, NULL, NULL);
lr->msgid = 0;
}
@@ -441,7 +441,7 @@ static CURLcode ldap_done(struct connectdata *conn, CURLcode res,
static ssize_t ldap_recv(struct connectdata *conn, int sockindex, char *buf,
size_t len, CURLcode *err)
{
- ldapconninfo *li = conn->proto.generic;
+ struct ldapconninfo *li = conn->proto.ldapc;
struct Curl_easy *data = conn->data;
ldapreqinfo *lr = data->req.protop;
int rc, ret;
@@ -718,7 +718,7 @@ static ber_slen_t
ldapsb_tls_read(Sockbuf_IO_Desc *sbiod, void *buf, ber_len_t len)
{
struct connectdata *conn = sbiod->sbiod_pvt;
- ldapconninfo *li = conn->proto.generic;
+ struct ldapconninfo *li = conn->proto.ldapc;
ber_slen_t ret;
CURLcode err = CURLE_RECV_ERROR;
@@ -733,7 +733,7 @@ static ber_slen_t
ldapsb_tls_write(Sockbuf_IO_Desc *sbiod, void *buf, ber_len_t len)
{
struct connectdata *conn = sbiod->sbiod_pvt;
- ldapconninfo *li = conn->proto.generic;
+ struct ldapconninfo *li = conn->proto.ldapc;
ber_slen_t ret;
CURLcode err = CURLE_SEND_ERROR;
diff --git a/Utilities/cmcurl/lib/parsedate.c b/Utilities/cmcurl/lib/parsedate.c
index 7ae5eb8..585d7ea 100644
--- a/Utilities/cmcurl/lib/parsedate.c
+++ b/Utilities/cmcurl/lib/parsedate.c
@@ -100,16 +100,20 @@ static int parsedate(const char *date, time_t *output);
#define PARSEDATE_LATER 1
#define PARSEDATE_SOONER 2
-#ifndef CURL_DISABLE_PARSEDATE
-
+#if !defined(CURL_DISABLE_PARSEDATE) || !defined(CURL_DISABLE_FTP) || \
+ !defined(CURL_DISABLE_FILE)
+/* These names are also used by FTP and FILE code */
const char * const Curl_wkday[] =
{"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"};
-static const char * const weekday[] =
-{ "Monday", "Tuesday", "Wednesday", "Thursday",
- "Friday", "Saturday", "Sunday" };
const char * const Curl_month[]=
{ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
+#endif
+
+#ifndef CURL_DISABLE_PARSEDATE
+static const char * const weekday[] =
+{ "Monday", "Tuesday", "Wednesday", "Thursday",
+ "Friday", "Saturday", "Sunday" };
struct tzinfo {
char name[5];
@@ -583,6 +587,30 @@ time_t curl_getdate(const char *p, const time_t *now)
return -1;
}
+/* Curl_getdate_capped() differs from curl_getdate() in that this will return
+ TIME_T_MAX in case the parsed time value was too big, instead of an
+ error. */
+
+time_t Curl_getdate_capped(const char *p)
+{
+ time_t parsed = -1;
+ int rc = parsedate(p, &parsed);
+
+ switch(rc) {
+ case PARSEDATE_OK:
+ if(parsed == -1)
+ /* avoid returning -1 for a working scenario */
+ parsed++;
+ return parsed;
+ case PARSEDATE_LATER:
+ /* this returns the maximum time value */
+ return parsed;
+ default:
+ return -1; /* everything else is fail */
+ }
+ /* UNREACHABLE */
+}
+
/*
* Curl_gmtime() is a gmtime() replacement for portability. Do not use the
* gmtime_r() or gmtime() functions anywhere else but here.
diff --git a/Utilities/cmcurl/lib/parsedate.h b/Utilities/cmcurl/lib/parsedate.h
index 8dc3b90..8c7ae94 100644
--- a/Utilities/cmcurl/lib/parsedate.h
+++ b/Utilities/cmcurl/lib/parsedate.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -27,4 +27,10 @@ extern const char * const Curl_month[12];
CURLcode Curl_gmtime(time_t intime, struct tm *store);
+/* Curl_getdate_capped() differs from curl_getdate() in that this will return
+ TIME_T_MAX in case the parsed time value was too big, instead of an
+ error. */
+
+time_t Curl_getdate_capped(const char *p);
+
#endif /* HEADER_CURL_PARSEDATE_H */
diff --git a/Utilities/cmcurl/lib/pingpong.c b/Utilities/cmcurl/lib/pingpong.c
index e9568ee..d071005 100644
--- a/Utilities/cmcurl/lib/pingpong.c
+++ b/Utilities/cmcurl/lib/pingpong.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -60,12 +60,12 @@ time_t Curl_pp_state_timeout(struct pingpong *pp, bool disconnecting)
/* Without a requested timeout, we only wait 'response_time' seconds for the
full response to arrive before we bail out */
timeout_ms = response_time -
- Curl_timediff(Curl_now(), pp->response); /* spent time */
+ (time_t)Curl_timediff(Curl_now(), pp->response); /* spent time */
if(data->set.timeout && !disconnecting) {
/* if timeout is requested, find out how much remaining time we have */
time_t timeout2_ms = data->set.timeout - /* timeout time */
- Curl_timediff(Curl_now(), conn->now); /* spent time */
+ (time_t)Curl_timediff(Curl_now(), conn->now); /* spent time */
/* pick the lowest number */
timeout_ms = CURLMIN(timeout_ms, timeout2_ms);
@@ -463,14 +463,9 @@ CURLcode Curl_pp_readresp(curl_socket_t sockfd,
}
int Curl_pp_getsock(struct pingpong *pp,
- curl_socket_t *socks,
- int numsocks)
+ curl_socket_t *socks)
{
struct connectdata *conn = pp->conn;
-
- if(!numsocks)
- return GETSOCK_BLANK;
-
socks[0] = conn->sock[FIRSTSOCKET];
if(pp->sendleft) {
diff --git a/Utilities/cmcurl/lib/pingpong.h b/Utilities/cmcurl/lib/pingpong.h
index dbe1f8d..849a7c0 100644
--- a/Utilities/cmcurl/lib/pingpong.h
+++ b/Utilities/cmcurl/lib/pingpong.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -135,8 +135,7 @@ CURLcode Curl_pp_flushsend(struct pingpong *pp);
/* call this when a pingpong connection is disconnected */
CURLcode Curl_pp_disconnect(struct pingpong *pp);
-int Curl_pp_getsock(struct pingpong *pp, curl_socket_t *socks,
- int numsocks);
+int Curl_pp_getsock(struct pingpong *pp, curl_socket_t *socks);
/***********************************************************************
diff --git a/Utilities/cmcurl/lib/pop3.c b/Utilities/cmcurl/lib/pop3.c
index c8f3965..57c1373 100644
--- a/Utilities/cmcurl/lib/pop3.c
+++ b/Utilities/cmcurl/lib/pop3.c
@@ -95,8 +95,7 @@ static CURLcode pop3_done(struct connectdata *conn, CURLcode status,
static CURLcode pop3_connect(struct connectdata *conn, bool *done);
static CURLcode pop3_disconnect(struct connectdata *conn, bool dead);
static CURLcode pop3_multi_statemach(struct connectdata *conn, bool *done);
-static int pop3_getsock(struct connectdata *conn, curl_socket_t *socks,
- int numsocks);
+static int pop3_getsock(struct connectdata *conn, curl_socket_t *socks);
static CURLcode pop3_doing(struct connectdata *conn, bool *dophase_done);
static CURLcode pop3_setup_connection(struct connectdata *conn);
static CURLcode pop3_parse_url_options(struct connectdata *conn);
@@ -339,10 +338,8 @@ static CURLcode pop3_perform_capa(struct connectdata *conn)
*/
static CURLcode pop3_perform_starttls(struct connectdata *conn)
{
- CURLcode result = CURLE_OK;
-
/* Send the STLS command */
- result = Curl_pp_sendf(&conn->proto.pop3c.pp, "%s", "STLS");
+ CURLcode result = Curl_pp_sendf(&conn->proto.pop3c.pp, "%s", "STLS");
if(!result)
state(conn, POP3_STARTTLS);
@@ -358,11 +355,10 @@ static CURLcode pop3_perform_starttls(struct connectdata *conn)
*/
static CURLcode pop3_perform_upgrade_tls(struct connectdata *conn)
{
- CURLcode result = CURLE_OK;
- struct pop3_conn *pop3c = &conn->proto.pop3c;
-
/* Start the SSL connection */
- result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET, &pop3c->ssldone);
+ struct pop3_conn *pop3c = &conn->proto.pop3c;
+ CURLcode result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET,
+ &pop3c->ssldone);
if(!result) {
if(pop3c->state != POP3_UPGRADETLS)
@@ -593,10 +589,8 @@ static CURLcode pop3_perform_command(struct connectdata *conn)
*/
static CURLcode pop3_perform_quit(struct connectdata *conn)
{
- CURLcode result = CURLE_OK;
-
/* Send the QUIT command */
- result = Curl_pp_sendf(&conn->proto.pop3c.pp, "%s", "QUIT");
+ CURLcode result = Curl_pp_sendf(&conn->proto.pop3c.pp, "%s", "QUIT");
if(!result)
state(conn, POP3_QUIT);
@@ -1060,10 +1054,9 @@ static CURLcode pop3_init(struct connectdata *conn)
}
/* For the POP3 "protocol connect" and "doing" phases only */
-static int pop3_getsock(struct connectdata *conn, curl_socket_t *socks,
- int numsocks)
+static int pop3_getsock(struct connectdata *conn, curl_socket_t *socks)
{
- return Curl_pp_getsock(&conn->proto.pop3c.pp, socks, numsocks);
+ return Curl_pp_getsock(&conn->proto.pop3c.pp, socks);
}
/***********************************************************************
diff --git a/Utilities/cmcurl/lib/pop3.h b/Utilities/cmcurl/lib/pop3.h
index a8e697c..3ba7999 100644
--- a/Utilities/cmcurl/lib/pop3.h
+++ b/Utilities/cmcurl/lib/pop3.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2009 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2009 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/progress.c b/Utilities/cmcurl/lib/progress.c
index f586d59..60a941a 100644
--- a/Utilities/cmcurl/lib/progress.c
+++ b/Utilities/cmcurl/lib/progress.c
@@ -26,6 +26,7 @@
#include "sendf.h"
#include "multiif.h"
#include "progress.h"
+#include "timeval.h"
#include "curl_printf.h"
/* check rate limits within this many recent milliseconds, at minimum. */
@@ -168,7 +169,7 @@ void Curl_pgrsResetTransferSizes(struct Curl_easy *data)
void Curl_pgrsTime(struct Curl_easy *data, timerid timer)
{
struct curltime now = Curl_now();
- time_t *delta = NULL;
+ timediff_t *delta = NULL;
switch(timer) {
default:
@@ -238,6 +239,8 @@ void Curl_pgrsStartNow(struct Curl_easy *data)
data->progress.ul_limit_start.tv_usec = 0;
data->progress.dl_limit_start.tv_sec = 0;
data->progress.dl_limit_start.tv_usec = 0;
+ data->progress.downloaded = 0;
+ data->progress.uploaded = 0;
/* clear all bits except HIDE and HEADERS_OUT */
data->progress.flags &= PGRS_HIDE|PGRS_HEADERS_OUT;
Curl_ratelimit(data, data->progress.start);
@@ -268,8 +271,8 @@ timediff_t Curl_pgrsLimitWaitTime(curl_off_t cursize,
struct curltime now)
{
curl_off_t size = cursize - startsize;
- time_t minimum;
- time_t actual;
+ timediff_t minimum;
+ timediff_t actual;
if(!limit || !size)
return 0;
@@ -282,10 +285,10 @@ timediff_t Curl_pgrsLimitWaitTime(curl_off_t cursize,
minimum = (time_t) (CURL_OFF_T_C(1000) * size / limit);
else {
minimum = (time_t) (size / limit);
- if(minimum < TIME_T_MAX/1000)
+ if(minimum < TIMEDIFF_T_MAX/1000)
minimum *= 1000;
else
- minimum = TIME_T_MAX;
+ minimum = TIMEDIFF_T_MAX;
}
/*
@@ -364,18 +367,15 @@ void Curl_pgrsSetUploadSize(struct Curl_easy *data, curl_off_t size)
}
}
-#ifndef CURL_DISABLE_PROGRESS_METER
-static void progress_meter(struct connectdata *conn)
+/* returns TRUE if it's time to show the progress meter */
+static bool progress_calc(struct connectdata *conn, struct curltime now)
{
- struct curltime now;
curl_off_t timespent;
curl_off_t timespent_ms; /* milliseconds */
struct Curl_easy *data = conn->data;
- bool shownow = FALSE;
curl_off_t dl = data->progress.downloaded;
curl_off_t ul = data->progress.uploaded;
-
- now = Curl_now(); /* what time is it */
+ bool timetoshow = FALSE;
/* The time spent so far (from the start) */
data->progress.timespent = Curl_timediff_us(now, data->progress.start);
@@ -398,10 +398,8 @@ static void progress_meter(struct connectdata *conn)
if(data->progress.lastshow != now.tv_sec) {
int countindex; /* amount of seconds stored in the speeder array */
int nowindex = data->progress.speeder_c% CURR_TIME;
- if(!(data->progress.flags & PGRS_HIDE))
- shownow = TRUE;
-
data->progress.lastshow = now.tv_sec;
+ timetoshow = TRUE;
/* Let's do the "current speed" thing, with the dl + ul speeds
combined. Store the speed at entry 'nowindex'. */
@@ -434,8 +432,7 @@ static void progress_meter(struct connectdata *conn)
data->progress.speeder_c%CURR_TIME:0;
/* Figure out the exact time for the time span */
- span_ms = Curl_timediff(now,
- data->progress.speeder_time[checkindex]);
+ span_ms = Curl_timediff(now, data->progress.speeder_time[checkindex]);
if(0 == span_ms)
span_ms = 1; /* at least one millisecond MUST have passed */
@@ -461,118 +458,119 @@ static void progress_meter(struct connectdata *conn)
data->progress.ulspeed + data->progress.dlspeed;
} /* Calculations end */
- if(!shownow)
- /* only show the internal progress meter once per second */
- return;
- else {
- /* If there's no external callback set, use internal code to show
- progress */
- /* progress meter has not been shut off */
- char max5[6][10];
- curl_off_t dlpercen = 0;
- curl_off_t ulpercen = 0;
- curl_off_t total_percen = 0;
- curl_off_t total_transfer;
- curl_off_t total_expected_transfer;
- char time_left[10];
- char time_total[10];
- char time_spent[10];
- curl_off_t ulestimate = 0;
- curl_off_t dlestimate = 0;
- curl_off_t total_estimate;
-
- if(!(data->progress.flags & PGRS_HEADERS_OUT)) {
- if(data->state.resume_from) {
- fprintf(data->set.err,
- "** Resuming transfer from byte position %"
- CURL_FORMAT_CURL_OFF_T "\n", data->state.resume_from);
- }
- fprintf(data->set.err,
- " %% Total %% Received %% Xferd Average Speed "
- "Time Time Time Current\n"
- " Dload Upload "
- "Total Spent Left Speed\n");
- data->progress.flags |= PGRS_HEADERS_OUT; /* headers are shown */
- }
-
- /* Figure out the estimated time of arrival for the upload */
- if((data->progress.flags & PGRS_UL_SIZE_KNOWN) &&
- (data->progress.ulspeed > CURL_OFF_T_C(0))) {
- ulestimate = data->progress.size_ul / data->progress.ulspeed;
-
- if(data->progress.size_ul > CURL_OFF_T_C(10000))
- ulpercen = data->progress.uploaded /
- (data->progress.size_ul/CURL_OFF_T_C(100));
- else if(data->progress.size_ul > CURL_OFF_T_C(0))
- ulpercen = (data->progress.uploaded*100) /
- data->progress.size_ul;
- }
+ return timetoshow;
+}
- /* ... and the download */
- if((data->progress.flags & PGRS_DL_SIZE_KNOWN) &&
- (data->progress.dlspeed > CURL_OFF_T_C(0))) {
- dlestimate = data->progress.size_dl / data->progress.dlspeed;
-
- if(data->progress.size_dl > CURL_OFF_T_C(10000))
- dlpercen = data->progress.downloaded /
- (data->progress.size_dl/CURL_OFF_T_C(100));
- else if(data->progress.size_dl > CURL_OFF_T_C(0))
- dlpercen = (data->progress.downloaded*100) /
- data->progress.size_dl;
+#ifndef CURL_DISABLE_PROGRESS_METER
+static void progress_meter(struct connectdata *conn)
+{
+ struct Curl_easy *data = conn->data;
+ char max5[6][10];
+ curl_off_t dlpercen = 0;
+ curl_off_t ulpercen = 0;
+ curl_off_t total_percen = 0;
+ curl_off_t total_transfer;
+ curl_off_t total_expected_transfer;
+ char time_left[10];
+ char time_total[10];
+ char time_spent[10];
+ curl_off_t ulestimate = 0;
+ curl_off_t dlestimate = 0;
+ curl_off_t total_estimate;
+ curl_off_t timespent =
+ (curl_off_t)data->progress.timespent/1000000; /* seconds */
+
+ if(!(data->progress.flags & PGRS_HEADERS_OUT)) {
+ if(data->state.resume_from) {
+ fprintf(data->set.err,
+ "** Resuming transfer from byte position %"
+ CURL_FORMAT_CURL_OFF_T "\n", data->state.resume_from);
}
+ fprintf(data->set.err,
+ " %% Total %% Received %% Xferd Average Speed "
+ "Time Time Time Current\n"
+ " Dload Upload "
+ "Total Spent Left Speed\n");
+ data->progress.flags |= PGRS_HEADERS_OUT; /* headers are shown */
+ }
- /* Now figure out which of them is slower and use that one for the
- total estimate! */
- total_estimate = ulestimate>dlestimate?ulestimate:dlestimate;
-
- /* create the three time strings */
- time2str(time_left, total_estimate > 0?(total_estimate - timespent):0);
- time2str(time_total, total_estimate);
- time2str(time_spent, timespent);
-
- /* Get the total amount of data expected to get transferred */
- total_expected_transfer =
- ((data->progress.flags & PGRS_UL_SIZE_KNOWN)?
- data->progress.size_ul:data->progress.uploaded)+
- ((data->progress.flags & PGRS_DL_SIZE_KNOWN)?
- data->progress.size_dl:data->progress.downloaded);
-
- /* We have transferred this much so far */
- total_transfer = data->progress.downloaded + data->progress.uploaded;
+ /* Figure out the estimated time of arrival for the upload */
+ if((data->progress.flags & PGRS_UL_SIZE_KNOWN) &&
+ (data->progress.ulspeed > CURL_OFF_T_C(0))) {
+ ulestimate = data->progress.size_ul / data->progress.ulspeed;
+
+ if(data->progress.size_ul > CURL_OFF_T_C(10000))
+ ulpercen = data->progress.uploaded /
+ (data->progress.size_ul/CURL_OFF_T_C(100));
+ else if(data->progress.size_ul > CURL_OFF_T_C(0))
+ ulpercen = (data->progress.uploaded*100) /
+ data->progress.size_ul;
+ }
- /* Get the percentage of data transferred so far */
- if(total_expected_transfer > CURL_OFF_T_C(10000))
- total_percen = total_transfer /
- (total_expected_transfer/CURL_OFF_T_C(100));
- else if(total_expected_transfer > CURL_OFF_T_C(0))
- total_percen = (total_transfer*100) / total_expected_transfer;
+ /* ... and the download */
+ if((data->progress.flags & PGRS_DL_SIZE_KNOWN) &&
+ (data->progress.dlspeed > CURL_OFF_T_C(0))) {
+ dlestimate = data->progress.size_dl / data->progress.dlspeed;
+
+ if(data->progress.size_dl > CURL_OFF_T_C(10000))
+ dlpercen = data->progress.downloaded /
+ (data->progress.size_dl/CURL_OFF_T_C(100));
+ else if(data->progress.size_dl > CURL_OFF_T_C(0))
+ dlpercen = (data->progress.downloaded*100) /
+ data->progress.size_dl;
+ }
- fprintf(data->set.err,
- "\r"
- "%3" CURL_FORMAT_CURL_OFF_T " %s "
- "%3" CURL_FORMAT_CURL_OFF_T " %s "
- "%3" CURL_FORMAT_CURL_OFF_T " %s %s %s %s %s %s %s",
- total_percen, /* 3 letters */ /* total % */
- max5data(total_expected_transfer, max5[2]), /* total size */
- dlpercen, /* 3 letters */ /* rcvd % */
- max5data(data->progress.downloaded, max5[0]), /* rcvd size */
- ulpercen, /* 3 letters */ /* xfer % */
- max5data(data->progress.uploaded, max5[1]), /* xfer size */
- max5data(data->progress.dlspeed, max5[3]), /* avrg dl speed */
- max5data(data->progress.ulspeed, max5[4]), /* avrg ul speed */
- time_total, /* 8 letters */ /* total time */
- time_spent, /* 8 letters */ /* time spent */
- time_left, /* 8 letters */ /* time left */
- max5data(data->progress.current_speed, max5[5])
- );
-
- /* we flush the output stream to make it appear as soon as possible */
- fflush(data->set.err);
- } /* don't show now */
+ /* Now figure out which of them is slower and use that one for the
+ total estimate! */
+ total_estimate = ulestimate>dlestimate?ulestimate:dlestimate;
+
+ /* create the three time strings */
+ time2str(time_left, total_estimate > 0?(total_estimate - timespent):0);
+ time2str(time_total, total_estimate);
+ time2str(time_spent, timespent);
+
+ /* Get the total amount of data expected to get transferred */
+ total_expected_transfer =
+ ((data->progress.flags & PGRS_UL_SIZE_KNOWN)?
+ data->progress.size_ul:data->progress.uploaded)+
+ ((data->progress.flags & PGRS_DL_SIZE_KNOWN)?
+ data->progress.size_dl:data->progress.downloaded);
+
+ /* We have transferred this much so far */
+ total_transfer = data->progress.downloaded + data->progress.uploaded;
+
+ /* Get the percentage of data transferred so far */
+ if(total_expected_transfer > CURL_OFF_T_C(10000))
+ total_percen = total_transfer /
+ (total_expected_transfer/CURL_OFF_T_C(100));
+ else if(total_expected_transfer > CURL_OFF_T_C(0))
+ total_percen = (total_transfer*100) / total_expected_transfer;
+
+ fprintf(data->set.err,
+ "\r"
+ "%3" CURL_FORMAT_CURL_OFF_T " %s "
+ "%3" CURL_FORMAT_CURL_OFF_T " %s "
+ "%3" CURL_FORMAT_CURL_OFF_T " %s %s %s %s %s %s %s",
+ total_percen, /* 3 letters */ /* total % */
+ max5data(total_expected_transfer, max5[2]), /* total size */
+ dlpercen, /* 3 letters */ /* rcvd % */
+ max5data(data->progress.downloaded, max5[0]), /* rcvd size */
+ ulpercen, /* 3 letters */ /* xfer % */
+ max5data(data->progress.uploaded, max5[1]), /* xfer size */
+ max5data(data->progress.dlspeed, max5[3]), /* avrg dl speed */
+ max5data(data->progress.ulspeed, max5[4]), /* avrg ul speed */
+ time_total, /* 8 letters */ /* total time */
+ time_spent, /* 8 letters */ /* time spent */
+ time_left, /* 8 letters */ /* time left */
+ max5data(data->progress.current_speed, max5[5])
+ );
+
+ /* we flush the output stream to make it appear as soon as possible */
+ fflush(data->set.err);
}
#else
/* progress bar disabled */
-#define progress_meter(x)
+#define progress_meter(x) Curl_nop_stmt
#endif
@@ -583,6 +581,8 @@ static void progress_meter(struct connectdata *conn)
int Curl_pgrsUpdate(struct connectdata *conn)
{
struct Curl_easy *data = conn->data;
+ struct curltime now = Curl_now(); /* what time is it */
+ bool showprogress = progress_calc(conn, now);
if(!(data->progress.flags & PGRS_HIDE)) {
if(data->set.fxferinfo) {
int result;
@@ -594,11 +594,13 @@ int Curl_pgrsUpdate(struct connectdata *conn)
data->progress.size_ul,
data->progress.uploaded);
Curl_set_in_callback(data, false);
- if(result)
- failf(data, "Callback aborted");
- return result;
+ if(result != CURL_PROGRESSFUNC_CONTINUE) {
+ if(result)
+ failf(data, "Callback aborted");
+ return result;
+ }
}
- if(data->set.fprogress) {
+ else if(data->set.fprogress) {
int result;
/* The older deprecated callback is set, call that */
Curl_set_in_callback(data, true);
@@ -608,12 +610,16 @@ int Curl_pgrsUpdate(struct connectdata *conn)
(double)data->progress.size_ul,
(double)data->progress.uploaded);
Curl_set_in_callback(data, false);
- if(result)
- failf(data, "Callback aborted");
- return result;
+ if(result != CURL_PROGRESSFUNC_CONTINUE) {
+ if(result)
+ failf(data, "Callback aborted");
+ return result;
+ }
}
+
+ if(showprogress)
+ progress_meter(conn);
}
- progress_meter(conn);
return 0;
}
diff --git a/Utilities/cmcurl/lib/quic.h b/Utilities/cmcurl/lib/quic.h
new file mode 100644
index 0000000..1eb23e9
--- /dev/null
+++ b/Utilities/cmcurl/lib/quic.h
@@ -0,0 +1,57 @@
+#ifndef HEADER_CURL_QUIC_H
+#define HEADER_CURL_QUIC_H
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include "curl_setup.h"
+
+#ifdef ENABLE_QUIC
+#ifdef USE_NGTCP2
+#include "vquic/ngtcp2.h"
+#endif
+#ifdef USE_QUICHE
+#include "vquic/quiche.h"
+#endif
+
+#include "urldata.h"
+
+/* functions provided by the specific backends */
+CURLcode Curl_quic_connect(struct connectdata *conn,
+ curl_socket_t sockfd,
+ int sockindex,
+ const struct sockaddr *addr,
+ socklen_t addrlen);
+CURLcode Curl_quic_is_connected(struct connectdata *conn,
+ curl_socket_t sockfd,
+ bool *connected);
+int Curl_quic_ver(char *p, size_t len);
+CURLcode Curl_quic_done_sending(struct connectdata *conn);
+void Curl_quic_done(struct Curl_easy *data, bool premature);
+bool Curl_quic_data_pending(const struct Curl_easy *data);
+
+#else /* ENABLE_QUIC */
+#define Curl_quic_done_sending(x)
+#define Curl_quic_done(x,y)
+#define Curl_quic_data_pending(x)
+#endif /* !ENABLE_QUIC */
+
+#endif /* HEADER_CURL_QUIC_H */
diff --git a/Utilities/cmcurl/lib/rand.c b/Utilities/cmcurl/lib/rand.c
index 6ee45fe..c415048 100644
--- a/Utilities/cmcurl/lib/rand.c
+++ b/Utilities/cmcurl/lib/rand.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -106,8 +106,7 @@ static CURLcode randit(struct Curl_easy *data, unsigned int *rnd)
* 'rndptr' points to.
*
* If libcurl is built without TLS support or with a TLS backend that lacks a
- * proper random API (Gskit, PolarSSL or mbedTLS), this function will use
- * "weak" random.
+ * proper random API (Gskit or mbedTLS), this function will use "weak" random.
*
* When built *with* TLS support and a backend that offers strong random, it
* will return error if it cannot provide strong random values.
diff --git a/Utilities/cmcurl/lib/rand.h b/Utilities/cmcurl/lib/rand.h
index 5deb041..3c8e2b8 100644
--- a/Utilities/cmcurl/lib/rand.h
+++ b/Utilities/cmcurl/lib/rand.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -27,8 +27,7 @@
* 'rnd' points to.
*
* If libcurl is built without TLS support or with a TLS backend that lacks a
- * proper random API (Gskit, PolarSSL or mbedTLS), this function will use
- * "weak" random.
+ * proper random API (Gskit or mbedTLS), this function will use "weak" random.
*
* When built *with* TLS support and a backend that offers strong random, it
* will return error if it cannot provide strong random values.
diff --git a/Utilities/cmcurl/lib/rename.c b/Utilities/cmcurl/lib/rename.c
new file mode 100644
index 0000000..bb170d3
--- /dev/null
+++ b/Utilities/cmcurl/lib/rename.c
@@ -0,0 +1,62 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include "rename.h"
+
+#include "curl_setup.h"
+
+#if (!defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_COOKIES)) || \
+ defined(USE_ALTSVC)
+
+#include "timeval.h"
+
+/* The last 3 #include files should be in this order */
+#include "curl_printf.h"
+#include "curl_memory.h"
+#include "memdebug.h"
+
+/* return 0 on success, 1 on error */
+int Curl_rename(const char *oldpath, const char *newpath)
+{
+#ifdef WIN32
+ /* rename() on Windows doesn't overwrite, so we can't use it here.
+ MoveFileExA() will overwrite and is usually atomic, however it fails
+ when there are open handles to the file. */
+ const int max_wait_ms = 1000;
+ struct curltime start = Curl_now();
+ for(;;) {
+ timediff_t diff;
+ if(MoveFileExA(oldpath, newpath, MOVEFILE_REPLACE_EXISTING))
+ break;
+ diff = Curl_timediff(Curl_now(), start);
+ if(diff < 0 || diff > max_wait_ms)
+ return 1;
+ Sleep(1);
+ }
+#else
+ if(rename(oldpath, newpath))
+ return 1;
+#endif
+ return 0;
+}
+
+#endif
diff --git a/Utilities/cmcurl/lib/rename.h b/Utilities/cmcurl/lib/rename.h
new file mode 100644
index 0000000..d7442c8
--- /dev/null
+++ b/Utilities/cmcurl/lib/rename.h
@@ -0,0 +1,27 @@
+#ifndef HEADER_CURL_RENAME_H
+#define HEADER_CURL_RENAME_H
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+int Curl_rename(const char *oldpath, const char *newpath);
+
+#endif /* HEADER_CURL_RENAME_H */
diff --git a/Utilities/cmcurl/lib/rtsp.c b/Utilities/cmcurl/lib/rtsp.c
index 74cf232..bba4c16 100644
--- a/Utilities/cmcurl/lib/rtsp.c
+++ b/Utilities/cmcurl/lib/rtsp.c
@@ -52,10 +52,7 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done);
static CURLcode rtsp_done(struct connectdata *conn, CURLcode, bool premature);
static CURLcode rtsp_connect(struct connectdata *conn, bool *done);
static CURLcode rtsp_disconnect(struct connectdata *conn, bool dead);
-
-static int rtsp_getsock_do(struct connectdata *conn,
- curl_socket_t *socks,
- int numsocks);
+static int rtsp_getsock_do(struct connectdata *conn, curl_socket_t *socks);
/*
* Parse and write out any available RTP data.
@@ -77,11 +74,9 @@ static unsigned int rtsp_conncheck(struct connectdata *check,
interface and then we're always _sending_ a request and thus we wait for
the single socket to become writable only */
static int rtsp_getsock_do(struct connectdata *conn,
- curl_socket_t *socks,
- int numsocks)
+ curl_socket_t *socks)
{
/* write mode */
- (void)numsocks; /* unused, we trust it to be at least 1 */
socks[0] = conn->sock[FIRSTSOCKET];
return GETSOCK_WRITESOCK(0);
}
@@ -491,7 +486,7 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done)
return result;
if((rtspreq == RTSPREQ_SETUP) || (rtspreq == RTSPREQ_DESCRIBE)) {
- result = Curl_add_timecondition(data, req_buffer);
+ result = Curl_add_timecondition(conn, req_buffer);
if(result)
return result;
}
diff --git a/Utilities/cmcurl/lib/rtsp.h b/Utilities/cmcurl/lib/rtsp.h
index 2f9cc32..1aae864 100644
--- a/Utilities/cmcurl/lib/rtsp.h
+++ b/Utilities/cmcurl/lib/rtsp.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/security.c b/Utilities/cmcurl/lib/security.c
index 7695154..3b9c20a 100644
--- a/Utilities/cmcurl/lib/security.c
+++ b/Utilities/cmcurl/lib/security.c
@@ -7,7 +7,7 @@
* rewrite to work around the paragraph 2 in the BSD licenses as explained
* below.
*
- * Copyright (c) 1998, 1999, 2017 Kungliga Tekniska Högskolan
+ * Copyright (c) 1998, 1999, 2017 Kungliga Tekniska Högskolan
* (Royal Institute of Technology, Stockholm, Sweden).
*
* Copyright (C) 2001 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
@@ -191,7 +191,6 @@ static CURLcode read_data(struct connectdata *conn,
struct krb5buffer *buf)
{
int len;
- void *tmp = NULL;
CURLcode result;
result = socket_read(fd, &len, sizeof(len));
@@ -201,12 +200,11 @@ static CURLcode read_data(struct connectdata *conn,
if(len) {
/* only realloc if there was a length */
len = ntohl(len);
- tmp = Curl_saferealloc(buf->data, len);
+ buf->data = Curl_saferealloc(buf->data, len);
}
- if(tmp == NULL)
+ if(!len || !buf->data)
return CURLE_OUT_OF_MEMORY;
- buf->data = tmp;
result = socket_read(fd, buf->data, len);
if(result)
return result;
@@ -238,7 +236,7 @@ static ssize_t sec_recv(struct connectdata *conn, int sockindex,
/* Handle clear text response. */
if(conn->sec_complete == 0 || conn->data_prot == PROT_CLEAR)
- return read(fd, buffer, len);
+ return sread(fd, buffer, len);
if(conn->in_buffer.eof_flag) {
conn->in_buffer.eof_flag = 0;
@@ -267,7 +265,7 @@ static ssize_t sec_recv(struct connectdata *conn, int sockindex,
}
/* Send |length| bytes from |from| to the |fd| socket taking care of encoding
- and negociating with the server. |from| can be NULL. */
+ and negotiating with the server. |from| can be NULL. */
static void do_sec_send(struct connectdata *conn, curl_socket_t fd,
const char *from, int length)
{
diff --git a/Utilities/cmcurl/lib/select.c b/Utilities/cmcurl/lib/select.c
index 6e73890..ae23155 100644
--- a/Utilities/cmcurl/lib/select.c
+++ b/Utilities/cmcurl/lib/select.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -53,9 +53,6 @@
/* Convenience local macros */
#define ELAPSED_MS() (int)Curl_timediff(Curl_now(), initial_tv)
-int Curl_ack_eintr = 0;
-#define ERROR_NOT_EINTR(error) (Curl_ack_eintr || error != EINTR)
-
/*
* Internal function used for waiting a specific amount of ms
* in Curl_socket_check() and Curl_poll() when no file descriptor
@@ -74,13 +71,6 @@ int Curl_ack_eintr = 0;
*/
int Curl_wait_ms(int timeout_ms)
{
-#if !defined(MSDOS) && !defined(USE_WINSOCK)
-#ifndef HAVE_POLL_FINE
- struct timeval pending_tv;
-#endif
- struct curltime initial_tv;
- int pending_ms;
-#endif
int r = 0;
if(!timeout_ms)
@@ -94,28 +84,16 @@ int Curl_wait_ms(int timeout_ms)
#elif defined(USE_WINSOCK)
Sleep(timeout_ms);
#else
- pending_ms = timeout_ms;
- initial_tv = Curl_now();
- do {
- int error;
#if defined(HAVE_POLL_FINE)
- r = poll(NULL, 0, pending_ms);
+ r = poll(NULL, 0, timeout_ms);
#else
- pending_tv.tv_sec = pending_ms / 1000;
- pending_tv.tv_usec = (pending_ms % 1000) * 1000;
+ {
+ struct timeval pending_tv;
+ pending_tv.tv_sec = timeout_ms / 1000;
+ pending_tv.tv_usec = (timeout_ms % 1000) * 1000;
r = select(0, NULL, NULL, NULL, &pending_tv);
+ }
#endif /* HAVE_POLL_FINE */
- if(r != -1)
- break;
- error = SOCKERRNO;
- if(error && ERROR_NOT_EINTR(error))
- break;
- pending_ms = timeout_ms - ELAPSED_MS();
- if(pending_ms <= 0) {
- r = 0; /* Simulate a "call timed out" case */
- break;
- }
- } while(r == -1);
#endif /* USE_WINSOCK */
if(r)
r = -1;
@@ -158,7 +136,6 @@ int Curl_socket_check(curl_socket_t readfd0, /* two sockets to read from */
fd_set fds_err;
curl_socket_t maxfd;
#endif
- struct curltime initial_tv = {0, 0};
int pending_ms = 0;
int r;
int ret;
@@ -183,7 +160,6 @@ int Curl_socket_check(curl_socket_t readfd0, /* two sockets to read from */
if(timeout_ms > 0) {
pending_ms = (int)timeout_ms;
- initial_tv = Curl_now();
}
#ifdef HAVE_POLL_FINE
@@ -208,26 +184,11 @@ int Curl_socket_check(curl_socket_t readfd0, /* two sockets to read from */
num++;
}
- do {
- int error;
- if(timeout_ms < 0)
- pending_ms = -1;
- else if(!timeout_ms)
- pending_ms = 0;
- r = poll(pfd, num, pending_ms);
- if(r != -1)
- break;
- error = SOCKERRNO;
- if(error && ERROR_NOT_EINTR(error))
- break;
- if(timeout_ms > 0) {
- pending_ms = (int)(timeout_ms - ELAPSED_MS());
- if(pending_ms <= 0) {
- r = 0; /* Simulate a "call timed out" case */
- break;
- }
- }
- } while(r == -1);
+ if(timeout_ms < 0)
+ pending_ms = -1;
+ else if(!timeout_ms)
+ pending_ms = 0;
+ r = poll(pfd, num, pending_ms);
if(r < 0)
return -1;
@@ -290,61 +251,45 @@ int Curl_socket_check(curl_socket_t readfd0, /* two sockets to read from */
ptimeout = (timeout_ms < 0) ? NULL : &pending_tv;
- do {
- int error;
- if(timeout_ms > 0) {
- pending_tv.tv_sec = pending_ms / 1000;
- pending_tv.tv_usec = (pending_ms % 1000) * 1000;
- }
- else if(!timeout_ms) {
- pending_tv.tv_sec = 0;
- pending_tv.tv_usec = 0;
- }
+ if(timeout_ms > 0) {
+ pending_tv.tv_sec = pending_ms / 1000;
+ pending_tv.tv_usec = (pending_ms % 1000) * 1000;
+ }
+ else if(!timeout_ms) {
+ pending_tv.tv_sec = 0;
+ pending_tv.tv_usec = 0;
+ }
- /* WinSock select() must not be called with an fd_set that contains zero
- fd flags, or it will return WSAEINVAL. But, it also can't be called
- with no fd_sets at all! From the documentation:
+ /* WinSock select() must not be called with an fd_set that contains zero
+ fd flags, or it will return WSAEINVAL. But, it also can't be called
+ with no fd_sets at all! From the documentation:
- Any two of the parameters, readfds, writefds, or exceptfds, can be
- given as null. At least one must be non-null, and any non-null
- descriptor set must contain at least one handle to a socket.
+ Any two of the parameters, readfds, writefds, or exceptfds, can be
+ given as null. At least one must be non-null, and any non-null
+ descriptor set must contain at least one handle to a socket.
- We know that we have at least one bit set in at least two fd_sets in
- this case, but we may have no bits set in either fds_read or fd_write,
- so check for that and handle it. Luckily, with WinSock, we can _also_
- ask how many bits are set on an fd_set.
+ We know that we have at least one bit set in at least two fd_sets in
+ this case, but we may have no bits set in either fds_read or fd_write,
+ so check for that and handle it. Luckily, with WinSock, we can _also_
+ ask how many bits are set on an fd_set.
- It is unclear why WinSock doesn't just handle this for us instead of
- calling this an error.
+ It is unclear why WinSock doesn't just handle this for us instead of
+ calling this an error.
- Note also that WinSock ignores the first argument, so we don't worry
- about the fact that maxfd is computed incorrectly with WinSock (since
- curl_socket_t is unsigned in such cases and thus -1 is the largest
- value).
- */
+ Note also that WinSock ignores the first argument, so we don't worry
+ about the fact that maxfd is computed incorrectly with WinSock (since
+ curl_socket_t is unsigned in such cases and thus -1 is the largest
+ value).
+ */
#ifdef USE_WINSOCK
- r = select((int)maxfd + 1,
- fds_read.fd_count ? &fds_read : NULL,
- fds_write.fd_count ? &fds_write : NULL,
- &fds_err, ptimeout);
+ r = select((int)maxfd + 1,
+ fds_read.fd_count ? &fds_read : NULL,
+ fds_write.fd_count ? &fds_write : NULL,
+ &fds_err, ptimeout);
#else
- r = select((int)maxfd + 1, &fds_read, &fds_write, &fds_err, ptimeout);
+ r = select((int)maxfd + 1, &fds_read, &fds_write, &fds_err, ptimeout);
#endif
- if(r != -1)
- break;
- error = SOCKERRNO;
- if(error && ERROR_NOT_EINTR(error))
- break;
- if(timeout_ms > 0) {
- pending_ms = (int)(timeout_ms - ELAPSED_MS());
- if(pending_ms <= 0) {
- r = 0; /* Simulate a "call timed out" case */
- break;
- }
- }
- } while(r == -1);
-
if(r < 0)
return -1;
if(r == 0)
@@ -399,7 +344,6 @@ int Curl_poll(struct pollfd ufds[], unsigned int nfds, int timeout_ms)
fd_set fds_err;
curl_socket_t maxfd;
#endif
- struct curltime initial_tv = {0, 0};
bool fds_none = TRUE;
unsigned int i;
int pending_ms = 0;
@@ -425,31 +369,15 @@ int Curl_poll(struct pollfd ufds[], unsigned int nfds, int timeout_ms)
if(timeout_ms > 0) {
pending_ms = timeout_ms;
- initial_tv = Curl_now();
}
#ifdef HAVE_POLL_FINE
- do {
- int error;
- if(timeout_ms < 0)
- pending_ms = -1;
- else if(!timeout_ms)
- pending_ms = 0;
- r = poll(ufds, nfds, pending_ms);
- if(r != -1)
- break;
- error = SOCKERRNO;
- if(error && ERROR_NOT_EINTR(error))
- break;
- if(timeout_ms > 0) {
- pending_ms = (int)(timeout_ms - ELAPSED_MS());
- if(pending_ms <= 0) {
- r = 0; /* Simulate a "call timed out" case */
- break;
- }
- }
- } while(r == -1);
+ if(timeout_ms < 0)
+ pending_ms = -1;
+ else if(!timeout_ms)
+ pending_ms = 0;
+ r = poll(ufds, nfds, pending_ms);
if(r < 0)
return -1;
@@ -502,42 +430,27 @@ int Curl_poll(struct pollfd ufds[], unsigned int nfds, int timeout_ms)
ptimeout = (timeout_ms < 0) ? NULL : &pending_tv;
- do {
- int error;
- if(timeout_ms > 0) {
- pending_tv.tv_sec = pending_ms / 1000;
- pending_tv.tv_usec = (pending_ms % 1000) * 1000;
- }
- else if(!timeout_ms) {
- pending_tv.tv_sec = 0;
- pending_tv.tv_usec = 0;
- }
+ if(timeout_ms > 0) {
+ pending_tv.tv_sec = pending_ms / 1000;
+ pending_tv.tv_usec = (pending_ms % 1000) * 1000;
+ }
+ else if(!timeout_ms) {
+ pending_tv.tv_sec = 0;
+ pending_tv.tv_usec = 0;
+ }
#ifdef USE_WINSOCK
- r = select((int)maxfd + 1,
- /* WinSock select() can't handle fd_sets with zero bits set, so
- don't give it such arguments. See the comment about this in
- Curl_check_socket().
- */
- fds_read.fd_count ? &fds_read : NULL,
- fds_write.fd_count ? &fds_write : NULL,
- fds_err.fd_count ? &fds_err : NULL, ptimeout);
+ r = select((int)maxfd + 1,
+ /* WinSock select() can't handle fd_sets with zero bits set, so
+ don't give it such arguments. See the comment about this in
+ Curl_check_socket().
+ */
+ fds_read.fd_count ? &fds_read : NULL,
+ fds_write.fd_count ? &fds_write : NULL,
+ fds_err.fd_count ? &fds_err : NULL, ptimeout);
#else
- r = select((int)maxfd + 1, &fds_read, &fds_write, &fds_err, ptimeout);
+ r = select((int)maxfd + 1, &fds_read, &fds_write, &fds_err, ptimeout);
#endif
- if(r != -1)
- break;
- error = SOCKERRNO;
- if(error && ERROR_NOT_EINTR(error))
- break;
- if(timeout_ms > 0) {
- pending_ms = timeout_ms - ELAPSED_MS();
- if(pending_ms <= 0) {
- r = 0; /* Simulate a "call timed out" case */
- break;
- }
- }
- } while(r == -1);
if(r < 0)
return -1;
diff --git a/Utilities/cmcurl/lib/select.h b/Utilities/cmcurl/lib/select.h
index 9a1ba45..ec3021a 100644
--- a/Utilities/cmcurl/lib/select.h
+++ b/Utilities/cmcurl/lib/select.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -75,20 +75,12 @@ struct pollfd
int Curl_socket_check(curl_socket_t readfd, curl_socket_t readfd2,
curl_socket_t writefd,
time_t timeout_ms);
-
#define SOCKET_READABLE(x,z) \
- Curl_socket_check(x, CURL_SOCKET_BAD, CURL_SOCKET_BAD, z)
+ Curl_socket_check(x, CURL_SOCKET_BAD, CURL_SOCKET_BAD, (time_t)z)
#define SOCKET_WRITABLE(x,z) \
- Curl_socket_check(CURL_SOCKET_BAD, CURL_SOCKET_BAD, x, z)
+ Curl_socket_check(CURL_SOCKET_BAD, CURL_SOCKET_BAD, x, (time_t)z)
int Curl_poll(struct pollfd ufds[], unsigned int nfds, int timeout_ms);
-
-/* On non-DOS and non-Winsock platforms, when Curl_ack_eintr is set,
- * EINTR condition is honored and function might exit early without
- * awaiting full timeout. Otherwise EINTR will be ignored and full
- * timeout will elapse. */
-extern int Curl_ack_eintr;
-
int Curl_wait_ms(int timeout_ms);
#ifdef TPF
@@ -109,7 +101,7 @@ int tpf_select_libcurl(int maxfds, fd_set* reads, fd_set* writes,
SET_SOCKERRNO(EINVAL); \
return -1; \
} \
-} WHILE_FALSE
+} while(0)
#endif
#endif /* HEADER_CURL_SELECT_H */
diff --git a/Utilities/cmcurl/lib/sendf.c b/Utilities/cmcurl/lib/sendf.c
index 5913ea4..6ef47aa 100644
--- a/Utilities/cmcurl/lib/sendf.c
+++ b/Utilities/cmcurl/lib/sendf.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -36,13 +36,14 @@
#include "sendf.h"
#include "connect.h"
#include "vtls/vtls.h"
-#include "ssh.h"
+#include "vssh/ssh.h"
#include "easyif.h"
#include "multiif.h"
#include "non-ascii.h"
#include "strerror.h"
#include "select.h"
#include "strdup.h"
+#include "http2.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
@@ -224,7 +225,7 @@ bool Curl_recv_has_postponed_data(struct connectdata *conn, int sockindex)
(void)sockindex;
return false;
}
-#define pre_receive_plain(c,n) do {} WHILE_FALSE
+#define pre_receive_plain(c,n) do {} while(0)
#define get_pre_recved(c,n,b,l) 0
#endif /* ! USE_RECV_BEFORE_SEND_WORKAROUND */
@@ -501,6 +502,9 @@ static CURLcode pausewrite(struct Curl_easy *data,
unsigned int i;
bool newtype = TRUE;
+ /* If this transfers over HTTP/2, pause the stream! */
+ Curl_http2_stream_pause(data, TRUE);
+
if(s->tempcount) {
for(i = 0; i< s->tempcount; i++) {
if(s->tempwrite[i].type == type) {
@@ -529,6 +533,8 @@ static CURLcode pausewrite(struct Curl_easy *data,
/* update the pointer and the size */
s->tempwrite[i].buf = newptr;
s->tempwrite[i].len = newlen;
+
+ len = newlen; /* for the debug output below */
}
else {
dupl = Curl_memdup(ptr, len);
@@ -692,19 +698,20 @@ CURLcode Curl_read_plain(curl_socket_t sockfd,
ssize_t nread = sread(sockfd, buf, bytesfromsocket);
if(-1 == nread) {
- int err = SOCKERRNO;
- int return_error;
+ const int err = SOCKERRNO;
+ const bool return_error =
#ifdef USE_WINSOCK
- return_error = WSAEWOULDBLOCK == err;
+ WSAEWOULDBLOCK == err
#else
- return_error = EWOULDBLOCK == err || EAGAIN == err || EINTR == err;
+ EWOULDBLOCK == err || EAGAIN == err || EINTR == err
#endif
+ ;
+ *n = 0; /* no data returned */
if(return_error)
return CURLE_AGAIN;
return CURLE_RECV_ERROR;
}
- /* we only return number of bytes read when we return OK */
*n = nread;
return CURLE_OK;
}
diff --git a/Utilities/cmcurl/lib/setopt.c b/Utilities/cmcurl/lib/setopt.c
index 92cd5b2..2e494a6 100644
--- a/Utilities/cmcurl/lib/setopt.c
+++ b/Utilities/cmcurl/lib/setopt.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -119,8 +119,11 @@ static CURLcode setstropt_userpwd(char *option, char **userp, char **passwdp)
#define C_SSLVERSION_VALUE(x) (x & 0xffff)
#define C_SSLVERSION_MAX_VALUE(x) (x & 0xffff0000)
-static CURLcode vsetopt(struct Curl_easy *data, CURLoption option,
- va_list param)
+/*
+ * Do not make Curl_vsetopt() static: it is called from
+ * packages/OS400/ccsidcurl.c.
+ */
+CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
{
char *argptr;
CURLcode result = CURLE_OK;
@@ -312,7 +315,7 @@ static CURLcode vsetopt(struct Curl_easy *data, CURLoption option,
* Parse the $HOME/.netrc file
*/
arg = va_arg(param, long);
- if((arg < CURL_NETRC_IGNORED) || (arg > CURL_NETRC_REQUIRED))
+ if((arg < CURL_NETRC_IGNORED) || (arg >= CURL_NETRC_LAST))
return CURLE_BAD_FUNCTION_ARGUMENT;
data->set.use_netrc = (enum CURL_NETRC_OPTION)arg;
break;
@@ -339,7 +342,7 @@ static CURLcode vsetopt(struct Curl_easy *data, CURLoption option,
* curl/curl.h header file.
*/
arg = va_arg(param, long);
- if((arg < CURL_TIMECOND_NONE) || (arg > CURL_TIMECOND_LASTMOD))
+ if((arg < CURL_TIMECOND_NONE) || (arg >= CURL_TIMECOND_LAST))
return CURLE_BAD_FUNCTION_ARGUMENT;
data->set.timecondition = (curl_TimeCond)arg;
break;
@@ -749,7 +752,7 @@ static CURLcode vsetopt(struct Curl_easy *data, CURLoption option,
}
else if(strcasecompare(argptr, "FLUSH")) {
/* flush cookies to file, takes care of the locking */
- Curl_flush_cookies(data, 0);
+ Curl_flush_cookies(data, FALSE);
}
else if(strcasecompare(argptr, "RELOAD")) {
/* reload cookies from file */
@@ -806,11 +809,16 @@ static CURLcode vsetopt(struct Curl_easy *data, CURLoption option,
arg = va_arg(param, long);
if(arg < CURL_HTTP_VERSION_NONE)
return CURLE_BAD_FUNCTION_ARGUMENT;
+#ifdef ENABLE_QUIC
+ if(arg == CURL_HTTP_VERSION_3)
+ ;
+ else
+#endif
#ifndef USE_NGHTTP2
if(arg >= CURL_HTTP_VERSION_2)
return CURLE_UNSUPPORTED_PROTOCOL;
#else
- if(arg > CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE)
+ if(arg >= CURL_HTTP_VERSION_LAST)
return CURLE_UNSUPPORTED_PROTOCOL;
if(arg == CURL_HTTP_VERSION_NONE)
arg = CURL_HTTP_VERSION_2TLS;
@@ -1101,7 +1109,7 @@ static CURLcode vsetopt(struct Curl_easy *data, CURLoption option,
* How do access files over FTP.
*/
arg = va_arg(param, long);
- if((arg < CURLFTPMETHOD_DEFAULT) || (arg > CURLFTPMETHOD_SINGLECWD))
+ if((arg < CURLFTPMETHOD_DEFAULT) || (arg >= CURLFTPMETHOD_LAST))
return CURLE_BAD_FUNCTION_ARGUMENT;
data->set.ftp_filemethod = (curl_ftpfile)arg;
break;
@@ -1128,7 +1136,7 @@ static CURLcode vsetopt(struct Curl_easy *data, CURLoption option,
case CURLOPT_FTP_SSL_CCC:
arg = va_arg(param, long);
- if((arg < CURLFTPSSL_CCC_NONE) || (arg > CURLFTPSSL_CCC_ACTIVE))
+ if((arg < CURLFTPSSL_CCC_NONE) || (arg >= CURLFTPSSL_CCC_LAST))
return CURLE_BAD_FUNCTION_ARGUMENT;
data->set.ftp_ccc = (curl_ftpccc)arg;
break;
@@ -1156,7 +1164,7 @@ static CURLcode vsetopt(struct Curl_easy *data, CURLoption option,
* Set a specific auth for FTP-SSL transfers.
*/
arg = va_arg(param, long);
- if((arg < CURLFTPAUTH_DEFAULT) || (arg > CURLFTPAUTH_TLS))
+ if((arg < CURLFTPAUTH_DEFAULT) || (arg >= CURLFTPAUTH_LAST))
return CURLE_BAD_FUNCTION_ARGUMENT;
data->set.ftpsslauth = (curl_ftpauth)arg;
break;
@@ -1775,16 +1783,9 @@ static CURLcode vsetopt(struct Curl_easy *data, CURLoption option,
arg = va_arg(param, long);
/* Obviously people are not reading documentation and too many thought
- this argument took a boolean when it wasn't and misused it. We thus ban
- 1 as a sensible input and we warn about its use. Then we only have the
- 2 action internally stored as TRUE. */
-
- if(1 == arg) {
- failf(data, "CURLOPT_SSL_VERIFYHOST no longer supports 1 as value!");
- return CURLE_BAD_FUNCTION_ARGUMENT;
- }
-
- data->set.ssl.primary.verifyhost = (0 != arg) ? TRUE : FALSE;
+ this argument took a boolean when it wasn't and misused it.
+ Treat 1 and 2 the same */
+ data->set.ssl.primary.verifyhost = (bool)((arg & 3) ? TRUE : FALSE);
/* Update the current connection ssl_config. */
if(data->conn) {
@@ -1799,17 +1800,8 @@ static CURLcode vsetopt(struct Curl_easy *data, CURLoption option,
*/
arg = va_arg(param, long);
- /* Obviously people are not reading documentation and too many thought
- this argument took a boolean when it wasn't and misused it. We thus ban
- 1 as a sensible input and we warn about its use. Then we only have the
- 2 action internally stored as TRUE. */
-
- if(1 == arg) {
- failf(data, "CURLOPT_SSL_VERIFYHOST no longer supports 1 as value!");
- return CURLE_BAD_FUNCTION_ARGUMENT;
- }
-
- data->set.proxy_ssl.primary.verifyhost = (0 != arg)?TRUE:FALSE;
+ /* Treat both 1 and 2 as TRUE */
+ data->set.proxy_ssl.primary.verifyhost = (bool)((arg & 3)?TRUE:FALSE);
/* Update the current connection proxy_ssl_config. */
if(data->conn) {
@@ -2131,7 +2123,7 @@ static CURLcode vsetopt(struct Curl_easy *data, CURLoption option,
* Make transfers attempt to use SSL/TLS.
*/
arg = va_arg(param, long);
- if((arg < CURLUSESSL_NONE) || (arg > CURLUSESSL_ALL))
+ if((arg < CURLUSESSL_NONE) || (arg >= CURLUSESSL_LAST))
return CURLE_BAD_FUNCTION_ARGUMENT;
data->set.use_ssl = (curl_usessl)arg;
break;
@@ -2141,6 +2133,7 @@ static CURLcode vsetopt(struct Curl_easy *data, CURLoption option,
data->set.ssl.enable_beast =
(bool)((arg&CURLSSLOPT_ALLOW_BEAST) ? TRUE : FALSE);
data->set.ssl.no_revoke = !!(arg & CURLSSLOPT_NO_REVOKE);
+ data->set.ssl.no_partialchain = !!(arg & CURLSSLOPT_NO_PARTIALCHAIN);
break;
#ifndef CURL_DISABLE_PROXY
@@ -2149,6 +2142,7 @@ static CURLcode vsetopt(struct Curl_easy *data, CURLoption option,
data->set.proxy_ssl.enable_beast =
(bool)((arg&CURLSSLOPT_ALLOW_BEAST) ? TRUE : FALSE);
data->set.proxy_ssl.no_revoke = !!(arg & CURLSSLOPT_NO_REVOKE);
+ data->set.proxy_ssl.no_partialchain = !!(arg & CURLSSLOPT_NO_PARTIALCHAIN);
break;
#endif
@@ -2294,7 +2288,7 @@ static CURLcode vsetopt(struct Curl_easy *data, CURLoption option,
case CURLOPT_SSH_KEYFUNCTION:
/* setting to NULL is fine since the ssh.c functions themselves will
- then rever to use the internal default */
+ then revert to use the internal default */
data->set.ssh_keyfunc = va_arg(param, curl_sshkeycallback);
break;
@@ -2371,8 +2365,7 @@ static CURLcode vsetopt(struct Curl_easy *data, CURLoption option,
case CURLOPT_REDIR_PROTOCOLS:
/* set the bitmask for the protocols that libcurl is allowed to follow to,
as a subset of the CURLOPT_PROTOCOLS ones. That means the protocol needs
- to be set in both bitmasks to be allowed to get redirected to. Defaults
- to all protocols except FILE and SCP. */
+ to be set in both bitmasks to be allowed to get redirected to. */
data->set.redir_protocols = va_arg(param, long);
break;
@@ -2398,8 +2391,18 @@ static CURLcode vsetopt(struct Curl_easy *data, CURLoption option,
/* Set the list of mail recipients */
data->set.mail_rcpt = va_arg(param, struct curl_slist *);
break;
+ case CURLOPT_MAIL_RCPT_ALLLOWFAILS:
+ /* allow RCPT TO command to fail for some recipients */
+ data->set.mail_rcpt_allowfails = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
#endif
+ case CURLOPT_SASL_AUTHZID:
+ /* Authorisation identity (identity to act as) */
+ result = Curl_setstropt(&data->set.str[STRING_SASL_AUTHZID],
+ va_arg(param, char *));
+ break;
+
case CURLOPT_SASL_IR:
/* Enable/disable SASL initial response */
data->set.sasl_ir = (0 != va_arg(param, long)) ? TRUE : FALSE;
@@ -2503,7 +2506,7 @@ static CURLcode vsetopt(struct Curl_easy *data, CURLoption option,
case CURLOPT_RTSP_SERVER_CSEQ:
/* Same as the above, but for server-initiated requests */
- data->state.rtsp_next_client_CSeq = va_arg(param, long);
+ data->state.rtsp_next_server_CSeq = va_arg(param, long);
break;
case CURLOPT_INTERLEAVEDATA:
@@ -2615,14 +2618,12 @@ static CURLcode vsetopt(struct Curl_easy *data, CURLoption option,
result = CURLE_NOT_BUILT_IN;
#endif
break;
-#ifdef USE_NGHTTP2
case CURLOPT_SSL_ENABLE_NPN:
data->set.ssl_enable_npn = (0 != va_arg(param, long)) ? TRUE : FALSE;
break;
case CURLOPT_SSL_ENABLE_ALPN:
data->set.ssl_enable_alpn = (0 != va_arg(param, long)) ? TRUE : FALSE;
break;
-#endif
#ifdef USE_UNIX_SOCKETS
case CURLOPT_UNIX_SOCKET_PATH:
data->set.abstract_unix_socket = FALSE;
@@ -2728,7 +2729,8 @@ static CURLcode vsetopt(struct Curl_easy *data, CURLoption option,
result = Curl_setstropt(&data->set.str[STRING_ALTSVC], argptr);
if(result)
return result;
- (void)Curl_altsvc_load(data->asi, argptr);
+ if(argptr)
+ (void)Curl_altsvc_load(data->asi, argptr);
break;
case CURLOPT_ALTSVC_CTRL:
if(!data->asi) {
@@ -2770,7 +2772,7 @@ CURLcode curl_easy_setopt(struct Curl_easy *data, CURLoption tag, ...)
va_start(arg, tag);
- result = vsetopt(data, tag, arg);
+ result = Curl_vsetopt(data, tag, arg);
va_end(arg);
return result;
diff --git a/Utilities/cmcurl/lib/setopt.h b/Utilities/cmcurl/lib/setopt.h
index c658e04..5e347dd 100644
--- a/Utilities/cmcurl/lib/setopt.h
+++ b/Utilities/cmcurl/lib/setopt.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -23,7 +23,6 @@
***************************************************************************/
CURLcode Curl_setstropt(char **charp, const char *s);
-CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
- va_list arg);
+CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list arg);
#endif /* HEADER_CURL_SETOPT_H */
diff --git a/Utilities/cmcurl/lib/setup-os400.h b/Utilities/cmcurl/lib/setup-os400.h
index a3c2a7b..629fd94 100644
--- a/Utilities/cmcurl/lib/setup-os400.h
+++ b/Utilities/cmcurl/lib/setup-os400.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -206,11 +206,15 @@ extern int Curl_os400_sendto(int sd, char *buffer, int buflen, int flags,
struct sockaddr * dstaddr, int addrlen);
extern int Curl_os400_recvfrom(int sd, char *buffer, int buflen, int flags,
struct sockaddr *fromaddr, int *addrlen);
+extern int Curl_os400_getpeername(int sd, struct sockaddr *addr, int *addrlen);
+extern int Curl_os400_getsockname(int sd, struct sockaddr *addr, int *addrlen);
#define connect Curl_os400_connect
#define bind Curl_os400_bind
#define sendto Curl_os400_sendto
#define recvfrom Curl_os400_recvfrom
+#define getpeername Curl_os400_getpeername
+#define getsockname Curl_os400_getsockname
#ifdef HAVE_LIBZ
#define zlibVersion Curl_os400_zlibVersion
diff --git a/Utilities/cmcurl/lib/sha256.c b/Utilities/cmcurl/lib/sha256.c
index f9287af..9721418 100644
--- a/Utilities/cmcurl/lib/sha256.c
+++ b/Utilities/cmcurl/lib/sha256.c
@@ -5,7 +5,8 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Florin Petriuc, <petriuc.florin@gmail.com>
+ * Copyright (C) 2017, Florin Petriuc, <petriuc.florin@gmail.com>
+ * Copyright (C) 2018 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -35,16 +36,135 @@
#define USE_OPENSSL_SHA256
#endif
+#endif /* USE_OPENSSL */
+
+#ifdef USE_MBEDTLS
+#include <mbedtls/version.h>
+
+#if(MBEDTLS_VERSION_NUMBER >= 0x02070000)
+ #define HAS_RESULT_CODE_BASED_FUNCTIONS
#endif
+#endif /* USE_MBEDTLS */
+
+/* Please keep the SSL backend-specific #if branches in this order:
+ *
+ * 1. USE_OPENSSL
+ * 2. USE_GNUTLS_NETTLE
+ * 3. USE_GNUTLS
+ * 4. USE_MBEDTLS
+ * 5. USE_COMMON_CRYPTO
+ * 6. USE_WIN32_CRYPTO
+ *
+ * This ensures that the same SSL branch gets activated throughout this source
+ * file even if multiple backends are enabled at the same time.
+ */
+
+#if defined(USE_OPENSSL_SHA256)
-#ifdef USE_OPENSSL_SHA256
/* When OpenSSL is available we use the SHA256-function from OpenSSL */
#include <openssl/sha.h>
+
+#elif defined(USE_GNUTLS_NETTLE)
+
+#include <nettle/sha.h>
+
+#include "curl_memory.h"
+
+/* The last #include file should be: */
+#include "memdebug.h"
+
+typedef struct sha256_ctx SHA256_CTX;
+
+static void SHA256_Init(SHA256_CTX *ctx)
+{
+ sha256_init(ctx);
+}
+
+static void SHA256_Update(SHA256_CTX *ctx,
+ const unsigned char *data,
+ unsigned int length)
+{
+ sha256_update(ctx, length, data);
+}
+
+static void SHA256_Final(unsigned char *digest, SHA256_CTX *ctx)
+{
+ sha256_digest(ctx, SHA256_DIGEST_SIZE, digest);
+}
+
+#elif defined(USE_GNUTLS)
+
+#include <gcrypt.h>
+
+#include "curl_memory.h"
+
+/* The last #include file should be: */
+#include "memdebug.h"
+
+typedef gcry_md_hd_t SHA256_CTX;
+
+static void SHA256_Init(SHA256_CTX *ctx)
+{
+ gcry_md_open(ctx, GCRY_MD_SHA256, 0);
+}
+
+static void SHA256_Update(SHA256_CTX *ctx,
+ const unsigned char *data,
+ unsigned int length)
+{
+ gcry_md_write(*ctx, data, length);
+}
+
+static void SHA256_Final(unsigned char *digest, SHA256_CTX *ctx)
+{
+ memcpy(digest, gcry_md_read(*ctx, 0), SHA256_DIGEST_LENGTH);
+ gcry_md_close(*ctx);
+}
+
+#elif defined(USE_MBEDTLS)
+
+#include <mbedtls/sha256.h>
+
+#include "curl_memory.h"
+
+/* The last #include file should be: */
+#include "memdebug.h"
+
+typedef mbedtls_sha256_context SHA256_CTX;
+
+static void SHA256_Init(SHA256_CTX *ctx)
+{
+#if !defined(HAS_RESULT_CODE_BASED_FUNCTIONS)
+ mbedtls_sha256_starts(ctx, 0);
+#else
+ (void) mbedtls_sha256_starts_ret(ctx, 0);
+#endif
+}
+
+static void SHA256_Update(SHA256_CTX *ctx,
+ const unsigned char *data,
+ unsigned int length)
+{
+#if !defined(HAS_RESULT_CODE_BASED_FUNCTIONS)
+ mbedtls_sha256_update(ctx, data, length);
+#else
+ (void) mbedtls_sha256_update_ret(ctx, data, length);
+#endif
+}
+
+static void SHA256_Final(unsigned char *digest, SHA256_CTX *ctx)
+{
+#if !defined(HAS_RESULT_CODE_BASED_FUNCTIONS)
+ mbedtls_sha256_finish(ctx, digest);
+#else
+ (void) mbedtls_sha256_finish_ret(ctx, digest);
+#endif
+}
+
#else
/* When no other crypto library is available we use this code segment */
-/* ===== start - public domain SHA256 implementation ===== */
/* This is based on SHA256 implementation in LibTomCrypt that was released into
* public domain by Tom St Denis. */
@@ -95,7 +215,8 @@ typedef struct sha256_state {
unsigned long state[8], curlen;
unsigned char buf[64];
} SHA256_CTX;
-/* the K array */
+
+/* The K array */
static const unsigned long K[64] = {
0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, 0x3956c25bUL,
0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL, 0xd807aa98UL, 0x12835b01UL,
@@ -111,6 +232,7 @@ static const unsigned long K[64] = {
0x682e6ff3UL, 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL
};
+
/* Various logical functions */
#define RORc(x, y) \
(((((unsigned long)(x) & 0xFFFFFFFFUL) >> (unsigned long)((y) & 31)) | \
@@ -123,13 +245,15 @@ static const unsigned long K[64] = {
#define Sigma1(x) (S(x, 6) ^ S(x, 11) ^ S(x, 25))
#define Gamma0(x) (S(x, 7) ^ S(x, 18) ^ R(x, 3))
#define Gamma1(x) (S(x, 17) ^ S(x, 19) ^ R(x, 10))
-/* compress 512-bits */
+
+/* Compress 512-bits */
static int sha256_compress(struct sha256_state *md,
unsigned char *buf)
{
unsigned long S[8], W[64];
int i;
- /* copy state into S */
+
+ /* Copy state into S */
for(i = 0; i < 8; i++) {
S[i] = md->state[i];
}
@@ -141,6 +265,7 @@ static int sha256_compress(struct sha256_state *md,
W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) +
W[i - 16];
}
+
/* Compress */
#define RND(a,b,c,d,e,f,g,h,i) \
unsigned long t0 = h + Sigma1(e) + Ch(e, f, g) + K[i] + W[i]; \
@@ -153,12 +278,15 @@ static int sha256_compress(struct sha256_state *md,
t = S[7]; S[7] = S[6]; S[6] = S[5]; S[5] = S[4];
S[4] = S[3]; S[3] = S[2]; S[2] = S[1]; S[1] = S[0]; S[0] = t;
}
- /* feedback */
+
+ /* Feedback */
for(i = 0; i < 8; i++) {
md->state[i] = md->state[i] + S[i];
}
+
return 0;
}
+
/* Initialize the hash state */
static void SHA256_Init(struct sha256_state *md)
{
@@ -173,7 +301,8 @@ static void SHA256_Init(struct sha256_state *md)
md->state[6] = 0x1F83D9ABUL;
md->state[7] = 0x5BE0CD19UL;
}
-/**
+
+/*
Process a block of memory though the hash
@param md The hash state
@param in The data to hash
@@ -185,6 +314,7 @@ static int SHA256_Update(struct sha256_state *md,
unsigned long inlen)
{
unsigned long n;
+
#define block_size 64
if(md->curlen > sizeof(md->buf))
return -1;
@@ -210,9 +340,11 @@ static int SHA256_Update(struct sha256_state *md,
}
}
}
+
return 0;
}
-/**
+
+/*
Terminate the hash to get the digest
@param md The hash state
@param out [out] The destination of the hash (32 bytes)
@@ -222,13 +354,17 @@ static int SHA256_Final(unsigned char *out,
struct sha256_state *md)
{
int i;
+
if(md->curlen >= sizeof(md->buf))
return -1;
- /* increase the length of the message */
+
+ /* Increase the length of the message */
md->length += md->curlen * 8;
- /* append the '1' bit */
+
+ /* Append the '1' bit */
md->buf[md->curlen++] = (unsigned char)0x80;
- /* if the length is currently above 56 bytes we append zeros
+
+ /* If the length is currently above 56 bytes we append zeros
* then compress. Then we can fall back to padding zeros and length
* encoding like normal.
*/
@@ -239,29 +375,44 @@ static int SHA256_Final(unsigned char *out,
sha256_compress(md, md->buf);
md->curlen = 0;
}
- /* pad up to 56 bytes of zeroes */
+
+ /* Pad up to 56 bytes of zeroes */
while(md->curlen < 56) {
md->buf[md->curlen++] = (unsigned char)0;
}
- /* store length */
+
+ /* Store length */
WPA_PUT_BE64(md->buf + 56, md->length);
sha256_compress(md, md->buf);
- /* copy output */
+
+ /* Copy output */
for(i = 0; i < 8; i++)
WPA_PUT_BE32(out + (4 * i), md->state[i]);
+
return 0;
}
-/* ===== end - public domain SHA256 implementation ===== */
-#endif
+#endif /* CRYPTO LIBS */
-void Curl_sha256it(unsigned char *outbuffer, /* 32 unsigned chars */
- const unsigned char *input)
+/*
+ * Curl_sha256it()
+ *
+ * Generates a SHA256 hash for the given input data.
+ *
+ * Parameters:
+ *
+ * output [in/out] - The output buffer.
+ * input [in] - The input data.
+ * length [in] - The input length.
+ */
+void Curl_sha256it(unsigned char *output, const unsigned char *input,
+ const size_t length)
{
SHA256_CTX ctx;
+
SHA256_Init(&ctx);
- SHA256_Update(&ctx, input, curlx_uztoui(strlen((char *)input)));
- SHA256_Final(outbuffer, &ctx);
+ SHA256_Update(&ctx, input, curlx_uztoui(length));
+ SHA256_Final(output, &ctx);
}
#endif /* CURL_DISABLE_CRYPTO_AUTH */
diff --git a/Utilities/cmcurl/lib/slist.c b/Utilities/cmcurl/lib/slist.c
index 392b84d..d27fbe1 100644
--- a/Utilities/cmcurl/lib/slist.c
+++ b/Utilities/cmcurl/lib/slist.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/slist.h b/Utilities/cmcurl/lib/slist.h
index d73dbf6..799b3c0 100644
--- a/Utilities/cmcurl/lib/slist.h
+++ b/Utilities/cmcurl/lib/slist.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/smb.c b/Utilities/cmcurl/lib/smb.c
index 76c99a2..12f9925 100644
--- a/Utilities/cmcurl/lib/smb.c
+++ b/Utilities/cmcurl/lib/smb.c
@@ -6,7 +6,7 @@
* \___|\___/|_| \_\_____|
*
* Copyright (C) 2014, Bill Nagel <wnagel@tycoint.com>, Exacq Technologies
- * Copyright (C) 2016-2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2016-2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -64,8 +64,7 @@ static CURLcode smb_request_state(struct connectdata *conn, bool *done);
static CURLcode smb_done(struct connectdata *conn, CURLcode status,
bool premature);
static CURLcode smb_disconnect(struct connectdata *conn, bool dead);
-static int smb_getsock(struct connectdata *conn, curl_socket_t *socks,
- int numsocks);
+static int smb_getsock(struct connectdata *conn, curl_socket_t *socks);
static CURLcode smb_parse_url_path(struct connectdata *conn);
/*
@@ -607,6 +606,7 @@ static CURLcode smb_send_and_recv(struct connectdata *conn, void **msg)
{
struct smb_conn *smbc = &conn->proto.smbc;
CURLcode result;
+ *msg = NULL; /* if it returns early */
/* Check if there is data in the transfer buffer */
if(!smbc->send_size && smbc->upload_size) {
@@ -682,7 +682,8 @@ static CURLcode smb_connection_state(struct connectdata *conn, bool *done)
switch(smbc->state) {
case SMB_NEGOTIATE:
- if(h->status || smbc->got < sizeof(*nrsp) + sizeof(smbc->challenge) - 1) {
+ if((smbc->got < sizeof(*nrsp) + sizeof(smbc->challenge) - 1) ||
+ h->status) {
connclose(conn, "SMB: negotiation failed");
return CURLE_COULDNT_CONNECT;
}
@@ -785,6 +786,8 @@ static CURLcode smb_request_state(struct connectdata *conn, bool *done)
case SMB_OPEN:
if(h->status || smbc->got < sizeof(struct smb_nt_create_response)) {
req->result = CURLE_REMOTE_FILE_NOT_FOUND;
+ if(h->status == smb_swap32(SMB_ERR_NOACCESS))
+ req->result = CURLE_REMOTE_ACCESS_DENIED;
next_state = SMB_TREE_DISCONNECT;
break;
}
@@ -934,12 +937,8 @@ static CURLcode smb_disconnect(struct connectdata *conn, bool dead)
return CURLE_OK;
}
-static int smb_getsock(struct connectdata *conn, curl_socket_t *socks,
- int numsocks)
+static int smb_getsock(struct connectdata *conn, curl_socket_t *socks)
{
- if(!numsocks)
- return GETSOCK_BLANK;
-
socks[0] = conn->sock[FIRSTSOCKET];
return GETSOCK_READSOCK(0) | GETSOCK_WRITESOCK(0);
}
@@ -957,7 +956,6 @@ static CURLcode smb_do(struct connectdata *conn, bool *done)
static CURLcode smb_parse_url_path(struct connectdata *conn)
{
- CURLcode result = CURLE_OK;
struct Curl_easy *data = conn->data;
struct smb_request *req = data->req.protop;
struct smb_conn *smbc = &conn->proto.smbc;
@@ -965,7 +963,8 @@ static CURLcode smb_parse_url_path(struct connectdata *conn)
char *slash;
/* URL decode the path */
- result = Curl_urldecode(data, data->state.up.path, 0, &path, NULL, TRUE);
+ CURLcode result = Curl_urldecode(data, data->state.up.path, 0, &path, NULL,
+ TRUE);
if(result)
return result;
diff --git a/Utilities/cmcurl/lib/smtp.c b/Utilities/cmcurl/lib/smtp.c
index 4a3462b..e187287 100644
--- a/Utilities/cmcurl/lib/smtp.c
+++ b/Utilities/cmcurl/lib/smtp.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -27,6 +27,9 @@
* RFC4752 The Kerberos V5 ("GSSAPI") SASL Mechanism
* RFC4954 SMTP Authentication
* RFC5321 SMTP protocol
+ * RFC5890 Internationalized Domain Names for Applications (IDNA)
+ * RFC6531 SMTP Extension for Internationalized Email
+ * RFC6532 Internationalized Email Headers
* RFC6749 OAuth 2.0 Authorization Framework
* RFC8314 Use of TLS for Email Submission and Access
* Draft SMTP URL Interface <draft-earhart-url-smtp-00.txt>
@@ -95,13 +98,14 @@ static CURLcode smtp_done(struct connectdata *conn, CURLcode status,
static CURLcode smtp_connect(struct connectdata *conn, bool *done);
static CURLcode smtp_disconnect(struct connectdata *conn, bool dead);
static CURLcode smtp_multi_statemach(struct connectdata *conn, bool *done);
-static int smtp_getsock(struct connectdata *conn, curl_socket_t *socks,
- int numsocks);
+static int smtp_getsock(struct connectdata *conn, curl_socket_t *socks);
static CURLcode smtp_doing(struct connectdata *conn, bool *dophase_done);
static CURLcode smtp_setup_connection(struct connectdata *conn);
static CURLcode smtp_parse_url_options(struct connectdata *conn);
static CURLcode smtp_parse_url_path(struct connectdata *conn);
static CURLcode smtp_parse_custom_request(struct connectdata *conn);
+static CURLcode smtp_parse_address(struct connectdata *conn, const char *fqma,
+ char **address, struct hostname *host);
static CURLcode smtp_perform_auth(struct connectdata *conn, const char *mech,
const char *initresp);
static CURLcode smtp_continue_auth(struct connectdata *conn, const char *resp);
@@ -359,10 +363,8 @@ static CURLcode smtp_perform_helo(struct connectdata *conn)
*/
static CURLcode smtp_perform_starttls(struct connectdata *conn)
{
- CURLcode result = CURLE_OK;
-
/* Send the STARTTLS command */
- result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", "STARTTLS");
+ CURLcode result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", "STARTTLS");
if(!result)
state(conn, SMTP_STARTTLS);
@@ -378,11 +380,10 @@ static CURLcode smtp_perform_starttls(struct connectdata *conn)
*/
static CURLcode smtp_perform_upgrade_tls(struct connectdata *conn)
{
- CURLcode result = CURLE_OK;
- struct smtp_conn *smtpc = &conn->proto.smtpc;
-
/* Start the SSL connection */
- result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET, &smtpc->ssldone);
+ struct smtp_conn *smtpc = &conn->proto.smtpc;
+ CURLcode result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET,
+ &smtpc->ssldone);
if(!result) {
if(smtpc->state != SMTP_UPGRADETLS)
@@ -485,13 +486,55 @@ static CURLcode smtp_perform_command(struct connectdata *conn)
struct Curl_easy *data = conn->data;
struct SMTP *smtp = data->req.protop;
- /* Send the command */
- if(smtp->rcpt)
- result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s %s",
- smtp->custom && smtp->custom[0] != '\0' ?
- smtp->custom : "VRFY",
- smtp->rcpt->data);
+ if(smtp->rcpt) {
+ /* We notify the server we are sending UTF-8 data if a) it supports the
+ SMTPUTF8 extension and b) The mailbox contains UTF-8 charaacters, in
+ either the local address or host name parts. This is regardless of
+ whether the host name is encoded using IDN ACE */
+ bool utf8 = FALSE;
+
+ if((!smtp->custom) || (!smtp->custom[0])) {
+ char *address = NULL;
+ struct hostname host = { NULL, NULL, NULL, NULL };
+
+ /* Parse the mailbox to verify into the local address and host name
+ parts, converting the host name to an IDN A-label if necessary */
+ result = smtp_parse_address(conn, smtp->rcpt->data,
+ &address, &host);
+ if(result)
+ return result;
+
+ /* Establish whether we should report SMTPUTF8 to the server for this
+ mailbox as per RFC-6531 sect. 3.1 point 6 */
+ utf8 = (conn->proto.smtpc.utf8_supported) &&
+ ((host.encalloc) || (!Curl_is_ASCII_name(address)) ||
+ (!Curl_is_ASCII_name(host.name)));
+
+ /* Send the VRFY command (Note: The host name part may be absent when the
+ host is a local system) */
+ result = Curl_pp_sendf(&conn->proto.smtpc.pp, "VRFY %s%s%s%s",
+ address,
+ host.name ? "@" : "",
+ host.name ? host.name : "",
+ utf8 ? " SMTPUTF8" : "");
+
+ Curl_free_idnconverted_hostname(&host);
+ free(address);
+ }
+ else {
+ /* Establish whether we should report that we support SMTPUTF8 for EXPN
+ commands to the server as per RFC-6531 sect. 3.1 point 6 */
+ utf8 = (conn->proto.smtpc.utf8_supported) &&
+ (!strcmp(smtp->custom, "EXPN"));
+
+ /* Send the custom recipient based command such as the EXPN command */
+ result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s %s%s", smtp->custom,
+ smtp->rcpt->data,
+ utf8 ? " SMTPUTF8" : "");
+ }
+ }
else
+ /* Send the non-recipient based command such as HELP */
result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s",
smtp->custom && smtp->custom[0] != '\0' ?
smtp->custom : "HELP");
@@ -516,22 +559,86 @@ static CURLcode smtp_perform_mail(struct connectdata *conn)
CURLcode result = CURLE_OK;
struct Curl_easy *data = conn->data;
+ /* We notify the server we are sending UTF-8 data if a) it supports the
+ SMTPUTF8 extension and b) The mailbox contains UTF-8 charaacters, in
+ either the local address or host name parts. This is regardless of
+ whether the host name is encoded using IDN ACE */
+ bool utf8 = FALSE;
+
/* Calculate the FROM parameter */
- if(!data->set.str[STRING_MAIL_FROM])
+ if(data->set.str[STRING_MAIL_FROM]) {
+ char *address = NULL;
+ struct hostname host = { NULL, NULL, NULL, NULL };
+
+ /* Parse the FROM mailbox into the local address and host name parts,
+ converting the host name to an IDN A-label if necessary */
+ result = smtp_parse_address(conn, data->set.str[STRING_MAIL_FROM],
+ &address, &host);
+ if(result)
+ return result;
+
+ /* Establish whether we should report SMTPUTF8 to the server for this
+ mailbox as per RFC-6531 sect. 3.1 point 4 and sect. 3.4 */
+ utf8 = (conn->proto.smtpc.utf8_supported) &&
+ ((host.encalloc) || (!Curl_is_ASCII_name(address)) ||
+ (!Curl_is_ASCII_name(host.name)));
+
+ if(host.name) {
+ from = aprintf("<%s@%s>", address, host.name);
+
+ Curl_free_idnconverted_hostname(&host);
+ }
+ else
+ /* An invalid mailbox was provided but we'll simply let the server worry
+ about that and reply with a 501 error */
+ from = aprintf("<%s>", address);
+
+ free(address);
+ }
+ else
/* Null reverse-path, RFC-5321, sect. 3.6.3 */
from = strdup("<>");
- else if(data->set.str[STRING_MAIL_FROM][0] == '<')
- from = aprintf("%s", data->set.str[STRING_MAIL_FROM]);
- else
- from = aprintf("<%s>", data->set.str[STRING_MAIL_FROM]);
if(!from)
return CURLE_OUT_OF_MEMORY;
/* Calculate the optional AUTH parameter */
if(data->set.str[STRING_MAIL_AUTH] && conn->proto.smtpc.sasl.authused) {
- if(data->set.str[STRING_MAIL_AUTH][0] != '\0')
- auth = aprintf("%s", data->set.str[STRING_MAIL_AUTH]);
+ if(data->set.str[STRING_MAIL_AUTH][0] != '\0') {
+ char *address = NULL;
+ struct hostname host = { NULL, NULL, NULL, NULL };
+
+ /* Parse the AUTH mailbox into the local address and host name parts,
+ converting the host name to an IDN A-label if necessary */
+ result = smtp_parse_address(conn, data->set.str[STRING_MAIL_AUTH],
+ &address, &host);
+ if(result) {
+ free(from);
+ return result;
+ }
+
+ /* Establish whether we should report SMTPUTF8 to the server for this
+ mailbox as per RFC-6531 sect. 3.1 point 4 and sect. 3.4 */
+ if((!utf8) && (conn->proto.smtpc.utf8_supported) &&
+ ((host.encalloc) || (!Curl_is_ASCII_name(address)) ||
+ (!Curl_is_ASCII_name(host.name))))
+ utf8 = TRUE;
+
+ if(host.name) {
+ free(from);
+ from = aprintf("<%s@%s>", address, host.name);
+
+ Curl_free_idnconverted_hostname(&host);
+ }
+ else
+ /* An invalid mailbox was provided but we'll simply let the server
+ worry about it */
+ auth = aprintf("<%s>", address);
+
+ free(address);
+ if(!from)
+ return CURLE_OUT_OF_MEMORY;
+ }
else
/* Empty AUTH, RFC-2554, sect. 5 */
auth = strdup("<>");
@@ -565,6 +672,7 @@ static CURLcode smtp_perform_mail(struct connectdata *conn)
if(result) {
free(from);
free(auth);
+
return result;
}
@@ -587,19 +695,33 @@ static CURLcode smtp_perform_mail(struct connectdata *conn)
}
}
+ /* If the mailboxes in the FROM and AUTH parameters don't include a UTF-8
+ based address then quickly scan through the recipient list and check if
+ any there do, as we need to correctly identify our support for SMTPUTF8
+ in the envelope, as per RFC-6531 sect. 3.4 */
+ if(conn->proto.smtpc.utf8_supported && !utf8) {
+ struct SMTP *smtp = data->req.protop;
+ struct curl_slist *rcpt = smtp->rcpt;
+
+ while(rcpt && !utf8) {
+ /* Does the host name contain non-ASCII characters? */
+ if(!Curl_is_ASCII_name(rcpt->data))
+ utf8 = TRUE;
+
+ rcpt = rcpt->next;
+ }
+ }
+
/* Send the MAIL command */
- if(!auth && !size)
- result = Curl_pp_sendf(&conn->proto.smtpc.pp,
- "MAIL FROM:%s", from);
- else if(auth && !size)
- result = Curl_pp_sendf(&conn->proto.smtpc.pp,
- "MAIL FROM:%s AUTH=%s", from, auth);
- else if(auth && size)
- result = Curl_pp_sendf(&conn->proto.smtpc.pp,
- "MAIL FROM:%s AUTH=%s SIZE=%s", from, auth, size);
- else
- result = Curl_pp_sendf(&conn->proto.smtpc.pp,
- "MAIL FROM:%s SIZE=%s", from, size);
+ result = Curl_pp_sendf(&conn->proto.smtpc.pp,
+ "MAIL FROM:%s%s%s%s%s%s",
+ from, /* Mandatory */
+ auth ? " AUTH=" : "", /* Optional on AUTH support */
+ auth ? auth : "", /* */
+ size ? " SIZE=" : "", /* Optional on SIZE support */
+ size ? size : "", /* */
+ utf8 ? " SMTPUTF8" /* Internationalised mailbox */
+ : ""); /* included in our envelope */
free(from);
free(auth);
@@ -623,14 +745,28 @@ static CURLcode smtp_perform_rcpt_to(struct connectdata *conn)
CURLcode result = CURLE_OK;
struct Curl_easy *data = conn->data;
struct SMTP *smtp = data->req.protop;
+ char *address = NULL;
+ struct hostname host = { NULL, NULL, NULL, NULL };
+
+ /* Parse the recipient mailbox into the local address and host name parts,
+ converting the host name to an IDN A-label if necessary */
+ result = smtp_parse_address(conn, smtp->rcpt->data,
+ &address, &host);
+ if(result)
+ return result;
/* Send the RCPT TO command */
- if(smtp->rcpt->data[0] == '<')
- result = Curl_pp_sendf(&conn->proto.smtpc.pp, "RCPT TO:%s",
- smtp->rcpt->data);
+ if(host.name)
+ result = Curl_pp_sendf(&conn->proto.smtpc.pp, "RCPT TO:<%s@%s>", address,
+ host.name);
else
- result = Curl_pp_sendf(&conn->proto.smtpc.pp, "RCPT TO:<%s>",
- smtp->rcpt->data);
+ /* An invalid mailbox was provided but we'll simply let the server worry
+ about that and reply with a 501 error */
+ result = Curl_pp_sendf(&conn->proto.smtpc.pp, "RCPT TO:<%s>", address);
+
+ Curl_free_idnconverted_hostname(&host);
+ free(address);
+
if(!result)
state(conn, SMTP_RCPT);
@@ -645,10 +781,8 @@ static CURLcode smtp_perform_rcpt_to(struct connectdata *conn)
*/
static CURLcode smtp_perform_quit(struct connectdata *conn)
{
- CURLcode result = CURLE_OK;
-
/* Send the QUIT command */
- result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", "QUIT");
+ CURLcode result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", "QUIT");
if(!result)
state(conn, SMTP_QUIT);
@@ -720,7 +854,7 @@ static CURLcode smtp_state_ehlo_resp(struct connectdata *conn, int smtpcode,
result = CURLE_REMOTE_ACCESS_DENIED;
}
}
- else {
+ else if(len >= 4) {
line += 4;
len -= 4;
@@ -732,6 +866,10 @@ static CURLcode smtp_state_ehlo_resp(struct connectdata *conn, int smtpcode,
else if(len >= 4 && !memcmp(line, "SIZE", 4))
smtpc->size_supported = TRUE;
+ /* Does the server support the UTF-8 capability? */
+ else if(len >= 8 && !memcmp(line, "SMTPUTF8", 8))
+ smtpc->utf8_supported = TRUE;
+
/* Does the server support authentication? */
else if(len >= 5 && !memcmp(line, "AUTH ", 5)) {
smtpc->auth_supported = TRUE;
@@ -791,6 +929,10 @@ static CURLcode smtp_state_ehlo_resp(struct connectdata *conn, int smtpcode,
result = smtp_perform_authentication(conn);
}
}
+ else {
+ failf(data, "Unexpectedly short EHLO response");
+ result = CURLE_WEIRD_SERVER_REPLY;
+ }
return result;
}
@@ -917,25 +1059,53 @@ static CURLcode smtp_state_rcpt_resp(struct connectdata *conn, int smtpcode,
CURLcode result = CURLE_OK;
struct Curl_easy *data = conn->data;
struct SMTP *smtp = data->req.protop;
+ bool is_smtp_err = FALSE;
+ bool is_smtp_blocking_err = FALSE;
(void)instate; /* no use for this yet */
- if(smtpcode/100 != 2) {
- failf(data, "RCPT failed: %d", smtpcode);
- result = CURLE_SEND_ERROR;
+ is_smtp_err = (smtpcode/100 != 2) ? TRUE : FALSE;
+
+ /* If there's multiple RCPT TO to be issued, it's possible to ignore errors
+ and proceed with only the valid addresses. */
+ is_smtp_blocking_err =
+ (is_smtp_err && !data->set.mail_rcpt_allowfails) ? TRUE : FALSE;
+
+ if(is_smtp_err) {
+ /* Remembering the last failure which we can report if all "RCPT TO" have
+ failed and we cannot proceed. */
+ smtp->rcpt_last_error = smtpcode;
+
+ if(is_smtp_blocking_err) {
+ failf(data, "RCPT failed: %d", smtpcode);
+ result = CURLE_SEND_ERROR;
+ }
}
else {
+ /* Some RCPT TO commands have succeeded. */
+ smtp->rcpt_had_ok = TRUE;
+ }
+
+ if(!is_smtp_blocking_err) {
smtp->rcpt = smtp->rcpt->next;
if(smtp->rcpt)
/* Send the next RCPT TO command */
result = smtp_perform_rcpt_to(conn);
else {
- /* Send the DATA command */
- result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", "DATA");
+ /* We weren't able to issue a successful RCPT TO command while going
+ over recipients (potentially multiple). Sending back last error. */
+ if(!smtp->rcpt_had_ok) {
+ failf(data, "RCPT failed: %d (last error)", smtp->rcpt_last_error);
+ result = CURLE_SEND_ERROR;
+ }
+ else {
+ /* Send the DATA command */
+ result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", "DATA");
- if(!result)
- state(conn, SMTP_DATA);
+ if(!result)
+ state(conn, SMTP_DATA);
+ }
}
}
@@ -1119,10 +1289,9 @@ static CURLcode smtp_init(struct connectdata *conn)
}
/* For the SMTP "protocol connect" and "doing" phases only */
-static int smtp_getsock(struct connectdata *conn, curl_socket_t *socks,
- int numsocks)
+static int smtp_getsock(struct connectdata *conn, curl_socket_t *socks)
{
- return Curl_pp_getsock(&conn->proto.smtpc.pp, socks, numsocks);
+ return Curl_pp_getsock(&conn->proto.smtpc.pp, socks);
}
/***********************************************************************
@@ -1290,6 +1459,12 @@ static CURLcode smtp_perform(struct connectdata *conn, bool *connected,
/* Store the first recipient (or NULL if not specified) */
smtp->rcpt = data->set.mail_rcpt;
+ /* Track of whether we've successfully sent at least one RCPT TO command */
+ smtp->rcpt_had_ok = FALSE;
+
+ /* Track of the last error we've received by sending RCPT TO command */
+ smtp->rcpt_last_error = 0;
+
/* Initial data character is the first character in line: it is implicitly
preceded by a virtual CRLF. */
smtp->trailing_crlf = TRUE;
@@ -1540,6 +1715,76 @@ static CURLcode smtp_parse_custom_request(struct connectdata *conn)
return result;
}
+/***********************************************************************
+ *
+ * smtp_parse_address()
+ *
+ * Parse the fully qualified mailbox address into a local address part and the
+ * host name, converting the host name to an IDN A-label, as per RFC-5890, if
+ * necessary.
+ *
+ * Parameters:
+ *
+ * conn [in] - The connection handle.
+ * fqma [in] - The fully qualified mailbox address (which may or
+ * may not contain UTF-8 characters).
+ * address [in/out] - A new allocated buffer which holds the local
+ * address part of the mailbox. This buffer must be
+ * free'ed by the caller.
+ * host [in/out] - The host name structure that holds the original,
+ * and optionally encoded, host name.
+ * Curl_free_idnconverted_hostname() must be called
+ * once the caller has finished with the structure.
+ *
+ * Returns CURLE_OK on success.
+ *
+ * Notes:
+ *
+ * Should a UTF-8 host name require conversion to IDN ACE and we cannot honor
+ * that convertion then we shall return success. This allow the caller to send
+ * the data to the server as a U-label (as per RFC-6531 sect. 3.2).
+ *
+ * If an mailbox '@' seperator cannot be located then the mailbox is considered
+ * to be either a local mailbox or an invalid mailbox (depending on what the
+ * calling function deems it to be) then the input will simply be returned in
+ * the address part with the host name being NULL.
+ */
+static CURLcode smtp_parse_address(struct connectdata *conn, const char *fqma,
+ char **address, struct hostname *host)
+{
+ CURLcode result = CURLE_OK;
+ size_t length;
+
+ /* Duplicate the fully qualified email address so we can manipulate it,
+ ensuring it doesn't contain the delimiters if specified */
+ char *dup = strdup(fqma[0] == '<' ? fqma + 1 : fqma);
+ if(!dup)
+ return CURLE_OUT_OF_MEMORY;
+
+ length = strlen(dup);
+ if(dup[length - 1] == '>')
+ dup[length - 1] = '\0';
+
+ /* Extract the host name from the addresss (if we can) */
+ host->name = strpbrk(dup, "@");
+ if(host->name) {
+ *host->name = '\0';
+ host->name = host->name + 1;
+
+ /* Attempt to convert the host name to IDN ACE */
+ (void) Curl_idnconvert_hostname(conn, host);
+
+ /* If Curl_idnconvert_hostname() fails then we shall attempt to continue
+ and send the host name using UTF-8 rather than as 7-bit ACE (which is
+ our preference) */
+ }
+
+ /* Extract the local address from the mailbox */
+ *address = dup;
+
+ return result;
+}
+
CURLcode Curl_smtp_escape_eob(struct connectdata *conn, const ssize_t nread)
{
/* When sending a SMTP payload we must detect CRLF. sequences making sure
diff --git a/Utilities/cmcurl/lib/smtp.h b/Utilities/cmcurl/lib/smtp.h
index b67340a..164a175 100644
--- a/Utilities/cmcurl/lib/smtp.h
+++ b/Utilities/cmcurl/lib/smtp.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2009 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2009 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -55,6 +55,9 @@ struct SMTP {
curl_pp_transfer transfer;
char *custom; /* Custom Request */
struct curl_slist *rcpt; /* Recipient list */
+ bool rcpt_had_ok; /* Whether any of RCPT TO commands (depends on
+ total number of recipients) succeeded so far */
+ int rcpt_last_error; /* The last error received for RCPT TO command */
size_t eob; /* Number of bytes of the EOB (End Of Body) that
have been received so far */
bool trailing_crlf; /* Specifies if the tailing CRLF is present */
@@ -71,6 +74,8 @@ struct smtp_conn {
bool tls_supported; /* StartTLS capability supported by server */
bool size_supported; /* If server supports SIZE extension according to
RFC 1870 */
+ bool utf8_supported; /* If server supports SMTPUTF8 extension according
+ to RFC 6531 */
bool auth_supported; /* AUTH capability supported by server */
};
diff --git a/Utilities/cmcurl/lib/sockaddr.h b/Utilities/cmcurl/lib/sockaddr.h
index db14680..b037ee0 100644
--- a/Utilities/cmcurl/lib/sockaddr.h
+++ b/Utilities/cmcurl/lib/sockaddr.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/socketpair.c b/Utilities/cmcurl/lib/socketpair.c
new file mode 100644
index 0000000..1ec0d75
--- /dev/null
+++ b/Utilities/cmcurl/lib/socketpair.c
@@ -0,0 +1,121 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include "curl_setup.h"
+#include "socketpair.h"
+
+#ifndef HAVE_SOCKETPAIR
+#ifdef WIN32
+/*
+ * This is a socketpair() implementation for Windows.
+ */
+#include <string.h>
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#include <windows.h>
+#include <io.h>
+#else
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h> /* IPPROTO_TCP */
+#endif
+#ifdef HAVE_ARPA_INET_H
+#include <arpa/inet.h>
+#endif
+#ifndef INADDR_LOOPBACK
+#define INADDR_LOOPBACK 0x7f000001
+#endif /* !INADDR_LOOPBACK */
+#endif /* !WIN32 */
+
+/* The last 3 #include files should be in this order */
+#include "curl_printf.h"
+#include "curl_memory.h"
+#include "memdebug.h"
+
+int Curl_socketpair(int domain, int type, int protocol,
+ curl_socket_t socks[2])
+{
+ union {
+ struct sockaddr_in inaddr;
+ struct sockaddr addr;
+ } a;
+ curl_socket_t listener;
+ curl_socklen_t addrlen = sizeof(a.inaddr);
+ int reuse = 1;
+ char data[2][12];
+ ssize_t dlen;
+ (void)domain;
+ (void)type;
+ (void)protocol;
+
+ listener = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ if(listener == CURL_SOCKET_BAD)
+ return -1;
+
+ memset(&a, 0, sizeof(a));
+ a.inaddr.sin_family = AF_INET;
+ a.inaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+ a.inaddr.sin_port = 0;
+
+ socks[0] = socks[1] = CURL_SOCKET_BAD;
+
+ if(setsockopt(listener, SOL_SOCKET, SO_REUSEADDR,
+ (char *)&reuse, (curl_socklen_t)sizeof(reuse)) == -1)
+ goto error;
+ if(bind(listener, &a.addr, sizeof(a.inaddr)) == -1)
+ goto error;
+ if(getsockname(listener, &a.addr, &addrlen) == -1)
+ goto error;
+ if(listen(listener, 1) == -1)
+ goto error;
+ socks[0] = socket(AF_INET, SOCK_STREAM, 0);
+ if(socks[0] == CURL_SOCKET_BAD)
+ goto error;
+ if(connect(socks[0], &a.addr, sizeof(a.inaddr)) == -1)
+ goto error;
+ socks[1] = accept(listener, NULL, NULL);
+ if(socks[1] == CURL_SOCKET_BAD)
+ goto error;
+
+ /* verify that nothing else connected */
+ msnprintf(data[0], sizeof(data[0]), "%p", socks);
+ dlen = strlen(data[0]);
+ if(swrite(socks[0], data[0], dlen) != dlen)
+ goto error;
+ if(sread(socks[1], data[1], sizeof(data[1])) != dlen)
+ goto error;
+ if(memcmp(data[0], data[1], dlen))
+ goto error;
+
+ sclose(listener);
+ return 0;
+
+ error:
+ sclose(listener);
+ sclose(socks[0]);
+ sclose(socks[1]);
+ return -1;
+}
+
+#endif /* ! HAVE_SOCKETPAIR */
diff --git a/Utilities/cmcurl/lib/socketpair.h b/Utilities/cmcurl/lib/socketpair.h
new file mode 100644
index 0000000..be9fb24
--- /dev/null
+++ b/Utilities/cmcurl/lib/socketpair.h
@@ -0,0 +1,36 @@
+#ifndef HEADER_CURL_SOCKETPAIR_H
+#define HEADER_CURL_SOCKETPAIR_H
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include "curl_setup.h"
+#ifndef HAVE_SOCKETPAIR
+int Curl_socketpair(int domain, int type, int protocol,
+ curl_socket_t socks[2]);
+#else
+#define Curl_socketpair(a,b,c,d) socketpair(a,b,c,d)
+#endif
+
+/* Defined here to allow specific build configs to disable it completely */
+#define USE_SOCKETPAIR 1
+
+#endif /* HEADER_CURL_SOCKETPAIR_H */
diff --git a/Utilities/cmcurl/lib/socks.c b/Utilities/cmcurl/lib/socks.c
index d8fcc3b..0fb97e1 100644
--- a/Utilities/cmcurl/lib/socks.c
+++ b/Utilities/cmcurl/lib/socks.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -37,16 +37,19 @@
#include "connect.h"
#include "timeval.h"
#include "socks.h"
+#include "multiif.h" /* for getsock macros */
-/* The last #include file should be: */
+/* The last 3 #include files should be in this order */
+#include "curl_printf.h"
+#include "curl_memory.h"
#include "memdebug.h"
+#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
/*
* Helper read-from-socket functions. Does the same as Curl_read() but it
* blocks until all bytes amount of buffersize will be read. No more, no less.
*
- * This is STUPID BLOCKING behaviour which we frown upon, but right now this
- * is what we have...
+ * This is STUPID BLOCKING behavior. Only used by the SOCKS GSSAPI functions.
*/
int Curl_blockread_all(struct connectdata *conn, /* connection data */
curl_socket_t sockfd, /* read from this socket */
@@ -92,6 +95,81 @@ int Curl_blockread_all(struct connectdata *conn, /* connection data */
}
return result;
}
+#endif
+
+#ifndef DEBUGBUILD
+#define sxstate(x,y) socksstate(x,y)
+#else
+#define sxstate(x,y) socksstate(x,y, __LINE__)
+#endif
+
+
+/* always use this function to change state, to make debugging easier */
+static void socksstate(struct connectdata *conn,
+ enum connect_t state
+#ifdef DEBUGBUILD
+ , int lineno
+#endif
+)
+{
+ enum connect_t oldstate = conn->cnnct.state;
+#if defined(DEBUGBUILD) && !defined(CURL_DISABLE_VERBOSE_STRINGS)
+ /* synced with the state list in urldata.h */
+ static const char * const statename[] = {
+ "INIT",
+ "SOCKS_INIT",
+ "SOCKS_SEND",
+ "SOCKS_READ_INIT",
+ "SOCKS_READ",
+ "GSSAPI_INIT",
+ "AUTH_INIT",
+ "AUTH_SEND",
+ "AUTH_READ",
+ "REQ_INIT",
+ "RESOLVING",
+ "RESOLVED",
+ "RESOLVE_REMOTE",
+ "REQ_SEND",
+ "REQ_SENDING",
+ "REQ_READ",
+ "REQ_READ_MORE",
+ "DONE"
+ };
+#endif
+
+ if(oldstate == state)
+ /* don't bother when the new state is the same as the old state */
+ return;
+
+ conn->cnnct.state = state;
+
+#if defined(DEBUGBUILD) && !defined(CURL_DISABLE_VERBOSE_STRINGS)
+ infof(conn->data,
+ "SXSTATE: %s => %s conn %p; line %d\n",
+ statename[oldstate], statename[conn->cnnct.state], conn,
+ lineno);
+#endif
+}
+
+int Curl_SOCKS_getsock(struct connectdata *conn, curl_socket_t *sock,
+ int sockindex)
+{
+ int rc = 0;
+ sock[0] = conn->sock[sockindex];
+ switch(conn->cnnct.state) {
+ case CONNECT_RESOLVING:
+ case CONNECT_SOCKS_READ:
+ case CONNECT_AUTH_READ:
+ case CONNECT_REQ_READ:
+ case CONNECT_REQ_READ_MORE:
+ rc = GETSOCK_READSOCK(0);
+ break;
+ default:
+ rc = GETSOCK_WRITESOCK(0);
+ break;
+ }
+ return rc;
+}
/*
* This function logs in to a SOCKS4 proxy and sends the specifics to the final
@@ -108,62 +186,89 @@ CURLcode Curl_SOCKS4(const char *proxy_user,
const char *hostname,
int remote_port,
int sockindex,
- struct connectdata *conn)
+ struct connectdata *conn,
+ bool *done)
{
const bool protocol4a =
(conn->socks_proxy.proxytype == CURLPROXY_SOCKS4A) ? TRUE : FALSE;
-#define SOCKS4REQLEN 262
- unsigned char socksreq[SOCKS4REQLEN]; /* room for SOCKS4 request incl. user
- id */
- CURLcode code;
- curl_socket_t sock = conn->sock[sockindex];
+ unsigned char *socksreq = &conn->cnnct.socksreq[0];
+ CURLcode result;
+ curl_socket_t sockfd = conn->sock[sockindex];
struct Curl_easy *data = conn->data;
+ struct connstate *sx = &conn->cnnct;
+ struct Curl_dns_entry *dns = NULL;
+ ssize_t actualread;
+ ssize_t written;
- if(Curl_timeleft(data, NULL, TRUE) < 0) {
- /* time-out, bail out, go home */
- failf(data, "Connection time-out");
- return CURLE_OPERATION_TIMEDOUT;
- }
-
- if(conn->bits.httpproxy)
- infof(conn->data, "SOCKS4%s: connecting to HTTP proxy %s port %d\n",
- protocol4a ? "a" : "", hostname, remote_port);
-
- (void)curlx_nonblock(sock, FALSE);
+ if(!SOCKS_STATE(sx->state) && !*done)
+ sxstate(conn, CONNECT_SOCKS_INIT);
- infof(data, "SOCKS4 communication to %s:%d\n", hostname, remote_port);
+ switch(sx->state) {
+ case CONNECT_SOCKS_INIT:
+ if(conn->bits.httpproxy)
+ infof(conn->data, "SOCKS4%s: connecting to HTTP proxy %s port %d\n",
+ protocol4a ? "a" : "", hostname, remote_port);
- /*
- * Compose socks4 request
- *
- * Request format
- *
- * +----+----+----+----+----+----+----+----+----+----+....+----+
- * | VN | CD | DSTPORT | DSTIP | USERID |NULL|
- * +----+----+----+----+----+----+----+----+----+----+....+----+
- * # of bytes: 1 1 2 4 variable 1
- */
+ infof(data, "SOCKS4 communication to %s:%d\n", hostname, remote_port);
- socksreq[0] = 4; /* version (SOCKS4) */
- socksreq[1] = 1; /* connect */
- socksreq[2] = (unsigned char)((remote_port >> 8) & 0xff); /* PORT MSB */
- socksreq[3] = (unsigned char)(remote_port & 0xff); /* PORT LSB */
-
- /* DNS resolve only for SOCKS4, not SOCKS4a */
- if(!protocol4a) {
- struct Curl_dns_entry *dns;
- Curl_addrinfo *hp = NULL;
- int rc;
+ /*
+ * Compose socks4 request
+ *
+ * Request format
+ *
+ * +----+----+----+----+----+----+----+----+----+----+....+----+
+ * | VN | CD | DSTPORT | DSTIP | USERID |NULL|
+ * +----+----+----+----+----+----+----+----+----+----+....+----+
+ * # of bytes: 1 1 2 4 variable 1
+ */
- rc = Curl_resolv(conn, hostname, remote_port, FALSE, &dns);
+ socksreq[0] = 4; /* version (SOCKS4) */
+ socksreq[1] = 1; /* connect */
+ socksreq[2] = (unsigned char)((remote_port >> 8) & 0xff); /* PORT MSB */
+ socksreq[3] = (unsigned char)(remote_port & 0xff); /* PORT LSB */
+
+ /* DNS resolve only for SOCKS4, not SOCKS4a */
+ if(!protocol4a) {
+ enum resolve_t rc =
+ Curl_resolv(conn, hostname, remote_port, FALSE, &dns);
+
+ if(rc == CURLRESOLV_ERROR)
+ return CURLE_COULDNT_RESOLVE_PROXY;
+ else if(rc == CURLRESOLV_PENDING) {
+ sxstate(conn, CONNECT_RESOLVING);
+ infof(data, "SOCKS4 non-blocking resolve of %s\n", hostname);
+ return CURLE_OK;
+ }
+ sxstate(conn, CONNECT_RESOLVED);
+ goto CONNECT_RESOLVED;
+ }
- if(rc == CURLRESOLV_ERROR)
- return CURLE_COULDNT_RESOLVE_PROXY;
+ /* socks4a doesn't resolve anything locally */
+ sxstate(conn, CONNECT_REQ_INIT);
+ goto CONNECT_REQ_INIT;
- if(rc == CURLRESOLV_PENDING)
- /* ignores the return code, but 'dns' remains NULL on failure */
- (void)Curl_resolver_wait_resolv(conn, &dns);
+ case CONNECT_RESOLVING:
+ /* check if we have the name resolved by now */
+ dns = Curl_fetch_addr(conn, hostname, (int)conn->port);
+ if(dns) {
+#ifdef CURLRES_ASYNCH
+ conn->async.dns = dns;
+ conn->async.done = TRUE;
+#endif
+ infof(data, "Hostname '%s' was found\n", hostname);
+ sxstate(conn, CONNECT_RESOLVED);
+ }
+ else {
+ result = Curl_resolv_check(data->conn, &dns);
+ /* stay in the state or error out */
+ return result;
+ }
+ /* FALLTHROUGH */
+ CONNECT_RESOLVED:
+ case CONNECT_RESOLVED: {
+ Curl_addrinfo *hp = NULL;
+ char buf[64];
/*
* We cannot use 'hostent' as a struct that Curl_resolv() returns. It
* returns a Curl_addrinfo pointer that may not always look the same.
@@ -171,7 +276,6 @@ CURLcode Curl_SOCKS4(const char *proxy_user,
if(dns)
hp = dns->addr;
if(hp) {
- char buf[64];
Curl_printable_address(hp, buf, sizeof(buf));
if(hp->ai_family == AF_INET) {
@@ -187,7 +291,6 @@ CURLcode Curl_SOCKS4(const char *proxy_user,
}
else {
hp = NULL; /* fail! */
-
failf(data, "SOCKS4 connection to %s not supported\n", buf);
}
@@ -199,149 +302,166 @@ CURLcode Curl_SOCKS4(const char *proxy_user,
return CURLE_COULDNT_RESOLVE_HOST;
}
}
-
- /*
- * This is currently not supporting "Identification Protocol (RFC1413)".
- */
- socksreq[8] = 0; /* ensure empty userid is NUL-terminated */
- if(proxy_user) {
- size_t plen = strlen(proxy_user);
- if(plen >= sizeof(socksreq) - 8) {
- failf(data, "Too long SOCKS proxy name, can't use!\n");
- return CURLE_COULDNT_CONNECT;
+ /* FALLTHROUGH */
+ CONNECT_REQ_INIT:
+ case CONNECT_REQ_INIT:
+ /*
+ * This is currently not supporting "Identification Protocol (RFC1413)".
+ */
+ socksreq[8] = 0; /* ensure empty userid is NUL-terminated */
+ if(proxy_user) {
+ size_t plen = strlen(proxy_user);
+ if(plen >= sizeof(sx->socksreq) - 8) {
+ failf(data, "Too long SOCKS proxy name, can't use!\n");
+ return CURLE_COULDNT_CONNECT;
+ }
+ /* copy the proxy name WITH trailing zero */
+ memcpy(socksreq + 8, proxy_user, plen + 1);
}
- /* copy the proxy name WITH trailing zero */
- memcpy(socksreq + 8, proxy_user, plen + 1);
- }
- /*
- * Make connection
- */
- {
- int result;
- ssize_t actualread;
- ssize_t written;
- ssize_t hostnamelen = 0;
- ssize_t packetsize = 9 +
- strlen((char *)socksreq + 8); /* size including NUL */
-
- /* If SOCKS4a, set special invalid IP address 0.0.0.x */
- if(protocol4a) {
- socksreq[4] = 0;
- socksreq[5] = 0;
- socksreq[6] = 0;
- socksreq[7] = 1;
- /* If still enough room in buffer, also append hostname */
- hostnamelen = (ssize_t)strlen(hostname) + 1; /* length including NUL */
- if(packetsize + hostnamelen <= SOCKS4REQLEN)
- strcpy((char *)socksreq + packetsize, hostname);
- else
- hostnamelen = 0; /* Flag: hostname did not fit in buffer */
+ /*
+ * Make connection
+ */
+ {
+ ssize_t packetsize = 9 +
+ strlen((char *)socksreq + 8); /* size including NUL */
+
+ /* If SOCKS4a, set special invalid IP address 0.0.0.x */
+ if(protocol4a) {
+ ssize_t hostnamelen = 0;
+ socksreq[4] = 0;
+ socksreq[5] = 0;
+ socksreq[6] = 0;
+ socksreq[7] = 1;
+ /* append hostname */
+ hostnamelen = (ssize_t)strlen(hostname) + 1; /* length including NUL */
+ if(hostnamelen <= 255)
+ strcpy((char *)socksreq + packetsize, hostname);
+ else {
+ failf(data, "SOCKS4: too long host name");
+ return CURLE_COULDNT_CONNECT;
+ }
+ packetsize += hostnamelen;
+ }
+ sx->outp = socksreq;
+ sx->outstanding = packetsize;
+ sxstate(conn, CONNECT_REQ_SENDING);
}
-
+ /* FALLTHROUGH */
+ case CONNECT_REQ_SENDING:
/* Send request */
- code = Curl_write_plain(conn, sock, (char *)socksreq,
- packetsize + hostnamelen,
- &written);
- if(code || (written != packetsize + hostnamelen)) {
+ result = Curl_write_plain(conn, sockfd, (char *)sx->outp,
+ sx->outstanding, &written);
+ if(result && (CURLE_AGAIN != result)) {
failf(data, "Failed to send SOCKS4 connect request.");
return CURLE_COULDNT_CONNECT;
}
- if(protocol4a && hostnamelen == 0) {
- /* SOCKS4a with very long hostname - send that name separately */
- hostnamelen = (ssize_t)strlen(hostname) + 1;
- code = Curl_write_plain(conn, sock, (char *)hostname, hostnamelen,
- &written);
- if(code || (written != hostnamelen)) {
- failf(data, "Failed to send SOCKS4 connect request.");
- return CURLE_COULDNT_CONNECT;
- }
+ if(written != sx->outstanding) {
+ /* not done, remain in state */
+ sx->outstanding -= written;
+ sx->outp += written;
+ return CURLE_OK;
}
- packetsize = 8; /* receive data size */
+ /* done sending! */
+ sx->outstanding = 8; /* receive data size */
+ sx->outp = socksreq;
+ sxstate(conn, CONNECT_SOCKS_READ);
+ /* FALLTHROUGH */
+ case CONNECT_SOCKS_READ:
/* Receive response */
- result = Curl_blockread_all(conn, sock, (char *)socksreq, packetsize,
- &actualread);
- if(result || (actualread != packetsize)) {
- failf(data, "Failed to receive SOCKS4 connect request ack.");
+ result = Curl_read_plain(sockfd, (char *)sx->outp,
+ sx->outstanding, &actualread);
+ if(result && (CURLE_AGAIN != result)) {
+ failf(data, "SOCKS4: Failed receiving connect request ack: %s",
+ curl_easy_strerror(result));
return CURLE_COULDNT_CONNECT;
}
-
- /*
- * Response format
- *
- * +----+----+----+----+----+----+----+----+
- * | VN | CD | DSTPORT | DSTIP |
- * +----+----+----+----+----+----+----+----+
- * # of bytes: 1 1 2 4
- *
- * VN is the version of the reply code and should be 0. CD is the result
- * code with one of the following values:
- *
- * 90: request granted
- * 91: request rejected or failed
- * 92: request rejected because SOCKS server cannot connect to
- * identd on the client
- * 93: request rejected because the client program and identd
- * report different user-ids
- */
-
- /* wrong version ? */
- if(socksreq[0] != 0) {
- failf(data,
- "SOCKS4 reply has wrong version, version should be 0.");
- return CURLE_COULDNT_CONNECT;
+ else if(actualread != sx->outstanding) {
+ /* remain in reading state */
+ sx->outstanding -= actualread;
+ sx->outp += actualread;
+ return CURLE_OK;
}
+ sxstate(conn, CONNECT_DONE);
+ break;
+ default: /* lots of unused states in SOCKS4 */
+ break;
+ }
- /* Result */
- switch(socksreq[1]) {
- case 90:
- infof(data, "SOCKS4%s request granted.\n", protocol4a?"a":"");
- break;
- case 91:
- failf(data,
- "Can't complete SOCKS4 connection to %d.%d.%d.%d:%d. (%d)"
- ", request rejected or failed.",
- (unsigned char)socksreq[4], (unsigned char)socksreq[5],
- (unsigned char)socksreq[6], (unsigned char)socksreq[7],
- (((unsigned char)socksreq[2] << 8) | (unsigned char)socksreq[3]),
- (unsigned char)socksreq[1]);
- return CURLE_COULDNT_CONNECT;
- case 92:
- failf(data,
- "Can't complete SOCKS4 connection to %d.%d.%d.%d:%d. (%d)"
- ", request rejected because SOCKS server cannot connect to "
- "identd on the client.",
- (unsigned char)socksreq[4], (unsigned char)socksreq[5],
- (unsigned char)socksreq[6], (unsigned char)socksreq[7],
- (((unsigned char)socksreq[2] << 8) | (unsigned char)socksreq[3]),
- (unsigned char)socksreq[1]);
- return CURLE_COULDNT_CONNECT;
- case 93:
- failf(data,
- "Can't complete SOCKS4 connection to %d.%d.%d.%d:%d. (%d)"
- ", request rejected because the client program and identd "
- "report different user-ids.",
- (unsigned char)socksreq[4], (unsigned char)socksreq[5],
- (unsigned char)socksreq[6], (unsigned char)socksreq[7],
- (((unsigned char)socksreq[2] << 8) | (unsigned char)socksreq[3]),
- (unsigned char)socksreq[1]);
- return CURLE_COULDNT_CONNECT;
- default:
- failf(data,
- "Can't complete SOCKS4 connection to %d.%d.%d.%d:%d. (%d)"
- ", Unknown.",
- (unsigned char)socksreq[4], (unsigned char)socksreq[5],
- (unsigned char)socksreq[6], (unsigned char)socksreq[7],
- (((unsigned char)socksreq[2] << 8) | (unsigned char)socksreq[3]),
- (unsigned char)socksreq[1]);
- return CURLE_COULDNT_CONNECT;
- }
+ /*
+ * Response format
+ *
+ * +----+----+----+----+----+----+----+----+
+ * | VN | CD | DSTPORT | DSTIP |
+ * +----+----+----+----+----+----+----+----+
+ * # of bytes: 1 1 2 4
+ *
+ * VN is the version of the reply code and should be 0. CD is the result
+ * code with one of the following values:
+ *
+ * 90: request granted
+ * 91: request rejected or failed
+ * 92: request rejected because SOCKS server cannot connect to
+ * identd on the client
+ * 93: request rejected because the client program and identd
+ * report different user-ids
+ */
+
+ /* wrong version ? */
+ if(socksreq[0] != 0) {
+ failf(data,
+ "SOCKS4 reply has wrong version, version should be 0.");
+ return CURLE_COULDNT_CONNECT;
}
- (void)curlx_nonblock(sock, TRUE);
+ /* Result */
+ switch(socksreq[1]) {
+ case 90:
+ infof(data, "SOCKS4%s request granted.\n", protocol4a?"a":"");
+ break;
+ case 91:
+ failf(data,
+ "Can't complete SOCKS4 connection to %d.%d.%d.%d:%d. (%d)"
+ ", request rejected or failed.",
+ (unsigned char)socksreq[4], (unsigned char)socksreq[5],
+ (unsigned char)socksreq[6], (unsigned char)socksreq[7],
+ (((unsigned char)socksreq[2] << 8) | (unsigned char)socksreq[3]),
+ (unsigned char)socksreq[1]);
+ return CURLE_COULDNT_CONNECT;
+ case 92:
+ failf(data,
+ "Can't complete SOCKS4 connection to %d.%d.%d.%d:%d. (%d)"
+ ", request rejected because SOCKS server cannot connect to "
+ "identd on the client.",
+ (unsigned char)socksreq[4], (unsigned char)socksreq[5],
+ (unsigned char)socksreq[6], (unsigned char)socksreq[7],
+ (((unsigned char)socksreq[2] << 8) | (unsigned char)socksreq[3]),
+ (unsigned char)socksreq[1]);
+ return CURLE_COULDNT_CONNECT;
+ case 93:
+ failf(data,
+ "Can't complete SOCKS4 connection to %d.%d.%d.%d:%d. (%d)"
+ ", request rejected because the client program and identd "
+ "report different user-ids.",
+ (unsigned char)socksreq[4], (unsigned char)socksreq[5],
+ (unsigned char)socksreq[6], (unsigned char)socksreq[7],
+ (((unsigned char)socksreq[2] << 8) | (unsigned char)socksreq[3]),
+ (unsigned char)socksreq[1]);
+ return CURLE_COULDNT_CONNECT;
+ default:
+ failf(data,
+ "Can't complete SOCKS4 connection to %d.%d.%d.%d:%d. (%d)"
+ ", Unknown.",
+ (unsigned char)socksreq[4], (unsigned char)socksreq[5],
+ (unsigned char)socksreq[6], (unsigned char)socksreq[7],
+ (((unsigned char)socksreq[2] << 8) | (unsigned char)socksreq[3]),
+ (unsigned char)socksreq[1]);
+ return CURLE_COULDNT_CONNECT;
+ }
+ *done = TRUE;
return CURLE_OK; /* Proxy was successful! */
}
@@ -354,7 +474,8 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
const char *hostname,
int remote_port,
int sockindex,
- struct connectdata *conn)
+ struct connectdata *conn,
+ bool *done)
{
/*
According to the RFC1928, section "6. Replies". This is what a SOCK5
@@ -372,140 +493,158 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
o REP Reply field:
o X'00' succeeded
*/
-
- unsigned char socksreq[600]; /* room for large user/pw (255 max each) */
+ unsigned char *socksreq = &conn->cnnct.socksreq[0];
+ char dest[256] = "unknown"; /* printable hostname:port */
int idx;
ssize_t actualread;
ssize_t written;
- int result;
- CURLcode code;
- curl_socket_t sock = conn->sock[sockindex];
+ CURLcode result;
+ curl_socket_t sockfd = conn->sock[sockindex];
struct Curl_easy *data = conn->data;
- timediff_t timeout;
bool socks5_resolve_local =
(conn->socks_proxy.proxytype == CURLPROXY_SOCKS5) ? TRUE : FALSE;
const size_t hostname_len = strlen(hostname);
ssize_t len = 0;
const unsigned long auth = data->set.socks5auth;
bool allow_gssapi = FALSE;
+ struct connstate *sx = &conn->cnnct;
+ struct Curl_dns_entry *dns = NULL;
+
+ if(!SOCKS_STATE(sx->state) && !*done)
+ sxstate(conn, CONNECT_SOCKS_INIT);
+
+ switch(sx->state) {
+ case CONNECT_SOCKS_INIT:
+ if(conn->bits.httpproxy)
+ infof(conn->data, "SOCKS5: connecting to HTTP proxy %s port %d\n",
+ hostname, remote_port);
+
+ /* RFC1928 chapter 5 specifies max 255 chars for domain name in packet */
+ if(!socks5_resolve_local && hostname_len > 255) {
+ infof(conn->data, "SOCKS5: server resolving disabled for hostnames of "
+ "length > 255 [actual len=%zu]\n", hostname_len);
+ socks5_resolve_local = TRUE;
+ }
- if(conn->bits.httpproxy)
- infof(conn->data, "SOCKS5: connecting to HTTP proxy %s port %d\n",
- hostname, remote_port);
-
- /* RFC1928 chapter 5 specifies max 255 chars for domain name in packet */
- if(!socks5_resolve_local && hostname_len > 255) {
- infof(conn->data, "SOCKS5: server resolving disabled for hostnames of "
- "length > 255 [actual len=%zu]\n", hostname_len);
- socks5_resolve_local = TRUE;
- }
-
- /* get timeout */
- timeout = Curl_timeleft(data, NULL, TRUE);
-
- if(timeout < 0) {
- /* time-out, bail out, go home */
- failf(data, "Connection time-out");
- return CURLE_OPERATION_TIMEDOUT;
- }
-
- (void)curlx_nonblock(sock, TRUE);
-
- /* wait until socket gets connected */
- result = SOCKET_WRITABLE(sock, timeout);
-
- if(-1 == result) {
- failf(conn->data, "SOCKS5: no connection here");
- return CURLE_COULDNT_CONNECT;
- }
- if(0 == result) {
- failf(conn->data, "SOCKS5: connection timeout");
- return CURLE_OPERATION_TIMEDOUT;
- }
-
- if(result & CURL_CSELECT_ERR) {
- failf(conn->data, "SOCKS5: error occurred during connection");
- return CURLE_COULDNT_CONNECT;
- }
-
- if(auth & ~(CURLAUTH_BASIC | CURLAUTH_GSSAPI))
- infof(conn->data,
- "warning: unsupported value passed to CURLOPT_SOCKS5_AUTH: %lu\n",
- auth);
- if(!(auth & CURLAUTH_BASIC))
- /* disable username/password auth */
- proxy_user = NULL;
+ if(auth & ~(CURLAUTH_BASIC | CURLAUTH_GSSAPI))
+ infof(conn->data,
+ "warning: unsupported value passed to CURLOPT_SOCKS5_AUTH: %lu\n",
+ auth);
+ if(!(auth & CURLAUTH_BASIC))
+ /* disable username/password auth */
+ proxy_user = NULL;
#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
- if(auth & CURLAUTH_GSSAPI)
- allow_gssapi = TRUE;
+ if(auth & CURLAUTH_GSSAPI)
+ allow_gssapi = TRUE;
#endif
- idx = 0;
- socksreq[idx++] = 5; /* version */
- idx++; /* reserve for the number of authentication methods */
- socksreq[idx++] = 0; /* no authentication */
- if(allow_gssapi)
- socksreq[idx++] = 1; /* GSS-API */
- if(proxy_user)
- socksreq[idx++] = 2; /* username/password */
- /* write the number of authentication methods */
- socksreq[1] = (unsigned char) (idx - 2);
-
- (void)curlx_nonblock(sock, FALSE);
-
- infof(data, "SOCKS5 communication to %s:%d\n", hostname, remote_port);
-
- code = Curl_write_plain(conn, sock, (char *)socksreq, (2 + (int)socksreq[1]),
- &written);
- if(code || (written != (2 + (int)socksreq[1]))) {
- failf(data, "Unable to send initial SOCKS5 request.");
- return CURLE_COULDNT_CONNECT;
- }
-
- (void)curlx_nonblock(sock, TRUE);
-
- result = SOCKET_READABLE(sock, timeout);
-
- if(-1 == result) {
- failf(conn->data, "SOCKS5 nothing to read");
- return CURLE_COULDNT_CONNECT;
- }
- if(0 == result) {
- failf(conn->data, "SOCKS5 read timeout");
- return CURLE_OPERATION_TIMEDOUT;
- }
-
- if(result & CURL_CSELECT_ERR) {
- failf(conn->data, "SOCKS5 read error occurred");
- return CURLE_RECV_ERROR;
- }
-
- (void)curlx_nonblock(sock, FALSE);
-
- result = Curl_blockread_all(conn, sock, (char *)socksreq, 2, &actualread);
- if(result || (actualread != 2)) {
- failf(data, "Unable to receive initial SOCKS5 response.");
- return CURLE_COULDNT_CONNECT;
- }
-
- if(socksreq[0] != 5) {
- failf(data, "Received invalid version in initial SOCKS5 response.");
- return CURLE_COULDNT_CONNECT;
- }
- if(socksreq[1] == 0) {
- /* Nothing to do, no authentication needed */
- ;
- }
+ idx = 0;
+ socksreq[idx++] = 5; /* version */
+ idx++; /* number of authentication methods */
+ socksreq[idx++] = 0; /* no authentication */
+ if(allow_gssapi)
+ socksreq[idx++] = 1; /* GSS-API */
+ if(proxy_user)
+ socksreq[idx++] = 2; /* username/password */
+ /* write the number of authentication methods */
+ socksreq[1] = (unsigned char) (idx - 2);
+
+ result = Curl_write_plain(conn, sockfd, (char *)socksreq, idx, &written);
+ if(result && (CURLE_AGAIN != result)) {
+ failf(data, "Unable to send initial SOCKS5 request.");
+ return CURLE_COULDNT_CONNECT;
+ }
+ if(written != idx) {
+ sxstate(conn, CONNECT_SOCKS_SEND);
+ sx->outstanding = idx - written;
+ sx->outp = &socksreq[written];
+ return CURLE_OK;
+ }
+ sxstate(conn, CONNECT_SOCKS_READ);
+ goto CONNECT_SOCKS_READ_INIT;
+ case CONNECT_SOCKS_SEND:
+ result = Curl_write_plain(conn, sockfd, (char *)sx->outp,
+ sx->outstanding, &written);
+ if(result && (CURLE_AGAIN != result)) {
+ failf(data, "Unable to send initial SOCKS5 request.");
+ return CURLE_COULDNT_CONNECT;
+ }
+ if(written != sx->outstanding) {
+ /* not done, remain in state */
+ sx->outstanding -= written;
+ sx->outp += written;
+ return CURLE_OK;
+ }
+ /* FALLTHROUGH */
+ CONNECT_SOCKS_READ_INIT:
+ case CONNECT_SOCKS_READ_INIT:
+ sx->outstanding = 2; /* expect two bytes */
+ sx->outp = socksreq; /* store it here */
+ /* FALLTHROUGH */
+ case CONNECT_SOCKS_READ:
+ result = Curl_read_plain(sockfd, (char *)sx->outp,
+ sx->outstanding, &actualread);
+ if(result && (CURLE_AGAIN != result)) {
+ failf(data, "Unable to receive initial SOCKS5 response.");
+ return CURLE_COULDNT_CONNECT;
+ }
+ else if(actualread != sx->outstanding) {
+ /* remain in reading state */
+ sx->outstanding -= actualread;
+ sx->outp += actualread;
+ return CURLE_OK;
+ }
+ else if(socksreq[0] != 5) {
+ failf(data, "Received invalid version in initial SOCKS5 response.");
+ return CURLE_COULDNT_CONNECT;
+ }
+ else if(socksreq[1] == 0) {
+ /* DONE! No authentication needed. Send request. */
+ sxstate(conn, CONNECT_REQ_INIT);
+ goto CONNECT_REQ_INIT;
+ }
+ else if(socksreq[1] == 2) {
+ /* regular name + password authentication */
+ sxstate(conn, CONNECT_AUTH_INIT);
+ goto CONNECT_AUTH_INIT;
+ }
#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
- else if(allow_gssapi && (socksreq[1] == 1)) {
- code = Curl_SOCKS5_gssapi_negotiate(sockindex, conn);
- if(code) {
- failf(data, "Unable to negotiate SOCKS5 GSS-API context.");
+ else if(allow_gssapi && (socksreq[1] == 1)) {
+ sxstate(conn, CONNECT_GSSAPI_INIT);
+ result = Curl_SOCKS5_gssapi_negotiate(sockindex, conn);
+ if(result) {
+ failf(data, "Unable to negotiate SOCKS5 GSS-API context.");
+ return CURLE_COULDNT_CONNECT;
+ }
+ }
+#endif
+ else {
+ /* error */
+ if(!allow_gssapi && (socksreq[1] == 1)) {
+ failf(data,
+ "SOCKS5 GSSAPI per-message authentication is not supported.");
+ return CURLE_COULDNT_CONNECT;
+ }
+ else if(socksreq[1] == 255) {
+ failf(data, "No authentication method was acceptable.");
+ return CURLE_COULDNT_CONNECT;
+ }
+ failf(data,
+ "Undocumented SOCKS5 mode attempted to be used by server.");
return CURLE_COULDNT_CONNECT;
}
- }
+ break;
+#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
+ case CONNECT_GSSAPI_INIT:
+ /* GSSAPI stuff done non-blocking */
+ break;
#endif
- else if(socksreq[1] == 2) {
+
+ default: /* do nothing! */
+ break;
+
+ CONNECT_AUTH_INIT:
+ case CONNECT_AUTH_INIT: {
/* Needs user name and password */
size_t proxy_user_len, proxy_password_len;
if(proxy_user && proxy_password) {
@@ -546,18 +685,41 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
memcpy(socksreq + len, proxy_password, proxy_password_len);
}
len += proxy_password_len;
-
- code = Curl_write_plain(conn, sock, (char *)socksreq, len, &written);
- if(code || (len != written)) {
+ sxstate(conn, CONNECT_AUTH_SEND);
+ sx->outstanding = len;
+ sx->outp = socksreq;
+ }
+ /* FALLTHROUGH */
+ case CONNECT_AUTH_SEND:
+ result = Curl_write_plain(conn, sockfd, (char *)sx->outp,
+ sx->outstanding, &written);
+ if(result && (CURLE_AGAIN != result)) {
failf(data, "Failed to send SOCKS5 sub-negotiation request.");
return CURLE_COULDNT_CONNECT;
}
-
- result = Curl_blockread_all(conn, sock, (char *)socksreq, 2, &actualread);
- if(result || (actualread != 2)) {
+ if(sx->outstanding != written) {
+ /* remain in state */
+ sx->outstanding -= written;
+ sx->outp += written;
+ return CURLE_OK;
+ }
+ sx->outp = socksreq;
+ sx->outstanding = 2;
+ sxstate(conn, CONNECT_AUTH_READ);
+ /* FALLTHROUGH */
+ case CONNECT_AUTH_READ:
+ result = Curl_read_plain(sockfd, (char *)sx->outp,
+ sx->outstanding, &actualread);
+ if(result && (CURLE_AGAIN != result)) {
failf(data, "Unable to receive SOCKS5 sub-negotiation response.");
return CURLE_COULDNT_CONNECT;
}
+ if(actualread != sx->outstanding) {
+ /* remain in state */
+ sx->outstanding -= actualread;
+ sx->outp += actualread;
+ return CURLE_OK;
+ }
/* ignore the first (VER) byte */
if(socksreq[1] != 0) { /* status */
@@ -567,236 +729,248 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
}
/* Everything is good so far, user was authenticated! */
- }
- else {
- /* error */
- if(!allow_gssapi && (socksreq[1] == 1)) {
- failf(data,
- "SOCKS5 GSSAPI per-message authentication is not supported.");
- return CURLE_COULDNT_CONNECT;
- }
- if(socksreq[1] == 255) {
- if(!proxy_user || !*proxy_user) {
- failf(data,
- "No authentication method was acceptable. (It is quite likely"
- " that the SOCKS5 server wanted a username/password, since none"
- " was supplied to the server on this connection.)");
- }
- else {
- failf(data, "No authentication method was acceptable.");
+ sxstate(conn, CONNECT_REQ_INIT);
+ /* FALLTHROUGH */
+ CONNECT_REQ_INIT:
+ case CONNECT_REQ_INIT:
+ if(socks5_resolve_local) {
+ enum resolve_t rc = Curl_resolv(conn, hostname, remote_port,
+ FALSE, &dns);
+
+ if(rc == CURLRESOLV_ERROR)
+ return CURLE_COULDNT_RESOLVE_HOST;
+
+ if(rc == CURLRESOLV_PENDING) {
+ sxstate(conn, CONNECT_RESOLVING);
+ return CURLE_OK;
}
- return CURLE_COULDNT_CONNECT;
+ sxstate(conn, CONNECT_RESOLVED);
+ goto CONNECT_RESOLVED;
}
- else {
- failf(data,
- "Undocumented SOCKS5 mode attempted to be used by server.");
- return CURLE_COULDNT_CONNECT;
- }
- }
-
- /* Authentication is complete, now specify destination to the proxy */
- len = 0;
- socksreq[len++] = 5; /* version (SOCKS5) */
- socksreq[len++] = 1; /* connect */
- socksreq[len++] = 0; /* must be zero */
-
- if(!socks5_resolve_local) {
- socksreq[len++] = 3; /* ATYP: domain name = 3 */
- socksreq[len++] = (char) hostname_len; /* address length */
- memcpy(&socksreq[len], hostname, hostname_len); /* address str w/o NULL */
- len += hostname_len;
- }
- else {
- struct Curl_dns_entry *dns;
- Curl_addrinfo *hp = NULL;
- int rc = Curl_resolv(conn, hostname, remote_port, FALSE, &dns);
+ goto CONNECT_RESOLVE_REMOTE;
- if(rc == CURLRESOLV_ERROR)
- return CURLE_COULDNT_RESOLVE_HOST;
+ case CONNECT_RESOLVING:
+ /* check if we have the name resolved by now */
+ dns = Curl_fetch_addr(conn, hostname, (int)conn->port);
- if(rc == CURLRESOLV_PENDING) {
- /* this requires that we're in "wait for resolve" state */
- code = Curl_resolver_wait_resolv(conn, &dns);
- if(code)
- return code;
+ if(dns) {
+#ifdef CURLRES_ASYNCH
+ conn->async.dns = dns;
+ conn->async.done = TRUE;
+#endif
+ infof(data, "SOCKS5: hostname '%s' found\n", hostname);
}
- /*
- * We cannot use 'hostent' as a struct that Curl_resolv() returns. It
- * returns a Curl_addrinfo pointer that may not always look the same.
- */
+ if(!dns) {
+ result = Curl_resolv_check(data->conn, &dns);
+ /* stay in the state or error out */
+ return result;
+ }
+ /* FALLTHROUGH */
+ CONNECT_RESOLVED:
+ case CONNECT_RESOLVED: {
+ Curl_addrinfo *hp = NULL;
if(dns)
hp = dns->addr;
- if(hp) {
- char buf[64];
- Curl_printable_address(hp, buf, sizeof(buf));
-
- if(hp->ai_family == AF_INET) {
- int i;
- struct sockaddr_in *saddr_in;
- socksreq[len++] = 1; /* ATYP: IPv4 = 1 */
-
- saddr_in = (struct sockaddr_in *)(void *)hp->ai_addr;
- for(i = 0; i < 4; i++) {
- socksreq[len++] = ((unsigned char *)&saddr_in->sin_addr.s_addr)[i];
- }
+ if(!hp) {
+ failf(data, "Failed to resolve \"%s\" for SOCKS5 connect.",
+ hostname);
+ return CURLE_COULDNT_RESOLVE_HOST;
+ }
- infof(data, "SOCKS5 connect to IPv4 %s (locally resolved)\n", buf);
- }
-#ifdef ENABLE_IPV6
- else if(hp->ai_family == AF_INET6) {
- int i;
- struct sockaddr_in6 *saddr_in6;
- socksreq[len++] = 4; /* ATYP: IPv6 = 4 */
-
- saddr_in6 = (struct sockaddr_in6 *)(void *)hp->ai_addr;
- for(i = 0; i < 16; i++) {
- socksreq[len++] =
- ((unsigned char *)&saddr_in6->sin6_addr.s6_addr)[i];
- }
+ if(Curl_printable_address(hp, dest, sizeof(dest))) {
+ size_t destlen = strlen(dest);
+ msnprintf(dest + destlen, sizeof(dest) - destlen, ":%d", remote_port);
+ }
+ else {
+ strcpy(dest, "unknown");
+ }
- infof(data, "SOCKS5 connect to IPv6 %s (locally resolved)\n", buf);
+ len = 0;
+ socksreq[len++] = 5; /* version (SOCKS5) */
+ socksreq[len++] = 1; /* connect */
+ socksreq[len++] = 0; /* must be zero */
+ if(hp->ai_family == AF_INET) {
+ int i;
+ struct sockaddr_in *saddr_in;
+ socksreq[len++] = 1; /* ATYP: IPv4 = 1 */
+
+ saddr_in = (struct sockaddr_in *)(void *)hp->ai_addr;
+ for(i = 0; i < 4; i++) {
+ socksreq[len++] = ((unsigned char *)&saddr_in->sin_addr.s_addr)[i];
}
-#endif
- else {
- hp = NULL; /* fail! */
- failf(data, "SOCKS5 connection to %s not supported\n", buf);
+ infof(data, "SOCKS5 connect to IPv4 %s (locally resolved)\n", dest);
+ }
+#ifdef ENABLE_IPV6
+ else if(hp->ai_family == AF_INET6) {
+ int i;
+ struct sockaddr_in6 *saddr_in6;
+ socksreq[len++] = 4; /* ATYP: IPv6 = 4 */
+
+ saddr_in6 = (struct sockaddr_in6 *)(void *)hp->ai_addr;
+ for(i = 0; i < 16; i++) {
+ socksreq[len++] =
+ ((unsigned char *)&saddr_in6->sin6_addr.s6_addr)[i];
}
- Curl_resolv_unlock(data, dns); /* not used anymore from now on */
+ infof(data, "SOCKS5 connect to IPv6 %s (locally resolved)\n", dest);
}
- if(!hp) {
- failf(data, "Failed to resolve \"%s\" for SOCKS5 connect.",
- hostname);
- return CURLE_COULDNT_RESOLVE_HOST;
+#endif
+ else {
+ hp = NULL; /* fail! */
+ failf(data, "SOCKS5 connection to %s not supported\n", dest);
}
+
+ Curl_resolv_unlock(data, dns); /* not used anymore from now on */
+ goto CONNECT_REQ_SEND;
}
+ CONNECT_RESOLVE_REMOTE:
+ case CONNECT_RESOLVE_REMOTE:
+ /* Authentication is complete, now specify destination to the proxy */
+ len = 0;
+ socksreq[len++] = 5; /* version (SOCKS5) */
+ socksreq[len++] = 1; /* connect */
+ socksreq[len++] = 0; /* must be zero */
+
+ if(!socks5_resolve_local) {
+ socksreq[len++] = 3; /* ATYP: domain name = 3 */
+ socksreq[len++] = (char) hostname_len; /* one byte address length */
+ memcpy(&socksreq[len], hostname, hostname_len); /* address w/o NULL */
+ len += hostname_len;
+ infof(data, "SOCKS5 connect to %s:%d (remotely resolved)\n",
+ hostname, remote_port);
+ }
+ /* FALLTHROUGH */
- socksreq[len++] = (unsigned char)((remote_port >> 8) & 0xff); /* PORT MSB */
- socksreq[len++] = (unsigned char)(remote_port & 0xff); /* PORT LSB */
+ CONNECT_REQ_SEND:
+ case CONNECT_REQ_SEND:
+ /* PORT MSB */
+ socksreq[len++] = (unsigned char)((remote_port >> 8) & 0xff);
+ /* PORT LSB */
+ socksreq[len++] = (unsigned char)(remote_port & 0xff);
#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
- if(conn->socks5_gssapi_enctype) {
- failf(data, "SOCKS5 GSS-API protection not yet implemented.");
- }
- else
+ if(conn->socks5_gssapi_enctype) {
+ failf(data, "SOCKS5 GSS-API protection not yet implemented.");
+ return CURLE_COULDNT_CONNECT;
+ }
#endif
- code = Curl_write_plain(conn, sock, (char *)socksreq, len, &written);
-
- if(code || (len != written)) {
- failf(data, "Failed to send SOCKS5 connect request.");
- return CURLE_COULDNT_CONNECT;
- }
-
- len = 10; /* minimum packet size is 10 */
-
+ sx->outp = socksreq;
+ sx->outstanding = len;
+ sxstate(conn, CONNECT_REQ_SENDING);
+ /* FALLTHROUGH */
+ case CONNECT_REQ_SENDING:
+ result = Curl_write_plain(conn, sockfd, (char *)sx->outp,
+ sx->outstanding, &written);
+ if(result && (CURLE_AGAIN != result)) {
+ failf(data, "Failed to send SOCKS5 connect request.");
+ return CURLE_COULDNT_CONNECT;
+ }
+ if(sx->outstanding != written) {
+ /* remain in state */
+ sx->outstanding -= written;
+ sx->outp += written;
+ return CURLE_OK;
+ }
#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
- if(conn->socks5_gssapi_enctype) {
- failf(data, "SOCKS5 GSS-API protection not yet implemented.");
- }
- else
+ if(conn->socks5_gssapi_enctype) {
+ failf(data, "SOCKS5 GSS-API protection not yet implemented.");
+ return CURLE_COULDNT_CONNECT;
+ }
#endif
- result = Curl_blockread_all(conn, sock, (char *)socksreq,
- len, &actualread);
-
- if(result || (len != actualread)) {
- failf(data, "Failed to receive SOCKS5 connect request ack.");
- return CURLE_COULDNT_CONNECT;
- }
-
- if(socksreq[0] != 5) { /* version */
- failf(data,
- "SOCKS5 reply has wrong version, version should be 5.");
- return CURLE_COULDNT_CONNECT;
- }
-
- /* Fix: in general, returned BND.ADDR is variable length parameter by RFC
- 1928, so the reply packet should be read until the end to avoid errors at
- subsequent protocol level.
-
- +----+-----+-------+------+----------+----------+
- |VER | REP | RSV | ATYP | BND.ADDR | BND.PORT |
- +----+-----+-------+------+----------+----------+
- | 1 | 1 | X'00' | 1 | Variable | 2 |
- +----+-----+-------+------+----------+----------+
+ sx->outstanding = 10; /* minimum packet size is 10 */
+ sx->outp = socksreq;
+ sxstate(conn, CONNECT_REQ_READ);
+ /* FALLTHROUGH */
+ case CONNECT_REQ_READ:
+ result = Curl_read_plain(sockfd, (char *)sx->outp,
+ sx->outstanding, &actualread);
+ if(result && (CURLE_AGAIN != result)) {
+ failf(data, "Failed to receive SOCKS5 connect request ack.");
+ return CURLE_COULDNT_CONNECT;
+ }
+ else if(actualread != sx->outstanding) {
+ /* remain in state */
+ sx->outstanding -= actualread;
+ sx->outp += actualread;
+ return CURLE_OK;
+ }
- ATYP:
- o IP v4 address: X'01', BND.ADDR = 4 byte
- o domain name: X'03', BND.ADDR = [ 1 byte length, string ]
- o IP v6 address: X'04', BND.ADDR = 16 byte
- */
+ if(socksreq[0] != 5) { /* version */
+ failf(data,
+ "SOCKS5 reply has wrong version, version should be 5.");
+ return CURLE_COULDNT_CONNECT;
+ }
+ else if(socksreq[1] != 0) { /* Anything besides 0 is an error */
+ failf(data, "Can't complete SOCKS5 connection to %s. (%d)",
+ hostname, (unsigned char)socksreq[1]);
+ return CURLE_COULDNT_CONNECT;
+ }
- /* Calculate real packet size */
- if(socksreq[3] == 3) {
- /* domain name */
- int addrlen = (int) socksreq[4];
- len = 5 + addrlen + 2;
- }
- else if(socksreq[3] == 4) {
- /* IPv6 */
- len = 4 + 16 + 2;
- }
+ /* Fix: in general, returned BND.ADDR is variable length parameter by RFC
+ 1928, so the reply packet should be read until the end to avoid errors
+ at subsequent protocol level.
+
+ +----+-----+-------+------+----------+----------+
+ |VER | REP | RSV | ATYP | BND.ADDR | BND.PORT |
+ +----+-----+-------+------+----------+----------+
+ | 1 | 1 | X'00' | 1 | Variable | 2 |
+ +----+-----+-------+------+----------+----------+
+
+ ATYP:
+ o IP v4 address: X'01', BND.ADDR = 4 byte
+ o domain name: X'03', BND.ADDR = [ 1 byte length, string ]
+ o IP v6 address: X'04', BND.ADDR = 16 byte
+ */
+
+ /* Calculate real packet size */
+ if(socksreq[3] == 3) {
+ /* domain name */
+ int addrlen = (int) socksreq[4];
+ len = 5 + addrlen + 2;
+ }
+ else if(socksreq[3] == 4) {
+ /* IPv6 */
+ len = 4 + 16 + 2;
+ }
- /* At this point we already read first 10 bytes */
+ /* At this point we already read first 10 bytes */
#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
- if(!conn->socks5_gssapi_enctype) {
- /* decrypt_gssapi_blockread already read the whole packet */
+ if(!conn->socks5_gssapi_enctype) {
+ /* decrypt_gssapi_blockread already read the whole packet */
#endif
- if(len > 10) {
- result = Curl_blockread_all(conn, sock, (char *)&socksreq[10],
- len - 10, &actualread);
- if(result || ((len - 10) != actualread)) {
- failf(data, "Failed to receive SOCKS5 connect request ack.");
- return CURLE_COULDNT_CONNECT;
+ if(len > 10) {
+ sx->outstanding = len - 10; /* get the rest */
+ sx->outp = &socksreq[10];
+ sxstate(conn, CONNECT_REQ_READ_MORE);
+ }
+ else {
+ sxstate(conn, CONNECT_DONE);
+ break;
}
- }
#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
- }
+ }
#endif
-
- if(socksreq[1] != 0) { /* Anything besides 0 is an error */
- if(socksreq[3] == 1) {
- failf(data,
- "Can't complete SOCKS5 connection to %d.%d.%d.%d:%d. (%d)",
- (unsigned char)socksreq[4], (unsigned char)socksreq[5],
- (unsigned char)socksreq[6], (unsigned char)socksreq[7],
- (((unsigned char)socksreq[8] << 8) |
- (unsigned char)socksreq[9]),
- (unsigned char)socksreq[1]);
- }
- else if(socksreq[3] == 3) {
- unsigned char port_upper = (unsigned char)socksreq[len - 2];
- socksreq[len - 2] = 0;
- failf(data,
- "Can't complete SOCKS5 connection to %s:%d. (%d)",
- (char *)&socksreq[5],
- ((port_upper << 8) |
- (unsigned char)socksreq[len - 1]),
- (unsigned char)socksreq[1]);
- socksreq[len - 2] = port_upper;
+ /* FALLTHROUGH */
+ case CONNECT_REQ_READ_MORE:
+ result = Curl_read_plain(sockfd, (char *)sx->outp,
+ sx->outstanding, &actualread);
+ if(result && (CURLE_AGAIN != result)) {
+ failf(data, "Failed to receive SOCKS5 connect request ack.");
+ return CURLE_COULDNT_CONNECT;
}
- else if(socksreq[3] == 4) {
- failf(data,
- "Can't complete SOCKS5 connection to %02x%02x:%02x%02x:"
- "%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%d. (%d)",
- (unsigned char)socksreq[4], (unsigned char)socksreq[5],
- (unsigned char)socksreq[6], (unsigned char)socksreq[7],
- (unsigned char)socksreq[8], (unsigned char)socksreq[9],
- (unsigned char)socksreq[10], (unsigned char)socksreq[11],
- (unsigned char)socksreq[12], (unsigned char)socksreq[13],
- (unsigned char)socksreq[14], (unsigned char)socksreq[15],
- (unsigned char)socksreq[16], (unsigned char)socksreq[17],
- (unsigned char)socksreq[18], (unsigned char)socksreq[19],
- (((unsigned char)socksreq[20] << 8) |
- (unsigned char)socksreq[21]),
- (unsigned char)socksreq[1]);
+ if(actualread != sx->outstanding) {
+ /* remain in state */
+ sx->outstanding -= actualread;
+ sx->outp += actualread;
+ return CURLE_OK;
}
- return CURLE_COULDNT_CONNECT;
+ sxstate(conn, CONNECT_DONE);
}
infof(data, "SOCKS5 request granted.\n");
- (void)curlx_nonblock(sock, TRUE);
+ *done = TRUE;
return CURLE_OK; /* Proxy was successful! */
}
diff --git a/Utilities/cmcurl/lib/socks.h b/Utilities/cmcurl/lib/socks.h
index daa07c1..64a7563 100644
--- a/Utilities/cmcurl/lib/socks.h
+++ b/Utilities/cmcurl/lib/socks.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -27,13 +27,13 @@
#ifdef CURL_DISABLE_PROXY
#define Curl_SOCKS4(a,b,c,d,e) CURLE_NOT_BUILT_IN
#define Curl_SOCKS5(a,b,c,d,e,f) CURLE_NOT_BUILT_IN
+#define Curl_SOCKS_getsock(x,y,z) 0
#else
/*
* Helper read-from-socket functions. Does the same as Curl_read() but it
* blocks until all bytes amount of buffersize will be read. No more, no less.
*
- * This is STUPID BLOCKING behaviour which we frown upon, but right now this
- * is what we have...
+ * This is STUPID BLOCKING behavior
*/
int Curl_blockread_all(struct connectdata *conn,
curl_socket_t sockfd,
@@ -41,6 +41,9 @@ int Curl_blockread_all(struct connectdata *conn,
ssize_t buffersize,
ssize_t *n);
+int Curl_SOCKS_getsock(struct connectdata *conn,
+ curl_socket_t *sock,
+ int sockindex);
/*
* This function logs in to a SOCKS4(a) proxy and sends the specifics to the
* final destination server.
@@ -49,7 +52,8 @@ CURLcode Curl_SOCKS4(const char *proxy_name,
const char *hostname,
int remote_port,
int sockindex,
- struct connectdata *conn);
+ struct connectdata *conn,
+ bool *done);
/*
* This function logs in to a SOCKS5 proxy and sends the specifics to the
@@ -60,7 +64,8 @@ CURLcode Curl_SOCKS5(const char *proxy_name,
const char *hostname,
int remote_port,
int sockindex,
- struct connectdata *conn);
+ struct connectdata *conn,
+ bool *done);
#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
/*
diff --git a/Utilities/cmcurl/lib/socks_gssapi.c b/Utilities/cmcurl/lib/socks_gssapi.c
index 65294bb..97ee718 100644
--- a/Utilities/cmcurl/lib/socks_gssapi.c
+++ b/Utilities/cmcurl/lib/socks_gssapi.c
@@ -5,8 +5,8 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
+ * Copyright (C) 2012 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
* Copyright (C) 2009, Markus Moeller, <markus_moeller@compuserve.com>
- * Copyright (C) 2012 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -167,6 +167,8 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
return CURLE_COULDNT_CONNECT;
}
+ (void)curlx_nonblock(sock, FALSE);
+
/* As long as we need to keep sending some context info, and there's no */
/* errors, keep sending it... */
for(;;) {
@@ -513,6 +515,8 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
gss_release_buffer(&gss_status, &gss_recv_token);
}
+ (void)curlx_nonblock(sock, TRUE);
+
infof(data, "SOCKS5 access with%s protection granted.\n",
(socksreq[0] == 0)?"out GSS-API data":
((socksreq[0] == 1)?" GSS-API integrity":" GSS-API confidentiality"));
diff --git a/Utilities/cmcurl/lib/socks_sspi.c b/Utilities/cmcurl/lib/socks_sspi.c
index 57027ef..d5be64a 100644
--- a/Utilities/cmcurl/lib/socks_sspi.c
+++ b/Utilities/cmcurl/lib/socks_sspi.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2012 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
* Copyright (C) 2009, 2011, Markus Moeller, <markus_moeller@compuserve.com>
*
* This software is licensed as described in the file COPYING, which
@@ -153,6 +153,8 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
return CURLE_COULDNT_CONNECT;
}
+ (void)curlx_nonblock(sock, FALSE);
+
/* As long as we need to keep sending some context info, and there's no */
/* errors, keep sending it... */
for(;;) {
@@ -587,6 +589,7 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
memcpy(socksreq, sspi_w_token[0].pvBuffer, sspi_w_token[0].cbBuffer);
s_pSecFn->FreeContextBuffer(sspi_w_token[0].pvBuffer);
}
+ (void)curlx_nonblock(sock, TRUE);
infof(data, "SOCKS5 access with%s protection granted.\n",
(socksreq[0] == 0)?"out GSS-API data":
diff --git a/Utilities/cmcurl/lib/splay.h b/Utilities/cmcurl/lib/splay.h
index 4612ec2..9292f34 100644
--- a/Utilities/cmcurl/lib/splay.h
+++ b/Utilities/cmcurl/lib/splay.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1997 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1997 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -59,10 +59,4 @@ int Curl_splayremovebyaddr(struct Curl_tree *t,
( ((i.tv_usec) < (j.tv_usec)) ? -1 : \
( ((i.tv_usec) > (j.tv_usec)) ? 1 : 0))))
-#ifdef DEBUGBUILD
-void Curl_splayprint(struct Curl_tree * t, int d, char output);
-#else
-#define Curl_splayprint(x,y,z) Curl_nop_stmt
-#endif
-
#endif /* HEADER_CURL_SPLAY_H */
diff --git a/Utilities/cmcurl/lib/strcase.c b/Utilities/cmcurl/lib/strcase.c
index 24bcca9..a309e35 100644
--- a/Utilities/cmcurl/lib/strcase.c
+++ b/Utilities/cmcurl/lib/strcase.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -26,6 +26,8 @@
#include "strcase.h"
+static char raw_tolower(char in);
+
/* Portable, consistent toupper (remember EBCDIC). Do not use toupper() because
its behavior is altered by the current locale. */
char Curl_raw_toupper(char in)
@@ -93,6 +95,75 @@ char Curl_raw_toupper(char in)
return in;
}
+
+/* Portable, consistent tolower (remember EBCDIC). Do not use tolower() because
+ its behavior is altered by the current locale. */
+static char raw_tolower(char in)
+{
+#if !defined(CURL_DOES_CONVERSIONS)
+ if(in >= 'A' && in <= 'Z')
+ return (char)('a' + in - 'A');
+#else
+ switch(in) {
+ case 'A':
+ return 'a';
+ case 'B':
+ return 'b';
+ case 'C':
+ return 'c';
+ case 'D':
+ return 'd';
+ case 'E':
+ return 'e';
+ case 'F':
+ return 'f';
+ case 'G':
+ return 'g';
+ case 'H':
+ return 'h';
+ case 'I':
+ return 'i';
+ case 'J':
+ return 'j';
+ case 'K':
+ return 'k';
+ case 'L':
+ return 'l';
+ case 'M':
+ return 'm';
+ case 'N':
+ return 'n';
+ case 'O':
+ return 'o';
+ case 'P':
+ return 'p';
+ case 'Q':
+ return 'q';
+ case 'R':
+ return 'r';
+ case 'S':
+ return 's';
+ case 'T':
+ return 't';
+ case 'U':
+ return 'u';
+ case 'V':
+ return 'v';
+ case 'W':
+ return 'w';
+ case 'X':
+ return 'x';
+ case 'Y':
+ return 'y';
+ case 'Z':
+ return 'z';
+ }
+#endif
+
+ return in;
+}
+
+
/*
* Curl_strcasecompare() is for doing "raw" case insensitive strings. This is
* meant to be locale independent and only compare strings we know are safe
@@ -165,6 +236,21 @@ void Curl_strntoupper(char *dest, const char *src, size_t n)
} while(*src++ && --n);
}
+/* Copy a lower case version of the string from src to dest. The
+ * strings may overlap. No more than n characters of the string are copied
+ * (including any NUL) and the destination string will NOT be
+ * NUL-terminated if that limit is reached.
+ */
+void Curl_strntolower(char *dest, const char *src, size_t n)
+{
+ if(n < 1)
+ return;
+
+ do {
+ *dest++ = raw_tolower(*src);
+ } while(*src++ && --n);
+}
+
/* --- public functions --- */
int curl_strequal(const char *first, const char *second)
diff --git a/Utilities/cmcurl/lib/strcase.h b/Utilities/cmcurl/lib/strcase.h
index 6fee384..cd4c419 100644
--- a/Utilities/cmcurl/lib/strcase.h
+++ b/Utilities/cmcurl/lib/strcase.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -46,5 +46,6 @@ char Curl_raw_toupper(char in);
#define checkprefix(a,b) curl_strnequal(a,b,strlen(a))
void Curl_strntoupper(char *dest, const char *src, size_t n);
+void Curl_strntolower(char *dest, const char *src, size_t n);
#endif /* HEADER_CURL_STRCASE_H */
diff --git a/Utilities/cmcurl/lib/strdup.c b/Utilities/cmcurl/lib/strdup.c
index 51e7978..1ab10fd 100644
--- a/Utilities/cmcurl/lib/strdup.c
+++ b/Utilities/cmcurl/lib/strdup.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/strerror.c b/Utilities/cmcurl/lib/strerror.c
index e273f37..1a166bf 100644
--- a/Utilities/cmcurl/lib/strerror.c
+++ b/Utilities/cmcurl/lib/strerror.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2004 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2004 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -311,6 +311,15 @@ curl_easy_strerror(CURLcode error)
case CURLE_RECURSIVE_API_CALL:
return "API function called from within callback";
+ case CURLE_AUTH_ERROR:
+ return "An authentication function returned an error";
+
+ case CURLE_HTTP3:
+ return "HTTP/3 error";
+
+ case CURLE_QUIC_CONNECT_ERROR:
+ return "QUIC connection error";
+
/* error codes not used by current libcurl */
case CURLE_OBSOLETE20:
case CURLE_OBSOLETE24:
@@ -383,6 +392,12 @@ curl_multi_strerror(CURLMcode error)
case CURLM_RECURSIVE_API_CALL:
return "API function called from within callback";
+ case CURLM_WAKEUP_FAILURE:
+ return "Wakeup is unavailable or failed";
+
+ case CURLM_BAD_FUNCTION_ARGUMENT:
+ return "A libcurl function was given a bad argument";
+
case CURLM_LAST:
break;
}
@@ -433,19 +448,26 @@ curl_share_strerror(CURLSHcode error)
}
#ifdef USE_WINSOCK
-
-/* This function handles most / all (?) Winsock errors curl is able to produce.
+/* This is a helper function for Curl_strerror that converts Winsock error
+ * codes (WSAGetLastError) to error messages.
+ * Returns NULL if no error message was found for error code.
*/
static const char *
get_winsock_error (int err, char *buf, size_t len)
{
-#ifdef PRESERVE_WINDOWS_ERROR_CODE
- DWORD old_win_err = GetLastError();
-#endif
- int old_errno = errno;
+#ifndef CURL_DISABLE_VERBOSE_STRINGS
const char *p;
+#endif
-#ifndef CURL_DISABLE_VERBOSE_STRINGS
+ if(!len)
+ return NULL;
+
+ *buf = '\0';
+
+#ifdef CURL_DISABLE_VERBOSE_STRINGS
+ (void)err;
+ return NULL;
+#else
switch(err) {
case WSAEINTR:
p = "Call interrupted";
@@ -614,26 +636,63 @@ get_winsock_error (int err, char *buf, size_t len)
default:
return NULL;
}
-#else
- if(!err)
- return NULL;
- else
- p = "error";
-#endif
strncpy(buf, p, len);
buf [len-1] = '\0';
+ return buf;
+#endif
+}
+#endif /* USE_WINSOCK */
- if(errno != old_errno)
- errno = old_errno;
+#if defined(WIN32) || defined(_WIN32_WCE)
+/* This is a helper function for Curl_strerror that converts Windows API error
+ * codes (GetLastError) to error messages.
+ * Returns NULL if no error message was found for error code.
+ */
+static const char *
+get_winapi_error(int err, char *buf, size_t buflen)
+{
+ char *p;
-#ifdef PRESERVE_WINDOWS_ERROR_CODE
- if(old_win_err != GetLastError())
- SetLastError(old_win_err);
+ if(!buflen)
+ return NULL;
+
+ *buf = '\0';
+
+#ifdef _WIN32_WCE
+ {
+ wchar_t wbuf[256];
+ wbuf[0] = L'\0';
+
+ if(FormatMessage((FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS), NULL, err,
+ LANG_NEUTRAL, wbuf, sizeof(wbuf)/sizeof(wchar_t), NULL)) {
+ size_t written = wcstombs(buf, wbuf, buflen - 1);
+ if(written != (size_t)-1)
+ buf[written] = '\0';
+ else
+ *buf = '\0';
+ }
+ }
+#else
+ if(!FormatMessageA((FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS), NULL, err,
+ LANG_NEUTRAL, buf, (DWORD)buflen, NULL)) {
+ *buf = '\0';
+ }
#endif
- return buf;
+ /* Truncate multiple lines */
+ p = strchr(buf, '\n');
+ if(p) {
+ if(p > buf && *(p-1) == '\r')
+ *(p-1) = '\0';
+ else
+ *p = '\0';
+ }
+
+ return (*buf ? buf : NULL);
}
-#endif /* USE_WINSOCK */
+#endif /* WIN32 || _WIN32_WCE */
/*
* Our thread-safe and smart strerror() replacement.
@@ -645,6 +704,14 @@ get_winsock_error (int err, char *buf, size_t len)
*
* We don't do range checking (on systems other than Windows) since there is
* no good reliable and portable way to do it.
+ *
+ * On Windows different types of error codes overlap. This function has an
+ * order of preference when trying to match error codes:
+ * CRT (errno), Winsock (WSAGetLastError), Windows API (GetLastError).
+ *
+ * It may be more correct to call one of the variant functions instead:
+ * Call Curl_sspi_strerror if the error code is definitely Windows SSPI.
+ * Call Curl_winapi_strerror if the error code is definitely Windows API.
*/
const char *Curl_strerror(int err, char *buf, size_t buflen)
{
@@ -655,35 +722,30 @@ const char *Curl_strerror(int err, char *buf, size_t buflen)
char *p;
size_t max;
+ if(!buflen)
+ return NULL;
+
DEBUGASSERT(err >= 0);
max = buflen - 1;
*buf = '\0';
-#ifdef USE_WINSOCK
-
-#ifdef _WIN32_WCE
- {
- wchar_t wbuf[256];
- wbuf[0] = L'\0';
-
- FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err,
- LANG_NEUTRAL, wbuf, sizeof(wbuf)/sizeof(wchar_t), NULL);
- wcstombs(buf, wbuf, max);
- }
-#else
+#if defined(WIN32) || defined(_WIN32_WCE)
+#if defined(WIN32)
/* 'sys_nerr' is the maximum errno number, it is not widely portable */
if(err >= 0 && err < sys_nerr)
strncpy(buf, strerror(err), max);
- else {
- if(!get_winsock_error(err, buf, max) &&
- !FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err,
- LANG_NEUTRAL, buf, (DWORD)max, NULL))
+ else
+#endif
+ {
+ if(
+#ifdef USE_WINSOCK
+ !get_winsock_error(err, buf, max) &&
+#endif
+ !get_winapi_error((DWORD)err, buf, max))
msnprintf(buf, max, "Unknown error %d (%#x)", err, err);
}
-#endif
-
-#else /* not USE_WINSOCK coming up */
+#else /* not Windows coming up */
#if defined(HAVE_STRERROR_R) && defined(HAVE_POSIX_STRERROR_R)
/*
@@ -731,7 +793,7 @@ const char *Curl_strerror(int err, char *buf, size_t buflen)
}
#endif
-#endif /* end of ! USE_WINSOCK */
+#endif /* end of not Windows */
buf[max] = '\0'; /* make sure the string is zero terminated */
@@ -754,7 +816,52 @@ const char *Curl_strerror(int err, char *buf, size_t buflen)
return buf;
}
+/*
+ * Curl_winapi_strerror:
+ * Variant of Curl_strerror if the error code is definitely Windows API.
+ */
+#if defined(WIN32) || defined(_WIN32_WCE)
+const char *Curl_winapi_strerror(DWORD err, char *buf, size_t buflen)
+{
+#ifdef PRESERVE_WINDOWS_ERROR_CODE
+ DWORD old_win_err = GetLastError();
+#endif
+ int old_errno = errno;
+
+ if(!buflen)
+ return NULL;
+
+ *buf = '\0';
+
+#ifndef CURL_DISABLE_VERBOSE_STRINGS
+ if(!get_winapi_error(err, buf, buflen)) {
+ msnprintf(buf, buflen, "Unknown error %u (0x%08X)", err, err);
+ }
+#else
+ {
+ const char *txt = (err == ERROR_SUCCESS) ? "No error" : "Error";
+ strncpy(buf, txt, buflen);
+ buf[buflen - 1] = '\0';
+ }
+#endif
+
+ if(errno != old_errno)
+ errno = old_errno;
+
+#ifdef PRESERVE_WINDOWS_ERROR_CODE
+ if(old_win_err != GetLastError())
+ SetLastError(old_win_err);
+#endif
+
+ return buf;
+}
+#endif /* WIN32 || _WIN32_WCE */
+
#ifdef USE_WINDOWS_SSPI
+/*
+ * Curl_sspi_strerror:
+ * Variant of Curl_strerror if the error code is definitely Windows SSPI.
+ */
const char *Curl_sspi_strerror(int err, char *buf, size_t buflen)
{
#ifdef PRESERVE_WINDOWS_ERROR_CODE
@@ -762,18 +869,11 @@ const char *Curl_sspi_strerror(int err, char *buf, size_t buflen)
#endif
int old_errno = errno;
const char *txt;
- char *outbuf;
- size_t outmax;
-#ifndef CURL_DISABLE_VERBOSE_STRINGS
- char txtbuf[80];
- char msgbuf[256];
- char *p, *str, *msg = NULL;
- bool msg_formatted = FALSE;
-#endif
- outbuf = buf;
- outmax = buflen - 1;
- *outbuf = '\0';
+ if(!buflen)
+ return NULL;
+
+ *buf = '\0';
#ifndef CURL_DISABLE_VERBOSE_STRINGS
@@ -781,314 +881,121 @@ const char *Curl_sspi_strerror(int err, char *buf, size_t buflen)
case SEC_E_OK:
txt = "No error";
break;
- case CRYPT_E_REVOKED:
- txt = "CRYPT_E_REVOKED";
- break;
- case SEC_E_ALGORITHM_MISMATCH:
- txt = "SEC_E_ALGORITHM_MISMATCH";
- break;
- case SEC_E_BAD_BINDINGS:
- txt = "SEC_E_BAD_BINDINGS";
- break;
- case SEC_E_BAD_PKGID:
- txt = "SEC_E_BAD_PKGID";
- break;
- case SEC_E_BUFFER_TOO_SMALL:
- txt = "SEC_E_BUFFER_TOO_SMALL";
- break;
- case SEC_E_CANNOT_INSTALL:
- txt = "SEC_E_CANNOT_INSTALL";
- break;
- case SEC_E_CANNOT_PACK:
- txt = "SEC_E_CANNOT_PACK";
- break;
- case SEC_E_CERT_EXPIRED:
- txt = "SEC_E_CERT_EXPIRED";
- break;
- case SEC_E_CERT_UNKNOWN:
- txt = "SEC_E_CERT_UNKNOWN";
- break;
- case SEC_E_CERT_WRONG_USAGE:
- txt = "SEC_E_CERT_WRONG_USAGE";
- break;
- case SEC_E_CONTEXT_EXPIRED:
- txt = "SEC_E_CONTEXT_EXPIRED";
- break;
- case SEC_E_CROSSREALM_DELEGATION_FAILURE:
- txt = "SEC_E_CROSSREALM_DELEGATION_FAILURE";
- break;
- case SEC_E_CRYPTO_SYSTEM_INVALID:
- txt = "SEC_E_CRYPTO_SYSTEM_INVALID";
- break;
- case SEC_E_DECRYPT_FAILURE:
- txt = "SEC_E_DECRYPT_FAILURE";
- break;
- case SEC_E_DELEGATION_POLICY:
- txt = "SEC_E_DELEGATION_POLICY";
- break;
- case SEC_E_DELEGATION_REQUIRED:
- txt = "SEC_E_DELEGATION_REQUIRED";
- break;
- case SEC_E_DOWNGRADE_DETECTED:
- txt = "SEC_E_DOWNGRADE_DETECTED";
- break;
- case SEC_E_ENCRYPT_FAILURE:
- txt = "SEC_E_ENCRYPT_FAILURE";
- break;
- case SEC_E_ILLEGAL_MESSAGE:
- txt = "SEC_E_ILLEGAL_MESSAGE";
- break;
- case SEC_E_INCOMPLETE_CREDENTIALS:
- txt = "SEC_E_INCOMPLETE_CREDENTIALS";
- break;
- case SEC_E_INCOMPLETE_MESSAGE:
- txt = "SEC_E_INCOMPLETE_MESSAGE";
- break;
- case SEC_E_INSUFFICIENT_MEMORY:
- txt = "SEC_E_INSUFFICIENT_MEMORY";
- break;
- case SEC_E_INTERNAL_ERROR:
- txt = "SEC_E_INTERNAL_ERROR";
- break;
- case SEC_E_INVALID_HANDLE:
- txt = "SEC_E_INVALID_HANDLE";
- break;
- case SEC_E_INVALID_PARAMETER:
- txt = "SEC_E_INVALID_PARAMETER";
- break;
- case SEC_E_INVALID_TOKEN:
- txt = "SEC_E_INVALID_TOKEN";
- break;
- case SEC_E_ISSUING_CA_UNTRUSTED:
- txt = "SEC_E_ISSUING_CA_UNTRUSTED";
- break;
- case SEC_E_ISSUING_CA_UNTRUSTED_KDC:
- txt = "SEC_E_ISSUING_CA_UNTRUSTED_KDC";
- break;
- case SEC_E_KDC_CERT_EXPIRED:
- txt = "SEC_E_KDC_CERT_EXPIRED";
- break;
- case SEC_E_KDC_CERT_REVOKED:
- txt = "SEC_E_KDC_CERT_REVOKED";
- break;
- case SEC_E_KDC_INVALID_REQUEST:
- txt = "SEC_E_KDC_INVALID_REQUEST";
- break;
- case SEC_E_KDC_UNABLE_TO_REFER:
- txt = "SEC_E_KDC_UNABLE_TO_REFER";
- break;
- case SEC_E_KDC_UNKNOWN_ETYPE:
- txt = "SEC_E_KDC_UNKNOWN_ETYPE";
- break;
- case SEC_E_LOGON_DENIED:
- txt = "SEC_E_LOGON_DENIED";
- break;
- case SEC_E_MAX_REFERRALS_EXCEEDED:
- txt = "SEC_E_MAX_REFERRALS_EXCEEDED";
- break;
- case SEC_E_MESSAGE_ALTERED:
- txt = "SEC_E_MESSAGE_ALTERED";
- break;
- case SEC_E_MULTIPLE_ACCOUNTS:
- txt = "SEC_E_MULTIPLE_ACCOUNTS";
- break;
- case SEC_E_MUST_BE_KDC:
- txt = "SEC_E_MUST_BE_KDC";
- break;
- case SEC_E_NOT_OWNER:
- txt = "SEC_E_NOT_OWNER";
- break;
- case SEC_E_NO_AUTHENTICATING_AUTHORITY:
- txt = "SEC_E_NO_AUTHENTICATING_AUTHORITY";
- break;
- case SEC_E_NO_CREDENTIALS:
- txt = "SEC_E_NO_CREDENTIALS";
- break;
- case SEC_E_NO_IMPERSONATION:
- txt = "SEC_E_NO_IMPERSONATION";
- break;
- case SEC_E_NO_IP_ADDRESSES:
- txt = "SEC_E_NO_IP_ADDRESSES";
- break;
- case SEC_E_NO_KERB_KEY:
- txt = "SEC_E_NO_KERB_KEY";
- break;
- case SEC_E_NO_PA_DATA:
- txt = "SEC_E_NO_PA_DATA";
- break;
- case SEC_E_NO_S4U_PROT_SUPPORT:
- txt = "SEC_E_NO_S4U_PROT_SUPPORT";
- break;
- case SEC_E_NO_TGT_REPLY:
- txt = "SEC_E_NO_TGT_REPLY";
- break;
- case SEC_E_OUT_OF_SEQUENCE:
- txt = "SEC_E_OUT_OF_SEQUENCE";
- break;
- case SEC_E_PKINIT_CLIENT_FAILURE:
- txt = "SEC_E_PKINIT_CLIENT_FAILURE";
- break;
- case SEC_E_PKINIT_NAME_MISMATCH:
- txt = "SEC_E_PKINIT_NAME_MISMATCH";
- break;
- case SEC_E_POLICY_NLTM_ONLY:
- txt = "SEC_E_POLICY_NLTM_ONLY";
- break;
- case SEC_E_QOP_NOT_SUPPORTED:
- txt = "SEC_E_QOP_NOT_SUPPORTED";
- break;
- case SEC_E_REVOCATION_OFFLINE_C:
- txt = "SEC_E_REVOCATION_OFFLINE_C";
- break;
- case SEC_E_REVOCATION_OFFLINE_KDC:
- txt = "SEC_E_REVOCATION_OFFLINE_KDC";
- break;
- case SEC_E_SECPKG_NOT_FOUND:
- txt = "SEC_E_SECPKG_NOT_FOUND";
- break;
- case SEC_E_SECURITY_QOS_FAILED:
- txt = "SEC_E_SECURITY_QOS_FAILED";
- break;
- case SEC_E_SHUTDOWN_IN_PROGRESS:
- txt = "SEC_E_SHUTDOWN_IN_PROGRESS";
- break;
- case SEC_E_SMARTCARD_CERT_EXPIRED:
- txt = "SEC_E_SMARTCARD_CERT_EXPIRED";
- break;
- case SEC_E_SMARTCARD_CERT_REVOKED:
- txt = "SEC_E_SMARTCARD_CERT_REVOKED";
- break;
- case SEC_E_SMARTCARD_LOGON_REQUIRED:
- txt = "SEC_E_SMARTCARD_LOGON_REQUIRED";
- break;
- case SEC_E_STRONG_CRYPTO_NOT_SUPPORTED:
- txt = "SEC_E_STRONG_CRYPTO_NOT_SUPPORTED";
- break;
- case SEC_E_TARGET_UNKNOWN:
- txt = "SEC_E_TARGET_UNKNOWN";
- break;
- case SEC_E_TIME_SKEW:
- txt = "SEC_E_TIME_SKEW";
- break;
- case SEC_E_TOO_MANY_PRINCIPALS:
- txt = "SEC_E_TOO_MANY_PRINCIPALS";
- break;
- case SEC_E_UNFINISHED_CONTEXT_DELETED:
- txt = "SEC_E_UNFINISHED_CONTEXT_DELETED";
- break;
- case SEC_E_UNKNOWN_CREDENTIALS:
- txt = "SEC_E_UNKNOWN_CREDENTIALS";
- break;
- case SEC_E_UNSUPPORTED_FUNCTION:
- txt = "SEC_E_UNSUPPORTED_FUNCTION";
- break;
- case SEC_E_UNSUPPORTED_PREAUTH:
- txt = "SEC_E_UNSUPPORTED_PREAUTH";
- break;
- case SEC_E_UNTRUSTED_ROOT:
- txt = "SEC_E_UNTRUSTED_ROOT";
- break;
- case SEC_E_WRONG_CREDENTIAL_HANDLE:
- txt = "SEC_E_WRONG_CREDENTIAL_HANDLE";
- break;
- case SEC_E_WRONG_PRINCIPAL:
- txt = "SEC_E_WRONG_PRINCIPAL";
- break;
- case SEC_I_COMPLETE_AND_CONTINUE:
- txt = "SEC_I_COMPLETE_AND_CONTINUE";
- break;
- case SEC_I_COMPLETE_NEEDED:
- txt = "SEC_I_COMPLETE_NEEDED";
- break;
- case SEC_I_CONTEXT_EXPIRED:
- txt = "SEC_I_CONTEXT_EXPIRED";
- break;
- case SEC_I_CONTINUE_NEEDED:
- txt = "SEC_I_CONTINUE_NEEDED";
- break;
- case SEC_I_INCOMPLETE_CREDENTIALS:
- txt = "SEC_I_INCOMPLETE_CREDENTIALS";
- break;
- case SEC_I_LOCAL_LOGON:
- txt = "SEC_I_LOCAL_LOGON";
- break;
- case SEC_I_NO_LSA_CONTEXT:
- txt = "SEC_I_NO_LSA_CONTEXT";
- break;
- case SEC_I_RENEGOTIATE:
- txt = "SEC_I_RENEGOTIATE";
- break;
- case SEC_I_SIGNATURE_NEEDED:
- txt = "SEC_I_SIGNATURE_NEEDED";
- break;
+#define SEC2TXT(sec) case sec: txt = #sec; break
+ SEC2TXT(CRYPT_E_REVOKED);
+ SEC2TXT(SEC_E_ALGORITHM_MISMATCH);
+ SEC2TXT(SEC_E_BAD_BINDINGS);
+ SEC2TXT(SEC_E_BAD_PKGID);
+ SEC2TXT(SEC_E_BUFFER_TOO_SMALL);
+ SEC2TXT(SEC_E_CANNOT_INSTALL);
+ SEC2TXT(SEC_E_CANNOT_PACK);
+ SEC2TXT(SEC_E_CERT_EXPIRED);
+ SEC2TXT(SEC_E_CERT_UNKNOWN);
+ SEC2TXT(SEC_E_CERT_WRONG_USAGE);
+ SEC2TXT(SEC_E_CONTEXT_EXPIRED);
+ SEC2TXT(SEC_E_CROSSREALM_DELEGATION_FAILURE);
+ SEC2TXT(SEC_E_CRYPTO_SYSTEM_INVALID);
+ SEC2TXT(SEC_E_DECRYPT_FAILURE);
+ SEC2TXT(SEC_E_DELEGATION_POLICY);
+ SEC2TXT(SEC_E_DELEGATION_REQUIRED);
+ SEC2TXT(SEC_E_DOWNGRADE_DETECTED);
+ SEC2TXT(SEC_E_ENCRYPT_FAILURE);
+ SEC2TXT(SEC_E_ILLEGAL_MESSAGE);
+ SEC2TXT(SEC_E_INCOMPLETE_CREDENTIALS);
+ SEC2TXT(SEC_E_INCOMPLETE_MESSAGE);
+ SEC2TXT(SEC_E_INSUFFICIENT_MEMORY);
+ SEC2TXT(SEC_E_INTERNAL_ERROR);
+ SEC2TXT(SEC_E_INVALID_HANDLE);
+ SEC2TXT(SEC_E_INVALID_PARAMETER);
+ SEC2TXT(SEC_E_INVALID_TOKEN);
+ SEC2TXT(SEC_E_ISSUING_CA_UNTRUSTED);
+ SEC2TXT(SEC_E_ISSUING_CA_UNTRUSTED_KDC);
+ SEC2TXT(SEC_E_KDC_CERT_EXPIRED);
+ SEC2TXT(SEC_E_KDC_CERT_REVOKED);
+ SEC2TXT(SEC_E_KDC_INVALID_REQUEST);
+ SEC2TXT(SEC_E_KDC_UNABLE_TO_REFER);
+ SEC2TXT(SEC_E_KDC_UNKNOWN_ETYPE);
+ SEC2TXT(SEC_E_LOGON_DENIED);
+ SEC2TXT(SEC_E_MAX_REFERRALS_EXCEEDED);
+ SEC2TXT(SEC_E_MESSAGE_ALTERED);
+ SEC2TXT(SEC_E_MULTIPLE_ACCOUNTS);
+ SEC2TXT(SEC_E_MUST_BE_KDC);
+ SEC2TXT(SEC_E_NOT_OWNER);
+ SEC2TXT(SEC_E_NO_AUTHENTICATING_AUTHORITY);
+ SEC2TXT(SEC_E_NO_CREDENTIALS);
+ SEC2TXT(SEC_E_NO_IMPERSONATION);
+ SEC2TXT(SEC_E_NO_IP_ADDRESSES);
+ SEC2TXT(SEC_E_NO_KERB_KEY);
+ SEC2TXT(SEC_E_NO_PA_DATA);
+ SEC2TXT(SEC_E_NO_S4U_PROT_SUPPORT);
+ SEC2TXT(SEC_E_NO_TGT_REPLY);
+ SEC2TXT(SEC_E_OUT_OF_SEQUENCE);
+ SEC2TXT(SEC_E_PKINIT_CLIENT_FAILURE);
+ SEC2TXT(SEC_E_PKINIT_NAME_MISMATCH);
+ SEC2TXT(SEC_E_POLICY_NLTM_ONLY);
+ SEC2TXT(SEC_E_QOP_NOT_SUPPORTED);
+ SEC2TXT(SEC_E_REVOCATION_OFFLINE_C);
+ SEC2TXT(SEC_E_REVOCATION_OFFLINE_KDC);
+ SEC2TXT(SEC_E_SECPKG_NOT_FOUND);
+ SEC2TXT(SEC_E_SECURITY_QOS_FAILED);
+ SEC2TXT(SEC_E_SHUTDOWN_IN_PROGRESS);
+ SEC2TXT(SEC_E_SMARTCARD_CERT_EXPIRED);
+ SEC2TXT(SEC_E_SMARTCARD_CERT_REVOKED);
+ SEC2TXT(SEC_E_SMARTCARD_LOGON_REQUIRED);
+ SEC2TXT(SEC_E_STRONG_CRYPTO_NOT_SUPPORTED);
+ SEC2TXT(SEC_E_TARGET_UNKNOWN);
+ SEC2TXT(SEC_E_TIME_SKEW);
+ SEC2TXT(SEC_E_TOO_MANY_PRINCIPALS);
+ SEC2TXT(SEC_E_UNFINISHED_CONTEXT_DELETED);
+ SEC2TXT(SEC_E_UNKNOWN_CREDENTIALS);
+ SEC2TXT(SEC_E_UNSUPPORTED_FUNCTION);
+ SEC2TXT(SEC_E_UNSUPPORTED_PREAUTH);
+ SEC2TXT(SEC_E_UNTRUSTED_ROOT);
+ SEC2TXT(SEC_E_WRONG_CREDENTIAL_HANDLE);
+ SEC2TXT(SEC_E_WRONG_PRINCIPAL);
+ SEC2TXT(SEC_I_COMPLETE_AND_CONTINUE);
+ SEC2TXT(SEC_I_COMPLETE_NEEDED);
+ SEC2TXT(SEC_I_CONTEXT_EXPIRED);
+ SEC2TXT(SEC_I_CONTINUE_NEEDED);
+ SEC2TXT(SEC_I_INCOMPLETE_CREDENTIALS);
+ SEC2TXT(SEC_I_LOCAL_LOGON);
+ SEC2TXT(SEC_I_NO_LSA_CONTEXT);
+ SEC2TXT(SEC_I_RENEGOTIATE);
+ SEC2TXT(SEC_I_SIGNATURE_NEEDED);
default:
txt = "Unknown error";
}
- if(err == SEC_E_OK)
- strncpy(outbuf, txt, outmax);
- else if(err == SEC_E_ILLEGAL_MESSAGE)
- msnprintf(outbuf, outmax,
+ if(err == SEC_E_ILLEGAL_MESSAGE) {
+ msnprintf(buf, buflen,
"SEC_E_ILLEGAL_MESSAGE (0x%08X) - This error usually occurs "
"when a fatal SSL/TLS alert is received (e.g. handshake failed)."
" More detail may be available in the Windows System event log.",
err);
+ }
else {
- str = txtbuf;
+ char txtbuf[80];
+ char msgbuf[256];
+
msnprintf(txtbuf, sizeof(txtbuf), "%s (0x%08X)", txt, err);
- txtbuf[sizeof(txtbuf)-1] = '\0';
-#ifdef _WIN32_WCE
- {
- wchar_t wbuf[256];
- wbuf[0] = L'\0';
-
- if(FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL, err, LANG_NEUTRAL,
- wbuf, sizeof(wbuf)/sizeof(wchar_t), NULL)) {
- wcstombs(msgbuf, wbuf, sizeof(msgbuf)-1);
- msg_formatted = TRUE;
- }
- }
-#else
- if(FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL, err, LANG_NEUTRAL,
- msgbuf, sizeof(msgbuf)-1, NULL)) {
- msg_formatted = TRUE;
+ if(get_winapi_error(err, msgbuf, sizeof(msgbuf)))
+ msnprintf(buf, buflen, "%s - %s", txtbuf, msgbuf);
+ else {
+ strncpy(buf, txtbuf, buflen);
+ buf[buflen - 1] = '\0';
}
-#endif
- if(msg_formatted) {
- msgbuf[sizeof(msgbuf)-1] = '\0';
- /* strip trailing '\r\n' or '\n' */
- p = strrchr(msgbuf, '\n');
- if(p && (p - msgbuf) >= 2)
- *p = '\0';
- p = strrchr(msgbuf, '\r');
- if(p && (p - msgbuf) >= 1)
- *p = '\0';
- msg = msgbuf;
- }
- if(msg)
- msnprintf(outbuf, outmax, "%s - %s", str, msg);
- else
- strncpy(outbuf, str, outmax);
}
#else
-
if(err == SEC_E_OK)
txt = "No error";
else
txt = "Error";
-
- strncpy(outbuf, txt, outmax);
-
+ strncpy(buf, txt, buflen);
+ buf[buflen - 1] = '\0';
#endif
- outbuf[outmax] = '\0';
-
if(errno != old_errno)
errno = old_errno;
@@ -1097,6 +1004,6 @@ const char *Curl_sspi_strerror(int err, char *buf, size_t buflen)
SetLastError(old_win_err);
#endif
- return outbuf;
+ return buf;
}
#endif /* USE_WINDOWS_SSPI */
diff --git a/Utilities/cmcurl/lib/strerror.h b/Utilities/cmcurl/lib/strerror.h
index 683b5b4..bae8f89 100644
--- a/Utilities/cmcurl/lib/strerror.h
+++ b/Utilities/cmcurl/lib/strerror.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -24,9 +24,12 @@
#include "urldata.h"
-#define STRERROR_LEN 128 /* a suitable length */
+#define STRERROR_LEN 256 /* a suitable length */
const char *Curl_strerror(int err, char *buf, size_t buflen);
+#if defined(WIN32) || defined(_WIN32_WCE)
+const char *Curl_winapi_strerror(DWORD err, char *buf, size_t buflen);
+#endif
#ifdef USE_WINDOWS_SSPI
const char *Curl_sspi_strerror(int err, char *buf, size_t buflen);
#endif
diff --git a/Utilities/cmcurl/lib/strtok.c b/Utilities/cmcurl/lib/strtok.c
index 460eb87..be8f481 100644
--- a/Utilities/cmcurl/lib/strtok.c
+++ b/Utilities/cmcurl/lib/strtok.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/strtok.h b/Utilities/cmcurl/lib/strtok.h
index 90b831e..e221fa6 100644
--- a/Utilities/cmcurl/lib/strtok.h
+++ b/Utilities/cmcurl/lib/strtok.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/strtoofft.c b/Utilities/cmcurl/lib/strtoofft.c
index 546a3ff..96e3820 100644
--- a/Utilities/cmcurl/lib/strtoofft.c
+++ b/Utilities/cmcurl/lib/strtoofft.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/system_win32.c b/Utilities/cmcurl/lib/system_win32.c
index f7f817d..b9587b5 100644
--- a/Utilities/cmcurl/lib/system_win32.c
+++ b/Utilities/cmcurl/lib/system_win32.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2016 - 2017, Steve Holme, <steve_holme@hotmail.com>.
+ * Copyright (C) 2016 - 2020, Steve Holme, <steve_holme@hotmail.com>.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -36,6 +36,12 @@
LARGE_INTEGER Curl_freq;
bool Curl_isVistaOrGreater;
+/* Handle of iphlpapp.dll */
+static HMODULE s_hIpHlpApiDll = NULL;
+
+/* Pointer to the if_nametoindex function */
+IF_NAMETOINDEX_FN Curl_if_nametoindex = NULL;
+
/* Curl_win32_init() performs win32 global initialization */
CURLcode Curl_win32_init(long flags)
{
@@ -89,20 +95,37 @@ CURLcode Curl_win32_init(long flags)
}
#endif
+ s_hIpHlpApiDll = Curl_load_library(TEXT("iphlpapi.dll"));
+ if(s_hIpHlpApiDll) {
+ /* Get the address of the if_nametoindex function */
+ IF_NAMETOINDEX_FN pIfNameToIndex =
+ CURLX_FUNCTION_CAST(IF_NAMETOINDEX_FN,
+ (GetProcAddress(s_hIpHlpApiDll, "if_nametoindex")));
+
+ if(pIfNameToIndex)
+ Curl_if_nametoindex = pIfNameToIndex;
+ }
+
if(Curl_verify_windows_version(6, 0, PLATFORM_WINNT,
VERSION_GREATER_THAN_EQUAL)) {
Curl_isVistaOrGreater = TRUE;
- QueryPerformanceFrequency(&Curl_freq);
}
else
Curl_isVistaOrGreater = FALSE;
+ QueryPerformanceFrequency(&Curl_freq);
return CURLE_OK;
}
/* Curl_win32_cleanup() is the opposite of Curl_win32_init() */
void Curl_win32_cleanup(long init_flags)
{
+ if(s_hIpHlpApiDll) {
+ FreeLibrary(s_hIpHlpApiDll);
+ s_hIpHlpApiDll = NULL;
+ Curl_if_nametoindex = NULL;
+ }
+
#ifdef USE_WINDOWS_SSPI
Curl_sspi_global_cleanup();
#endif
@@ -114,10 +137,6 @@ void Curl_win32_cleanup(long init_flags)
}
}
-#if defined(USE_WINDOWS_SSPI) || (!defined(CURL_DISABLE_TELNET) && \
- defined(USE_WINSOCK))
-
-
#if !defined(LOAD_WITH_ALTERED_SEARCH_PATH)
#define LOAD_WITH_ALTERED_SEARCH_PATH 0x00000008
#endif
@@ -140,8 +159,6 @@ typedef HMODULE (APIENTRY *LOADLIBRARYEX_FN)(LPCTSTR, HANDLE, DWORD);
# define LOADLIBARYEX "LoadLibraryExA"
#endif
-#endif /* USE_WINDOWS_SSPI || (!CURL_DISABLE_TELNET && USE_WINSOCK) */
-
/*
* Curl_verify_windows_version()
*
@@ -334,9 +351,6 @@ bool Curl_verify_windows_version(const unsigned int majorVersion,
return matched;
}
-#if defined(USE_WINDOWS_SSPI) || (!defined(CURL_DISABLE_TELNET) && \
- defined(USE_WINSOCK))
-
/*
* Curl_load_library()
*
@@ -353,6 +367,7 @@ bool Curl_verify_windows_version(const unsigned int majorVersion,
*/
HMODULE Curl_load_library(LPCTSTR filename)
{
+#ifndef CURL_WINDOWS_APP
HMODULE hModule = NULL;
LOADLIBRARYEX_FN pLoadLibraryEx = NULL;
@@ -407,10 +422,12 @@ HMODULE Curl_load_library(LPCTSTR filename)
free(path);
}
}
-
return hModule;
+#else
+ /* the Universal Windows Platform (UWP) can't do this */
+ (void)filename;
+ return NULL;
+#endif
}
-#endif /* USE_WINDOWS_SSPI || (!CURL_DISABLE_TELNET && USE_WINSOCK) */
-
#endif /* WIN32 */
diff --git a/Utilities/cmcurl/lib/system_win32.h b/Utilities/cmcurl/lib/system_win32.h
index 926328a..d2882fc 100644
--- a/Utilities/cmcurl/lib/system_win32.h
+++ b/Utilities/cmcurl/lib/system_win32.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2016, Steve Holme, <steve_holme@hotmail.com>.
+ * Copyright (C) 2016 - 2019, Steve Holme, <steve_holme@hotmail.com>.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -48,20 +48,21 @@ typedef enum {
PLATFORM_WINNT
} PlatformIdentifier;
+/* We use our own typedef here since some headers might lack this */
+typedef unsigned int(WINAPI *IF_NAMETOINDEX_FN)(const char *);
+
+/* This is used instead of if_nametoindex if available on Windows */
+extern IF_NAMETOINDEX_FN Curl_if_nametoindex;
+
/* This is used to verify if we are running on a specific windows version */
bool Curl_verify_windows_version(const unsigned int majorVersion,
const unsigned int minorVersion,
const PlatformIdentifier platform,
const VersionCondition condition);
-#if defined(USE_WINDOWS_SSPI) || (!defined(CURL_DISABLE_TELNET) && \
- defined(USE_WINSOCK))
-
/* This is used to dynamically load DLLs */
HMODULE Curl_load_library(LPCTSTR filename);
-#endif /* USE_WINDOWS_SSPI || (!CURL_DISABLE_TELNET && USE_WINSOCK) */
-
#endif /* WIN32 */
#endif /* HEADER_CURL_SYSTEM_WIN32_H */
diff --git a/Utilities/cmcurl/lib/telnet.c b/Utilities/cmcurl/lib/telnet.c
index 955255c..4bf4c65 100644
--- a/Utilities/cmcurl/lib/telnet.c
+++ b/Utilities/cmcurl/lib/telnet.c
@@ -69,12 +69,12 @@
do { \
x->subend = x->subpointer; \
CURL_SB_CLEAR(x); \
- } WHILE_FALSE
+ } while(0)
#define CURL_SB_ACCUM(x,c) \
do { \
if(x->subpointer < (x->subbuffer + sizeof(x->subbuffer))) \
*x->subpointer++ = (c); \
- } WHILE_FALSE
+ } while(0)
#define CURL_SB_GET(x) ((*x->subpointer++)&0xff)
#define CURL_SB_LEN(x) (x->subend - x->subpointer)
diff --git a/Utilities/cmcurl/lib/telnet.h b/Utilities/cmcurl/lib/telnet.h
index 668a78a..431427f 100644
--- a/Utilities/cmcurl/lib/telnet.h
+++ b/Utilities/cmcurl/lib/telnet.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/tftp.c b/Utilities/cmcurl/lib/tftp.c
index 289cda2..346f293 100644
--- a/Utilities/cmcurl/lib/tftp.c
+++ b/Utilities/cmcurl/lib/tftp.c
@@ -157,8 +157,7 @@ static CURLcode tftp_done(struct connectdata *conn,
static CURLcode tftp_setup_connection(struct connectdata * conn);
static CURLcode tftp_multi_statemach(struct connectdata *conn, bool *done);
static CURLcode tftp_doing(struct connectdata *conn, bool *dophase_done);
-static int tftp_getsock(struct connectdata *conn, curl_socket_t *socks,
- int numsocks);
+static int tftp_getsock(struct connectdata *conn, curl_socket_t *socks);
static CURLcode tftp_translate_code(tftp_error_t error);
@@ -404,13 +403,14 @@ static CURLcode tftp_parse_option_ack(tftp_state_data_t *state,
return CURLE_OK;
}
-static size_t tftp_option_add(tftp_state_data_t *state, size_t csize,
- char *buf, const char *option)
+static CURLcode tftp_option_add(tftp_state_data_t *state, size_t *csize,
+ char *buf, const char *option)
{
- if(( strlen(option) + csize + 1) > (size_t)state->blksize)
- return 0;
+ if(( strlen(option) + *csize + 1) > (size_t)state->blksize)
+ return CURLE_TFTP_ILLEGAL;
strcpy(buf, option);
- return strlen(option) + 1;
+ *csize += strlen(option) + 1;
+ return CURLE_OK;
}
static CURLcode tftp_connect_for_tx(tftp_state_data_t *state,
@@ -511,26 +511,38 @@ static CURLcode tftp_send_first(tftp_state_data_t *state, tftp_event_t event)
else
strcpy(buf, "0"); /* the destination is large enough */
- sbytes += tftp_option_add(state, sbytes,
- (char *)state->spacket.data + sbytes,
- TFTP_OPTION_TSIZE);
- sbytes += tftp_option_add(state, sbytes,
- (char *)state->spacket.data + sbytes, buf);
+ result = tftp_option_add(state, &sbytes,
+ (char *)state->spacket.data + sbytes,
+ TFTP_OPTION_TSIZE);
+ if(result == CURLE_OK)
+ result = tftp_option_add(state, &sbytes,
+ (char *)state->spacket.data + sbytes, buf);
+
/* add blksize option */
msnprintf(buf, sizeof(buf), "%d", state->requested_blksize);
- sbytes += tftp_option_add(state, sbytes,
- (char *)state->spacket.data + sbytes,
- TFTP_OPTION_BLKSIZE);
- sbytes += tftp_option_add(state, sbytes,
- (char *)state->spacket.data + sbytes, buf);
+ if(result == CURLE_OK)
+ result = tftp_option_add(state, &sbytes,
+ (char *)state->spacket.data + sbytes,
+ TFTP_OPTION_BLKSIZE);
+ if(result == CURLE_OK)
+ result = tftp_option_add(state, &sbytes,
+ (char *)state->spacket.data + sbytes, buf);
/* add timeout option */
msnprintf(buf, sizeof(buf), "%d", state->retry_time);
- sbytes += tftp_option_add(state, sbytes,
- (char *)state->spacket.data + sbytes,
- TFTP_OPTION_INTERVAL);
- sbytes += tftp_option_add(state, sbytes,
- (char *)state->spacket.data + sbytes, buf);
+ if(result == CURLE_OK)
+ result = tftp_option_add(state, &sbytes,
+ (char *)state->spacket.data + sbytes,
+ TFTP_OPTION_INTERVAL);
+ if(result == CURLE_OK)
+ result = tftp_option_add(state, &sbytes,
+ (char *)state->spacket.data + sbytes, buf);
+
+ if(result != CURLE_OK) {
+ failf(data, "TFTP buffer too small for options");
+ free(filename);
+ return CURLE_TFTP_ILLEGAL;
+ }
}
/* the typecase for the 3rd argument is mostly for systems that do
@@ -973,6 +985,7 @@ static CURLcode tftp_connect(struct connectdata *conn, bool *done)
{
tftp_state_data_t *state;
int blksize;
+ int need_blksize;
blksize = TFTP_BLKSIZE_DEFAULT;
@@ -987,15 +1000,20 @@ static CURLcode tftp_connect(struct connectdata *conn, bool *done)
return CURLE_TFTP_ILLEGAL;
}
+ need_blksize = blksize;
+ /* default size is the fallback when no OACK is received */
+ if(need_blksize < TFTP_BLKSIZE_DEFAULT)
+ need_blksize = TFTP_BLKSIZE_DEFAULT;
+
if(!state->rpacket.data) {
- state->rpacket.data = calloc(1, blksize + 2 + 2);
+ state->rpacket.data = calloc(1, need_blksize + 2 + 2);
if(!state->rpacket.data)
return CURLE_OUT_OF_MEMORY;
}
if(!state->spacket.data) {
- state->spacket.data = calloc(1, blksize + 2 + 2);
+ state->spacket.data = calloc(1, need_blksize + 2 + 2);
if(!state->spacket.data)
return CURLE_OUT_OF_MEMORY;
@@ -1009,7 +1027,7 @@ static CURLcode tftp_connect(struct connectdata *conn, bool *done)
state->sockfd = state->conn->sock[FIRSTSOCKET];
state->state = TFTP_STATE_START;
state->error = TFTP_ERR_NONE;
- state->blksize = blksize;
+ state->blksize = TFTP_BLKSIZE_DEFAULT; /* Unless updated by OACK response */
state->requested_blksize = blksize;
((struct sockaddr *)&state->local_addr)->sa_family =
@@ -1082,14 +1100,9 @@ static CURLcode tftp_done(struct connectdata *conn, CURLcode status,
* The getsock callback
*
**********************************************************/
-static int tftp_getsock(struct connectdata *conn, curl_socket_t *socks,
- int numsocks)
+static int tftp_getsock(struct connectdata *conn, curl_socket_t *socks)
{
- if(!numsocks)
- return GETSOCK_BLANK;
-
socks[0] = conn->sock[FIRSTSOCKET];
-
return GETSOCK_READSOCK(0);
}
@@ -1376,7 +1389,7 @@ static CURLcode tftp_setup_connection(struct connectdata * conn)
struct Curl_easy *data = conn->data;
char *type;
- conn->socktype = SOCK_DGRAM; /* UDP datagram based */
+ conn->transport = TRNSPRT_UDP;
/* TFTP URLs support an extension like ";mode=<typecode>" that
* we'll try to get now! */
diff --git a/Utilities/cmcurl/lib/tftp.h b/Utilities/cmcurl/lib/tftp.h
index 1335f64..3334830 100644
--- a/Utilities/cmcurl/lib/tftp.h
+++ b/Utilities/cmcurl/lib/tftp.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/timeval.c b/Utilities/cmcurl/lib/timeval.c
index e2bd7fd..e761966 100644
--- a/Utilities/cmcurl/lib/timeval.c
+++ b/Utilities/cmcurl/lib/timeval.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -28,6 +28,7 @@
extern LARGE_INTEGER Curl_freq;
extern bool Curl_isVistaOrGreater;
+/* In case of bug fix this function has a counterpart in tool_util.c */
struct curltime Curl_now(void)
{
struct curltime now;
@@ -174,14 +175,6 @@ struct curltime Curl_now(void)
#endif
-#if SIZEOF_TIME_T < 8
-#define TIME_MAX INT_MAX
-#define TIME_MIN INT_MIN
-#else
-#define TIME_MAX 9223372036854775807LL
-#define TIME_MIN -9223372036854775807LL
-#endif
-
/*
* Returns: time difference in number of milliseconds. For too large diffs it
* returns max value.
@@ -191,10 +184,10 @@ struct curltime Curl_now(void)
timediff_t Curl_timediff(struct curltime newer, struct curltime older)
{
timediff_t diff = (timediff_t)newer.tv_sec-older.tv_sec;
- if(diff >= (TIME_MAX/1000))
- return TIME_MAX;
- else if(diff <= (TIME_MIN/1000))
- return TIME_MIN;
+ if(diff >= (TIMEDIFF_T_MAX/1000))
+ return TIMEDIFF_T_MAX;
+ else if(diff <= (TIMEDIFF_T_MIN/1000))
+ return TIMEDIFF_T_MIN;
return diff * 1000 + (newer.tv_usec-older.tv_usec)/1000;
}
@@ -205,9 +198,9 @@ timediff_t Curl_timediff(struct curltime newer, struct curltime older)
timediff_t Curl_timediff_us(struct curltime newer, struct curltime older)
{
timediff_t diff = (timediff_t)newer.tv_sec-older.tv_sec;
- if(diff >= (TIME_MAX/1000000))
- return TIME_MAX;
- else if(diff <= (TIME_MIN/1000000))
- return TIME_MIN;
+ if(diff >= (TIMEDIFF_T_MAX/1000000))
+ return TIMEDIFF_T_MAX;
+ else if(diff <= (TIMEDIFF_T_MIN/1000000))
+ return TIMEDIFF_T_MIN;
return diff * 1000000 + newer.tv_usec-older.tv_usec;
}
diff --git a/Utilities/cmcurl/lib/timeval.h b/Utilities/cmcurl/lib/timeval.h
index 96867d7..53e0636 100644
--- a/Utilities/cmcurl/lib/timeval.h
+++ b/Utilities/cmcurl/lib/timeval.h
@@ -24,13 +24,13 @@
#include "curl_setup.h"
-#if SIZEOF_TIME_T < 8
-typedef int timediff_t;
-#define CURL_FORMAT_TIMEDIFF_T "d"
-#else
+/* Use a larger type even for 32 bit time_t systems so that we can keep
+ microsecond accuracy in it */
typedef curl_off_t timediff_t;
#define CURL_FORMAT_TIMEDIFF_T CURL_FORMAT_CURL_OFF_T
-#endif
+
+#define TIMEDIFF_T_MAX CURL_OFF_T_MAX
+#define TIMEDIFF_T_MIN CURL_OFF_T_MIN
struct curltime {
time_t tv_sec; /* seconds */
diff --git a/Utilities/cmcurl/lib/transfer.c b/Utilities/cmcurl/lib/transfer.c
index 514330e..8270761 100644
--- a/Utilities/cmcurl/lib/transfer.c
+++ b/Utilities/cmcurl/lib/transfer.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -176,7 +176,7 @@ CURLcode Curl_fillreadbuffer(struct connectdata *conn, size_t bytes,
#ifndef CURL_DISABLE_HTTP
if(data->state.trailers_state == TRAILERS_INITIALIZED) {
struct curl_slist *trailers = NULL;
- CURLcode c;
+ CURLcode result;
int trailers_ret_code;
/* at this point we already verified that the callback exists
@@ -195,17 +195,18 @@ CURLcode Curl_fillreadbuffer(struct connectdata *conn, size_t bytes,
data->set.trailer_data);
Curl_set_in_callback(data, false);
if(trailers_ret_code == CURL_TRAILERFUNC_OK) {
- c = Curl_http_compile_trailers(trailers, data->state.trailers_buf, data);
+ result = Curl_http_compile_trailers(trailers, &data->state.trailers_buf,
+ data);
}
else {
failf(data, "operation aborted by trailing headers callback");
*nreadp = 0;
- c = CURLE_ABORTED_BY_CALLBACK;
+ result = CURLE_ABORTED_BY_CALLBACK;
}
- if(c != CURLE_OK) {
+ if(result) {
Curl_add_buffer_free(&data->state.trailers_buf);
curl_slist_free_all(trailers);
- return c;
+ return result;
}
infof(data, "Successfully compiled trailers.\r\n");
curl_slist_free_all(trailers);
@@ -225,7 +226,7 @@ CURLcode Curl_fillreadbuffer(struct connectdata *conn, size_t bytes,
if(data->state.trailers_state == TRAILERS_SENDING) {
/* if we're here then that means that we already sent the last empty chunk
but we didn't send a final CR LF, so we sent 0 CR LF. We then start
- pulling trailing data until we ²have no more at which point we
+ pulling trailing data until we have no more at which point we
simply return to the previous point in the state machine as if
nothing happened.
*/
@@ -483,8 +484,9 @@ CURLcode Curl_readrewind(struct connectdata *conn)
return CURLE_OK;
}
-static int data_pending(const struct connectdata *conn)
+static int data_pending(const struct Curl_easy *data)
{
+ struct connectdata *conn = data->conn;
/* in the case of libssh2, we can never be really sure that we have emptied
its internal buffers so we MUST always try until we get EAGAIN back */
return conn->handler->protocol&(CURLPROTO_SCP|CURLPROTO_SFTP) ||
@@ -497,7 +499,9 @@ static int data_pending(const struct connectdata *conn)
TRUE. The thing is if we read everything, then http2_recv won't
be called and we cannot signal the HTTP/2 stream has closed. As
a workaround, we return nonzero here to call http2_recv. */
- ((conn->handler->protocol&PROTO_FAMILY_HTTP) && conn->httpversion == 20);
+ ((conn->handler->protocol&PROTO_FAMILY_HTTP) && conn->httpversion >= 20);
+#elif defined(ENABLE_QUIC)
+ Curl_ssl_data_pending(conn, FIRSTSOCKET) || Curl_quic_data_pending(data);
#else
Curl_ssl_data_pending(conn, FIRSTSOCKET);
#endif
@@ -601,7 +605,7 @@ static CURLcode readwrite_data(struct Curl_easy *data,
nread = 0;
}
- if((k->bytecount == 0) && (k->writebytecount == 0)) {
+ if(!k->bytecount) {
Curl_pgrsTime(data, TIMER_STARTTRANSFER);
if(k->exp100 > EXP100_SEND_DATA)
/* set time stamp to compare with when waiting for the 100 */
@@ -775,14 +779,14 @@ static CURLcode readwrite_data(struct Curl_easy *data,
* and writes away the data. The returned 'nread' holds the number
* of actual data it wrote to the client.
*/
-
+ CURLcode extra;
CHUNKcode res =
- Curl_httpchunk_read(conn, k->str, nread, &nread);
+ Curl_httpchunk_read(conn, k->str, nread, &nread, &extra);
if(CHUNKE_OK < res) {
- if(CHUNKE_WRITE_ERROR == res) {
- failf(data, "Failed writing data");
- return CURLE_WRITE_ERROR;
+ if(CHUNKE_PASSTHRU_ERROR == res) {
+ failf(data, "Failed reading the chunked-encoded stream");
+ return extra;
}
failf(data, "%s in chunked-encoding", Curl_chunked_strerror(res));
return CURLE_RECV_ERROR;
@@ -917,7 +921,7 @@ static CURLcode readwrite_data(struct Curl_easy *data,
break;
}
- } while(data_pending(conn) && maxloops--);
+ } while(data_pending(data) && maxloops--);
if(maxloops <= 0) {
/* we mark it as read-again-please */
@@ -937,12 +941,14 @@ static CURLcode readwrite_data(struct Curl_easy *data,
return CURLE_OK;
}
-static CURLcode done_sending(struct connectdata *conn,
- struct SingleRequest *k)
+CURLcode Curl_done_sending(struct connectdata *conn,
+ struct SingleRequest *k)
{
k->keepon &= ~KEEP_SEND; /* we're done writing */
+ /* These functions should be moved into the handler struct! */
Curl_http2_done_sending(conn);
+ Curl_quic_done_sending(conn);
if(conn->bits.rewindaftersend) {
CURLcode result = Curl_readrewind(conn);
@@ -1046,7 +1052,7 @@ static CURLcode readwrite_upload(struct Curl_easy *data,
break;
}
if(nread <= 0) {
- result = done_sending(conn, k);
+ result = Curl_done_sending(conn, k);
if(result)
return result;
break;
@@ -1164,14 +1170,14 @@ static CURLcode readwrite_upload(struct Curl_easy *data,
k->upload_present = 0; /* no more bytes left */
if(k->upload_done) {
- result = done_sending(conn, k);
+ result = Curl_done_sending(conn, k);
if(result)
return result;
}
}
- } WHILE_FALSE; /* just to break out from! */
+ } while(0); /* just to break out from! */
return CURLE_OK;
}
@@ -1211,7 +1217,8 @@ CURLcode Curl_readwrite(struct connectdata *conn,
else
fd_write = CURL_SOCKET_BAD;
- if(conn->data->state.drain) {
+ if(data->state.drain) {
+ data->state.drain--;
select_res |= CURL_CSELECT_IN;
DEBUGF(infof(data, "Curl_readwrite: forcibly told to drain data\n"));
}
@@ -1354,20 +1361,14 @@ CURLcode Curl_readwrite(struct connectdata *conn,
* in the proper state to have this information available.
*/
int Curl_single_getsock(const struct connectdata *conn,
- curl_socket_t *sock, /* points to numsocks number
- of sockets */
- int numsocks)
+ curl_socket_t *sock)
{
const struct Curl_easy *data = conn->data;
int bitmap = GETSOCK_BLANK;
unsigned sockindex = 0;
if(conn->handler->perform_getsock)
- return conn->handler->perform_getsock(conn, sock, numsocks);
-
- if(numsocks < 2)
- /* simple check but we might need two slots */
- return GETSOCK_BLANK;
+ return conn->handler->perform_getsock(conn, sock);
/* don't include HOLD and PAUSE connections */
if((data->req.keepon & KEEP_RECVBITS) == KEEP_RECV) {
@@ -1513,6 +1514,7 @@ CURLcode Curl_pretransfer(struct Curl_easy *data)
}
}
#endif
+ Curl_http2_init_state(&data->state);
}
return result;
@@ -1594,7 +1596,8 @@ CURLcode Curl_follow(struct Curl_easy *data,
DEBUGASSERT(data->state.uh);
uc = curl_url_set(data->state.uh, CURLUPART_URL, newurl,
- (type == FOLLOW_FAKE) ? CURLU_NON_SUPPORT_SCHEME : 0);
+ (type == FOLLOW_FAKE) ? CURLU_NON_SUPPORT_SCHEME :
+ ((type == FOLLOW_REDIR) ? CURLU_URLENCODE : 0) );
if(uc) {
if(type != FOLLOW_FAKE)
return Curl_uc_to_curlcode(uc);
diff --git a/Utilities/cmcurl/lib/transfer.h b/Utilities/cmcurl/lib/transfer.h
index a9bff63..67fd91f 100644
--- a/Utilities/cmcurl/lib/transfer.h
+++ b/Utilities/cmcurl/lib/transfer.h
@@ -29,7 +29,6 @@ char *Curl_checkheaders(const struct connectdata *conn,
void Curl_init_CONNECT(struct Curl_easy *data);
CURLcode Curl_pretransfer(struct Curl_easy *data);
-CURLcode Curl_second_connect(struct connectdata *conn);
CURLcode Curl_posttransfer(struct Curl_easy *data);
typedef enum {
@@ -48,8 +47,7 @@ CURLcode Curl_readwrite(struct connectdata *conn,
struct Curl_easy *data, bool *done,
bool *comeback);
int Curl_single_getsock(const struct connectdata *conn,
- curl_socket_t *socks,
- int numsocks);
+ curl_socket_t *socks);
CURLcode Curl_readrewind(struct connectdata *conn);
CURLcode Curl_fillreadbuffer(struct connectdata *conn, size_t bytes,
size_t *nreadp);
@@ -57,6 +55,9 @@ CURLcode Curl_retry_request(struct connectdata *conn, char **url);
bool Curl_meets_timecondition(struct Curl_easy *data, time_t timeofdoc);
CURLcode Curl_get_upload_buffer(struct Curl_easy *data);
+CURLcode Curl_done_sending(struct connectdata *conn,
+ struct SingleRequest *k);
+
/* This sets up a forthcoming transfer */
void
Curl_setup_transfer (struct Curl_easy *data,
diff --git a/Utilities/cmcurl/lib/url.c b/Utilities/cmcurl/lib/url.c
index c441ae7..47fc66a 100644
--- a/Utilities/cmcurl/lib/url.c
+++ b/Utilities/cmcurl/lib/url.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -34,10 +34,12 @@
#ifdef HAVE_NET_IF_H
#include <net/if.h>
#endif
+#ifdef HAVE_IPHLPAPI_H
+#include <Iphlpapi.h>
+#endif
#ifdef HAVE_SYS_IOCTL_H
#include <sys/ioctl.h>
#endif
-
#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
#endif
@@ -93,6 +95,7 @@ bool curl_win32_idn_to_ascii(const char *in, char **out);
#include "inet_pton.h"
#include "getinfo.h"
#include "urlapi-int.h"
+#include "system_win32.h"
/* And now for the protocols */
#include "ftp.h"
@@ -103,13 +106,12 @@ bool curl_win32_idn_to_ascii(const char *in, char **out);
#include "http2.h"
#include "file.h"
#include "curl_ldap.h"
-#include "ssh.h"
+#include "vssh/ssh.h"
#include "imap.h"
#include "url.h"
#include "connect.h"
#include "inet_ntop.h"
#include "http_ntlm.h"
-#include "socks.h"
#include "curl_rtmp.h"
#include "gopher.h"
#include "http_proxy.h"
@@ -126,7 +128,6 @@ bool curl_win32_idn_to_ascii(const char *in, char **out);
#include "memdebug.h"
static void conn_free(struct connectdata *conn);
-static void free_idnconverted_hostname(struct hostname *host);
static unsigned int get_protocol_family(unsigned int protocol);
/* Some parts of the code (e.g. chunked encoding) assume this buffer has at
@@ -185,7 +186,7 @@ static const struct Curl_handler * const protocols[] = {
&Curl_handler_tftp,
#endif
-#if defined(USE_SSH)
+#if defined(USE_SSH) && !defined(USE_WOLFSSH)
&Curl_handler_scp,
#endif
@@ -315,13 +316,17 @@ static void up_free(struct Curl_easy *data)
* when curl_easy_perform() is invoked.
*/
-CURLcode Curl_close(struct Curl_easy *data)
+CURLcode Curl_close(struct Curl_easy **datap)
{
struct Curl_multi *m;
+ struct Curl_easy *data;
- if(!data)
+ if(!datap || !*datap)
return CURLE_OK;
+ data = *datap;
+ *datap = NULL;
+
Curl_expire_clear(data); /* shut off timers */
m = data->multi;
@@ -372,9 +377,9 @@ CURLcode Curl_close(struct Curl_easy *data)
Curl_safefree(data->state.buffer);
Curl_safefree(data->state.headerbuff);
Curl_safefree(data->state.ulbuf);
- Curl_flush_cookies(data, 1);
+ Curl_flush_cookies(data, TRUE);
#ifdef USE_ALTSVC
- Curl_altsvc_save(data->asi, data->set.str[STRING_ALTSVC]);
+ Curl_altsvc_save(data, data->asi, data->set.str[STRING_ALTSVC]);
Curl_altsvc_cleanup(data->asi);
data->asi = NULL;
#endif
@@ -397,6 +402,12 @@ CURLcode Curl_close(struct Curl_easy *data)
Curl_share_unlock(data, CURL_LOCK_DATA_SHARE);
}
+#ifndef CURL_DISABLE_DOH
+ free(data->req.doh.probe[0].serverdoh.memory);
+ free(data->req.doh.probe[1].serverdoh.memory);
+ curl_slist_free_all(data->req.doh.headers);
+#endif
+
/* destruct wildcard structures if it is needed */
Curl_wildcard_dtor(&data->wildcard);
Curl_freeset(data);
@@ -439,7 +450,7 @@ CURLcode Curl_init_userdefined(struct Curl_easy *data)
set->httpreq = HTTPREQ_GET; /* Default HTTP request */
set->rtspreq = RTSPREQ_OPTIONS; /* Default RTSP request */
-#ifndef CURL_DISABLE_FILE
+#ifndef CURL_DISABLE_FTP
set->ftp_use_epsv = TRUE; /* FTP defaults to EPSV operations */
set->ftp_use_eprt = TRUE; /* FTP defaults to EPRT operations */
set->ftp_use_pret = FALSE; /* mainly useful for drftpd servers */
@@ -485,9 +496,8 @@ CURLcode Curl_init_userdefined(struct Curl_easy *data)
define since we internally only use the lower 16 bits for the passed
in bitmask to not conflict with the private bits */
set->allowed_protocols = CURLPROTO_ALL;
- set->redir_protocols = CURLPROTO_ALL & /* All except FILE, SCP and SMB */
- ~(CURLPROTO_FILE | CURLPROTO_SCP | CURLPROTO_SMB |
- CURLPROTO_SMBS);
+ set->redir_protocols = CURLPROTO_HTTP | CURLPROTO_HTTPS | CURLPROTO_FTP |
+ CURLPROTO_FTPS;
#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
/*
@@ -544,7 +554,7 @@ CURLcode Curl_init_userdefined(struct Curl_easy *data)
set->upkeep_interval_ms = CURL_UPKEEP_INTERVAL_DEFAULT;
set->maxconnects = DEFAULT_CONNCACHE_SIZE; /* for easy handles */
set->maxage_conn = 118;
- set->http09_allowed = TRUE;
+ set->http09_allowed = FALSE;
set->httpversion =
#ifdef USE_NGHTTP2
CURL_HTTP_VERSION_2TLS
@@ -611,8 +621,6 @@ CURLcode Curl_open(struct Curl_easy **curl)
data->progress.flags |= PGRS_HIDE;
data->state.current_speed = -1; /* init to negative == impossible */
-
- Curl_http2_init_state(&data->state);
}
}
@@ -665,7 +673,7 @@ static void conn_reset_all_postponed_data(struct connectdata *conn)
}
#else /* ! USE_RECV_BEFORE_SEND_WORKAROUND */
/* Use "do-nothing" macro instead of function when workaround not used */
-#define conn_reset_all_postponed_data(c) do {} WHILE_FALSE
+#define conn_reset_all_postponed_data(c) do {} while(0)
#endif /* ! USE_RECV_BEFORE_SEND_WORKAROUND */
@@ -705,14 +713,14 @@ static void conn_free(struct connectdata *conn)
if(!conn)
return;
- free_idnconverted_hostname(&conn->host);
- free_idnconverted_hostname(&conn->conn_to_host);
- free_idnconverted_hostname(&conn->http_proxy.host);
- free_idnconverted_hostname(&conn->socks_proxy.host);
+ Curl_free_idnconverted_hostname(&conn->host);
+ Curl_free_idnconverted_hostname(&conn->conn_to_host);
+ Curl_free_idnconverted_hostname(&conn->http_proxy.host);
+ Curl_free_idnconverted_hostname(&conn->socks_proxy.host);
Curl_safefree(conn->user);
Curl_safefree(conn->passwd);
- Curl_safefree(conn->oauth_bearer);
+ Curl_safefree(conn->sasl_authzid);
Curl_safefree(conn->options);
Curl_safefree(conn->http_proxy.user);
Curl_safefree(conn->socks_proxy.user);
@@ -873,11 +881,59 @@ proxy_info_matches(const struct proxy_info* data,
return FALSE;
}
+
+static bool
+socks_proxy_info_matches(const struct proxy_info* data,
+ const struct proxy_info* needle)
+{
+ if(!proxy_info_matches(data, needle))
+ return FALSE;
+
+ /* the user information is case-sensitive
+ or at least it is not defined as case-insensitive
+ see https://tools.ietf.org/html/rfc3986#section-3.2.1 */
+ if((data->user == NULL) != (needle->user == NULL))
+ return FALSE;
+ /* curl_strequal does a case insentive comparison, so do not use it here! */
+ if(data->user &&
+ needle->user &&
+ strcmp(data->user, needle->user) != 0)
+ return FALSE;
+ if((data->passwd == NULL) != (needle->passwd == NULL))
+ return FALSE;
+ /* curl_strequal does a case insentive comparison, so do not use it here! */
+ if(data->passwd &&
+ needle->passwd &&
+ strcmp(data->passwd, needle->passwd) != 0)
+ return FALSE;
+ return TRUE;
+}
#else
/* disabled, won't get called */
#define proxy_info_matches(x,y) FALSE
+#define socks_proxy_info_matches(x,y) FALSE
#endif
+/* A connection has to have been idle for a shorter time than 'maxage_conn' to
+ be subject for reuse. The success rate is just too low after this. */
+
+static bool conn_maxage(struct Curl_easy *data,
+ struct connectdata *conn,
+ struct curltime now)
+{
+ if(!conn->data) {
+ timediff_t idletime = Curl_timediff(now, conn->lastused);
+ idletime /= 1000; /* integer seconds is fine */
+
+ if(idletime > data->set.maxage_conn) {
+ infof(data, "Too old connection (%ld seconds), disconnect it\n",
+ idletime);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
/*
* This function checks if the given connection is dead and extracts it from
* the connection cache if so.
@@ -894,7 +950,11 @@ static bool extract_if_dead(struct connectdata *conn,
/* The check for a dead socket makes sense only if the connection isn't in
use */
bool dead;
- if(conn->handler->connection_check) {
+ struct curltime now = Curl_now();
+ if(conn_maxage(data, conn, now)) {
+ dead = TRUE;
+ }
+ else if(conn->handler->connection_check) {
/* The protocol has a special method for checking the state of the
connection. Use it to check if the connection is dead. */
unsigned int state;
@@ -946,7 +1006,8 @@ static int call_extract_if_dead(struct connectdata *conn, void *param)
static void prune_dead_connections(struct Curl_easy *data)
{
struct curltime now = Curl_now();
- time_t elapsed = Curl_timediff(now, data->state.conn_cache->last_cleanup);
+ timediff_t elapsed =
+ Curl_timediff(now, data->state.conn_cache->last_cleanup);
if(elapsed >= 1000L) {
struct prunedead prune;
@@ -961,25 +1022,6 @@ static void prune_dead_connections(struct Curl_easy *data)
}
}
-/* A connection has to have been idle for a shorter time than 'maxage_conn' to
- be subject for reuse. The success rate is just too low after this. */
-
-static bool conn_maxage(struct Curl_easy *data,
- struct connectdata *conn,
- struct curltime now)
-{
- if(!conn->data) {
- timediff_t idletime = Curl_timediff(now, conn->lastused);
- idletime /= 1000; /* integer seconds is fine */
-
- if(idletime/1000 > data->set.maxage_conn) {
- infof(data, "Too old connection (%ld seconds), disconnect it\n",
- idletime);
- return TRUE;
- }
- }
- return FALSE;
-}
/*
* Given one filled in connection struct (named needle), this function should
* detect if there already is one that has all the significant details
@@ -1003,7 +1045,7 @@ ConnectionExists(struct Curl_easy *data,
bool foundPendingCandidate = FALSE;
bool canmultiplex = IsMultiplexingPossible(data, needle);
struct connectbundle *bundle;
- struct curltime now = Curl_now();
+ const char *hostbundle;
#ifdef USE_NTLM
bool wantNTLMhttp = ((data->state.authhost.want &
@@ -1020,21 +1062,20 @@ ConnectionExists(struct Curl_easy *data,
/* Look up the bundle with all the connections to this particular host.
Locks the connection cache, beware of early returns! */
- bundle = Curl_conncache_find_bundle(needle, data->state.conn_cache);
+ bundle = Curl_conncache_find_bundle(needle, data->state.conn_cache,
+ &hostbundle);
if(bundle) {
/* Max pipe length is zero (unlimited) for multiplexed connections */
struct curl_llist_element *curr;
infof(data, "Found bundle for host %s: %p [%s]\n",
- (needle->bits.conn_to_host ? needle->conn_to_host.name :
- needle->host.name), (void *)bundle,
- (bundle->multiuse == BUNDLE_MULTIPLEX ?
- "can multiplex" : "serially"));
+ hostbundle, (void *)bundle, (bundle->multiuse == BUNDLE_MULTIPLEX ?
+ "can multiplex" : "serially"));
/* We can't multiplex if we don't know anything about the server */
if(canmultiplex) {
if(bundle->multiuse == BUNDLE_UNKNOWN) {
- if((bundle->multiuse == BUNDLE_UNKNOWN) && data->set.pipewait) {
+ if(data->set.pipewait) {
infof(data, "Server doesn't support multiplex yet, wait\n");
*waitpipe = TRUE;
Curl_conncache_unlock(data);
@@ -1058,7 +1099,7 @@ ConnectionExists(struct Curl_easy *data,
curr = bundle->conn_list.head;
while(curr) {
bool match = FALSE;
- size_t multiplexed;
+ size_t multiplexed = 0;
/*
* Note that if we use a HTTP proxy in normal mode (no tunneling), we
@@ -1067,22 +1108,15 @@ ConnectionExists(struct Curl_easy *data,
check = curr->ptr;
curr = curr->next;
- if(check->bits.connect_only)
- /* connect-only connections will not be reused */
- continue;
-
- if(conn_maxage(data, check, now) || extract_if_dead(check, data)) {
- /* disconnect it */
- (void)Curl_disconnect(data, check, /* dead_connection */TRUE);
+ if(check->bits.connect_only || check->bits.close)
+ /* connect-only or to-be-closed connections will not be reused */
continue;
- }
- multiplexed = CONN_INUSE(check) &&
- (bundle->multiuse == BUNDLE_MULTIPLEX);
+ if(bundle->multiuse == BUNDLE_MULTIPLEX)
+ multiplexed = CONN_INUSE(check);
if(canmultiplex) {
- if(check->bits.protoconnstart && check->bits.close)
- continue;
+ ;
}
else {
if(multiplexed) {
@@ -1102,12 +1136,9 @@ ConnectionExists(struct Curl_easy *data,
}
}
- if((check->sock[FIRSTSOCKET] == CURL_SOCKET_BAD) ||
- check->bits.close) {
- if(!check->bits.close)
- foundPendingCandidate = TRUE;
- /* Don't pick a connection that hasn't connected yet or that is going
- to get closed. */
+ if(check->sock[FIRSTSOCKET] == CURL_SOCKET_BAD) {
+ foundPendingCandidate = TRUE;
+ /* Don't pick a connection that hasn't connected yet */
infof(data, "Connection #%ld isn't open enough, can't reuse\n",
check->connection_id);
continue;
@@ -1139,8 +1170,9 @@ ConnectionExists(struct Curl_easy *data,
needle->bits.socksproxy != check->bits.socksproxy)
continue;
- if(needle->bits.socksproxy && !proxy_info_matches(&needle->socks_proxy,
- &check->socks_proxy))
+ if(needle->bits.socksproxy &&
+ !socks_proxy_info_matches(&needle->socks_proxy,
+ &check->socks_proxy))
continue;
if(needle->bits.conn_to_host != check->bits.conn_to_host)
@@ -1180,13 +1212,14 @@ ConnectionExists(struct Curl_easy *data,
}
}
+ DEBUGASSERT(!check->data || GOOD_EASY_HANDLE(check->data));
+
if(!canmultiplex && check->data)
/* this request can't be multiplexed but the checked connection is
already in use so we skip it */
continue;
- if(CONN_INUSE(check) && check->data &&
- (check->data->multi != needle->data->multi))
+ if(check->data && (check->data->multi != needle->data->multi))
/* this could be subject for multiplex use, but only if they belong to
* the same multi handle */
continue;
@@ -1235,7 +1268,7 @@ ConnectionExists(struct Curl_easy *data,
needle->conn_to_port == check->conn_to_port) &&
strcasecompare(needle->host.name, check->host.name) &&
needle->remote_port == check->remote_port) {
- /* The schemes match or the the protocol family is the same and the
+ /* The schemes match or the protocol family is the same and the
previous connection was TLS upgraded, and the hostname and host
port match */
if(needle->handler->flags & PROTOPT_SSL) {
@@ -1276,8 +1309,14 @@ ConnectionExists(struct Curl_easy *data,
partway through a handshake!) */
if(wantNTLMhttp) {
if(strcmp(needle->user, check->user) ||
- strcmp(needle->passwd, check->passwd))
+ strcmp(needle->passwd, check->passwd)) {
+
+ /* we prefer a credential match, but this is at least a connection
+ that can be reused and "upgraded" to NTLM */
+ if(check->http_ntlm_state == NTLMSTATE_NONE)
+ chosen = check;
continue;
+ }
}
else if(check->http_ntlm_state != NTLMSTATE_NONE) {
/* Connection is using NTLM auth but we don't want NTLM */
@@ -1337,6 +1376,13 @@ ConnectionExists(struct Curl_easy *data,
multiplexed);
continue;
}
+ else if(multiplexed >=
+ Curl_multi_max_concurrent_streams(needle->data->multi)) {
+ infof(data, "client side MAX_CONCURRENT_STREAMS reached"
+ ", skip (%zu)\n",
+ multiplexed);
+ continue;
+ }
}
#endif
/* When not multiplexed, we have a match here! */
@@ -1371,58 +1417,6 @@ ConnectionExists(struct Curl_easy *data,
return FALSE; /* no matching connecting exists */
}
-/* after a TCP connection to the proxy has been verified, this function does
- the next magic step.
-
- Note: this function's sub-functions call failf()
-
-*/
-CURLcode Curl_connected_proxy(struct connectdata *conn, int sockindex)
-{
- CURLcode result = CURLE_OK;
-
- if(conn->bits.socksproxy) {
-#ifndef CURL_DISABLE_PROXY
- /* for the secondary socket (FTP), use the "connect to host"
- * but ignore the "connect to port" (use the secondary port)
- */
- const char * const host = conn->bits.httpproxy ?
- conn->http_proxy.host.name :
- conn->bits.conn_to_host ?
- conn->conn_to_host.name :
- sockindex == SECONDARYSOCKET ?
- conn->secondaryhostname : conn->host.name;
- const int port = conn->bits.httpproxy ? (int)conn->http_proxy.port :
- sockindex == SECONDARYSOCKET ? conn->secondary_port :
- conn->bits.conn_to_port ? conn->conn_to_port :
- conn->remote_port;
- conn->bits.socksproxy_connecting = TRUE;
- switch(conn->socks_proxy.proxytype) {
- case CURLPROXY_SOCKS5:
- case CURLPROXY_SOCKS5_HOSTNAME:
- result = Curl_SOCKS5(conn->socks_proxy.user, conn->socks_proxy.passwd,
- host, port, sockindex, conn);
- break;
-
- case CURLPROXY_SOCKS4:
- case CURLPROXY_SOCKS4A:
- result = Curl_SOCKS4(conn->socks_proxy.user, host, port, sockindex,
- conn);
- break;
-
- default:
- failf(conn->data, "unknown proxytype option given");
- result = CURLE_COULDNT_CONNECT;
- } /* switch proxytype */
- conn->bits.socksproxy_connecting = FALSE;
-#else
- (void)sockindex;
-#endif /* CURL_DISABLE_PROXY */
- }
-
- return result;
-}
-
/*
* verboseconnect() displays verbose information after a connect
*/
@@ -1439,134 +1433,17 @@ void Curl_verboseconnect(struct connectdata *conn)
}
#endif
-int Curl_protocol_getsock(struct connectdata *conn,
- curl_socket_t *socks,
- int numsocks)
-{
- if(conn->handler->proto_getsock)
- return conn->handler->proto_getsock(conn, socks, numsocks);
- /* Backup getsock logic. Since there is a live socket in use, we must wait
- for it or it will be removed from watching when the multi_socket API is
- used. */
- socks[0] = conn->sock[FIRSTSOCKET];
- return GETSOCK_READSOCK(0) | GETSOCK_WRITESOCK(0);
-}
-
-int Curl_doing_getsock(struct connectdata *conn,
- curl_socket_t *socks,
- int numsocks)
-{
- if(conn && conn->handler->doing_getsock)
- return conn->handler->doing_getsock(conn, socks, numsocks);
- return GETSOCK_BLANK;
-}
-
-/*
- * We are doing protocol-specific connecting and this is being called over and
- * over from the multi interface until the connection phase is done on
- * protocol layer.
- */
-
-CURLcode Curl_protocol_connecting(struct connectdata *conn,
- bool *done)
-{
- CURLcode result = CURLE_OK;
-
- if(conn && conn->handler->connecting) {
- *done = FALSE;
- result = conn->handler->connecting(conn, done);
- }
- else
- *done = TRUE;
-
- return result;
-}
-
-/*
- * We are DOING this is being called over and over from the multi interface
- * until the DOING phase is done on protocol layer.
- */
-
-CURLcode Curl_protocol_doing(struct connectdata *conn, bool *done)
-{
- CURLcode result = CURLE_OK;
-
- if(conn && conn->handler->doing) {
- *done = FALSE;
- result = conn->handler->doing(conn, done);
- }
- else
- *done = TRUE;
-
- return result;
-}
-
-/*
- * We have discovered that the TCP connection has been successful, we can now
- * proceed with some action.
- *
- */
-CURLcode Curl_protocol_connect(struct connectdata *conn,
- bool *protocol_done)
-{
- CURLcode result = CURLE_OK;
-
- *protocol_done = FALSE;
-
- if(conn->bits.tcpconnect[FIRSTSOCKET] && conn->bits.protoconnstart) {
- /* We already are connected, get back. This may happen when the connect
- worked fine in the first call, like when we connect to a local server
- or proxy. Note that we don't know if the protocol is actually done.
-
- Unless this protocol doesn't have any protocol-connect callback, as
- then we know we're done. */
- if(!conn->handler->connecting)
- *protocol_done = TRUE;
-
- return CURLE_OK;
- }
-
- if(!conn->bits.protoconnstart) {
-
- result = Curl_proxy_connect(conn, FIRSTSOCKET);
- if(result)
- return result;
-
- if(CONNECT_FIRSTSOCKET_PROXY_SSL())
- /* wait for HTTPS proxy SSL initialization to complete */
- return CURLE_OK;
-
- if(conn->bits.tunnel_proxy && conn->bits.httpproxy &&
- Curl_connect_ongoing(conn))
- /* when using an HTTP tunnel proxy, await complete tunnel establishment
- before proceeding further. Return CURLE_OK so we'll be called again */
- return CURLE_OK;
-
- if(conn->handler->connect_it) {
- /* is there a protocol-specific connect() procedure? */
-
- /* Call the protocol-specific connect function */
- result = conn->handler->connect_it(conn, protocol_done);
- }
- else
- *protocol_done = TRUE;
-
- /* it has started, possibly even completed but that knowledge isn't stored
- in this bit! */
- if(!result)
- conn->bits.protoconnstart = TRUE;
- }
-
- return result; /* pass back status */
-}
-
/*
* Helpers for IDNA conversions.
*/
-static bool is_ASCII_name(const char *hostname)
+bool Curl_is_ASCII_name(const char *hostname)
{
+ /* get an UNSIGNED local version of the pointer */
const unsigned char *ch = (const unsigned char *)hostname;
+ if(!hostname) /* bad input, consider it ASCII! */
+ return TRUE;
+
while(*ch) {
if(*ch++ & 0x80)
return FALSE;
@@ -1591,8 +1468,8 @@ static void strip_trailing_dot(struct hostname *host)
/*
* Perform any necessary IDN conversion of hostname
*/
-static CURLcode idnconvert_hostname(struct connectdata *conn,
- struct hostname *host)
+CURLcode Curl_idnconvert_hostname(struct connectdata *conn,
+ struct hostname *host)
{
struct Curl_easy *data = conn->data;
@@ -1607,7 +1484,7 @@ static CURLcode idnconvert_hostname(struct connectdata *conn,
host->dispname = host->name;
/* Check name for non-ASCII and convert hostname to ACE form if we can */
- if(!is_ASCII_name(host->name)) {
+ if(!Curl_is_ASCII_name(host->name)) {
#ifdef USE_LIBIDN2
if(idn2_check_version(IDN2_VERSION)) {
char *ace_hostname = NULL;
@@ -1640,7 +1517,9 @@ static CURLcode idnconvert_hostname(struct connectdata *conn,
host->name = host->encalloc;
}
else {
- failf(data, "Failed to convert %s to ACE;\n", host->name);
+ char buffer[STRERROR_LEN];
+ failf(data, "Failed to convert %s to ACE; %s\n", host->name,
+ Curl_winapi_strerror(GetLastError(), buffer, sizeof(buffer)));
return CURLE_URL_MALFORMAT;
}
#else
@@ -1653,7 +1532,7 @@ static CURLcode idnconvert_hostname(struct connectdata *conn,
/*
* Frees data allocated by idnconvert_hostname()
*/
-static void free_idnconverted_hostname(struct hostname *host)
+void Curl_free_idnconverted_hostname(struct hostname *host)
{
#if defined(USE_LIBIDN2)
if(host->encalloc) {
@@ -1670,13 +1549,6 @@ static void free_idnconverted_hostname(struct hostname *host)
#endif
}
-static void llist_dtor(void *user, void *element)
-{
- (void)user;
- (void)element;
- /* Do nothing */
-}
-
/*
* Allocate and initialize a new connectdata object.
*/
@@ -1781,14 +1653,16 @@ static struct connectdata *allocate_conn(struct Curl_easy *data)
conn->proxy_ssl_config.verifyhost = data->set.proxy_ssl.primary.verifyhost;
conn->ip_version = data->set.ipver;
conn->bits.connect_only = data->set.connect_only;
+ conn->transport = TRNSPRT_TCP; /* most of them are TCP streams */
#if !defined(CURL_DISABLE_HTTP) && defined(USE_NTLM) && \
defined(NTLM_WB_ENABLED)
- conn->ntlm_auth_hlpr_socket = CURL_SOCKET_BAD;
+ conn->ntlm.ntlm_auth_hlpr_socket = CURL_SOCKET_BAD;
+ conn->proxyntlm.ntlm_auth_hlpr_socket = CURL_SOCKET_BAD;
#endif
/* Initialize the easy handle list */
- Curl_llist_init(&conn->easyq, (curl_llist_dtor) llist_dtor);
+ Curl_llist_init(&conn->easyq, NULL);
#ifdef HAVE_GSSAPI
conn->data_prot = PROT_CLEAR;
@@ -1807,6 +1681,7 @@ static struct connectdata *allocate_conn(struct Curl_easy *data)
it may live on without (this specific) Curl_easy */
conn->fclosesocket = data->set.fclosesocket;
conn->closesocket_client = data->set.closesocket_client;
+ conn->lastused = Curl_now(); /* used now */
return conn;
error:
@@ -1884,6 +1759,50 @@ CURLcode Curl_uc_to_curlcode(CURLUcode uc)
}
/*
+ * If the URL was set with an IPv6 numerical address with a zone id part, set
+ * the scope_id based on that!
+ */
+
+static void zonefrom_url(CURLU *uh, struct connectdata *conn)
+{
+ char *zoneid;
+ CURLUcode uc;
+
+ uc = curl_url_get(uh, CURLUPART_ZONEID, &zoneid, 0);
+
+ if(!uc && zoneid) {
+ char *endp;
+ unsigned long scope = strtoul(zoneid, &endp, 10);
+ if(!*endp && (scope < UINT_MAX))
+ /* A plain number, use it directly as a scope id. */
+ conn->scope_id = (unsigned int)scope;
+#if defined(HAVE_IF_NAMETOINDEX)
+ else {
+#elif defined(WIN32)
+ else if(Curl_if_nametoindex) {
+#endif
+
+#if defined(HAVE_IF_NAMETOINDEX) || defined(WIN32)
+ /* Zone identifier is not numeric */
+ unsigned int scopeidx = 0;
+#if defined(WIN32)
+ scopeidx = Curl_if_nametoindex(zoneid);
+#else
+ scopeidx = if_nametoindex(zoneid);
+#endif
+ if(!scopeidx)
+ infof(conn->data, "Invalid zoneid: %s; %s\n", zoneid,
+ strerror(errno));
+ else
+ conn->scope_id = scopeidx;
+ }
+#endif /* HAVE_IF_NAMETOINDEX || WIN32 */
+
+ free(zoneid);
+ }
+}
+
+/*
* Parse URL and fill in the relevant members of the connection struct.
*/
static CURLcode parseurlandfillconn(struct Curl_easy *data,
@@ -1921,6 +1840,7 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,
}
if(!data->set.uh) {
+ char *newurl;
uc = curl_url_set(uh, CURLUPART_URL, data->change.url,
CURLU_GUESS_SCHEME |
CURLU_NON_SUPPORT_SCHEME |
@@ -1931,6 +1851,15 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,
DEBUGF(infof(data, "curl_url_set rejected %s\n", data->change.url));
return Curl_uc_to_curlcode(uc);
}
+
+ /* after it was parsed, get the generated normalized version */
+ uc = curl_url_get(uh, CURLUPART_URL, &newurl, 0);
+ if(uc)
+ return Curl_uc_to_curlcode(uc);
+ if(data->change.url_alloc)
+ free(data->change.url);
+ data->change.url = newurl;
+ data->change.url_alloc = TRUE;
}
uc = curl_url_get(uh, CURLUPART_SCHEME, &data->state.up.scheme, 0);
@@ -1991,55 +1920,27 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,
}
else {
unsigned long port = strtoul(data->state.up.port, NULL, 10);
- conn->remote_port = curlx_ultous(port);
+ conn->port = conn->remote_port = curlx_ultous(port);
}
(void)curl_url_get(uh, CURLUPART_QUERY, &data->state.up.query, 0);
hostname = data->state.up.hostname;
- if(!hostname)
- /* this is for file:// transfers, get a dummy made */
- hostname = (char *)"";
-
- if(hostname[0] == '[') {
+ if(hostname && hostname[0] == '[') {
/* This looks like an IPv6 address literal. See if there is an address
scope. */
- char *zoneid;
size_t hlen;
- uc = curl_url_get(uh, CURLUPART_ZONEID, &zoneid, 0);
conn->bits.ipv6_ip = TRUE;
-
/* cut off the brackets! */
hostname++;
hlen = strlen(hostname);
hostname[hlen - 1] = 0;
- if(!uc && zoneid) {
- char *endp;
- unsigned long scope;
- scope = strtoul(zoneid, &endp, 10);
- if(!*endp && (scope < UINT_MAX)) {
- /* A plain number, use it direcly as a scope id. */
- conn->scope_id = (unsigned int)scope;
- }
-#ifdef HAVE_IF_NAMETOINDEX
- else {
- /* Zone identifier is not numeric */
- unsigned int scopeidx = 0;
- scopeidx = if_nametoindex(zoneid);
- if(!scopeidx)
- infof(data, "Invalid zoneid id: %s; %s\n", zoneid,
- strerror(errno));
- else
- conn->scope_id = scopeidx;
- }
-#endif /* HAVE_IF_NAMETOINDEX */
- free(zoneid);
- }
+ zonefrom_url(uh, conn);
}
/* make sure the connect struct gets its own copy of the host name */
- conn->host.rawalloc = strdup(hostname);
+ conn->host.rawalloc = strdup(hostname ? hostname : "");
if(!conn->host.rawalloc)
return CURLE_OUT_OF_MEMORY;
conn->host.name = conn->host.rawalloc;
@@ -2097,7 +1998,6 @@ static CURLcode setup_connection_internals(struct connectdata *conn)
{
const struct Curl_handler * p;
CURLcode result;
- conn->socktype = SOCK_STREAM; /* most of them are TCP streams */
/* Perform setup complement if some. */
p = conn->handler;
@@ -2128,6 +2028,11 @@ void Curl_free_request_state(struct Curl_easy *data)
{
Curl_safefree(data->req.protop);
Curl_safefree(data->req.newurl);
+
+#ifndef CURL_DISABLE_DOH
+ Curl_close(&data->req.doh.probe[0].easy);
+ Curl_close(&data->req.doh.probe[1].easy);
+#endif
}
@@ -2298,7 +2203,7 @@ static CURLcode parse_proxy(struct Curl_easy *data,
struct connectdata *conn, char *proxy,
curl_proxytype proxytype)
{
- char *portptr;
+ char *portptr = NULL;
long port = -1;
char *proxyuser = NULL;
char *proxypasswd = NULL;
@@ -2422,6 +2327,7 @@ static CURLcode parse_proxy(struct Curl_easy *data,
size_t len = strlen(host);
host[len-1] = 0; /* clear the trailing bracket */
host++;
+ zonefrom_url(uhp, conn);
}
proxyinfo->host.name = host;
@@ -2846,8 +2752,7 @@ static CURLcode override_login(struct Curl_easy *data,
&netrc_user_changed, &netrc_passwd_changed,
data->set.str[STRING_NETRC_FILE]);
if(ret > 0) {
- infof(data, "Couldn't find host %s in the "
- DOT_CHAR "netrc file; using defaults\n",
+ infof(data, "Couldn't find host %s in the .netrc file; using defaults\n",
conn->host.name);
}
else if(ret < 0) {
@@ -2913,13 +2818,6 @@ static CURLcode set_login(struct connectdata *conn)
result = CURLE_OUT_OF_MEMORY;
}
- /* if there's a user without password, consider password blank */
- if(conn->user && !conn->passwd) {
- conn->passwd = strdup("");
- if(!conn->passwd)
- result = CURLE_OUT_OF_MEMORY;
- }
-
return result;
}
@@ -3144,26 +3042,65 @@ static CURLcode parse_connect_to_slist(struct Curl_easy *data,
if(data->asi && !host && (port == -1) &&
(conn->handler->protocol == CURLPROTO_HTTPS)) {
/* no connect_to match, try alt-svc! */
- const char *nhost;
- int nport;
- enum alpnid nalpnid;
+ enum alpnid srcalpnid;
bool hit;
+ struct altsvc *as;
+ const int allowed_versions = ( ALPN_h1
+#ifdef USE_NGHTTP2
+ | ALPN_h2
+#endif
+#ifdef ENABLE_QUIC
+ | ALPN_h3
+#endif
+ ) & data->asi->flags;
+
host = conn->host.rawalloc;
+#ifdef USE_NGHTTP2
+ /* with h2 support, check that first */
+ srcalpnid = ALPN_h2;
hit = Curl_altsvc_lookup(data->asi,
- ALPN_h1, host, conn->remote_port, /* from */
- &nalpnid, &nhost, &nport /* to */);
+ srcalpnid, host, conn->remote_port, /* from */
+ &as /* to */,
+ allowed_versions);
+ if(!hit)
+#endif
+ {
+ srcalpnid = ALPN_h1;
+ hit = Curl_altsvc_lookup(data->asi,
+ srcalpnid, host, conn->remote_port, /* from */
+ &as /* to */,
+ allowed_versions);
+ }
if(hit) {
- char *hostd = strdup((char *)nhost);
+ char *hostd = strdup((char *)as->dst.host);
if(!hostd)
return CURLE_OUT_OF_MEMORY;
conn->conn_to_host.rawalloc = hostd;
conn->conn_to_host.name = hostd;
conn->bits.conn_to_host = TRUE;
- conn->conn_to_port = nport;
+ conn->conn_to_port = as->dst.port;
conn->bits.conn_to_port = TRUE;
+ conn->bits.altused = TRUE;
infof(data, "Alt-svc connecting from [%s]%s:%d to [%s]%s:%d\n",
- Curl_alpnid2str(ALPN_h1), host, conn->remote_port,
- Curl_alpnid2str(nalpnid), hostd, nport);
+ Curl_alpnid2str(srcalpnid), host, conn->remote_port,
+ Curl_alpnid2str(as->dst.alpnid), hostd, as->dst.port);
+ if(srcalpnid != as->dst.alpnid) {
+ /* protocol version switch */
+ switch(as->dst.alpnid) {
+ case ALPN_h1:
+ conn->httpversion = 11;
+ break;
+ case ALPN_h2:
+ conn->httpversion = 20;
+ break;
+ case ALPN_h3:
+ conn->transport = TRNSPRT_QUIC;
+ conn->httpversion = 30;
+ break;
+ default: /* shouldn't be possible */
+ break;
+ }
+ }
}
}
#endif
@@ -3300,8 +3237,8 @@ static CURLcode resolve_server(struct Curl_easy *data,
static void reuse_conn(struct connectdata *old_conn,
struct connectdata *conn)
{
- free_idnconverted_hostname(&old_conn->http_proxy.host);
- free_idnconverted_hostname(&old_conn->socks_proxy.host);
+ Curl_free_idnconverted_hostname(&old_conn->http_proxy.host);
+ Curl_free_idnconverted_hostname(&old_conn->socks_proxy.host);
free(old_conn->http_proxy.host.rawalloc);
free(old_conn->socks_proxy.host.rawalloc);
@@ -3345,8 +3282,8 @@ static void reuse_conn(struct connectdata *old_conn,
/* host can change, when doing keepalive with a proxy or if the case is
different this time etc */
- free_idnconverted_hostname(&conn->host);
- free_idnconverted_hostname(&conn->conn_to_host);
+ Curl_free_idnconverted_hostname(&conn->host);
+ Curl_free_idnconverted_hostname(&conn->conn_to_host);
Curl_safefree(conn->host.rawalloc);
Curl_safefree(conn->conn_to_host.rawalloc);
conn->host = old_conn->host;
@@ -3442,9 +3379,9 @@ static CURLcode create_conn(struct Curl_easy *data,
if(result)
goto out;
- if(data->set.str[STRING_BEARER]) {
- conn->oauth_bearer = strdup(data->set.str[STRING_BEARER]);
- if(!conn->oauth_bearer) {
+ if(data->set.str[STRING_SASL_AUTHZID]) {
+ conn->sasl_authzid = strdup(data->set.str[STRING_SASL_AUTHZID]);
+ if(!conn->sasl_authzid) {
result = CURLE_OUT_OF_MEMORY;
goto out;
}
@@ -3505,21 +3442,21 @@ static CURLcode create_conn(struct Curl_easy *data,
/*************************************************************
* IDN-convert the hostnames
*************************************************************/
- result = idnconvert_hostname(conn, &conn->host);
+ result = Curl_idnconvert_hostname(conn, &conn->host);
if(result)
goto out;
if(conn->bits.conn_to_host) {
- result = idnconvert_hostname(conn, &conn->conn_to_host);
+ result = Curl_idnconvert_hostname(conn, &conn->conn_to_host);
if(result)
goto out;
}
if(conn->bits.httpproxy) {
- result = idnconvert_hostname(conn, &conn->http_proxy.host);
+ result = Curl_idnconvert_hostname(conn, &conn->http_proxy.host);
if(result)
goto out;
}
if(conn->bits.socksproxy) {
- result = idnconvert_hostname(conn, &conn->socks_proxy.host);
+ result = Curl_idnconvert_hostname(conn, &conn->socks_proxy.host);
if(result)
goto out;
}
@@ -3631,6 +3568,10 @@ static CURLcode create_conn(struct Curl_easy *data,
data->set.str[STRING_SSL_CIPHER13_LIST_ORIG];
data->set.proxy_ssl.primary.cipher_list13 =
data->set.str[STRING_SSL_CIPHER13_LIST_PROXY];
+ data->set.ssl.primary.pinned_key =
+ data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG];
+ data->set.proxy_ssl.primary.pinned_key =
+ data->set.str[STRING_SSL_PINNEDPUBLICKEY_PROXY];
data->set.ssl.CRLfile = data->set.str[STRING_SSL_CRLFILE_ORIG];
data->set.proxy_ssl.CRLfile = data->set.str[STRING_SSL_CRLFILE_PROXY];
@@ -3688,25 +3629,6 @@ static CURLcode create_conn(struct Curl_easy *data,
else
reuse = ConnectionExists(data, conn, &conn_temp, &force_reuse, &waitpipe);
- /* If we found a reusable connection that is now marked as in use, we may
- still want to open a new connection if we are multiplexing. */
- if(reuse && !force_reuse && IsMultiplexingPossible(data, conn_temp)) {
- size_t multiplexed = CONN_INUSE(conn_temp);
- if(multiplexed > 0) {
- infof(data, "Found connection %ld, with %zu requests on it\n",
- conn_temp->connection_id, multiplexed);
-
- if(Curl_conncache_bundle_size(conn_temp) < max_host_connections &&
- Curl_conncache_size(data) < max_total_connections) {
- /* We want a new connection anyway */
- reuse = FALSE;
-
- infof(data, "We can reuse, but we want a new connection anyway\n");
- Curl_conncache_return_conn(conn_temp);
- }
- }
- }
-
if(reuse) {
/*
* We already have a connection for this, we got the former connection
@@ -3749,8 +3671,9 @@ static CURLcode create_conn(struct Curl_easy *data,
connections_available = FALSE;
else {
/* this gets a lock on the conncache */
+ const char *bundlehost;
struct connectbundle *bundle =
- Curl_conncache_find_bundle(conn, data->state.conn_cache);
+ Curl_conncache_find_bundle(conn, data->state.conn_cache, &bundlehost);
if(max_host_connections > 0 && bundle &&
(bundle->num_connections >= max_host_connections)) {
@@ -3764,8 +3687,8 @@ static CURLcode create_conn(struct Curl_easy *data,
(void)Curl_disconnect(data, conn_candidate,
/* dead_connection */ FALSE);
else {
- infof(data, "No more connections allowed to host: %zu\n",
- max_host_connections);
+ infof(data, "No more connections allowed to host %s: %zu\n",
+ bundlehost, max_host_connections);
connections_available = FALSE;
}
}
@@ -3926,7 +3849,9 @@ CURLcode Curl_setup_conn(struct connectdata *conn,
}
else {
Curl_pgrsTime(data, TIMER_CONNECT); /* we're connected already */
- Curl_pgrsTime(data, TIMER_APPCONNECT); /* we're connected already */
+ if(conn->ssl[FIRSTSOCKET].use ||
+ (conn->handler->protocol & PROTO_FAMILY_SSH))
+ Curl_pgrsTime(data, TIMER_APPCONNECT); /* we're connected already */
conn->bits.tcpconnect[FIRSTSOCKET] = TRUE;
*protocol_done = TRUE;
Curl_updateconninfo(conn, conn->sock[FIRSTSOCKET]);
@@ -4147,34 +4072,3 @@ static unsigned int get_protocol_family(unsigned int protocol)
return family;
}
-
-
-/*
- * Wrapper to call functions in Curl_conncache_foreach()
- *
- * Returns always 0.
- */
-static int conn_upkeep(struct connectdata *conn,
- void *param)
-{
- /* Param is unused. */
- (void)param;
-
- if(conn->handler->connection_check) {
- /* Do a protocol-specific keepalive check on the connection. */
- conn->handler->connection_check(conn, CONNCHECK_KEEPALIVE);
- }
-
- return 0; /* continue iteration */
-}
-
-CURLcode Curl_upkeep(struct conncache *conn_cache,
- void *data)
-{
- /* Loop over every connection and make connection alive. */
- Curl_conncache_foreach(data,
- conn_cache,
- data,
- conn_upkeep);
- return CURLE_OK;
-}
diff --git a/Utilities/cmcurl/lib/url.h b/Utilities/cmcurl/lib/url.h
index 4db9e86..5000c51 100644
--- a/Utilities/cmcurl/lib/url.h
+++ b/Utilities/cmcurl/lib/url.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -48,40 +48,29 @@ CURLcode Curl_open(struct Curl_easy **curl);
CURLcode Curl_init_userdefined(struct Curl_easy *data);
void Curl_freeset(struct Curl_easy * data);
-/* free the URL pieces */
-void Curl_up_free(struct Curl_easy *data);
CURLcode Curl_uc_to_curlcode(CURLUcode uc);
-CURLcode Curl_close(struct Curl_easy *data); /* opposite of curl_open() */
+CURLcode Curl_close(struct Curl_easy **datap); /* opposite of curl_open() */
CURLcode Curl_connect(struct Curl_easy *, bool *async, bool *protocol_connect);
CURLcode Curl_disconnect(struct Curl_easy *data,
struct connectdata *, bool dead_connection);
-CURLcode Curl_protocol_connect(struct connectdata *conn, bool *done);
-CURLcode Curl_protocol_connecting(struct connectdata *conn, bool *done);
-CURLcode Curl_protocol_doing(struct connectdata *conn, bool *done);
CURLcode Curl_setup_conn(struct connectdata *conn,
bool *protocol_done);
void Curl_free_request_state(struct Curl_easy *data);
-
-int Curl_protocol_getsock(struct connectdata *conn,
- curl_socket_t *socks,
- int numsocks);
-int Curl_doing_getsock(struct connectdata *conn,
- curl_socket_t *socks,
- int numsocks);
CURLcode Curl_parse_login_details(const char *login, const size_t len,
char **userptr, char **passwdptr,
char **optionsptr);
-void Curl_close_connections(struct Curl_easy *data);
-CURLcode Curl_upkeep(struct conncache *conn_cache, void *data);
const struct Curl_handler *Curl_builtin_scheme(const char *scheme);
+bool Curl_is_ASCII_name(const char *hostname);
+CURLcode Curl_idnconvert_hostname(struct connectdata *conn,
+ struct hostname *host);
+void Curl_free_idnconverted_hostname(struct hostname *host);
+
#define CURL_DEFAULT_PROXY_PORT 1080 /* default proxy port unless specified */
#define CURL_DEFAULT_HTTPS_PROXY_PORT 443 /* default https proxy port unless
specified */
-CURLcode Curl_connected_proxy(struct connectdata *conn, int sockindex);
-
#ifdef CURL_DISABLE_VERBOSE_STRINGS
#define Curl_verboseconnect(x) Curl_nop_stmt
#else
diff --git a/Utilities/cmcurl/lib/urlapi-int.h b/Utilities/cmcurl/lib/urlapi-int.h
index 5f059c2..d14d53d 100644
--- a/Utilities/cmcurl/lib/urlapi-int.h
+++ b/Utilities/cmcurl/lib/urlapi-int.h
@@ -26,9 +26,6 @@
#define MAX_SCHEME_LEN 40
bool Curl_is_absolute_url(const char *url, char *scheme, size_t buflen);
-char *Curl_concat_url(const char *base, const char *relurl);
-size_t Curl_strlen_url(const char *url, bool relative);
-void Curl_strcpy_url(char *output, const char *url, bool relative);
#ifdef DEBUGBUILD
CURLUcode Curl_parse_port(struct Curl_URL *u, char *hostname);
diff --git a/Utilities/cmcurl/lib/urlapi.c b/Utilities/cmcurl/lib/urlapi.c
index d07e4f5..506e244 100644
--- a/Utilities/cmcurl/lib/urlapi.c
+++ b/Utilities/cmcurl/lib/urlapi.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -29,6 +29,7 @@
#include "url.h"
#include "escape.h"
#include "curl_ctype.h"
+#include "inet_pton.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
@@ -63,6 +64,7 @@ struct Curl_URL {
char *fragment;
char *scratch; /* temporary scratch area */
+ char *temppath; /* temporary path pointer */
long portnum; /* the numerical version */
};
@@ -81,6 +83,7 @@ static void free_urlhandle(struct Curl_URL *u)
free(u->query);
free(u->fragment);
free(u->scratch);
+ free(u->temppath);
}
/* move the full contents of one handle onto another and
@@ -350,7 +353,7 @@ static char *concat_url(const char *base, const char *relurl)
else {
/* We got a new absolute path for this server */
- if((relurl[0] == '/') && (relurl[1] == '/')) {
+ if(relurl[1] == '/') {
/* the new URL starts with //, just keep the protocol part from the
original one */
*protsep = 0;
@@ -425,7 +428,6 @@ static char *concat_url(const char *base, const char *relurl)
*
*/
static CURLUcode parse_hostname_login(struct Curl_URL *u,
- const struct Curl_handler *h,
char **hostname,
unsigned int flags)
{
@@ -434,6 +436,7 @@ static CURLUcode parse_hostname_login(struct Curl_URL *u,
char *userp = NULL;
char *passwdp = NULL;
char *optionsp = NULL;
+ const struct Curl_handler *h = NULL;
/* At this point, we're hoping all the other special cases have
* been taken care of, so conn->host.name is at most
@@ -453,6 +456,10 @@ static CURLUcode parse_hostname_login(struct Curl_URL *u,
* ftp://user:password@ftp.my.site:8021/README */
*hostname = ++ptr;
+ /* if this is a known scheme, get some details */
+ if(u->scheme)
+ h = Curl_builtin_scheme(u->scheme);
+
/* We could use the login information in the URL so extract it. Only parse
options if the handler says we should. Note that 'h' might be NULL! */
ccode = Curl_parse_login_details(login, ptr - login - 1,
@@ -568,7 +575,7 @@ UNITTEST CURLUcode Curl_parse_port(struct Curl_URL *u, char *hostname)
}
/* scan for byte values < 31 or 127 */
-static CURLUcode junkscan(char *part)
+static CURLUcode junkscan(const char *part)
{
if(part) {
static const char badbytes[]={
@@ -591,20 +598,26 @@ static CURLUcode junkscan(char *part)
static CURLUcode hostname_check(struct Curl_URL *u, char *hostname)
{
- const char *l = NULL; /* accepted characters */
size_t len;
size_t hlen = strlen(hostname);
if(hostname[0] == '[') {
+#ifdef ENABLE_IPV6
+ char dest[16]; /* fits a binary IPv6 address */
+#endif
+ const char *l = "0123456789abcdefABCDEF:.";
+ if(hlen < 5) /* '[::1]' is the shortest possible valid string */
+ return CURLUE_MALFORMED_INPUT;
hostname++;
- l = "0123456789abcdefABCDEF::.";
hlen -= 2;
- }
- if(l) {
+ if(hostname[hlen] != ']')
+ return CURLUE_MALFORMED_INPUT;
+
/* only valid letters are ok */
len = strspn(hostname, l);
if(hlen != len) {
+ hlen = len;
if(hostname[len] == '%') {
/* this could now be '%[zone id]' */
char zoneid[16];
@@ -628,6 +641,12 @@ static CURLUcode hostname_check(struct Curl_URL *u, char *hostname)
return CURLUE_MALFORMED_INPUT;
/* hostname is fine */
}
+#ifdef ENABLE_IPV6
+ hostname[hlen] = 0; /* end the address there */
+ if(1 != Curl_inet_pton(AF_INET6, hostname, dest))
+ return CURLUE_MALFORMED_INPUT;
+ hostname[hlen] = ']'; /* restore ending bracket */
+#endif
}
else {
/* letters from the second string is not ok */
@@ -653,10 +672,9 @@ static CURLUcode seturl(const char *url, CURLU *u, unsigned int flags)
CURLUcode result;
bool url_has_scheme = FALSE;
char schemebuf[MAX_SCHEME_LEN + 1];
- char *schemep = NULL;
+ const char *schemep = NULL;
size_t schemelen = 0;
size_t urllen;
- const struct Curl_handler *h = NULL;
if(!url)
return CURLUE_MALFORMED_INPUT;
@@ -775,6 +793,7 @@ static CURLUcode seturl(const char *url, CURLU *u, unsigned int flags)
if(junkscan(schemep))
return CURLUE_MALFORMED_INPUT;
+
}
else {
/* no scheme! */
@@ -782,7 +801,7 @@ static CURLUcode seturl(const char *url, CURLU *u, unsigned int flags)
if(!(flags & (CURLU_DEFAULT_SCHEME|CURLU_GUESS_SCHEME)))
return CURLUE_MALFORMED_INPUT;
if(flags & CURLU_DEFAULT_SCHEME)
- schemep = (char *) DEFAULT_SCHEME;
+ schemep = DEFAULT_SCHEME;
/*
* The URL was badly formatted, let's try without scheme specified.
@@ -795,74 +814,83 @@ static CURLUcode seturl(const char *url, CURLU *u, unsigned int flags)
p++;
len = p - hostp;
- if(!len)
- return CURLUE_MALFORMED_INPUT;
-
- memcpy(hostname, hostp, len);
- hostname[len] = 0;
-
- if((flags & CURLU_GUESS_SCHEME) && !schemep) {
- /* legacy curl-style guess based on host name */
- if(checkprefix("ftp.", hostname))
- schemep = (char *)"ftp";
- else if(checkprefix("dict.", hostname))
- schemep = (char *)"dict";
- else if(checkprefix("ldap.", hostname))
- schemep = (char *)"ldap";
- else if(checkprefix("imap.", hostname))
- schemep = (char *)"imap";
- else if(checkprefix("smtp.", hostname))
- schemep = (char *)"smtp";
- else if(checkprefix("pop3.", hostname))
- schemep = (char *)"pop3";
- else
- schemep = (char *)"http";
+ if(len) {
+ memcpy(hostname, hostp, len);
+ hostname[len] = 0;
+ }
+ else {
+ if(!(flags & CURLU_NO_AUTHORITY))
+ return CURLUE_MALFORMED_INPUT;
}
len = strlen(p);
memcpy(path, p, len);
path[len] = 0;
- u->scheme = strdup(schemep);
- if(!u->scheme)
- return CURLUE_OUT_OF_MEMORY;
+ if(schemep) {
+ u->scheme = strdup(schemep);
+ if(!u->scheme)
+ return CURLUE_OUT_OF_MEMORY;
+ }
}
- /* if this is a known scheme, get some details */
- h = Curl_builtin_scheme(u->scheme);
-
if(junkscan(path))
return CURLUE_MALFORMED_INPUT;
- query = strchr(path, '?');
- if(query)
- *query++ = 0;
+ if((flags & CURLU_URLENCODE) && path[0]) {
+ /* worst case output length is 3x the original! */
+ char *newp = malloc(strlen(path) * 3);
+ if(!newp)
+ return CURLUE_OUT_OF_MEMORY;
+ path_alloced = TRUE;
+ strcpy_url(newp, path, TRUE); /* consider it relative */
+ u->temppath = path = newp;
+ }
- fragment = strchr(query?query:path, '#');
- if(fragment)
+ fragment = strchr(path, '#');
+ if(fragment) {
*fragment++ = 0;
+ if(fragment[0]) {
+ u->fragment = strdup(fragment);
+ if(!u->fragment)
+ return CURLUE_OUT_OF_MEMORY;
+ }
+ }
+
+ query = strchr(path, '?');
+ if(query) {
+ *query++ = 0;
+ /* done even if the query part is a blank string */
+ u->query = strdup(query);
+ if(!u->query)
+ return CURLUE_OUT_OF_MEMORY;
+ }
if(!path[0])
- /* if there's no path set, unset */
+ /* if there's no path left set, unset */
path = NULL;
- else if(!(flags & CURLU_PATH_AS_IS)) {
- /* sanitise paths and remove ../ and ./ sequences according to RFC3986 */
- char *newp = Curl_dedotdotify(path);
- if(!newp)
- return CURLUE_OUT_OF_MEMORY;
+ else {
+ if(!(flags & CURLU_PATH_AS_IS)) {
+ /* remove ../ and ./ sequences according to RFC3986 */
+ char *newp = Curl_dedotdotify(path);
+ if(!newp)
+ return CURLUE_OUT_OF_MEMORY;
- if(strcmp(newp, path)) {
- /* if we got a new version */
- path = newp;
- path_alloced = TRUE;
+ if(strcmp(newp, path)) {
+ /* if we got a new version */
+ if(path_alloced)
+ Curl_safefree(u->temppath);
+ u->temppath = path = newp;
+ path_alloced = TRUE;
+ }
+ else
+ free(newp);
}
- else
- free(newp);
- }
- if(path) {
+
u->path = path_alloced?path:strdup(path);
if(!u->path)
return CURLUE_OUT_OF_MEMORY;
+ u->temppath = NULL; /* used now */
}
if(hostname) {
@@ -872,7 +900,7 @@ static CURLUcode seturl(const char *url, CURLU *u, unsigned int flags)
if(junkscan(hostname))
return CURLUE_MALFORMED_INPUT;
- result = parse_hostname_login(u, h, &hostname, flags);
+ result = parse_hostname_login(u, &hostname, flags);
if(result)
return result;
@@ -880,28 +908,44 @@ static CURLUcode seturl(const char *url, CURLU *u, unsigned int flags)
if(result)
return result;
- result = hostname_check(u, hostname);
- if(result)
- return result;
+ if(0 == strlen(hostname) && (flags & CURLU_NO_AUTHORITY)) {
+ /* Skip hostname check, it's allowed to be empty. */
+ }
+ else {
+ result = hostname_check(u, hostname);
+ if(result)
+ return result;
+ }
u->host = strdup(hostname);
if(!u->host)
return CURLUE_OUT_OF_MEMORY;
- }
- if(query) {
- u->query = strdup(query);
- if(!u->query)
- return CURLUE_OUT_OF_MEMORY;
- }
- if(fragment && fragment[0]) {
- u->fragment = strdup(fragment);
- if(!u->fragment)
- return CURLUE_OUT_OF_MEMORY;
+ if((flags & CURLU_GUESS_SCHEME) && !schemep) {
+ /* legacy curl-style guess based on host name */
+ if(checkprefix("ftp.", hostname))
+ schemep = "ftp";
+ else if(checkprefix("dict.", hostname))
+ schemep = "dict";
+ else if(checkprefix("ldap.", hostname))
+ schemep = "ldap";
+ else if(checkprefix("imap.", hostname))
+ schemep = "imap";
+ else if(checkprefix("smtp.", hostname))
+ schemep = "smtp";
+ else if(checkprefix("pop3.", hostname))
+ schemep = "pop3";
+ else
+ schemep = "http";
+
+ u->scheme = strdup(schemep);
+ if(!u->scheme)
+ return CURLUE_OUT_OF_MEMORY;
+ }
}
- free(u->scratch);
- u->scratch = NULL;
+ Curl_safefree(u->scratch);
+ Curl_safefree(u->temppath);
return CURLUE_OK;
}
@@ -1066,24 +1110,23 @@ CURLUcode curl_url_get(CURLU *u, CURLUPart what,
else
return CURLUE_NO_SCHEME;
- if(scheme) {
- h = Curl_builtin_scheme(scheme);
- if(!port && (flags & CURLU_DEFAULT_PORT)) {
- /* there's no stored port number, but asked to deliver
- a default one for the scheme */
- if(h) {
- msnprintf(portbuf, sizeof(portbuf), "%ld", h->defport);
- port = portbuf;
- }
- }
- else if(port) {
- /* there is a stored port number, but asked to inhibit if it matches
- the default one for the scheme */
- if(h && (h->defport == u->portnum) &&
- (flags & CURLU_NO_DEFAULT_PORT))
- port = NULL;
+ h = Curl_builtin_scheme(scheme);
+ if(!port && (flags & CURLU_DEFAULT_PORT)) {
+ /* there's no stored port number, but asked to deliver
+ a default one for the scheme */
+ if(h) {
+ msnprintf(portbuf, sizeof(portbuf), "%ld", h->defport);
+ port = portbuf;
}
}
+ else if(port) {
+ /* there is a stored port number, but asked to inhibit if it matches
+ the default one for the scheme */
+ if(h && (h->defport == u->portnum) &&
+ (flags & CURLU_NO_DEFAULT_PORT))
+ port = NULL;
+ }
+
if(h && !(h->flags & PROTOPT_URLOPTIONS))
options = NULL;
@@ -1331,7 +1374,8 @@ CURLUcode curl_url_set(CURLU *u, CURLUPart what,
default:
return CURLUE_UNKNOWN_PART;
}
- if(storep) {
+ DEBUGASSERT(storep);
+ {
const char *newp = part;
size_t nalloc = strlen(part);
@@ -1423,9 +1467,14 @@ CURLUcode curl_url_set(CURLU *u, CURLUPart what,
}
if(what == CURLUPART_HOST) {
- if(hostname_check(u, (char *)newp)) {
- free((char *)newp);
- return CURLUE_MALFORMED_INPUT;
+ if(0 == strlen(newp) && (flags & CURLU_NO_AUTHORITY)) {
+ /* Skip hostname check, it's allowed to be empty. */
+ }
+ else {
+ if(hostname_check(u, (char *)newp)) {
+ free((char *)newp);
+ return CURLUE_MALFORMED_INPUT;
+ }
}
}
diff --git a/Utilities/cmcurl/lib/urldata.h b/Utilities/cmcurl/lib/urldata.h
index d759592..e1348cf 100644
--- a/Utilities/cmcurl/lib/urldata.h
+++ b/Utilities/cmcurl/lib/urldata.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -68,6 +68,7 @@
#define PROTO_FAMILY_POP3 (CURLPROTO_POP3|CURLPROTO_POP3S)
#define PROTO_FAMILY_SMB (CURLPROTO_SMB|CURLPROTO_SMBS)
#define PROTO_FAMILY_SMTP (CURLPROTO_SMTP|CURLPROTO_SMTPS)
+#define PROTO_FAMILY_SSH (CURLPROTO_SCP|CURLPROTO_SFTP)
#define DEFAULT_CONNCACHE_SIZE 5
@@ -123,12 +124,13 @@ typedef ssize_t (Curl_recv)(struct connectdata *conn, /* connection data */
#include "smtp.h"
#include "ftp.h"
#include "file.h"
-#include "ssh.h"
+#include "vssh/ssh.h"
#include "http.h"
#include "rtsp.h"
#include "smb.h"
#include "wildcard.h"
#include "multihandle.h"
+#include "quic.h"
#ifdef HAVE_GSSAPI
# ifdef HAVE_GSSGNU
@@ -157,7 +159,13 @@ typedef ssize_t (Curl_recv)(struct connectdata *conn, /* connection data */
((x) && ((x)->magic == CURLEASY_MAGIC_NUMBER))
/* the type we use for storing a single boolean bit */
+#ifdef _MSC_VER
+typedef bool bit;
+#define BIT(x) bool x
+#else
typedef unsigned int bit;
+#define BIT(x) bit x:1
+#endif
#ifdef HAVE_GSSAPI
/* Types needed for krb5-ftp connections */
@@ -165,7 +173,7 @@ struct krb5buffer {
void *data;
size_t size;
size_t index;
- bit eof_flag:1;
+ BIT(eof_flag);
};
enum protection_level {
@@ -208,7 +216,7 @@ struct ssl_connect_data {
#if defined(USE_SSL)
struct ssl_backend_data *backend;
#endif
- bit use:1;
+ BIT(use);
};
struct ssl_primary_config {
@@ -221,10 +229,11 @@ struct ssl_primary_config {
char *egdsocket; /* path to file containing the EGD daemon socket */
char *cipher_list; /* list of ciphers to use */
char *cipher_list13; /* list of TLS 1.3 cipher suites to use */
- bit verifypeer:1; /* set TRUE if this is desired */
- bit verifyhost:1; /* set TRUE if CN/SAN must match hostname */
- bit verifystatus:1; /* set TRUE if certificate status must be checked */
- bit sessionid:1; /* cache session IDs or not */
+ char *pinned_key;
+ BIT(verifypeer); /* set TRUE if this is desired */
+ BIT(verifyhost); /* set TRUE if CN/SAN must match hostname */
+ BIT(verifystatus); /* set TRUE if certificate status must be checked */
+ BIT(sessionid); /* cache session IDs or not */
};
struct ssl_config_data {
@@ -244,10 +253,11 @@ struct ssl_config_data {
char *password; /* TLS password (for, e.g., SRP) */
enum CURL_TLSAUTH authtype; /* TLS authentication type (default SRP) */
#endif
- bit certinfo:1; /* gather lots of certificate info */
- bit falsestart:1;
- bit enable_beast:1; /* allow this flaw for interoperability's sake*/
- bit no_revoke:1; /* disable SSL certificate revocation checks */
+ BIT(certinfo); /* gather lots of certificate info */
+ BIT(falsestart);
+ BIT(enable_beast); /* allow this flaw for interoperability's sake*/
+ BIT(no_revoke); /* disable SSL certificate revocation checks */
+ BIT(no_partialchain); /* don't accept partial certificate chains */
};
struct ssl_general_config {
@@ -290,8 +300,8 @@ struct digestdata {
char *qop;
char *algorithm;
int nc; /* nounce count */
- bit stale:1; /* set true for re-negotiation */
- bit userhash:1;
+ BIT(stale); /* set true for re-negotiation */
+ BIT(userhash);
#endif
};
@@ -357,6 +367,14 @@ struct ntlmdata {
unsigned char nonce[8];
void *target_info; /* TargetInfo received in the ntlm type-2 message */
unsigned int target_info_len;
+
+#if defined(NTLM_WB_ENABLED)
+ /* used for communication with Samba's winbind daemon helper ntlm_auth */
+ curl_socket_t ntlm_auth_hlpr_socket;
+ pid_t ntlm_auth_hlpr_pid;
+ char *challenge; /* The received base64 encoded ntlm type-2 message */
+ char *response; /* The generated base64 ntlm type-1/type-3 message */
+#endif
#endif
};
#endif
@@ -385,10 +403,10 @@ struct negotiatedata {
size_t output_token_length;
#endif
#endif
- bool noauthpersist;
- bool havenoauthpersist;
- bool havenegdata;
- bool havemultiplerequests;
+ BIT(noauthpersist);
+ BIT(havenoauthpersist);
+ BIT(havenegdata);
+ BIT(havemultiplerequests);
};
#endif
@@ -402,63 +420,63 @@ struct ConnectBits {
is complete */
bool tcpconnect[2]; /* the TCP layer (or similar) is connected, this is set
the first time on the first connect function call */
- bit close:1; /* if set, we close the connection after this request */
- bit reuse:1; /* if set, this is a re-used connection */
- bit conn_to_host:1; /* if set, this connection has a "connect to host"
- that overrides the host in the URL */
- bit conn_to_port:1; /* if set, this connection has a "connect to port"
- that overrides the port in the URL (remote port) */
- bit proxy:1; /* if set, this transfer is done through a proxy - any type */
- bit httpproxy:1; /* if set, this transfer is done through a http proxy */
- bit socksproxy:1; /* if set, this transfer is done through a socks proxy */
- bit user_passwd:1; /* do we use user+password for this connection? */
- bit proxy_user_passwd:1; /* user+password for the proxy? */
- bit ipv6_ip:1; /* we communicate with a remote site specified with pure IPv6
- IP address */
- bit ipv6:1; /* we communicate with a site using an IPv6 address */
- bit do_more:1; /* this is set TRUE if the ->curl_do_more() function is
- supposed to be called, after ->curl_do() */
- bit protoconnstart:1;/* the protocol layer has STARTED its operation after
- the TCP layer connect */
- bit retry:1; /* this connection is about to get closed and then
- re-attempted at another connection. */
- bit tunnel_proxy:1; /* if CONNECT is used to "tunnel" through the proxy.
- This is implicit when SSL-protocols are used through
- proxies, but can also be enabled explicitly by
- apps */
- bit authneg:1; /* TRUE when the auth phase has started, which means
- that we are creating a request with an auth header,
- but it is not the final request in the auth
- negotiation. */
- bit rewindaftersend:1;/* TRUE when the sending couldn't be stopped even
- though it will be discarded. When the whole send
- operation is done, we must call the data rewind
- callback. */
+ BIT(close); /* if set, we close the connection after this request */
+ BIT(reuse); /* if set, this is a re-used connection */
+ BIT(altused); /* this is an alt-svc "redirect" */
+ BIT(conn_to_host); /* if set, this connection has a "connect to host"
+ that overrides the host in the URL */
+ BIT(conn_to_port); /* if set, this connection has a "connect to port"
+ that overrides the port in the URL (remote port) */
+ BIT(proxy); /* if set, this transfer is done through a proxy - any type */
+ BIT(httpproxy); /* if set, this transfer is done through a http proxy */
+ BIT(socksproxy); /* if set, this transfer is done through a socks proxy */
+ BIT(user_passwd); /* do we use user+password for this connection? */
+ BIT(proxy_user_passwd); /* user+password for the proxy? */
+ BIT(ipv6_ip); /* we communicate with a remote site specified with pure IPv6
+ IP address */
+ BIT(ipv6); /* we communicate with a site using an IPv6 address */
+ BIT(do_more); /* this is set TRUE if the ->curl_do_more() function is
+ supposed to be called, after ->curl_do() */
+ BIT(protoconnstart);/* the protocol layer has STARTED its operation after
+ the TCP layer connect */
+ BIT(retry); /* this connection is about to get closed and then
+ re-attempted at another connection. */
+ BIT(tunnel_proxy); /* if CONNECT is used to "tunnel" through the proxy.
+ This is implicit when SSL-protocols are used through
+ proxies, but can also be enabled explicitly by
+ apps */
+ BIT(authneg); /* TRUE when the auth phase has started, which means
+ that we are creating a request with an auth header,
+ but it is not the final request in the auth
+ negotiation. */
+ BIT(rewindaftersend);/* TRUE when the sending couldn't be stopped even
+ though it will be discarded. When the whole send
+ operation is done, we must call the data rewind
+ callback. */
#ifndef CURL_DISABLE_FTP
- bit ftp_use_epsv:1; /* As set with CURLOPT_FTP_USE_EPSV, but if we find out
- EPSV doesn't work we disable it for the forthcoming
- requests */
- bit ftp_use_eprt:1; /* As set with CURLOPT_FTP_USE_EPRT, but if we find out
- EPRT doesn't work we disable it for the forthcoming
- requests */
- bit ftp_use_data_ssl:1; /* Enabled SSL for the data connection */
+ BIT(ftp_use_epsv); /* As set with CURLOPT_FTP_USE_EPSV, but if we find out
+ EPSV doesn't work we disable it for the forthcoming
+ requests */
+ BIT(ftp_use_eprt); /* As set with CURLOPT_FTP_USE_EPRT, but if we find out
+ EPRT doesn't work we disable it for the forthcoming
+ requests */
+ BIT(ftp_use_data_ssl); /* Enabled SSL for the data connection */
#endif
- bit netrc:1; /* name+password provided by netrc */
- bit userpwd_in_url:1; /* name+password found in url */
- bit stream_was_rewound:1; /* The stream was rewound after a request read
- past the end of its response byte boundary */
- bit proxy_connect_closed:1; /* TRUE if a proxy disconnected the connection
- in a CONNECT request with auth, so that
- libcurl should reconnect and continue. */
- bit bound:1; /* set true if bind() has already been done on this socket/
- connection */
- bit type_set:1; /* type= was used in the URL */
- bit multiplex:1; /* connection is multiplexed */
- bit tcp_fastopen:1; /* use TCP Fast Open */
- bit tls_enable_npn:1; /* TLS NPN extension? */
- bit tls_enable_alpn:1; /* TLS ALPN extension? */
- bit socksproxy_connecting:1; /* connecting through a socks proxy */
- bit connect_only:1;
+ BIT(netrc); /* name+password provided by netrc */
+ BIT(userpwd_in_url); /* name+password found in url */
+ BIT(stream_was_rewound); /* The stream was rewound after a request read
+ past the end of its response byte boundary */
+ BIT(proxy_connect_closed); /* TRUE if a proxy disconnected the connection
+ in a CONNECT request with auth, so that
+ libcurl should reconnect and continue. */
+ BIT(bound); /* set true if bind() has already been done on this socket/
+ connection */
+ BIT(type_set); /* type= was used in the URL */
+ BIT(multiplex); /* connection is multiplexed */
+ BIT(tcp_fastopen); /* use TCP Fast Open */
+ BIT(tls_enable_npn); /* TLS NPN extension? */
+ BIT(tls_enable_alpn); /* TLS ALPN extension? */
+ BIT(connect_only);
};
struct hostname {
@@ -491,7 +509,7 @@ struct Curl_async {
struct Curl_dns_entry *dns;
int status; /* if done is TRUE, this is the status from the callback */
void *os_specific; /* 'struct thread_data' for Windows */
- bit done:1; /* set TRUE when the lookup is complete */
+ BIT(done); /* set TRUE when the lookup is complete */
};
#define FIRSTSOCKET 0
@@ -518,6 +536,24 @@ enum upgrade101 {
UPGR101_WORKING /* talking upgraded protocol */
};
+enum doh_slots {
+ /* Explicit values for first two symbols so as to match hard-coded
+ * constants in existing code
+ */
+ DOH_PROBE_SLOT_IPADDR_V4 = 0, /* make 'V4' stand out for readability */
+ DOH_PROBE_SLOT_IPADDR_V6 = 1, /* 'V6' likewise */
+
+ /* Space here for (possibly build-specific) additional slot definitions */
+
+ /* for example */
+ /* #ifdef WANT_DOH_FOOBAR_TXT */
+ /* DOH_PROBE_SLOT_FOOBAR_TXT, */
+ /* #endif */
+
+ /* AFTER all slot definitions, establish how many we have */
+ DOH_PROBE_SLOTS
+};
+
struct dohresponse {
unsigned char *memory;
size_t size;
@@ -534,7 +570,7 @@ struct dnsprobe {
struct dohdata {
struct curl_slist *headers;
- struct dnsprobe probe[2];
+ struct dnsprobe probe[DOH_PROBE_SLOTS];
unsigned int pending; /* still outstanding requests */
const char *host;
int port;
@@ -612,20 +648,20 @@ struct SingleRequest {
#ifndef CURL_DISABLE_DOH
struct dohdata doh; /* DoH specific data for this request */
#endif
- bit header:1; /* incoming data has HTTP header */
- bit content_range:1; /* set TRUE if Content-Range: was found */
- bit upload_done:1; /* set to TRUE when doing chunked transfer-encoding
- upload and we're uploading the last chunk */
- bit ignorebody:1; /* we read a response-body but we ignore it! */
- bit ignorecl:1; /* This HTTP response has no body so we ignore the
- Content-Length: header */
- bit chunk:1; /* if set, this is a chunked transfer-encoding */
- bit upload_chunky:1; /* set TRUE if we are doing chunked transfer-encoding
- on upload */
- bit getheader:1; /* TRUE if header parsing is wanted */
- bit forbidchunk:1; /* used only to explicitly forbid chunk-upload for
- specific upload buffers. See readmoredata() in http.c
- for details. */
+ BIT(header); /* incoming data has HTTP header */
+ BIT(content_range); /* set TRUE if Content-Range: was found */
+ BIT(upload_done); /* set to TRUE when doing chunked transfer-encoding
+ upload and we're uploading the last chunk */
+ BIT(ignorebody); /* we read a response-body but we ignore it! */
+ BIT(http_bodyless); /* HTTP response status code is between 100 and 199,
+ 204 or 304 */
+ BIT(chunk); /* if set, this is a chunked transfer-encoding */
+ BIT(upload_chunky); /* set TRUE if we are doing chunked transfer-encoding
+ on upload */
+ BIT(getheader); /* TRUE if header parsing is wanted */
+ BIT(forbidchunk); /* used only to explicitly forbid chunk-upload for
+ specific upload buffers. See readmoredata() in http.c
+ for details. */
};
/*
@@ -663,27 +699,23 @@ struct Curl_handler {
/* Called from the multi interface during the PROTOCONNECT phase, and it
should then return a proper fd set */
int (*proto_getsock)(struct connectdata *conn,
- curl_socket_t *socks,
- int numsocks);
+ curl_socket_t *socks);
/* Called from the multi interface during the DOING phase, and it should
then return a proper fd set */
int (*doing_getsock)(struct connectdata *conn,
- curl_socket_t *socks,
- int numsocks);
+ curl_socket_t *socks);
/* Called from the multi interface during the DO_MORE phase, and it should
then return a proper fd set */
int (*domore_getsock)(struct connectdata *conn,
- curl_socket_t *socks,
- int numsocks);
+ curl_socket_t *socks);
/* Called from the multi interface during the DO_DONE, PERFORM and
WAITPERFORM phases, and it should then return a proper fd set. Not setting
this will make libcurl use the generic default one. */
int (*perform_getsock)(const struct connectdata *conn,
- curl_socket_t *socks,
- int numsocks);
+ curl_socket_t *socks);
/* This function *MAY* be set to a protocol-dependent function that is run
* by the curl_disconnect(), as a step in the disconnection. If the handler
@@ -778,8 +810,45 @@ struct http_connect_state {
TUNNEL_CONNECT, /* CONNECT has been sent off */
TUNNEL_COMPLETE /* CONNECT response received completely */
} tunnel_state;
- bit chunked_encoding:1;
- bit close_connection:1;
+ BIT(chunked_encoding);
+ BIT(close_connection);
+};
+
+struct ldapconninfo;
+
+/* for the (SOCKS) connect state machine */
+enum connect_t {
+ CONNECT_INIT,
+ CONNECT_SOCKS_INIT, /* 1 */
+ CONNECT_SOCKS_SEND, /* 2 waiting to send more first data */
+ CONNECT_SOCKS_READ_INIT, /* 3 set up read */
+ CONNECT_SOCKS_READ, /* 4 read server response */
+ CONNECT_GSSAPI_INIT, /* 5 */
+ CONNECT_AUTH_INIT, /* 6 setup outgoing auth buffer */
+ CONNECT_AUTH_SEND, /* 7 send auth */
+ CONNECT_AUTH_READ, /* 8 read auth response */
+ CONNECT_REQ_INIT, /* 9 init SOCKS "request" */
+ CONNECT_RESOLVING, /* 10 */
+ CONNECT_RESOLVED, /* 11 */
+ CONNECT_RESOLVE_REMOTE, /* 12 */
+ CONNECT_REQ_SEND, /* 13 */
+ CONNECT_REQ_SENDING, /* 14 */
+ CONNECT_REQ_READ, /* 15 */
+ CONNECT_REQ_READ_MORE, /* 16 */
+ CONNECT_DONE /* 17 connected fine to the remote or the SOCKS proxy */
+};
+
+#define SOCKS_STATE(x) (((x) >= CONNECT_SOCKS_INIT) && \
+ ((x) < CONNECT_DONE))
+#define SOCKS_REQUEST_BUFSIZE 600 /* room for large user/pw (255 max each) */
+
+struct connstate {
+ enum connect_t state;
+ unsigned char socksreq[SOCKS_REQUEST_BUFSIZE];
+
+ /* CONNECT_SOCKS_SEND */
+ ssize_t outstanding; /* send this many bytes more */
+ unsigned char *outp; /* send from this pointer */
};
/*
@@ -791,7 +860,7 @@ struct connectdata {
caution that this might very well vary between different times this
connection is used! */
struct Curl_easy *data;
-
+ struct connstate cnnct;
struct curl_llist_element bundle_node; /* conncache */
/* chunk is for HTTP chunked encoding, but is in the general connectdata
@@ -831,7 +900,16 @@ struct connectdata {
unsigned int scope_id; /* Scope id for IPv6 */
- int socktype; /* SOCK_STREAM or SOCK_DGRAM */
+ enum {
+ TRNSPRT_TCP = 3,
+ TRNSPRT_UDP = 4,
+ TRNSPRT_QUIC = 5
+ } transport;
+
+#ifdef ENABLE_QUIC
+ struct quicsocket hequic[2]; /* two, for happy eyeballs! */
+ struct quicsocket *quic;
+#endif
struct hostname host;
char *hostname_resolve; /* host name to resolve to address, allocated */
@@ -870,7 +948,7 @@ struct connectdata {
char *passwd; /* password string, allocated */
char *options; /* options string, allocated */
- char *oauth_bearer; /* bearer token for OAuth 2.0, allocated */
+ char *sasl_authzid; /* authorisation identity string, allocated */
int httpversion; /* the HTTP version*10 reported by the server */
int rtspversion; /* the RTSP version*10 reported by the server */
@@ -881,8 +959,6 @@ struct connectdata {
curl_socket_t sock[2]; /* two sockets, the second is used for the data
transfer when doing FTP */
curl_socket_t tempsock[2]; /* temporary sockets for happy eyeballs */
- bool sock_accepted[2]; /* TRUE if the socket on this index was created with
- accept() */
Curl_recv *recv[2];
Curl_send *send[2];
@@ -904,8 +980,8 @@ struct connectdata {
struct curltime connecttime;
/* The two fields below get set in Curl_connecthost */
int num_addr; /* number of addresses to try to connect to */
- time_t timeoutms_per_addr; /* how long time in milliseconds to spend on
- trying to connect to each IP address */
+ timediff_t timeoutms_per_addr; /* how long time in milliseconds to spend on
+ trying to connect to each IP address */
const struct Curl_handler *handler; /* Connection's protocol handler */
const struct Curl_handler *given; /* The protocol first given */
@@ -942,7 +1018,7 @@ struct connectdata {
} allocptr;
#ifdef HAVE_GSSAPI
- bit sec_complete:1; /* if Kerberos is enabled for this connection */
+ BIT(sec_complete); /* if Kerberos is enabled for this connection */
enum protection_level command_prot;
enum protection_level data_prot;
enum protection_level request_data_prot;
@@ -974,14 +1050,6 @@ struct connectdata {
because it authenticates connections, not
single requests! */
struct ntlmdata proxyntlm; /* NTLM data for proxy */
-
-#if defined(NTLM_WB_ENABLED)
- /* used for communication with Samba's winbind daemon helper ntlm_auth */
- curl_socket_t ntlm_auth_hlpr_socket;
- pid_t ntlm_auth_hlpr_pid;
- char *challenge_header;
- char *response_header;
-#endif
#endif
#ifdef USE_SPNEGO
@@ -1010,7 +1078,8 @@ struct connectdata {
struct smtp_conn smtpc;
struct rtsp_conn rtspc;
struct smb_conn smbc;
- void *generic; /* RTMP and LDAP use this */
+ void *rtmp;
+ struct ldapconninfo *ldapc;
} proto;
int cselect_bits; /* bitmask of socket events */
@@ -1034,16 +1103,18 @@ struct connectdata {
#ifdef USE_UNIX_SOCKETS
char *unix_domain_socket;
- bit abstract_unix_socket:1;
+ BIT(abstract_unix_socket);
#endif
- bit tls_upgraded:1;
+ BIT(tls_upgraded);
/* the two following *_inuse fields are only flags, not counters in any way.
If TRUE it means the channel is in use, and if FALSE it means the channel
is up for grabs by one. */
- bit readchannel_inuse:1; /* whether the read channel is in use by an easy
- handle */
- bit writechannel_inuse:1; /* whether the write channel is in use by an easy
- handle */
+ BIT(readchannel_inuse); /* whether the read channel is in use by an easy
+ handle */
+ BIT(writechannel_inuse); /* whether the write channel is in use by an easy
+ handle */
+ BIT(sock_accepted); /* TRUE if the SECONDARYSOCKET was created with
+ accept() */
};
/* The end of connectdata. */
@@ -1065,6 +1136,7 @@ struct PureInfo {
long numconnects; /* how many new connection did libcurl created */
char *contenttype; /* the content type of the object */
char *wouldredirect; /* URL this would've been redirected to if asked to */
+ curl_off_t retry_after; /* info from Retry-After: header */
/* PureInfo members 'conn_primary_ip', 'conn_primary_port', 'conn_local_ip'
and, 'conn_local_port' are copied over from the connectdata struct in
@@ -1081,11 +1153,11 @@ struct PureInfo {
const char *conn_scheme;
unsigned int conn_protocol;
struct curl_certinfo certs; /* info about the certs, only populated in
- OpenSSL builds. Asked for with
- CURLOPT_CERTINFO / CURLINFO_CERTINFO */
-
- bit timecond:1; /* set to TRUE if the time condition didn't match, which
- thus made the document NOT get fetched */
+ OpenSSL, GnuTLS, Schannel, NSS and GSKit
+ builds. Asked for with CURLOPT_CERTINFO
+ / CURLINFO_CERTINFO */
+ BIT(timecond); /* set to TRUE if the time condition didn't match, which
+ thus made the document NOT get fetched */
};
@@ -1102,17 +1174,17 @@ struct Progress {
int width; /* screen width at download start */
int flags; /* see progress.h */
- time_t timespent;
+ timediff_t timespent;
curl_off_t dlspeed;
curl_off_t ulspeed;
- time_t t_nslookup;
- time_t t_connect;
- time_t t_appconnect;
- time_t t_pretransfer;
- time_t t_starttransfer;
- time_t t_redirect;
+ timediff_t t_nslookup;
+ timediff_t t_connect;
+ timediff_t t_appconnect;
+ timediff_t t_pretransfer;
+ timediff_t t_starttransfer;
+ timediff_t t_redirect;
struct curltime start;
struct curltime t_startsingle;
@@ -1132,8 +1204,8 @@ struct Progress {
curl_off_t speeder[ CURR_TIME ];
struct curltime speeder_time[ CURR_TIME ];
int speeder_c;
- bit callback:1; /* set when progress callback is used */
- bit is_t_startransfer_set:1;
+ BIT(callback); /* set when progress callback is used */
+ BIT(is_t_startransfer_set);
};
typedef enum {
@@ -1181,12 +1253,12 @@ struct auth {
unsigned long picked;
unsigned long avail; /* Bitmask for what the server reports to support for
this resource */
- bit done:1; /* TRUE when the auth phase is done and ready to do the
- *actual* request */
- bit multipass:1; /* TRUE if this is not yet authenticated but within the
- auth multipass negotiation */
- bit iestyle:1; /* TRUE if digest should be done IE-style or FALSE if it
- should be RFC compliant */
+ BIT(done); /* TRUE when the auth phase is done and ready to do the
+ actual request */
+ BIT(multipass); /* TRUE if this is not yet authenticated but within the
+ auth multipass negotiation */
+ BIT(iestyle); /* TRUE if digest should be done IE-style or FALSE if it
+ should be RFC compliant */
};
struct Curl_http2_dep {
@@ -1220,6 +1292,7 @@ typedef enum {
EXPIRE_SPEEDCHECK,
EXPIRE_TIMEOUT,
EXPIRE_TOOFAST,
+ EXPIRE_QUIC,
EXPIRE_LAST /* not an actual timer, used as a marker only */
} expire_id;
@@ -1315,7 +1388,7 @@ struct UrlState {
/* do FTP line-end conversions on most platforms */
#define CURL_DO_LINEEND_CONV
/* for FTP downloads: track CRLF sequences that span blocks */
- bit prev_block_had_trailing_cr:1;
+ BIT(prev_block_had_trailing_cr);
/* for FTP downloads: how many CRLFs did we converted to LFs? */
curl_off_t crlf_conversions;
#endif
@@ -1350,32 +1423,35 @@ struct UrlState {
trailers_state trailers_state; /* whether we are sending trailers
and what stage are we at */
#ifdef CURLDEBUG
- bit conncache_lock:1;
+ BIT(conncache_lock);
#endif
/* when curl_easy_perform() is called, the multi handle is "owned" by
the easy handle so curl_easy_cleanup() on such an easy handle will
also close the multi handle! */
- bit multi_owned_by_easy:1;
+ BIT(multi_owned_by_easy);
- bit this_is_a_follow:1; /* this is a followed Location: request */
- bit refused_stream:1; /* this was refused, try again */
- bit errorbuf:1; /* Set to TRUE if the error buffer is already filled in.
+ BIT(this_is_a_follow); /* this is a followed Location: request */
+ BIT(refused_stream); /* this was refused, try again */
+ BIT(errorbuf); /* Set to TRUE if the error buffer is already filled in.
This must be set to FALSE every time _easy_perform() is
called. */
- bit allow_port:1; /* Is set.use_port allowed to take effect or not. This
+ BIT(allow_port); /* Is set.use_port allowed to take effect or not. This
is always set TRUE when curl_easy_perform() is called. */
- bit authproblem:1; /* TRUE if there's some problem authenticating */
+ BIT(authproblem); /* TRUE if there's some problem authenticating */
/* set after initial USER failure, to prevent an authentication loop */
- bit ftp_trying_alternative:1;
- bit wildcardmatch:1; /* enable wildcard matching */
- bit expect100header:1; /* TRUE if we added Expect: 100-continue */
- bit use_range:1;
- bit rangestringalloc:1; /* the range string is malloc()'ed */
- bit done:1; /* set to FALSE when Curl_init_do() is called and set to TRUE
+ BIT(ftp_trying_alternative);
+ BIT(wildcardmatch); /* enable wildcard matching */
+ BIT(expect100header); /* TRUE if we added Expect: 100-continue */
+ BIT(disableexpect); /* TRUE if Expect: is disabled due to a previous
+ 417 response */
+ BIT(use_range);
+ BIT(rangestringalloc); /* the range string is malloc()'ed */
+ BIT(done); /* set to FALSE when Curl_init_do() is called and set to TRUE
when multi_done() is called, to prevent multi_done() to get
invoked twice when the multi interface is used. */
- bit stream_depends_e:1; /* set or don't set the Exclusive bit */
- bit previouslypending:1; /* this transfer WAS in the multi->pending queue */
+ BIT(stream_depends_e); /* set or don't set the Exclusive bit */
+ BIT(previouslypending); /* this transfer WAS in the multi->pending queue */
+ BIT(cookie_engine);
};
@@ -1393,9 +1469,9 @@ struct DynamicStatic {
curl_easy_setopt(COOKIEFILE) calls */
struct curl_slist *resolve; /* set to point to the set.resolve list when
this should be dealt with in pretransfer */
- bit url_alloc:1; /* URL string is malloc()'ed */
- bit referer_alloc:1; /* referer string is malloc()ed */
- bit wildcard_resolve:1; /* Set to true if any resolve change is a
+ BIT(url_alloc); /* URL string is malloc()'ed */
+ BIT(referer_alloc); /* referer string is malloc()ed */
+ BIT(wildcard_resolve); /* Set to true if any resolve change is a
wildcard */
};
@@ -1410,6 +1486,14 @@ struct DynamicStatic {
struct Curl_multi; /* declared and used only in multi.c */
+/*
+ * This enumeration MUST not use conditional directives (#ifdefs), new
+ * null terminated strings MUST be added to the enumeration immediately
+ * before STRING_LASTZEROTERMINATED, binary fields immediately before
+ * STRING_LAST. When doing so, ensure that the packages/OS400/chkstring.c
+ * test is updated and applicable changes for EBCDIC to ASCII conversion
+ * are catered for in curl_easy_setopt_ccsid()
+ */
enum dupstring {
STRING_CERT_ORIG, /* client certificate file name */
STRING_CERT_PROXY, /* client certificate file name */
@@ -1466,32 +1550,35 @@ enum dupstring {
STRING_RTSP_SESSION_ID, /* Session ID to use */
STRING_RTSP_STREAM_URI, /* Stream URI for this request */
STRING_RTSP_TRANSPORT, /* Transport for this session */
-#ifdef USE_SSH
+
STRING_SSH_PRIVATE_KEY, /* path to the private key file for auth */
STRING_SSH_PUBLIC_KEY, /* path to the public key file for auth */
STRING_SSH_HOST_PUBLIC_KEY_MD5, /* md5 of host public key in ascii hex */
STRING_SSH_KNOWNHOSTS, /* file name of knownhosts file */
-#endif
+
STRING_PROXY_SERVICE_NAME, /* Proxy service name */
STRING_SERVICE_NAME, /* Service name */
STRING_MAIL_FROM,
STRING_MAIL_AUTH,
-#ifdef USE_TLS_SRP
STRING_TLSAUTH_USERNAME_ORIG, /* TLS auth <username> */
STRING_TLSAUTH_USERNAME_PROXY, /* TLS auth <username> */
STRING_TLSAUTH_PASSWORD_ORIG, /* TLS auth <password> */
STRING_TLSAUTH_PASSWORD_PROXY, /* TLS auth <password> */
-#endif
+
STRING_BEARER, /* <bearer>, if used */
-#ifdef USE_UNIX_SOCKETS
+
STRING_UNIX_SOCKET_PATH, /* path to Unix socket, if used */
-#endif
+
STRING_TARGET, /* CURLOPT_REQUEST_TARGET */
STRING_DOH, /* CURLOPT_DOH_URL */
-#ifdef USE_ALTSVC
+
STRING_ALTSVC, /* CURLOPT_ALTSVC */
-#endif
+
+ STRING_SASL_AUTHZID, /* CURLOPT_SASL_AUTHZID */
+
+ STRING_TEMP_URL, /* temp URL storage for proxy use */
+
/* -- end of zero-terminated strings -- */
STRING_LASTZEROTERMINATED,
@@ -1671,84 +1758,84 @@ struct UserDefined {
CURLU *uh; /* URL handle for the current parsed URL */
void *trailer_data; /* pointer to pass to trailer data callback */
curl_trailer_callback trailer_callback; /* trailing data callback */
- bit is_fread_set:1; /* has read callback been set to non-NULL? */
- bit is_fwrite_set:1; /* has write callback been set to non-NULL? */
- bit free_referer:1; /* set TRUE if 'referer' points to a string we
+ BIT(is_fread_set); /* has read callback been set to non-NULL? */
+ BIT(is_fwrite_set); /* has write callback been set to non-NULL? */
+ BIT(free_referer); /* set TRUE if 'referer' points to a string we
allocated */
- bit tftp_no_options:1; /* do not send TFTP options requests */
- bit sep_headers:1; /* handle host and proxy headers separately */
- bit cookiesession:1; /* new cookie session? */
- bit crlf:1; /* convert crlf on ftp upload(?) */
- bit strip_path_slash:1; /* strip off initial slash from path */
- bit ssh_compression:1; /* enable SSH compression */
+ BIT(tftp_no_options); /* do not send TFTP options requests */
+ BIT(sep_headers); /* handle host and proxy headers separately */
+ BIT(cookiesession); /* new cookie session? */
+ BIT(crlf); /* convert crlf on ftp upload(?) */
+ BIT(strip_path_slash); /* strip off initial slash from path */
+ BIT(ssh_compression); /* enable SSH compression */
/* Here follows boolean settings that define how to behave during
this session. They are STATIC, set by libcurl users or at least initially
and they don't change during operations. */
- bit get_filetime:1; /* get the time and get of the remote file */
- bit tunnel_thru_httpproxy:1; /* use CONNECT through a HTTP proxy */
- bit prefer_ascii:1; /* ASCII rather than binary */
- bit ftp_append:1; /* append, not overwrite, on upload */
- bit ftp_list_only:1; /* switch FTP command for listing directories */
+ BIT(get_filetime); /* get the time and get of the remote file */
+ BIT(tunnel_thru_httpproxy); /* use CONNECT through a HTTP proxy */
+ BIT(prefer_ascii); /* ASCII rather than binary */
+ BIT(ftp_append); /* append, not overwrite, on upload */
+ BIT(ftp_list_only); /* switch FTP command for listing directories */
#ifndef CURL_DISABLE_FTP
- bit ftp_use_port:1; /* use the FTP PORT command */
- bit ftp_use_epsv:1; /* if EPSV is to be attempted or not */
- bit ftp_use_eprt:1; /* if EPRT is to be attempted or not */
- bit ftp_use_pret:1; /* if PRET is to be used before PASV or not */
- bit ftp_skip_ip:1; /* skip the IP address the FTP server passes on to
+ BIT(ftp_use_port); /* use the FTP PORT command */
+ BIT(ftp_use_epsv); /* if EPSV is to be attempted or not */
+ BIT(ftp_use_eprt); /* if EPRT is to be attempted or not */
+ BIT(ftp_use_pret); /* if PRET is to be used before PASV or not */
+ BIT(ftp_skip_ip); /* skip the IP address the FTP server passes on to
us */
#endif
- bit hide_progress:1; /* don't use the progress meter */
- bit http_fail_on_error:1; /* fail on HTTP error codes >= 400 */
- bit http_keep_sending_on_error:1; /* for HTTP status codes >= 300 */
- bit http_follow_location:1; /* follow HTTP redirects */
- bit http_transfer_encoding:1; /* request compressed HTTP
- transfer-encoding */
- bit allow_auth_to_other_hosts:1;
- bit include_header:1; /* include received protocol headers in data output */
- bit http_set_referer:1; /* is a custom referer used */
- bit http_auto_referer:1; /* set "correct" referer when following
- location: */
- bit opt_no_body:1; /* as set with CURLOPT_NOBODY */
- bit upload:1; /* upload request */
- bit verbose:1; /* output verbosity */
- bit krb:1; /* Kerberos connection requested */
- bit reuse_forbid:1; /* forbidden to be reused, close after use */
- bit reuse_fresh:1; /* do not re-use an existing connection */
-
- bit no_signal:1; /* do not use any signal/alarm handler */
- bit tcp_nodelay:1; /* whether to enable TCP_NODELAY or not */
- bit ignorecl:1; /* ignore content length */
- bit connect_only:1; /* make connection, let application use the socket */
- bit http_te_skip:1; /* pass the raw body data to the user, even when
- transfer-encoded (chunked, compressed) */
- bit http_ce_skip:1; /* pass the raw body data to the user, even when
- content-encoded (chunked, compressed) */
- bit proxy_transfer_mode:1; /* set transfer mode (;type=<a|i>) when doing
- FTP via an HTTP proxy */
+ BIT(hide_progress); /* don't use the progress meter */
+ BIT(http_fail_on_error); /* fail on HTTP error codes >= 400 */
+ BIT(http_keep_sending_on_error); /* for HTTP status codes >= 300 */
+ BIT(http_follow_location); /* follow HTTP redirects */
+ BIT(http_transfer_encoding); /* request compressed HTTP transfer-encoding */
+ BIT(allow_auth_to_other_hosts);
+ BIT(include_header); /* include received protocol headers in data output */
+ BIT(http_set_referer); /* is a custom referer used */
+ BIT(http_auto_referer); /* set "correct" referer when following
+ location: */
+ BIT(opt_no_body); /* as set with CURLOPT_NOBODY */
+ BIT(upload); /* upload request */
+ BIT(verbose); /* output verbosity */
+ BIT(krb); /* Kerberos connection requested */
+ BIT(reuse_forbid); /* forbidden to be reused, close after use */
+ BIT(reuse_fresh); /* do not re-use an existing connection */
+ BIT(no_signal); /* do not use any signal/alarm handler */
+ BIT(tcp_nodelay); /* whether to enable TCP_NODELAY or not */
+ BIT(ignorecl); /* ignore content length */
+ BIT(connect_only); /* make connection, let application use the socket */
+ BIT(http_te_skip); /* pass the raw body data to the user, even when
+ transfer-encoded (chunked, compressed) */
+ BIT(http_ce_skip); /* pass the raw body data to the user, even when
+ content-encoded (chunked, compressed) */
+ BIT(proxy_transfer_mode); /* set transfer mode (;type=<a|i>) when doing
+ FTP via an HTTP proxy */
#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
- bit socks5_gssapi_nec:1; /* Flag to support NEC SOCKS5 server */
+ BIT(socks5_gssapi_nec); /* Flag to support NEC SOCKS5 server */
#endif
- bit sasl_ir:1; /* Enable/disable SASL initial response */
- bit wildcard_enabled:1; /* enable wildcard matching */
- bit tcp_keepalive:1; /* use TCP keepalives */
- bit tcp_fastopen:1; /* use TCP Fast Open */
- bit ssl_enable_npn:1; /* TLS NPN extension? */
- bit ssl_enable_alpn:1;/* TLS ALPN extension? */
- bit path_as_is:1; /* allow dotdots? */
- bit pipewait:1; /* wait for multiplex status before starting a new
- connection */
- bit suppress_connect_headers:1; /* suppress proxy CONNECT response headers
- from user callbacks */
- bit dns_shuffle_addresses:1; /* whether to shuffle addresses before use */
- bit stream_depends_e:1; /* set or don't set the Exclusive bit */
- bit haproxyprotocol:1; /* whether to send HAProxy PROXY protocol v1
- header */
- bit abstract_unix_socket:1;
- bit disallow_username_in_url:1; /* disallow username in url */
- bit doh:1; /* DNS-over-HTTPS enabled */
- bit doh_get:1; /* use GET for DoH requests, instead of POST */
- bit http09_allowed:1; /* allow HTTP/0.9 responses */
+ BIT(sasl_ir); /* Enable/disable SASL initial response */
+ BIT(wildcard_enabled); /* enable wildcard matching */
+ BIT(tcp_keepalive); /* use TCP keepalives */
+ BIT(tcp_fastopen); /* use TCP Fast Open */
+ BIT(ssl_enable_npn); /* TLS NPN extension? */
+ BIT(ssl_enable_alpn);/* TLS ALPN extension? */
+ BIT(path_as_is); /* allow dotdots? */
+ BIT(pipewait); /* wait for multiplex status before starting a new
+ connection */
+ BIT(suppress_connect_headers); /* suppress proxy CONNECT response headers
+ from user callbacks */
+ BIT(dns_shuffle_addresses); /* whether to shuffle addresses before use */
+ BIT(stream_depends_e); /* set or don't set the Exclusive bit */
+ BIT(haproxyprotocol); /* whether to send HAProxy PROXY protocol v1
+ header */
+ BIT(abstract_unix_socket);
+ BIT(disallow_username_in_url); /* disallow username in url */
+ BIT(doh); /* DNS-over-HTTPS enabled */
+ BIT(doh_get); /* use GET for DoH requests, instead of POST */
+ BIT(http09_allowed); /* allow HTTP/0.9 responses */
+ BIT(mail_rcpt_allowfails); /* allow RCPT TO command to fail for some
+ recipients */
};
struct Names {
@@ -1777,7 +1864,6 @@ struct Curl_easy {
struct connectdata *conn;
struct curl_llist_element connect_queue;
- struct curl_llist_element sh_queue; /* list per Curl_sh_entry */
struct curl_llist_element conn_queue; /* list per connectdata */
CURLMstate mstate; /* the handle's state */
diff --git a/Utilities/cmcurl/lib/vauth/cram.c b/Utilities/cmcurl/lib/vauth/cram.c
index d148618..04438fa 100644
--- a/Utilities/cmcurl/lib/vauth/cram.c
+++ b/Utilities/cmcurl/lib/vauth/cram.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/vauth/digest.c b/Utilities/cmcurl/lib/vauth/digest.c
index f9cdc9d..a883570 100644
--- a/Utilities/cmcurl/lib/vauth/digest.c
+++ b/Utilities/cmcurl/lib/vauth/digest.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -62,7 +62,7 @@
what ultimately goes over the network.
*/
#define CURL_OUTPUT_DIGEST_CONV(a, b) \
- result = Curl_convert_to_network(a, (char *)b, strlen((const char *)b)); \
+ result = Curl_convert_to_network(a, b, strlen(b)); \
if(result) { \
free(b); \
return result; \
@@ -357,7 +357,6 @@ CURLcode Curl_auth_create_digest_md5_message(struct Curl_easy *data,
const char *service,
char **outptr, size_t *outlen)
{
- CURLcode result = CURLE_OK;
size_t i;
MD5_context *ctxt;
char *response = NULL;
@@ -377,10 +376,12 @@ CURLcode Curl_auth_create_digest_md5_message(struct Curl_easy *data,
char *spn = NULL;
/* Decode the challenge message */
- result = auth_decode_digest_md5_message(chlg64, nonce, sizeof(nonce),
- realm, sizeof(realm),
- algorithm, sizeof(algorithm),
- qop_options, sizeof(qop_options));
+ CURLcode result = auth_decode_digest_md5_message(chlg64, nonce,
+ sizeof(nonce), realm,
+ sizeof(realm), algorithm,
+ sizeof(algorithm),
+ qop_options,
+ sizeof(qop_options));
if(result)
return result;
@@ -659,7 +660,7 @@ CURLcode Curl_auth_decode_digest_http_message(const char *chlg,
}
/*
- * _Curl_auth_create_digest_http_message()
+ * auth_create_digest_http_message()
*
* This is used to generate a HTTP DIGEST response message ready for sending
* to the recipient.
@@ -678,7 +679,7 @@ CURLcode Curl_auth_decode_digest_http_message(const char *chlg,
*
* Returns CURLE_OK on success.
*/
-static CURLcode _Curl_auth_create_digest_http_message(
+static CURLcode auth_create_digest_http_message(
struct Curl_easy *data,
const char *userp,
const char *passwdp,
@@ -687,12 +688,12 @@ static CURLcode _Curl_auth_create_digest_http_message(
struct digestdata *digest,
char **outptr, size_t *outlen,
void (*convert_to_ascii)(unsigned char *, unsigned char *),
- void (*hash)(unsigned char *, const unsigned char *))
+ void (*hash)(unsigned char *, const unsigned char *,
+ const size_t))
{
CURLcode result;
unsigned char hashbuf[32]; /* 32 bytes/256 bits */
unsigned char request_digest[65];
- unsigned char *hashthis;
unsigned char ha1[65]; /* 64 digits and 1 zero byte */
unsigned char ha2[65]; /* 64 digits and 1 zero byte */
char userh[65];
@@ -700,6 +701,7 @@ static CURLcode _Curl_auth_create_digest_http_message(
size_t cnonce_sz = 0;
char *userp_quoted;
char *response = NULL;
+ char *hashthis = NULL;
char *tmp = NULL;
if(!digest->nc)
@@ -721,12 +723,12 @@ static CURLcode _Curl_auth_create_digest_http_message(
}
if(digest->userhash) {
- hashthis = (unsigned char *) aprintf("%s:%s", userp, digest->realm);
+ hashthis = aprintf("%s:%s", userp, digest->realm);
if(!hashthis)
return CURLE_OUT_OF_MEMORY;
CURL_OUTPUT_DIGEST_CONV(data, hashthis);
- hash(hashbuf, hashthis);
+ hash(hashbuf, (unsigned char *) hashthis, strlen(hashthis));
free(hashthis);
convert_to_ascii(hashbuf, (unsigned char *)userh);
}
@@ -742,14 +744,13 @@ static CURLcode _Curl_auth_create_digest_http_message(
unq(nonce-value) ":" unq(cnonce-value)
*/
- hashthis = (unsigned char *)
- aprintf("%s:%s:%s", digest->userhash ? userh : userp,
- digest->realm, passwdp);
+ hashthis = aprintf("%s:%s:%s", digest->userhash ? userh : userp,
+ digest->realm, passwdp);
if(!hashthis)
return CURLE_OUT_OF_MEMORY;
CURL_OUTPUT_DIGEST_CONV(data, hashthis); /* convert on non-ASCII machines */
- hash(hashbuf, hashthis);
+ hash(hashbuf, (unsigned char *) hashthis, strlen(hashthis));
free(hashthis);
convert_to_ascii(hashbuf, ha1);
@@ -762,7 +763,7 @@ static CURLcode _Curl_auth_create_digest_http_message(
return CURLE_OUT_OF_MEMORY;
CURL_OUTPUT_DIGEST_CONV(data, tmp); /* Convert on non-ASCII machines */
- hash(hashbuf, (unsigned char *) tmp);
+ hash(hashbuf, (unsigned char *) tmp, strlen(tmp));
free(tmp);
convert_to_ascii(hashbuf, ha1);
}
@@ -780,19 +781,19 @@ static CURLcode _Curl_auth_create_digest_http_message(
5.1.1 of RFC 2616)
*/
- hashthis = (unsigned char *) aprintf("%s:%s", request, uripath);
+ hashthis = aprintf("%s:%s", request, uripath);
if(!hashthis)
return CURLE_OUT_OF_MEMORY;
if(digest->qop && strcasecompare(digest->qop, "auth-int")) {
/* We don't support auth-int for PUT or POST */
char hashed[65];
- unsigned char *hashthis2;
+ char *hashthis2;
- hash(hashbuf, (const unsigned char *)"");
+ hash(hashbuf, (const unsigned char *)"", 0);
convert_to_ascii(hashbuf, (unsigned char *)hashed);
- hashthis2 = (unsigned char *)aprintf("%s:%s", hashthis, hashed);
+ hashthis2 = aprintf("%s:%s", hashthis, hashed);
free(hashthis);
hashthis = hashthis2;
}
@@ -801,31 +802,23 @@ static CURLcode _Curl_auth_create_digest_http_message(
return CURLE_OUT_OF_MEMORY;
CURL_OUTPUT_DIGEST_CONV(data, hashthis); /* convert on non-ASCII machines */
- hash(hashbuf, hashthis);
+ hash(hashbuf, (unsigned char *) hashthis, strlen(hashthis));
free(hashthis);
convert_to_ascii(hashbuf, ha2);
if(digest->qop) {
- hashthis = (unsigned char *) aprintf("%s:%s:%08x:%s:%s:%s",
- ha1,
- digest->nonce,
- digest->nc,
- digest->cnonce,
- digest->qop,
- ha2);
+ hashthis = aprintf("%s:%s:%08x:%s:%s:%s", ha1, digest->nonce, digest->nc,
+ digest->cnonce, digest->qop, ha2);
}
else {
- hashthis = (unsigned char *) aprintf("%s:%s:%s",
- ha1,
- digest->nonce,
- ha2);
+ hashthis = aprintf("%s:%s:%s", ha1, digest->nonce, ha2);
}
if(!hashthis)
return CURLE_OUT_OF_MEMORY;
CURL_OUTPUT_DIGEST_CONV(data, hashthis); /* convert on non-ASCII machines */
- hash(hashbuf, hashthis);
+ hash(hashbuf, (unsigned char *) hashthis, strlen(hashthis));
free(hashthis);
convert_to_ascii(hashbuf, request_digest);
@@ -898,7 +891,7 @@ static CURLcode _Curl_auth_create_digest_http_message(
if(digest->algorithm) {
/* Append the algorithm */
- tmp = aprintf("%s, algorithm=\"%s\"", response, digest->algorithm);
+ tmp = aprintf("%s, algorithm=%s", response, digest->algorithm);
free(response);
if(!tmp)
return CURLE_OUT_OF_MEMORY;
@@ -954,21 +947,21 @@ CURLcode Curl_auth_create_digest_http_message(struct Curl_easy *data,
switch(digest->algo) {
case CURLDIGESTALGO_MD5:
case CURLDIGESTALGO_MD5SESS:
- return _Curl_auth_create_digest_http_message(data, userp, passwdp,
- request, uripath, digest,
- outptr, outlen,
- auth_digest_md5_to_ascii,
- Curl_md5it);
+ return auth_create_digest_http_message(data, userp, passwdp,
+ request, uripath, digest,
+ outptr, outlen,
+ auth_digest_md5_to_ascii,
+ Curl_md5it);
case CURLDIGESTALGO_SHA256:
case CURLDIGESTALGO_SHA256SESS:
case CURLDIGESTALGO_SHA512_256:
case CURLDIGESTALGO_SHA512_256SESS:
- return _Curl_auth_create_digest_http_message(data, userp, passwdp,
- request, uripath, digest,
- outptr, outlen,
- auth_digest_sha256_to_ascii,
- Curl_sha256it);
+ return auth_create_digest_http_message(data, userp, passwdp,
+ request, uripath, digest,
+ outptr, outlen,
+ auth_digest_sha256_to_ascii,
+ Curl_sha256it);
default:
return CURLE_UNSUPPORTED_PROTOCOL;
diff --git a/Utilities/cmcurl/lib/vauth/digest.h b/Utilities/cmcurl/lib/vauth/digest.h
index 8686c44..cc05fdb 100644
--- a/Utilities/cmcurl/lib/vauth/digest.h
+++ b/Utilities/cmcurl/lib/vauth/digest.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/vauth/digest_sspi.c b/Utilities/cmcurl/lib/vauth/digest_sspi.c
index fe8093e..a109056 100644
--- a/Utilities/cmcurl/lib/vauth/digest_sspi.c
+++ b/Utilities/cmcurl/lib/vauth/digest_sspi.c
@@ -61,6 +61,11 @@ bool Curl_auth_is_digest_supported(void)
status = s_pSecFn->QuerySecurityPackageInfo((TCHAR *) TEXT(SP_NAME_DIGEST),
&SecurityPackage);
+ /* Release the package buffer as it is not required anymore */
+ if(status == SEC_E_OK) {
+ s_pSecFn->FreeContextBuffer(SecurityPackage);
+ }
+
return (status == SEC_E_OK ? TRUE : FALSE);
}
@@ -220,7 +225,10 @@ CURLcode Curl_auth_create_digest_md5_message(struct Curl_easy *data,
free(output_token);
free(input_token);
- return CURLE_RECV_ERROR;
+ if(status == SEC_E_INSUFFICIENT_MEMORY)
+ return CURLE_OUT_OF_MEMORY;
+
+ return CURLE_AUTH_ERROR;
}
/* Base64 encode the response */
@@ -607,7 +615,10 @@ CURLcode Curl_auth_create_digest_http_message(struct Curl_easy *data,
Curl_safefree(digest->http_context);
- return CURLE_OUT_OF_MEMORY;
+ if(status == SEC_E_INSUFFICIENT_MEMORY)
+ return CURLE_OUT_OF_MEMORY;
+
+ return CURLE_AUTH_ERROR;
}
output_token_len = resp_buf.cbBuffer;
diff --git a/Utilities/cmcurl/lib/vauth/krb5_gssapi.c b/Utilities/cmcurl/lib/vauth/krb5_gssapi.c
index ea0a5f1..95bab0e 100644
--- a/Utilities/cmcurl/lib/vauth/krb5_gssapi.c
+++ b/Utilities/cmcurl/lib/vauth/krb5_gssapi.c
@@ -121,7 +121,7 @@ CURLcode Curl_auth_create_gssapi_user_message(struct Curl_easy *data,
free(spn);
- return CURLE_OUT_OF_MEMORY;
+ return CURLE_AUTH_ERROR;
}
free(spn);
@@ -168,7 +168,7 @@ CURLcode Curl_auth_create_gssapi_user_message(struct Curl_easy *data,
Curl_gss_log_error(data, "gss_init_sec_context() failed: ",
major_status, minor_status);
- return CURLE_RECV_ERROR;
+ return CURLE_AUTH_ERROR;
}
if(output_token.value && output_token.length) {
@@ -252,7 +252,7 @@ CURLcode Curl_auth_create_gssapi_security_message(struct Curl_easy *data,
free(chlg);
- return CURLE_OUT_OF_MEMORY;
+ return CURLE_AUTH_ERROR;
}
/* Convert the username from internal format to a displayable token */
@@ -264,7 +264,7 @@ CURLcode Curl_auth_create_gssapi_security_message(struct Curl_easy *data,
free(chlg);
- return CURLE_OUT_OF_MEMORY;
+ return CURLE_AUTH_ERROR;
}
/* Setup the challenge "input" security buffer */
@@ -355,7 +355,7 @@ CURLcode Curl_auth_create_gssapi_security_message(struct Curl_easy *data,
free(message);
- return CURLE_OUT_OF_MEMORY;
+ return CURLE_AUTH_ERROR;
}
/* Base64 encode the response */
diff --git a/Utilities/cmcurl/lib/vauth/krb5_sspi.c b/Utilities/cmcurl/lib/vauth/krb5_sspi.c
index 1f6e462..98041d9 100644
--- a/Utilities/cmcurl/lib/vauth/krb5_sspi.c
+++ b/Utilities/cmcurl/lib/vauth/krb5_sspi.c
@@ -58,6 +58,11 @@ bool Curl_auth_is_gssapi_supported(void)
TEXT(SP_NAME_KERBEROS),
&SecurityPackage);
+ /* Release the package buffer as it is not required anymore */
+ if(status == SEC_E_OK) {
+ s_pSecFn->FreeContextBuffer(SecurityPackage);
+ }
+
return (status == SEC_E_OK ? TRUE : FALSE);
}
@@ -217,8 +222,12 @@ CURLcode Curl_auth_create_gssapi_user_message(struct Curl_easy *data,
/* Free the decoded challenge as it is not required anymore */
free(chlg);
+ if(status == SEC_E_INSUFFICIENT_MEMORY) {
+ return CURLE_OUT_OF_MEMORY;
+ }
+
if(status != SEC_E_OK && status != SEC_I_CONTINUE_NEEDED) {
- return CURLE_RECV_ERROR;
+ return CURLE_AUTH_ERROR;
}
if(memcmp(&context, krb5->context, sizeof(context))) {
@@ -309,7 +318,10 @@ CURLcode Curl_auth_create_gssapi_security_message(struct Curl_easy *data,
if(status != SEC_E_OK) {
free(chlg);
- return CURLE_OUT_OF_MEMORY;
+ if(status == SEC_E_INSUFFICIENT_MEMORY)
+ return CURLE_OUT_OF_MEMORY;
+
+ return CURLE_AUTH_ERROR;
}
/* Get the fully qualified username back from the context */
@@ -319,7 +331,10 @@ CURLcode Curl_auth_create_gssapi_security_message(struct Curl_easy *data,
if(status != SEC_E_OK) {
free(chlg);
- return CURLE_RECV_ERROR;
+ if(status == SEC_E_INSUFFICIENT_MEMORY)
+ return CURLE_OUT_OF_MEMORY;
+
+ return CURLE_AUTH_ERROR;
}
/* Setup the "input" security buffer */
@@ -438,7 +453,10 @@ CURLcode Curl_auth_create_gssapi_security_message(struct Curl_easy *data,
free(message);
free(trailer);
- return CURLE_OUT_OF_MEMORY;
+ if(status == SEC_E_INSUFFICIENT_MEMORY)
+ return CURLE_OUT_OF_MEMORY;
+
+ return CURLE_AUTH_ERROR;
}
/* Allocate the encryption (wrap) buffer */
diff --git a/Utilities/cmcurl/lib/vauth/ntlm.c b/Utilities/cmcurl/lib/vauth/ntlm.c
index 047c2b5..8f91038 100644
--- a/Utilities/cmcurl/lib/vauth/ntlm.c
+++ b/Utilities/cmcurl/lib/vauth/ntlm.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -40,6 +40,7 @@
#include "curl_ntlm_core.h"
#include "curl_gethostname.h"
#include "curl_multibyte.h"
+#include "curl_md5.h"
#include "warnless.h"
#include "rand.h"
#include "vtls/vtls.h"
@@ -621,11 +622,11 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
memcpy(tmp, &ntlm->nonce[0], 8);
memcpy(tmp + 8, entropy, 8);
- result = Curl_ssl_md5sum(tmp, 16, md5sum, MD5_DIGEST_LENGTH);
- if(!result)
- /* We shall only use the first 8 bytes of md5sum, but the des code in
- Curl_ntlm_core_lm_resp only encrypt the first 8 bytes */
- result = Curl_ntlm_core_mk_nt_hash(data, passwdp, ntbuffer);
+ Curl_md5it(md5sum, tmp, 16);
+
+ /* We shall only use the first 8 bytes of md5sum, but the des code in
+ Curl_ntlm_core_lm_resp only encrypt the first 8 bytes */
+ result = Curl_ntlm_core_mk_nt_hash(data, passwdp, ntbuffer);
if(result)
return result;
diff --git a/Utilities/cmcurl/lib/vauth/ntlm_sspi.c b/Utilities/cmcurl/lib/vauth/ntlm_sspi.c
index 589cca1..cd6cb79 100644
--- a/Utilities/cmcurl/lib/vauth/ntlm_sspi.c
+++ b/Utilities/cmcurl/lib/vauth/ntlm_sspi.c
@@ -56,6 +56,11 @@ bool Curl_auth_is_ntlm_supported(void)
status = s_pSecFn->QuerySecurityPackageInfo((TCHAR *) TEXT(SP_NAME_NTLM),
&SecurityPackage);
+ /* Release the package buffer as it is not required anymore */
+ if(status == SEC_E_OK) {
+ s_pSecFn->FreeContextBuffer(SecurityPackage);
+ }
+
return (status == SEC_E_OK ? TRUE : FALSE);
}
@@ -169,8 +174,10 @@ CURLcode Curl_auth_create_ntlm_type1_message(struct Curl_easy *data,
if(status == SEC_I_COMPLETE_NEEDED ||
status == SEC_I_COMPLETE_AND_CONTINUE)
s_pSecFn->CompleteAuthToken(ntlm->context, &type_1_desc);
+ else if(status == SEC_E_INSUFFICIENT_MEMORY)
+ return CURLE_OUT_OF_MEMORY;
else if(status != SEC_E_OK && status != SEC_I_CONTINUE_NEEDED)
- return CURLE_RECV_ERROR;
+ return CURLE_AUTH_ERROR;
/* Base64 encode the response */
return Curl_base64_encode(data, (char *) ntlm->output_token,
@@ -316,7 +323,10 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
infof(data, "NTLM handshake failure (type-3 message): Status=%x\n",
status);
- return CURLE_RECV_ERROR;
+ if(status == SEC_E_INSUFFICIENT_MEMORY)
+ return CURLE_OUT_OF_MEMORY;
+
+ return CURLE_AUTH_ERROR;
}
/* Base64 encode the response */
diff --git a/Utilities/cmcurl/lib/vauth/spnego_gssapi.c b/Utilities/cmcurl/lib/vauth/spnego_gssapi.c
index 5d43e11..ed7ce02 100644
--- a/Utilities/cmcurl/lib/vauth/spnego_gssapi.c
+++ b/Utilities/cmcurl/lib/vauth/spnego_gssapi.c
@@ -121,7 +121,7 @@ CURLcode Curl_auth_decode_spnego_message(struct Curl_easy *data,
free(spn);
- return CURLE_OUT_OF_MEMORY;
+ return CURLE_AUTH_ERROR;
}
free(spn);
@@ -170,14 +170,14 @@ CURLcode Curl_auth_decode_spnego_message(struct Curl_easy *data,
Curl_gss_log_error(data, "gss_init_sec_context() failed: ",
major_status, minor_status);
- return CURLE_LOGIN_DENIED;
+ return CURLE_AUTH_ERROR;
}
if(!output_token.value || !output_token.length) {
if(output_token.value)
gss_release_buffer(&unused_status, &output_token);
- return CURLE_OUT_OF_MEMORY;
+ return CURLE_AUTH_ERROR;
}
/* Free previous token */
diff --git a/Utilities/cmcurl/lib/vauth/spnego_sspi.c b/Utilities/cmcurl/lib/vauth/spnego_sspi.c
index 4b21cc7..b9c2cf7 100644
--- a/Utilities/cmcurl/lib/vauth/spnego_sspi.c
+++ b/Utilities/cmcurl/lib/vauth/spnego_sspi.c
@@ -59,6 +59,12 @@ bool Curl_auth_is_spnego_supported(void)
TEXT(SP_NAME_NEGOTIATE),
&SecurityPackage);
+ /* Release the package buffer as it is not required anymore */
+ if(status == SEC_E_OK) {
+ s_pSecFn->FreeContextBuffer(SecurityPackage);
+ }
+
+
return (status == SEC_E_OK ? TRUE : FALSE);
}
@@ -165,7 +171,7 @@ CURLcode Curl_auth_decode_spnego_message(struct Curl_easy *data,
nego->p_identity, NULL, NULL,
nego->credentials, &expiry);
if(nego->status != SEC_E_OK)
- return CURLE_LOGIN_DENIED;
+ return CURLE_AUTH_ERROR;
/* Allocate our new context handle */
nego->context = calloc(1, sizeof(CtxtHandle));
@@ -251,14 +257,25 @@ CURLcode Curl_auth_decode_spnego_message(struct Curl_easy *data,
char buffer[STRERROR_LEN];
failf(data, "InitializeSecurityContext failed: %s",
Curl_sspi_strerror(nego->status, buffer, sizeof(buffer)));
- return CURLE_OUT_OF_MEMORY;
+
+ if(nego->status == (DWORD)SEC_E_INSUFFICIENT_MEMORY)
+ return CURLE_OUT_OF_MEMORY;
+
+ return CURLE_AUTH_ERROR;
}
if(nego->status == SEC_I_COMPLETE_NEEDED ||
nego->status == SEC_I_COMPLETE_AND_CONTINUE) {
nego->status = s_pSecFn->CompleteAuthToken(nego->context, &resp_desc);
if(GSS_ERROR(nego->status)) {
- return CURLE_RECV_ERROR;
+ char buffer[STRERROR_LEN];
+ failf(data, "CompleteAuthToken failed: %s",
+ Curl_sspi_strerror(nego->status, buffer, sizeof(buffer)));
+
+ if(nego->status == (DWORD)SEC_E_INSUFFICIENT_MEMORY)
+ return CURLE_OUT_OF_MEMORY;
+
+ return CURLE_AUTH_ERROR;
}
}
diff --git a/Utilities/cmcurl/lib/vauth/vauth.h b/Utilities/cmcurl/lib/vauth/vauth.h
index 73bd25e..a1a557d 100644
--- a/Utilities/cmcurl/lib/vauth/vauth.h
+++ b/Utilities/cmcurl/lib/vauth/vauth.h
@@ -43,7 +43,7 @@ struct negotiatedata;
#endif
#if defined(USE_WINDOWS_SSPI)
-#define GSS_ERROR(status) (status & 0x80000000)
+#define GSS_ERROR(status) ((status) & 0x80000000)
#endif
/* This is used to build a SPN string */
diff --git a/Utilities/cmcurl/lib/version.c b/Utilities/cmcurl/lib/version.c
index 14b0531..77aca7c 100644
--- a/Utilities/cmcurl/lib/version.c
+++ b/Utilities/cmcurl/lib/version.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -26,7 +26,8 @@
#include "urldata.h"
#include "vtls/vtls.h"
#include "http2.h"
-#include "ssh.h"
+#include "vssh/ssh.h"
+#include "quic.h"
#include "curl_printf.h"
#ifdef USE_ARES
@@ -53,18 +54,6 @@
#include <librtmp/rtmp.h>
#endif
-#ifdef USE_LIBSSH2
-#include <libssh2.h>
-#endif
-
-#ifdef HAVE_LIBSSH2_VERSION
-/* get it run-time if possible */
-#define CURL_LIBSSH2_VERSION libssh2_version(0)
-#else
-/* use build-time if run-time not possible */
-#define CURL_LIBSSH2_VERSION LIBSSH2_VERSION
-#endif
-
#ifdef HAVE_ZLIB_H
#include <zlib.h>
#ifdef __SYMBIAN32__
@@ -102,7 +91,7 @@ static size_t brotli_version(char *buf, size_t bufsz)
char *curl_version(void)
{
static bool initialized;
- static char version[200];
+ static char version[250];
char *ptr = version;
size_t len;
size_t left = sizeof(version);
@@ -115,14 +104,12 @@ char *curl_version(void)
left -= len;
ptr += len;
- if(left > 1) {
- len = Curl_ssl_version(ptr + 1, left - 1);
+ len = Curl_ssl_version(ptr + 1, left - 1);
- if(len > 0) {
- *ptr = ' ';
- left -= ++len;
- ptr += len;
- }
+ if(len > 0) {
+ *ptr = ' ';
+ left -= ++len;
+ ptr += len;
}
#ifdef HAVE_LIBZ
@@ -172,18 +159,22 @@ char *curl_version(void)
left -= len;
ptr += len;
#endif
-#ifdef USE_LIBSSH2
- len = msnprintf(ptr, left, " libssh2/%s", CURL_LIBSSH2_VERSION);
+#ifdef USE_SSH
+ if(left) {
+ *ptr++=' ';
+ left--;
+ }
+ len = Curl_ssh_version(ptr, left);
left -= len;
ptr += len;
#endif
-#ifdef USE_LIBSSH
- len = msnprintf(ptr, left, " libssh/%s", CURL_LIBSSH_VERSION);
+#ifdef USE_NGHTTP2
+ len = Curl_http2_ver(ptr, left);
left -= len;
ptr += len;
#endif
-#ifdef USE_NGHTTP2
- len = Curl_http2_ver(ptr, left);
+#ifdef ENABLE_QUIC
+ len = Curl_quic_ver(ptr, left);
left -= len;
ptr += len;
#endif
@@ -274,8 +265,10 @@ static const char * const protocols[] = {
#ifndef CURL_DISABLE_RTSP
"rtsp",
#endif
-#if defined(USE_SSH)
+#if defined(USE_SSH) && !defined(USE_WOLFSSH)
"scp",
+#endif
+#ifdef USE_SSH
"sftp",
#endif
#if !defined(CURL_DISABLE_SMB) && defined(USE_NTLM) && \
@@ -358,6 +351,9 @@ static curl_version_info_data version_info = {
#if defined(USE_NGHTTP2)
| CURL_VERSION_HTTP2
#endif
+#if defined(ENABLE_QUIC)
+ | CURL_VERSION_HTTP3
+#endif
#if defined(USE_UNIX_SOCKETS)
| CURL_VERSION_UNIX_SOCKETS
#endif
@@ -373,6 +369,9 @@ static curl_version_info_data version_info = {
#if defined(USE_ALTSVC)
| CURL_VERSION_ALTSVC
#endif
+#ifdef USE_ESNI
+ | CURL_VERSION_ESNI
+#endif
,
NULL, /* ssl_version */
0, /* ssl_version_num, this is kept at zero */
@@ -385,6 +384,9 @@ static curl_version_info_data version_info = {
NULL, /* ssh lib version */
0, /* brotli_ver_num */
NULL, /* brotli version */
+ 0, /* nghttp2 version number */
+ NULL, /* nghttp2 version string */
+ NULL /* quic library string */
};
curl_version_info_data *curl_version_info(CURLversion stamp)
@@ -446,11 +448,8 @@ curl_version_info_data *curl_version_info(CURLversion stamp)
#endif /* _LIBICONV_VERSION */
#endif
-#if defined(USE_LIBSSH2)
- msnprintf(ssh_buffer, sizeof(ssh_buffer), "libssh2/%s", LIBSSH2_VERSION);
- version_info.libssh_version = ssh_buffer;
-#elif defined(USE_LIBSSH)
- msnprintf(ssh_buffer, sizeof(ssh_buffer), "libssh/%s", CURL_LIBSSH_VERSION);
+#if defined(USE_SSH)
+ Curl_ssh_version(ssh_buffer, sizeof(ssh_buffer));
version_info.libssh_version = ssh_buffer;
#endif
@@ -460,6 +459,22 @@ curl_version_info_data *curl_version_info(CURLversion stamp)
version_info.brotli_version = brotli_buffer;
#endif
+#ifdef USE_NGHTTP2
+ {
+ nghttp2_info *h2 = nghttp2_version(0);
+ version_info.nghttp2_ver_num = h2->version_num;
+ version_info.nghttp2_version = h2->version_str;
+ }
+#endif
+
+#ifdef ENABLE_QUIC
+ {
+ static char quicbuffer[80];
+ Curl_quic_ver(quicbuffer, sizeof(quicbuffer));
+ version_info.quic_version = quicbuffer;
+ }
+#endif
+
(void)stamp; /* avoid compiler warnings, we don't use this */
initialized = true;
diff --git a/Utilities/cmcurl/lib/vquic/ngtcp2.c b/Utilities/cmcurl/lib/vquic/ngtcp2.c
new file mode 100644
index 0000000..0788404
--- /dev/null
+++ b/Utilities/cmcurl/lib/vquic/ngtcp2.c
@@ -0,0 +1,1769 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include "curl_setup.h"
+
+#ifdef USE_NGTCP2
+#include <ngtcp2/ngtcp2.h>
+#include <ngtcp2/ngtcp2_crypto.h>
+#include <nghttp3/nghttp3.h>
+#include <openssl/err.h>
+#include "urldata.h"
+#include "sendf.h"
+#include "strdup.h"
+#include "rand.h"
+#include "ngtcp2.h"
+#include "multiif.h"
+#include "strcase.h"
+#include "connect.h"
+#include "strerror.h"
+
+/* The last 3 #include files should be in this order */
+#include "curl_printf.h"
+#include "curl_memory.h"
+#include "memdebug.h"
+
+/* #define DEBUG_NGTCP2 */
+#ifdef CURLDEBUG
+#define DEBUG_HTTP3
+#endif
+#ifdef DEBUG_HTTP3
+#define H3BUGF(x) x
+#else
+#define H3BUGF(x) do { } while(0)
+#endif
+
+/*
+ * This holds outgoing HTTP/3 stream data that is used by nghttp3 until acked.
+ * It is used as a circular buffer. Add new bytes at the end until it reaches
+ * the far end, then start over at index 0 again.
+ */
+
+#define H3_SEND_SIZE (20*1024)
+struct h3out {
+ uint8_t buf[H3_SEND_SIZE];
+ size_t used; /* number of bytes used in the buffer */
+ size_t windex; /* index in the buffer where to start writing the next
+ data block */
+};
+
+#define QUIC_MAX_STREAMS (256*1024)
+#define QUIC_MAX_DATA (1*1024*1024)
+#define QUIC_IDLE_TIMEOUT 60000 /* milliseconds */
+#define QUIC_CIPHERS \
+ "TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_" \
+ "POLY1305_SHA256:TLS_AES_128_CCM_SHA256"
+#define QUIC_GROUPS "P-256:X25519:P-384:P-521"
+
+static CURLcode ng_process_ingress(struct connectdata *conn,
+ curl_socket_t sockfd,
+ struct quicsocket *qs);
+static CURLcode ng_flush_egress(struct connectdata *conn, int sockfd,
+ struct quicsocket *qs);
+static int cb_h3_acked_stream_data(nghttp3_conn *conn, int64_t stream_id,
+ size_t datalen, void *user_data,
+ void *stream_user_data);
+
+static ngtcp2_tstamp timestamp(void)
+{
+ struct curltime ct = Curl_now();
+ return ct.tv_sec * NGTCP2_SECONDS + ct.tv_usec * NGTCP2_MICROSECONDS;
+}
+
+#ifdef DEBUG_NGTCP2
+static void quic_printf(void *user_data, const char *fmt, ...)
+{
+ va_list ap;
+ (void)user_data; /* TODO, use this to do infof() instead long-term */
+ va_start(ap, fmt);
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+ fprintf(stderr, "\n");
+}
+#endif
+
+static ngtcp2_crypto_level
+quic_from_ossl_level(OSSL_ENCRYPTION_LEVEL ossl_level)
+{
+ switch(ossl_level) {
+ case ssl_encryption_initial:
+ return NGTCP2_CRYPTO_LEVEL_INITIAL;
+ case ssl_encryption_early_data:
+ return NGTCP2_CRYPTO_LEVEL_EARLY;
+ case ssl_encryption_handshake:
+ return NGTCP2_CRYPTO_LEVEL_HANDSHAKE;
+ case ssl_encryption_application:
+ return NGTCP2_CRYPTO_LEVEL_APP;
+ default:
+ assert(0);
+ }
+}
+
+static int setup_initial_crypto_context(struct quicsocket *qs)
+{
+ const ngtcp2_cid *dcid = ngtcp2_conn_get_dcid(qs->qconn);
+
+ if(ngtcp2_crypto_derive_and_install_initial_key(
+ qs->qconn, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, dcid,
+ NGTCP2_CRYPTO_SIDE_CLIENT) != 0)
+ return -1;
+
+ return 0;
+}
+
+static void quic_settings(ngtcp2_settings *s,
+ uint64_t stream_buffer_size)
+{
+ ngtcp2_settings_default(s);
+#ifdef DEBUG_NGTCP2
+ s->log_printf = quic_printf;
+#else
+ s->log_printf = NULL;
+#endif
+ s->initial_ts = timestamp();
+ s->transport_params.initial_max_stream_data_bidi_local = stream_buffer_size;
+ s->transport_params.initial_max_stream_data_bidi_remote = QUIC_MAX_STREAMS;
+ s->transport_params.initial_max_stream_data_uni = QUIC_MAX_STREAMS;
+ s->transport_params.initial_max_data = QUIC_MAX_DATA;
+ s->transport_params.initial_max_streams_bidi = 1;
+ s->transport_params.initial_max_streams_uni = 3;
+ s->transport_params.max_idle_timeout = QUIC_IDLE_TIMEOUT;
+}
+
+static FILE *keylog_file; /* not thread-safe */
+static void keylog_callback(const SSL *ssl, const char *line)
+{
+ (void)ssl;
+ fputs(line, keylog_file);
+ fputc('\n', keylog_file);
+ fflush(keylog_file);
+}
+
+static int init_ngh3_conn(struct quicsocket *qs);
+
+static int quic_set_encryption_secrets(SSL *ssl,
+ OSSL_ENCRYPTION_LEVEL ossl_level,
+ const uint8_t *rx_secret,
+ const uint8_t *tx_secret,
+ size_t secretlen)
+{
+ struct quicsocket *qs = (struct quicsocket *)SSL_get_app_data(ssl);
+ int level = quic_from_ossl_level(ossl_level);
+
+ if(ngtcp2_crypto_derive_and_install_key(
+ qs->qconn, ssl, NULL, NULL, NULL, NULL, NULL, NULL, level, rx_secret,
+ tx_secret, secretlen, NGTCP2_CRYPTO_SIDE_CLIENT) != 0)
+ return 0;
+
+ if(level == NGTCP2_CRYPTO_LEVEL_APP) {
+ if(init_ngh3_conn(qs) != CURLE_OK)
+ return 0;
+ }
+
+ return 1;
+}
+
+static int quic_add_handshake_data(SSL *ssl, OSSL_ENCRYPTION_LEVEL ossl_level,
+ const uint8_t *data, size_t len)
+{
+ struct quicsocket *qs = (struct quicsocket *)SSL_get_app_data(ssl);
+ struct quic_handshake *crypto_data;
+ ngtcp2_crypto_level level = quic_from_ossl_level(ossl_level);
+ int rv;
+
+ crypto_data = &qs->crypto_data[level];
+ if(crypto_data->buf == NULL) {
+ crypto_data->buf = malloc(4096);
+ if(!crypto_data->buf)
+ return 0;
+ crypto_data->alloclen = 4096;
+ }
+
+ /* TODO Just pretend that handshake does not grow more than 4KiB for
+ now */
+ assert(crypto_data->len + len <= crypto_data->alloclen);
+
+ memcpy(&crypto_data->buf[crypto_data->len], data, len);
+ crypto_data->len += len;
+
+ rv = ngtcp2_conn_submit_crypto_data(
+ qs->qconn, level, (uint8_t *)(&crypto_data->buf[crypto_data->len] - len),
+ len);
+ if(rv) {
+ H3BUGF(fprintf(stderr, "write_client_handshake failed\n"));
+ }
+ assert(0 == rv);
+
+ return 1;
+}
+
+static int quic_flush_flight(SSL *ssl)
+{
+ (void)ssl;
+ return 1;
+}
+
+static int quic_send_alert(SSL *ssl, enum ssl_encryption_level_t level,
+ uint8_t alert)
+{
+ struct quicsocket *qs = (struct quicsocket *)SSL_get_app_data(ssl);
+ (void)level;
+
+ qs->tls_alert = alert;
+ return 1;
+}
+
+static SSL_QUIC_METHOD quic_method = {quic_set_encryption_secrets,
+ quic_add_handshake_data,
+ quic_flush_flight, quic_send_alert};
+
+static SSL_CTX *quic_ssl_ctx(struct Curl_easy *data)
+{
+ SSL_CTX *ssl_ctx = SSL_CTX_new(TLS_method());
+ const char *keylog_filename;
+
+ SSL_CTX_set_min_proto_version(ssl_ctx, TLS1_3_VERSION);
+ SSL_CTX_set_max_proto_version(ssl_ctx, TLS1_3_VERSION);
+
+ SSL_CTX_set_default_verify_paths(ssl_ctx);
+
+ if(SSL_CTX_set_ciphersuites(ssl_ctx, QUIC_CIPHERS) != 1) {
+ char error_buffer[256];
+ ERR_error_string_n(ERR_get_error(), error_buffer, sizeof(error_buffer));
+ failf(data, "SSL_CTX_set_ciphersuites: %s", error_buffer);
+ return NULL;
+ }
+
+ if(SSL_CTX_set1_groups_list(ssl_ctx, QUIC_GROUPS) != 1) {
+ failf(data, "SSL_CTX_set1_groups_list failed");
+ return NULL;
+ }
+
+ SSL_CTX_set_quic_method(ssl_ctx, &quic_method);
+
+ keylog_filename = getenv("SSLKEYLOGFILE");
+ if(keylog_filename) {
+ keylog_file = fopen(keylog_filename, "wb");
+ if(keylog_file) {
+ SSL_CTX_set_keylog_callback(ssl_ctx, keylog_callback);
+ }
+ }
+
+ return ssl_ctx;
+}
+
+/** SSL callbacks ***/
+
+static int quic_init_ssl(struct quicsocket *qs)
+{
+ const uint8_t *alpn = NULL;
+ size_t alpnlen = 0;
+ /* this will need some attention when HTTPS proxy over QUIC get fixed */
+ const char * const hostname = qs->conn->host.name;
+
+ if(qs->ssl)
+ SSL_free(qs->ssl);
+
+ qs->ssl = SSL_new(qs->sslctx);
+
+ SSL_set_app_data(qs->ssl, qs);
+ SSL_set_connect_state(qs->ssl);
+
+ switch(qs->version) {
+#ifdef NGTCP2_PROTO_VER
+ case NGTCP2_PROTO_VER:
+ alpn = (const uint8_t *)NGTCP2_ALPN_H3;
+ alpnlen = sizeof(NGTCP2_ALPN_H3) - 1;
+ break;
+#endif
+ }
+ if(alpn)
+ SSL_set_alpn_protos(qs->ssl, alpn, (int)alpnlen);
+
+ /* set SNI */
+ SSL_set_tlsext_host_name(qs->ssl, hostname);
+ return 0;
+}
+
+static int cb_initial(ngtcp2_conn *quic, void *user_data)
+{
+ struct quicsocket *qs = (struct quicsocket *)user_data;
+
+ if(ngtcp2_crypto_read_write_crypto_data(
+ quic, qs->ssl, NGTCP2_CRYPTO_LEVEL_INITIAL, NULL, 0) != 0)
+ return NGTCP2_ERR_CALLBACK_FAILURE;
+
+ return 0;
+}
+
+static int
+cb_recv_crypto_data(ngtcp2_conn *tconn, ngtcp2_crypto_level crypto_level,
+ uint64_t offset,
+ const uint8_t *data, size_t datalen,
+ void *user_data)
+{
+ struct quicsocket *qs = (struct quicsocket *)user_data;
+ (void)offset;
+
+ if(ngtcp2_crypto_read_write_crypto_data(tconn, qs->ssl, crypto_level, data,
+ datalen) != 0)
+ return NGTCP2_ERR_CRYPTO;
+
+ return 0;
+}
+
+static int cb_handshake_completed(ngtcp2_conn *tconn, void *user_data)
+{
+ struct quicsocket *qs = (struct quicsocket *)user_data;
+ (void)tconn;
+ infof(qs->conn->data, "QUIC handshake is completed\n");
+
+ return 0;
+}
+
+static void extend_stream_window(ngtcp2_conn *tconn,
+ struct HTTP *stream)
+{
+ size_t thismuch = stream->unacked_window;
+ ngtcp2_conn_extend_max_stream_offset(tconn, stream->stream3_id, thismuch);
+ ngtcp2_conn_extend_max_offset(tconn, thismuch);
+ stream->unacked_window = 0;
+}
+
+
+static int cb_recv_stream_data(ngtcp2_conn *tconn, int64_t stream_id,
+ int fin, uint64_t offset,
+ const uint8_t *buf, size_t buflen,
+ void *user_data, void *stream_user_data)
+{
+ struct quicsocket *qs = (struct quicsocket *)user_data;
+ ssize_t nconsumed;
+ (void)offset;
+ (void)stream_user_data;
+
+ nconsumed =
+ nghttp3_conn_read_stream(qs->h3conn, stream_id, buf, buflen, fin);
+ if(nconsumed < 0) {
+ failf(qs->conn->data, "nghttp3_conn_read_stream returned error: %s\n",
+ nghttp3_strerror((int)nconsumed));
+ return NGTCP2_ERR_CALLBACK_FAILURE;
+ }
+
+ /* number of bytes inside buflen which consists of framing overhead
+ * including QPACK HEADERS. In other words, it does not consume payload of
+ * DATA frame. */
+ ngtcp2_conn_extend_max_stream_offset(tconn, stream_id, nconsumed);
+ ngtcp2_conn_extend_max_offset(tconn, nconsumed);
+
+ return 0;
+}
+
+static int
+cb_acked_stream_data_offset(ngtcp2_conn *tconn, int64_t stream_id,
+ uint64_t offset, size_t datalen, void *user_data,
+ void *stream_user_data)
+{
+ struct quicsocket *qs = (struct quicsocket *)user_data;
+ int rv;
+ (void)stream_id;
+ (void)tconn;
+ (void)offset;
+ (void)datalen;
+ (void)stream_user_data;
+
+ rv = nghttp3_conn_add_ack_offset(qs->h3conn, stream_id, datalen);
+ if(rv != 0) {
+ failf(qs->conn->data, "nghttp3_conn_add_ack_offset returned error: %s\n",
+ nghttp3_strerror(rv));
+ return NGTCP2_ERR_CALLBACK_FAILURE;
+ }
+
+ return 0;
+}
+
+static int cb_stream_close(ngtcp2_conn *tconn, int64_t stream_id,
+ uint64_t app_error_code,
+ void *user_data, void *stream_user_data)
+{
+ struct quicsocket *qs = (struct quicsocket *)user_data;
+ int rv;
+ (void)tconn;
+ (void)stream_user_data;
+ /* stream is closed... */
+
+ rv = nghttp3_conn_close_stream(qs->h3conn, stream_id,
+ app_error_code);
+ if(rv != 0) {
+ failf(qs->conn->data, "nghttp3_conn_close_stream returned error: %s\n",
+ nghttp3_strerror(rv));
+ return NGTCP2_ERR_CALLBACK_FAILURE;
+ }
+
+ return 0;
+}
+
+static int cb_stream_reset(ngtcp2_conn *tconn, int64_t stream_id,
+ uint64_t final_size, uint64_t app_error_code,
+ void *user_data, void *stream_user_data)
+{
+ struct quicsocket *qs = (struct quicsocket *)user_data;
+ int rv;
+ (void)tconn;
+ (void)final_size;
+ (void)app_error_code;
+ (void)stream_user_data;
+
+ rv = nghttp3_conn_reset_stream(qs->h3conn, stream_id);
+ if(rv != 0) {
+ failf(qs->conn->data, "nghttp3_conn_reset_stream returned error: %s\n",
+ nghttp3_strerror(rv));
+ return NGTCP2_ERR_CALLBACK_FAILURE;
+ }
+
+ return 0;
+}
+
+static int cb_recv_retry(ngtcp2_conn *tconn, const ngtcp2_pkt_hd *hd,
+ const ngtcp2_pkt_retry *retry, void *user_data)
+{
+ /* Re-generate handshake secrets here because connection ID might change. */
+ struct quicsocket *qs = (struct quicsocket *)user_data;
+ (void)tconn;
+ (void)hd;
+ (void)retry;
+
+ setup_initial_crypto_context(qs);
+
+ return 0;
+}
+
+static int cb_extend_max_local_streams_bidi(ngtcp2_conn *tconn,
+ uint64_t max_streams,
+ void *user_data)
+{
+ (void)tconn;
+ (void)max_streams;
+ (void)user_data;
+
+ return 0;
+}
+
+static int cb_extend_max_stream_data(ngtcp2_conn *tconn, int64_t stream_id,
+ uint64_t max_data, void *user_data,
+ void *stream_user_data)
+{
+ struct quicsocket *qs = (struct quicsocket *)user_data;
+ int rv;
+ (void)tconn;
+ (void)max_data;
+ (void)stream_user_data;
+
+ rv = nghttp3_conn_unblock_stream(qs->h3conn, stream_id);
+ if(rv != 0) {
+ failf(qs->conn->data, "nghttp3_conn_unblock_stream returned error: %s\n",
+ nghttp3_strerror(rv));
+ return NGTCP2_ERR_CALLBACK_FAILURE;
+ }
+
+ return 0;
+}
+
+static int cb_get_new_connection_id(ngtcp2_conn *tconn, ngtcp2_cid *cid,
+ uint8_t *token, size_t cidlen,
+ void *user_data)
+{
+ struct quicsocket *qs = (struct quicsocket *)user_data;
+ CURLcode result;
+ (void)tconn;
+
+ result = Curl_rand(qs->conn->data, cid->data, cidlen);
+ if(result)
+ return NGTCP2_ERR_CALLBACK_FAILURE;
+ cid->datalen = cidlen;
+
+ result = Curl_rand(qs->conn->data, token, NGTCP2_STATELESS_RESET_TOKENLEN);
+ if(result)
+ return NGTCP2_ERR_CALLBACK_FAILURE;
+
+ return 0;
+}
+
+static ngtcp2_conn_callbacks ng_callbacks = {
+ cb_initial,
+ NULL, /* recv_client_initial */
+ cb_recv_crypto_data,
+ cb_handshake_completed,
+ NULL, /* recv_version_negotiation */
+ ngtcp2_crypto_encrypt_cb,
+ ngtcp2_crypto_decrypt_cb,
+ ngtcp2_crypto_hp_mask_cb,
+ cb_recv_stream_data,
+ NULL, /* acked_crypto_offset */
+ cb_acked_stream_data_offset,
+ NULL, /* stream_open */
+ cb_stream_close,
+ NULL, /* recv_stateless_reset */
+ cb_recv_retry,
+ cb_extend_max_local_streams_bidi,
+ NULL, /* extend_max_local_streams_uni */
+ NULL, /* rand */
+ cb_get_new_connection_id,
+ NULL, /* remove_connection_id */
+ ngtcp2_crypto_update_key_cb, /* update_key */
+ NULL, /* path_validation */
+ NULL, /* select_preferred_addr */
+ cb_stream_reset,
+ NULL, /* extend_max_remote_streams_bidi */
+ NULL, /* extend_max_remote_streams_uni */
+ cb_extend_max_stream_data,
+ NULL, /* dcid_status */
+ NULL /* handshake_confirmed */
+};
+
+/*
+ * Might be called twice for happy eyeballs.
+ */
+CURLcode Curl_quic_connect(struct connectdata *conn,
+ curl_socket_t sockfd,
+ int sockindex,
+ const struct sockaddr *addr,
+ socklen_t addrlen)
+{
+ int rc;
+ int rv;
+ CURLcode result;
+ ngtcp2_path path; /* TODO: this must be initialized properly */
+ struct Curl_easy *data = conn->data;
+ struct quicsocket *qs = &conn->hequic[sockindex];
+ char ipbuf[40];
+ long port;
+ uint8_t paramsbuf[64];
+ ngtcp2_transport_params params;
+ ssize_t nwrite;
+
+ qs->conn = conn;
+
+ /* extract the used address as a string */
+ if(!Curl_addr2string((struct sockaddr*)addr, addrlen, ipbuf, &port)) {
+ char buffer[STRERROR_LEN];
+ failf(data, "ssrem inet_ntop() failed with errno %d: %s",
+ SOCKERRNO, Curl_strerror(SOCKERRNO, buffer, sizeof(buffer)));
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ }
+
+ infof(data, "Connect socket %d over QUIC to %s:%ld\n",
+ sockfd, ipbuf, port);
+
+ qs->version = NGTCP2_PROTO_VER;
+ qs->sslctx = quic_ssl_ctx(data);
+ if(!qs->sslctx)
+ return CURLE_QUIC_CONNECT_ERROR;
+
+ if(quic_init_ssl(qs))
+ return CURLE_QUIC_CONNECT_ERROR;
+
+ qs->dcid.datalen = NGTCP2_MAX_CIDLEN;
+ result = Curl_rand(data, qs->dcid.data, NGTCP2_MAX_CIDLEN);
+ if(result)
+ return result;
+
+ qs->scid.datalen = NGTCP2_MAX_CIDLEN;
+ result = Curl_rand(data, qs->scid.data, NGTCP2_MAX_CIDLEN);
+ if(result)
+ return result;
+
+ quic_settings(&qs->settings, data->set.buffer_size);
+
+ qs->local_addrlen = sizeof(qs->local_addr);
+ rv = getsockname(sockfd, (struct sockaddr *)&qs->local_addr,
+ &qs->local_addrlen);
+ if(rv == -1)
+ return CURLE_QUIC_CONNECT_ERROR;
+
+ ngtcp2_addr_init(&path.local, (uint8_t *)&qs->local_addr, qs->local_addrlen,
+ NULL);
+ ngtcp2_addr_init(&path.remote, (uint8_t*)addr, addrlen, NULL);
+
+#ifdef NGTCP2_PROTO_VER
+#define QUICVER NGTCP2_PROTO_VER
+#else
+#error "unsupported ngtcp2 version"
+#endif
+ rc = ngtcp2_conn_client_new(&qs->qconn, &qs->dcid, &qs->scid, &path, QUICVER,
+ &ng_callbacks, &qs->settings, NULL, qs);
+ if(rc)
+ return CURLE_QUIC_CONNECT_ERROR;
+
+ ngtcp2_conn_get_local_transport_params(qs->qconn, &params);
+ nwrite = ngtcp2_encode_transport_params(
+ paramsbuf, sizeof(paramsbuf), NGTCP2_TRANSPORT_PARAMS_TYPE_CLIENT_HELLO,
+ &params);
+ if(nwrite < 0) {
+ failf(data, "ngtcp2_encode_transport_params: %s\n",
+ ngtcp2_strerror((int)nwrite));
+ return CURLE_QUIC_CONNECT_ERROR;
+ }
+
+ if(!SSL_set_quic_transport_params(qs->ssl, paramsbuf, nwrite))
+ return CURLE_QUIC_CONNECT_ERROR;
+
+ rc = setup_initial_crypto_context(qs);
+ if(rc)
+ return CURLE_QUIC_CONNECT_ERROR;
+
+ return CURLE_OK;
+}
+
+/*
+ * Store ngtp2 version info in this buffer, Prefix with a space. Return total
+ * length written.
+ */
+int Curl_quic_ver(char *p, size_t len)
+{
+ ngtcp2_info *ng2 = ngtcp2_version(0);
+ nghttp3_info *ht3 = nghttp3_version(0);
+ return msnprintf(p, len, " ngtcp2/%s nghttp3/%s",
+ ng2->version_str, ht3->version_str);
+}
+
+static int ng_getsock(struct connectdata *conn, curl_socket_t *socks)
+{
+ struct SingleRequest *k = &conn->data->req;
+ int bitmap = GETSOCK_BLANK;
+
+ socks[0] = conn->sock[FIRSTSOCKET];
+
+ /* in a HTTP/2 connection we can basically always get a frame so we should
+ always be ready for one */
+ bitmap |= GETSOCK_READSOCK(FIRSTSOCKET);
+
+ /* we're still uploading or the HTTP/2 layer wants to send data */
+ if((k->keepon & (KEEP_SEND|KEEP_SEND_PAUSE)) == KEEP_SEND)
+ bitmap |= GETSOCK_WRITESOCK(FIRSTSOCKET);
+
+ return bitmap;
+}
+
+static int ng_perform_getsock(const struct connectdata *conn,
+ curl_socket_t *socks)
+{
+ return ng_getsock((struct connectdata *)conn, socks);
+}
+
+static CURLcode ng_disconnect(struct connectdata *conn,
+ bool dead_connection)
+{
+ int i;
+ struct quicsocket *qs = &conn->hequic[0];
+ (void)dead_connection;
+ if(qs->ssl)
+ SSL_free(qs->ssl);
+ for(i = 0; i < 3; i++)
+ free(qs->crypto_data[i].buf);
+ nghttp3_conn_del(qs->h3conn);
+ ngtcp2_conn_del(qs->qconn);
+ SSL_CTX_free(qs->sslctx);
+ return CURLE_OK;
+}
+
+static unsigned int ng_conncheck(struct connectdata *conn,
+ unsigned int checks_to_perform)
+{
+ (void)conn;
+ (void)checks_to_perform;
+ return CONNRESULT_NONE;
+}
+
+static const struct Curl_handler Curl_handler_http3 = {
+ "HTTPS", /* scheme */
+ ZERO_NULL, /* setup_connection */
+ Curl_http, /* do_it */
+ Curl_http_done, /* done */
+ ZERO_NULL, /* do_more */
+ ZERO_NULL, /* connect_it */
+ ZERO_NULL, /* connecting */
+ ZERO_NULL, /* doing */
+ ng_getsock, /* proto_getsock */
+ ng_getsock, /* doing_getsock */
+ ZERO_NULL, /* domore_getsock */
+ ng_perform_getsock, /* perform_getsock */
+ ng_disconnect, /* disconnect */
+ ZERO_NULL, /* readwrite */
+ ng_conncheck, /* connection_check */
+ PORT_HTTP, /* defport */
+ CURLPROTO_HTTPS, /* protocol */
+ PROTOPT_SSL | PROTOPT_STREAM /* flags */
+};
+
+static int cb_h3_stream_close(nghttp3_conn *conn, int64_t stream_id,
+ uint64_t app_error_code, void *user_data,
+ void *stream_user_data)
+{
+ struct Curl_easy *data = stream_user_data;
+ struct HTTP *stream = data->req.protop;
+ (void)conn;
+ (void)stream_id;
+ (void)app_error_code;
+ (void)user_data;
+ H3BUGF(infof(data, "cb_h3_stream_close CALLED\n"));
+
+ stream->closed = TRUE;
+ Curl_expire(data, 0, EXPIRE_QUIC);
+ /* make sure that ngh3_stream_recv is called again to complete the transfer
+ even if there are no more packets to be received from the server. */
+ data->state.drain = 1;
+ return 0;
+}
+
+/* Minimum size of the overflow buffer */
+#define OVERFLOWSIZE 1024
+
+/*
+ * allocate_overflow() ensures that there is room for incoming data in the
+ * overflow buffer, growing it to accommodate the new data if necessary. We
+ * may need to use the overflow buffer because we can't precisely limit the
+ * amount of HTTP/3 header data we receive using QUIC flow control mechanisms.
+ */
+static CURLcode allocate_overflow(struct Curl_easy *data,
+ struct HTTP *stream,
+ size_t length)
+{
+ size_t maxleft;
+ size_t newsize;
+ /* length can be arbitrarily large, so take care not to overflow newsize */
+ maxleft = CURL_MAX_READ_SIZE - stream->overflow_buflen;
+ if(length > maxleft) {
+ /* The reason to have a max limit for this is to avoid the risk of a bad
+ server feeding libcurl with a highly compressed list of headers that
+ will cause our overflow buffer to grow too large */
+ failf(data, "Rejected %zu bytes of overflow data (max is %d)!",
+ stream->overflow_buflen + length, CURL_MAX_READ_SIZE);
+ return CURLE_OUT_OF_MEMORY;
+ }
+ newsize = stream->overflow_buflen + length;
+ if(newsize > stream->overflow_bufsize) {
+ /* We enlarge the overflow buffer as it is too small */
+ char *newbuff;
+ newsize = CURLMAX(newsize * 3 / 2, stream->overflow_bufsize*2);
+ newsize = CURLMIN(CURLMAX(OVERFLOWSIZE, newsize), CURL_MAX_READ_SIZE);
+ newbuff = realloc(stream->overflow_buf, newsize);
+ if(!newbuff) {
+ failf(data, "Failed to alloc memory for overflow buffer!");
+ return CURLE_OUT_OF_MEMORY;
+ }
+ stream->overflow_buf = newbuff;
+ stream->overflow_bufsize = newsize;
+ infof(data, "Grew HTTP/3 overflow buffer to %zu bytes\n", newsize);
+ }
+ return CURLE_OK;
+}
+
+/*
+ * write_data() copies data to the stream's receive buffer. If not enough
+ * space is available in the receive buffer, it copies the rest to the
+ * stream's overflow buffer.
+ */
+static CURLcode write_data(struct Curl_easy *data,
+ struct HTTP *stream,
+ const void *mem, size_t memlen)
+{
+ CURLcode result = CURLE_OK;
+ const char *buf = mem;
+ size_t ncopy = memlen;
+ /* copy as much as possible to the receive buffer */
+ if(stream->len) {
+ size_t len = CURLMIN(ncopy, stream->len);
+#if 0 /* extra debugging of incoming h3 data */
+ fprintf(stderr, "!! Copies %zd bytes to %p (total %zd)\n",
+ len, stream->mem, stream->memlen);
+#endif
+ memcpy(stream->mem, buf, len);
+ stream->len -= len;
+ stream->memlen += len;
+ stream->mem += len;
+ buf += len;
+ ncopy -= len;
+ }
+ /* copy the rest to the overflow buffer */
+ if(ncopy) {
+ result = allocate_overflow(data, stream, ncopy);
+ if(result) {
+ return result;
+ }
+#if 0 /* extra debugging of incoming h3 data */
+ fprintf(stderr, "!! Copies %zd overflow bytes to %p (total %zd)\n",
+ ncopy, stream->overflow_buf, stream->overflow_buflen);
+#endif
+ memcpy(stream->overflow_buf + stream->overflow_buflen, buf, ncopy);
+ stream->overflow_buflen += ncopy;
+ }
+#if 0 /* extra debugging of incoming h3 data */
+ {
+ size_t i;
+ for(i = 0; i < memlen; i++) {
+ fprintf(stderr, "!! data[%d]: %02x '%c'\n", i, buf[i], buf[i]);
+ }
+ }
+#endif
+ return result;
+}
+
+static int cb_h3_recv_data(nghttp3_conn *conn, int64_t stream_id,
+ const uint8_t *buf, size_t buflen,
+ void *user_data, void *stream_user_data)
+{
+ struct Curl_easy *data = stream_user_data;
+ struct HTTP *stream = data->req.protop;
+ CURLcode result = CURLE_OK;
+ (void)conn;
+
+ result = write_data(data, stream, buf, buflen);
+ if(result) {
+ return -1;
+ }
+ stream->unacked_window += buflen;
+ (void)stream_id;
+ (void)user_data;
+ return 0;
+}
+
+static int cb_h3_deferred_consume(nghttp3_conn *conn, int64_t stream_id,
+ size_t consumed, void *user_data,
+ void *stream_user_data)
+{
+ struct quicsocket *qs = user_data;
+ (void)conn;
+ (void)stream_user_data;
+ (void)stream_id;
+
+ ngtcp2_conn_extend_max_stream_offset(qs->qconn, stream_id, consumed);
+ ngtcp2_conn_extend_max_offset(qs->qconn, consumed);
+ return 0;
+}
+
+/* Decode HTTP status code. Returns -1 if no valid status code was
+ decoded. (duplicate from http2.c) */
+static int decode_status_code(const uint8_t *value, size_t len)
+{
+ int i;
+ int res;
+
+ if(len != 3) {
+ return -1;
+ }
+
+ res = 0;
+
+ for(i = 0; i < 3; ++i) {
+ char c = value[i];
+
+ if(c < '0' || c > '9') {
+ return -1;
+ }
+
+ res *= 10;
+ res += c - '0';
+ }
+
+ return res;
+}
+
+static int cb_h3_end_headers(nghttp3_conn *conn, int64_t stream_id,
+ void *user_data, void *stream_user_data)
+{
+ struct Curl_easy *data = stream_user_data;
+ struct HTTP *stream = data->req.protop;
+ CURLcode result = CURLE_OK;
+ (void)conn;
+ (void)stream_id;
+ (void)user_data;
+
+ /* add a CRLF only if we've received some headers */
+ if(stream->firstheader) {
+ result = write_data(data, stream, "\r\n", 2);
+ if(result) {
+ return -1;
+ }
+ }
+ return 0;
+}
+
+static int cb_h3_recv_header(nghttp3_conn *conn, int64_t stream_id,
+ int32_t token, nghttp3_rcbuf *name,
+ nghttp3_rcbuf *value, uint8_t flags,
+ void *user_data, void *stream_user_data)
+{
+ nghttp3_vec h3name = nghttp3_rcbuf_get_buf(name);
+ nghttp3_vec h3val = nghttp3_rcbuf_get_buf(value);
+ struct Curl_easy *data = stream_user_data;
+ struct HTTP *stream = data->req.protop;
+ CURLcode result = CURLE_OK;
+ (void)conn;
+ (void)stream_id;
+ (void)token;
+ (void)flags;
+ (void)user_data;
+
+ if(h3name.len == sizeof(":status") - 1 &&
+ !memcmp(":status", h3name.base, h3name.len)) {
+ char line[14]; /* status line is always 13 characters long */
+ size_t ncopy;
+ int status = decode_status_code(h3val.base, h3val.len);
+ DEBUGASSERT(status != -1);
+ ncopy = msnprintf(line, sizeof(line), "HTTP/3 %03d \r\n", status);
+ result = write_data(data, stream, line, ncopy);
+ if(result) {
+ return -1;
+ }
+ }
+ else {
+ /* store as a HTTP1-style header */
+ result = write_data(data, stream, h3name.base, h3name.len);
+ if(result) {
+ return -1;
+ }
+ result = write_data(data, stream, ": ", 2);
+ if(result) {
+ return -1;
+ }
+ result = write_data(data, stream, h3val.base, h3val.len);
+ if(result) {
+ return -1;
+ }
+ result = write_data(data, stream, "\r\n", 2);
+ if(result) {
+ return -1;
+ }
+ }
+
+ stream->firstheader = TRUE;
+ return 0;
+}
+
+static int cb_h3_send_stop_sending(nghttp3_conn *conn, int64_t stream_id,
+ uint64_t app_error_code,
+ void *user_data,
+ void *stream_user_data)
+{
+ (void)conn;
+ (void)stream_id;
+ (void)app_error_code;
+ (void)user_data;
+ (void)stream_user_data;
+ return 0;
+}
+
+static nghttp3_conn_callbacks ngh3_callbacks = {
+ cb_h3_acked_stream_data, /* acked_stream_data */
+ cb_h3_stream_close,
+ cb_h3_recv_data,
+ cb_h3_deferred_consume,
+ NULL, /* begin_headers */
+ cb_h3_recv_header,
+ cb_h3_end_headers,
+ NULL, /* begin_trailers */
+ cb_h3_recv_header,
+ NULL, /* end_trailers */
+ NULL, /* http_begin_push_promise */
+ NULL, /* http_recv_push_promise */
+ NULL, /* http_end_push_promise */
+ NULL, /* http_cancel_push */
+ cb_h3_send_stop_sending,
+ NULL, /* push_stream */
+ NULL, /* end_stream */
+};
+
+static int init_ngh3_conn(struct quicsocket *qs)
+{
+ CURLcode result;
+ int rc;
+ int64_t ctrl_stream_id, qpack_enc_stream_id, qpack_dec_stream_id;
+
+ if(ngtcp2_conn_get_max_local_streams_uni(qs->qconn) < 3) {
+ failf(qs->conn->data, "too few available QUIC streams");
+ return CURLE_QUIC_CONNECT_ERROR;
+ }
+
+ nghttp3_conn_settings_default(&qs->h3settings);
+
+ rc = nghttp3_conn_client_new(&qs->h3conn,
+ &ngh3_callbacks,
+ &qs->h3settings,
+ nghttp3_mem_default(),
+ qs);
+ if(rc) {
+ result = CURLE_OUT_OF_MEMORY;
+ goto fail;
+ }
+
+ rc = ngtcp2_conn_open_uni_stream(qs->qconn, &ctrl_stream_id, NULL);
+ if(rc) {
+ result = CURLE_QUIC_CONNECT_ERROR;
+ goto fail;
+ }
+
+ rc = nghttp3_conn_bind_control_stream(qs->h3conn, ctrl_stream_id);
+ if(rc) {
+ result = CURLE_QUIC_CONNECT_ERROR;
+ goto fail;
+ }
+
+ rc = ngtcp2_conn_open_uni_stream(qs->qconn, &qpack_enc_stream_id, NULL);
+ if(rc) {
+ result = CURLE_QUIC_CONNECT_ERROR;
+ goto fail;
+ }
+
+ rc = ngtcp2_conn_open_uni_stream(qs->qconn, &qpack_dec_stream_id, NULL);
+ if(rc) {
+ result = CURLE_QUIC_CONNECT_ERROR;
+ goto fail;
+ }
+
+ rc = nghttp3_conn_bind_qpack_streams(qs->h3conn, qpack_enc_stream_id,
+ qpack_dec_stream_id);
+ if(rc) {
+ result = CURLE_QUIC_CONNECT_ERROR;
+ goto fail;
+ }
+
+ return CURLE_OK;
+ fail:
+
+ return result;
+}
+
+static Curl_recv ngh3_stream_recv;
+static Curl_send ngh3_stream_send;
+
+static size_t drain_overflow_buffer(struct HTTP *stream)
+{
+ size_t ncopy = CURLMIN(stream->overflow_buflen, stream->len);
+ if(ncopy > 0) {
+ memcpy(stream->mem, stream->overflow_buf, ncopy);
+ stream->len -= ncopy;
+ stream->mem += ncopy;
+ stream->memlen += ncopy;
+ stream->overflow_buflen -= ncopy;
+ memmove(stream->overflow_buf, stream->overflow_buf + ncopy,
+ stream->overflow_buflen);
+ }
+ return ncopy;
+}
+
+/* incoming data frames on the h3 stream */
+static ssize_t ngh3_stream_recv(struct connectdata *conn,
+ int sockindex,
+ char *buf,
+ size_t buffersize,
+ CURLcode *curlcode)
+{
+ curl_socket_t sockfd = conn->sock[sockindex];
+ struct HTTP *stream = conn->data->req.protop;
+ struct quicsocket *qs = conn->quic;
+
+ if(!stream->memlen) {
+ /* remember where to store incoming data for this stream and how big the
+ buffer is */
+ stream->mem = buf;
+ stream->len = buffersize;
+ }
+ /* else, there's data in the buffer already */
+
+ /* if there's data in the overflow buffer from a previous call, copy as much
+ as possible to the receive buffer before receiving more */
+ drain_overflow_buffer(stream);
+
+ if(ng_process_ingress(conn, sockfd, qs)) {
+ *curlcode = CURLE_RECV_ERROR;
+ return -1;
+ }
+ if(ng_flush_egress(conn, sockfd, qs)) {
+ *curlcode = CURLE_SEND_ERROR;
+ return -1;
+ }
+
+ if(stream->memlen) {
+ ssize_t memlen = stream->memlen;
+ /* data arrived */
+ *curlcode = CURLE_OK;
+ /* reset to allow more data to come */
+ stream->memlen = 0;
+ stream->mem = buf;
+ stream->len = buffersize;
+ /* extend the stream window with the data we're consuming and send out
+ any additional packets to tell the server that we can receive more */
+ extend_stream_window(qs->qconn, stream);
+ if(ng_flush_egress(conn, sockfd, qs)) {
+ *curlcode = CURLE_SEND_ERROR;
+ return -1;
+ }
+ return memlen;
+ }
+
+ if(stream->closed) {
+ *curlcode = CURLE_OK;
+ return 0;
+ }
+
+ infof(conn->data, "ngh3_stream_recv returns 0 bytes and EAGAIN\n");
+ *curlcode = CURLE_AGAIN;
+ return -1;
+}
+
+/* this amount of data has now been acked on this stream */
+static int cb_h3_acked_stream_data(nghttp3_conn *conn, int64_t stream_id,
+ size_t datalen, void *user_data,
+ void *stream_user_data)
+{
+ struct Curl_easy *data = stream_user_data;
+ struct HTTP *stream = data->req.protop;
+ (void)conn;
+ (void)stream_id;
+ (void)user_data;
+
+ if(!data->set.postfields) {
+ stream->h3out->used -= datalen;
+ H3BUGF(infof(data,
+ "cb_h3_acked_stream_data, %zd bytes, %zd left unacked\n",
+ datalen, stream->h3out->used));
+ DEBUGASSERT(stream->h3out->used < H3_SEND_SIZE);
+ }
+ return 0;
+}
+
+static ssize_t cb_h3_readfunction(nghttp3_conn *conn, int64_t stream_id,
+ nghttp3_vec *vec, size_t veccnt,
+ uint32_t *pflags, void *user_data,
+ void *stream_user_data)
+{
+ struct Curl_easy *data = stream_user_data;
+ size_t nread;
+ struct HTTP *stream = data->req.protop;
+ (void)conn;
+ (void)stream_id;
+ (void)user_data;
+ (void)veccnt;
+
+ if(data->set.postfields) {
+ vec[0].base = data->set.postfields;
+ vec[0].len = data->state.infilesize;
+ *pflags = NGHTTP3_DATA_FLAG_EOF;
+ return 1;
+ }
+
+ nread = CURLMIN(stream->upload_len, H3_SEND_SIZE - stream->h3out->used);
+ if(nread > 0) {
+ /* nghttp3 wants us to hold on to the data until it tells us it is okay to
+ delete it. Append the data at the end of the h3out buffer. Since we can
+ only return consecutive data, copy the amount that fits and the next
+ part comes in next invoke. */
+ struct h3out *out = stream->h3out;
+ if(nread + out->windex > H3_SEND_SIZE)
+ nread = H3_SEND_SIZE - out->windex;
+
+ memcpy(&out->buf[out->windex], stream->upload_mem, nread);
+ out->windex += nread;
+ out->used += nread;
+
+ /* that's the chunk we return to nghttp3 */
+ vec[0].base = &out->buf[out->windex];
+ vec[0].len = nread;
+
+ if(out->windex == H3_SEND_SIZE)
+ out->windex = 0; /* wrap */
+ stream->upload_mem += nread;
+ stream->upload_len -= nread;
+ if(data->state.infilesize != -1) {
+ stream->upload_left -= nread;
+ if(!stream->upload_left)
+ *pflags = NGHTTP3_DATA_FLAG_EOF;
+ }
+ H3BUGF(infof(data, "cb_h3_readfunction %zd bytes%s (at %zd unacked)\n",
+ nread, *pflags == NGHTTP3_DATA_FLAG_EOF?" EOF":"",
+ out->used));
+ }
+ if(stream->upload_done && !stream->upload_len &&
+ (stream->upload_left <= 0)) {
+ H3BUGF(infof(data, "!!!!!!!!! cb_h3_readfunction sets EOF\n"));
+ *pflags = NGHTTP3_DATA_FLAG_EOF;
+ return 0;
+ }
+ else if(!nread) {
+ return NGHTTP3_ERR_WOULDBLOCK;
+ }
+ return 1;
+}
+
+/* Index where :authority header field will appear in request header
+ field list. */
+#define AUTHORITY_DST_IDX 3
+
+static CURLcode http_request(struct connectdata *conn, const void *mem,
+ size_t len)
+{
+ struct HTTP *stream = conn->data->req.protop;
+ size_t nheader;
+ size_t i;
+ size_t authority_idx;
+ char *hdbuf = (char *)mem;
+ char *end, *line_end;
+ struct quicsocket *qs = conn->quic;
+ CURLcode result = CURLE_OK;
+ struct Curl_easy *data = conn->data;
+ nghttp3_nv *nva = NULL;
+ int64_t stream3_id;
+ int rc;
+ struct h3out *h3out = NULL;
+
+ rc = ngtcp2_conn_open_bidi_stream(qs->qconn, &stream3_id, NULL);
+ if(rc) {
+ failf(conn->data, "can get bidi streams");
+ result = CURLE_SEND_ERROR;
+ goto fail;
+ }
+
+ stream->stream3_id = stream3_id;
+ stream->h3req = TRUE; /* senf off! */
+
+ /* Calculate number of headers contained in [mem, mem + len). Assumes a
+ correctly generated HTTP header field block. */
+ nheader = 0;
+ for(i = 1; i < len; ++i) {
+ if(hdbuf[i] == '\n' && hdbuf[i - 1] == '\r') {
+ ++nheader;
+ ++i;
+ }
+ }
+ if(nheader < 2)
+ goto fail;
+
+ /* We counted additional 2 \r\n in the first and last line. We need 3
+ new headers: :method, :path and :scheme. Therefore we need one
+ more space. */
+ nheader += 1;
+ nva = malloc(sizeof(nghttp3_nv) * nheader);
+ if(!nva) {
+ result = CURLE_OUT_OF_MEMORY;
+ goto fail;
+ }
+
+ /* Extract :method, :path from request line
+ We do line endings with CRLF so checking for CR is enough */
+ line_end = memchr(hdbuf, '\r', len);
+ if(!line_end) {
+ result = CURLE_BAD_FUNCTION_ARGUMENT; /* internal error */
+ goto fail;
+ }
+
+ /* Method does not contain spaces */
+ end = memchr(hdbuf, ' ', line_end - hdbuf);
+ if(!end || end == hdbuf)
+ goto fail;
+ nva[0].name = (unsigned char *)":method";
+ nva[0].namelen = strlen((char *)nva[0].name);
+ nva[0].value = (unsigned char *)hdbuf;
+ nva[0].valuelen = (size_t)(end - hdbuf);
+ nva[0].flags = NGHTTP3_NV_FLAG_NONE;
+
+ hdbuf = end + 1;
+
+ /* Path may contain spaces so scan backwards */
+ end = NULL;
+ for(i = (size_t)(line_end - hdbuf); i; --i) {
+ if(hdbuf[i - 1] == ' ') {
+ end = &hdbuf[i - 1];
+ break;
+ }
+ }
+ if(!end || end == hdbuf)
+ goto fail;
+ nva[1].name = (unsigned char *)":path";
+ nva[1].namelen = strlen((char *)nva[1].name);
+ nva[1].value = (unsigned char *)hdbuf;
+ nva[1].valuelen = (size_t)(end - hdbuf);
+ nva[1].flags = NGHTTP3_NV_FLAG_NONE;
+
+ nva[2].name = (unsigned char *)":scheme";
+ nva[2].namelen = strlen((char *)nva[2].name);
+ if(conn->handler->flags & PROTOPT_SSL)
+ nva[2].value = (unsigned char *)"https";
+ else
+ nva[2].value = (unsigned char *)"http";
+ nva[2].valuelen = strlen((char *)nva[2].value);
+ nva[2].flags = NGHTTP3_NV_FLAG_NONE;
+
+
+ authority_idx = 0;
+ i = 3;
+ while(i < nheader) {
+ size_t hlen;
+
+ hdbuf = line_end + 2;
+
+ /* check for next CR, but only within the piece of data left in the given
+ buffer */
+ line_end = memchr(hdbuf, '\r', len - (hdbuf - (char *)mem));
+ if(!line_end || (line_end == hdbuf))
+ goto fail;
+
+ /* header continuation lines are not supported */
+ if(*hdbuf == ' ' || *hdbuf == '\t')
+ goto fail;
+
+ for(end = hdbuf; end < line_end && *end != ':'; ++end)
+ ;
+ if(end == hdbuf || end == line_end)
+ goto fail;
+ hlen = end - hdbuf;
+
+ if(hlen == 4 && strncasecompare("host", hdbuf, 4)) {
+ authority_idx = i;
+ nva[i].name = (unsigned char *)":authority";
+ nva[i].namelen = strlen((char *)nva[i].name);
+ }
+ else {
+ nva[i].namelen = (size_t)(end - hdbuf);
+ /* Lower case the header name for HTTP/3 */
+ Curl_strntolower((char *)hdbuf, hdbuf, nva[i].namelen);
+ nva[i].name = (unsigned char *)hdbuf;
+ }
+ nva[i].flags = NGHTTP3_NV_FLAG_NONE;
+ hdbuf = end + 1;
+ while(*hdbuf == ' ' || *hdbuf == '\t')
+ ++hdbuf;
+ end = line_end;
+
+#if 0 /* This should probably go in more or less like this */
+ switch(inspect_header((const char *)nva[i].name, nva[i].namelen, hdbuf,
+ end - hdbuf)) {
+ case HEADERINST_IGNORE:
+ /* skip header fields prohibited by HTTP/2 specification. */
+ --nheader;
+ continue;
+ case HEADERINST_TE_TRAILERS:
+ nva[i].value = (uint8_t*)"trailers";
+ nva[i].value_len = sizeof("trailers") - 1;
+ break;
+ default:
+ nva[i].value = (unsigned char *)hdbuf;
+ nva[i].value_len = (size_t)(end - hdbuf);
+ }
+#endif
+ nva[i].value = (unsigned char *)hdbuf;
+ nva[i].valuelen = (size_t)(end - hdbuf);
+ nva[i].flags = NGHTTP3_NV_FLAG_NONE;
+
+ ++i;
+ }
+
+ /* :authority must come before non-pseudo header fields */
+ if(authority_idx != 0 && authority_idx != AUTHORITY_DST_IDX) {
+ nghttp3_nv authority = nva[authority_idx];
+ for(i = authority_idx; i > AUTHORITY_DST_IDX; --i) {
+ nva[i] = nva[i - 1];
+ }
+ nva[i] = authority;
+ }
+
+ /* Warn stream may be rejected if cumulative length of headers is too
+ large. */
+#define MAX_ACC 60000 /* <64KB to account for some overhead */
+ {
+ size_t acc = 0;
+ for(i = 0; i < nheader; ++i)
+ acc += nva[i].namelen + nva[i].valuelen;
+
+ if(acc > MAX_ACC) {
+ infof(data, "http_request: Warning: The cumulative length of all "
+ "headers exceeds %zu bytes and that could cause the "
+ "stream to be rejected.\n", MAX_ACC);
+ }
+ }
+
+ switch(data->set.httpreq) {
+ case HTTPREQ_POST:
+ case HTTPREQ_POST_FORM:
+ case HTTPREQ_POST_MIME:
+ case HTTPREQ_PUT: {
+ nghttp3_data_reader data_reader;
+ if(data->state.infilesize != -1)
+ stream->upload_left = data->state.infilesize;
+ else
+ /* data sending without specifying the data amount up front */
+ stream->upload_left = -1; /* unknown, but not zero */
+
+ data_reader.read_data = cb_h3_readfunction;
+
+ h3out = calloc(sizeof(struct h3out), 1);
+ if(!h3out) {
+ result = CURLE_OUT_OF_MEMORY;
+ goto fail;
+ }
+ stream->h3out = h3out;
+
+ rc = nghttp3_conn_submit_request(qs->h3conn, stream->stream3_id,
+ nva, nheader, &data_reader,
+ conn->data);
+ if(rc) {
+ result = CURLE_SEND_ERROR;
+ goto fail;
+ }
+ break;
+ }
+ default:
+ stream->upload_left = 0; /* nothing left to send */
+ rc = nghttp3_conn_submit_request(qs->h3conn, stream->stream3_id,
+ nva, nheader,
+ NULL, /* no body! */
+ conn->data);
+ if(rc) {
+ result = CURLE_SEND_ERROR;
+ goto fail;
+ }
+ break;
+ }
+
+ Curl_safefree(nva);
+
+ infof(data, "Using HTTP/3 Stream ID: %x (easy handle %p)\n",
+ stream3_id, (void *)data);
+
+ return CURLE_OK;
+
+fail:
+ free(nva);
+ return result;
+}
+static ssize_t ngh3_stream_send(struct connectdata *conn,
+ int sockindex,
+ const void *mem,
+ size_t len,
+ CURLcode *curlcode)
+{
+ ssize_t sent;
+ struct quicsocket *qs = conn->quic;
+ curl_socket_t sockfd = conn->sock[sockindex];
+ struct HTTP *stream = conn->data->req.protop;
+
+ if(!stream->h3req) {
+ CURLcode result = http_request(conn, mem, len);
+ if(result) {
+ *curlcode = CURLE_SEND_ERROR;
+ return -1;
+ }
+ sent = len;
+ }
+ else {
+ H3BUGF(infof(conn->data, "ngh3_stream_send() wants to send %zd bytes\n",
+ len));
+ if(!stream->upload_len) {
+ stream->upload_mem = mem;
+ stream->upload_len = len;
+ (void)nghttp3_conn_resume_stream(qs->h3conn, stream->stream3_id);
+ sent = len;
+ }
+ else {
+ *curlcode = CURLE_AGAIN;
+ return -1;
+ }
+ }
+
+ if(ng_flush_egress(conn, sockfd, qs)) {
+ *curlcode = CURLE_SEND_ERROR;
+ return -1;
+ }
+
+ *curlcode = CURLE_OK;
+ return sent;
+}
+
+static void ng_has_connected(struct connectdata *conn, int tempindex)
+{
+ conn->recv[FIRSTSOCKET] = ngh3_stream_recv;
+ conn->send[FIRSTSOCKET] = ngh3_stream_send;
+ conn->handler = &Curl_handler_http3;
+ conn->bits.multiplex = TRUE; /* at least potentially multiplexed */
+ conn->httpversion = 30;
+ conn->bundle->multiuse = BUNDLE_MULTIPLEX;
+ conn->quic = &conn->hequic[tempindex];
+ DEBUGF(infof(conn->data, "ngtcp2 established connection!\n"));
+}
+
+/*
+ * There can be multiple connection attempts going on in parallel.
+ */
+CURLcode Curl_quic_is_connected(struct connectdata *conn,
+ int sockindex,
+ bool *done)
+{
+ CURLcode result;
+ struct quicsocket *qs = &conn->hequic[sockindex];
+ curl_socket_t sockfd = conn->tempsock[sockindex];
+
+ result = ng_process_ingress(conn, sockfd, qs);
+ if(result)
+ return result;
+
+ result = ng_flush_egress(conn, sockfd, qs);
+ if(result)
+ return result;
+
+ if(ngtcp2_conn_get_handshake_completed(qs->qconn)) {
+ *done = TRUE;
+ ng_has_connected(conn, sockindex);
+ }
+
+ return result;
+}
+
+static CURLcode ng_process_ingress(struct connectdata *conn, int sockfd,
+ struct quicsocket *qs)
+{
+ ssize_t recvd;
+ int rv;
+ uint8_t buf[65536];
+ size_t bufsize = sizeof(buf);
+ struct sockaddr_storage remote_addr;
+ socklen_t remote_addrlen;
+ ngtcp2_path path;
+ ngtcp2_tstamp ts = timestamp();
+
+ for(;;) {
+ remote_addrlen = sizeof(remote_addr);
+ while((recvd = recvfrom(sockfd, buf, bufsize, 0,
+ (struct sockaddr *)&remote_addr,
+ &remote_addrlen)) == -1 &&
+ SOCKERRNO == EINTR)
+ ;
+ if(recvd == -1) {
+ if(SOCKERRNO == EAGAIN || SOCKERRNO == EWOULDBLOCK)
+ break;
+
+ failf(conn->data, "ngtcp2: recvfrom() unexpectedly returned %d", recvd);
+ return CURLE_RECV_ERROR;
+ }
+
+ ngtcp2_addr_init(&path.local, (uint8_t *)&qs->local_addr,
+ qs->local_addrlen, NULL);
+ ngtcp2_addr_init(&path.remote, (uint8_t *)&remote_addr, remote_addrlen,
+ NULL);
+
+ rv = ngtcp2_conn_read_pkt(qs->qconn, &path, buf, recvd, ts);
+ if(rv != 0) {
+ /* TODO Send CONNECTION_CLOSE if possible */
+ return CURLE_RECV_ERROR;
+ }
+ }
+
+ return CURLE_OK;
+}
+
+static CURLcode ng_flush_egress(struct connectdata *conn, int sockfd,
+ struct quicsocket *qs)
+{
+ int rv;
+ ssize_t sent;
+ ssize_t outlen;
+ uint8_t out[NGTCP2_MAX_PKTLEN_IPV4];
+ size_t pktlen;
+ ngtcp2_path_storage ps;
+ ngtcp2_tstamp ts = timestamp();
+ struct sockaddr_storage remote_addr;
+ ngtcp2_tstamp expiry;
+ ngtcp2_duration timeout;
+ int64_t stream_id;
+ ssize_t veccnt;
+ int fin;
+ nghttp3_vec vec[16];
+ ssize_t ndatalen;
+
+ switch(qs->local_addr.ss_family) {
+ case AF_INET:
+ pktlen = NGTCP2_MAX_PKTLEN_IPV4;
+ break;
+#ifdef ENABLE_IPV6
+ case AF_INET6:
+ pktlen = NGTCP2_MAX_PKTLEN_IPV6;
+ break;
+#endif
+ default:
+ assert(0);
+ }
+
+ rv = ngtcp2_conn_handle_expiry(qs->qconn, ts);
+ if(rv != 0) {
+ failf(conn->data, "ngtcp2_conn_handle_expiry returned error: %s\n",
+ ngtcp2_strerror(rv));
+ return CURLE_SEND_ERROR;
+ }
+
+ ngtcp2_path_storage_zero(&ps);
+
+ for(;;) {
+ outlen = -1;
+ if(qs->h3conn && ngtcp2_conn_get_max_data_left(qs->qconn)) {
+ veccnt = nghttp3_conn_writev_stream(qs->h3conn, &stream_id, &fin, vec,
+ sizeof(vec) / sizeof(vec[0]));
+ if(veccnt < 0) {
+ failf(conn->data, "nghttp3_conn_writev_stream returned error: %s\n",
+ nghttp3_strerror((int)veccnt));
+ return CURLE_SEND_ERROR;
+ }
+ else if(veccnt > 0) {
+ outlen =
+ ngtcp2_conn_writev_stream(qs->qconn, &ps.path,
+ out, pktlen, &ndatalen,
+ NGTCP2_WRITE_STREAM_FLAG_MORE,
+ stream_id, fin,
+ (const ngtcp2_vec *)vec, veccnt, ts);
+ if(outlen == 0) {
+ break;
+ }
+ if(outlen < 0) {
+ if(outlen == NGTCP2_ERR_STREAM_DATA_BLOCKED ||
+ outlen == NGTCP2_ERR_STREAM_SHUT_WR) {
+ rv = nghttp3_conn_block_stream(qs->h3conn, stream_id);
+ if(rv != 0) {
+ failf(conn->data,
+ "nghttp3_conn_block_stream returned error: %s\n",
+ nghttp3_strerror(rv));
+ return CURLE_SEND_ERROR;
+ }
+ continue;
+ }
+ else if(outlen == NGTCP2_ERR_WRITE_STREAM_MORE) {
+ assert(ndatalen > 0);
+ rv = nghttp3_conn_add_write_offset(qs->h3conn, stream_id,
+ ndatalen);
+ if(rv != 0) {
+ failf(conn->data,
+ "nghttp3_conn_add_write_offset returned error: %s\n",
+ nghttp3_strerror(rv));
+ return CURLE_SEND_ERROR;
+ }
+ continue;
+ }
+ else {
+ failf(conn->data, "ngtcp2_conn_writev_stream returned error: %s\n",
+ ngtcp2_strerror((int)outlen));
+ return CURLE_SEND_ERROR;
+ }
+ }
+ else if(ndatalen >= 0) {
+ rv = nghttp3_conn_add_write_offset(qs->h3conn, stream_id, ndatalen);
+ if(rv != 0) {
+ failf(conn->data,
+ "nghttp3_conn_add_write_offset returned error: %s\n",
+ nghttp3_strerror(rv));
+ return CURLE_SEND_ERROR;
+ }
+ }
+ }
+ }
+ if(outlen < 0) {
+ outlen = ngtcp2_conn_write_pkt(qs->qconn, &ps.path, out, pktlen, ts);
+ if(outlen < 0) {
+ failf(conn->data, "ngtcp2_conn_write_pkt returned error: %s\n",
+ ngtcp2_strerror((int)outlen));
+ return CURLE_SEND_ERROR;
+ }
+ if(outlen == 0)
+ break;
+ }
+
+ memcpy(&remote_addr, ps.path.remote.addr, ps.path.remote.addrlen);
+ while((sent = send(sockfd, out, outlen, 0)) == -1 &&
+ SOCKERRNO == EINTR)
+ ;
+
+ if(sent == -1) {
+ if(SOCKERRNO == EAGAIN || SOCKERRNO == EWOULDBLOCK) {
+ /* TODO Cache packet */
+ break;
+ }
+ else {
+ failf(conn->data, "send() returned %zd (errno %d)\n", sent,
+ SOCKERRNO);
+ return CURLE_SEND_ERROR;
+ }
+ }
+ }
+
+ expiry = ngtcp2_conn_get_expiry(qs->qconn);
+ if(expiry != UINT64_MAX) {
+ if(expiry <= ts) {
+ timeout = NGTCP2_MILLISECONDS;
+ }
+ else {
+ timeout = expiry - ts;
+ }
+ Curl_expire(conn->data, timeout / NGTCP2_MILLISECONDS, EXPIRE_QUIC);
+ }
+
+ return CURLE_OK;
+}
+
+/*
+ * Called from transfer.c:done_sending when we stop HTTP/3 uploading.
+ */
+CURLcode Curl_quic_done_sending(struct connectdata *conn)
+{
+ if(conn->handler == &Curl_handler_http3) {
+ /* only for HTTP/3 transfers */
+ struct HTTP *stream = conn->data->req.protop;
+ struct quicsocket *qs = conn->quic;
+ stream->upload_done = TRUE;
+ (void)nghttp3_conn_resume_stream(qs->h3conn, stream->stream3_id);
+ }
+
+ return CURLE_OK;
+}
+
+/*
+ * Called from http.c:Curl_http_done when a request completes.
+ */
+void Curl_quic_done(struct Curl_easy *data, bool premature)
+{
+ (void)premature;
+ if(data->conn->handler == &Curl_handler_http3) {
+ /* only for HTTP/3 transfers */
+ struct HTTP *stream = data->req.protop;
+ Curl_safefree(stream->overflow_buf);
+ }
+}
+
+/*
+ * Called from transfer.c:data_pending to know if we should keep looping
+ * to receive more data from the connection.
+ */
+bool Curl_quic_data_pending(const struct Curl_easy *data)
+{
+ /* We may have received more data than we're able to hold in the receive
+ buffer and allocated an overflow buffer. Since it's possible that
+ there's no more data coming on the socket, we need to keep reading
+ until the overflow buffer is empty. */
+ const struct HTTP *stream = data->req.protop;
+ return stream->overflow_buflen > 0;
+}
+
+#endif
diff --git a/Utilities/cmcurl/lib/vquic/ngtcp2.h b/Utilities/cmcurl/lib/vquic/ngtcp2.h
new file mode 100644
index 0000000..30d442f
--- /dev/null
+++ b/Utilities/cmcurl/lib/vquic/ngtcp2.h
@@ -0,0 +1,63 @@
+#ifndef HEADER_CURL_VQUIC_NGTCP2_H
+#define HEADER_CURL_VQUIC_NGTCP2_H
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include "curl_setup.h"
+
+#ifdef USE_NGTCP2
+
+#include <ngtcp2/ngtcp2.h>
+#include <nghttp3/nghttp3.h>
+#include <openssl/ssl.h>
+
+struct quic_handshake {
+ char *buf; /* pointer to the buffer */
+ size_t alloclen; /* size of allocation */
+ size_t len; /* size of content in buffer */
+ size_t nread; /* how many bytes have been read */
+};
+
+struct quicsocket {
+ struct connectdata *conn; /* point back to the connection */
+ ngtcp2_conn *qconn;
+ ngtcp2_cid dcid;
+ ngtcp2_cid scid;
+ uint32_t version;
+ ngtcp2_settings settings;
+ SSL_CTX *sslctx;
+ SSL *ssl;
+ struct quic_handshake crypto_data[3];
+ /* the last TLS alert description generated by the local endpoint */
+ uint8_t tls_alert;
+ struct sockaddr_storage local_addr;
+ socklen_t local_addrlen;
+
+ nghttp3_conn *h3conn;
+ nghttp3_conn_settings h3settings;
+};
+
+#include "urldata.h"
+
+#endif
+
+#endif /* HEADER_CURL_VQUIC_NGTCP2_H */
diff --git a/Utilities/cmcurl/lib/vquic/quiche.c b/Utilities/cmcurl/lib/vquic/quiche.c
new file mode 100644
index 0000000..d09ba70
--- /dev/null
+++ b/Utilities/cmcurl/lib/vquic/quiche.c
@@ -0,0 +1,807 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include "curl_setup.h"
+
+#ifdef USE_QUICHE
+#include <quiche.h>
+#include <openssl/err.h>
+#include "urldata.h"
+#include "sendf.h"
+#include "strdup.h"
+#include "rand.h"
+#include "quic.h"
+#include "strcase.h"
+#include "multiif.h"
+#include "connect.h"
+#include "strerror.h"
+
+/* The last 3 #include files should be in this order */
+#include "curl_printf.h"
+#include "curl_memory.h"
+#include "memdebug.h"
+
+#define DEBUG_HTTP3
+/* #define DEBUG_QUICHE */
+#ifdef DEBUG_HTTP3
+#define H3BUGF(x) x
+#else
+#define H3BUGF(x) do { } while(0)
+#endif
+
+#define QUIC_MAX_STREAMS (256*1024)
+#define QUIC_MAX_DATA (1*1024*1024)
+#define QUIC_IDLE_TIMEOUT (60 * 1000) /* milliseconds */
+
+static CURLcode process_ingress(struct connectdata *conn,
+ curl_socket_t sockfd,
+ struct quicsocket *qs);
+
+static CURLcode flush_egress(struct connectdata *conn, curl_socket_t sockfd,
+ struct quicsocket *qs);
+
+static CURLcode http_request(struct connectdata *conn, const void *mem,
+ size_t len);
+static Curl_recv h3_stream_recv;
+static Curl_send h3_stream_send;
+
+
+static int quiche_getsock(struct connectdata *conn, curl_socket_t *socks)
+{
+ struct SingleRequest *k = &conn->data->req;
+ int bitmap = GETSOCK_BLANK;
+
+ socks[0] = conn->sock[FIRSTSOCKET];
+
+ /* in a HTTP/2 connection we can basically always get a frame so we should
+ always be ready for one */
+ bitmap |= GETSOCK_READSOCK(FIRSTSOCKET);
+
+ /* we're still uploading or the HTTP/2 layer wants to send data */
+ if((k->keepon & (KEEP_SEND|KEEP_SEND_PAUSE)) == KEEP_SEND)
+ bitmap |= GETSOCK_WRITESOCK(FIRSTSOCKET);
+
+ return bitmap;
+}
+
+static int quiche_perform_getsock(const struct connectdata *conn,
+ curl_socket_t *socks)
+{
+ return quiche_getsock((struct connectdata *)conn, socks);
+}
+
+static CURLcode quiche_disconnect(struct connectdata *conn,
+ bool dead_connection)
+{
+ struct quicsocket *qs = conn->quic;
+ (void)dead_connection;
+ quiche_h3_config_free(qs->h3config);
+ quiche_h3_conn_free(qs->h3c);
+ quiche_config_free(qs->cfg);
+ quiche_conn_free(qs->conn);
+ return CURLE_OK;
+}
+
+static unsigned int quiche_conncheck(struct connectdata *conn,
+ unsigned int checks_to_perform)
+{
+ (void)conn;
+ (void)checks_to_perform;
+ return CONNRESULT_NONE;
+}
+
+static CURLcode quiche_do(struct connectdata *conn, bool *done)
+{
+ struct HTTP *stream = conn->data->req.protop;
+ stream->h3req = FALSE; /* not sent */
+ return Curl_http(conn, done);
+}
+
+static const struct Curl_handler Curl_handler_http3 = {
+ "HTTPS", /* scheme */
+ ZERO_NULL, /* setup_connection */
+ quiche_do, /* do_it */
+ Curl_http_done, /* done */
+ ZERO_NULL, /* do_more */
+ ZERO_NULL, /* connect_it */
+ ZERO_NULL, /* connecting */
+ ZERO_NULL, /* doing */
+ quiche_getsock, /* proto_getsock */
+ quiche_getsock, /* doing_getsock */
+ ZERO_NULL, /* domore_getsock */
+ quiche_perform_getsock, /* perform_getsock */
+ quiche_disconnect, /* disconnect */
+ ZERO_NULL, /* readwrite */
+ quiche_conncheck, /* connection_check */
+ PORT_HTTP, /* defport */
+ CURLPROTO_HTTPS, /* protocol */
+ PROTOPT_SSL | PROTOPT_STREAM /* flags */
+};
+
+#ifdef DEBUG_QUICHE
+static void quiche_debug_log(const char *line, void *argp)
+{
+ (void)argp;
+ fprintf(stderr, "%s\n", line);
+}
+#endif
+
+CURLcode Curl_quic_connect(struct connectdata *conn, curl_socket_t sockfd,
+ int sockindex,
+ const struct sockaddr *addr, socklen_t addrlen)
+{
+ CURLcode result;
+ struct quicsocket *qs = &conn->hequic[sockindex];
+ struct Curl_easy *data = conn->data;
+
+#ifdef DEBUG_QUICHE
+ /* initialize debug log callback only once */
+ static int debug_log_init = 0;
+ if(!debug_log_init) {
+ quiche_enable_debug_logging(quiche_debug_log, NULL);
+ debug_log_init = 1;
+ }
+#endif
+
+ (void)addr;
+ (void)addrlen;
+
+ qs->cfg = quiche_config_new(QUICHE_PROTOCOL_VERSION);
+ if(!qs->cfg) {
+ failf(data, "can't create quiche config");
+ return CURLE_FAILED_INIT;
+ }
+
+ quiche_config_set_max_idle_timeout(qs->cfg, QUIC_IDLE_TIMEOUT);
+ quiche_config_set_initial_max_data(qs->cfg, QUIC_MAX_DATA);
+ quiche_config_set_initial_max_stream_data_bidi_local(qs->cfg, QUIC_MAX_DATA);
+ quiche_config_set_initial_max_stream_data_bidi_remote(qs->cfg,
+ QUIC_MAX_DATA);
+ quiche_config_set_initial_max_stream_data_uni(qs->cfg, QUIC_MAX_DATA);
+ quiche_config_set_initial_max_streams_bidi(qs->cfg, QUIC_MAX_STREAMS);
+ quiche_config_set_initial_max_streams_uni(qs->cfg, QUIC_MAX_STREAMS);
+ quiche_config_set_application_protos(qs->cfg,
+ (uint8_t *)
+ QUICHE_H3_APPLICATION_PROTOCOL,
+ sizeof(QUICHE_H3_APPLICATION_PROTOCOL)
+ - 1);
+
+ result = Curl_rand(data, qs->scid, sizeof(qs->scid));
+ if(result)
+ return result;
+
+ if(getenv("SSLKEYLOGFILE"))
+ quiche_config_log_keys(qs->cfg);
+
+ qs->conn = quiche_connect(conn->host.name, (const uint8_t *) qs->scid,
+ sizeof(qs->scid), qs->cfg);
+ if(!qs->conn) {
+ failf(data, "can't create quiche connection");
+ return CURLE_OUT_OF_MEMORY;
+ }
+
+ result = flush_egress(conn, sockfd, qs);
+ if(result)
+ return result;
+
+ /* store the used address as a string */
+ if(!Curl_addr2string((struct sockaddr*)addr, addrlen,
+ conn->primary_ip, &conn->primary_port)) {
+ char buffer[STRERROR_LEN];
+ failf(data, "ssrem inet_ntop() failed with errno %d: %s",
+ SOCKERRNO, Curl_strerror(SOCKERRNO, buffer, sizeof(buffer)));
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ }
+ memcpy(conn->ip_addr_str, conn->primary_ip, MAX_IPADR_LEN);
+ Curl_persistconninfo(conn);
+
+ /* for connection reuse purposes: */
+ conn->ssl[FIRSTSOCKET].state = ssl_connection_complete;
+
+ infof(data, "Sent QUIC client Initial, ALPN: %s\n",
+ QUICHE_H3_APPLICATION_PROTOCOL + 1);
+
+ return CURLE_OK;
+}
+
+static CURLcode quiche_has_connected(struct connectdata *conn,
+ int sockindex,
+ int tempindex)
+{
+ CURLcode result;
+ struct quicsocket *qs = conn->quic = &conn->hequic[tempindex];
+
+ conn->recv[sockindex] = h3_stream_recv;
+ conn->send[sockindex] = h3_stream_send;
+ conn->handler = &Curl_handler_http3;
+ conn->bits.multiplex = TRUE; /* at least potentially multiplexed */
+ conn->httpversion = 30;
+ conn->bundle->multiuse = BUNDLE_MULTIPLEX;
+
+ qs->h3config = quiche_h3_config_new();
+ if(!qs->h3config)
+ return CURLE_OUT_OF_MEMORY;
+
+ /* Create a new HTTP/3 connection on the QUIC connection. */
+ qs->h3c = quiche_h3_conn_new_with_transport(qs->conn, qs->h3config);
+ if(!qs->h3c) {
+ result = CURLE_OUT_OF_MEMORY;
+ goto fail;
+ }
+ if(conn->hequic[1-tempindex].cfg) {
+ qs = &conn->hequic[1-tempindex];
+ quiche_config_free(qs->cfg);
+ quiche_conn_free(qs->conn);
+ qs->cfg = NULL;
+ qs->conn = NULL;
+ }
+ return CURLE_OK;
+ fail:
+ quiche_h3_config_free(qs->h3config);
+ quiche_h3_conn_free(qs->h3c);
+ return result;
+}
+
+/*
+ * This function gets polled to check if this QUIC connection has connected.
+ */
+CURLcode Curl_quic_is_connected(struct connectdata *conn, int sockindex,
+ bool *done)
+{
+ CURLcode result;
+ struct quicsocket *qs = &conn->hequic[sockindex];
+ curl_socket_t sockfd = conn->tempsock[sockindex];
+
+ result = process_ingress(conn, sockfd, qs);
+ if(result)
+ return result;
+
+ result = flush_egress(conn, sockfd, qs);
+ if(result)
+ return result;
+
+ if(quiche_conn_is_established(qs->conn)) {
+ *done = TRUE;
+ result = quiche_has_connected(conn, 0, sockindex);
+ DEBUGF(infof(conn->data, "quiche established connection!\n"));
+ }
+
+ return result;
+}
+
+static CURLcode process_ingress(struct connectdata *conn, int sockfd,
+ struct quicsocket *qs)
+{
+ ssize_t recvd;
+ struct Curl_easy *data = conn->data;
+ uint8_t *buf = (uint8_t *)data->state.buffer;
+ size_t bufsize = data->set.buffer_size;
+
+ /* in case the timeout expired */
+ quiche_conn_on_timeout(qs->conn);
+
+ do {
+ recvd = recv(sockfd, buf, bufsize, 0);
+ if((recvd < 0) && ((SOCKERRNO == EAGAIN) || (SOCKERRNO == EWOULDBLOCK)))
+ break;
+
+ if(recvd < 0) {
+ failf(conn->data, "quiche: recv() unexpectedly returned %d "
+ "(errno: %d, socket %d)", recvd, SOCKERRNO, sockfd);
+ return CURLE_RECV_ERROR;
+ }
+
+ recvd = quiche_conn_recv(qs->conn, buf, recvd);
+ if(recvd == QUICHE_ERR_DONE)
+ break;
+
+ if(recvd < 0) {
+ failf(conn->data, "quiche_conn_recv() == %d", recvd);
+ return CURLE_RECV_ERROR;
+ }
+ } while(1);
+
+ return CURLE_OK;
+}
+
+/*
+ * flush_egress drains the buffers and sends off data.
+ * Calls failf() on errors.
+ */
+static CURLcode flush_egress(struct connectdata *conn, int sockfd,
+ struct quicsocket *qs)
+{
+ ssize_t sent;
+ static uint8_t out[1200];
+ int64_t timeout_ns;
+
+ do {
+ sent = quiche_conn_send(qs->conn, out, sizeof(out));
+ if(sent == QUICHE_ERR_DONE)
+ break;
+
+ if(sent < 0) {
+ failf(conn->data, "quiche_conn_send returned %zd\n",
+ sent);
+ return CURLE_SEND_ERROR;
+ }
+
+ sent = send(sockfd, out, sent, 0);
+ if(sent < 0) {
+ failf(conn->data, "send() returned %zd\n", sent);
+ return CURLE_SEND_ERROR;
+ }
+ } while(1);
+
+ /* time until the next timeout event, as nanoseconds. */
+ timeout_ns = quiche_conn_timeout_as_nanos(qs->conn);
+ if(timeout_ns)
+ /* expire uses milliseconds */
+ Curl_expire(conn->data, (timeout_ns + 999999) / 1000000, EXPIRE_QUIC);
+
+ return CURLE_OK;
+}
+
+struct h3h1header {
+ char *dest;
+ size_t destlen; /* left to use */
+ size_t nlen; /* used */
+};
+
+static int cb_each_header(uint8_t *name, size_t name_len,
+ uint8_t *value, size_t value_len,
+ void *argp)
+{
+ struct h3h1header *headers = (struct h3h1header *)argp;
+ size_t olen = 0;
+
+ if((name_len == 7) && !strncmp(":status", (char *)name, 7)) {
+ msnprintf(headers->dest,
+ headers->destlen, "HTTP/3 %.*s\n",
+ (int) value_len, value);
+ }
+ else if(!headers->nlen) {
+ return CURLE_HTTP3;
+ }
+ else {
+ msnprintf(headers->dest,
+ headers->destlen, "%.*s: %.*s\n",
+ (int)name_len, name, (int) value_len, value);
+ }
+ olen = strlen(headers->dest);
+ headers->destlen -= olen;
+ headers->nlen += olen;
+ headers->dest += olen;
+ return 0;
+}
+
+static ssize_t h3_stream_recv(struct connectdata *conn,
+ int sockindex,
+ char *buf,
+ size_t buffersize,
+ CURLcode *curlcode)
+{
+ ssize_t recvd = -1;
+ ssize_t rcode;
+ struct quicsocket *qs = conn->quic;
+ curl_socket_t sockfd = conn->sock[sockindex];
+ quiche_h3_event *ev;
+ int rc;
+ struct h3h1header headers;
+ struct Curl_easy *data = conn->data;
+ struct HTTP *stream = data->req.protop;
+ headers.dest = buf;
+ headers.destlen = buffersize;
+ headers.nlen = 0;
+
+ if(process_ingress(conn, sockfd, qs)) {
+ infof(data, "h3_stream_recv returns on ingress\n");
+ *curlcode = CURLE_RECV_ERROR;
+ return -1;
+ }
+
+ while(recvd < 0) {
+ int64_t s = quiche_h3_conn_poll(qs->h3c, qs->conn, &ev);
+ if(s < 0)
+ /* nothing more to do */
+ break;
+
+ if(s != stream->stream3_id) {
+ /* another transfer, ignore for now */
+ infof(data, "Got h3 for stream %u, expects %u\n",
+ s, stream->stream3_id);
+ continue;
+ }
+
+ switch(quiche_h3_event_type(ev)) {
+ case QUICHE_H3_EVENT_HEADERS:
+ rc = quiche_h3_event_for_each_header(ev, cb_each_header, &headers);
+ if(rc) {
+ *curlcode = rc;
+ failf(data, "Error in HTTP/3 response header");
+ break;
+ }
+ recvd = headers.nlen;
+ break;
+ case QUICHE_H3_EVENT_DATA:
+ if(!stream->firstbody) {
+ /* add a header-body separator CRLF */
+ buf[0] = '\r';
+ buf[1] = '\n';
+ buf += 2;
+ buffersize -= 2;
+ stream->firstbody = TRUE;
+ recvd = 2; /* two bytes already */
+ }
+ else
+ recvd = 0;
+ rcode = quiche_h3_recv_body(qs->h3c, qs->conn, s, (unsigned char *)buf,
+ buffersize);
+ if(rcode <= 0) {
+ recvd = -1;
+ break;
+ }
+ recvd += rcode;
+ break;
+
+ case QUICHE_H3_EVENT_FINISHED:
+ streamclose(conn, "End of stream");
+ recvd = 0; /* end of stream */
+ break;
+ default:
+ break;
+ }
+
+ quiche_h3_event_free(ev);
+ }
+ if(flush_egress(conn, sockfd, qs)) {
+ *curlcode = CURLE_SEND_ERROR;
+ return -1;
+ }
+
+ *curlcode = (-1 == recvd)? CURLE_AGAIN : CURLE_OK;
+ if(recvd >= 0)
+ /* Get this called again to drain the event queue */
+ Curl_expire(data, 0, EXPIRE_QUIC);
+
+ data->state.drain = (recvd >= 0) ? 1 : 0;
+ return recvd;
+}
+
+static ssize_t h3_stream_send(struct connectdata *conn,
+ int sockindex,
+ const void *mem,
+ size_t len,
+ CURLcode *curlcode)
+{
+ ssize_t sent;
+ struct quicsocket *qs = conn->quic;
+ curl_socket_t sockfd = conn->sock[sockindex];
+ struct HTTP *stream = conn->data->req.protop;
+
+ if(!stream->h3req) {
+ CURLcode result = http_request(conn, mem, len);
+ if(result) {
+ *curlcode = CURLE_SEND_ERROR;
+ return -1;
+ }
+ sent = len;
+ }
+ else {
+ H3BUGF(infof(conn->data, "Pass on %zd body bytes to quiche\n",
+ len));
+ sent = quiche_h3_send_body(qs->h3c, qs->conn, stream->stream3_id,
+ (uint8_t *)mem, len, FALSE);
+ if(sent < 0) {
+ *curlcode = CURLE_SEND_ERROR;
+ return -1;
+ }
+ }
+
+ if(flush_egress(conn, sockfd, qs)) {
+ *curlcode = CURLE_SEND_ERROR;
+ return -1;
+ }
+
+ *curlcode = CURLE_OK;
+ return sent;
+}
+
+/*
+ * Store quiche version info in this buffer, Prefix with a space. Return total
+ * length written.
+ */
+int Curl_quic_ver(char *p, size_t len)
+{
+ return msnprintf(p, len, " quiche/%s", quiche_version());
+}
+
+/* Index where :authority header field will appear in request header
+ field list. */
+#define AUTHORITY_DST_IDX 3
+
+static CURLcode http_request(struct connectdata *conn, const void *mem,
+ size_t len)
+{
+ /*
+ */
+ struct HTTP *stream = conn->data->req.protop;
+ size_t nheader;
+ size_t i;
+ size_t authority_idx;
+ char *hdbuf = (char *)mem;
+ char *end, *line_end;
+ int64_t stream3_id;
+ quiche_h3_header *nva = NULL;
+ struct quicsocket *qs = conn->quic;
+ CURLcode result = CURLE_OK;
+ struct Curl_easy *data = conn->data;
+
+ stream->h3req = TRUE; /* senf off! */
+
+ /* Calculate number of headers contained in [mem, mem + len). Assumes a
+ correctly generated HTTP header field block. */
+ nheader = 0;
+ for(i = 1; i < len; ++i) {
+ if(hdbuf[i] == '\n' && hdbuf[i - 1] == '\r') {
+ ++nheader;
+ ++i;
+ }
+ }
+ if(nheader < 2)
+ goto fail;
+
+ /* We counted additional 2 \r\n in the first and last line. We need 3
+ new headers: :method, :path and :scheme. Therefore we need one
+ more space. */
+ nheader += 1;
+ nva = malloc(sizeof(quiche_h3_header) * nheader);
+ if(!nva) {
+ result = CURLE_OUT_OF_MEMORY;
+ goto fail;
+ }
+
+ /* Extract :method, :path from request line
+ We do line endings with CRLF so checking for CR is enough */
+ line_end = memchr(hdbuf, '\r', len);
+ if(!line_end) {
+ result = CURLE_BAD_FUNCTION_ARGUMENT; /* internal error */
+ goto fail;
+ }
+
+ /* Method does not contain spaces */
+ end = memchr(hdbuf, ' ', line_end - hdbuf);
+ if(!end || end == hdbuf)
+ goto fail;
+ nva[0].name = (unsigned char *)":method";
+ nva[0].name_len = strlen((char *)nva[0].name);
+ nva[0].value = (unsigned char *)hdbuf;
+ nva[0].value_len = (size_t)(end - hdbuf);
+
+ hdbuf = end + 1;
+
+ /* Path may contain spaces so scan backwards */
+ end = NULL;
+ for(i = (size_t)(line_end - hdbuf); i; --i) {
+ if(hdbuf[i - 1] == ' ') {
+ end = &hdbuf[i - 1];
+ break;
+ }
+ }
+ if(!end || end == hdbuf)
+ goto fail;
+ nva[1].name = (unsigned char *)":path";
+ nva[1].name_len = strlen((char *)nva[1].name);
+ nva[1].value = (unsigned char *)hdbuf;
+ nva[1].value_len = (size_t)(end - hdbuf);
+
+ nva[2].name = (unsigned char *)":scheme";
+ nva[2].name_len = strlen((char *)nva[2].name);
+ if(conn->handler->flags & PROTOPT_SSL)
+ nva[2].value = (unsigned char *)"https";
+ else
+ nva[2].value = (unsigned char *)"http";
+ nva[2].value_len = strlen((char *)nva[2].value);
+
+
+ authority_idx = 0;
+ i = 3;
+ while(i < nheader) {
+ size_t hlen;
+
+ hdbuf = line_end + 2;
+
+ /* check for next CR, but only within the piece of data left in the given
+ buffer */
+ line_end = memchr(hdbuf, '\r', len - (hdbuf - (char *)mem));
+ if(!line_end || (line_end == hdbuf))
+ goto fail;
+
+ /* header continuation lines are not supported */
+ if(*hdbuf == ' ' || *hdbuf == '\t')
+ goto fail;
+
+ for(end = hdbuf; end < line_end && *end != ':'; ++end)
+ ;
+ if(end == hdbuf || end == line_end)
+ goto fail;
+ hlen = end - hdbuf;
+
+ if(hlen == 4 && strncasecompare("host", hdbuf, 4)) {
+ authority_idx = i;
+ nva[i].name = (unsigned char *)":authority";
+ nva[i].name_len = strlen((char *)nva[i].name);
+ }
+ else {
+ nva[i].name_len = (size_t)(end - hdbuf);
+ /* Lower case the header name for HTTP/3 */
+ Curl_strntolower((char *)hdbuf, hdbuf, nva[i].name_len);
+ nva[i].name = (unsigned char *)hdbuf;
+ }
+ hdbuf = end + 1;
+ while(*hdbuf == ' ' || *hdbuf == '\t')
+ ++hdbuf;
+ end = line_end;
+
+#if 0 /* This should probably go in more or less like this */
+ switch(inspect_header((const char *)nva[i].name, nva[i].namelen, hdbuf,
+ end - hdbuf)) {
+ case HEADERINST_IGNORE:
+ /* skip header fields prohibited by HTTP/2 specification. */
+ --nheader;
+ continue;
+ case HEADERINST_TE_TRAILERS:
+ nva[i].value = (uint8_t*)"trailers";
+ nva[i].value_len = sizeof("trailers") - 1;
+ break;
+ default:
+ nva[i].value = (unsigned char *)hdbuf;
+ nva[i].value_len = (size_t)(end - hdbuf);
+ }
+#endif
+ nva[i].value = (unsigned char *)hdbuf;
+ nva[i].value_len = (size_t)(end - hdbuf);
+
+ ++i;
+ }
+
+ /* :authority must come before non-pseudo header fields */
+ if(authority_idx != 0 && authority_idx != AUTHORITY_DST_IDX) {
+ quiche_h3_header authority = nva[authority_idx];
+ for(i = authority_idx; i > AUTHORITY_DST_IDX; --i) {
+ nva[i] = nva[i - 1];
+ }
+ nva[i] = authority;
+ }
+
+ /* Warn stream may be rejected if cumulative length of headers is too
+ large. */
+#define MAX_ACC 60000 /* <64KB to account for some overhead */
+ {
+ size_t acc = 0;
+
+ for(i = 0; i < nheader; ++i) {
+ acc += nva[i].name_len + nva[i].value_len;
+
+ H3BUGF(infof(data, "h3 [%.*s: %.*s]\n",
+ nva[i].name_len, nva[i].name,
+ nva[i].value_len, nva[i].value));
+ }
+
+ if(acc > MAX_ACC) {
+ infof(data, "http_request: Warning: The cumulative length of all "
+ "headers exceeds %zu bytes and that could cause the "
+ "stream to be rejected.\n", MAX_ACC);
+ }
+ }
+
+ switch(data->set.httpreq) {
+ case HTTPREQ_POST:
+ case HTTPREQ_POST_FORM:
+ case HTTPREQ_POST_MIME:
+ case HTTPREQ_PUT:
+ if(data->state.infilesize != -1)
+ stream->upload_left = data->state.infilesize;
+ else
+ /* data sending without specifying the data amount up front */
+ stream->upload_left = -1; /* unknown, but not zero */
+
+ stream3_id = quiche_h3_send_request(qs->h3c, qs->conn, nva, nheader,
+ stream->upload_left ? FALSE: TRUE);
+ if((stream3_id >= 0) && data->set.postfields) {
+ ssize_t sent = quiche_h3_send_body(qs->h3c, qs->conn, stream3_id,
+ (uint8_t *)data->set.postfields,
+ stream->upload_left, TRUE);
+ if(sent <= 0) {
+ failf(data, "quiche_h3_send_body failed!");
+ result = CURLE_SEND_ERROR;
+ }
+ stream->upload_left = 0; /* nothing left to send */
+ }
+ break;
+ default:
+ stream3_id = quiche_h3_send_request(qs->h3c, qs->conn, nva, nheader,
+ TRUE);
+ break;
+ }
+
+ Curl_safefree(nva);
+
+ if(stream3_id < 0) {
+ H3BUGF(infof(data, "quiche_h3_send_request returned %d\n",
+ stream3_id));
+ result = CURLE_SEND_ERROR;
+ goto fail;
+ }
+
+ infof(data, "Using HTTP/3 Stream ID: %x (easy handle %p)\n",
+ stream3_id, (void *)data);
+ stream->stream3_id = stream3_id;
+
+ return CURLE_OK;
+
+fail:
+ free(nva);
+ return result;
+}
+
+/*
+ * Called from transfer.c:done_sending when we stop HTTP/3 uploading.
+ */
+CURLcode Curl_quic_done_sending(struct connectdata *conn)
+{
+ if(conn->handler == &Curl_handler_http3) {
+ /* only for HTTP/3 transfers */
+ ssize_t sent;
+ struct HTTP *stream = conn->data->req.protop;
+ struct quicsocket *qs = conn->quic;
+ fprintf(stderr, "!!! Curl_quic_done_sending\n");
+ stream->upload_done = TRUE;
+ sent = quiche_h3_send_body(qs->h3c, qs->conn, stream->stream3_id,
+ NULL, 0, TRUE);
+ if(sent < 0)
+ return CURLE_SEND_ERROR;
+ }
+
+ return CURLE_OK;
+}
+
+/*
+ * Called from http.c:Curl_http_done when a request completes.
+ */
+void Curl_quic_done(struct Curl_easy *data, bool premature)
+{
+ (void)data;
+ (void)premature;
+}
+
+/*
+ * Called from transfer.c:data_pending to know if we should keep looping
+ * to receive more data from the connection.
+ */
+bool Curl_quic_data_pending(const struct Curl_easy *data)
+{
+ (void)data;
+ return FALSE;
+}
+
+#endif
diff --git a/Utilities/cmcurl/lib/vquic/quiche.h b/Utilities/cmcurl/lib/vquic/quiche.h
new file mode 100644
index 0000000..c8d1837
--- /dev/null
+++ b/Utilities/cmcurl/lib/vquic/quiche.h
@@ -0,0 +1,49 @@
+#ifndef HEADER_CURL_VQUIC_QUICHE_H
+#define HEADER_CURL_VQUIC_QUICHE_H
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include "curl_setup.h"
+
+#ifdef USE_QUICHE
+
+#include <quiche.h>
+
+struct quic_handshake {
+ char *buf; /* pointer to the buffer */
+ size_t alloclen; /* size of allocation */
+ size_t len; /* size of content in buffer */
+ size_t nread; /* how many bytes have been read */
+};
+
+struct quicsocket {
+ quiche_config *cfg;
+ quiche_conn *conn;
+ quiche_h3_conn *h3c;
+ quiche_h3_config *h3config;
+ uint8_t scid[QUICHE_MAX_CONN_ID_LEN];
+ uint32_t version;
+};
+
+#endif
+
+#endif /* HEADER_CURL_VQUIC_QUICHE_H */
diff --git a/Utilities/cmcurl/lib/ssh-libssh.c b/Utilities/cmcurl/lib/vssh/libssh.c
index 6cfd6bd..647b4d4 100644
--- a/Utilities/cmcurl/lib/ssh-libssh.c
+++ b/Utilities/cmcurl/lib/vssh/libssh.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2017 - 2019 Red Hat, Inc.
+ * Copyright (C) 2017 - 2020 Red Hat, Inc.
*
* Authors: Nikos Mavrogiannopoulos, Tomas Mraz, Stanislav Zidek,
* Robert Kolcun, Andreas Schneider
@@ -97,9 +97,13 @@
/* A recent macro provided by libssh. Or make our own. */
#ifndef SSH_STRING_FREE_CHAR
-/* !checksrc! disable ASSIGNWITHINCONDITION 1 */
-#define SSH_STRING_FREE_CHAR(x) \
- do { if((x) != NULL) { ssh_string_free_char(x); x = NULL; } } while(0)
+#define SSH_STRING_FREE_CHAR(x) \
+ do { \
+ if(x) { \
+ ssh_string_free_char(x); \
+ x = NULL; \
+ } \
+ } while(0)
#endif
/* Local functions: */
@@ -126,13 +130,9 @@ CURLcode sftp_perform(struct connectdata *conn,
static void sftp_quote(struct connectdata *conn);
static void sftp_quote_stat(struct connectdata *conn);
-
-static int myssh_getsock(struct connectdata *conn, curl_socket_t *sock,
- int numsocks);
-
+static int myssh_getsock(struct connectdata *conn, curl_socket_t *sock);
static int myssh_perform_getsock(const struct connectdata *conn,
- curl_socket_t *sock,
- int numsocks);
+ curl_socket_t *sock);
static CURLcode myssh_setup_connection(struct connectdata *conn);
@@ -322,14 +322,25 @@ static int myssh_is_known(struct connectdata *conn)
ssh_key pubkey;
size_t hlen;
unsigned char *hash = NULL;
- char *base64 = NULL;
+ char *found_base64 = NULL;
+ char *known_base64 = NULL;
int vstate;
enum curl_khmatch keymatch;
struct curl_khkey foundkey;
+ struct curl_khkey *knownkeyp = NULL;
curl_sshkeycallback func =
data->set.ssh_keyfunc;
+#if LIBSSH_VERSION_INT >= SSH_VERSION_INT(0,9,0)
+ struct ssh_knownhosts_entry *knownhostsentry = NULL;
+ struct curl_khkey knownkey;
+#endif
+
+#if LIBSSH_VERSION_INT >= SSH_VERSION_INT(0,8,0)
+ rc = ssh_get_server_publickey(sshc->ssh_session, &pubkey);
+#else
rc = ssh_get_publickey(sshc->ssh_session, &pubkey);
+#endif
if(rc != SSH_OK)
return rc;
@@ -354,6 +365,65 @@ static int myssh_is_known(struct connectdata *conn)
goto cleanup;
}
+#if LIBSSH_VERSION_INT >= SSH_VERSION_INT(0,9,0)
+ /* Get the known_key from the known hosts file */
+ vstate = ssh_session_get_known_hosts_entry(sshc->ssh_session,
+ &knownhostsentry);
+
+ /* Case an entry was found in a known hosts file */
+ if(knownhostsentry) {
+ if(knownhostsentry->publickey) {
+ rc = ssh_pki_export_pubkey_base64(knownhostsentry->publickey,
+ &known_base64);
+ if(rc != SSH_OK) {
+ goto cleanup;
+ }
+ knownkey.key = known_base64;
+ knownkey.len = strlen(known_base64);
+
+ switch(ssh_key_type(knownhostsentry->publickey)) {
+ case SSH_KEYTYPE_RSA:
+ knownkey.keytype = CURLKHTYPE_RSA;
+ break;
+ case SSH_KEYTYPE_RSA1:
+ knownkey.keytype = CURLKHTYPE_RSA1;
+ break;
+ case SSH_KEYTYPE_ECDSA:
+ knownkey.keytype = CURLKHTYPE_ECDSA;
+ break;
+ case SSH_KEYTYPE_ED25519:
+ knownkey.keytype = CURLKHTYPE_ED25519;
+ break;
+ case SSH_KEYTYPE_DSS:
+ knownkey.keytype = CURLKHTYPE_DSS;
+ break;
+ default:
+ rc = SSH_ERROR;
+ goto cleanup;
+ }
+ knownkeyp = &knownkey;
+ }
+ }
+
+ switch(vstate) {
+ case SSH_KNOWN_HOSTS_OK:
+ keymatch = CURLKHMATCH_OK;
+ break;
+ case SSH_KNOWN_HOSTS_OTHER:
+ /* fallthrough */
+ case SSH_KNOWN_HOSTS_NOT_FOUND:
+ /* fallthrough */
+ case SSH_KNOWN_HOSTS_UNKNOWN:
+ /* fallthrough */
+ case SSH_KNOWN_HOSTS_ERROR:
+ keymatch = CURLKHMATCH_MISSING;
+ break;
+ default:
+ keymatch = CURLKHMATCH_MISMATCH;
+ break;
+ }
+
+#else
vstate = ssh_is_server_known(sshc->ssh_session);
switch(vstate) {
case SSH_SERVER_KNOWN_OK:
@@ -368,14 +438,15 @@ static int myssh_is_known(struct connectdata *conn)
keymatch = CURLKHMATCH_MISMATCH;
break;
}
+#endif
if(func) { /* use callback to determine action */
- rc = ssh_pki_export_pubkey_base64(pubkey, &base64);
+ rc = ssh_pki_export_pubkey_base64(pubkey, &found_base64);
if(rc != SSH_OK)
goto cleanup;
- foundkey.key = base64;
- foundkey.len = strlen(base64);
+ foundkey.key = found_base64;
+ foundkey.len = strlen(found_base64);
switch(ssh_key_type(pubkey)) {
case SSH_KEYTYPE_RSA:
@@ -400,15 +471,19 @@ static int myssh_is_known(struct connectdata *conn)
goto cleanup;
}
- /* we don't have anything equivalent to knownkey. Always NULL */
Curl_set_in_callback(data, true);
- rc = func(data, NULL, &foundkey, /* from the remote host */
+ rc = func(data, knownkeyp, /* from the knownhosts file */
+ &foundkey, /* from the remote host */
keymatch, data->set.ssh_keyfunc_userp);
Curl_set_in_callback(data, false);
switch(rc) {
case CURLKHSTAT_FINE_ADD_TO_FILE:
+#if LIBSSH_VERSION_INT >= SSH_VERSION_INT(0,8,0)
+ rc = ssh_session_update_known_hosts(sshc->ssh_session);
+#else
rc = ssh_write_knownhost(sshc->ssh_session);
+#endif
if(rc != SSH_OK) {
goto cleanup;
}
@@ -429,9 +504,20 @@ static int myssh_is_known(struct connectdata *conn)
rc = SSH_OK;
cleanup:
+ if(found_base64) {
+ free(found_base64);
+ }
+ if(known_base64) {
+ free(known_base64);
+ }
if(hash)
ssh_clean_pubkey_hash(&hash);
ssh_key_free(pubkey);
+#if LIBSSH_VERSION_INT >= SSH_VERSION_INT(0,9,0)
+ if(knownhostsentry) {
+ ssh_knownhosts_entry_free(knownhostsentry);
+ }
+#endif
return rc;
}
@@ -497,7 +583,7 @@ restart:
return SSH_ERROR;
nprompts = ssh_userauth_kbdint_getnprompts(sshc->ssh_session);
- if(nprompts == SSH_ERROR || nprompts != 1)
+ if(nprompts != 1)
return SSH_ERROR;
rc = ssh_userauth_kbdint_setanswer(sshc->ssh_session, 0, conn->passwd);
@@ -1119,7 +1205,7 @@ static CURLcode myssh_statemach_act(struct connectdata *conn, bool *block)
flags = O_WRONLY|O_APPEND;
else
/* Clear file before writing (normal behaviour) */
- flags = O_WRONLY|O_APPEND|O_CREAT|O_TRUNC;
+ flags = O_WRONLY|O_CREAT|O_TRUNC;
if(sshc->sftp_file)
sftp_close(sshc->sftp_file);
@@ -1360,7 +1446,7 @@ static CURLcode myssh_statemach_act(struct connectdata *conn, bool *block)
break;
}
}
- else if(sshc->readdir_attrs == NULL && sftp_dir_eof(sshc->sftp_dir)) {
+ else if(sftp_dir_eof(sshc->sftp_dir)) {
state(conn, SSH_SFTP_READDIR_DONE);
break;
}
@@ -1586,7 +1672,6 @@ static CURLcode myssh_statemach_act(struct connectdata *conn, bool *block)
return CURLE_BAD_DOWNLOAD_RESUME;
}
}
- /* Does a completed file need to be seeked and started or closed ? */
/* Now store the number of bytes we are expected to download */
data->req.size = size - data->state.resume_from;
data->req.maxdownload = size - data->state.resume_from;
@@ -1913,13 +1998,9 @@ static CURLcode myssh_statemach_act(struct connectdata *conn, bool *block)
/* called by the multi interface to figure out what socket(s) to wait for and
for what actions in the DO_DONE, PERFORM and WAITPERFORM states */
static int myssh_perform_getsock(const struct connectdata *conn,
- curl_socket_t *sock, /* points to numsocks
- number of sockets */
- int numsocks)
+ curl_socket_t *sock)
{
int bitmap = GETSOCK_BLANK;
- (void) numsocks;
-
sock[0] = conn->sock[FIRSTSOCKET];
if(conn->waitfor & KEEP_RECV)
@@ -1934,13 +2015,11 @@ static int myssh_perform_getsock(const struct connectdata *conn,
/* Generic function called by the multi interface to figure out what socket(s)
to wait for and for what actions during the DOING and PROTOCONNECT states*/
static int myssh_getsock(struct connectdata *conn,
- curl_socket_t *sock, /* points to numsocks
- number of sockets */
- int numsocks)
+ curl_socket_t *sock)
{
/* if we know the direction we can use the generic *_getsock() function even
for the protocol_connect and doing states */
- return myssh_perform_getsock(conn, sock, numsocks);
+ return myssh_perform_getsock(conn, sock);
}
static void myssh_block2waitfor(struct connectdata *conn, bool block)
@@ -1968,11 +2047,10 @@ static CURLcode myssh_multi_statemach(struct connectdata *conn,
bool *done)
{
struct ssh_conn *sshc = &conn->proto.sshc;
- CURLcode result = CURLE_OK;
bool block; /* we store the status and use that to provide a ssh_getsock()
implementation */
+ CURLcode result = myssh_statemach_act(conn, &block);
- result = myssh_statemach_act(conn, &block);
*done = (sshc->state == SSH_STOP) ? TRUE : FALSE;
myssh_block2waitfor(conn, block);
@@ -2010,7 +2088,7 @@ static CURLcode myssh_block_statemach(struct connectdata *conn,
}
}
- if(!result && block) {
+ if(block) {
curl_socket_t fd_read = conn->sock[FIRSTSOCKET];
/* wait for the socket to become ready */
(void) Curl_socket_check(fd_read, CURL_SOCKET_BAD,
@@ -2736,5 +2814,23 @@ static void sftp_quote_stat(struct connectdata *conn)
return;
}
+CURLcode Curl_ssh_init(void)
+{
+ if(ssh_init()) {
+ DEBUGF(fprintf(stderr, "Error: libssh_init failed\n"));
+ return CURLE_FAILED_INIT;
+ }
+ return CURLE_OK;
+}
+
+void Curl_ssh_cleanup(void)
+{
+ (void)ssh_finalize();
+}
+
+size_t Curl_ssh_version(char *buffer, size_t buflen)
+{
+ return msnprintf(buffer, buflen, "libssh/%s", CURL_LIBSSH_VERSION);
+}
#endif /* USE_LIBSSH */
diff --git a/Utilities/cmcurl/lib/ssh.c b/Utilities/cmcurl/lib/vssh/libssh2.c
index a265c3c..8e04374 100644
--- a/Utilities/cmcurl/lib/ssh.c
+++ b/Utilities/cmcurl/lib/vssh/libssh2.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -106,6 +106,7 @@ static LIBSSH2_ALLOC_FUNC(my_libssh2_malloc);
static LIBSSH2_REALLOC_FUNC(my_libssh2_realloc);
static LIBSSH2_FREE_FUNC(my_libssh2_free);
+static CURLcode ssh_force_knownhost_key_type(struct connectdata *conn);
static CURLcode ssh_connect(struct connectdata *conn, bool *done);
static CURLcode ssh_multi_statemach(struct connectdata *conn, bool *done);
static CURLcode ssh_do(struct connectdata *conn, bool *done);
@@ -125,17 +126,9 @@ static
CURLcode sftp_perform(struct connectdata *conn,
bool *connected,
bool *dophase_done);
-
-static int ssh_getsock(struct connectdata *conn,
- curl_socket_t *sock, /* points to numsocks number
- of sockets */
- int numsocks);
-
+static int ssh_getsock(struct connectdata *conn, curl_socket_t *sock);
static int ssh_perform_getsock(const struct connectdata *conn,
- curl_socket_t *sock, /* points to numsocks
- number of sockets */
- int numsocks);
-
+ curl_socket_t *sock);
static CURLcode ssh_setup_connection(struct connectdata *conn);
/*
@@ -474,61 +467,95 @@ static CURLcode ssh_knownhost(struct connectdata *conn)
struct curl_khkey *knownkeyp = NULL;
struct curl_khkey foundkey;
- keybit = (keytype == LIBSSH2_HOSTKEY_TYPE_RSA)?
- LIBSSH2_KNOWNHOST_KEY_SSHRSA:LIBSSH2_KNOWNHOST_KEY_SSHDSS;
-
+ switch(keytype) {
+ case LIBSSH2_HOSTKEY_TYPE_RSA:
+ keybit = LIBSSH2_KNOWNHOST_KEY_SSHRSA;
+ break;
+ case LIBSSH2_HOSTKEY_TYPE_DSS:
+ keybit = LIBSSH2_KNOWNHOST_KEY_SSHDSS;
+ break;
+#ifdef LIBSSH2_HOSTKEY_TYPE_ECDSA_256
+ case LIBSSH2_HOSTKEY_TYPE_ECDSA_256:
+ keybit = LIBSSH2_KNOWNHOST_KEY_ECDSA_256;
+ break;
+#endif
+#ifdef LIBSSH2_HOSTKEY_TYPE_ECDSA_384
+ case LIBSSH2_HOSTKEY_TYPE_ECDSA_384:
+ keybit = LIBSSH2_KNOWNHOST_KEY_ECDSA_384;
+ break;
+#endif
+#ifdef LIBSSH2_HOSTKEY_TYPE_ECDSA_521
+ case LIBSSH2_HOSTKEY_TYPE_ECDSA_521:
+ keybit = LIBSSH2_KNOWNHOST_KEY_ECDSA_521;
+ break;
+#endif
+#ifdef LIBSSH2_HOSTKEY_TYPE_ED25519
+ case LIBSSH2_HOSTKEY_TYPE_ED25519:
+ keybit = LIBSSH2_KNOWNHOST_KEY_ED25519;
+ break;
+#endif
+ default:
+ infof(data, "unsupported key type, can't check knownhosts!\n");
+ keybit = 0;
+ break;
+ }
+ if(!keybit)
+ /* no check means failure! */
+ rc = CURLKHSTAT_REJECT;
+ else {
#ifdef HAVE_LIBSSH2_KNOWNHOST_CHECKP
- keycheck = libssh2_knownhost_checkp(sshc->kh,
- conn->host.name,
- (conn->remote_port != PORT_SSH)?
- conn->remote_port:-1,
- remotekey, keylen,
- LIBSSH2_KNOWNHOST_TYPE_PLAIN|
- LIBSSH2_KNOWNHOST_KEYENC_RAW|
- keybit,
- &host);
+ keycheck = libssh2_knownhost_checkp(sshc->kh,
+ conn->host.name,
+ (conn->remote_port != PORT_SSH)?
+ conn->remote_port:-1,
+ remotekey, keylen,
+ LIBSSH2_KNOWNHOST_TYPE_PLAIN|
+ LIBSSH2_KNOWNHOST_KEYENC_RAW|
+ keybit,
+ &host);
#else
- keycheck = libssh2_knownhost_check(sshc->kh,
- conn->host.name,
- remotekey, keylen,
- LIBSSH2_KNOWNHOST_TYPE_PLAIN|
- LIBSSH2_KNOWNHOST_KEYENC_RAW|
- keybit,
- &host);
+ keycheck = libssh2_knownhost_check(sshc->kh,
+ conn->host.name,
+ remotekey, keylen,
+ LIBSSH2_KNOWNHOST_TYPE_PLAIN|
+ LIBSSH2_KNOWNHOST_KEYENC_RAW|
+ keybit,
+ &host);
#endif
- infof(data, "SSH host check: %d, key: %s\n", keycheck,
- (keycheck <= LIBSSH2_KNOWNHOST_CHECK_MISMATCH)?
- host->key:"<none>");
+ infof(data, "SSH host check: %d, key: %s\n", keycheck,
+ (keycheck <= LIBSSH2_KNOWNHOST_CHECK_MISMATCH)?
+ host->key:"<none>");
+
+ /* setup 'knownkey' */
+ if(keycheck <= LIBSSH2_KNOWNHOST_CHECK_MISMATCH) {
+ knownkey.key = host->key;
+ knownkey.len = 0;
+ knownkey.keytype = (keytype == LIBSSH2_HOSTKEY_TYPE_RSA)?
+ CURLKHTYPE_RSA : CURLKHTYPE_DSS;
+ knownkeyp = &knownkey;
+ }
- /* setup 'knownkey' */
- if(keycheck <= LIBSSH2_KNOWNHOST_CHECK_MISMATCH) {
- knownkey.key = host->key;
- knownkey.len = 0;
- knownkey.keytype = (keytype == LIBSSH2_HOSTKEY_TYPE_RSA)?
+ /* setup 'foundkey' */
+ foundkey.key = remotekey;
+ foundkey.len = keylen;
+ foundkey.keytype = (keytype == LIBSSH2_HOSTKEY_TYPE_RSA)?
CURLKHTYPE_RSA : CURLKHTYPE_DSS;
- knownkeyp = &knownkey;
- }
- /* setup 'foundkey' */
- foundkey.key = remotekey;
- foundkey.len = keylen;
- foundkey.keytype = (keytype == LIBSSH2_HOSTKEY_TYPE_RSA)?
- CURLKHTYPE_RSA : CURLKHTYPE_DSS;
+ /*
+ * if any of the LIBSSH2_KNOWNHOST_CHECK_* defines and the
+ * curl_khmatch enum are ever modified, we need to introduce a
+ * translation table here!
+ */
+ keymatch = (enum curl_khmatch)keycheck;
- /*
- * if any of the LIBSSH2_KNOWNHOST_CHECK_* defines and the
- * curl_khmatch enum are ever modified, we need to introduce a
- * translation table here!
- */
- keymatch = (enum curl_khmatch)keycheck;
-
- /* Ask the callback how to behave */
- Curl_set_in_callback(data, true);
- rc = func(data, knownkeyp, /* from the knownhosts file */
- &foundkey, /* from the remote host */
- keymatch, data->set.ssh_keyfunc_userp);
- Curl_set_in_callback(data, false);
+ /* Ask the callback how to behave */
+ Curl_set_in_callback(data, true);
+ rc = func(data, knownkeyp, /* from the knownhosts file */
+ &foundkey, /* from the remote host */
+ keymatch, data->set.ssh_keyfunc_userp);
+ Curl_set_in_callback(data, false);
+ }
}
else
/* no remotekey means failure! */
@@ -623,6 +650,129 @@ static CURLcode ssh_check_fingerprint(struct connectdata *conn)
}
/*
+ * ssh_force_knownhost_key_type() will check the known hosts file and try to
+ * force a specific public key type from the server if an entry is found.
+ */
+static CURLcode ssh_force_knownhost_key_type(struct connectdata *conn)
+{
+ CURLcode result = CURLE_OK;
+
+#ifdef HAVE_LIBSSH2_KNOWNHOST_API
+
+#ifdef LIBSSH2_KNOWNHOST_KEY_ED25519
+ static const char * const hostkey_method_ssh_ed25519
+ = "ssh-ed25519";
+#endif
+#ifdef LIBSSH2_KNOWNHOST_KEY_ECDSA_521
+ static const char * const hostkey_method_ssh_ecdsa_521
+ = "ecdsa-sha2-nistp521";
+#endif
+#ifdef LIBSSH2_KNOWNHOST_KEY_ECDSA_384
+ static const char * const hostkey_method_ssh_ecdsa_384
+ = "ecdsa-sha2-nistp384";
+#endif
+#ifdef LIBSSH2_KNOWNHOST_KEY_ECDSA_256
+ static const char * const hostkey_method_ssh_ecdsa_256
+ = "ecdsa-sha2-nistp256";
+#endif
+ static const char * const hostkey_method_ssh_rsa
+ = "ssh-rsa";
+ static const char * const hostkey_method_ssh_dss
+ = "ssh-dss";
+
+ const char *hostkey_method = NULL;
+ struct ssh_conn *sshc = &conn->proto.sshc;
+ struct Curl_easy *data = conn->data;
+ struct libssh2_knownhost* store = NULL;
+ const char *kh_name_end = NULL;
+ size_t kh_name_size = 0;
+ int port = 0;
+ bool found = false;
+
+ if(sshc->kh && !data->set.str[STRING_SSH_HOST_PUBLIC_KEY_MD5]) {
+ /* lets try to find our host in the known hosts file */
+ while(!libssh2_knownhost_get(sshc->kh, &store, store)) {
+ /* For non-standard ports, the name will be enclosed in */
+ /* square brackets, followed by a colon and the port */
+ if(store->name[0] == '[') {
+ kh_name_end = strstr(store->name, "]:");
+ if(!kh_name_end) {
+ infof(data, "Invalid host pattern %s in %s\n",
+ store->name, data->set.str[STRING_SSH_KNOWNHOSTS]);
+ continue;
+ }
+ port = atoi(kh_name_end + 2);
+ if(kh_name_end && (port == conn->remote_port)) {
+ kh_name_size = strlen(store->name) - 1 - strlen(kh_name_end);
+ if(strncmp(store->name + 1, conn->host.name, kh_name_size) == 0) {
+ found = true;
+ break;
+ }
+ }
+ }
+ else if(strcmp(store->name, conn->host.name) == 0) {
+ found = true;
+ break;
+ }
+ }
+
+ if(found) {
+ infof(data, "Found host %s in %s\n",
+ store->name, data->set.str[STRING_SSH_KNOWNHOSTS]);
+
+ switch(store->typemask & LIBSSH2_KNOWNHOST_KEY_MASK) {
+#ifdef LIBSSH2_KNOWNHOST_KEY_ED25519
+ case LIBSSH2_KNOWNHOST_KEY_ED25519:
+ hostkey_method = hostkey_method_ssh_ed25519;
+ break;
+#endif
+#ifdef LIBSSH2_KNOWNHOST_KEY_ECDSA_521
+ case LIBSSH2_KNOWNHOST_KEY_ECDSA_521:
+ hostkey_method = hostkey_method_ssh_ecdsa_521;
+ break;
+#endif
+#ifdef LIBSSH2_KNOWNHOST_KEY_ECDSA_384
+ case LIBSSH2_KNOWNHOST_KEY_ECDSA_384:
+ hostkey_method = hostkey_method_ssh_ecdsa_384;
+ break;
+#endif
+#ifdef LIBSSH2_KNOWNHOST_KEY_ECDSA_256
+ case LIBSSH2_KNOWNHOST_KEY_ECDSA_256:
+ hostkey_method = hostkey_method_ssh_ecdsa_256;
+ break;
+#endif
+ case LIBSSH2_KNOWNHOST_KEY_SSHRSA:
+ hostkey_method = hostkey_method_ssh_rsa;
+ break;
+ case LIBSSH2_KNOWNHOST_KEY_SSHDSS:
+ hostkey_method = hostkey_method_ssh_dss;
+ break;
+ case LIBSSH2_KNOWNHOST_KEY_RSA1:
+ failf(data, "Found host key type RSA1 which is not supported\n");
+ return CURLE_SSH;
+ default:
+ failf(data, "Unknown host key type: %i\n",
+ (store->typemask & LIBSSH2_KNOWNHOST_KEY_MASK));
+ return CURLE_SSH;
+ }
+
+ infof(data, "Set \"%s\" as SSH hostkey type\n", hostkey_method);
+ result = libssh2_session_error_to_CURLE(
+ libssh2_session_method_pref(
+ sshc->ssh_session, LIBSSH2_METHOD_HOSTKEY, hostkey_method));
+ }
+ else {
+ infof(data, "Did not find host %s in %s\n",
+ conn->host.name, data->set.str[STRING_SSH_KNOWNHOSTS]);
+ }
+ }
+
+#endif /* HAVE_LIBSSH2_KNOWNHOST_API */
+
+ return result;
+}
+
+/*
* ssh_statemach_act() runs the SSH state machine as far as it can without
* blocking and without reaching the end. The data the pointer 'block' points
* to will be set to TRUE if the libssh2 function returns LIBSSH2_ERROR_EAGAIN
@@ -654,6 +804,12 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
non-blocking */
libssh2_session_set_blocking(sshc->ssh_session, 0);
+ result = ssh_force_knownhost_key_type(conn);
+ if(result) {
+ state(conn, SSH_SESSION_FREE);
+ break;
+ }
+
state(conn, SSH_S_STARTUP);
/* FALLTHROUGH */
@@ -2225,7 +2381,6 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
return CURLE_BAD_DOWNLOAD_RESUME;
}
}
- /* Does a completed file need to be seeked and started or closed ? */
/* Now store the number of bytes we are expected to download */
data->req.size = attrs.filesize - data->state.resume_from;
data->req.maxdownload = attrs.filesize - data->state.resume_from;
@@ -2700,13 +2855,10 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
/* called by the multi interface to figure out what socket(s) to wait for and
for what actions in the DO_DONE, PERFORM and WAITPERFORM states */
static int ssh_perform_getsock(const struct connectdata *conn,
- curl_socket_t *sock, /* points to numsocks
- number of sockets */
- int numsocks)
+ curl_socket_t *sock)
{
#ifdef HAVE_LIBSSH2_SESSION_BLOCK_DIRECTION
int bitmap = GETSOCK_BLANK;
- (void)numsocks;
sock[0] = conn->sock[FIRSTSOCKET];
@@ -2720,28 +2872,25 @@ static int ssh_perform_getsock(const struct connectdata *conn,
#else
/* if we don't know the direction we can use the generic *_getsock()
function even for the protocol_connect and doing states */
- return Curl_single_getsock(conn, sock, numsocks);
+ return Curl_single_getsock(conn, sock);
#endif
}
/* Generic function called by the multi interface to figure out what socket(s)
to wait for and for what actions during the DOING and PROTOCONNECT states*/
static int ssh_getsock(struct connectdata *conn,
- curl_socket_t *sock, /* points to numsocks number
- of sockets */
- int numsocks)
+ curl_socket_t *sock)
{
#ifndef HAVE_LIBSSH2_SESSION_BLOCK_DIRECTION
(void)conn;
(void)sock;
- (void)numsocks;
/* if we don't know any direction we can just play along as we used to and
not provide any sensible info */
return GETSOCK_BLANK;
#else
/* if we know the direction we can use the generic *_getsock() function even
for the protocol_connect and doing states */
- return ssh_perform_getsock(conn, sock, numsocks);
+ return ssh_perform_getsock(conn, sock);
#endif
}
@@ -2825,7 +2974,7 @@ static CURLcode ssh_block_statemach(struct connectdata *conn,
}
#ifdef HAVE_LIBSSH2_SESSION_BLOCK_DIRECTION
- if(!result && block) {
+ if(block) {
int dir = libssh2_session_block_directions(sshc->ssh_session);
curl_socket_t sock = conn->sock[FIRSTSOCKET];
curl_socket_t fd_read = CURL_SOCKET_BAD;
@@ -2836,7 +2985,7 @@ static CURLcode ssh_block_statemach(struct connectdata *conn,
fd_write = sock;
/* wait for the socket to become ready */
(void)Curl_socket_check(fd_read, CURL_SOCKET_BAD, fd_write,
- left>1000?1000:left); /* ignore result */
+ left>1000?1000:(time_t)left);
}
#endif
@@ -3334,4 +3483,27 @@ static const char *sftp_libssh2_strerror(int err)
return "Unknown error in libssh2";
}
+CURLcode Curl_ssh_init(void)
+{
+#ifdef HAVE_LIBSSH2_INIT
+ if(libssh2_init(0)) {
+ DEBUGF(fprintf(stderr, "Error: libssh2_init failed\n"));
+ return CURLE_FAILED_INIT;
+ }
+#endif
+ return CURLE_OK;
+}
+
+void Curl_ssh_cleanup(void)
+{
+#ifdef HAVE_LIBSSH2_EXIT
+ (void)libssh2_exit();
+#endif
+}
+
+size_t Curl_ssh_version(char *buffer, size_t buflen)
+{
+ return msnprintf(buffer, buflen, "libssh2/%s", LIBSSH2_VERSION);
+}
+
#endif /* USE_LIBSSH2 */
diff --git a/Utilities/cmcurl/lib/ssh.h b/Utilities/cmcurl/lib/vssh/ssh.h
index 0620aac..0d4ee52 100644
--- a/Utilities/cmcurl/lib/ssh.h
+++ b/Utilities/cmcurl/lib/vssh/ssh.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -30,7 +30,10 @@
#elif defined(HAVE_LIBSSH_LIBSSH_H)
#include <libssh/libssh.h>
#include <libssh/sftp.h>
-#endif /* HAVE_LIBSSH2_H */
+#elif defined(USE_WOLFSSH)
+#include <wolfssh/ssh.h>
+#include <wolfssh/wolfsftp.h>
+#endif
/****************************************************************************
* SSH unique setup
@@ -188,6 +191,12 @@ struct ssh_conn {
#ifdef HAVE_LIBSSH2_KNOWNHOST_API
LIBSSH2_KNOWNHOSTS *kh;
#endif
+#elif defined(USE_WOLFSSH)
+ WOLFSSH *ssh_session;
+ WOLFSSH_CTX *ctx;
+ word32 handleSz;
+ byte handle[WOLFSSH_MAX_HANDLE];
+ curl_off_t offset;
#endif /* USE_LIBSSH */
};
@@ -195,9 +204,6 @@ struct ssh_conn {
#define CURL_LIBSSH_VERSION ssh_version(0)
-extern const struct Curl_handler Curl_handler_scp;
-extern const struct Curl_handler Curl_handler_sftp;
-
#elif defined(USE_LIBSSH2)
/* Feature detection based on version numbers to better work with
@@ -237,9 +243,20 @@ extern const struct Curl_handler Curl_handler_sftp;
#define CURL_LIBSSH2_VERSION LIBSSH2_VERSION
#endif
+#endif /* USE_LIBSSH2 */
+
+#ifdef USE_SSH
+
extern const struct Curl_handler Curl_handler_scp;
extern const struct Curl_handler Curl_handler_sftp;
-#endif /* USE_LIBSSH2 */
+/* generic SSH backend functions */
+CURLcode Curl_ssh_init(void);
+void Curl_ssh_cleanup(void);
+size_t Curl_ssh_version(char *buffer, size_t buflen);
+#else
+/* for non-SSH builds */
+#define Curl_ssh_cleanup()
+#endif
#endif /* HEADER_CURL_SSH_H */
diff --git a/Utilities/cmcurl/lib/vssh/wolfssh.c b/Utilities/cmcurl/lib/vssh/wolfssh.c
new file mode 100644
index 0000000..363a52c
--- /dev/null
+++ b/Utilities/cmcurl/lib/vssh/wolfssh.c
@@ -0,0 +1,1156 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2019 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include "curl_setup.h"
+
+#ifdef USE_WOLFSSH
+
+#include <limits.h>
+
+#include <wolfssh/ssh.h>
+#include <wolfssh/wolfsftp.h>
+#include "urldata.h"
+#include "connect.h"
+#include "sendf.h"
+#include "progress.h"
+#include "curl_path.h"
+#include "strtoofft.h"
+#include "transfer.h"
+#include "speedcheck.h"
+#include "select.h"
+#include "multiif.h"
+#include "warnless.h"
+
+/* The last 3 #include files should be in this order */
+#include "curl_printf.h"
+#include "curl_memory.h"
+#include "memdebug.h"
+
+static CURLcode wssh_connect(struct connectdata *conn, bool *done);
+static CURLcode wssh_multi_statemach(struct connectdata *conn, bool *done);
+static CURLcode wssh_do(struct connectdata *conn, bool *done);
+#if 0
+static CURLcode wscp_done(struct connectdata *conn,
+ CURLcode, bool premature);
+static CURLcode wscp_doing(struct connectdata *conn,
+ bool *dophase_done);
+static CURLcode wscp_disconnect(struct connectdata *conn,
+ bool dead_connection);
+#endif
+static CURLcode wsftp_done(struct connectdata *conn,
+ CURLcode, bool premature);
+static CURLcode wsftp_doing(struct connectdata *conn,
+ bool *dophase_done);
+static CURLcode wsftp_disconnect(struct connectdata *conn, bool dead);
+static int wssh_getsock(struct connectdata *conn,
+ curl_socket_t *sock);
+static int wssh_perform_getsock(const struct connectdata *conn,
+ curl_socket_t *sock);
+static CURLcode wssh_setup_connection(struct connectdata *conn);
+
+#if 0
+/*
+ * SCP protocol handler.
+ */
+
+const struct Curl_handler Curl_handler_scp = {
+ "SCP", /* scheme */
+ wssh_setup_connection, /* setup_connection */
+ wssh_do, /* do_it */
+ wscp_done, /* done */
+ ZERO_NULL, /* do_more */
+ wssh_connect, /* connect_it */
+ wssh_multi_statemach, /* connecting */
+ wscp_doing, /* doing */
+ wssh_getsock, /* proto_getsock */
+ wssh_getsock, /* doing_getsock */
+ ZERO_NULL, /* domore_getsock */
+ wssh_perform_getsock, /* perform_getsock */
+ wscp_disconnect, /* disconnect */
+ ZERO_NULL, /* readwrite */
+ ZERO_NULL, /* connection_check */
+ PORT_SSH, /* defport */
+ CURLPROTO_SCP, /* protocol */
+ PROTOPT_DIRLOCK | PROTOPT_CLOSEACTION
+ | PROTOPT_NOURLQUERY /* flags */
+};
+
+#endif
+
+/*
+ * SFTP protocol handler.
+ */
+
+const struct Curl_handler Curl_handler_sftp = {
+ "SFTP", /* scheme */
+ wssh_setup_connection, /* setup_connection */
+ wssh_do, /* do_it */
+ wsftp_done, /* done */
+ ZERO_NULL, /* do_more */
+ wssh_connect, /* connect_it */
+ wssh_multi_statemach, /* connecting */
+ wsftp_doing, /* doing */
+ wssh_getsock, /* proto_getsock */
+ wssh_getsock, /* doing_getsock */
+ ZERO_NULL, /* domore_getsock */
+ wssh_perform_getsock, /* perform_getsock */
+ wsftp_disconnect, /* disconnect */
+ ZERO_NULL, /* readwrite */
+ ZERO_NULL, /* connection_check */
+ PORT_SSH, /* defport */
+ CURLPROTO_SFTP, /* protocol */
+ PROTOPT_DIRLOCK | PROTOPT_CLOSEACTION
+ | PROTOPT_NOURLQUERY /* flags */
+};
+
+/*
+ * SSH State machine related code
+ */
+/* This is the ONLY way to change SSH state! */
+static void state(struct connectdata *conn, sshstate nowstate)
+{
+ struct ssh_conn *sshc = &conn->proto.sshc;
+#if defined(DEBUGBUILD) && !defined(CURL_DISABLE_VERBOSE_STRINGS)
+ /* for debug purposes */
+ static const char * const names[] = {
+ "SSH_STOP",
+ "SSH_INIT",
+ "SSH_S_STARTUP",
+ "SSH_HOSTKEY",
+ "SSH_AUTHLIST",
+ "SSH_AUTH_PKEY_INIT",
+ "SSH_AUTH_PKEY",
+ "SSH_AUTH_PASS_INIT",
+ "SSH_AUTH_PASS",
+ "SSH_AUTH_AGENT_INIT",
+ "SSH_AUTH_AGENT_LIST",
+ "SSH_AUTH_AGENT",
+ "SSH_AUTH_HOST_INIT",
+ "SSH_AUTH_HOST",
+ "SSH_AUTH_KEY_INIT",
+ "SSH_AUTH_KEY",
+ "SSH_AUTH_GSSAPI",
+ "SSH_AUTH_DONE",
+ "SSH_SFTP_INIT",
+ "SSH_SFTP_REALPATH",
+ "SSH_SFTP_QUOTE_INIT",
+ "SSH_SFTP_POSTQUOTE_INIT",
+ "SSH_SFTP_QUOTE",
+ "SSH_SFTP_NEXT_QUOTE",
+ "SSH_SFTP_QUOTE_STAT",
+ "SSH_SFTP_QUOTE_SETSTAT",
+ "SSH_SFTP_QUOTE_SYMLINK",
+ "SSH_SFTP_QUOTE_MKDIR",
+ "SSH_SFTP_QUOTE_RENAME",
+ "SSH_SFTP_QUOTE_RMDIR",
+ "SSH_SFTP_QUOTE_UNLINK",
+ "SSH_SFTP_QUOTE_STATVFS",
+ "SSH_SFTP_GETINFO",
+ "SSH_SFTP_FILETIME",
+ "SSH_SFTP_TRANS_INIT",
+ "SSH_SFTP_UPLOAD_INIT",
+ "SSH_SFTP_CREATE_DIRS_INIT",
+ "SSH_SFTP_CREATE_DIRS",
+ "SSH_SFTP_CREATE_DIRS_MKDIR",
+ "SSH_SFTP_READDIR_INIT",
+ "SSH_SFTP_READDIR",
+ "SSH_SFTP_READDIR_LINK",
+ "SSH_SFTP_READDIR_BOTTOM",
+ "SSH_SFTP_READDIR_DONE",
+ "SSH_SFTP_DOWNLOAD_INIT",
+ "SSH_SFTP_DOWNLOAD_STAT",
+ "SSH_SFTP_CLOSE",
+ "SSH_SFTP_SHUTDOWN",
+ "SSH_SCP_TRANS_INIT",
+ "SSH_SCP_UPLOAD_INIT",
+ "SSH_SCP_DOWNLOAD_INIT",
+ "SSH_SCP_DOWNLOAD",
+ "SSH_SCP_DONE",
+ "SSH_SCP_SEND_EOF",
+ "SSH_SCP_WAIT_EOF",
+ "SSH_SCP_WAIT_CLOSE",
+ "SSH_SCP_CHANNEL_FREE",
+ "SSH_SESSION_DISCONNECT",
+ "SSH_SESSION_FREE",
+ "QUIT"
+ };
+
+ /* a precaution to make sure the lists are in sync */
+ DEBUGASSERT(sizeof(names)/sizeof(names[0]) == SSH_LAST);
+
+ if(sshc->state != nowstate) {
+ infof(conn->data, "wolfssh %p state change from %s to %s\n",
+ (void *)sshc, names[sshc->state], names[nowstate]);
+ }
+#endif
+
+ sshc->state = nowstate;
+}
+
+static ssize_t wscp_send(struct connectdata *conn, int sockindex,
+ const void *mem, size_t len, CURLcode *err)
+{
+ ssize_t nwrite = 0;
+ (void)conn;
+ (void)sockindex; /* we only support SCP on the fixed known primary socket */
+ (void)mem;
+ (void)len;
+ (void)err;
+
+ return nwrite;
+}
+
+static ssize_t wscp_recv(struct connectdata *conn, int sockindex,
+ char *mem, size_t len, CURLcode *err)
+{
+ ssize_t nread = 0;
+ (void)conn;
+ (void)sockindex; /* we only support SCP on the fixed known primary socket */
+ (void)mem;
+ (void)len;
+ (void)err;
+
+ return nread;
+}
+
+/* return number of sent bytes */
+static ssize_t wsftp_send(struct connectdata *conn, int sockindex,
+ const void *mem, size_t len, CURLcode *err)
+{
+ struct ssh_conn *sshc = &conn->proto.sshc;
+ word32 offset[2];
+ int rc;
+ (void)sockindex;
+
+ offset[0] = (word32)sshc->offset&0xFFFFFFFF;
+ offset[1] = (word32)(sshc->offset>>32)&0xFFFFFFFF;
+
+ rc = wolfSSH_SFTP_SendWritePacket(sshc->ssh_session, sshc->handle,
+ sshc->handleSz,
+ &offset[0],
+ (byte *)mem, (word32)len);
+
+ if(rc == WS_FATAL_ERROR)
+ rc = wolfSSH_get_error(sshc->ssh_session);
+ if(rc == WS_WANT_READ) {
+ conn->waitfor = KEEP_RECV;
+ *err = CURLE_AGAIN;
+ return -1;
+ }
+ else if(rc == WS_WANT_WRITE) {
+ conn->waitfor = KEEP_SEND;
+ *err = CURLE_AGAIN;
+ return -1;
+ }
+ if(rc < 0) {
+ failf(conn->data, "wolfSSH_SFTP_SendWritePacket returned %d\n", rc);
+ return -1;
+ }
+ DEBUGASSERT(rc == (int)len);
+ infof(conn->data, "sent %zd bytes SFTP from offset %zd\n",
+ len, sshc->offset);
+ sshc->offset += len;
+ return (ssize_t)rc;
+}
+
+/*
+ * Return number of received (decrypted) bytes
+ * or <0 on error
+ */
+static ssize_t wsftp_recv(struct connectdata *conn, int sockindex,
+ char *mem, size_t len, CURLcode *err)
+{
+ int rc;
+ struct ssh_conn *sshc = &conn->proto.sshc;
+ word32 offset[2];
+ (void)sockindex;
+
+ offset[0] = (word32)sshc->offset&0xFFFFFFFF;
+ offset[1] = (word32)(sshc->offset>>32)&0xFFFFFFFF;
+
+ rc = wolfSSH_SFTP_SendReadPacket(sshc->ssh_session, sshc->handle,
+ sshc->handleSz,
+ &offset[0],
+ (byte *)mem, (word32)len);
+ if(rc == WS_FATAL_ERROR)
+ rc = wolfSSH_get_error(sshc->ssh_session);
+ if(rc == WS_WANT_READ) {
+ conn->waitfor = KEEP_RECV;
+ *err = CURLE_AGAIN;
+ return -1;
+ }
+ else if(rc == WS_WANT_WRITE) {
+ conn->waitfor = KEEP_SEND;
+ *err = CURLE_AGAIN;
+ return -1;
+ }
+
+ DEBUGASSERT(rc <= (int)len);
+
+ if(rc < 0) {
+ failf(conn->data, "wolfSSH_SFTP_SendReadPacket returned %d\n", rc);
+ return -1;
+ }
+ sshc->offset += len;
+
+ return (ssize_t)rc;
+}
+
+/*
+ * SSH setup and connection
+ */
+static CURLcode wssh_setup_connection(struct connectdata *conn)
+{
+ struct SSHPROTO *ssh;
+
+ conn->data->req.protop = ssh = calloc(1, sizeof(struct SSHPROTO));
+ if(!ssh)
+ return CURLE_OUT_OF_MEMORY;
+
+ return CURLE_OK;
+}
+
+static Curl_recv wscp_recv, wsftp_recv;
+static Curl_send wscp_send, wsftp_send;
+
+static int userauth(byte authtype,
+ WS_UserAuthData* authdata,
+ void *ctx)
+{
+ struct connectdata *conn = ctx;
+ DEBUGF(infof(conn->data, "wolfssh callback: type %s\n",
+ authtype == WOLFSSH_USERAUTH_PASSWORD ? "PASSWORD" :
+ "PUBLICCKEY"));
+ if(authtype == WOLFSSH_USERAUTH_PASSWORD) {
+ authdata->sf.password.password = (byte *)conn->passwd;
+ authdata->sf.password.passwordSz = (word32) strlen(conn->passwd);
+ }
+
+ return 0;
+}
+
+static CURLcode wssh_connect(struct connectdata *conn, bool *done)
+{
+ struct Curl_easy *data = conn->data;
+ struct ssh_conn *sshc;
+ curl_socket_t sock = conn->sock[FIRSTSOCKET];
+ int rc;
+
+ /* initialize per-handle data if not already */
+ if(!data->req.protop)
+ wssh_setup_connection(conn);
+
+ /* We default to persistent connections. We set this already in this connect
+ function to make the re-use checks properly be able to check this bit. */
+ connkeep(conn, "SSH default");
+
+ if(conn->handler->protocol & CURLPROTO_SCP) {
+ conn->recv[FIRSTSOCKET] = wscp_recv;
+ conn->send[FIRSTSOCKET] = wscp_send;
+ }
+ else {
+ conn->recv[FIRSTSOCKET] = wsftp_recv;
+ conn->send[FIRSTSOCKET] = wsftp_send;
+ }
+ sshc = &conn->proto.sshc;
+ sshc->ctx = wolfSSH_CTX_new(WOLFSSH_ENDPOINT_CLIENT, NULL);
+ if(!sshc->ctx) {
+ failf(data, "No wolfSSH context");
+ goto error;
+ }
+
+ sshc->ssh_session = wolfSSH_new(sshc->ctx);
+ if(sshc->ssh_session == NULL) {
+ failf(data, "No wolfSSH session");
+ goto error;
+ }
+
+ rc = wolfSSH_SetUsername(sshc->ssh_session, conn->user);
+ if(rc != WS_SUCCESS) {
+ failf(data, "wolfSSH failed to set user name");
+ goto error;
+ }
+
+ /* set callback for authentication */
+ wolfSSH_SetUserAuth(sshc->ctx, userauth);
+ wolfSSH_SetUserAuthCtx(sshc->ssh_session, conn);
+
+ rc = wolfSSH_set_fd(sshc->ssh_session, (int)sock);
+ if(rc) {
+ failf(data, "wolfSSH failed to set socket");
+ goto error;
+ }
+
+#if 0
+ wolfSSH_Debugging_ON();
+#endif
+
+ *done = TRUE;
+ if(conn->handler->protocol & CURLPROTO_SCP)
+ state(conn, SSH_INIT);
+ else
+ state(conn, SSH_SFTP_INIT);
+
+ return wssh_multi_statemach(conn, done);
+ error:
+ wolfSSH_free(sshc->ssh_session);
+ wolfSSH_CTX_free(sshc->ctx);
+ return CURLE_FAILED_INIT;
+}
+
+/*
+ * wssh_statemach_act() runs the SSH state machine as far as it can without
+ * blocking and without reaching the end. The data the pointer 'block' points
+ * to will be set to TRUE if the wolfssh function returns EAGAIN meaning it
+ * wants to be called again when the socket is ready
+ */
+
+static CURLcode wssh_statemach_act(struct connectdata *conn, bool *block)
+{
+ CURLcode result = CURLE_OK;
+ struct ssh_conn *sshc = &conn->proto.sshc;
+ struct Curl_easy *data = conn->data;
+ struct SSHPROTO *sftp_scp = data->req.protop;
+ WS_SFTPNAME *name;
+ int rc = 0;
+ *block = FALSE; /* we're not blocking by default */
+
+ do {
+ switch(sshc->state) {
+ case SSH_INIT:
+ state(conn, SSH_S_STARTUP);
+ /* FALLTHROUGH */
+ case SSH_S_STARTUP:
+ rc = wolfSSH_connect(sshc->ssh_session);
+ if(rc != WS_SUCCESS)
+ rc = wolfSSH_get_error(sshc->ssh_session);
+ if(rc == WS_WANT_READ) {
+ *block = TRUE;
+ conn->waitfor = KEEP_RECV;
+ return CURLE_OK;
+ }
+ else if(rc == WS_WANT_WRITE) {
+ *block = TRUE;
+ conn->waitfor = KEEP_SEND;
+ return CURLE_OK;
+ }
+ else if(rc != WS_SUCCESS) {
+ state(conn, SSH_STOP);
+ return CURLE_SSH;
+ }
+ infof(data, "wolfssh connected!\n");
+ state(conn, SSH_STOP);
+ break;
+ case SSH_STOP:
+ break;
+
+ case SSH_SFTP_INIT:
+ rc = wolfSSH_SFTP_connect(sshc->ssh_session);
+ if(rc != WS_SUCCESS)
+ rc = wolfSSH_get_error(sshc->ssh_session);
+ if(rc == WS_WANT_READ) {
+ *block = TRUE;
+ conn->waitfor = KEEP_RECV;
+ return CURLE_OK;
+ }
+ else if(rc == WS_WANT_WRITE) {
+ *block = TRUE;
+ conn->waitfor = KEEP_SEND;
+ return CURLE_OK;
+ }
+ else if(rc == WS_SUCCESS) {
+ infof(data, "wolfssh SFTP connected!\n");
+ state(conn, SSH_SFTP_REALPATH);
+ }
+ else {
+ failf(data, "wolfssh SFTP connect error %d", rc);
+ return CURLE_SSH;
+ }
+ break;
+ case SSH_SFTP_REALPATH:
+ name = wolfSSH_SFTP_RealPath(sshc->ssh_session, (char *)".");
+ rc = wolfSSH_get_error(sshc->ssh_session);
+ if(rc == WS_WANT_READ) {
+ *block = TRUE;
+ conn->waitfor = KEEP_RECV;
+ return CURLE_OK;
+ }
+ else if(rc == WS_WANT_WRITE) {
+ *block = TRUE;
+ conn->waitfor = KEEP_SEND;
+ return CURLE_OK;
+ }
+ else if(name && (rc == WS_SUCCESS)) {
+ sshc->homedir = malloc(name->fSz + 1);
+ if(!sshc->homedir) {
+ sshc->actualcode = CURLE_OUT_OF_MEMORY;
+ }
+ else {
+ memcpy(sshc->homedir, name->fName, name->fSz);
+ sshc->homedir[name->fSz] = 0;
+ infof(data, "wolfssh SFTP realpath succeeded!\n");
+ }
+ wolfSSH_SFTPNAME_list_free(name);
+ state(conn, SSH_STOP);
+ return CURLE_OK;
+ }
+ failf(data, "wolfssh SFTP realpath %d", rc);
+ return CURLE_SSH;
+
+ case SSH_SFTP_QUOTE_INIT:
+ result = Curl_getworkingpath(conn, sshc->homedir, &sftp_scp->path);
+ if(result) {
+ sshc->actualcode = result;
+ state(conn, SSH_STOP);
+ break;
+ }
+
+ if(data->set.quote) {
+ infof(data, "Sending quote commands\n");
+ sshc->quote_item = data->set.quote;
+ state(conn, SSH_SFTP_QUOTE);
+ }
+ else {
+ state(conn, SSH_SFTP_GETINFO);
+ }
+ break;
+ case SSH_SFTP_GETINFO:
+ if(data->set.get_filetime) {
+ state(conn, SSH_SFTP_FILETIME);
+ }
+ else {
+ state(conn, SSH_SFTP_TRANS_INIT);
+ }
+ break;
+ case SSH_SFTP_TRANS_INIT:
+ if(data->set.upload)
+ state(conn, SSH_SFTP_UPLOAD_INIT);
+ else {
+ if(sftp_scp->path[strlen(sftp_scp->path)-1] == '/')
+ state(conn, SSH_SFTP_READDIR_INIT);
+ else
+ state(conn, SSH_SFTP_DOWNLOAD_INIT);
+ }
+ break;
+ case SSH_SFTP_UPLOAD_INIT: {
+ word32 flags;
+ WS_SFTP_FILEATRB createattrs;
+ if(data->state.resume_from) {
+ WS_SFTP_FILEATRB attrs;
+ if(data->state.resume_from < 0) {
+ rc = wolfSSH_SFTP_STAT(sshc->ssh_session, sftp_scp->path,
+ &attrs);
+ if(rc != WS_SUCCESS)
+ break;
+
+ if(rc) {
+ data->state.resume_from = 0;
+ }
+ else {
+ curl_off_t size = ((curl_off_t)attrs.sz[1] << 32) | attrs.sz[0];
+ if(size < 0) {
+ failf(data, "Bad file size (%" CURL_FORMAT_CURL_OFF_T ")", size);
+ return CURLE_BAD_DOWNLOAD_RESUME;
+ }
+ data->state.resume_from = size;
+ }
+ }
+ }
+
+ if(data->set.ftp_append)
+ /* Try to open for append, but create if nonexisting */
+ flags = WOLFSSH_FXF_WRITE|WOLFSSH_FXF_CREAT|WOLFSSH_FXF_APPEND;
+ else if(data->state.resume_from > 0)
+ /* If we have restart position then open for append */
+ flags = WOLFSSH_FXF_WRITE|WOLFSSH_FXF_APPEND;
+ else
+ /* Clear file before writing (normal behaviour) */
+ flags = WOLFSSH_FXF_WRITE|WOLFSSH_FXF_CREAT|WOLFSSH_FXF_TRUNC;
+
+ memset(&createattrs, 0, sizeof(createattrs));
+ createattrs.per = (word32)data->set.new_file_perms;
+ sshc->handleSz = sizeof(sshc->handle);
+ rc = wolfSSH_SFTP_Open(sshc->ssh_session, sftp_scp->path,
+ flags, &createattrs,
+ sshc->handle, &sshc->handleSz);
+ if(rc == WS_FATAL_ERROR)
+ rc = wolfSSH_get_error(sshc->ssh_session);
+ if(rc == WS_WANT_READ) {
+ *block = TRUE;
+ conn->waitfor = KEEP_RECV;
+ return CURLE_OK;
+ }
+ else if(rc == WS_WANT_WRITE) {
+ *block = TRUE;
+ conn->waitfor = KEEP_SEND;
+ return CURLE_OK;
+ }
+ else if(rc == WS_SUCCESS) {
+ infof(data, "wolfssh SFTP open succeeded!\n");
+ }
+ else {
+ failf(data, "wolfssh SFTP upload open failed: %d", rc);
+ return CURLE_SSH;
+ }
+ state(conn, SSH_SFTP_DOWNLOAD_STAT);
+
+ /* If we have a restart point then we need to seek to the correct
+ position. */
+ if(data->state.resume_from > 0) {
+ /* Let's read off the proper amount of bytes from the input. */
+ int seekerr = CURL_SEEKFUNC_OK;
+ if(conn->seek_func) {
+ Curl_set_in_callback(data, true);
+ seekerr = conn->seek_func(conn->seek_client, data->state.resume_from,
+ SEEK_SET);
+ Curl_set_in_callback(data, false);
+ }
+
+ if(seekerr != CURL_SEEKFUNC_OK) {
+ curl_off_t passed = 0;
+
+ if(seekerr != CURL_SEEKFUNC_CANTSEEK) {
+ failf(data, "Could not seek stream");
+ return CURLE_FTP_COULDNT_USE_REST;
+ }
+ /* seekerr == CURL_SEEKFUNC_CANTSEEK (can't seek to offset) */
+ do {
+ size_t readthisamountnow =
+ (data->state.resume_from - passed > data->set.buffer_size) ?
+ (size_t)data->set.buffer_size :
+ curlx_sotouz(data->state.resume_from - passed);
+
+ size_t actuallyread;
+ Curl_set_in_callback(data, true);
+ actuallyread = data->state.fread_func(data->state.buffer, 1,
+ readthisamountnow,
+ data->state.in);
+ Curl_set_in_callback(data, false);
+
+ passed += actuallyread;
+ if((actuallyread == 0) || (actuallyread > readthisamountnow)) {
+ /* this checks for greater-than only to make sure that the
+ CURL_READFUNC_ABORT return code still aborts */
+ failf(data, "Failed to read data");
+ return CURLE_FTP_COULDNT_USE_REST;
+ }
+ } while(passed < data->state.resume_from);
+ }
+
+ /* now, decrease the size of the read */
+ if(data->state.infilesize > 0) {
+ data->state.infilesize -= data->state.resume_from;
+ data->req.size = data->state.infilesize;
+ Curl_pgrsSetUploadSize(data, data->state.infilesize);
+ }
+
+ sshc->offset += data->state.resume_from;
+ }
+ if(data->state.infilesize > 0) {
+ data->req.size = data->state.infilesize;
+ Curl_pgrsSetUploadSize(data, data->state.infilesize);
+ }
+ /* upload data */
+ Curl_setup_transfer(data, -1, -1, FALSE, FIRSTSOCKET);
+
+ /* not set by Curl_setup_transfer to preserve keepon bits */
+ conn->sockfd = conn->writesockfd;
+
+ if(result) {
+ state(conn, SSH_SFTP_CLOSE);
+ sshc->actualcode = result;
+ }
+ else {
+ /* store this original bitmask setup to use later on if we can't
+ figure out a "real" bitmask */
+ sshc->orig_waitfor = data->req.keepon;
+
+ /* we want to use the _sending_ function even when the socket turns
+ out readable as the underlying libssh2 sftp send function will deal
+ with both accordingly */
+ conn->cselect_bits = CURL_CSELECT_OUT;
+
+ /* since we don't really wait for anything at this point, we want the
+ state machine to move on as soon as possible so we set a very short
+ timeout here */
+ Curl_expire(data, 0, EXPIRE_RUN_NOW);
+
+ state(conn, SSH_STOP);
+ }
+ break;
+ }
+ case SSH_SFTP_DOWNLOAD_INIT:
+ sshc->handleSz = sizeof(sshc->handle);
+ rc = wolfSSH_SFTP_Open(sshc->ssh_session, sftp_scp->path,
+ WOLFSSH_FXF_READ, NULL,
+ sshc->handle, &sshc->handleSz);
+ if(rc == WS_FATAL_ERROR)
+ rc = wolfSSH_get_error(sshc->ssh_session);
+ if(rc == WS_WANT_READ) {
+ *block = TRUE;
+ conn->waitfor = KEEP_RECV;
+ return CURLE_OK;
+ }
+ else if(rc == WS_WANT_WRITE) {
+ *block = TRUE;
+ conn->waitfor = KEEP_SEND;
+ return CURLE_OK;
+ }
+ else if(rc == WS_SUCCESS) {
+ infof(data, "wolfssh SFTP open succeeded!\n");
+ state(conn, SSH_SFTP_DOWNLOAD_STAT);
+ return CURLE_OK;
+ }
+
+ failf(data, "wolfssh SFTP open failed: %d", rc);
+ return CURLE_SSH;
+
+ case SSH_SFTP_DOWNLOAD_STAT: {
+ WS_SFTP_FILEATRB attrs;
+ curl_off_t size;
+
+ rc = wolfSSH_SFTP_STAT(sshc->ssh_session, sftp_scp->path, &attrs);
+ if(rc == WS_FATAL_ERROR)
+ rc = wolfSSH_get_error(sshc->ssh_session);
+ if(rc == WS_WANT_READ) {
+ *block = TRUE;
+ conn->waitfor = KEEP_RECV;
+ return CURLE_OK;
+ }
+ else if(rc == WS_WANT_WRITE) {
+ *block = TRUE;
+ conn->waitfor = KEEP_SEND;
+ return CURLE_OK;
+ }
+ else if(rc == WS_SUCCESS) {
+ infof(data, "wolfssh STAT succeeded!\n");
+ }
+ else {
+ failf(data, "wolfssh SFTP open failed: %d", rc);
+ data->req.size = -1;
+ data->req.maxdownload = -1;
+ Curl_pgrsSetDownloadSize(data, -1);
+ return CURLE_SSH;
+ }
+
+ size = ((curl_off_t)attrs.sz[1] <<32) | attrs.sz[0];
+
+ data->req.size = size;
+ data->req.maxdownload = size;
+ Curl_pgrsSetDownloadSize(data, size);
+
+ infof(data, "SFTP download %" CURL_FORMAT_CURL_OFF_T " bytes\n", size);
+
+ /* We cannot seek with wolfSSH so resuming and range requests are not
+ possible */
+ if(conn->data->state.use_range || data->state.resume_from) {
+ infof(data, "wolfSSH cannot do range/seek on SFTP\n");
+ return CURLE_BAD_DOWNLOAD_RESUME;
+ }
+
+ /* Setup the actual download */
+ if(data->req.size == 0) {
+ /* no data to transfer */
+ Curl_setup_transfer(data, -1, -1, FALSE, -1);
+ infof(data, "File already completely downloaded\n");
+ state(conn, SSH_STOP);
+ break;
+ }
+ Curl_setup_transfer(data, FIRSTSOCKET, data->req.size, FALSE, -1);
+
+ /* not set by Curl_setup_transfer to preserve keepon bits */
+ conn->writesockfd = conn->sockfd;
+
+ /* we want to use the _receiving_ function even when the socket turns
+ out writableable as the underlying libssh2 recv function will deal
+ with both accordingly */
+ conn->cselect_bits = CURL_CSELECT_IN;
+
+ if(result) {
+ /* this should never occur; the close state should be entered
+ at the time the error occurs */
+ state(conn, SSH_SFTP_CLOSE);
+ sshc->actualcode = result;
+ }
+ else {
+ state(conn, SSH_STOP);
+ }
+ break;
+ }
+ case SSH_SFTP_CLOSE:
+ if(sshc->handleSz)
+ rc = wolfSSH_SFTP_Close(sshc->ssh_session, sshc->handle,
+ sshc->handleSz);
+ else
+ rc = WS_SUCCESS; /* directory listing */
+ if(rc == WS_WANT_READ) {
+ *block = TRUE;
+ conn->waitfor = KEEP_RECV;
+ return CURLE_OK;
+ }
+ else if(rc == WS_WANT_WRITE) {
+ *block = TRUE;
+ conn->waitfor = KEEP_SEND;
+ return CURLE_OK;
+ }
+ else if(rc == WS_SUCCESS) {
+ state(conn, SSH_STOP);
+ return CURLE_OK;
+ }
+
+ failf(data, "wolfssh SFTP CLOSE failed: %d", rc);
+ return CURLE_SSH;
+
+ case SSH_SFTP_READDIR_INIT:
+ Curl_pgrsSetDownloadSize(data, -1);
+ if(data->set.opt_no_body) {
+ state(conn, SSH_STOP);
+ break;
+ }
+ state(conn, SSH_SFTP_READDIR);
+ /* FALLTHROUGH */
+ case SSH_SFTP_READDIR:
+ name = wolfSSH_SFTP_LS(sshc->ssh_session, sftp_scp->path);
+ if(!name)
+ rc = wolfSSH_get_error(sshc->ssh_session);
+ else
+ rc = WS_SUCCESS;
+
+ if(rc == WS_WANT_READ) {
+ *block = TRUE;
+ conn->waitfor = KEEP_RECV;
+ return CURLE_OK;
+ }
+ else if(rc == WS_WANT_WRITE) {
+ *block = TRUE;
+ conn->waitfor = KEEP_SEND;
+ return CURLE_OK;
+ }
+ else if(name && (rc == WS_SUCCESS)) {
+ WS_SFTPNAME *origname = name;
+ result = CURLE_OK;
+ while(name) {
+ char *line = aprintf("%s\n",
+ data->set.ftp_list_only ?
+ name->fName : name->lName);
+ if(line == NULL) {
+ state(conn, SSH_SFTP_CLOSE);
+ sshc->actualcode = CURLE_OUT_OF_MEMORY;
+ break;
+ }
+ result = Curl_client_write(conn, CLIENTWRITE_BODY,
+ line, strlen(line));
+ free(line);
+ if(result) {
+ sshc->actualcode = result;
+ break;
+ }
+ name = name->next;
+ }
+ wolfSSH_SFTPNAME_list_free(origname);
+ state(conn, SSH_STOP);
+ return result;
+ }
+ failf(data, "wolfssh SFTP ls failed: %d", rc);
+ return CURLE_SSH;
+
+ case SSH_SFTP_SHUTDOWN:
+ Curl_safefree(sshc->homedir);
+ wolfSSH_free(sshc->ssh_session);
+ wolfSSH_CTX_free(sshc->ctx);
+ state(conn, SSH_STOP);
+ return CURLE_OK;
+ default:
+ break;
+ }
+ } while(!rc && (sshc->state != SSH_STOP));
+ return result;
+}
+
+/* called repeatedly until done from multi.c */
+static CURLcode wssh_multi_statemach(struct connectdata *conn, bool *done)
+{
+ struct ssh_conn *sshc = &conn->proto.sshc;
+ CURLcode result = CURLE_OK;
+ bool block; /* we store the status and use that to provide a ssh_getsock()
+ implementation */
+ do {
+ result = wssh_statemach_act(conn, &block);
+ *done = (sshc->state == SSH_STOP) ? TRUE : FALSE;
+ /* if there's no error, it isn't done and it didn't EWOULDBLOCK, then
+ try again */
+ if(*done) {
+ DEBUGF(infof(conn->data, "wssh_statemach_act says DONE\n"));
+ }
+ } while(!result && !*done && !block);
+
+ return result;
+}
+
+static
+CURLcode wscp_perform(struct connectdata *conn,
+ bool *connected,
+ bool *dophase_done)
+{
+ (void)conn;
+ (void)connected;
+ (void)dophase_done;
+ return CURLE_OK;
+}
+
+static
+CURLcode wsftp_perform(struct connectdata *conn,
+ bool *connected,
+ bool *dophase_done)
+{
+ CURLcode result = CURLE_OK;
+
+ DEBUGF(infof(conn->data, "DO phase starts\n"));
+
+ *dophase_done = FALSE; /* not done yet */
+
+ /* start the first command in the DO phase */
+ state(conn, SSH_SFTP_QUOTE_INIT);
+
+ /* run the state-machine */
+ result = wssh_multi_statemach(conn, dophase_done);
+
+ *connected = conn->bits.tcpconnect[FIRSTSOCKET];
+
+ if(*dophase_done) {
+ DEBUGF(infof(conn->data, "DO phase is complete\n"));
+ }
+
+ return result;
+}
+
+/*
+ * The DO function is generic for both protocols.
+ */
+static CURLcode wssh_do(struct connectdata *conn, bool *done)
+{
+ CURLcode result;
+ bool connected = 0;
+ struct Curl_easy *data = conn->data;
+ struct ssh_conn *sshc = &conn->proto.sshc;
+
+ *done = FALSE; /* default to false */
+ data->req.size = -1; /* make sure this is unknown at this point */
+ sshc->actualcode = CURLE_OK; /* reset error code */
+ sshc->secondCreateDirs = 0; /* reset the create dir attempt state
+ variable */
+
+ Curl_pgrsSetUploadCounter(data, 0);
+ Curl_pgrsSetDownloadCounter(data, 0);
+ Curl_pgrsSetUploadSize(data, -1);
+ Curl_pgrsSetDownloadSize(data, -1);
+
+ if(conn->handler->protocol & CURLPROTO_SCP)
+ result = wscp_perform(conn, &connected, done);
+ else
+ result = wsftp_perform(conn, &connected, done);
+
+ return result;
+}
+
+static CURLcode wssh_block_statemach(struct connectdata *conn,
+ bool disconnect)
+{
+ struct ssh_conn *sshc = &conn->proto.sshc;
+ CURLcode result = CURLE_OK;
+ struct Curl_easy *data = conn->data;
+
+ while((sshc->state != SSH_STOP) && !result) {
+ bool block;
+ timediff_t left = 1000;
+ struct curltime now = Curl_now();
+
+ result = wssh_statemach_act(conn, &block);
+ if(result)
+ break;
+
+ if(!disconnect) {
+ if(Curl_pgrsUpdate(conn))
+ return CURLE_ABORTED_BY_CALLBACK;
+
+ result = Curl_speedcheck(data, now);
+ if(result)
+ break;
+
+ left = Curl_timeleft(data, NULL, FALSE);
+ if(left < 0) {
+ failf(data, "Operation timed out");
+ return CURLE_OPERATION_TIMEDOUT;
+ }
+ }
+
+ if(!result) {
+ int dir = conn->waitfor;
+ curl_socket_t sock = conn->sock[FIRSTSOCKET];
+ curl_socket_t fd_read = CURL_SOCKET_BAD;
+ curl_socket_t fd_write = CURL_SOCKET_BAD;
+ if(dir == KEEP_RECV)
+ fd_read = sock;
+ else if(dir == KEEP_SEND)
+ fd_write = sock;
+
+ /* wait for the socket to become ready */
+ (void)Curl_socket_check(fd_read, CURL_SOCKET_BAD, fd_write,
+ left>1000?1000:left); /* ignore result */
+ }
+ }
+
+ return result;
+}
+
+/* generic done function for both SCP and SFTP called from their specific
+ done functions */
+static CURLcode wssh_done(struct connectdata *conn, CURLcode status)
+{
+ CURLcode result = CURLE_OK;
+ struct SSHPROTO *sftp_scp = conn->data->req.protop;
+
+ if(!status) {
+ /* run the state-machine */
+ result = wssh_block_statemach(conn, FALSE);
+ }
+ else
+ result = status;
+
+ if(sftp_scp)
+ Curl_safefree(sftp_scp->path);
+ if(Curl_pgrsDone(conn))
+ return CURLE_ABORTED_BY_CALLBACK;
+
+ conn->data->req.keepon = 0; /* clear all bits */
+ return result;
+}
+
+#if 0
+static CURLcode wscp_done(struct connectdata *conn,
+ CURLcode code, bool premature)
+{
+ CURLcode result = CURLE_OK;
+ (void)conn;
+ (void)code;
+ (void)premature;
+
+ return result;
+}
+
+static CURLcode wscp_doing(struct connectdata *conn,
+ bool *dophase_done)
+{
+ CURLcode result = CURLE_OK;
+ (void)conn;
+ (void)dophase_done;
+
+ return result;
+}
+
+static CURLcode wscp_disconnect(struct connectdata *conn, bool dead_connection)
+{
+ CURLcode result = CURLE_OK;
+ (void)conn;
+ (void)dead_connection;
+
+ return result;
+}
+#endif
+
+static CURLcode wsftp_done(struct connectdata *conn,
+ CURLcode code, bool premature)
+{
+ (void)premature;
+ state(conn, SSH_SFTP_CLOSE);
+
+ return wssh_done(conn, code);
+}
+
+static CURLcode wsftp_doing(struct connectdata *conn,
+ bool *dophase_done)
+{
+ CURLcode result = wssh_multi_statemach(conn, dophase_done);
+
+ if(*dophase_done) {
+ DEBUGF(infof(conn->data, "DO phase is complete\n"));
+ }
+ return result;
+}
+
+static CURLcode wsftp_disconnect(struct connectdata *conn, bool dead)
+{
+ CURLcode result = CURLE_OK;
+ (void)dead;
+
+ DEBUGF(infof(conn->data, "SSH DISCONNECT starts now\n"));
+
+ if(conn->proto.sshc.ssh_session) {
+ /* only if there's a session still around to use! */
+ state(conn, SSH_SFTP_SHUTDOWN);
+ result = wssh_block_statemach(conn, TRUE);
+ }
+
+ DEBUGF(infof(conn->data, "SSH DISCONNECT is done\n"));
+ return result;
+}
+
+static int wssh_getsock(struct connectdata *conn,
+ curl_socket_t *sock)
+{
+ return wssh_perform_getsock(conn, sock);
+}
+
+static int wssh_perform_getsock(const struct connectdata *conn,
+ curl_socket_t *sock)
+{
+ int bitmap = GETSOCK_BLANK;
+ int dir = conn->waitfor;
+ sock[0] = conn->sock[FIRSTSOCKET];
+
+ if(dir == KEEP_RECV)
+ bitmap |= GETSOCK_READSOCK(FIRSTSOCKET);
+ else if(dir == KEEP_SEND)
+ bitmap |= GETSOCK_WRITESOCK(FIRSTSOCKET);
+
+ return bitmap;
+}
+
+size_t Curl_ssh_version(char *buffer, size_t buflen)
+{
+ return msnprintf(buffer, buflen, "wolfssh/%s", LIBWOLFSSH_VERSION_STRING);
+}
+
+CURLcode Curl_ssh_init(void)
+{
+ if(WS_SUCCESS != wolfSSH_Init()) {
+ DEBUGF(fprintf(stderr, "Error: wolfSSH_Init failed\n"));
+ return CURLE_FAILED_INIT;
+ }
+
+ return CURLE_OK;
+}
+void Curl_ssh_cleanup(void)
+{
+}
+
+#endif /* USE_WOLFSSH */
diff --git a/Utilities/cmcurl/lib/vssh/wolfssh.h b/Utilities/cmcurl/lib/vssh/wolfssh.h
new file mode 100644
index 0000000..a9b9a3b
--- /dev/null
+++ b/Utilities/cmcurl/lib/vssh/wolfssh.h
@@ -0,0 +1,27 @@
+#ifndef HEADER_CURL_WOLFSSH_H
+#define HEADER_CURL_WOLFSSH_H
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2019 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+extern const struct Curl_handler Curl_handler_sftp;
+
+#endif /* HEADER_CURL_WOLFSSH_H */
diff --git a/Utilities/cmcurl/lib/vtls/bearssl.c b/Utilities/cmcurl/lib/vtls/bearssl.c
new file mode 100644
index 0000000..67f9458
--- /dev/null
+++ b/Utilities/cmcurl/lib/vtls/bearssl.c
@@ -0,0 +1,866 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2019, Michael Forney, <mforney@mforney.org>
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "curl_setup.h"
+
+#ifdef USE_BEARSSL
+
+#include <bearssl.h>
+
+#include "bearssl.h"
+#include "urldata.h"
+#include "sendf.h"
+#include "inet_pton.h"
+#include "vtls.h"
+#include "connect.h"
+#include "select.h"
+#include "multiif.h"
+#include "curl_printf.h"
+#include "curl_memory.h"
+
+struct x509_context {
+ const br_x509_class *vtable;
+ br_x509_minimal_context minimal;
+ bool verifyhost;
+ bool verifypeer;
+};
+
+struct ssl_backend_data {
+ br_ssl_client_context ctx;
+ struct x509_context x509;
+ unsigned char buf[BR_SSL_BUFSIZE_BIDI];
+ br_x509_trust_anchor *anchors;
+ size_t anchors_len;
+ const char *protocols[2];
+ /* SSL client context is active */
+ bool active;
+ /* size of pending write, yet to be flushed */
+ size_t pending_write;
+};
+
+#define BACKEND connssl->backend
+
+struct cafile_parser {
+ CURLcode err;
+ bool in_cert;
+ br_x509_decoder_context xc;
+ /* array of trust anchors loaded from CAfile */
+ br_x509_trust_anchor *anchors;
+ size_t anchors_len;
+ /* buffer for DN data */
+ unsigned char dn[1024];
+ size_t dn_len;
+};
+
+static void append_dn(void *ctx, const void *buf, size_t len)
+{
+ struct cafile_parser *ca = ctx;
+
+ if(ca->err != CURLE_OK || !ca->in_cert)
+ return;
+ if(sizeof(ca->dn) - ca->dn_len < len) {
+ ca->err = CURLE_FAILED_INIT;
+ return;
+ }
+ memcpy(ca->dn + ca->dn_len, buf, len);
+ ca->dn_len += len;
+}
+
+static void x509_push(void *ctx, const void *buf, size_t len)
+{
+ struct cafile_parser *ca = ctx;
+
+ if(ca->in_cert)
+ br_x509_decoder_push(&ca->xc, buf, len);
+}
+
+static CURLcode load_cafile(const char *path, br_x509_trust_anchor **anchors,
+ size_t *anchors_len)
+{
+ struct cafile_parser ca;
+ br_pem_decoder_context pc;
+ br_x509_trust_anchor *ta;
+ size_t ta_size;
+ br_x509_trust_anchor *new_anchors;
+ size_t new_anchors_len;
+ br_x509_pkey *pkey;
+ FILE *fp;
+ unsigned char buf[BUFSIZ], *p;
+ const char *name;
+ size_t n, i, pushed;
+
+ fp = fopen(path, "rb");
+ if(!fp)
+ return CURLE_SSL_CACERT_BADFILE;
+
+ ca.err = CURLE_OK;
+ ca.in_cert = FALSE;
+ ca.anchors = NULL;
+ ca.anchors_len = 0;
+ br_pem_decoder_init(&pc);
+ br_pem_decoder_setdest(&pc, x509_push, &ca);
+ for(;;) {
+ n = fread(buf, 1, sizeof(buf), fp);
+ if(n == 0)
+ break;
+ p = buf;
+ while(n) {
+ pushed = br_pem_decoder_push(&pc, p, n);
+ if(ca.err)
+ goto fail;
+ p += pushed;
+ n -= pushed;
+
+ switch(br_pem_decoder_event(&pc)) {
+ case 0:
+ break;
+ case BR_PEM_BEGIN_OBJ:
+ name = br_pem_decoder_name(&pc);
+ if(strcmp(name, "CERTIFICATE") && strcmp(name, "X509 CERTIFICATE"))
+ break;
+ br_x509_decoder_init(&ca.xc, append_dn, &ca);
+ if(ca.anchors_len == SIZE_MAX / sizeof(ca.anchors[0])) {
+ ca.err = CURLE_OUT_OF_MEMORY;
+ goto fail;
+ }
+ new_anchors_len = ca.anchors_len + 1;
+ new_anchors = realloc(ca.anchors,
+ new_anchors_len * sizeof(ca.anchors[0]));
+ if(!new_anchors) {
+ ca.err = CURLE_OUT_OF_MEMORY;
+ goto fail;
+ }
+ ca.anchors = new_anchors;
+ ca.anchors_len = new_anchors_len;
+ ca.in_cert = TRUE;
+ ca.dn_len = 0;
+ ta = &ca.anchors[ca.anchors_len - 1];
+ ta->dn.data = NULL;
+ break;
+ case BR_PEM_END_OBJ:
+ if(!ca.in_cert)
+ break;
+ ca.in_cert = FALSE;
+ if(br_x509_decoder_last_error(&ca.xc)) {
+ ca.err = CURLE_SSL_CACERT_BADFILE;
+ goto fail;
+ }
+ ta->flags = 0;
+ if(br_x509_decoder_isCA(&ca.xc))
+ ta->flags |= BR_X509_TA_CA;
+ pkey = br_x509_decoder_get_pkey(&ca.xc);
+ if(!pkey) {
+ ca.err = CURLE_SSL_CACERT_BADFILE;
+ goto fail;
+ }
+ ta->pkey = *pkey;
+
+ /* calculate space needed for trust anchor data */
+ ta_size = ca.dn_len;
+ switch(pkey->key_type) {
+ case BR_KEYTYPE_RSA:
+ ta_size += pkey->key.rsa.nlen + pkey->key.rsa.elen;
+ break;
+ case BR_KEYTYPE_EC:
+ ta_size += pkey->key.ec.qlen;
+ break;
+ default:
+ ca.err = CURLE_FAILED_INIT;
+ goto fail;
+ }
+
+ /* fill in trust anchor DN and public key data */
+ ta->dn.data = malloc(ta_size);
+ if(!ta->dn.data) {
+ ca.err = CURLE_OUT_OF_MEMORY;
+ goto fail;
+ }
+ memcpy(ta->dn.data, ca.dn, ca.dn_len);
+ ta->dn.len = ca.dn_len;
+ switch(pkey->key_type) {
+ case BR_KEYTYPE_RSA:
+ ta->pkey.key.rsa.n = ta->dn.data + ta->dn.len;
+ memcpy(ta->pkey.key.rsa.n, pkey->key.rsa.n, pkey->key.rsa.nlen);
+ ta->pkey.key.rsa.e = ta->pkey.key.rsa.n + ta->pkey.key.rsa.nlen;
+ memcpy(ta->pkey.key.rsa.e, pkey->key.rsa.e, pkey->key.rsa.elen);
+ break;
+ case BR_KEYTYPE_EC:
+ ta->pkey.key.ec.q = ta->dn.data + ta->dn.len;
+ memcpy(ta->pkey.key.ec.q, pkey->key.ec.q, pkey->key.ec.qlen);
+ break;
+ }
+ break;
+ default:
+ ca.err = CURLE_SSL_CACERT_BADFILE;
+ goto fail;
+ }
+ }
+ }
+ if(ferror(fp))
+ ca.err = CURLE_READ_ERROR;
+
+fail:
+ fclose(fp);
+ if(ca.err == CURLE_OK) {
+ *anchors = ca.anchors;
+ *anchors_len = ca.anchors_len;
+ }
+ else {
+ for(i = 0; i < ca.anchors_len; ++i)
+ free(ca.anchors[i].dn.data);
+ free(ca.anchors);
+ }
+
+ return ca.err;
+}
+
+static void x509_start_chain(const br_x509_class **ctx,
+ const char *server_name)
+{
+ struct x509_context *x509 = (struct x509_context *)ctx;
+
+ if(!x509->verifyhost)
+ server_name = NULL;
+ x509->minimal.vtable->start_chain(&x509->minimal.vtable, server_name);
+}
+
+static void x509_start_cert(const br_x509_class **ctx, uint32_t length)
+{
+ struct x509_context *x509 = (struct x509_context *)ctx;
+
+ x509->minimal.vtable->start_cert(&x509->minimal.vtable, length);
+}
+
+static void x509_append(const br_x509_class **ctx, const unsigned char *buf,
+ size_t len)
+{
+ struct x509_context *x509 = (struct x509_context *)ctx;
+
+ x509->minimal.vtable->append(&x509->minimal.vtable, buf, len);
+}
+
+static void x509_end_cert(const br_x509_class **ctx)
+{
+ struct x509_context *x509 = (struct x509_context *)ctx;
+
+ x509->minimal.vtable->end_cert(&x509->minimal.vtable);
+}
+
+static unsigned x509_end_chain(const br_x509_class **ctx)
+{
+ struct x509_context *x509 = (struct x509_context *)ctx;
+ unsigned err;
+
+ err = x509->minimal.vtable->end_chain(&x509->minimal.vtable);
+ if(err && !x509->verifypeer) {
+ /* ignore any X.509 errors */
+ err = BR_ERR_OK;
+ }
+
+ return err;
+}
+
+static const br_x509_pkey *x509_get_pkey(const br_x509_class *const *ctx,
+ unsigned *usages)
+{
+ struct x509_context *x509 = (struct x509_context *)ctx;
+
+ return x509->minimal.vtable->get_pkey(&x509->minimal.vtable, usages);
+}
+
+static const br_x509_class x509_vtable = {
+ sizeof(struct x509_context),
+ x509_start_chain,
+ x509_start_cert,
+ x509_append,
+ x509_end_cert,
+ x509_end_chain,
+ x509_get_pkey
+};
+
+static CURLcode bearssl_connect_step1(struct connectdata *conn, int sockindex)
+{
+ struct Curl_easy *data = conn->data;
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ const char * const ssl_cafile = SSL_CONN_CONFIG(CAfile);
+ const char *hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
+ conn->host.name;
+ const bool verifypeer = SSL_CONN_CONFIG(verifypeer);
+ const bool verifyhost = SSL_CONN_CONFIG(verifyhost);
+ CURLcode ret;
+ unsigned version_min, version_max;
+#ifdef ENABLE_IPV6
+ struct in6_addr addr;
+#else
+ struct in_addr addr;
+#endif
+
+ switch(SSL_CONN_CONFIG(version)) {
+ case CURL_SSLVERSION_SSLv2:
+ failf(data, "BearSSL does not support SSLv2");
+ return CURLE_SSL_CONNECT_ERROR;
+ case CURL_SSLVERSION_SSLv3:
+ failf(data, "BearSSL does not support SSLv3");
+ return CURLE_SSL_CONNECT_ERROR;
+ case CURL_SSLVERSION_TLSv1_0:
+ version_min = BR_TLS10;
+ version_max = BR_TLS10;
+ break;
+ case CURL_SSLVERSION_TLSv1_1:
+ version_min = BR_TLS11;
+ version_max = BR_TLS11;
+ break;
+ case CURL_SSLVERSION_TLSv1_2:
+ version_min = BR_TLS12;
+ version_max = BR_TLS12;
+ break;
+ case CURL_SSLVERSION_DEFAULT:
+ case CURL_SSLVERSION_TLSv1:
+ version_min = BR_TLS10;
+ version_max = BR_TLS12;
+ break;
+ default:
+ failf(data, "BearSSL: unknown CURLOPT_SSLVERSION");
+ return CURLE_SSL_CONNECT_ERROR;
+ }
+
+ if(ssl_cafile) {
+ ret = load_cafile(ssl_cafile, &BACKEND->anchors, &BACKEND->anchors_len);
+ if(ret != CURLE_OK) {
+ if(verifypeer) {
+ failf(data, "error setting certificate verify locations:\n"
+ " CAfile: %s\n", ssl_cafile);
+ return ret;
+ }
+ infof(data, "error setting certificate verify locations,"
+ " continuing anyway:\n");
+ }
+ }
+
+ /* initialize SSL context */
+ br_ssl_client_init_full(&BACKEND->ctx, &BACKEND->x509.minimal,
+ BACKEND->anchors, BACKEND->anchors_len);
+ br_ssl_engine_set_versions(&BACKEND->ctx.eng, version_min, version_max);
+ br_ssl_engine_set_buffer(&BACKEND->ctx.eng, BACKEND->buf,
+ sizeof(BACKEND->buf), 1);
+
+ /* initialize X.509 context */
+ BACKEND->x509.vtable = &x509_vtable;
+ BACKEND->x509.verifypeer = verifypeer;
+ BACKEND->x509.verifyhost = verifyhost;
+ br_ssl_engine_set_x509(&BACKEND->ctx.eng, &BACKEND->x509.vtable);
+
+ if(SSL_SET_OPTION(primary.sessionid)) {
+ void *session;
+
+ Curl_ssl_sessionid_lock(conn);
+ if(!Curl_ssl_getsessionid(conn, &session, NULL, sockindex)) {
+ br_ssl_engine_set_session_parameters(&BACKEND->ctx.eng, session);
+ infof(data, "BearSSL: re-using session ID\n");
+ }
+ Curl_ssl_sessionid_unlock(conn);
+ }
+
+ if(conn->bits.tls_enable_alpn) {
+ int cur = 0;
+
+ /* NOTE: when adding more protocols here, increase the size of the
+ * protocols array in `struct ssl_backend_data`.
+ */
+
+#ifdef USE_NGHTTP2
+ if(data->set.httpversion >= CURL_HTTP_VERSION_2 &&
+ (!SSL_IS_PROXY() || !conn->bits.tunnel_proxy)) {
+ BACKEND->protocols[cur++] = NGHTTP2_PROTO_VERSION_ID;
+ infof(data, "ALPN, offering %s\n", NGHTTP2_PROTO_VERSION_ID);
+ }
+#endif
+
+ BACKEND->protocols[cur++] = ALPN_HTTP_1_1;
+ infof(data, "ALPN, offering %s\n", ALPN_HTTP_1_1);
+
+ br_ssl_engine_set_protocol_names(&BACKEND->ctx.eng,
+ BACKEND->protocols, cur);
+ }
+
+ if((1 == Curl_inet_pton(AF_INET, hostname, &addr))
+#ifdef ENABLE_IPV6
+ || (1 == Curl_inet_pton(AF_INET6, hostname, &addr))
+#endif
+ ) {
+ if(verifyhost) {
+ failf(data, "BearSSL: "
+ "host verification of IP address is not supported");
+ return CURLE_PEER_FAILED_VERIFICATION;
+ }
+ hostname = NULL;
+ }
+
+ if(!br_ssl_client_reset(&BACKEND->ctx, hostname, 0))
+ return CURLE_FAILED_INIT;
+ BACKEND->active = TRUE;
+
+ connssl->connecting_state = ssl_connect_2;
+
+ return CURLE_OK;
+}
+
+static CURLcode bearssl_run_until(struct connectdata *conn, int sockindex,
+ unsigned target)
+{
+ struct Curl_easy *data = conn->data;
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ curl_socket_t sockfd = conn->sock[sockindex];
+ unsigned state;
+ unsigned char *buf;
+ size_t len;
+ ssize_t ret;
+ int err;
+
+ for(;;) {
+ state = br_ssl_engine_current_state(&BACKEND->ctx.eng);
+ if(state & BR_SSL_CLOSED) {
+ err = br_ssl_engine_last_error(&BACKEND->ctx.eng);
+ switch(err) {
+ case BR_ERR_OK:
+ /* TLS close notify */
+ if(connssl->state != ssl_connection_complete) {
+ failf(data, "SSL: connection closed during handshake");
+ return CURLE_SSL_CONNECT_ERROR;
+ }
+ return CURLE_OK;
+ case BR_ERR_X509_EXPIRED:
+ failf(data, "SSL: X.509 verification: "
+ "certificate is expired or not yet valid");
+ return CURLE_PEER_FAILED_VERIFICATION;
+ case BR_ERR_X509_BAD_SERVER_NAME:
+ failf(data, "SSL: X.509 verification: "
+ "expected server name was not found in the chain");
+ return CURLE_PEER_FAILED_VERIFICATION;
+ case BR_ERR_X509_NOT_TRUSTED:
+ failf(data, "SSL: X.509 verification: "
+ "chain could not be linked to a trust anchor");
+ return CURLE_PEER_FAILED_VERIFICATION;
+ }
+ /* X.509 errors are documented to have the range 32..63 */
+ if(err >= 32 && err < 64)
+ return CURLE_PEER_FAILED_VERIFICATION;
+ return CURLE_SSL_CONNECT_ERROR;
+ }
+ if(state & target)
+ return CURLE_OK;
+ if(state & BR_SSL_SENDREC) {
+ buf = br_ssl_engine_sendrec_buf(&BACKEND->ctx.eng, &len);
+ ret = swrite(sockfd, buf, len);
+ if(ret == -1) {
+ if(SOCKERRNO == EAGAIN || SOCKERRNO == EWOULDBLOCK) {
+ if(connssl->state != ssl_connection_complete)
+ connssl->connecting_state = ssl_connect_2_writing;
+ return CURLE_AGAIN;
+ }
+ return CURLE_WRITE_ERROR;
+ }
+ br_ssl_engine_sendrec_ack(&BACKEND->ctx.eng, ret);
+ }
+ else if(state & BR_SSL_RECVREC) {
+ buf = br_ssl_engine_recvrec_buf(&BACKEND->ctx.eng, &len);
+ ret = sread(sockfd, buf, len);
+ if(ret == 0) {
+ failf(data, "SSL: EOF without close notify");
+ return CURLE_READ_ERROR;
+ }
+ if(ret == -1) {
+ if(SOCKERRNO == EAGAIN || SOCKERRNO == EWOULDBLOCK) {
+ if(connssl->state != ssl_connection_complete)
+ connssl->connecting_state = ssl_connect_2_reading;
+ return CURLE_AGAIN;
+ }
+ return CURLE_READ_ERROR;
+ }
+ br_ssl_engine_recvrec_ack(&BACKEND->ctx.eng, ret);
+ }
+ }
+}
+
+static CURLcode bearssl_connect_step2(struct connectdata *conn, int sockindex)
+{
+ struct Curl_easy *data = conn->data;
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ CURLcode ret;
+
+ ret = bearssl_run_until(conn, sockindex, BR_SSL_SENDAPP | BR_SSL_RECVAPP);
+ if(ret == CURLE_AGAIN)
+ return CURLE_OK;
+ if(ret == CURLE_OK) {
+ if(br_ssl_engine_current_state(&BACKEND->ctx.eng) == BR_SSL_CLOSED) {
+ failf(data, "SSL: connection closed during handshake");
+ return CURLE_SSL_CONNECT_ERROR;
+ }
+ connssl->connecting_state = ssl_connect_3;
+ }
+ return ret;
+}
+
+static CURLcode bearssl_connect_step3(struct connectdata *conn, int sockindex)
+{
+ struct Curl_easy *data = conn->data;
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ CURLcode ret;
+
+ DEBUGASSERT(ssl_connect_3 == connssl->connecting_state);
+
+ if(conn->bits.tls_enable_alpn) {
+ const char *protocol;
+
+ protocol = br_ssl_engine_get_selected_protocol(&BACKEND->ctx.eng);
+ if(protocol) {
+ infof(data, "ALPN, server accepted to use %s\n", protocol);
+
+#ifdef USE_NGHTTP2
+ if(!strcmp(protocol, NGHTTP2_PROTO_VERSION_ID))
+ conn->negnpn = CURL_HTTP_VERSION_2;
+ else
+#endif
+ if(!strcmp(protocol, ALPN_HTTP_1_1))
+ conn->negnpn = CURL_HTTP_VERSION_1_1;
+ else
+ infof(data, "ALPN, unrecognized protocol %s\n", protocol);
+ Curl_multiuse_state(conn, conn->negnpn == CURL_HTTP_VERSION_2 ?
+ BUNDLE_MULTIPLEX : BUNDLE_NO_MULTIUSE);
+ }
+ else
+ infof(data, "ALPN, server did not agree to a protocol\n");
+ }
+
+ if(SSL_SET_OPTION(primary.sessionid)) {
+ bool incache;
+ void *oldsession;
+ br_ssl_session_parameters *session;
+
+ session = malloc(sizeof(*session));
+ if(!session)
+ return CURLE_OUT_OF_MEMORY;
+ br_ssl_engine_get_session_parameters(&BACKEND->ctx.eng, session);
+ Curl_ssl_sessionid_lock(conn);
+ incache = !(Curl_ssl_getsessionid(conn, &oldsession, NULL, sockindex));
+ if(incache)
+ Curl_ssl_delsessionid(conn, oldsession);
+ ret = Curl_ssl_addsessionid(conn, session, 0, sockindex);
+ Curl_ssl_sessionid_unlock(conn);
+ if(ret) {
+ free(session);
+ return CURLE_OUT_OF_MEMORY;
+ }
+ }
+
+ connssl->connecting_state = ssl_connect_done;
+
+ return CURLE_OK;
+}
+
+static ssize_t bearssl_send(struct connectdata *conn, int sockindex,
+ const void *buf, size_t len, CURLcode *err)
+{
+ struct Curl_easy *data = conn->data;
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ unsigned char *app;
+ size_t applen;
+
+ for(;;) {
+ *err = bearssl_run_until(conn, sockindex, BR_SSL_SENDAPP);
+ if (*err != CURLE_OK)
+ return -1;
+ app = br_ssl_engine_sendapp_buf(&BACKEND->ctx.eng, &applen);
+ if(!app) {
+ failf(data, "SSL: connection closed during write");
+ *err = CURLE_SEND_ERROR;
+ return -1;
+ }
+ if(BACKEND->pending_write) {
+ applen = BACKEND->pending_write;
+ BACKEND->pending_write = 0;
+ return applen;
+ }
+ if(applen > len)
+ applen = len;
+ memcpy(app, buf, applen);
+ br_ssl_engine_sendapp_ack(&BACKEND->ctx.eng, applen);
+ br_ssl_engine_flush(&BACKEND->ctx.eng, 0);
+ BACKEND->pending_write = applen;
+ }
+}
+
+static ssize_t bearssl_recv(struct connectdata *conn, int sockindex,
+ char *buf, size_t len, CURLcode *err)
+{
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ unsigned char *app;
+ size_t applen;
+
+ *err = bearssl_run_until(conn, sockindex, BR_SSL_RECVAPP);
+ if(*err != CURLE_OK)
+ return -1;
+ app = br_ssl_engine_recvapp_buf(&BACKEND->ctx.eng, &applen);
+ if(!app)
+ return 0;
+ if(applen > len)
+ applen = len;
+ memcpy(buf, app, applen);
+ br_ssl_engine_recvapp_ack(&BACKEND->ctx.eng, applen);
+
+ return applen;
+}
+
+static CURLcode bearssl_connect_common(struct connectdata *conn,
+ int sockindex,
+ bool nonblocking,
+ bool *done)
+{
+ CURLcode ret;
+ struct Curl_easy *data = conn->data;
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ curl_socket_t sockfd = conn->sock[sockindex];
+ time_t timeout_ms;
+ int what;
+
+ /* check if the connection has already been established */
+ if(ssl_connection_complete == connssl->state) {
+ *done = TRUE;
+ return CURLE_OK;
+ }
+
+ if(ssl_connect_1 == connssl->connecting_state) {
+ ret = bearssl_connect_step1(conn, sockindex);
+ if(ret)
+ return ret;
+ }
+
+ while(ssl_connect_2 == connssl->connecting_state ||
+ ssl_connect_2_reading == connssl->connecting_state ||
+ ssl_connect_2_writing == connssl->connecting_state) {
+ /* check allowed time left */
+ timeout_ms = Curl_timeleft(data, NULL, TRUE);
+
+ if(timeout_ms < 0) {
+ /* no need to continue if time already is up */
+ failf(data, "SSL connection timeout");
+ return CURLE_OPERATION_TIMEDOUT;
+ }
+
+ /* if ssl is expecting something, check if it's available. */
+ if(ssl_connect_2_reading == connssl->connecting_state ||
+ ssl_connect_2_writing == connssl->connecting_state) {
+
+ curl_socket_t writefd = ssl_connect_2_writing ==
+ connssl->connecting_state?sockfd:CURL_SOCKET_BAD;
+ curl_socket_t readfd = ssl_connect_2_reading ==
+ connssl->connecting_state?sockfd:CURL_SOCKET_BAD;
+
+ what = Curl_socket_check(readfd, CURL_SOCKET_BAD, writefd,
+ nonblocking?0:timeout_ms);
+ if(what < 0) {
+ /* fatal error */
+ failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO);
+ return CURLE_SSL_CONNECT_ERROR;
+ }
+ else if(0 == what) {
+ if(nonblocking) {
+ *done = FALSE;
+ return CURLE_OK;
+ }
+ else {
+ /* timeout */
+ failf(data, "SSL connection timeout");
+ return CURLE_OPERATION_TIMEDOUT;
+ }
+ }
+ /* socket is readable or writable */
+ }
+
+ /* Run transaction, and return to the caller if it failed or if this
+ * connection is done nonblocking and this loop would execute again. This
+ * permits the owner of a multi handle to abort a connection attempt
+ * before step2 has completed while ensuring that a client using select()
+ * or epoll() will always have a valid fdset to wait on.
+ */
+ ret = bearssl_connect_step2(conn, sockindex);
+ if(ret || (nonblocking &&
+ (ssl_connect_2 == connssl->connecting_state ||
+ ssl_connect_2_reading == connssl->connecting_state ||
+ ssl_connect_2_writing == connssl->connecting_state)))
+ return ret;
+ }
+
+ if(ssl_connect_3 == connssl->connecting_state) {
+ ret = bearssl_connect_step3(conn, sockindex);
+ if(ret)
+ return ret;
+ }
+
+ if(ssl_connect_done == connssl->connecting_state) {
+ connssl->state = ssl_connection_complete;
+ conn->recv[sockindex] = bearssl_recv;
+ conn->send[sockindex] = bearssl_send;
+ *done = TRUE;
+ }
+ else
+ *done = FALSE;
+
+ /* Reset our connect state machine */
+ connssl->connecting_state = ssl_connect_1;
+
+ return CURLE_OK;
+}
+
+static size_t Curl_bearssl_version(char *buffer, size_t size)
+{
+ return msnprintf(buffer, size, "BearSSL");
+}
+
+static bool Curl_bearssl_data_pending(const struct connectdata *conn,
+ int connindex)
+{
+ const struct ssl_connect_data *connssl = &conn->ssl[connindex];
+
+ return br_ssl_engine_current_state(&BACKEND->ctx.eng) & BR_SSL_RECVAPP;
+}
+
+static CURLcode Curl_bearssl_random(struct Curl_easy *data UNUSED_PARAM,
+ unsigned char *entropy, size_t length)
+{
+ static br_hmac_drbg_context ctx;
+ static bool seeded = FALSE;
+
+ if(!seeded) {
+ br_prng_seeder seeder;
+
+ br_hmac_drbg_init(&ctx, &br_sha256_vtable, NULL, 0);
+ seeder = br_prng_seeder_system(NULL);
+ if(!seeder || !seeder(&ctx.vtable))
+ return CURLE_FAILED_INIT;
+ seeded = TRUE;
+ }
+ br_hmac_drbg_generate(&ctx, entropy, length);
+
+ return CURLE_OK;
+}
+
+static CURLcode Curl_bearssl_connect(struct connectdata *conn, int sockindex)
+{
+ CURLcode ret;
+ bool done = FALSE;
+
+ ret = bearssl_connect_common(conn, sockindex, FALSE, &done);
+ if(ret)
+ return ret;
+
+ DEBUGASSERT(done);
+
+ return CURLE_OK;
+}
+
+static CURLcode Curl_bearssl_connect_nonblocking(struct connectdata *conn,
+ int sockindex, bool *done)
+{
+ return bearssl_connect_common(conn, sockindex, TRUE, done);
+}
+
+static void *Curl_bearssl_get_internals(struct ssl_connect_data *connssl,
+ CURLINFO info UNUSED_PARAM)
+{
+ return &BACKEND->ctx;
+}
+
+static void Curl_bearssl_close(struct connectdata *conn, int sockindex)
+{
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ size_t i;
+
+ if(BACKEND->active) {
+ br_ssl_engine_close(&BACKEND->ctx.eng);
+ (void)bearssl_run_until(conn, sockindex, BR_SSL_CLOSED);
+ }
+ for(i = 0; i < BACKEND->anchors_len; ++i)
+ free(BACKEND->anchors[i].dn.data);
+ free(BACKEND->anchors);
+}
+
+static void Curl_bearssl_session_free(void *ptr)
+{
+ free(ptr);
+}
+
+static CURLcode Curl_bearssl_md5sum(unsigned char *input,
+ size_t inputlen,
+ unsigned char *md5sum,
+ size_t md5len UNUSED_PARAM)
+{
+ br_md5_context ctx;
+
+ br_md5_init(&ctx);
+ br_md5_update(&ctx, input, inputlen);
+ br_md5_out(&ctx, md5sum);
+ return CURLE_OK;
+}
+
+static CURLcode Curl_bearssl_sha256sum(const unsigned char *input,
+ size_t inputlen,
+ unsigned char *sha256sum,
+ size_t sha256len UNUSED_PARAM)
+{
+ br_sha256_context ctx;
+
+ br_sha256_init(&ctx);
+ br_sha256_update(&ctx, input, inputlen);
+ br_sha256_out(&ctx, sha256sum);
+ return CURLE_OK;
+}
+
+const struct Curl_ssl Curl_ssl_bearssl = {
+ { CURLSSLBACKEND_BEARSSL, "bearssl" },
+
+ 0,
+
+ sizeof(struct ssl_backend_data),
+
+ Curl_none_init,
+ Curl_none_cleanup,
+ Curl_bearssl_version,
+ Curl_none_check_cxn,
+ Curl_none_shutdown,
+ Curl_bearssl_data_pending,
+ Curl_bearssl_random,
+ Curl_none_cert_status_request,
+ Curl_bearssl_connect,
+ Curl_bearssl_connect_nonblocking,
+ Curl_bearssl_get_internals,
+ Curl_bearssl_close,
+ Curl_none_close_all,
+ Curl_bearssl_session_free,
+ Curl_none_set_engine,
+ Curl_none_set_engine_default,
+ Curl_none_engines_list,
+ Curl_none_false_start,
+ Curl_bearssl_md5sum,
+ Curl_bearssl_sha256sum
+};
+
+#endif /* USE_BEARSSL */
diff --git a/Utilities/cmcurl/lib/vtls/polarssl.h b/Utilities/cmcurl/lib/vtls/bearssl.h
index 23c3636..5f94922 100644
--- a/Utilities/cmcurl/lib/vtls/polarssl.h
+++ b/Utilities/cmcurl/lib/vtls/bearssl.h
@@ -1,5 +1,5 @@
-#ifndef HEADER_CURL_POLARSSL_H
-#define HEADER_CURL_POLARSSL_H
+#ifndef HEADER_CURL_BEARSSL_H
+#define HEADER_CURL_BEARSSL_H
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
@@ -7,8 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2012 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
- * Copyright (C) 2010, Hoi-Ho Chan, <hoiho.chan@gmail.com>
+ * Copyright (C) 2019, Michael Forney, <mforney@mforney.org>
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -22,11 +21,12 @@
* KIND, either express or implied.
*
***************************************************************************/
+
#include "curl_setup.h"
-#ifdef USE_POLARSSL
+#ifdef USE_BEARSSL
-extern const struct Curl_ssl Curl_ssl_polarssl;
+extern const struct Curl_ssl Curl_ssl_bearssl;
-#endif /* USE_POLARSSL */
-#endif /* HEADER_CURL_POLARSSL_H */
+#endif /* USE_BEARSSL */
+#endif /* HEADER_CURL_BEARSSL_H */
diff --git a/Utilities/cmcurl/lib/vtls/gskit.c b/Utilities/cmcurl/lib/vtls/gskit.c
index b93ff5d..32153dd 100644
--- a/Utilities/cmcurl/lib/vtls/gskit.c
+++ b/Utilities/cmcurl/lib/vtls/gskit.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -26,6 +26,8 @@
#include <gskssl.h>
#include <qsoasync.h>
+#undef HAVE_SOCKETPAIR /* because the native one isn't good enough */
+#include "socketpair.h"
/* Some symbols are undefined/unsupported on OS400 versions < V7R1. */
#ifndef GSK_SSL_EXTN_SERVERNAME_REQUEST
@@ -511,100 +513,6 @@ static void close_async_handshake(struct ssl_connect_data *connssl)
BACKEND->iocport = -1;
}
-/* SSL over SSL
- * Problems:
- * 1) GSKit can only perform SSL on an AF_INET or AF_INET6 stream socket. To
- * pipe an SSL stream into another, it is therefore needed to have a pair
- * of such communicating sockets and handle the pipelining explicitly.
- * 2) OS/400 socketpair() is only implemented for domain AF_UNIX, thus cannot
- * be used to produce the pipeline.
- * The solution is to simulate socketpair() for AF_INET with low-level API
- * listen(), bind() and connect().
- */
-
-static int
-inetsocketpair(int sv[2])
-{
- int lfd; /* Listening socket. */
- int sfd; /* Server socket. */
- int cfd; /* Client socket. */
- int len;
- struct sockaddr_in addr1;
- struct sockaddr_in addr2;
-
- /* Create listening socket on a local dynamic port. */
- lfd = socket(AF_INET, SOCK_STREAM, 0);
- if(lfd < 0)
- return -1;
- memset((char *) &addr1, 0, sizeof(addr1));
- addr1.sin_family = AF_INET;
- addr1.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
- addr1.sin_port = 0;
- if(bind(lfd, (struct sockaddr *) &addr1, sizeof(addr1)) ||
- listen(lfd, 2) < 0) {
- close(lfd);
- return -1;
- }
-
- /* Get the allocated port. */
- len = sizeof(addr1);
- if(getsockname(lfd, (struct sockaddr *) &addr1, &len) < 0) {
- close(lfd);
- return -1;
- }
-
- /* Create the client socket. */
- cfd = socket(AF_INET, SOCK_STREAM, 0);
- if(cfd < 0) {
- close(lfd);
- return -1;
- }
-
- /* Request unblocking connection to the listening socket. */
- curlx_nonblock(cfd, TRUE);
- if(connect(cfd, (struct sockaddr *) &addr1, sizeof(addr1)) < 0 &&
- errno != EINPROGRESS) {
- close(lfd);
- close(cfd);
- return -1;
- }
-
- /* Get the client dynamic port for intrusion check below. */
- len = sizeof(addr2);
- if(getsockname(cfd, (struct sockaddr *) &addr2, &len) < 0) {
- close(lfd);
- close(cfd);
- return -1;
- }
-
- /* Accept the incoming connection and get the server socket. */
- curlx_nonblock(lfd, TRUE);
- for(;;) {
- len = sizeof(addr1);
- sfd = accept(lfd, (struct sockaddr *) &addr1, &len);
- if(sfd < 0) {
- close(lfd);
- close(cfd);
- return -1;
- }
-
- /* Check for possible intrusion from an external process. */
- if(addr1.sin_addr.s_addr == addr2.sin_addr.s_addr &&
- addr1.sin_port == addr2.sin_port)
- break;
-
- /* Intrusion: reject incoming connection. */
- close(sfd);
- }
-
- /* Done, return sockets and succeed. */
- close(lfd);
- curlx_nonblock(cfd, FALSE);
- sv[0] = cfd;
- sv[1] = sfd;
- return 0;
-}
-
static int pipe_ssloverssl(struct connectdata *conn, int sockindex,
int directions)
{
@@ -855,7 +763,7 @@ static CURLcode gskit_connect_step1(struct connectdata *conn, int sockindex)
/* Establish a pipelining socket pair for SSL over SSL. */
if(conn->proxy_ssl[sockindex].use) {
- if(inetsocketpair(sockpair))
+ if(Curl_socketpair(0, 0, 0, sockpair))
return CURLE_SSL_CONNECT_ERROR;
BACKEND->localfd = sockpair[0];
BACKEND->remotefd = sockpair[1];
@@ -1157,7 +1065,7 @@ static CURLcode gskit_connect_common(struct connectdata *conn, int sockindex,
{
struct Curl_easy *data = conn->data;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
- long timeout_ms;
+ timediff_t timeout_ms;
CURLcode result = CURLE_OK;
*done = connssl->state == ssl_connection_complete;
diff --git a/Utilities/cmcurl/lib/vtls/gskit.h b/Utilities/cmcurl/lib/vtls/gskit.h
index 466ee4d..b06b5e1 100644
--- a/Utilities/cmcurl/lib/vtls/gskit.h
+++ b/Utilities/cmcurl/lib/vtls/gskit.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/Utilities/cmcurl/lib/vtls/gtls.c b/Utilities/cmcurl/lib/vtls/gtls.c
index 8693cdc..5f740ee 100644
--- a/Utilities/cmcurl/lib/vtls/gtls.c
+++ b/Utilities/cmcurl/lib/vtls/gtls.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -288,7 +288,7 @@ static CURLcode handshake(struct connectdata *conn,
curl_socket_t sockfd = conn->sock[sockindex];
for(;;) {
- time_t timeout_ms;
+ timediff_t timeout_ms;
int rc;
/* check allowed time left */
@@ -311,7 +311,7 @@ static CURLcode handshake(struct connectdata *conn,
what = Curl_socket_check(readfd, CURL_SOCKET_BAD, writefd,
nonblocking?0:
- timeout_ms?timeout_ms:1000);
+ timeout_ms?(time_t)timeout_ms:1000);
if(what < 0) {
/* fatal error */
failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO);
@@ -666,6 +666,10 @@ gtls_connect_step1(struct connectdata *conn,
/* Initialize TLS session as a client */
init_flags = GNUTLS_CLIENT;
+#if defined(GNUTLS_FORCE_CLIENT_CERT)
+ init_flags |= GNUTLS_FORCE_CLIENT_CERT;
+#endif
+
#if defined(GNUTLS_NO_TICKETS)
/* Disable TLS session tickets */
init_flags |= GNUTLS_NO_TICKETS;
@@ -1608,7 +1612,7 @@ static ssize_t gtls_send(struct connectdata *conn,
static void close_one(struct ssl_connect_data *connssl)
{
if(BACKEND->session) {
- gnutls_bye(BACKEND->session, GNUTLS_SHUT_RDWR);
+ gnutls_bye(BACKEND->session, GNUTLS_SHUT_WR);
gnutls_deinit(BACKEND->session);
BACKEND->session = NULL;
}
diff --git a/Utilities/cmcurl/lib/vtls/mbedtls.c b/Utilities/cmcurl/lib/vtls/mbedtls.c
index 63d1f4c..f057315 100644
--- a/Utilities/cmcurl/lib/vtls/mbedtls.c
+++ b/Utilities/cmcurl/lib/vtls/mbedtls.c
@@ -6,7 +6,7 @@
* \___|\___/|_| \_\_____|
*
* Copyright (C) 2010 - 2011, Hoi-Ho Chan, <hoiho.chan@gmail.com>
- * Copyright (C) 2012 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -55,7 +55,7 @@
#include "connect.h" /* for the connect timeout */
#include "select.h"
#include "multiif.h"
-#include "polarssl_threadlock.h"
+#include "mbedtls_threadlock.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
@@ -91,12 +91,12 @@ static int entropy_init_initialized = 0;
static void entropy_init_mutex(mbedtls_entropy_context *ctx)
{
/* lock 0 = entropy_init_mutex() */
- Curl_polarsslthreadlock_lock_function(0);
+ Curl_mbedtlsthreadlock_lock_function(0);
if(entropy_init_initialized == 0) {
mbedtls_entropy_init(ctx);
entropy_init_initialized = 1;
}
- Curl_polarsslthreadlock_unlock_function(0);
+ Curl_mbedtlsthreadlock_unlock_function(0);
}
/* end of entropy_init_mutex() */
@@ -105,9 +105,9 @@ static int entropy_func_mutex(void *data, unsigned char *output, size_t len)
{
int ret;
/* lock 1 = entropy_func_mutex() */
- Curl_polarsslthreadlock_lock_function(1);
+ Curl_mbedtlsthreadlock_lock_function(1);
ret = mbedtls_entropy_func(data, output, len);
- Curl_polarsslthreadlock_unlock_function(1);
+ Curl_mbedtlsthreadlock_unlock_function(1);
return ret;
}
@@ -588,6 +588,9 @@ mbed_connect_step2(struct connectdata *conn,
else if(ret & MBEDTLS_X509_BADCERT_NOT_TRUSTED)
failf(data, "Cert verify failed: BADCERT_NOT_TRUSTED");
+ else if(ret & MBEDTLS_X509_BADCERT_FUTURE)
+ failf(data, "Cert verify failed: BADCERT_FUTURE");
+
return CURLE_PEER_FAILED_VERIFICATION;
}
@@ -884,7 +887,7 @@ mbed_connect_common(struct connectdata *conn,
struct Curl_easy *data = conn->data;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
curl_socket_t sockfd = conn->sock[sockindex];
- long timeout_ms;
+ timediff_t timeout_ms;
int what;
/* check if the connection has already been established */
@@ -930,7 +933,7 @@ mbed_connect_common(struct connectdata *conn,
connssl->connecting_state?sockfd:CURL_SOCKET_BAD;
what = Curl_socket_check(readfd, CURL_SOCKET_BAD, writefd,
- nonblocking ? 0 : timeout_ms);
+ nonblocking ? 0 : (time_t)timeout_ms);
if(what < 0) {
/* fatal error */
failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO);
@@ -1014,12 +1017,12 @@ static CURLcode Curl_mbedtls_connect(struct connectdata *conn, int sockindex)
*/
static int Curl_mbedtls_init(void)
{
- return Curl_polarsslthreadlock_thread_setup();
+ return Curl_mbedtlsthreadlock_thread_setup();
}
static void Curl_mbedtls_cleanup(void)
{
- (void)Curl_polarsslthreadlock_thread_cleanup();
+ (void)Curl_mbedtlsthreadlock_thread_cleanup();
}
static bool Curl_mbedtls_data_pending(const struct connectdata *conn,
diff --git a/Utilities/cmcurl/lib/vtls/mbedtls.h b/Utilities/cmcurl/lib/vtls/mbedtls.h
index 4a93860..0cc64b3 100644
--- a/Utilities/cmcurl/lib/vtls/mbedtls.h
+++ b/Utilities/cmcurl/lib/vtls/mbedtls.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2012 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
* Copyright (C) 2010, Hoi-Ho Chan, <hoiho.chan@gmail.com>
*
* This software is licensed as described in the file COPYING, which
diff --git a/Utilities/cmcurl/lib/vtls/polarssl_threadlock.c b/Utilities/cmcurl/lib/vtls/mbedtls_threadlock.c
index 27c94b1..4d672f1 100644
--- a/Utilities/cmcurl/lib/vtls/polarssl_threadlock.c
+++ b/Utilities/cmcurl/lib/vtls/mbedtls_threadlock.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2013-2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2013 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
* Copyright (C) 2010, 2011, Hoi-Ho Chan, <hoiho.chan@gmail.com>
*
* This software is licensed as described in the file COPYING, which
@@ -22,19 +22,19 @@
***************************************************************************/
#include "curl_setup.h"
-#if (defined(USE_POLARSSL) || defined(USE_MBEDTLS)) && \
- ((defined(USE_THREADS_POSIX) && defined(HAVE_PTHREAD_H)) || \
- (defined(USE_THREADS_WIN32) && defined(HAVE_PROCESS_H)))
+#if defined(USE_MBEDTLS) && \
+ ((defined(USE_THREADS_POSIX) && defined(HAVE_PTHREAD_H)) || \
+ (defined(USE_THREADS_WIN32) && defined(HAVE_PROCESS_H)))
#if defined(USE_THREADS_POSIX) && defined(HAVE_PTHREAD_H)
# include <pthread.h>
-# define POLARSSL_MUTEX_T pthread_mutex_t
+# define MBEDTLS_MUTEX_T pthread_mutex_t
#elif defined(USE_THREADS_WIN32) && defined(HAVE_PROCESS_H)
# include <process.h>
-# define POLARSSL_MUTEX_T HANDLE
+# define MBEDTLS_MUTEX_T HANDLE
#endif
-#include "polarssl_threadlock.h"
+#include "mbedtls_threadlock.h"
#include "curl_printf.h"
#include "curl_memory.h"
/* The last #include file should be: */
@@ -43,14 +43,14 @@
/* number of thread locks */
#define NUMT 2
-/* This array will store all of the mutexes available to PolarSSL. */
-static POLARSSL_MUTEX_T *mutex_buf = NULL;
+/* This array will store all of the mutexes available to Mbedtls. */
+static MBEDTLS_MUTEX_T *mutex_buf = NULL;
-int Curl_polarsslthreadlock_thread_setup(void)
+int Curl_mbedtlsthreadlock_thread_setup(void)
{
int i;
- mutex_buf = calloc(NUMT * sizeof(POLARSSL_MUTEX_T), 1);
+ mutex_buf = calloc(NUMT * sizeof(MBEDTLS_MUTEX_T), 1);
if(!mutex_buf)
return 0; /* error, no number of threads defined */
@@ -70,7 +70,7 @@ int Curl_polarsslthreadlock_thread_setup(void)
return 1; /* OK */
}
-int Curl_polarsslthreadlock_thread_cleanup(void)
+int Curl_mbedtlsthreadlock_thread_cleanup(void)
{
int i;
@@ -95,7 +95,7 @@ int Curl_polarsslthreadlock_thread_cleanup(void)
return 1; /* OK */
}
-int Curl_polarsslthreadlock_lock_function(int n)
+int Curl_mbedtlsthreadlock_lock_function(int n)
{
if(n < NUMT) {
int ret;
@@ -103,14 +103,14 @@ int Curl_polarsslthreadlock_lock_function(int n)
ret = pthread_mutex_lock(&mutex_buf[n]);
if(ret) {
DEBUGF(fprintf(stderr,
- "Error: polarsslthreadlock_lock_function failed\n"));
+ "Error: mbedtlsthreadlock_lock_function failed\n"));
return 0; /* pthread_mutex_lock failed */
}
#elif defined(USE_THREADS_WIN32) && defined(HAVE_PROCESS_H)
ret = (WaitForSingleObject(mutex_buf[n], INFINITE) == WAIT_FAILED?1:0);
if(ret) {
DEBUGF(fprintf(stderr,
- "Error: polarsslthreadlock_lock_function failed\n"));
+ "Error: mbedtlsthreadlock_lock_function failed\n"));
return 0; /* pthread_mutex_lock failed */
}
#endif /* USE_THREADS_POSIX && HAVE_PTHREAD_H */
@@ -118,7 +118,7 @@ int Curl_polarsslthreadlock_lock_function(int n)
return 1; /* OK */
}
-int Curl_polarsslthreadlock_unlock_function(int n)
+int Curl_mbedtlsthreadlock_unlock_function(int n)
{
if(n < NUMT) {
int ret;
@@ -126,14 +126,14 @@ int Curl_polarsslthreadlock_unlock_function(int n)
ret = pthread_mutex_unlock(&mutex_buf[n]);
if(ret) {
DEBUGF(fprintf(stderr,
- "Error: polarsslthreadlock_unlock_function failed\n"));
+ "Error: mbedtlsthreadlock_unlock_function failed\n"));
return 0; /* pthread_mutex_unlock failed */
}
#elif defined(USE_THREADS_WIN32) && defined(HAVE_PROCESS_H)
ret = ReleaseMutex(mutex_buf[n]);
if(!ret) {
DEBUGF(fprintf(stderr,
- "Error: polarsslthreadlock_unlock_function failed\n"));
+ "Error: mbedtlsthreadlock_unlock_function failed\n"));
return 0; /* pthread_mutex_lock failed */
}
#endif /* USE_THREADS_POSIX && HAVE_PTHREAD_H */
@@ -141,4 +141,4 @@ int Curl_polarsslthreadlock_unlock_function(int n)
return 1; /* OK */
}
-#endif /* USE_POLARSSL || USE_MBEDTLS */
+#endif /* USE_MBEDTLS */
diff --git a/Utilities/cmcurl/lib/vtls/polarssl_threadlock.h b/Utilities/cmcurl/lib/vtls/mbedtls_threadlock.h
index 1226475..96a787d 100644
--- a/Utilities/cmcurl/lib/vtls/polarssl_threadlock.h
+++ b/Utilities/cmcurl/lib/vtls/mbedtls_threadlock.h
@@ -1,5 +1,5 @@
-#ifndef HEADER_CURL_POLARSSL_THREADLOCK_H
-#define HEADER_CURL_POLARSSL_THREADLOCK_H
+#ifndef HEADER_CURL_MBEDTLS_THREADLOCK_H
+#define HEADER_CURL_MBEDTLS_THREADLOCK_H
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2013-2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2013 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
* Copyright (C) 2010, Hoi-Ho Chan, <hoiho.chan@gmail.com>
*
* This software is licensed as described in the file COPYING, which
@@ -24,25 +24,25 @@
***************************************************************************/
#include "curl_setup.h"
-#if (defined USE_POLARSSL) || (defined USE_MBEDTLS)
+#ifdef USE_MBEDTLS
#if (defined(USE_THREADS_POSIX) && defined(HAVE_PTHREAD_H)) || \
(defined(USE_THREADS_WIN32) && defined(HAVE_PROCESS_H))
-int Curl_polarsslthreadlock_thread_setup(void);
-int Curl_polarsslthreadlock_thread_cleanup(void);
-int Curl_polarsslthreadlock_lock_function(int n);
-int Curl_polarsslthreadlock_unlock_function(int n);
+int Curl_mbedtlsthreadlock_thread_setup(void);
+int Curl_mbedtlsthreadlock_thread_cleanup(void);
+int Curl_mbedtlsthreadlock_lock_function(int n);
+int Curl_mbedtlsthreadlock_unlock_function(int n);
#else
-#define Curl_polarsslthreadlock_thread_setup() 1
-#define Curl_polarsslthreadlock_thread_cleanup() 1
-#define Curl_polarsslthreadlock_lock_function(x) 1
-#define Curl_polarsslthreadlock_unlock_function(x) 1
+#define Curl_mbedtlsthreadlock_thread_setup() 1
+#define Curl_mbedtlsthreadlock_thread_cleanup() 1
+#define Curl_mbedtlsthreadlock_lock_function(x) 1
+#define Curl_mbedtlsthreadlock_unlock_function(x) 1
#endif /* USE_THREADS_POSIX || USE_THREADS_WIN32 */
-#endif /* USE_POLARSSL */
+#endif /* USE_MBEDTLS */
-#endif /* HEADER_CURL_POLARSSL_THREADLOCK_H */
+#endif /* HEADER_CURL_MBEDTLS_THREADLOCK_H */
diff --git a/Utilities/cmcurl/lib/vtls/mesalink.c b/Utilities/cmcurl/lib/vtls/mesalink.c
index 718c282..cab1e39 100644
--- a/Utilities/cmcurl/lib/vtls/mesalink.c
+++ b/Utilities/cmcurl/lib/vtls/mesalink.c
@@ -6,7 +6,7 @@
* \___|\___/|_| \_\_____|
*
* Copyright (C) 2017 - 2018, Yiming Jing, <jingyiming@baidu.com>
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -73,6 +73,17 @@ struct ssl_backend_data
static Curl_recv mesalink_recv;
static Curl_send mesalink_send;
+static int do_file_type(const char *type)
+{
+ if(!type || !type[0])
+ return SSL_FILETYPE_PEM;
+ if(strcasecompare(type, "PEM"))
+ return SSL_FILETYPE_PEM;
+ if(strcasecompare(type, "DER"))
+ return SSL_FILETYPE_ASN1;
+ return -1;
+}
+
/*
* This function loads all the client/CA certificates and CRLs. Setup the TLS
* layer and do all necessary magic.
@@ -83,9 +94,6 @@ mesalink_connect_step1(struct connectdata *conn, int sockindex)
char *ciphers;
struct Curl_easy *data = conn->data;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
- const bool verifypeer = SSL_CONN_CONFIG(verifypeer);
- const char *const ssl_cafile = SSL_CONN_CONFIG(CAfile);
- const char *const ssl_capath = SSL_CONN_CONFIG(CApath);
struct in_addr addr4;
#ifdef ENABLE_IPV6
struct in6_addr addr6;
@@ -142,21 +150,25 @@ mesalink_connect_step1(struct connectdata *conn, int sockindex)
}
SSL_CTX_set_verify(
- BACKEND->ctx, verifypeer ? SSL_VERIFY_PEER : SSL_VERIFY_NONE, NULL);
+ BACKEND->ctx, SSL_CONN_CONFIG(verifypeer) ?
+ SSL_VERIFY_PEER : SSL_VERIFY_NONE, NULL);
- if(ssl_cafile || ssl_capath) {
- if(!SSL_CTX_load_verify_locations(BACKEND->ctx, ssl_cafile, ssl_capath)) {
- if(verifypeer) {
+ if(SSL_CONN_CONFIG(CAfile) || SSL_CONN_CONFIG(CApath)) {
+ if(!SSL_CTX_load_verify_locations(BACKEND->ctx, SSL_CONN_CONFIG(CAfile),
+ SSL_CONN_CONFIG(CApath))) {
+ if(SSL_CONN_CONFIG(verifypeer)) {
failf(data,
"error setting certificate verify locations:\n"
" CAfile: %s\n CApath: %s",
- ssl_cafile ? ssl_cafile : "none",
- ssl_capath ? ssl_capath : "none");
+ SSL_CONN_CONFIG(CAfile) ?
+ SSL_CONN_CONFIG(CAfile) : "none",
+ SSL_CONN_CONFIG(CApath) ?
+ SSL_CONN_CONFIG(CApath) : "none");
return CURLE_SSL_CACERT_BADFILE;
}
infof(data,
- "error setting certificate verify locations,"
- " continuing anyway:\n");
+ "error setting certificate verify locations,"
+ " continuing anyway:\n");
}
else {
infof(data, "successfully set certificate verify locations:\n");
@@ -164,8 +176,32 @@ mesalink_connect_step1(struct connectdata *conn, int sockindex)
infof(data,
" CAfile: %s\n"
" CApath: %s\n",
- ssl_cafile ? ssl_cafile : "none",
- ssl_capath ? ssl_capath : "none");
+ SSL_CONN_CONFIG(CAfile)?
+ SSL_CONN_CONFIG(CAfile): "none",
+ SSL_CONN_CONFIG(CApath)?
+ SSL_CONN_CONFIG(CApath): "none");
+ }
+
+ if(SSL_SET_OPTION(cert) && SSL_SET_OPTION(key)) {
+ int file_type = do_file_type(SSL_SET_OPTION(cert_type));
+
+ if(SSL_CTX_use_certificate_chain_file(BACKEND->ctx, SSL_SET_OPTION(cert),
+ file_type) != 1) {
+ failf(data, "unable to use client certificate (no key or wrong pass"
+ " phrase?)");
+ return CURLE_SSL_CONNECT_ERROR;
+ }
+
+ file_type = do_file_type(SSL_SET_OPTION(key_type));
+ if(SSL_CTX_use_PrivateKey_file(BACKEND->ctx, SSL_SET_OPTION(key),
+ file_type) != 1) {
+ failf(data, "unable to set private key");
+ return CURLE_SSL_CONNECT_ERROR;
+ }
+ infof(data,
+ "client cert: %s\n",
+ SSL_CONN_CONFIG(clientcert)?
+ SSL_CONN_CONFIG(clientcert): "none");
}
ciphers = SSL_CONN_CONFIG(cipher_list);
@@ -265,7 +301,6 @@ mesalink_connect_step2(struct connectdata *conn, int sockindex)
ret = SSL_connect(BACKEND->handle);
if(ret != SSL_SUCCESS) {
- char error_buffer[MESALINK_MAX_ERROR_SZ];
int detail = SSL_get_error(BACKEND->handle, ret);
if(SSL_ERROR_WANT_CONNECT == detail || SSL_ERROR_WANT_READ == detail) {
@@ -273,6 +308,7 @@ mesalink_connect_step2(struct connectdata *conn, int sockindex)
return CURLE_OK;
}
else {
+ char error_buffer[MESALINK_MAX_ERROR_SZ];
failf(data,
"SSL_connect failed with error %d: %s",
detail,
@@ -458,7 +494,7 @@ mesalink_connect_common(struct connectdata *conn, int sockindex,
struct Curl_easy *data = conn->data;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
curl_socket_t sockfd = conn->sock[sockindex];
- time_t timeout_ms;
+ timediff_t timeout_ms;
int what;
/* check if the connection has already been established */
@@ -507,7 +543,8 @@ mesalink_connect_common(struct connectdata *conn, int sockindex,
: CURL_SOCKET_BAD;
what = Curl_socket_check(
- readfd, CURL_SOCKET_BAD, writefd, nonblocking ? 0 : timeout_ms);
+ readfd, CURL_SOCKET_BAD, writefd,
+ nonblocking ? 0 : (time_t)timeout_ms);
if(what < 0) {
/* fatal error */
failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO);
diff --git a/Utilities/cmcurl/lib/vtls/nss.c b/Utilities/cmcurl/lib/vtls/nss.c